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