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