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