]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/media/usb/cx231xx/cx231xx-dvb.c
[media] cx231xx: Initial support Evromedia USB Full Hybrid Full HD
[mirror_ubuntu-bionic-kernel.git] / drivers / media / usb / cx231xx / cx231xx-dvb.c
CommitLineData
e0d3bafd
SD
1/*
2 DVB device driver for cx231xx
3
4 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
b9255176 5 Based on em28xx driver
e0d3bafd
SD
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
589dadf2 22#include "cx231xx.h"
e0d3bafd 23#include <linux/kernel.h>
5a0e3ad6 24#include <linux/slab.h>
e0d3bafd 25
e0d3bafd
SD
26#include <media/v4l2-common.h>
27#include <media/videobuf-vmalloc.h>
6168309a 28#include <media/tuner.h>
e0d3bafd
SD
29
30#include "xc5000.h"
64fbf444
PB
31#include "s5h1432.h"
32#include "tda18271.h"
33#include "s5h1411.h"
1a50fdde 34#include "lgdt3305.h"
dd2e7dd2 35#include "si2165.h"
a096fd64 36#include "si2168.h"
ede676c7 37#include "mb86a20s.h"
9e49f7c3 38#include "si2157.h"
809abdbf 39#include "lgdt3306a.h"
e0d3bafd 40
e0d3bafd
SD
41MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
42MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
43MODULE_LICENSE("GPL");
44
45static unsigned int debug;
46module_param(debug, int, 0644);
47MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
48
49DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
50
e0d3bafd
SD
51#define CX231XX_DVB_NUM_BUFS 5
52#define CX231XX_DVB_MAX_PACKETSIZE 564
53#define CX231XX_DVB_MAX_PACKETS 64
54
55struct cx231xx_dvb {
84b5dbf3 56 struct dvb_frontend *frontend;
e0d3bafd
SD
57
58 /* feed count management */
84b5dbf3
MCC
59 struct mutex lock;
60 int nfeeds;
e0d3bafd
SD
61
62 /* general boilerplate stuff */
84b5dbf3
MCC
63 struct dvb_adapter adapter;
64 struct dvb_demux demux;
65 struct dmxdev dmxdev;
66 struct dmx_frontend fe_hw;
67 struct dmx_frontend fe_mem;
68 struct dvb_net net;
d28d7f85 69 struct i2c_client *i2c_client_demod;
6d3debaf 70 struct i2c_client *i2c_client_tuner;
e0d3bafd
SD
71};
72
64fbf444
PB
73static struct s5h1432_config dvico_s5h1432_config = {
74 .output_mode = S5H1432_SERIAL_OUTPUT,
75 .gpio = S5H1432_GPIO_ON,
76 .qam_if = S5H1432_IF_4000,
77 .vsb_if = S5H1432_IF_4000,
78 .inversion = S5H1432_INVERSION_OFF,
79 .status_mode = S5H1432_DEMODLOCKING,
80 .mpeg_timing = S5H1432_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
81};
82
83static struct tda18271_std_map cnxt_rde253s_tda18271_std_map = {
84 .dvbt_6 = { .if_freq = 4000, .agc_mode = 3, .std = 4,
85 .if_lvl = 1, .rfagc_top = 0x37, },
86 .dvbt_7 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
87 .if_lvl = 1, .rfagc_top = 0x37, },
88 .dvbt_8 = { .if_freq = 4000, .agc_mode = 3, .std = 6,
89 .if_lvl = 1, .rfagc_top = 0x37, },
90};
91
ede676c7 92static struct tda18271_std_map mb86a20s_tda18271_config = {
84c09d72
MCC
93 .dvbt_6 = { .if_freq = 4000, .agc_mode = 3, .std = 4,
94 .if_lvl = 0, .rfagc_top = 0x37, },
ede676c7
MCC
95};
96
64fbf444
PB
97static struct tda18271_config cnxt_rde253s_tunerconfig = {
98 .std_map = &cnxt_rde253s_tda18271_std_map,
99 .gate = TDA18271_GATE_ANALOG,
100};
101
102static struct s5h1411_config tda18271_s5h1411_config = {
103 .output_mode = S5H1411_SERIAL_OUTPUT,
104 .gpio = S5H1411_GPIO_OFF,
105 .vsb_if = S5H1411_IF_3250,
106 .qam_if = S5H1411_IF_4000,
107 .inversion = S5H1411_INVERSION_ON,
108 .status_mode = S5H1411_DEMODLOCKING,
109 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
110};
111static struct s5h1411_config xc5000_s5h1411_config = {
112 .output_mode = S5H1411_SERIAL_OUTPUT,
113 .gpio = S5H1411_GPIO_OFF,
114 .vsb_if = S5H1411_IF_3250,
115 .qam_if = S5H1411_IF_3250,
116 .inversion = S5H1411_INVERSION_OFF,
117 .status_mode = S5H1411_DEMODLOCKING,
118 .mpeg_timing = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
119};
1a50fdde
MK
120
121static struct lgdt3305_config hcw_lgdt3305_config = {
122 .i2c_addr = 0x0e,
123 .mpeg_mode = LGDT3305_MPEG_SERIAL,
124 .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE,
125 .tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
126 .deny_i2c_rptr = 1,
127 .spectral_inversion = 1,
128 .qam_if_khz = 4000,
129 .vsb_if_khz = 3250,
130};
131
132static struct tda18271_std_map hauppauge_tda18271_std_map = {
133 .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 4,
134 .if_lvl = 1, .rfagc_top = 0x58, },
135 .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
136 .if_lvl = 1, .rfagc_top = 0x58, },
137};
138
139static struct tda18271_config hcw_tda18271_config = {
140 .std_map = &hauppauge_tda18271_std_map,
141 .gate = TDA18271_GATE_DIGITAL,
142};
143
ede676c7
MCC
144static const struct mb86a20s_config pv_mb86a20s_config = {
145 .demod_address = 0x10,
7572f9c5 146 .is_serial = true,
ede676c7
MCC
147};
148
149static struct tda18271_config pv_tda18271_config = {
150 .std_map = &mb86a20s_tda18271_config,
151 .gate = TDA18271_GATE_DIGITAL,
152 .small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
153};
154
809abdbf
OS
155static struct lgdt3306a_config hauppauge_955q_lgdt3306a_config = {
156 .i2c_addr = 0x59,
157 .qam_if_khz = 4000,
158 .vsb_if_khz = 3250,
159 .deny_i2c_rptr = 1,
160 .spectral_inversion = 1,
161 .mpeg_mode = LGDT3306A_MPEG_SERIAL,
162 .tpclk_edge = LGDT3306A_TPCLK_RISING_EDGE,
163 .tpvalid_polarity = LGDT3306A_TP_VALID_HIGH,
164 .xtalMHz = 25,
165};
166
84b5dbf3 167static inline void print_err_status(struct cx231xx *dev, int packet, int status)
e0d3bafd
SD
168{
169 char *errmsg = "Unknown";
170
171 switch (status) {
172 case -ENOENT:
173 errmsg = "unlinked synchronuously";
174 break;
175 case -ECONNRESET:
176 errmsg = "unlinked asynchronuously";
177 break;
178 case -ENOSR:
179 errmsg = "Buffer error (overrun)";
180 break;
181 case -EPIPE:
182 errmsg = "Stalled (device not responding)";
183 break;
184 case -EOVERFLOW:
185 errmsg = "Babble (bad cable?)";
186 break;
187 case -EPROTO:
188 errmsg = "Bit-stuff error (bad cable?)";
189 break;
190 case -EILSEQ:
191 errmsg = "CRC/Timeout (could be anything)";
192 break;
193 case -ETIME:
194 errmsg = "Device does not respond";
195 break;
196 }
197 if (packet < 0) {
336fea92 198 dev_dbg(dev->dev,
3b795d01 199 "URB status %d [%s].\n", status, errmsg);
e0d3bafd 200 } else {
336fea92 201 dev_dbg(dev->dev,
3b795d01 202 "URB packet %d, status %d [%s].\n",
e0d3bafd
SD
203 packet, status, errmsg);
204 }
205}
206
207static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
208{
209 int i;
210
211 if (!dev)
212 return 0;
213
990862a2 214 if (dev->state & DEV_DISCONNECTED)
e0d3bafd
SD
215 return 0;
216
217 if (urb->status < 0) {
218 print_err_status(dev, -1, urb->status);
219 if (urb->status == -ENOENT)
220 return 0;
221 }
222
223 for (i = 0; i < urb->number_of_packets; i++) {
224 int status = urb->iso_frame_desc[i].status;
225
226 if (status < 0) {
227 print_err_status(dev, i, status);
228 if (urb->iso_frame_desc[i].status != -EPROTO)
229 continue;
230 }
231
64fbf444
PB
232 dvb_dmx_swfilter(&dev->dvb->demux,
233 urb->transfer_buffer +
234 urb->iso_frame_desc[i].offset,
235 urb->iso_frame_desc[i].actual_length);
e0d3bafd
SD
236 }
237
238 return 0;
239}
240
64fbf444
PB
241static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb)
242{
64fbf444
PB
243 if (!dev)
244 return 0;
245
990862a2 246 if (dev->state & DEV_DISCONNECTED)
64fbf444
PB
247 return 0;
248
249 if (urb->status < 0) {
250 print_err_status(dev, -1, urb->status);
251 if (urb->status == -ENOENT)
252 return 0;
253 }
254
255 /* Feed the transport payload into the kernel demux */
256 dvb_dmx_swfilter(&dev->dvb->demux,
257 urb->transfer_buffer, urb->actual_length);
258
259 return 0;
260}
261
e0d3bafd
SD
262static int start_streaming(struct cx231xx_dvb *dvb)
263{
264 int rc;
265 struct cx231xx *dev = dvb->adapter.priv;
266
64fbf444 267 if (dev->USE_ISO) {
336fea92 268 dev_dbg(dev->dev, "DVB transfer mode is ISO.\n");
64fbf444 269 cx231xx_set_alt_setting(dev, INDEX_TS1, 4);
64fbf444
PB
270 rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
271 if (rc < 0)
272 return rc;
273 dev->mode_tv = 1;
274 return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
275 CX231XX_DVB_NUM_BUFS,
276 dev->ts1_mode.max_pkt_size,
277 dvb_isoc_copy);
278 } else {
336fea92 279 dev_dbg(dev->dev, "DVB transfer mode is BULK.\n");
64fbf444
PB
280 cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
281 rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
282 if (rc < 0)
283 return rc;
284 dev->mode_tv = 1;
285 return cx231xx_init_bulk(dev, CX231XX_DVB_MAX_PACKETS,
286 CX231XX_DVB_NUM_BUFS,
287 dev->ts1_mode.max_pkt_size,
288 dvb_bulk_copy);
289 }
e0d3bafd 290
e0d3bafd
SD
291}
292
293static int stop_streaming(struct cx231xx_dvb *dvb)
294{
295 struct cx231xx *dev = dvb->adapter.priv;
296
64fbf444
PB
297 if (dev->USE_ISO)
298 cx231xx_uninit_isoc(dev);
299 else
300 cx231xx_uninit_bulk(dev);
e0d3bafd
SD
301
302 cx231xx_set_mode(dev, CX231XX_SUSPEND);
303
304 return 0;
305}
306
307static int start_feed(struct dvb_demux_feed *feed)
308{
84b5dbf3 309 struct dvb_demux *demux = feed->demux;
e0d3bafd
SD
310 struct cx231xx_dvb *dvb = demux->priv;
311 int rc, ret;
312
313 if (!demux->dmx.frontend)
314 return -EINVAL;
315
316 mutex_lock(&dvb->lock);
317 dvb->nfeeds++;
318 rc = dvb->nfeeds;
319
320 if (dvb->nfeeds == 1) {
321 ret = start_streaming(dvb);
322 if (ret < 0)
323 rc = ret;
324 }
325
326 mutex_unlock(&dvb->lock);
327 return rc;
328}
329
330static int stop_feed(struct dvb_demux_feed *feed)
331{
84b5dbf3 332 struct dvb_demux *demux = feed->demux;
e0d3bafd
SD
333 struct cx231xx_dvb *dvb = demux->priv;
334 int err = 0;
335
336 mutex_lock(&dvb->lock);
337 dvb->nfeeds--;
338
339 if (0 == dvb->nfeeds)
340 err = stop_streaming(dvb);
341
342 mutex_unlock(&dvb->lock);
343 return err;
344}
345
e0d3bafd
SD
346/* ------------------------------------------------------------------ */
347static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
348{
349 struct cx231xx *dev = fe->dvb->priv;
350
351 if (acquire)
352 return cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
353 else
354 return cx231xx_set_mode(dev, CX231XX_SUSPEND);
355}
356
357/* ------------------------------------------------------------------ */
358
e0d3bafd 359static struct xc5000_config cnxt_rde250_tunerconfig = {
84b5dbf3 360 .i2c_address = 0x61,
64fbf444
PB
361 .if_khz = 4000,
362};
363static struct xc5000_config cnxt_rdu250_tunerconfig = {
364 .i2c_address = 0x61,
365 .if_khz = 3250,
e0d3bafd
SD
366};
367
e0d3bafd
SD
368/* ------------------------------------------------------------------ */
369#if 0
370static int attach_xc5000(u8 addr, struct cx231xx *dev)
371{
372
373 struct dvb_frontend *fe;
374 struct xc5000_config cfg;
375
376 memset(&cfg, 0, sizeof(cfg));
c3c3f1ae 377 cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
84b5dbf3 378 cfg.i2c_addr = addr;
e0d3bafd
SD
379
380 if (!dev->dvb->frontend) {
ba1da97e
MCC
381 dev_err(dev->dev, "%s/2: dvb frontend not attached. Can't attach xc5000\n",
382 dev->name);
e0d3bafd
SD
383 return -EINVAL;
384 }
385
386 fe = dvb_attach(xc5000_attach, dev->dvb->frontend, &cfg);
387 if (!fe) {
336fea92 388 dev_err(dev->dev, "%s/2: xc5000 attach failed\n", dev->name);
e0d3bafd
SD
389 dvb_frontend_detach(dev->dvb->frontend);
390 dev->dvb->frontend = NULL;
391 return -EINVAL;
392 }
393
336fea92 394 dev_info(dev->dev, "%s/2: xc5000 attached\n", dev->name);
e0d3bafd
SD
395
396 return 0;
397}
398#endif
399
84b5dbf3 400int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
e0d3bafd 401{
84b5dbf3 402 if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
e0d3bafd 403
84b5dbf3 404 struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
e0d3bafd 405
84b5dbf3
MCC
406 if (dops->set_analog_params != NULL) {
407 struct analog_parameters params;
e0d3bafd 408
84b5dbf3
MCC
409 params.frequency = freq;
410 params.std = dev->norm;
411 params.mode = 0; /* 0- Air; 1 - cable */
412 /*params.audmode = ; */
e0d3bafd 413
84b5dbf3 414 /* Set the analog parameters to set the frequency */
84b5dbf3 415 dops->set_analog_params(dev->dvb->frontend, &params);
e0d3bafd
SD
416 }
417
84b5dbf3
MCC
418 }
419
ea21f702 420 return 0;
e0d3bafd
SD
421}
422
423int cx231xx_reset_analog_tuner(struct cx231xx *dev)
424{
84b5dbf3 425 int status = 0;
e0d3bafd 426
84b5dbf3 427 if ((dev->dvb != NULL) && (dev->dvb->frontend != NULL)) {
e0d3bafd 428
84b5dbf3 429 struct dvb_tuner_ops *dops = &dev->dvb->frontend->ops.tuner_ops;
e0d3bafd 430
84b5dbf3 431 if (dops->init != NULL && !dev->xc_fw_load_done) {
e0d3bafd 432
336fea92 433 dev_dbg(dev->dev,
b7085c08 434 "Reloading firmware for XC5000\n");
84b5dbf3
MCC
435 status = dops->init(dev->dvb->frontend);
436 if (status == 0) {
437 dev->xc_fw_load_done = 1;
336fea92 438 dev_dbg(dev->dev,
b7085c08 439 "XC5000 firmware download completed\n");
84b5dbf3
MCC
440 } else {
441 dev->xc_fw_load_done = 0;
336fea92 442 dev_dbg(dev->dev,
b7085c08 443 "XC5000 firmware download failed !!!\n");
e0d3bafd 444 }
e0d3bafd
SD
445 }
446
84b5dbf3
MCC
447 }
448
e0d3bafd
SD
449 return status;
450}
451
e0d3bafd
SD
452/* ------------------------------------------------------------------ */
453
454static int register_dvb(struct cx231xx_dvb *dvb,
84b5dbf3
MCC
455 struct module *module,
456 struct cx231xx *dev, struct device *device)
e0d3bafd
SD
457{
458 int result;
459
460 mutex_init(&dvb->lock);
461
1d058bdc 462
e0d3bafd
SD
463 /* register adapter */
464 result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
465 adapter_nr);
466 if (result < 0) {
336fea92 467 dev_warn(dev->dev,
84b5dbf3 468 "%s: dvb_register_adapter failed (errno = %d)\n",
e0d3bafd
SD
469 dev->name, result);
470 goto fail_adapter;
471 }
89a2c1d6 472 dvb_register_media_controller(&dvb->adapter, dev->media_dev);
e0d3bafd
SD
473
474 /* Ensure all frontends negotiate bus access */
475 dvb->frontend->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
476
477 dvb->adapter.priv = dev;
478
479 /* register frontend */
480 result = dvb_register_frontend(&dvb->adapter, dvb->frontend);
481 if (result < 0) {
336fea92 482 dev_warn(dev->dev,
84b5dbf3 483 "%s: dvb_register_frontend failed (errno = %d)\n",
e0d3bafd
SD
484 dev->name, result);
485 goto fail_frontend;
486 }
487
488 /* register demux stuff */
489 dvb->demux.dmx.capabilities =
84b5dbf3
MCC
490 DMX_TS_FILTERING | DMX_SECTION_FILTERING |
491 DMX_MEMORY_BASED_FILTERING;
492 dvb->demux.priv = dvb;
493 dvb->demux.filternum = 256;
494 dvb->demux.feednum = 256;
e0d3bafd 495 dvb->demux.start_feed = start_feed;
84b5dbf3 496 dvb->demux.stop_feed = stop_feed;
e0d3bafd
SD
497
498 result = dvb_dmx_init(&dvb->demux);
499 if (result < 0) {
336fea92 500 dev_warn(dev->dev,
3b795d01 501 "%s: dvb_dmx_init failed (errno = %d)\n",
e0d3bafd
SD
502 dev->name, result);
503 goto fail_dmx;
504 }
505
84b5dbf3
MCC
506 dvb->dmxdev.filternum = 256;
507 dvb->dmxdev.demux = &dvb->demux.dmx;
e0d3bafd
SD
508 dvb->dmxdev.capabilities = 0;
509 result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
510 if (result < 0) {
336fea92 511 dev_warn(dev->dev,
3b795d01
MCC
512 "%s: dvb_dmxdev_init failed (errno = %d)\n",
513 dev->name, result);
e0d3bafd
SD
514 goto fail_dmxdev;
515 }
516
517 dvb->fe_hw.source = DMX_FRONTEND_0;
518 result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
519 if (result < 0) {
336fea92 520 dev_warn(dev->dev,
84b5dbf3 521 "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
e0d3bafd
SD
522 dev->name, result);
523 goto fail_fe_hw;
524 }
525
526 dvb->fe_mem.source = DMX_MEMORY_FE;
527 result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
528 if (result < 0) {
336fea92 529 dev_warn(dev->dev,
3b795d01
MCC
530 "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
531 dev->name, result);
e0d3bafd
SD
532 goto fail_fe_mem;
533 }
534
535 result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
536 if (result < 0) {
336fea92 537 dev_warn(dev->dev,
3b795d01
MCC
538 "%s: connect_frontend failed (errno = %d)\n",
539 dev->name, result);
e0d3bafd
SD
540 goto fail_fe_conn;
541 }
542
543 /* register network adapter */
544 dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
6168309a
MCC
545 result = dvb_create_media_graph(&dvb->adapter,
546 dev->tuner_type == TUNER_ABSENT);
0d3ab841
MCC
547 if (result < 0)
548 goto fail_create_graph;
480884b6 549
e0d3bafd
SD
550 return 0;
551
0d3ab841
MCC
552fail_create_graph:
553 dvb_net_release(&dvb->net);
b9255176 554fail_fe_conn:
e0d3bafd 555 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
b9255176 556fail_fe_mem:
e0d3bafd 557 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
b9255176 558fail_fe_hw:
e0d3bafd 559 dvb_dmxdev_release(&dvb->dmxdev);
b9255176 560fail_dmxdev:
e0d3bafd 561 dvb_dmx_release(&dvb->demux);
b9255176 562fail_dmx:
e0d3bafd 563 dvb_unregister_frontend(dvb->frontend);
b9255176 564fail_frontend:
e0d3bafd
SD
565 dvb_frontend_detach(dvb->frontend);
566 dvb_unregister_adapter(&dvb->adapter);
b9255176 567fail_adapter:
e0d3bafd
SD
568 return result;
569}
570
571static void unregister_dvb(struct cx231xx_dvb *dvb)
572{
6d3debaf 573 struct i2c_client *client;
e0d3bafd
SD
574 dvb_net_release(&dvb->net);
575 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
576 dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
577 dvb_dmxdev_release(&dvb->dmxdev);
578 dvb_dmx_release(&dvb->demux);
6d3debaf 579 /* remove I2C tuner */
d28d7f85
MS
580 client = dvb->i2c_client_tuner;
581 if (client) {
582 module_put(client->dev.driver->owner);
583 i2c_unregister_device(client);
584 }
585 /* remove I2C demod */
586 client = dvb->i2c_client_demod;
6d3debaf
MS
587 if (client) {
588 module_put(client->dev.driver->owner);
589 i2c_unregister_device(client);
590 }
e0d3bafd
SD
591 dvb_unregister_frontend(dvb->frontend);
592 dvb_frontend_detach(dvb->frontend);
593 dvb_unregister_adapter(&dvb->adapter);
594}
595
e0d3bafd
SD
596static int dvb_init(struct cx231xx *dev)
597{
598 int result = 0;
599 struct cx231xx_dvb *dvb;
c3c3f1ae
MS
600 struct i2c_adapter *tuner_i2c;
601 struct i2c_adapter *demod_i2c;
e0d3bafd
SD
602
603 if (!dev->board.has_dvb) {
604 /* This device does not support the extension */
605 return 0;
606 }
607
608 dvb = kzalloc(sizeof(struct cx231xx_dvb), GFP_KERNEL);
609
610 if (dvb == NULL) {
336fea92 611 dev_info(dev->dev,
3b795d01 612 "cx231xx_dvb: memory allocation failed\n");
e0d3bafd
SD
613 return -ENOMEM;
614 }
615 dev->dvb = dvb;
616 dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
84b5dbf3 617 dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
e0d3bafd 618
c3c3f1ae
MS
619 tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
620 demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
761f6cf6 621 mutex_lock(&dev->lock);
e0d3bafd 622 cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
64fbf444 623 cx231xx_demod_reset(dev);
e0d3bafd
SD
624 /* init frontend */
625 switch (dev->model) {
64fbf444 626 case CX231XX_BOARD_CNXT_CARRAERA:
84b5dbf3
MCC
627 case CX231XX_BOARD_CNXT_RDE_250:
628
64fbf444
PB
629 dev->dvb->frontend = dvb_attach(s5h1432_attach,
630 &dvico_s5h1432_config,
c3c3f1ae 631 demod_i2c);
84b5dbf3
MCC
632
633 if (dev->dvb->frontend == NULL) {
336fea92 634 dev_err(dev->dev,
3b795d01 635 "Failed to attach s5h1432 front end\n");
84b5dbf3
MCC
636 result = -EINVAL;
637 goto out_free;
638 }
639
640 /* define general-purpose callback pointer */
641 dvb->frontend->callback = cx231xx_tuner_callback;
642
d5abcc78 643 if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
c3c3f1ae 644 tuner_i2c,
d5abcc78 645 &cnxt_rde250_tunerconfig)) {
84b5dbf3
MCC
646 result = -EINVAL;
647 goto out_free;
648 }
649
650 break;
64fbf444 651 case CX231XX_BOARD_CNXT_SHELBY:
84b5dbf3
MCC
652 case CX231XX_BOARD_CNXT_RDU_250:
653
64fbf444
PB
654 dev->dvb->frontend = dvb_attach(s5h1411_attach,
655 &xc5000_s5h1411_config,
c3c3f1ae 656 demod_i2c);
84b5dbf3
MCC
657
658 if (dev->dvb->frontend == NULL) {
336fea92 659 dev_err(dev->dev,
3b795d01 660 "Failed to attach s5h1411 front end\n");
84b5dbf3
MCC
661 result = -EINVAL;
662 goto out_free;
663 }
664
665 /* define general-purpose callback pointer */
666 dvb->frontend->callback = cx231xx_tuner_callback;
667
d5abcc78 668 if (!dvb_attach(xc5000_attach, dev->dvb->frontend,
c3c3f1ae 669 tuner_i2c,
64fbf444
PB
670 &cnxt_rdu250_tunerconfig)) {
671 result = -EINVAL;
672 goto out_free;
673 }
674 break;
675 case CX231XX_BOARD_CNXT_RDE_253S:
676
677 dev->dvb->frontend = dvb_attach(s5h1432_attach,
678 &dvico_s5h1432_config,
c3c3f1ae 679 demod_i2c);
64fbf444
PB
680
681 if (dev->dvb->frontend == NULL) {
336fea92 682 dev_err(dev->dev,
3b795d01 683 "Failed to attach s5h1432 front end\n");
64fbf444
PB
684 result = -EINVAL;
685 goto out_free;
686 }
687
688 /* define general-purpose callback pointer */
689 dvb->frontend->callback = cx231xx_tuner_callback;
690
691 if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
c3c3f1ae 692 0x60, tuner_i2c,
64fbf444
PB
693 &cnxt_rde253s_tunerconfig)) {
694 result = -EINVAL;
695 goto out_free;
696 }
697 break;
698 case CX231XX_BOARD_CNXT_RDU_253S:
8b1255a2 699 case CX231XX_BOARD_KWORLD_UB445_USB_HYBRID:
64fbf444
PB
700
701 dev->dvb->frontend = dvb_attach(s5h1411_attach,
702 &tda18271_s5h1411_config,
c3c3f1ae 703 demod_i2c);
64fbf444
PB
704
705 if (dev->dvb->frontend == NULL) {
336fea92 706 dev_err(dev->dev,
3b795d01 707 "Failed to attach s5h1411 front end\n");
64fbf444
PB
708 result = -EINVAL;
709 goto out_free;
710 }
711
712 /* define general-purpose callback pointer */
713 dvb->frontend->callback = cx231xx_tuner_callback;
714
715 if (!dvb_attach(tda18271_attach, dev->dvb->frontend,
c3c3f1ae 716 0x60, tuner_i2c,
64fbf444 717 &cnxt_rde253s_tunerconfig)) {
84b5dbf3
MCC
718 result = -EINVAL;
719 goto out_free;
720 }
721 break;
1a50fdde
MK
722 case CX231XX_BOARD_HAUPPAUGE_EXETER:
723
336fea92 724 dev_info(dev->dev,
3b795d01 725 "%s: looking for tuner / demod on i2c bus: %d\n",
c3c3f1ae 726 __func__, i2c_adapter_id(tuner_i2c));
1a50fdde
MK
727
728 dev->dvb->frontend = dvb_attach(lgdt3305_attach,
729 &hcw_lgdt3305_config,
599bedb7 730 demod_i2c);
1a50fdde
MK
731
732 if (dev->dvb->frontend == NULL) {
336fea92 733 dev_err(dev->dev,
3b795d01 734 "Failed to attach LG3305 front end\n");
1a50fdde
MK
735 result = -EINVAL;
736 goto out_free;
737 }
738
739 /* define general-purpose callback pointer */
740 dvb->frontend->callback = cx231xx_tuner_callback;
741
742 dvb_attach(tda18271_attach, dev->dvb->frontend,
c3c3f1ae 743 0x60, tuner_i2c,
1a50fdde
MK
744 &hcw_tda18271_config);
745 break;
746
dd2e7dd2 747 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
773028fe
MS
748 {
749 struct i2c_client *client;
750 struct i2c_board_info info;
751 struct si2165_platform_data si2165_pdata;
dd2e7dd2 752
773028fe
MS
753 /* attach demod */
754 memset(&si2165_pdata, 0, sizeof(si2165_pdata));
755 si2165_pdata.fe = &dev->dvb->frontend;
756 si2165_pdata.chip_mode = SI2165_MODE_PLL_XTAL,
757 si2165_pdata.ref_freq_Hz = 16000000,
dd2e7dd2 758
773028fe
MS
759 memset(&info, 0, sizeof(struct i2c_board_info));
760 strlcpy(info.type, "si2165", I2C_NAME_SIZE);
761 info.addr = 0x64;
762 info.platform_data = &si2165_pdata;
763 request_module(info.type);
764 client = i2c_new_device(demod_i2c, &info);
765 if (client == NULL || client->dev.driver == NULL || dev->dvb->frontend == NULL) {
336fea92 766 dev_err(dev->dev,
3b795d01 767 "Failed to attach SI2165 front end\n");
dd2e7dd2
MS
768 result = -EINVAL;
769 goto out_free;
770 }
771
773028fe
MS
772 if (!try_module_get(client->dev.driver->owner)) {
773 i2c_unregister_device(client);
774 result = -ENODEV;
775 goto out_free;
776 }
777
778 dvb->i2c_client_demod = client;
779
3f9280a8 780 dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
dd2e7dd2
MS
781
782 /* define general-purpose callback pointer */
783 dvb->frontend->callback = cx231xx_tuner_callback;
784
785 dvb_attach(tda18271_attach, dev->dvb->frontend,
786 0x60,
c3c3f1ae 787 tuner_i2c,
dd2e7dd2
MS
788 &hcw_tda18271_config);
789
790 dev->cx231xx_reset_analog_tuner = NULL;
791 break;
773028fe 792 }
9e49f7c3
MS
793 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
794 {
795 struct i2c_client *client;
796 struct i2c_board_info info;
773028fe 797 struct si2165_platform_data si2165_pdata;
9e49f7c3
MS
798 struct si2157_config si2157_config;
799
773028fe
MS
800 /* attach demod */
801 memset(&si2165_pdata, 0, sizeof(si2165_pdata));
802 si2165_pdata.fe = &dev->dvb->frontend;
803 si2165_pdata.chip_mode = SI2165_MODE_PLL_EXT,
804 si2165_pdata.ref_freq_Hz = 24000000,
9e49f7c3 805
773028fe
MS
806 memset(&info, 0, sizeof(struct i2c_board_info));
807 strlcpy(info.type, "si2165", I2C_NAME_SIZE);
808 info.addr = 0x64;
809 info.platform_data = &si2165_pdata;
810 request_module(info.type);
811 client = i2c_new_device(demod_i2c, &info);
812 if (client == NULL || client->dev.driver == NULL || dev->dvb->frontend == NULL) {
336fea92 813 dev_err(dev->dev,
3b795d01 814 "Failed to attach SI2165 front end\n");
9e49f7c3
MS
815 result = -EINVAL;
816 goto out_free;
817 }
818
773028fe
MS
819 if (!try_module_get(client->dev.driver->owner)) {
820 i2c_unregister_device(client);
821 result = -ENODEV;
822 goto out_free;
823 }
824
825 dvb->i2c_client_demod = client;
826
827 memset(&info, 0, sizeof(struct i2c_board_info));
828
3f9280a8 829 dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
9e49f7c3
MS
830
831 /* define general-purpose callback pointer */
832 dvb->frontend->callback = cx231xx_tuner_callback;
833
834 /* attach tuner */
835 memset(&si2157_config, 0, sizeof(si2157_config));
836 si2157_config.fe = dev->dvb->frontend;
133bc4e4
MCC
837#ifdef CONFIG_MEDIA_CONTROLLER_DVB
838 si2157_config.mdev = dev->media_dev;
839#endif
ee3c3e46 840 si2157_config.if_port = 1;
9e49f7c3
MS
841 si2157_config.inversion = true;
842 strlcpy(info.type, "si2157", I2C_NAME_SIZE);
843 info.addr = 0x60;
844 info.platform_data = &si2157_config;
845 request_module("si2157");
846
847 client = i2c_new_device(
c3c3f1ae 848 tuner_i2c,
9e49f7c3
MS
849 &info);
850 if (client == NULL || client->dev.driver == NULL) {
851 dvb_frontend_detach(dev->dvb->frontend);
852 result = -ENODEV;
853 goto out_free;
854 }
855
856 if (!try_module_get(client->dev.driver->owner)) {
857 i2c_unregister_device(client);
858 dvb_frontend_detach(dev->dvb->frontend);
859 result = -ENODEV;
860 goto out_free;
861 }
862
863 dev->cx231xx_reset_analog_tuner = NULL;
864
865 dev->dvb->i2c_client_tuner = client;
866 break;
867 }
809abdbf
OS
868 case CX231XX_BOARD_HAUPPAUGE_955Q:
869 {
870 struct i2c_client *client;
871 struct i2c_board_info info;
872 struct si2157_config si2157_config;
873
874 memset(&info, 0, sizeof(struct i2c_board_info));
875
876 dev->dvb->frontend = dvb_attach(lgdt3306a_attach,
877 &hauppauge_955q_lgdt3306a_config,
599bedb7 878 demod_i2c
809abdbf
OS
879 );
880
881 if (dev->dvb->frontend == NULL) {
882 dev_err(dev->dev,
883 "Failed to attach LGDT3306A frontend.\n");
884 result = -EINVAL;
885 goto out_free;
886 }
887
888 dev->dvb->frontend->ops.i2c_gate_ctrl = NULL;
889
890 /* define general-purpose callback pointer */
891 dvb->frontend->callback = cx231xx_tuner_callback;
892
893 /* attach tuner */
894 memset(&si2157_config, 0, sizeof(si2157_config));
895 si2157_config.fe = dev->dvb->frontend;
133bc4e4
MCC
896#ifdef CONFIG_MEDIA_CONTROLLER_DVB
897 si2157_config.mdev = dev->media_dev;
898#endif
ee3c3e46 899 si2157_config.if_port = 1;
809abdbf
OS
900 si2157_config.inversion = true;
901 strlcpy(info.type, "si2157", I2C_NAME_SIZE);
902 info.addr = 0x60;
903 info.platform_data = &si2157_config;
904 request_module("si2157");
905
906 client = i2c_new_device(
907 tuner_i2c,
908 &info);
909 if (client == NULL || client->dev.driver == NULL) {
910 dvb_frontend_detach(dev->dvb->frontend);
911 result = -ENODEV;
912 goto out_free;
913 }
914
915 if (!try_module_get(client->dev.driver->owner)) {
916 i2c_unregister_device(client);
917 dvb_frontend_detach(dev->dvb->frontend);
918 result = -ENODEV;
919 goto out_free;
920 }
921
922 dev->cx231xx_reset_analog_tuner = NULL;
9e49f7c3 923
809abdbf
OS
924 dev->dvb->i2c_client_tuner = client;
925 break;
926 }
ede676c7 927 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
eeaaf817 928 case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
ede676c7 929
336fea92 930 dev_info(dev->dev,
3b795d01
MCC
931 "%s: looking for demod on i2c bus: %d\n",
932 __func__, i2c_adapter_id(tuner_i2c));
ede676c7
MCC
933
934 dev->dvb->frontend = dvb_attach(mb86a20s_attach,
935 &pv_mb86a20s_config,
c3c3f1ae 936 demod_i2c);
ede676c7
MCC
937
938 if (dev->dvb->frontend == NULL) {
336fea92 939 dev_err(dev->dev,
3b795d01 940 "Failed to attach mb86a20s demod\n");
ede676c7
MCC
941 result = -EINVAL;
942 goto out_free;
943 }
944
945 /* define general-purpose callback pointer */
946 dvb->frontend->callback = cx231xx_tuner_callback;
947
948 dvb_attach(tda18271_attach, dev->dvb->frontend,
c3c3f1ae 949 0x60, tuner_i2c,
ede676c7
MCC
950 &pv_tda18271_config);
951 break;
e0d3bafd 952
a096fd64
OK
953 case CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD:
954 {
955 struct si2157_config si2157_config = {};
956 struct si2168_config si2168_config = {};
957 struct i2c_board_info info = {};
958 struct i2c_client *client;
959 struct i2c_adapter *adapter;
960
961 /* attach demodulator chip */
962 si2168_config.ts_mode = SI2168_TS_SERIAL; /* from *.inf file */
963 si2168_config.fe = &dev->dvb->frontend;
964 si2168_config.i2c_adapter = &adapter;
965 si2168_config.ts_clock_inv = true;
966
967 strlcpy(info.type, "si2168", sizeof(info.type));
968 info.addr = dev->board.demod_addr;
969 info.platform_data = &si2168_config;
970
971 request_module(info.type);
972 client = i2c_new_device(demod_i2c, &info);
973
974 if (client == NULL || client->dev.driver == NULL) {
975 result = -ENODEV;
976 goto out_free;
977 }
978
979 if (!try_module_get(client->dev.driver->owner)) {
980 i2c_unregister_device(client);
981 result = -ENODEV;
982 goto out_free;
983 }
984
985 dvb->i2c_client_demod = client;
986
987 /* attach tuner chip */
988 si2157_config.fe = dev->dvb->frontend;
989#ifdef CONFIG_MEDIA_CONTROLLER_DVB
990 si2157_config.mdev = dev->media_dev;
991#endif
992 si2157_config.if_port = 1;
993 si2157_config.inversion = false;
994
995 memset(&info, 0, sizeof(info));
996 strlcpy(info.type, "si2157", sizeof(info.type));
997 info.addr = dev->board.tuner_addr;
998 info.platform_data = &si2157_config;
999
1000 request_module(info.type);
1001 client = i2c_new_device(tuner_i2c, &info);
1002
1003 if (client == NULL || client->dev.driver == NULL) {
1004 module_put(dvb->i2c_client_demod->dev.driver->owner);
1005 i2c_unregister_device(dvb->i2c_client_demod);
1006 result = -ENODEV;
1007 goto out_free;
1008 }
1009
1010 if (!try_module_get(client->dev.driver->owner)) {
1011 i2c_unregister_device(client);
1012 module_put(dvb->i2c_client_demod->dev.driver->owner);
1013 i2c_unregister_device(dvb->i2c_client_demod);
1014 result = -ENODEV;
1015 goto out_free;
1016 }
1017
1018 dev->cx231xx_reset_analog_tuner = NULL;
1019 dev->dvb->i2c_client_tuner = client;
1020 break;
1021 }
e0d3bafd 1022 default:
336fea92 1023 dev_err(dev->dev,
3b795d01
MCC
1024 "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1025 dev->name);
e0d3bafd
SD
1026 break;
1027 }
1028 if (NULL == dvb->frontend) {
336fea92 1029 dev_err(dev->dev,
84b5dbf3 1030 "%s/2: frontend initialization failed\n", dev->name);
e0d3bafd
SD
1031 result = -EINVAL;
1032 goto out_free;
1033 }
1034
e0d3bafd 1035 /* register everything */
336fea92 1036 result = register_dvb(dvb, THIS_MODULE, dev, dev->dev);
e0d3bafd
SD
1037
1038 if (result < 0)
1039 goto out_free;
1040
761f6cf6 1041
336fea92 1042 dev_info(dev->dev, "Successfully loaded cx231xx-dvb\n");
e0d3bafd 1043
761f6cf6 1044ret:
e0d3bafd 1045 cx231xx_set_mode(dev, CX231XX_SUSPEND);
761f6cf6
DH
1046 mutex_unlock(&dev->lock);
1047 return result;
1048
1049out_free:
e0d3bafd
SD
1050 kfree(dvb);
1051 dev->dvb = NULL;
761f6cf6 1052 goto ret;
e0d3bafd
SD
1053}
1054
1055static int dvb_fini(struct cx231xx *dev)
1056{
1057 if (!dev->board.has_dvb) {
1058 /* This device does not support the extension */
1059 return 0;
1060 }
1061
1062 if (dev->dvb) {
1063 unregister_dvb(dev->dvb);
1064 dev->dvb = NULL;
1065 }
1066
1067 return 0;
1068}
1069
1070static struct cx231xx_ops dvb_ops = {
84b5dbf3 1071 .id = CX231XX_DVB,
e0d3bafd
SD
1072 .name = "Cx231xx dvb Extension",
1073 .init = dvb_init,
1074 .fini = dvb_fini,
1075};
1076
1077static int __init cx231xx_dvb_register(void)
1078{
1079 return cx231xx_register_extension(&dvb_ops);
1080}
1081
1082static void __exit cx231xx_dvb_unregister(void)
1083{
1084 cx231xx_unregister_extension(&dvb_ops);
1085}
1086
1087module_init(cx231xx_dvb_register);
1088module_exit(cx231xx_dvb_unregister);