Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux...
[cascardo/linux.git] / drivers / media / pci / cx88 / cx88-dvb.c
1 /*
2  *
3  * device driver for Conexant 2388x based TV cards
4  * MPEG Transport Stream (DVB) routines
5  *
6  * (c) 2004, 2005 Chris Pascoe <c.pascoe@itee.uq.edu.au>
7  * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22  */
23
24 #include <linux/module.h>
25 #include <linux/init.h>
26 #include <linux/device.h>
27 #include <linux/fs.h>
28 #include <linux/kthread.h>
29 #include <linux/file.h>
30 #include <linux/suspend.h>
31
32 #include "cx88.h"
33 #include "dvb-pll.h"
34 #include <media/v4l2-common.h>
35
36 #include "mt352.h"
37 #include "mt352_priv.h"
38 #include "cx88-vp3054-i2c.h"
39 #include "zl10353.h"
40 #include "cx22702.h"
41 #include "or51132.h"
42 #include "lgdt330x.h"
43 #include "s5h1409.h"
44 #include "xc4000.h"
45 #include "xc5000.h"
46 #include "nxt200x.h"
47 #include "cx24123.h"
48 #include "isl6421.h"
49 #include "tuner-simple.h"
50 #include "tda9887.h"
51 #include "s5h1411.h"
52 #include "stv0299.h"
53 #include "z0194a.h"
54 #include "stv0288.h"
55 #include "stb6000.h"
56 #include "cx24116.h"
57 #include "stv0900.h"
58 #include "stb6100.h"
59 #include "stb6100_proc.h"
60 #include "mb86a16.h"
61 #include "ts2020.h"
62 #include "ds3000.h"
63
64 MODULE_DESCRIPTION("driver for cx2388x based DVB cards");
65 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
66 MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
67 MODULE_LICENSE("GPL");
68 MODULE_VERSION(CX88_VERSION);
69
70 static unsigned int debug;
71 module_param(debug, int, 0644);
72 MODULE_PARM_DESC(debug,"enable debug messages [dvb]");
73
74 static unsigned int dvb_buf_tscnt = 32;
75 module_param(dvb_buf_tscnt, int, 0644);
76 MODULE_PARM_DESC(dvb_buf_tscnt, "DVB Buffer TS count [dvb]");
77
78 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
79
80 #define dprintk(level,fmt, arg...)      if (debug >= level) \
81         printk(KERN_DEBUG "%s/2-dvb: " fmt, core->name, ## arg)
82
83 /* ------------------------------------------------------------------ */
84
85 static int dvb_buf_setup(struct videobuf_queue *q,
86                          unsigned int *count, unsigned int *size)
87 {
88         struct cx8802_dev *dev = q->priv_data;
89
90         dev->ts_packet_size  = 188 * 4;
91         dev->ts_packet_count = dvb_buf_tscnt;
92
93         *size  = dev->ts_packet_size * dev->ts_packet_count;
94         *count = dvb_buf_tscnt;
95         return 0;
96 }
97
98 static int dvb_buf_prepare(struct videobuf_queue *q,
99                            struct videobuf_buffer *vb, enum v4l2_field field)
100 {
101         struct cx8802_dev *dev = q->priv_data;
102         return cx8802_buf_prepare(q, dev, (struct cx88_buffer*)vb,field);
103 }
104
105 static void dvb_buf_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
106 {
107         struct cx8802_dev *dev = q->priv_data;
108         cx8802_buf_queue(dev, (struct cx88_buffer*)vb);
109 }
110
111 static void dvb_buf_release(struct videobuf_queue *q,
112                             struct videobuf_buffer *vb)
113 {
114         cx88_free_buffer(q, (struct cx88_buffer*)vb);
115 }
116
117 static const struct videobuf_queue_ops dvb_qops = {
118         .buf_setup    = dvb_buf_setup,
119         .buf_prepare  = dvb_buf_prepare,
120         .buf_queue    = dvb_buf_queue,
121         .buf_release  = dvb_buf_release,
122 };
123
124 /* ------------------------------------------------------------------ */
125
126 static int cx88_dvb_bus_ctrl(struct dvb_frontend* fe, int acquire)
127 {
128         struct cx8802_dev *dev= fe->dvb->priv;
129         struct cx8802_driver *drv = NULL;
130         int ret = 0;
131         int fe_id;
132
133         fe_id = videobuf_dvb_find_frontend(&dev->frontends, fe);
134         if (!fe_id) {
135                 printk(KERN_ERR "%s() No frontend found\n", __func__);
136                 return -EINVAL;
137         }
138
139         mutex_lock(&dev->core->lock);
140         drv = cx8802_get_driver(dev, CX88_MPEG_DVB);
141         if (drv) {
142                 if (acquire){
143                         dev->frontends.active_fe_id = fe_id;
144                         ret = drv->request_acquire(drv);
145                 } else {
146                         ret = drv->request_release(drv);
147                         dev->frontends.active_fe_id = 0;
148                 }
149         }
150         mutex_unlock(&dev->core->lock);
151
152         return ret;
153 }
154
155 static void cx88_dvb_gate_ctrl(struct cx88_core  *core, int open)
156 {
157         struct videobuf_dvb_frontends *f;
158         struct videobuf_dvb_frontend *fe;
159
160         if (!core->dvbdev)
161                 return;
162
163         f = &core->dvbdev->frontends;
164
165         if (!f)
166                 return;
167
168         if (f->gate <= 1) /* undefined or fe0 */
169                 fe = videobuf_dvb_get_frontend(f, 1);
170         else
171                 fe = videobuf_dvb_get_frontend(f, f->gate);
172
173         if (fe && fe->dvb.frontend && fe->dvb.frontend->ops.i2c_gate_ctrl)
174                 fe->dvb.frontend->ops.i2c_gate_ctrl(fe->dvb.frontend, open);
175 }
176
177 /* ------------------------------------------------------------------ */
178
179 static int dvico_fusionhdtv_demod_init(struct dvb_frontend* fe)
180 {
181         static const u8 clock_config []  = { CLOCK_CTL,  0x38, 0x39 };
182         static const u8 reset []         = { RESET,      0x80 };
183         static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
184         static const u8 agc_cfg []       = { AGC_TARGET, 0x24, 0x20 };
185         static const u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
186         static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
187
188         mt352_write(fe, clock_config,   sizeof(clock_config));
189         udelay(200);
190         mt352_write(fe, reset,          sizeof(reset));
191         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
192
193         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
194         mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
195         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
196         return 0;
197 }
198
199 static int dvico_dual_demod_init(struct dvb_frontend *fe)
200 {
201         static const u8 clock_config []  = { CLOCK_CTL,  0x38, 0x38 };
202         static const u8 reset []         = { RESET,      0x80 };
203         static const u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
204         static const u8 agc_cfg []       = { AGC_TARGET, 0x28, 0x20 };
205         static const u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
206         static const u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
207
208         mt352_write(fe, clock_config,   sizeof(clock_config));
209         udelay(200);
210         mt352_write(fe, reset,          sizeof(reset));
211         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
212
213         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
214         mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
215         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
216
217         return 0;
218 }
219
220 static int dntv_live_dvbt_demod_init(struct dvb_frontend* fe)
221 {
222         static const u8 clock_config []  = { 0x89, 0x38, 0x39 };
223         static const u8 reset []         = { 0x50, 0x80 };
224         static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
225         static const u8 agc_cfg []       = { 0x67, 0x10, 0x23, 0x00, 0xFF, 0xFF,
226                                        0x00, 0xFF, 0x00, 0x40, 0x40 };
227         static const u8 dntv_extra[]     = { 0xB5, 0x7A };
228         static const u8 capt_range_cfg[] = { 0x75, 0x32 };
229
230         mt352_write(fe, clock_config,   sizeof(clock_config));
231         udelay(2000);
232         mt352_write(fe, reset,          sizeof(reset));
233         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
234
235         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
236         udelay(2000);
237         mt352_write(fe, dntv_extra,     sizeof(dntv_extra));
238         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
239
240         return 0;
241 }
242
243 static const struct mt352_config dvico_fusionhdtv = {
244         .demod_address = 0x0f,
245         .demod_init    = dvico_fusionhdtv_demod_init,
246 };
247
248 static const struct mt352_config dntv_live_dvbt_config = {
249         .demod_address = 0x0f,
250         .demod_init    = dntv_live_dvbt_demod_init,
251 };
252
253 static const struct mt352_config dvico_fusionhdtv_dual = {
254         .demod_address = 0x0f,
255         .demod_init    = dvico_dual_demod_init,
256 };
257
258 static const struct zl10353_config cx88_terratec_cinergy_ht_pci_mkii_config = {
259         .demod_address = (0x1e >> 1),
260         .no_tuner      = 1,
261         .if2           = 45600,
262 };
263
264 static struct mb86a16_config twinhan_vp1027 = {
265         .demod_address  = 0x08,
266 };
267
268 #if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054)
269 static int dntv_live_dvbt_pro_demod_init(struct dvb_frontend* fe)
270 {
271         static const u8 clock_config []  = { 0x89, 0x38, 0x38 };
272         static const u8 reset []         = { 0x50, 0x80 };
273         static const u8 adc_ctl_1_cfg [] = { 0x8E, 0x40 };
274         static const u8 agc_cfg []       = { 0x67, 0x10, 0x20, 0x00, 0xFF, 0xFF,
275                                        0x00, 0xFF, 0x00, 0x40, 0x40 };
276         static const u8 dntv_extra[]     = { 0xB5, 0x7A };
277         static const u8 capt_range_cfg[] = { 0x75, 0x32 };
278
279         mt352_write(fe, clock_config,   sizeof(clock_config));
280         udelay(2000);
281         mt352_write(fe, reset,          sizeof(reset));
282         mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
283
284         mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
285         udelay(2000);
286         mt352_write(fe, dntv_extra,     sizeof(dntv_extra));
287         mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
288
289         return 0;
290 }
291
292 static const struct mt352_config dntv_live_dvbt_pro_config = {
293         .demod_address = 0x0f,
294         .no_tuner      = 1,
295         .demod_init    = dntv_live_dvbt_pro_demod_init,
296 };
297 #endif
298
299 static const struct zl10353_config dvico_fusionhdtv_hybrid = {
300         .demod_address = 0x0f,
301         .no_tuner      = 1,
302 };
303
304 static const struct zl10353_config dvico_fusionhdtv_xc3028 = {
305         .demod_address = 0x0f,
306         .if2           = 45600,
307         .no_tuner      = 1,
308 };
309
310 static const struct mt352_config dvico_fusionhdtv_mt352_xc3028 = {
311         .demod_address = 0x0f,
312         .if2 = 4560,
313         .no_tuner = 1,
314         .demod_init = dvico_fusionhdtv_demod_init,
315 };
316
317 static const struct zl10353_config dvico_fusionhdtv_plus_v1_1 = {
318         .demod_address = 0x0f,
319 };
320
321 static const struct cx22702_config connexant_refboard_config = {
322         .demod_address = 0x43,
323         .output_mode   = CX22702_SERIAL_OUTPUT,
324 };
325
326 static const struct cx22702_config hauppauge_hvr_config = {
327         .demod_address = 0x63,
328         .output_mode   = CX22702_SERIAL_OUTPUT,
329 };
330
331 static int or51132_set_ts_param(struct dvb_frontend* fe, int is_punctured)
332 {
333         struct cx8802_dev *dev= fe->dvb->priv;
334         dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
335         return 0;
336 }
337
338 static const struct or51132_config pchdtv_hd3000 = {
339         .demod_address = 0x15,
340         .set_ts_params = or51132_set_ts_param,
341 };
342
343 static int lgdt330x_pll_rf_set(struct dvb_frontend* fe, int index)
344 {
345         struct cx8802_dev *dev= fe->dvb->priv;
346         struct cx88_core *core = dev->core;
347
348         dprintk(1, "%s: index = %d\n", __func__, index);
349         if (index == 0)
350                 cx_clear(MO_GP0_IO, 8);
351         else
352                 cx_set(MO_GP0_IO, 8);
353         return 0;
354 }
355
356 static int lgdt330x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
357 {
358         struct cx8802_dev *dev= fe->dvb->priv;
359         if (is_punctured)
360                 dev->ts_gen_cntrl |= 0x04;
361         else
362                 dev->ts_gen_cntrl &= ~0x04;
363         return 0;
364 }
365
366 static struct lgdt330x_config fusionhdtv_3_gold = {
367         .demod_address = 0x0e,
368         .demod_chip    = LGDT3302,
369         .serial_mpeg   = 0x04, /* TPSERIAL for 3302 in TOP_CONTROL */
370         .set_ts_params = lgdt330x_set_ts_param,
371 };
372
373 static const struct lgdt330x_config fusionhdtv_5_gold = {
374         .demod_address = 0x0e,
375         .demod_chip    = LGDT3303,
376         .serial_mpeg   = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
377         .set_ts_params = lgdt330x_set_ts_param,
378 };
379
380 static const struct lgdt330x_config pchdtv_hd5500 = {
381         .demod_address = 0x59,
382         .demod_chip    = LGDT3303,
383         .serial_mpeg   = 0x40, /* TPSERIAL for 3303 in TOP_CONTROL */
384         .set_ts_params = lgdt330x_set_ts_param,
385 };
386
387 static int nxt200x_set_ts_param(struct dvb_frontend* fe, int is_punctured)
388 {
389         struct cx8802_dev *dev= fe->dvb->priv;
390         dev->ts_gen_cntrl = is_punctured ? 0x04 : 0x00;
391         return 0;
392 }
393
394 static const struct nxt200x_config ati_hdtvwonder = {
395         .demod_address = 0x0a,
396         .set_ts_params = nxt200x_set_ts_param,
397 };
398
399 static int cx24123_set_ts_param(struct dvb_frontend* fe,
400         int is_punctured)
401 {
402         struct cx8802_dev *dev= fe->dvb->priv;
403         dev->ts_gen_cntrl = 0x02;
404         return 0;
405 }
406
407 static int kworld_dvbs_100_set_voltage(struct dvb_frontend* fe,
408                                        fe_sec_voltage_t voltage)
409 {
410         struct cx8802_dev *dev= fe->dvb->priv;
411         struct cx88_core *core = dev->core;
412
413         if (voltage == SEC_VOLTAGE_OFF)
414                 cx_write(MO_GP0_IO, 0x000006fb);
415         else
416                 cx_write(MO_GP0_IO, 0x000006f9);
417
418         if (core->prev_set_voltage)
419                 return core->prev_set_voltage(fe, voltage);
420         return 0;
421 }
422
423 static int geniatech_dvbs_set_voltage(struct dvb_frontend *fe,
424                                       fe_sec_voltage_t voltage)
425 {
426         struct cx8802_dev *dev= fe->dvb->priv;
427         struct cx88_core *core = dev->core;
428
429         if (voltage == SEC_VOLTAGE_OFF) {
430                 dprintk(1,"LNB Voltage OFF\n");
431                 cx_write(MO_GP0_IO, 0x0000efff);
432         }
433
434         if (core->prev_set_voltage)
435                 return core->prev_set_voltage(fe, voltage);
436         return 0;
437 }
438
439 static int tevii_dvbs_set_voltage(struct dvb_frontend *fe,
440                                       fe_sec_voltage_t voltage)
441 {
442         struct cx8802_dev *dev= fe->dvb->priv;
443         struct cx88_core *core = dev->core;
444
445         cx_set(MO_GP0_IO, 0x6040);
446         switch (voltage) {
447         case SEC_VOLTAGE_13:
448                 cx_clear(MO_GP0_IO, 0x20);
449                 break;
450         case SEC_VOLTAGE_18:
451                 cx_set(MO_GP0_IO, 0x20);
452                 break;
453         case SEC_VOLTAGE_OFF:
454                 cx_clear(MO_GP0_IO, 0x20);
455                 break;
456         }
457
458         if (core->prev_set_voltage)
459                 return core->prev_set_voltage(fe, voltage);
460         return 0;
461 }
462
463 static int vp1027_set_voltage(struct dvb_frontend *fe,
464                                     fe_sec_voltage_t voltage)
465 {
466         struct cx8802_dev *dev = fe->dvb->priv;
467         struct cx88_core *core = dev->core;
468
469         switch (voltage) {
470         case SEC_VOLTAGE_13:
471                 dprintk(1, "LNB SEC Voltage=13\n");
472                 cx_write(MO_GP0_IO, 0x00001220);
473                 break;
474         case SEC_VOLTAGE_18:
475                 dprintk(1, "LNB SEC Voltage=18\n");
476                 cx_write(MO_GP0_IO, 0x00001222);
477                 break;
478         case SEC_VOLTAGE_OFF:
479                 dprintk(1, "LNB Voltage OFF\n");
480                 cx_write(MO_GP0_IO, 0x00001230);
481                 break;
482         }
483
484         if (core->prev_set_voltage)
485                 return core->prev_set_voltage(fe, voltage);
486         return 0;
487 }
488
489 static const struct cx24123_config geniatech_dvbs_config = {
490         .demod_address = 0x55,
491         .set_ts_params = cx24123_set_ts_param,
492 };
493
494 static const struct cx24123_config hauppauge_novas_config = {
495         .demod_address = 0x55,
496         .set_ts_params = cx24123_set_ts_param,
497 };
498
499 static const struct cx24123_config kworld_dvbs_100_config = {
500         .demod_address = 0x15,
501         .set_ts_params = cx24123_set_ts_param,
502         .lnb_polarity  = 1,
503 };
504
505 static const struct s5h1409_config pinnacle_pctv_hd_800i_config = {
506         .demod_address = 0x32 >> 1,
507         .output_mode   = S5H1409_PARALLEL_OUTPUT,
508         .gpio          = S5H1409_GPIO_ON,
509         .qam_if        = 44000,
510         .inversion     = S5H1409_INVERSION_OFF,
511         .status_mode   = S5H1409_DEMODLOCKING,
512         .mpeg_timing   = S5H1409_MPEGTIMING_NONCONTINOUS_NONINVERTING_CLOCK,
513 };
514
515 static const struct s5h1409_config dvico_hdtv5_pci_nano_config = {
516         .demod_address = 0x32 >> 1,
517         .output_mode   = S5H1409_SERIAL_OUTPUT,
518         .gpio          = S5H1409_GPIO_OFF,
519         .inversion     = S5H1409_INVERSION_OFF,
520         .status_mode   = S5H1409_DEMODLOCKING,
521         .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
522 };
523
524 static const struct s5h1409_config kworld_atsc_120_config = {
525         .demod_address = 0x32 >> 1,
526         .output_mode   = S5H1409_SERIAL_OUTPUT,
527         .gpio          = S5H1409_GPIO_OFF,
528         .inversion     = S5H1409_INVERSION_OFF,
529         .status_mode   = S5H1409_DEMODLOCKING,
530         .mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
531 };
532
533 static const struct xc5000_config pinnacle_pctv_hd_800i_tuner_config = {
534         .i2c_address    = 0x64,
535         .if_khz         = 5380,
536 };
537
538 static const struct zl10353_config cx88_pinnacle_hybrid_pctv = {
539         .demod_address = (0x1e >> 1),
540         .no_tuner      = 1,
541         .if2           = 45600,
542 };
543
544 static const struct zl10353_config cx88_geniatech_x8000_mt = {
545         .demod_address = (0x1e >> 1),
546         .no_tuner = 1,
547         .disable_i2c_gate_ctrl = 1,
548 };
549
550 static const struct s5h1411_config dvico_fusionhdtv7_config = {
551         .output_mode   = S5H1411_SERIAL_OUTPUT,
552         .gpio          = S5H1411_GPIO_ON,
553         .mpeg_timing   = S5H1411_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK,
554         .qam_if        = S5H1411_IF_44000,
555         .vsb_if        = S5H1411_IF_44000,
556         .inversion     = S5H1411_INVERSION_OFF,
557         .status_mode   = S5H1411_DEMODLOCKING
558 };
559
560 static const struct xc5000_config dvico_fusionhdtv7_tuner_config = {
561         .i2c_address    = 0xc2 >> 1,
562         .if_khz         = 5380,
563 };
564
565 static int attach_xc3028(u8 addr, struct cx8802_dev *dev)
566 {
567         struct dvb_frontend *fe;
568         struct videobuf_dvb_frontend *fe0 = NULL;
569         struct xc2028_ctrl ctl;
570         struct xc2028_config cfg = {
571                 .i2c_adap  = &dev->core->i2c_adap,
572                 .i2c_addr  = addr,
573                 .ctrl      = &ctl,
574         };
575
576         /* Get the first frontend */
577         fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
578         if (!fe0)
579                 return -EINVAL;
580
581         if (!fe0->dvb.frontend) {
582                 printk(KERN_ERR "%s/2: dvb frontend not attached. "
583                                 "Can't attach xc3028\n",
584                        dev->core->name);
585                 return -EINVAL;
586         }
587
588         /*
589          * Some xc3028 devices may be hidden by an I2C gate. This is known
590          * to happen with some s5h1409-based devices.
591          * Now that I2C gate is open, sets up xc3028 configuration
592          */
593         cx88_setup_xc3028(dev->core, &ctl);
594
595         fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
596         if (!fe) {
597                 printk(KERN_ERR "%s/2: xc3028 attach failed\n",
598                        dev->core->name);
599                 dvb_frontend_detach(fe0->dvb.frontend);
600                 dvb_unregister_frontend(fe0->dvb.frontend);
601                 fe0->dvb.frontend = NULL;
602                 return -EINVAL;
603         }
604
605         printk(KERN_INFO "%s/2: xc3028 attached\n",
606                dev->core->name);
607
608         return 0;
609 }
610
611 static int attach_xc4000(struct cx8802_dev *dev, struct xc4000_config *cfg)
612 {
613         struct dvb_frontend *fe;
614         struct videobuf_dvb_frontend *fe0 = NULL;
615
616         /* Get the first frontend */
617         fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
618         if (!fe0)
619                 return -EINVAL;
620
621         if (!fe0->dvb.frontend) {
622                 printk(KERN_ERR "%s/2: dvb frontend not attached. "
623                                 "Can't attach xc4000\n",
624                        dev->core->name);
625                 return -EINVAL;
626         }
627
628         fe = dvb_attach(xc4000_attach, fe0->dvb.frontend, &dev->core->i2c_adap,
629                         cfg);
630         if (!fe) {
631                 printk(KERN_ERR "%s/2: xc4000 attach failed\n",
632                        dev->core->name);
633                 dvb_frontend_detach(fe0->dvb.frontend);
634                 dvb_unregister_frontend(fe0->dvb.frontend);
635                 fe0->dvb.frontend = NULL;
636                 return -EINVAL;
637         }
638
639         printk(KERN_INFO "%s/2: xc4000 attached\n", dev->core->name);
640
641         return 0;
642 }
643
644 static int cx24116_set_ts_param(struct dvb_frontend *fe,
645         int is_punctured)
646 {
647         struct cx8802_dev *dev = fe->dvb->priv;
648         dev->ts_gen_cntrl = 0x2;
649
650         return 0;
651 }
652
653 static int stv0900_set_ts_param(struct dvb_frontend *fe,
654         int is_punctured)
655 {
656         struct cx8802_dev *dev = fe->dvb->priv;
657         dev->ts_gen_cntrl = 0;
658
659         return 0;
660 }
661
662 static int cx24116_reset_device(struct dvb_frontend *fe)
663 {
664         struct cx8802_dev *dev = fe->dvb->priv;
665         struct cx88_core *core = dev->core;
666
667         /* Reset the part */
668         /* Put the cx24116 into reset */
669         cx_write(MO_SRST_IO, 0);
670         msleep(10);
671         /* Take the cx24116 out of reset */
672         cx_write(MO_SRST_IO, 1);
673         msleep(10);
674
675         return 0;
676 }
677
678 static const struct cx24116_config hauppauge_hvr4000_config = {
679         .demod_address          = 0x05,
680         .set_ts_params          = cx24116_set_ts_param,
681         .reset_device           = cx24116_reset_device,
682 };
683
684 static const struct cx24116_config tevii_s460_config = {
685         .demod_address = 0x55,
686         .set_ts_params = cx24116_set_ts_param,
687         .reset_device  = cx24116_reset_device,
688 };
689
690 static int ds3000_set_ts_param(struct dvb_frontend *fe,
691         int is_punctured)
692 {
693         struct cx8802_dev *dev = fe->dvb->priv;
694         dev->ts_gen_cntrl = 4;
695
696         return 0;
697 }
698
699 static struct ds3000_config tevii_ds3000_config = {
700         .demod_address = 0x68,
701         .set_ts_params = ds3000_set_ts_param,
702 };
703
704 static struct ts2020_config tevii_ts2020_config  = {
705         .tuner_address = 0x60,
706         .clk_out_div = 1,
707 };
708
709 static const struct stv0900_config prof_7301_stv0900_config = {
710         .demod_address = 0x6a,
711 /*      demod_mode = 0,*/
712         .xtal = 27000000,
713         .clkmode = 3,/* 0-CLKI, 2-XTALI, else AUTO */
714         .diseqc_mode = 2,/* 2/3 PWM */
715         .tun1_maddress = 0,/* 0x60 */
716         .tun1_adc = 0,/* 2 Vpp */
717         .path1_mode = 3,
718         .set_ts_params = stv0900_set_ts_param,
719 };
720
721 static const struct stb6100_config prof_7301_stb6100_config = {
722         .tuner_address = 0x60,
723         .refclock = 27000000,
724 };
725
726 static const struct stv0299_config tevii_tuner_sharp_config = {
727         .demod_address = 0x68,
728         .inittab = sharp_z0194a_inittab,
729         .mclk = 88000000UL,
730         .invert = 1,
731         .skip_reinit = 0,
732         .lock_output = 1,
733         .volt13_op0_op1 = STV0299_VOLT13_OP1,
734         .min_delay_ms = 100,
735         .set_symbol_rate = sharp_z0194a_set_symbol_rate,
736         .set_ts_params = cx24116_set_ts_param,
737 };
738
739 static const struct stv0288_config tevii_tuner_earda_config = {
740         .demod_address = 0x68,
741         .min_delay_ms = 100,
742         .set_ts_params = cx24116_set_ts_param,
743 };
744
745 static int cx8802_alloc_frontends(struct cx8802_dev *dev)
746 {
747         struct cx88_core *core = dev->core;
748         struct videobuf_dvb_frontend *fe = NULL;
749         int i;
750
751         mutex_init(&dev->frontends.lock);
752         INIT_LIST_HEAD(&dev->frontends.felist);
753
754         if (!core->board.num_frontends)
755                 return -ENODEV;
756
757         printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__,
758                          core->board.num_frontends);
759         for (i = 1; i <= core->board.num_frontends; i++) {
760                 fe = videobuf_dvb_alloc_frontend(&dev->frontends, i);
761                 if (!fe) {
762                         printk(KERN_ERR "%s() failed to alloc\n", __func__);
763                         videobuf_dvb_dealloc_frontends(&dev->frontends);
764                         return -ENOMEM;
765                 }
766         }
767         return 0;
768 }
769
770
771
772 static const u8 samsung_smt_7020_inittab[] = {
773              0x01, 0x15,
774              0x02, 0x00,
775              0x03, 0x00,
776              0x04, 0x7D,
777              0x05, 0x0F,
778              0x06, 0x02,
779              0x07, 0x00,
780              0x08, 0x60,
781
782              0x0A, 0xC2,
783              0x0B, 0x00,
784              0x0C, 0x01,
785              0x0D, 0x81,
786              0x0E, 0x44,
787              0x0F, 0x09,
788              0x10, 0x3C,
789              0x11, 0x84,
790              0x12, 0xDA,
791              0x13, 0x99,
792              0x14, 0x8D,
793              0x15, 0xCE,
794              0x16, 0xE8,
795              0x17, 0x43,
796              0x18, 0x1C,
797              0x19, 0x1B,
798              0x1A, 0x1D,
799
800              0x1C, 0x12,
801              0x1D, 0x00,
802              0x1E, 0x00,
803              0x1F, 0x00,
804              0x20, 0x00,
805              0x21, 0x00,
806              0x22, 0x00,
807              0x23, 0x00,
808
809              0x28, 0x02,
810              0x29, 0x28,
811              0x2A, 0x14,
812              0x2B, 0x0F,
813              0x2C, 0x09,
814              0x2D, 0x05,
815
816              0x31, 0x1F,
817              0x32, 0x19,
818              0x33, 0xFC,
819              0x34, 0x13,
820              0xff, 0xff,
821 };
822
823
824 static int samsung_smt_7020_tuner_set_params(struct dvb_frontend *fe)
825 {
826         struct dtv_frontend_properties *c = &fe->dtv_property_cache;
827         struct cx8802_dev *dev = fe->dvb->priv;
828         u8 buf[4];
829         u32 div;
830         struct i2c_msg msg = {
831                 .addr = 0x61,
832                 .flags = 0,
833                 .buf = buf,
834                 .len = sizeof(buf) };
835
836         div = c->frequency / 125;
837
838         buf[0] = (div >> 8) & 0x7f;
839         buf[1] = div & 0xff;
840         buf[2] = 0x84;  /* 0xC4 */
841         buf[3] = 0x00;
842
843         if (c->frequency < 1500000)
844                 buf[3] |= 0x10;
845
846         if (fe->ops.i2c_gate_ctrl)
847                 fe->ops.i2c_gate_ctrl(fe, 1);
848
849         if (i2c_transfer(&dev->core->i2c_adap, &msg, 1) != 1)
850                 return -EIO;
851
852         return 0;
853 }
854
855 static int samsung_smt_7020_set_tone(struct dvb_frontend *fe,
856         fe_sec_tone_mode_t tone)
857 {
858         struct cx8802_dev *dev = fe->dvb->priv;
859         struct cx88_core *core = dev->core;
860
861         cx_set(MO_GP0_IO, 0x0800);
862
863         switch (tone) {
864         case SEC_TONE_ON:
865                 cx_set(MO_GP0_IO, 0x08);
866                 break;
867         case SEC_TONE_OFF:
868                 cx_clear(MO_GP0_IO, 0x08);
869                 break;
870         default:
871                 return -EINVAL;
872         }
873
874         return 0;
875 }
876
877 static int samsung_smt_7020_set_voltage(struct dvb_frontend *fe,
878         fe_sec_voltage_t voltage)
879 {
880         struct cx8802_dev *dev = fe->dvb->priv;
881         struct cx88_core *core = dev->core;
882
883         u8 data;
884         struct i2c_msg msg = {
885                 .addr = 8,
886                 .flags = 0,
887                 .buf = &data,
888                 .len = sizeof(data) };
889
890         cx_set(MO_GP0_IO, 0x8000);
891
892         switch (voltage) {
893         case SEC_VOLTAGE_OFF:
894                 break;
895         case SEC_VOLTAGE_13:
896                 data = ISL6421_EN1 | ISL6421_LLC1;
897                 cx_clear(MO_GP0_IO, 0x80);
898                 break;
899         case SEC_VOLTAGE_18:
900                 data = ISL6421_EN1 | ISL6421_LLC1 | ISL6421_VSEL1;
901                 cx_clear(MO_GP0_IO, 0x80);
902                 break;
903         default:
904                 return -EINVAL;
905         }
906
907         return (i2c_transfer(&dev->core->i2c_adap, &msg, 1) == 1) ? 0 : -EIO;
908 }
909
910 static int samsung_smt_7020_stv0299_set_symbol_rate(struct dvb_frontend *fe,
911         u32 srate, u32 ratio)
912 {
913         u8 aclk = 0;
914         u8 bclk = 0;
915
916         if (srate < 1500000) {
917                 aclk = 0xb7;
918                 bclk = 0x47;
919         } else if (srate < 3000000) {
920                 aclk = 0xb7;
921                 bclk = 0x4b;
922         } else if (srate < 7000000) {
923                 aclk = 0xb7;
924                 bclk = 0x4f;
925         } else if (srate < 14000000) {
926                 aclk = 0xb7;
927                 bclk = 0x53;
928         } else if (srate < 30000000) {
929                 aclk = 0xb6;
930                 bclk = 0x53;
931         } else if (srate < 45000000) {
932                 aclk = 0xb4;
933                 bclk = 0x51;
934         }
935
936         stv0299_writereg(fe, 0x13, aclk);
937         stv0299_writereg(fe, 0x14, bclk);
938         stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
939         stv0299_writereg(fe, 0x20, (ratio >>  8) & 0xff);
940         stv0299_writereg(fe, 0x21, ratio & 0xf0);
941
942         return 0;
943 }
944
945
946 static const struct stv0299_config samsung_stv0299_config = {
947         .demod_address = 0x68,
948         .inittab = samsung_smt_7020_inittab,
949         .mclk = 88000000UL,
950         .invert = 0,
951         .skip_reinit = 0,
952         .lock_output = STV0299_LOCKOUTPUT_LK,
953         .volt13_op0_op1 = STV0299_VOLT13_OP1,
954         .min_delay_ms = 100,
955         .set_symbol_rate = samsung_smt_7020_stv0299_set_symbol_rate,
956 };
957
958 static int dvb_register(struct cx8802_dev *dev)
959 {
960         struct cx88_core *core = dev->core;
961         struct videobuf_dvb_frontend *fe0, *fe1 = NULL;
962         int mfe_shared = 0; /* bus not shared by default */
963         int res = -EINVAL;
964
965         if (0 != core->i2c_rc) {
966                 printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name);
967                 goto frontend_detach;
968         }
969
970         /* Get the first frontend */
971         fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
972         if (!fe0)
973                 goto frontend_detach;
974
975         /* multi-frontend gate control is undefined or defaults to fe0 */
976         dev->frontends.gate = 0;
977
978         /* Sets the gate control callback to be used by i2c command calls */
979         core->gate_ctrl = cx88_dvb_gate_ctrl;
980
981         /* init frontend(s) */
982         switch (core->boardnr) {
983         case CX88_BOARD_HAUPPAUGE_DVB_T1:
984                 fe0->dvb.frontend = dvb_attach(cx22702_attach,
985                                                &connexant_refboard_config,
986                                                &core->i2c_adap);
987                 if (fe0->dvb.frontend != NULL) {
988                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
989                                         0x61, &core->i2c_adap,
990                                         DVB_PLL_THOMSON_DTT759X))
991                                 goto frontend_detach;
992                 }
993                 break;
994         case CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1:
995         case CX88_BOARD_CONEXANT_DVB_T1:
996         case CX88_BOARD_KWORLD_DVB_T_CX22702:
997         case CX88_BOARD_WINFAST_DTV1000:
998                 fe0->dvb.frontend = dvb_attach(cx22702_attach,
999                                                &connexant_refboard_config,
1000                                                &core->i2c_adap);
1001                 if (fe0->dvb.frontend != NULL) {
1002                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1003                                         0x60, &core->i2c_adap,
1004                                         DVB_PLL_THOMSON_DTT7579))
1005                                 goto frontend_detach;
1006                 }
1007                 break;
1008         case CX88_BOARD_WINFAST_DTV2000H:
1009         case CX88_BOARD_HAUPPAUGE_HVR1100:
1010         case CX88_BOARD_HAUPPAUGE_HVR1100LP:
1011         case CX88_BOARD_HAUPPAUGE_HVR1300:
1012                 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1013                                                &hauppauge_hvr_config,
1014                                                &core->i2c_adap);
1015                 if (fe0->dvb.frontend != NULL) {
1016                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1017                                    &core->i2c_adap, 0x61,
1018                                    TUNER_PHILIPS_FMD1216ME_MK3))
1019                                 goto frontend_detach;
1020                 }
1021                 break;
1022         case CX88_BOARD_WINFAST_DTV2000H_J:
1023                 fe0->dvb.frontend = dvb_attach(cx22702_attach,
1024                                                &hauppauge_hvr_config,
1025                                                &core->i2c_adap);
1026                 if (fe0->dvb.frontend != NULL) {
1027                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1028                                    &core->i2c_adap, 0x61,
1029                                    TUNER_PHILIPS_FMD1216MEX_MK3))
1030                                 goto frontend_detach;
1031                 }
1032                 break;
1033         case CX88_BOARD_HAUPPAUGE_HVR3000:
1034                 /* MFE frontend 1 */
1035                 mfe_shared = 1;
1036                 dev->frontends.gate = 2;
1037                 /* DVB-S init */
1038                 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1039                                         &hauppauge_novas_config,
1040                                         &dev->core->i2c_adap);
1041                 if (fe0->dvb.frontend) {
1042                         if (!dvb_attach(isl6421_attach,
1043                                         fe0->dvb.frontend,
1044                                         &dev->core->i2c_adap,
1045                                         0x08, ISL6421_DCL, 0x00, false))
1046                                 goto frontend_detach;
1047                 }
1048                 /* MFE frontend 2 */
1049                 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1050                 if (!fe1)
1051                         goto frontend_detach;
1052                 /* DVB-T init */
1053                 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1054                                         &hauppauge_hvr_config,
1055                                         &dev->core->i2c_adap);
1056                 if (fe1->dvb.frontend) {
1057                         fe1->dvb.frontend->id = 1;
1058                         if (!dvb_attach(simple_tuner_attach,
1059                                         fe1->dvb.frontend,
1060                                         &dev->core->i2c_adap,
1061                                         0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1062                                 goto frontend_detach;
1063                 }
1064                 break;
1065         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
1066                 fe0->dvb.frontend = dvb_attach(mt352_attach,
1067                                                &dvico_fusionhdtv,
1068                                                &core->i2c_adap);
1069                 if (fe0->dvb.frontend != NULL) {
1070                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1071                                         0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1072                                 goto frontend_detach;
1073                         break;
1074                 }
1075                 /* ZL10353 replaces MT352 on later cards */
1076                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1077                                                &dvico_fusionhdtv_plus_v1_1,
1078                                                &core->i2c_adap);
1079                 if (fe0->dvb.frontend != NULL) {
1080                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1081                                         0x60, NULL, DVB_PLL_THOMSON_DTT7579))
1082                                 goto frontend_detach;
1083                 }
1084                 break;
1085         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
1086                 /* The tin box says DEE1601, but it seems to be DTT7579
1087                  * compatible, with a slightly different MT352 AGC gain. */
1088                 fe0->dvb.frontend = dvb_attach(mt352_attach,
1089                                                &dvico_fusionhdtv_dual,
1090                                                &core->i2c_adap);
1091                 if (fe0->dvb.frontend != NULL) {
1092                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1093                                         0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1094                                 goto frontend_detach;
1095                         break;
1096                 }
1097                 /* ZL10353 replaces MT352 on later cards */
1098                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1099                                                &dvico_fusionhdtv_plus_v1_1,
1100                                                &core->i2c_adap);
1101                 if (fe0->dvb.frontend != NULL) {
1102                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1103                                         0x61, NULL, DVB_PLL_THOMSON_DTT7579))
1104                                 goto frontend_detach;
1105                 }
1106                 break;
1107         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
1108                 fe0->dvb.frontend = dvb_attach(mt352_attach,
1109                                                &dvico_fusionhdtv,
1110                                                &core->i2c_adap);
1111                 if (fe0->dvb.frontend != NULL) {
1112                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1113                                         0x61, NULL, DVB_PLL_LG_Z201))
1114                                 goto frontend_detach;
1115                 }
1116                 break;
1117         case CX88_BOARD_KWORLD_DVB_T:
1118         case CX88_BOARD_DNTV_LIVE_DVB_T:
1119         case CX88_BOARD_ADSTECH_DVB_T_PCI:
1120                 fe0->dvb.frontend = dvb_attach(mt352_attach,
1121                                                &dntv_live_dvbt_config,
1122                                                &core->i2c_adap);
1123                 if (fe0->dvb.frontend != NULL) {
1124                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend,
1125                                         0x61, NULL, DVB_PLL_UNKNOWN_1))
1126                                 goto frontend_detach;
1127                 }
1128                 break;
1129         case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
1130 #if IS_ENABLED(CONFIG_VIDEO_CX88_VP3054)
1131                 /* MT352 is on a secondary I2C bus made from some GPIO lines */
1132                 fe0->dvb.frontend = dvb_attach(mt352_attach, &dntv_live_dvbt_pro_config,
1133                                                &dev->vp3054->adap);
1134                 if (fe0->dvb.frontend != NULL) {
1135                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1136                                         &core->i2c_adap, 0x61,
1137                                         TUNER_PHILIPS_FMD1216ME_MK3))
1138                                 goto frontend_detach;
1139                 }
1140 #else
1141                 printk(KERN_ERR "%s/2: built without vp3054 support\n",
1142                                 core->name);
1143 #endif
1144                 break;
1145         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
1146                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1147                                                &dvico_fusionhdtv_hybrid,
1148                                                &core->i2c_adap);
1149                 if (fe0->dvb.frontend != NULL) {
1150                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1151                                    &core->i2c_adap, 0x61,
1152                                    TUNER_THOMSON_FE6600))
1153                                 goto frontend_detach;
1154                 }
1155                 break;
1156         case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
1157                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1158                                                &dvico_fusionhdtv_xc3028,
1159                                                &core->i2c_adap);
1160                 if (fe0->dvb.frontend == NULL)
1161                         fe0->dvb.frontend = dvb_attach(mt352_attach,
1162                                                 &dvico_fusionhdtv_mt352_xc3028,
1163                                                 &core->i2c_adap);
1164                 /*
1165                  * On this board, the demod provides the I2C bus pullup.
1166                  * We must not permit gate_ctrl to be performed, or
1167                  * the xc3028 cannot communicate on the bus.
1168                  */
1169                 if (fe0->dvb.frontend)
1170                         fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1171                 if (attach_xc3028(0x61, dev) < 0)
1172                         goto frontend_detach;
1173                 break;
1174         case CX88_BOARD_PCHDTV_HD3000:
1175                 fe0->dvb.frontend = dvb_attach(or51132_attach, &pchdtv_hd3000,
1176                                                &core->i2c_adap);
1177                 if (fe0->dvb.frontend != NULL) {
1178                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1179                                         &core->i2c_adap, 0x61,
1180                                         TUNER_THOMSON_DTT761X))
1181                                 goto frontend_detach;
1182                 }
1183                 break;
1184         case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q:
1185                 dev->ts_gen_cntrl = 0x08;
1186
1187                 /* Do a hardware reset of chip before using it. */
1188                 cx_clear(MO_GP0_IO, 1);
1189                 mdelay(100);
1190                 cx_set(MO_GP0_IO, 1);
1191                 mdelay(200);
1192
1193                 /* Select RF connector callback */
1194                 fusionhdtv_3_gold.pll_rf_set = lgdt330x_pll_rf_set;
1195                 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1196                                                &fusionhdtv_3_gold,
1197                                                &core->i2c_adap);
1198                 if (fe0->dvb.frontend != NULL) {
1199                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1200                                         &core->i2c_adap, 0x61,
1201                                         TUNER_MICROTUNE_4042FI5))
1202                                 goto frontend_detach;
1203                 }
1204                 break;
1205         case CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T:
1206                 dev->ts_gen_cntrl = 0x08;
1207
1208                 /* Do a hardware reset of chip before using it. */
1209                 cx_clear(MO_GP0_IO, 1);
1210                 mdelay(100);
1211                 cx_set(MO_GP0_IO, 9);
1212                 mdelay(200);
1213                 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1214                                                &fusionhdtv_3_gold,
1215                                                &core->i2c_adap);
1216                 if (fe0->dvb.frontend != NULL) {
1217                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1218                                         &core->i2c_adap, 0x61,
1219                                         TUNER_THOMSON_DTT761X))
1220                                 goto frontend_detach;
1221                 }
1222                 break;
1223         case CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD:
1224                 dev->ts_gen_cntrl = 0x08;
1225
1226                 /* Do a hardware reset of chip before using it. */
1227                 cx_clear(MO_GP0_IO, 1);
1228                 mdelay(100);
1229                 cx_set(MO_GP0_IO, 1);
1230                 mdelay(200);
1231                 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1232                                                &fusionhdtv_5_gold,
1233                                                &core->i2c_adap);
1234                 if (fe0->dvb.frontend != NULL) {
1235                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1236                                         &core->i2c_adap, 0x61,
1237                                         TUNER_LG_TDVS_H06XF))
1238                                 goto frontend_detach;
1239                         if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1240                                    &core->i2c_adap, 0x43))
1241                                 goto frontend_detach;
1242                 }
1243                 break;
1244         case CX88_BOARD_PCHDTV_HD5500:
1245                 dev->ts_gen_cntrl = 0x08;
1246
1247                 /* Do a hardware reset of chip before using it. */
1248                 cx_clear(MO_GP0_IO, 1);
1249                 mdelay(100);
1250                 cx_set(MO_GP0_IO, 1);
1251                 mdelay(200);
1252                 fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
1253                                                &pchdtv_hd5500,
1254                                                &core->i2c_adap);
1255                 if (fe0->dvb.frontend != NULL) {
1256                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1257                                         &core->i2c_adap, 0x61,
1258                                         TUNER_LG_TDVS_H06XF))
1259                                 goto frontend_detach;
1260                         if (!dvb_attach(tda9887_attach, fe0->dvb.frontend,
1261                                    &core->i2c_adap, 0x43))
1262                                 goto frontend_detach;
1263                 }
1264                 break;
1265         case CX88_BOARD_ATI_HDTVWONDER:
1266                 fe0->dvb.frontend = dvb_attach(nxt200x_attach,
1267                                                &ati_hdtvwonder,
1268                                                &core->i2c_adap);
1269                 if (fe0->dvb.frontend != NULL) {
1270                         if (!dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1271                                         &core->i2c_adap, 0x61,
1272                                         TUNER_PHILIPS_TUV1236D))
1273                                 goto frontend_detach;
1274                 }
1275                 break;
1276         case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
1277         case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
1278                 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1279                                                &hauppauge_novas_config,
1280                                                &core->i2c_adap);
1281                 if (fe0->dvb.frontend) {
1282                         bool override_tone;
1283
1284                         if (core->model == 92001)
1285                                 override_tone = true;
1286                         else
1287                                 override_tone = false;
1288
1289                         if (!dvb_attach(isl6421_attach, fe0->dvb.frontend,
1290                                         &core->i2c_adap, 0x08, ISL6421_DCL, 0x00,
1291                                         override_tone))
1292                                 goto frontend_detach;
1293                 }
1294                 break;
1295         case CX88_BOARD_KWORLD_DVBS_100:
1296                 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1297                                                &kworld_dvbs_100_config,
1298                                                &core->i2c_adap);
1299                 if (fe0->dvb.frontend) {
1300                         core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1301                         fe0->dvb.frontend->ops.set_voltage = kworld_dvbs_100_set_voltage;
1302                 }
1303                 break;
1304         case CX88_BOARD_GENIATECH_DVBS:
1305                 fe0->dvb.frontend = dvb_attach(cx24123_attach,
1306                                                &geniatech_dvbs_config,
1307                                                &core->i2c_adap);
1308                 if (fe0->dvb.frontend) {
1309                         core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1310                         fe0->dvb.frontend->ops.set_voltage = geniatech_dvbs_set_voltage;
1311                 }
1312                 break;
1313         case CX88_BOARD_PINNACLE_PCTV_HD_800i:
1314                 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1315                                                &pinnacle_pctv_hd_800i_config,
1316                                                &core->i2c_adap);
1317                 if (fe0->dvb.frontend != NULL) {
1318                         if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1319                                         &core->i2c_adap,
1320                                         &pinnacle_pctv_hd_800i_tuner_config))
1321                                 goto frontend_detach;
1322                 }
1323                 break;
1324         case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
1325                 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1326                                                 &dvico_hdtv5_pci_nano_config,
1327                                                 &core->i2c_adap);
1328                 if (fe0->dvb.frontend != NULL) {
1329                         struct dvb_frontend *fe;
1330                         struct xc2028_config cfg = {
1331                                 .i2c_adap  = &core->i2c_adap,
1332                                 .i2c_addr  = 0x61,
1333                         };
1334                         static struct xc2028_ctrl ctl = {
1335                                 .fname       = XC2028_DEFAULT_FIRMWARE,
1336                                 .max_len     = 64,
1337                                 .scode_table = XC3028_FE_OREN538,
1338                         };
1339
1340                         fe = dvb_attach(xc2028_attach,
1341                                         fe0->dvb.frontend, &cfg);
1342                         if (fe != NULL && fe->ops.tuner_ops.set_config != NULL)
1343                                 fe->ops.tuner_ops.set_config(fe, &ctl);
1344                 }
1345                 break;
1346         case CX88_BOARD_PINNACLE_HYBRID_PCTV:
1347         case CX88_BOARD_WINFAST_DTV1800H:
1348                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1349                                                &cx88_pinnacle_hybrid_pctv,
1350                                                &core->i2c_adap);
1351                 if (fe0->dvb.frontend) {
1352                         fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1353                         if (attach_xc3028(0x61, dev) < 0)
1354                                 goto frontend_detach;
1355                 }
1356                 break;
1357         case CX88_BOARD_WINFAST_DTV1800H_XC4000:
1358         case CX88_BOARD_WINFAST_DTV2000H_PLUS:
1359                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1360                                                &cx88_pinnacle_hybrid_pctv,
1361                                                &core->i2c_adap);
1362                 if (fe0->dvb.frontend) {
1363                         struct xc4000_config cfg = {
1364                                 .i2c_address      = 0x61,
1365                                 .default_pm       = 0,
1366                                 .dvb_amplitude    = 134,
1367                                 .set_smoothedcvbs = 1,
1368                                 .if_khz           = 4560
1369                         };
1370                         fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1371                         if (attach_xc4000(dev, &cfg) < 0)
1372                                 goto frontend_detach;
1373                 }
1374                 break;
1375         case CX88_BOARD_GENIATECH_X8000_MT:
1376                 dev->ts_gen_cntrl = 0x00;
1377
1378                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1379                                                &cx88_geniatech_x8000_mt,
1380                                                &core->i2c_adap);
1381                 if (attach_xc3028(0x61, dev) < 0)
1382                         goto frontend_detach;
1383                 break;
1384          case CX88_BOARD_KWORLD_ATSC_120:
1385                 fe0->dvb.frontend = dvb_attach(s5h1409_attach,
1386                                                &kworld_atsc_120_config,
1387                                                &core->i2c_adap);
1388                 if (attach_xc3028(0x61, dev) < 0)
1389                         goto frontend_detach;
1390                 break;
1391         case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
1392                 fe0->dvb.frontend = dvb_attach(s5h1411_attach,
1393                                                &dvico_fusionhdtv7_config,
1394                                                &core->i2c_adap);
1395                 if (fe0->dvb.frontend != NULL) {
1396                         if (!dvb_attach(xc5000_attach, fe0->dvb.frontend,
1397                                         &core->i2c_adap,
1398                                         &dvico_fusionhdtv7_tuner_config))
1399                                 goto frontend_detach;
1400                 }
1401                 break;
1402         case CX88_BOARD_HAUPPAUGE_HVR4000:
1403                 /* MFE frontend 1 */
1404                 mfe_shared = 1;
1405                 dev->frontends.gate = 2;
1406                 /* DVB-S/S2 Init */
1407                 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1408                                         &hauppauge_hvr4000_config,
1409                                         &dev->core->i2c_adap);
1410                 if (fe0->dvb.frontend) {
1411                         if (!dvb_attach(isl6421_attach,
1412                                         fe0->dvb.frontend,
1413                                         &dev->core->i2c_adap,
1414                                         0x08, ISL6421_DCL, 0x00, false))
1415                                 goto frontend_detach;
1416                 }
1417                 /* MFE frontend 2 */
1418                 fe1 = videobuf_dvb_get_frontend(&dev->frontends, 2);
1419                 if (!fe1)
1420                         goto frontend_detach;
1421                 /* DVB-T Init */
1422                 fe1->dvb.frontend = dvb_attach(cx22702_attach,
1423                                         &hauppauge_hvr_config,
1424                                         &dev->core->i2c_adap);
1425                 if (fe1->dvb.frontend) {
1426                         fe1->dvb.frontend->id = 1;
1427                         if (!dvb_attach(simple_tuner_attach,
1428                                         fe1->dvb.frontend,
1429                                         &dev->core->i2c_adap,
1430                                         0x61, TUNER_PHILIPS_FMD1216ME_MK3))
1431                                 goto frontend_detach;
1432                 }
1433                 break;
1434         case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
1435                 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1436                                         &hauppauge_hvr4000_config,
1437                                         &dev->core->i2c_adap);
1438                 if (fe0->dvb.frontend) {
1439                         if (!dvb_attach(isl6421_attach,
1440                                         fe0->dvb.frontend,
1441                                         &dev->core->i2c_adap,
1442                                         0x08, ISL6421_DCL, 0x00, false))
1443                                 goto frontend_detach;
1444                 }
1445                 break;
1446         case CX88_BOARD_PROF_6200:
1447         case CX88_BOARD_TBS_8910:
1448         case CX88_BOARD_TEVII_S420:
1449                 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1450                                                 &tevii_tuner_sharp_config,
1451                                                 &core->i2c_adap);
1452                 if (fe0->dvb.frontend != NULL) {
1453                         if (!dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1454                                         &core->i2c_adap, DVB_PLL_OPERA1))
1455                                 goto frontend_detach;
1456                         core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1457                         fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1458
1459                 } else {
1460                         fe0->dvb.frontend = dvb_attach(stv0288_attach,
1461                                                             &tevii_tuner_earda_config,
1462                                                             &core->i2c_adap);
1463                                 if (fe0->dvb.frontend != NULL) {
1464                                         if (!dvb_attach(stb6000_attach, fe0->dvb.frontend, 0x61,
1465                                                 &core->i2c_adap))
1466                                         goto frontend_detach;
1467                                 core->prev_set_voltage = fe0->dvb.frontend->ops.set_voltage;
1468                                 fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1469                         }
1470                 }
1471                 break;
1472         case CX88_BOARD_TEVII_S460:
1473                 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1474                                                &tevii_s460_config,
1475                                                &core->i2c_adap);
1476                 if (fe0->dvb.frontend != NULL)
1477                         fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1478                 break;
1479         case CX88_BOARD_TEVII_S464:
1480                 fe0->dvb.frontend = dvb_attach(ds3000_attach,
1481                                                 &tevii_ds3000_config,
1482                                                 &core->i2c_adap);
1483                 if (fe0->dvb.frontend != NULL) {
1484                         dvb_attach(ts2020_attach, fe0->dvb.frontend,
1485                                 &tevii_ts2020_config, &core->i2c_adap);
1486                         fe0->dvb.frontend->ops.set_voltage =
1487                                                         tevii_dvbs_set_voltage;
1488                 }
1489                 break;
1490         case CX88_BOARD_OMICOM_SS4_PCI:
1491         case CX88_BOARD_TBS_8920:
1492         case CX88_BOARD_PROF_7300:
1493         case CX88_BOARD_SATTRADE_ST4200:
1494                 fe0->dvb.frontend = dvb_attach(cx24116_attach,
1495                                                &hauppauge_hvr4000_config,
1496                                                &core->i2c_adap);
1497                 if (fe0->dvb.frontend != NULL)
1498                         fe0->dvb.frontend->ops.set_voltage = tevii_dvbs_set_voltage;
1499                 break;
1500         case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
1501                 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1502                                                &cx88_terratec_cinergy_ht_pci_mkii_config,
1503                                                &core->i2c_adap);
1504                 if (fe0->dvb.frontend) {
1505                         fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
1506                         if (attach_xc3028(0x61, dev) < 0)
1507                                 goto frontend_detach;
1508                 }
1509                 break;
1510         case CX88_BOARD_PROF_7301:{
1511                 struct dvb_tuner_ops *tuner_ops = NULL;
1512
1513                 fe0->dvb.frontend = dvb_attach(stv0900_attach,
1514                                                 &prof_7301_stv0900_config,
1515                                                 &core->i2c_adap, 0);
1516                 if (fe0->dvb.frontend != NULL) {
1517                         if (!dvb_attach(stb6100_attach, fe0->dvb.frontend,
1518                                         &prof_7301_stb6100_config,
1519                                         &core->i2c_adap))
1520                                 goto frontend_detach;
1521
1522                         tuner_ops = &fe0->dvb.frontend->ops.tuner_ops;
1523                         tuner_ops->set_frequency = stb6100_set_freq;
1524                         tuner_ops->get_frequency = stb6100_get_freq;
1525                         tuner_ops->set_bandwidth = stb6100_set_bandw;
1526                         tuner_ops->get_bandwidth = stb6100_get_bandw;
1527
1528                         core->prev_set_voltage =
1529                                         fe0->dvb.frontend->ops.set_voltage;
1530                         fe0->dvb.frontend->ops.set_voltage =
1531                                         tevii_dvbs_set_voltage;
1532                 }
1533                 break;
1534                 }
1535         case CX88_BOARD_SAMSUNG_SMT_7020:
1536                 dev->ts_gen_cntrl = 0x08;
1537
1538                 cx_set(MO_GP0_IO, 0x0101);
1539
1540                 cx_clear(MO_GP0_IO, 0x01);
1541                 mdelay(100);
1542                 cx_set(MO_GP0_IO, 0x01);
1543                 mdelay(200);
1544
1545                 fe0->dvb.frontend = dvb_attach(stv0299_attach,
1546                                         &samsung_stv0299_config,
1547                                         &dev->core->i2c_adap);
1548                 if (fe0->dvb.frontend) {
1549                         fe0->dvb.frontend->ops.tuner_ops.set_params =
1550                                 samsung_smt_7020_tuner_set_params;
1551                         fe0->dvb.frontend->tuner_priv =
1552                                 &dev->core->i2c_adap;
1553                         fe0->dvb.frontend->ops.set_voltage =
1554                                 samsung_smt_7020_set_voltage;
1555                         fe0->dvb.frontend->ops.set_tone =
1556                                 samsung_smt_7020_set_tone;
1557                 }
1558
1559                 break;
1560         case CX88_BOARD_TWINHAN_VP1027_DVBS:
1561                 dev->ts_gen_cntrl = 0x00;
1562                 fe0->dvb.frontend = dvb_attach(mb86a16_attach,
1563                                                 &twinhan_vp1027,
1564                                                 &core->i2c_adap);
1565                 if (fe0->dvb.frontend) {
1566                         core->prev_set_voltage =
1567                                         fe0->dvb.frontend->ops.set_voltage;
1568                         fe0->dvb.frontend->ops.set_voltage =
1569                                         vp1027_set_voltage;
1570                 }
1571                 break;
1572
1573         default:
1574                 printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1575                        core->name);
1576                 break;
1577         }
1578
1579         if ( (NULL == fe0->dvb.frontend) || (fe1 && NULL == fe1->dvb.frontend) ) {
1580                 printk(KERN_ERR
1581                        "%s/2: frontend initialization failed\n",
1582                        core->name);
1583                 goto frontend_detach;
1584         }
1585         /* define general-purpose callback pointer */
1586         fe0->dvb.frontend->callback = cx88_tuner_callback;
1587
1588         /* Ensure all frontends negotiate bus access */
1589         fe0->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1590         if (fe1)
1591                 fe1->dvb.frontend->ops.ts_bus_ctrl = cx88_dvb_bus_ctrl;
1592
1593         /* Put the analog decoder in standby to keep it quiet */
1594         call_all(core, core, s_power, 0);
1595
1596         /* register everything */
1597         res = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1598                 &dev->pci->dev, adapter_nr, mfe_shared);
1599         if (res)
1600                 goto frontend_detach;
1601         return res;
1602
1603 frontend_detach:
1604         core->gate_ctrl = NULL;
1605         videobuf_dvb_dealloc_frontends(&dev->frontends);
1606         return res;
1607 }
1608
1609 /* ----------------------------------------------------------- */
1610
1611 /* CX8802 MPEG -> mini driver - We have been given the hardware */
1612 static int cx8802_dvb_advise_acquire(struct cx8802_driver *drv)
1613 {
1614         struct cx88_core *core = drv->core;
1615         int err = 0;
1616         dprintk( 1, "%s\n", __func__);
1617
1618         switch (core->boardnr) {
1619         case CX88_BOARD_HAUPPAUGE_HVR1300:
1620                 /* We arrive here with either the cx23416 or the cx22702
1621                  * on the bus. Take the bus from the cx23416 and enable the
1622                  * cx22702 demod
1623                  */
1624                 /* Toggle reset on cx22702 leaving i2c active */
1625                 cx_set(MO_GP0_IO, 0x00000080);
1626                 udelay(1000);
1627                 cx_clear(MO_GP0_IO, 0x00000080);
1628                 udelay(50);
1629                 cx_set(MO_GP0_IO, 0x00000080);
1630                 udelay(1000);
1631                 /* enable the cx22702 pins */
1632                 cx_clear(MO_GP0_IO, 0x00000004);
1633                 udelay(1000);
1634                 break;
1635
1636         case CX88_BOARD_HAUPPAUGE_HVR3000:
1637         case CX88_BOARD_HAUPPAUGE_HVR4000:
1638                 /* Toggle reset on cx22702 leaving i2c active */
1639                 cx_set(MO_GP0_IO, 0x00000080);
1640                 udelay(1000);
1641                 cx_clear(MO_GP0_IO, 0x00000080);
1642                 udelay(50);
1643                 cx_set(MO_GP0_IO, 0x00000080);
1644                 udelay(1000);
1645                 switch (core->dvbdev->frontends.active_fe_id) {
1646                 case 1: /* DVB-S/S2 Enabled */
1647                         /* tri-state the cx22702 pins */
1648                         cx_set(MO_GP0_IO, 0x00000004);
1649                         /* Take the cx24116/cx24123 out of reset */
1650                         cx_write(MO_SRST_IO, 1);
1651                         core->dvbdev->ts_gen_cntrl = 0x02; /* Parallel IO */
1652                         break;
1653                 case 2: /* DVB-T Enabled */
1654                         /* Put the cx24116/cx24123 into reset */
1655                         cx_write(MO_SRST_IO, 0);
1656                         /* enable the cx22702 pins */
1657                         cx_clear(MO_GP0_IO, 0x00000004);
1658                         core->dvbdev->ts_gen_cntrl = 0x0c; /* Serial IO */
1659                         break;
1660                 }
1661                 udelay(1000);
1662                 break;
1663
1664         case CX88_BOARD_WINFAST_DTV2000H_PLUS:
1665                 /* set RF input to AIR for DVB-T (GPIO 16) */
1666                 cx_write(MO_GP2_IO, 0x0101);
1667                 break;
1668
1669         default:
1670                 err = -ENODEV;
1671         }
1672         return err;
1673 }
1674
1675 /* CX8802 MPEG -> mini driver - We no longer have the hardware */
1676 static int cx8802_dvb_advise_release(struct cx8802_driver *drv)
1677 {
1678         struct cx88_core *core = drv->core;
1679         int err = 0;
1680         dprintk( 1, "%s\n", __func__);
1681
1682         switch (core->boardnr) {
1683         case CX88_BOARD_HAUPPAUGE_HVR1300:
1684                 /* Do Nothing, leave the cx22702 on the bus. */
1685                 break;
1686         case CX88_BOARD_HAUPPAUGE_HVR3000:
1687         case CX88_BOARD_HAUPPAUGE_HVR4000:
1688                 break;
1689         default:
1690                 err = -ENODEV;
1691         }
1692         return err;
1693 }
1694
1695 static int cx8802_dvb_probe(struct cx8802_driver *drv)
1696 {
1697         struct cx88_core *core = drv->core;
1698         struct cx8802_dev *dev = drv->core->dvbdev;
1699         int err;
1700         struct videobuf_dvb_frontend *fe;
1701         int i;
1702
1703         dprintk( 1, "%s\n", __func__);
1704         dprintk( 1, " ->being probed by Card=%d Name=%s, PCI %02x:%02x\n",
1705                 core->boardnr,
1706                 core->name,
1707                 core->pci_bus,
1708                 core->pci_slot);
1709
1710         err = -ENODEV;
1711         if (!(core->board.mpeg & CX88_MPEG_DVB))
1712                 goto fail_core;
1713
1714         /* If vp3054 isn't enabled, a stub will just return 0 */
1715         err = vp3054_i2c_probe(dev);
1716         if (0 != err)
1717                 goto fail_core;
1718
1719         /* dvb stuff */
1720         printk(KERN_INFO "%s/2: cx2388x based DVB/ATSC card\n", core->name);
1721         dev->ts_gen_cntrl = 0x0c;
1722
1723         err = cx8802_alloc_frontends(dev);
1724         if (err)
1725                 goto fail_core;
1726
1727         err = -ENODEV;
1728         for (i = 1; i <= core->board.num_frontends; i++) {
1729                 fe = videobuf_dvb_get_frontend(&core->dvbdev->frontends, i);
1730                 if (fe == NULL) {
1731                         printk(KERN_ERR "%s() failed to get frontend(%d)\n",
1732                                         __func__, i);
1733                         goto fail_probe;
1734                 }
1735                 videobuf_queue_sg_init(&fe->dvb.dvbq, &dvb_qops,
1736                                     &dev->pci->dev, &dev->slock,
1737                                     V4L2_BUF_TYPE_VIDEO_CAPTURE,
1738                                     V4L2_FIELD_TOP,
1739                                     sizeof(struct cx88_buffer),
1740                                     dev, NULL);
1741                 /* init struct videobuf_dvb */
1742                 fe->dvb.name = dev->core->name;
1743         }
1744
1745         err = dvb_register(dev);
1746         if (err)
1747                 /* frontends/adapter de-allocated in dvb_register */
1748                 printk(KERN_ERR "%s/2: dvb_register failed (err = %d)\n",
1749                        core->name, err);
1750         return err;
1751 fail_probe:
1752         videobuf_dvb_dealloc_frontends(&core->dvbdev->frontends);
1753 fail_core:
1754         return err;
1755 }
1756
1757 static int cx8802_dvb_remove(struct cx8802_driver *drv)
1758 {
1759         struct cx88_core *core = drv->core;
1760         struct cx8802_dev *dev = drv->core->dvbdev;
1761
1762         dprintk( 1, "%s\n", __func__);
1763
1764         videobuf_dvb_unregister_bus(&dev->frontends);
1765
1766         vp3054_i2c_remove(dev);
1767
1768         core->gate_ctrl = NULL;
1769
1770         return 0;
1771 }
1772
1773 static struct cx8802_driver cx8802_dvb_driver = {
1774         .type_id        = CX88_MPEG_DVB,
1775         .hw_access      = CX8802_DRVCTL_SHARED,
1776         .probe          = cx8802_dvb_probe,
1777         .remove         = cx8802_dvb_remove,
1778         .advise_acquire = cx8802_dvb_advise_acquire,
1779         .advise_release = cx8802_dvb_advise_release,
1780 };
1781
1782 static int __init dvb_init(void)
1783 {
1784         printk(KERN_INFO "cx88/2: cx2388x dvb driver version %s loaded\n",
1785                CX88_VERSION);
1786         return cx8802_register_driver(&cx8802_dvb_driver);
1787 }
1788
1789 static void __exit dvb_fini(void)
1790 {
1791         cx8802_unregister_driver(&cx8802_dvb_driver);
1792 }
1793
1794 module_init(dvb_init);
1795 module_exit(dvb_fini);