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