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