Linux-libre 5.7.6-gnu
[librecmc/linux-libre.git] / drivers / media / usb / cx231xx / cx231xx-dvb.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  DVB device driver for cx231xx
4
5  Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
6                 Based on em28xx driver
7
8  */
9
10 #include "cx231xx.h"
11 #include <linux/kernel.h>
12 #include <linux/slab.h>
13
14 #include <media/dvbdev.h>
15 #include <media/dmxdev.h>
16 #include <media/dvb_demux.h>
17 #include <media/dvb_net.h>
18 #include <media/dvb_frontend.h>
19 #include <media/v4l2-common.h>
20 #include <media/tuner.h>
21
22 #include "xc5000.h"
23 #include "s5h1432.h"
24 #include "tda18271.h"
25 #include "s5h1411.h"
26 #include "lgdt3305.h"
27 #include "si2165.h"
28 #include "si2168.h"
29 #include "mb86a20s.h"
30 #include "si2157.h"
31 #include "lgdt3306a.h"
32 #include "r820t.h"
33 #include "mn88473.h"
34
35 MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
36 MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
37 MODULE_LICENSE("GPL");
38
39 static unsigned int debug;
40 module_param(debug, int, 0644);
41 MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
42
43 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
44
45 #define CX231XX_DVB_NUM_BUFS 5
46 #define CX231XX_DVB_MAX_PACKETSIZE 564
47 #define CX231XX_DVB_MAX_PACKETS 64
48 #define CX231XX_DVB_MAX_FRONTENDS 2
49
50 struct cx231xx_dvb {
51         struct dvb_frontend *frontend[CX231XX_DVB_MAX_FRONTENDS];
52
53         /* feed count management */
54         struct mutex lock;
55         int nfeeds;
56
57         /* general boilerplate stuff */
58         struct dvb_adapter adapter;
59         struct dvb_demux demux;
60         struct dmxdev dmxdev;
61         struct dmx_frontend fe_hw;
62         struct dmx_frontend fe_mem;
63         struct dvb_net net;
64         struct i2c_client *i2c_client_demod[2];
65         struct i2c_client *i2c_client_tuner;
66 };
67
68 static struct s5h1432_config dvico_s5h1432_config = {
69         .output_mode   = S5H1432_SERIAL_OUTPUT,
70         .gpio          = S5H1432_GPIO_ON,
71         .qam_if        = S5H1432_IF_4000,
72         .vsb_if        = S5H1432_IF_4000,
73         .inversion     = S5H1432_INVERSION_OFF,
74         .status_mode   = S5H1432_DEMODLOCKING,
75         .mpeg_timing   = S5H1432_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
76 };
77
78 static struct tda18271_std_map cnxt_rde253s_tda18271_std_map = {
79         .dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
80                       .if_lvl = 1, .rfagc_top = 0x37, },
81         .dvbt_7   = { .if_freq = 4000, .agc_mode = 3, .std = 5,
82                       .if_lvl = 1, .rfagc_top = 0x37, },
83         .dvbt_8   = { .if_freq = 4000, .agc_mode = 3, .std = 6,
84                       .if_lvl = 1, .rfagc_top = 0x37, },
85 };
86
87 static struct tda18271_std_map mb86a20s_tda18271_config = {
88         .dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
89                       .if_lvl = 0, .rfagc_top = 0x37, },
90 };
91
92 static struct tda18271_config cnxt_rde253s_tunerconfig = {
93         .std_map = &cnxt_rde253s_tda18271_std_map,
94         .gate    = TDA18271_GATE_ANALOG,
95 };
96
97 static struct s5h1411_config tda18271_s5h1411_config = {
98         .output_mode   = S5H1411_SERIAL_OUTPUT,
99         .gpio          = S5H1411_GPIO_OFF,
100         .vsb_if        = S5H1411_IF_3250,
101         .qam_if        = S5H1411_IF_4000,
102         .inversion     = S5H1411_INVERSION_ON,
103         .status_mode   = S5H1411_DEMODLOCKING,
104         .mpeg_timing   = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
105 };
106 static struct s5h1411_config xc5000_s5h1411_config = {
107         .output_mode   = S5H1411_SERIAL_OUTPUT,
108         .gpio          = S5H1411_GPIO_OFF,
109         .vsb_if        = S5H1411_IF_3250,
110         .qam_if        = S5H1411_IF_3250,
111         .inversion     = S5H1411_INVERSION_OFF,
112         .status_mode   = S5H1411_DEMODLOCKING,
113         .mpeg_timing   = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
114 };
115
116 static struct lgdt3305_config hcw_lgdt3305_config = {
117         .i2c_addr           = 0x0e,
118         .mpeg_mode          = LGDT3305_MPEG_SERIAL,
119         .tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
120         .tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
121         .deny_i2c_rptr      = 1,
122         .spectral_inversion = 1,
123         .qam_if_khz         = 4000,
124         .vsb_if_khz         = 3250,
125 };
126
127 static struct tda18271_std_map hauppauge_tda18271_std_map = {
128         .atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
129                       .if_lvl = 1, .rfagc_top = 0x58, },
130         .qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
131                       .if_lvl = 1, .rfagc_top = 0x58, },
132 };
133
134 static struct tda18271_config hcw_tda18271_config = {
135         .std_map = &hauppauge_tda18271_std_map,
136         .gate    = TDA18271_GATE_DIGITAL,
137 };
138
139 static const struct mb86a20s_config pv_mb86a20s_config = {
140         .demod_address = 0x10,
141         .is_serial = true,
142 };
143
144 static struct tda18271_config pv_tda18271_config = {
145         .std_map = &mb86a20s_tda18271_config,
146         .gate    = TDA18271_GATE_DIGITAL,
147         .small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
148 };
149
150 static const struct lgdt3306a_config hauppauge_955q_lgdt3306a_config = {
151         .qam_if_khz         = 4000,
152         .vsb_if_khz         = 3250,
153         .spectral_inversion = 1,
154         .mpeg_mode          = LGDT3306A_MPEG_SERIAL,
155         .tpclk_edge         = LGDT3306A_TPCLK_RISING_EDGE,
156         .tpvalid_polarity   = LGDT3306A_TP_VALID_HIGH,
157         .xtalMHz            = 25,
158 };
159
160 static struct r820t_config astrometa_t2hybrid_r820t_config = {
161         .i2c_addr               = 0x3a, /* 0x74 >> 1 */
162         .xtal                   = 16000000,
163         .rafael_chip            = CHIP_R828D,
164         .max_i2c_msg_len        = 2,
165 };
166
167 static inline void print_err_status(struct cx231xx *dev, int packet, int status)
168 {
169         char *errmsg = "Unknown";
170
171         switch (status) {
172         case -ENOENT:
173                 errmsg = "unlinked synchronously";
174                 break;
175         case -ECONNRESET:
176                 errmsg = "unlinked asynchronously";
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) {
198                 dev_dbg(dev->dev,
199                         "URB status %d [%s].\n", status, errmsg);
200         } else {
201                 dev_dbg(dev->dev,
202                         "URB packet %d, status %d [%s].\n",
203                         packet, status, errmsg);
204         }
205 }
206
207 static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
208 {
209         int i;
210
211         if (!dev)
212                 return 0;
213
214         if (dev->state & DEV_DISCONNECTED)
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
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);
236         }
237
238         return 0;
239 }
240
241 static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb)
242 {
243         if (!dev)
244                 return 0;
245
246         if (dev->state & DEV_DISCONNECTED)
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
262 static int start_streaming(struct cx231xx_dvb *dvb)
263 {
264         int rc;
265         struct cx231xx *dev = dvb->adapter.priv;
266
267         if (dev->USE_ISO) {
268                 dev_dbg(dev->dev, "DVB transfer mode is ISO.\n");
269                 cx231xx_set_alt_setting(dev, INDEX_TS1, 5);
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 {
279                 dev_dbg(dev->dev, "DVB transfer mode is BULK.\n");
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         }
290
291 }
292
293 static int stop_streaming(struct cx231xx_dvb *dvb)
294 {
295         struct cx231xx *dev = dvb->adapter.priv;
296
297         if (dev->USE_ISO)
298                 cx231xx_uninit_isoc(dev);
299         else
300                 cx231xx_uninit_bulk(dev);
301
302         cx231xx_set_mode(dev, CX231XX_SUSPEND);
303
304         return 0;
305 }
306
307 static int start_feed(struct dvb_demux_feed *feed)
308 {
309         struct dvb_demux *demux = feed->demux;
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
330 static int stop_feed(struct dvb_demux_feed *feed)
331 {
332         struct dvb_demux *demux = feed->demux;
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
346 /* ------------------------------------------------------------------ */
347 static 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
359 static struct xc5000_config cnxt_rde250_tunerconfig = {
360         .i2c_address = 0x61,
361         .if_khz = 4000,
362 };
363 static struct xc5000_config cnxt_rdu250_tunerconfig = {
364         .i2c_address = 0x61,
365         .if_khz = 3250,
366 };
367
368 /* ------------------------------------------------------------------ */
369 #if 0
370 static 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));
377         cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
378         cfg.i2c_addr = addr;
379
380         if (!dev->dvb->frontend[0]) {
381                 dev_err(dev->dev, "%s/2: dvb frontend not attached. Can't attach xc5000\n",
382                         dev->name);
383                 return -EINVAL;
384         }
385
386         fe = dvb_attach(xc5000_attach, dev->dvb->frontend[0], &cfg);
387         if (!fe) {
388                 dev_err(dev->dev, "%s/2: xc5000 attach failed\n", dev->name);
389                 dvb_frontend_detach(dev->dvb->frontend[0]);
390                 dev->dvb->frontend[0] = NULL;
391                 return -EINVAL;
392         }
393
394         dev_info(dev->dev, "%s/2: xc5000 attached\n", dev->name);
395
396         return 0;
397 }
398 #endif
399
400 int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
401 {
402         if (dev->dvb && dev->dvb->frontend[0]) {
403
404                 struct dvb_tuner_ops *dops = &dev->dvb->frontend[0]->ops.tuner_ops;
405
406                 if (dops->set_analog_params != NULL) {
407                         struct analog_parameters params;
408
409                         params.frequency = freq;
410                         params.std = dev->norm;
411                         params.mode = 0;        /* 0- Air; 1 - cable */
412                         /*params.audmode = ;       */
413
414                         /* Set the analog parameters to set the frequency */
415                         dops->set_analog_params(dev->dvb->frontend[0], &params);
416                 }
417
418         }
419
420         return 0;
421 }
422
423 int cx231xx_reset_analog_tuner(struct cx231xx *dev)
424 {
425         int status = 0;
426
427         if (dev->dvb && dev->dvb->frontend[0]) {
428
429                 struct dvb_tuner_ops *dops = &dev->dvb->frontend[0]->ops.tuner_ops;
430
431                 if (dops->init != NULL && !dev->xc_fw_load_done) {
432
433                         dev_dbg(dev->dev,
434                                 "Reloading firmware for XC5000\n");
435                         status = dops->init(dev->dvb->frontend[0]);
436                         if (status == 0) {
437                                 dev->xc_fw_load_done = 1;
438                                 dev_dbg(dev->dev,
439                                         "XC5000 firmware download completed\n");
440                         } else {
441                                 dev->xc_fw_load_done = 0;
442                                 dev_dbg(dev->dev,
443                                         "XC5000 firmware download failed !!!\n");
444                         }
445                 }
446
447         }
448
449         return status;
450 }
451
452 /* ------------------------------------------------------------------ */
453
454 static int register_dvb(struct cx231xx_dvb *dvb,
455                         struct module *module,
456                         struct cx231xx *dev, struct device *device)
457 {
458         int result;
459
460         mutex_init(&dvb->lock);
461
462
463         /* register adapter */
464         result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
465                                       adapter_nr);
466         if (result < 0) {
467                 dev_warn(dev->dev,
468                        "%s: dvb_register_adapter failed (errno = %d)\n",
469                        dev->name, result);
470                 goto fail_adapter;
471         }
472         dvb_register_media_controller(&dvb->adapter, dev->media_dev);
473
474         /* Ensure all frontends negotiate bus access */
475         dvb->frontend[0]->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
476         if (dvb->frontend[1])
477                 dvb->frontend[1]->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
478
479         dvb->adapter.priv = dev;
480
481         /* register frontend */
482         result = dvb_register_frontend(&dvb->adapter, dvb->frontend[0]);
483         if (result < 0) {
484                 dev_warn(dev->dev,
485                        "%s: dvb_register_frontend failed (errno = %d)\n",
486                        dev->name, result);
487                 goto fail_frontend0;
488         }
489
490         if (dvb->frontend[1]) {
491                 result = dvb_register_frontend(&dvb->adapter, dvb->frontend[1]);
492                 if (result < 0) {
493                         dev_warn(dev->dev,
494                                  "%s: 2nd dvb_register_frontend failed (errno = %d)\n",
495                                 dev->name, result);
496                         goto fail_frontend1;
497                 }
498
499                 /* MFE lock */
500                 dvb->adapter.mfe_shared = 1;
501         }
502
503         /* register demux stuff */
504         dvb->demux.dmx.capabilities =
505             DMX_TS_FILTERING | DMX_SECTION_FILTERING |
506             DMX_MEMORY_BASED_FILTERING;
507         dvb->demux.priv = dvb;
508         dvb->demux.filternum = 256;
509         dvb->demux.feednum = 256;
510         dvb->demux.start_feed = start_feed;
511         dvb->demux.stop_feed = stop_feed;
512
513         result = dvb_dmx_init(&dvb->demux);
514         if (result < 0) {
515                 dev_warn(dev->dev,
516                          "%s: dvb_dmx_init failed (errno = %d)\n",
517                        dev->name, result);
518                 goto fail_dmx;
519         }
520
521         dvb->dmxdev.filternum = 256;
522         dvb->dmxdev.demux = &dvb->demux.dmx;
523         dvb->dmxdev.capabilities = 0;
524         result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
525         if (result < 0) {
526                 dev_warn(dev->dev,
527                          "%s: dvb_dmxdev_init failed (errno = %d)\n",
528                          dev->name, result);
529                 goto fail_dmxdev;
530         }
531
532         dvb->fe_hw.source = DMX_FRONTEND_0;
533         result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
534         if (result < 0) {
535                 dev_warn(dev->dev,
536                        "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
537                        dev->name, result);
538                 goto fail_fe_hw;
539         }
540
541         dvb->fe_mem.source = DMX_MEMORY_FE;
542         result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
543         if (result < 0) {
544                 dev_warn(dev->dev,
545                          "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
546                          dev->name, result);
547                 goto fail_fe_mem;
548         }
549
550         result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
551         if (result < 0) {
552                 dev_warn(dev->dev,
553                          "%s: connect_frontend failed (errno = %d)\n",
554                          dev->name, result);
555                 goto fail_fe_conn;
556         }
557
558         /* register network adapter */
559         dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
560         result = dvb_create_media_graph(&dvb->adapter,
561                                         dev->tuner_type == TUNER_ABSENT);
562         if (result < 0)
563                 goto fail_create_graph;
564
565         return 0;
566
567 fail_create_graph:
568         dvb_net_release(&dvb->net);
569 fail_fe_conn:
570         dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
571 fail_fe_mem:
572         dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
573 fail_fe_hw:
574         dvb_dmxdev_release(&dvb->dmxdev);
575 fail_dmxdev:
576         dvb_dmx_release(&dvb->demux);
577 fail_dmx:
578         if (dvb->frontend[1])
579                 dvb_unregister_frontend(dvb->frontend[1]);
580         dvb_unregister_frontend(dvb->frontend[0]);
581 fail_frontend1:
582         if (dvb->frontend[1])
583                 dvb_frontend_detach(dvb->frontend[1]);
584 fail_frontend0:
585         dvb_frontend_detach(dvb->frontend[0]);
586         dvb_unregister_adapter(&dvb->adapter);
587 fail_adapter:
588         return result;
589 }
590
591 static void unregister_dvb(struct cx231xx_dvb *dvb)
592 {
593         dvb_net_release(&dvb->net);
594         dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
595         dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
596         dvb_dmxdev_release(&dvb->dmxdev);
597         dvb_dmx_release(&dvb->demux);
598         if (dvb->frontend[1])
599                 dvb_unregister_frontend(dvb->frontend[1]);
600         dvb_unregister_frontend(dvb->frontend[0]);
601         if (dvb->frontend[1])
602                 dvb_frontend_detach(dvb->frontend[1]);
603         dvb_frontend_detach(dvb->frontend[0]);
604         dvb_unregister_adapter(&dvb->adapter);
605
606         /* remove I2C tuner */
607         dvb_module_release(dvb->i2c_client_tuner);
608         dvb->i2c_client_tuner = NULL;
609         /* remove I2C demod(s) */
610         dvb_module_release(dvb->i2c_client_demod[1]);
611         dvb->i2c_client_demod[1] = NULL;
612         dvb_module_release(dvb->i2c_client_demod[0]);
613         dvb->i2c_client_demod[0] = NULL;
614 }
615
616 static int dvb_init(struct cx231xx *dev)
617 {
618         int result;
619         struct cx231xx_dvb *dvb;
620         struct i2c_adapter *tuner_i2c;
621         struct i2c_adapter *demod_i2c;
622         struct i2c_client *client;
623         struct i2c_adapter *adapter;
624
625         if (!dev->board.has_dvb) {
626                 /* This device does not support the extension */
627                 return 0;
628         }
629
630         dvb = kzalloc(sizeof(struct cx231xx_dvb), GFP_KERNEL);
631
632         if (dvb == NULL) {
633                 dev_info(dev->dev,
634                          "cx231xx_dvb: memory allocation failed\n");
635                 return -ENOMEM;
636         }
637         dev->dvb = dvb;
638         dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
639         dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
640
641         tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
642         demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
643         mutex_lock(&dev->lock);
644         cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
645         cx231xx_demod_reset(dev);
646         /* init frontend */
647         switch (dev->model) {
648         case CX231XX_BOARD_CNXT_CARRAERA:
649         case CX231XX_BOARD_CNXT_RDE_250:
650
651                 dev->dvb->frontend[0] = dvb_attach(s5h1432_attach,
652                                         &dvico_s5h1432_config,
653                                         demod_i2c);
654
655                 if (!dev->dvb->frontend[0]) {
656                         dev_err(dev->dev,
657                                 "Failed to attach s5h1432 front end\n");
658                         result = -EINVAL;
659                         goto out_free;
660                 }
661
662                 /* define general-purpose callback pointer */
663                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
664
665                 if (!dvb_attach(xc5000_attach, dev->dvb->frontend[0],
666                                tuner_i2c,
667                                &cnxt_rde250_tunerconfig)) {
668                         result = -EINVAL;
669                         goto out_free;
670                 }
671
672                 break;
673         case CX231XX_BOARD_CNXT_SHELBY:
674         case CX231XX_BOARD_CNXT_RDU_250:
675
676                 dev->dvb->frontend[0] = dvb_attach(s5h1411_attach,
677                                                &xc5000_s5h1411_config,
678                                                demod_i2c);
679
680                 if (!dev->dvb->frontend[0]) {
681                         dev_err(dev->dev,
682                                 "Failed to attach s5h1411 front end\n");
683                         result = -EINVAL;
684                         goto out_free;
685                 }
686
687                 /* define general-purpose callback pointer */
688                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
689
690                 if (!dvb_attach(xc5000_attach, dev->dvb->frontend[0],
691                                tuner_i2c,
692                                &cnxt_rdu250_tunerconfig)) {
693                         result = -EINVAL;
694                         goto out_free;
695                 }
696                 break;
697         case CX231XX_BOARD_CNXT_RDE_253S:
698
699                 dev->dvb->frontend[0] = dvb_attach(s5h1432_attach,
700                                         &dvico_s5h1432_config,
701                                         demod_i2c);
702
703                 if (!dev->dvb->frontend[0]) {
704                         dev_err(dev->dev,
705                                 "Failed to attach s5h1432 front end\n");
706                         result = -EINVAL;
707                         goto out_free;
708                 }
709
710                 /* define general-purpose callback pointer */
711                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
712
713                 if (!dvb_attach(tda18271_attach, dev->dvb->frontend[0],
714                                dev->board.tuner_addr, tuner_i2c,
715                                &cnxt_rde253s_tunerconfig)) {
716                         result = -EINVAL;
717                         goto out_free;
718                 }
719                 break;
720         case CX231XX_BOARD_CNXT_RDU_253S:
721         case CX231XX_BOARD_KWORLD_UB445_USB_HYBRID:
722
723                 dev->dvb->frontend[0] = dvb_attach(s5h1411_attach,
724                                                &tda18271_s5h1411_config,
725                                                demod_i2c);
726
727                 if (!dev->dvb->frontend[0]) {
728                         dev_err(dev->dev,
729                                 "Failed to attach s5h1411 front end\n");
730                         result = -EINVAL;
731                         goto out_free;
732                 }
733
734                 /* define general-purpose callback pointer */
735                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
736
737                 if (!dvb_attach(tda18271_attach, dev->dvb->frontend[0],
738                                dev->board.tuner_addr, tuner_i2c,
739                                &cnxt_rde253s_tunerconfig)) {
740                         result = -EINVAL;
741                         goto out_free;
742                 }
743                 break;
744         case CX231XX_BOARD_HAUPPAUGE_EXETER:
745
746                 dev_info(dev->dev,
747                          "%s: looking for tuner / demod on i2c bus: %d\n",
748                        __func__, i2c_adapter_id(tuner_i2c));
749
750                 dev->dvb->frontend[0] = dvb_attach(lgdt3305_attach,
751                                                 &hcw_lgdt3305_config,
752                                                 demod_i2c);
753
754                 if (!dev->dvb->frontend[0]) {
755                         dev_err(dev->dev,
756                                 "Failed to attach LG3305 front end\n");
757                         result = -EINVAL;
758                         goto out_free;
759                 }
760
761                 /* define general-purpose callback pointer */
762                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
763
764                 dvb_attach(tda18271_attach, dev->dvb->frontend[0],
765                            dev->board.tuner_addr, tuner_i2c,
766                            &hcw_tda18271_config);
767                 break;
768
769         case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
770         {
771                 struct si2165_platform_data si2165_pdata = {};
772
773                 /* attach demod */
774                 si2165_pdata.fe = &dev->dvb->frontend[0];
775                 si2165_pdata.chip_mode = SI2165_MODE_PLL_XTAL;
776                 si2165_pdata.ref_freq_hz = 16000000;
777
778                 /* perform probe/init/attach */
779                 client = dvb_module_probe("si2165", NULL, demod_i2c,
780                                                 dev->board.demod_addr,
781                                                 &si2165_pdata);
782                 if (!client) {
783                         result = -ENODEV;
784                         goto out_free;
785                 }
786                 dvb->i2c_client_demod[0] = client;
787
788                 dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
789
790                 /* define general-purpose callback pointer */
791                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
792
793                 dvb_attach(tda18271_attach, dev->dvb->frontend[0],
794                         dev->board.tuner_addr, tuner_i2c,
795                         &hcw_tda18271_config);
796
797                 dev->cx231xx_reset_analog_tuner = NULL;
798                 break;
799         }
800         case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
801         {
802                 struct si2165_platform_data si2165_pdata = {};
803                 struct si2157_config si2157_config = {};
804
805                 /* attach demod */
806                 si2165_pdata.fe = &dev->dvb->frontend[0];
807                 si2165_pdata.chip_mode = SI2165_MODE_PLL_EXT;
808                 si2165_pdata.ref_freq_hz = 24000000;
809
810                 /* perform probe/init/attach */
811                 client = dvb_module_probe("si2165", NULL, demod_i2c,
812                                                 dev->board.demod_addr,
813                                                 &si2165_pdata);
814                 if (!client) {
815                         result = -ENODEV;
816                         goto out_free;
817                 }
818                 dvb->i2c_client_demod[0] = client;
819
820                 dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
821
822                 /* define general-purpose callback pointer */
823                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
824
825                 /* attach tuner */
826                 si2157_config.fe = dev->dvb->frontend[0];
827 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
828                 si2157_config.mdev = dev->media_dev;
829 #endif
830                 si2157_config.if_port = 1;
831                 si2157_config.inversion = true;
832
833                 /* perform probe/init/attach */
834                 client = dvb_module_probe("si2157", NULL, tuner_i2c,
835                                                 dev->board.tuner_addr,
836                                                 &si2157_config);
837                 if (!client) {
838                         result = -ENODEV;
839                         goto out_free;
840                 }
841                 dev->cx231xx_reset_analog_tuner = NULL;
842
843                 dev->dvb->i2c_client_tuner = client;
844                 break;
845         }
846         case CX231XX_BOARD_HAUPPAUGE_955Q:
847         {
848                 struct si2157_config si2157_config = {};
849                 struct lgdt3306a_config lgdt3306a_config = {};
850
851                 lgdt3306a_config = hauppauge_955q_lgdt3306a_config;
852                 lgdt3306a_config.fe = &dev->dvb->frontend[0];
853                 lgdt3306a_config.i2c_adapter = &adapter;
854
855                 /* perform probe/init/attach */
856                 client = dvb_module_probe("lgdt3306a", NULL, demod_i2c,
857                                                 dev->board.demod_addr,
858                                                 &lgdt3306a_config);
859                 if (!client) {
860                         result = -ENODEV;
861                         goto out_free;
862                 }
863                 dvb->i2c_client_demod[0] = client;
864
865                 dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
866
867                 /* define general-purpose callback pointer */
868                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
869
870                 /* attach tuner */
871                 si2157_config.fe = dev->dvb->frontend[0];
872 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
873                 si2157_config.mdev = dev->media_dev;
874 #endif
875                 si2157_config.if_port = 1;
876                 si2157_config.inversion = true;
877
878                 /* perform probe/init/attach */
879                 client = dvb_module_probe("si2157", NULL, tuner_i2c,
880                                                 dev->board.tuner_addr,
881                                                 &si2157_config);
882                 if (!client) {
883                         result = -ENODEV;
884                         goto out_free;
885                 }
886                 dev->cx231xx_reset_analog_tuner = NULL;
887
888                 dev->dvb->i2c_client_tuner = client;
889                 break;
890         }
891         case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
892         case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
893
894                 dev_info(dev->dev,
895                          "%s: looking for demod on i2c bus: %d\n",
896                          __func__, i2c_adapter_id(tuner_i2c));
897
898                 dev->dvb->frontend[0] = dvb_attach(mb86a20s_attach,
899                                                 &pv_mb86a20s_config,
900                                                 demod_i2c);
901
902                 if (!dev->dvb->frontend[0]) {
903                         dev_err(dev->dev,
904                                 "Failed to attach mb86a20s demod\n");
905                         result = -EINVAL;
906                         goto out_free;
907                 }
908
909                 /* define general-purpose callback pointer */
910                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
911
912                 dvb_attach(tda18271_attach, dev->dvb->frontend[0],
913                            dev->board.tuner_addr, tuner_i2c,
914                            &pv_tda18271_config);
915                 break;
916
917         case CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD:
918         {
919                 struct si2157_config si2157_config = {};
920                 struct si2168_config si2168_config = {};
921
922                 /* attach demodulator chip */
923                 si2168_config.ts_mode = SI2168_TS_SERIAL; /* from *.inf file */
924                 si2168_config.fe = &dev->dvb->frontend[0];
925                 si2168_config.i2c_adapter = &adapter;
926                 si2168_config.ts_clock_inv = true;
927
928                 /* perform probe/init/attach */
929                 client = dvb_module_probe("si2168", NULL, demod_i2c,
930                                                 dev->board.demod_addr,
931                                                 &si2168_config);
932                 if (!client) {
933                         result = -ENODEV;
934                         goto out_free;
935                 }
936                 dvb->i2c_client_demod[0] = client;
937
938                 /* attach tuner chip */
939                 si2157_config.fe = dev->dvb->frontend[0];
940 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
941                 si2157_config.mdev = dev->media_dev;
942 #endif
943                 si2157_config.if_port = 1;
944                 si2157_config.inversion = false;
945
946                 /* perform probe/init/attach */
947                 client = dvb_module_probe("si2157", NULL, tuner_i2c,
948                                                 dev->board.tuner_addr,
949                                                 &si2157_config);
950                 if (!client) {
951                         result = -ENODEV;
952                         goto out_free;
953                 }
954                 dev->cx231xx_reset_analog_tuner = NULL;
955                 dev->dvb->i2c_client_tuner = client;
956                 break;
957         }
958         case CX231XX_BOARD_ASTROMETA_T2HYBRID:
959         {
960                 struct mn88473_config mn88473_config = {};
961
962                 /* attach demodulator chip */
963                 mn88473_config.i2c_wr_max = 16;
964                 mn88473_config.xtal = 25000000;
965                 mn88473_config.fe = &dev->dvb->frontend[0];
966
967                 /* perform probe/init/attach */
968                 client = dvb_module_probe("mn88473", NULL, demod_i2c,
969                                                 dev->board.demod_addr,
970                                                 &mn88473_config);
971                 if (!client) {
972                         result = -ENODEV;
973                         goto out_free;
974                 }
975                 dvb->i2c_client_demod[0] = client;
976
977                 /* define general-purpose callback pointer */
978                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
979
980                 /* attach tuner chip */
981                 dvb_attach(r820t_attach, dev->dvb->frontend[0],
982                            tuner_i2c,
983                            &astrometa_t2hybrid_r820t_config);
984                 break;
985         }
986         case CX231XX_BOARD_HAUPPAUGE_935C:
987         {
988                 struct si2157_config si2157_config = {};
989                 struct si2168_config si2168_config = {};
990
991                 /* attach demodulator chip */
992                 si2168_config.ts_mode = SI2168_TS_SERIAL;
993                 si2168_config.fe = &dev->dvb->frontend[0];
994                 si2168_config.i2c_adapter = &adapter;
995                 si2168_config.ts_clock_inv = true;
996
997                 /* perform probe/init/attach */
998                 client = dvb_module_probe("si2168", NULL, demod_i2c,
999                                                 dev->board.demod_addr,
1000                                                 &si2168_config);
1001                 if (!client) {
1002                         result = -ENODEV;
1003                         goto out_free;
1004                 }
1005                 dvb->i2c_client_demod[0] = client;
1006                 dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
1007
1008                 /* define general-purpose callback pointer */
1009                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
1010
1011                 /* attach tuner */
1012                 si2157_config.fe = dev->dvb->frontend[0];
1013 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
1014                 si2157_config.mdev = dev->media_dev;
1015 #endif
1016                 si2157_config.if_port = 1;
1017                 si2157_config.inversion = true;
1018
1019                 /* perform probe/init/attach */
1020                 client = dvb_module_probe("si2157", NULL, tuner_i2c,
1021                                                 dev->board.tuner_addr,
1022                                                 &si2157_config);
1023                 if (!client) {
1024                         result = -ENODEV;
1025                         goto out_free;
1026                 }
1027                 dev->cx231xx_reset_analog_tuner = NULL;
1028                 dev->dvb->i2c_client_tuner = client;
1029                 break;
1030         }
1031         case CX231XX_BOARD_HAUPPAUGE_975:
1032         {
1033                 struct i2c_adapter *adapter2;
1034                 struct si2157_config si2157_config = {};
1035                 struct lgdt3306a_config lgdt3306a_config = {};
1036                 struct si2168_config si2168_config = {};
1037
1038                 /* attach first demodulator chip */
1039                 lgdt3306a_config = hauppauge_955q_lgdt3306a_config;
1040                 lgdt3306a_config.fe = &dev->dvb->frontend[0];
1041                 lgdt3306a_config.i2c_adapter = &adapter;
1042
1043                 /* perform probe/init/attach */
1044                 client = dvb_module_probe("lgdt3306a", NULL, demod_i2c,
1045                                                 dev->board.demod_addr,
1046                                                 &lgdt3306a_config);
1047                 if (!client) {
1048                         result = -ENODEV;
1049                         goto out_free;
1050                 }
1051                 dvb->i2c_client_demod[0] = client;
1052
1053                 /* attach second demodulator chip */
1054                 si2168_config.ts_mode = SI2168_TS_SERIAL;
1055                 si2168_config.fe = &dev->dvb->frontend[1];
1056                 si2168_config.i2c_adapter = &adapter2;
1057                 si2168_config.ts_clock_inv = true;
1058
1059                 /* perform probe/init/attach */
1060                 client = dvb_module_probe("si2168", NULL, adapter,
1061                                                 dev->board.demod_addr2,
1062                                                 &si2168_config);
1063                 if (!client) {
1064                         result = -ENODEV;
1065                         goto out_free;
1066                 }
1067                 dvb->i2c_client_demod[1] = client;
1068                 dvb->frontend[1]->id = 1;
1069
1070                 /* define general-purpose callback pointer */
1071                 dvb->frontend[0]->callback = cx231xx_tuner_callback;
1072                 dvb->frontend[1]->callback = cx231xx_tuner_callback;
1073
1074                 /* attach tuner */
1075                 si2157_config.fe = dev->dvb->frontend[0];
1076 #ifdef CONFIG_MEDIA_CONTROLLER_DVB
1077                 si2157_config.mdev = dev->media_dev;
1078 #endif
1079                 si2157_config.if_port = 1;
1080                 si2157_config.inversion = true;
1081
1082                 /* perform probe/init/attach */
1083                 client = dvb_module_probe("si2157", NULL, adapter,
1084                                                 dev->board.tuner_addr,
1085                                                 &si2157_config);
1086                 if (!client) {
1087                         result = -ENODEV;
1088                         goto out_free;
1089                 }
1090                 dev->cx231xx_reset_analog_tuner = NULL;
1091                 dvb->i2c_client_tuner = client;
1092
1093                 dvb->frontend[1]->tuner_priv = dvb->frontend[0]->tuner_priv;
1094
1095                 memcpy(&dvb->frontend[1]->ops.tuner_ops,
1096                         &dvb->frontend[0]->ops.tuner_ops,
1097                         sizeof(struct dvb_tuner_ops));
1098                 break;
1099         }
1100         default:
1101                 dev_err(dev->dev,
1102                         "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1103                         dev->name);
1104                 break;
1105         }
1106         if (!dvb->frontend[0]) {
1107                 dev_err(dev->dev,
1108                        "%s/2: frontend initialization failed\n", dev->name);
1109                 result = -EINVAL;
1110                 goto out_free;
1111         }
1112
1113         /* register everything */
1114         result = register_dvb(dvb, THIS_MODULE, dev, dev->dev);
1115
1116         if (result < 0)
1117                 goto out_free;
1118
1119
1120         dev_info(dev->dev, "Successfully loaded cx231xx-dvb\n");
1121
1122 ret:
1123         cx231xx_set_mode(dev, CX231XX_SUSPEND);
1124         mutex_unlock(&dev->lock);
1125         return result;
1126
1127 out_free:
1128         /* remove I2C tuner */
1129         dvb_module_release(dvb->i2c_client_tuner);
1130         dvb->i2c_client_tuner = NULL;
1131         /* remove I2C demod(s) */
1132         dvb_module_release(dvb->i2c_client_demod[1]);
1133         dvb->i2c_client_demod[1] = NULL;
1134         dvb_module_release(dvb->i2c_client_demod[0]);
1135         dvb->i2c_client_demod[0] = NULL;
1136         kfree(dvb);
1137         dev->dvb = NULL;
1138         goto ret;
1139 }
1140
1141 static int dvb_fini(struct cx231xx *dev)
1142 {
1143         if (!dev->board.has_dvb) {
1144                 /* This device does not support the extension */
1145                 return 0;
1146         }
1147
1148         if (dev->dvb) {
1149                 unregister_dvb(dev->dvb);
1150                 kfree(dev->dvb);
1151                 dev->dvb = NULL;
1152         }
1153
1154         return 0;
1155 }
1156
1157 static struct cx231xx_ops dvb_ops = {
1158         .id = CX231XX_DVB,
1159         .name = "Cx231xx dvb Extension",
1160         .init = dvb_init,
1161         .fini = dvb_fini,
1162 };
1163
1164 static int __init cx231xx_dvb_register(void)
1165 {
1166         return cx231xx_register_extension(&dvb_ops);
1167 }
1168
1169 static void __exit cx231xx_dvb_unregister(void)
1170 {
1171         cx231xx_unregister_extension(&dvb_ops);
1172 }
1173
1174 module_init(cx231xx_dvb_register);
1175 module_exit(cx231xx_dvb_unregister);