1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 DVB device driver for cx231xx
4
5 Copyright (C) 2008 <srinivasa.deevi at conexant dot com>
6		Based on em28xx driver
7
8 */
9
10#include "cx231xx.h"
11#include <linux/kernel.h>
12#include <linux/slab.h>
13
14#include <media/dvbdev.h>
15#include <media/dmxdev.h>
16#include <media/dvb_demux.h>
17#include <media/dvb_net.h>
18#include <media/dvb_frontend.h>
19#include <media/v4l2-common.h>
20#include <media/tuner.h>
21
22#include "xc5000.h"
23#include "s5h1432.h"
24#include "tda18271.h"
25#include "s5h1411.h"
26#include "lgdt3305.h"
27#include "si2165.h"
28#include "si2168.h"
29#include "mb86a20s.h"
30#include "si2157.h"
31#include "lgdt3306a.h"
32#include "r820t.h"
33#include "mn88473.h"
34
35MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
36MODULE_AUTHOR("Srinivasa Deevi <srinivasa.deevi@conexant.com>");
37MODULE_LICENSE("GPL");
38
39static unsigned int debug;
40module_param(debug, int, 0644);
41MODULE_PARM_DESC(debug, "enable debug messages [dvb]");
42
43DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
44
45#define CX231XX_DVB_NUM_BUFS 5
46#define CX231XX_DVB_MAX_PACKETSIZE 564
47#define CX231XX_DVB_MAX_PACKETS 64
48#define CX231XX_DVB_MAX_FRONTENDS 2
49
50struct cx231xx_dvb {
51	struct dvb_frontend *frontend[CX231XX_DVB_MAX_FRONTENDS];
52
53	/* feed count management */
54	struct mutex lock;
55	int nfeeds;
56
57	/* general boilerplate stuff */
58	struct dvb_adapter adapter;
59	struct dvb_demux demux;
60	struct dmxdev dmxdev;
61	struct dmx_frontend fe_hw;
62	struct dmx_frontend fe_mem;
63	struct dvb_net net;
64	struct i2c_client *i2c_client_demod[2];
65	struct i2c_client *i2c_client_tuner;
66};
67
68static struct s5h1432_config dvico_s5h1432_config = {
69	.output_mode   = S5H1432_SERIAL_OUTPUT,
70	.gpio          = S5H1432_GPIO_ON,
71	.qam_if        = S5H1432_IF_4000,
72	.vsb_if        = S5H1432_IF_4000,
73	.inversion     = S5H1432_INVERSION_OFF,
74	.status_mode   = S5H1432_DEMODLOCKING,
75	.mpeg_timing   = S5H1432_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
76};
77
78static struct tda18271_std_map cnxt_rde253s_tda18271_std_map = {
79	.dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
80		      .if_lvl = 1, .rfagc_top = 0x37, },
81	.dvbt_7   = { .if_freq = 4000, .agc_mode = 3, .std = 5,
82		      .if_lvl = 1, .rfagc_top = 0x37, },
83	.dvbt_8   = { .if_freq = 4000, .agc_mode = 3, .std = 6,
84		      .if_lvl = 1, .rfagc_top = 0x37, },
85};
86
87static struct tda18271_std_map mb86a20s_tda18271_config = {
88	.dvbt_6   = { .if_freq = 4000, .agc_mode = 3, .std = 4,
89		      .if_lvl = 0, .rfagc_top = 0x37, },
90};
91
92static struct tda18271_config cnxt_rde253s_tunerconfig = {
93	.std_map = &cnxt_rde253s_tda18271_std_map,
94	.gate    = TDA18271_GATE_ANALOG,
95};
96
97static struct s5h1411_config tda18271_s5h1411_config = {
98	.output_mode   = S5H1411_SERIAL_OUTPUT,
99	.gpio          = S5H1411_GPIO_OFF,
100	.vsb_if        = S5H1411_IF_3250,
101	.qam_if        = S5H1411_IF_4000,
102	.inversion     = S5H1411_INVERSION_ON,
103	.status_mode   = S5H1411_DEMODLOCKING,
104	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
105};
106static struct s5h1411_config xc5000_s5h1411_config = {
107	.output_mode   = S5H1411_SERIAL_OUTPUT,
108	.gpio          = S5H1411_GPIO_OFF,
109	.vsb_if        = S5H1411_IF_3250,
110	.qam_if        = S5H1411_IF_3250,
111	.inversion     = S5H1411_INVERSION_OFF,
112	.status_mode   = S5H1411_DEMODLOCKING,
113	.mpeg_timing   = S5H1411_MPEGTIMING_CONTINUOUS_NONINVERTING_CLOCK,
114};
115
116static struct lgdt3305_config hcw_lgdt3305_config = {
117	.i2c_addr           = 0x0e,
118	.mpeg_mode          = LGDT3305_MPEG_SERIAL,
119	.tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
120	.tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
121	.deny_i2c_rptr      = 1,
122	.spectral_inversion = 1,
123	.qam_if_khz         = 4000,
124	.vsb_if_khz         = 3250,
125};
126
127static struct tda18271_std_map hauppauge_tda18271_std_map = {
128	.atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 4,
129		      .if_lvl = 1, .rfagc_top = 0x58, },
130	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 5,
131		      .if_lvl = 1, .rfagc_top = 0x58, },
132};
133
134static struct tda18271_config hcw_tda18271_config = {
135	.std_map = &hauppauge_tda18271_std_map,
136	.gate    = TDA18271_GATE_DIGITAL,
137};
138
139static const struct mb86a20s_config pv_mb86a20s_config = {
140	.demod_address = 0x10,
141	.is_serial = true,
142};
143
144static struct tda18271_config pv_tda18271_config = {
145	.std_map = &mb86a20s_tda18271_config,
146	.gate    = TDA18271_GATE_DIGITAL,
147	.small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
148};
149
150static const struct lgdt3306a_config hauppauge_955q_lgdt3306a_config = {
151	.qam_if_khz         = 4000,
152	.vsb_if_khz         = 3250,
153	.spectral_inversion = 1,
154	.mpeg_mode          = LGDT3306A_MPEG_SERIAL,
155	.tpclk_edge         = LGDT3306A_TPCLK_RISING_EDGE,
156	.tpvalid_polarity   = LGDT3306A_TP_VALID_HIGH,
157	.xtalMHz            = 25,
158};
159
160static struct r820t_config astrometa_t2hybrid_r820t_config = {
161	.i2c_addr		= 0x3a, /* 0x74 >> 1 */
162	.xtal			= 16000000,
163	.rafael_chip		= CHIP_R828D,
164	.max_i2c_msg_len	= 2,
165};
166
167static inline void print_err_status(struct cx231xx *dev, int packet, int status)
168{
169	char *errmsg = "Unknown";
170
171	switch (status) {
172	case -ENOENT:
173		errmsg = "unlinked synchronously";
174		break;
175	case -ECONNRESET:
176		errmsg = "unlinked asynchronously";
177		break;
178	case -ENOSR:
179		errmsg = "Buffer error (overrun)";
180		break;
181	case -EPIPE:
182		errmsg = "Stalled (device not responding)";
183		break;
184	case -EOVERFLOW:
185		errmsg = "Babble (bad cable?)";
186		break;
187	case -EPROTO:
188		errmsg = "Bit-stuff error (bad cable?)";
189		break;
190	case -EILSEQ:
191		errmsg = "CRC/Timeout (could be anything)";
192		break;
193	case -ETIME:
194		errmsg = "Device does not respond";
195		break;
196	}
197	if (packet < 0) {
198		dev_dbg(dev->dev,
199			"URB status %d [%s].\n", status, errmsg);
200	} else {
201		dev_dbg(dev->dev,
202			"URB packet %d, status %d [%s].\n",
203			packet, status, errmsg);
204	}
205}
206
207static inline int dvb_isoc_copy(struct cx231xx *dev, struct urb *urb)
208{
209	int i;
210
211	if (!dev)
212		return 0;
213
214	if (dev->state & DEV_DISCONNECTED)
215		return 0;
216
217	if (urb->status < 0) {
218		print_err_status(dev, -1, urb->status);
219		if (urb->status == -ENOENT)
220			return 0;
221	}
222
223	for (i = 0; i < urb->number_of_packets; i++) {
224		int status = urb->iso_frame_desc[i].status;
225
226		if (status < 0) {
227			print_err_status(dev, i, status);
228			if (urb->iso_frame_desc[i].status != -EPROTO)
229				continue;
230		}
231
232		dvb_dmx_swfilter(&dev->dvb->demux,
233				 urb->transfer_buffer +
234				urb->iso_frame_desc[i].offset,
235				urb->iso_frame_desc[i].actual_length);
236	}
237
238	return 0;
239}
240
241static inline int dvb_bulk_copy(struct cx231xx *dev, struct urb *urb)
242{
243	if (!dev)
244		return 0;
245
246	if (dev->state & DEV_DISCONNECTED)
247		return 0;
248
249	if (urb->status < 0) {
250		print_err_status(dev, -1, urb->status);
251		if (urb->status == -ENOENT)
252			return 0;
253	}
254
255	/* Feed the transport payload into the kernel demux */
256	dvb_dmx_swfilter(&dev->dvb->demux,
257		urb->transfer_buffer, urb->actual_length);
258
259	return 0;
260}
261
262static int start_streaming(struct cx231xx_dvb *dvb)
263{
264	int rc;
265	struct cx231xx *dev = dvb->adapter.priv;
266
267	if (dev->USE_ISO) {
268		dev_dbg(dev->dev, "DVB transfer mode is ISO.\n");
269		cx231xx_set_alt_setting(dev, INDEX_TS1, 5);
270		rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
271		if (rc < 0)
272			return rc;
273		dev->mode_tv = 1;
274		return cx231xx_init_isoc(dev, CX231XX_DVB_MAX_PACKETS,
275					CX231XX_DVB_NUM_BUFS,
276					dev->ts1_mode.max_pkt_size,
277					dvb_isoc_copy);
278	} else {
279		dev_dbg(dev->dev, "DVB transfer mode is BULK.\n");
280		cx231xx_set_alt_setting(dev, INDEX_TS1, 0);
281		rc = cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
282		if (rc < 0)
283			return rc;
284		dev->mode_tv = 1;
285		return cx231xx_init_bulk(dev, CX231XX_DVB_MAX_PACKETS,
286					CX231XX_DVB_NUM_BUFS,
287					dev->ts1_mode.max_pkt_size,
288					dvb_bulk_copy);
289	}
290
291}
292
293static int stop_streaming(struct cx231xx_dvb *dvb)
294{
295	struct cx231xx *dev = dvb->adapter.priv;
296
297	if (dev->USE_ISO)
298		cx231xx_uninit_isoc(dev);
299	else
300		cx231xx_uninit_bulk(dev);
301
302	cx231xx_set_mode(dev, CX231XX_SUSPEND);
303
304	return 0;
305}
306
307static int start_feed(struct dvb_demux_feed *feed)
308{
309	struct dvb_demux *demux = feed->demux;
310	struct cx231xx_dvb *dvb = demux->priv;
311	int rc, ret;
312
313	if (!demux->dmx.frontend)
314		return -EINVAL;
315
316	mutex_lock(&dvb->lock);
317	dvb->nfeeds++;
318	rc = dvb->nfeeds;
319
320	if (dvb->nfeeds == 1) {
321		ret = start_streaming(dvb);
322		if (ret < 0)
323			rc = ret;
324	}
325
326	mutex_unlock(&dvb->lock);
327	return rc;
328}
329
330static int stop_feed(struct dvb_demux_feed *feed)
331{
332	struct dvb_demux *demux = feed->demux;
333	struct cx231xx_dvb *dvb = demux->priv;
334	int err = 0;
335
336	mutex_lock(&dvb->lock);
337	dvb->nfeeds--;
338
339	if (0 == dvb->nfeeds)
340		err = stop_streaming(dvb);
341
342	mutex_unlock(&dvb->lock);
343	return err;
344}
345
346/* ------------------------------------------------------------------ */
347static int cx231xx_dvb_bus_ctrl(struct dvb_frontend *fe, int acquire)
348{
349	struct cx231xx *dev = fe->dvb->priv;
350
351	if (acquire)
352		return cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
353	else
354		return cx231xx_set_mode(dev, CX231XX_SUSPEND);
355}
356
357/* ------------------------------------------------------------------ */
358
359static struct xc5000_config cnxt_rde250_tunerconfig = {
360	.i2c_address = 0x61,
361	.if_khz = 4000,
362};
363static struct xc5000_config cnxt_rdu250_tunerconfig = {
364	.i2c_address = 0x61,
365	.if_khz = 3250,
366};
367
368/* ------------------------------------------------------------------ */
369#if 0
370static int attach_xc5000(u8 addr, struct cx231xx *dev)
371{
372
373	struct dvb_frontend *fe;
374	struct xc5000_config cfg;
375
376	memset(&cfg, 0, sizeof(cfg));
377	cfg.i2c_adap = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
378	cfg.i2c_addr = addr;
379
380	if (!dev->dvb->frontend[0]) {
381		dev_err(dev->dev, "%s/2: dvb frontend not attached. Can't attach xc5000\n",
382			dev->name);
383		return -EINVAL;
384	}
385
386	fe = dvb_attach(xc5000_attach, dev->dvb->frontend[0], &cfg);
387	if (!fe) {
388		dev_err(dev->dev, "%s/2: xc5000 attach failed\n", dev->name);
389		dvb_frontend_detach(dev->dvb->frontend[0]);
390		dev->dvb->frontend[0] = NULL;
391		return -EINVAL;
392	}
393
394	dev_info(dev->dev, "%s/2: xc5000 attached\n", dev->name);
395
396	return 0;
397}
398#endif
399
400int cx231xx_set_analog_freq(struct cx231xx *dev, u32 freq)
401{
402	if (dev->dvb && dev->dvb->frontend[0]) {
403
404		struct dvb_tuner_ops *dops = &dev->dvb->frontend[0]->ops.tuner_ops;
405
406		if (dops->set_analog_params != NULL) {
407			struct analog_parameters params;
408
409			params.frequency = freq;
410			params.std = dev->norm;
411			params.mode = 0;	/* 0- Air; 1 - cable */
412			/*params.audmode = ;       */
413
414			/* Set the analog parameters to set the frequency */
415			dops->set_analog_params(dev->dvb->frontend[0], &params);
416		}
417
418	}
419
420	return 0;
421}
422
423int cx231xx_reset_analog_tuner(struct cx231xx *dev)
424{
425	int status = 0;
426
427	if (dev->dvb && dev->dvb->frontend[0]) {
428
429		struct dvb_tuner_ops *dops = &dev->dvb->frontend[0]->ops.tuner_ops;
430
431		if (dops->init != NULL && !dev->xc_fw_load_done) {
432
433			dev_dbg(dev->dev,
434				"Reloading firmware for XC5000\n");
435			status = dops->init(dev->dvb->frontend[0]);
436			if (status == 0) {
437				dev->xc_fw_load_done = 1;
438				dev_dbg(dev->dev,
439					"XC5000 firmware download completed\n");
440			} else {
441				dev->xc_fw_load_done = 0;
442				dev_dbg(dev->dev,
443					"XC5000 firmware download failed !!!\n");
444			}
445		}
446
447	}
448
449	return status;
450}
451
452/* ------------------------------------------------------------------ */
453
454static int register_dvb(struct cx231xx_dvb *dvb,
455			struct module *module,
456			struct cx231xx *dev, struct device *device)
457{
458	int result;
459
460	mutex_init(&dvb->lock);
461
462
463	/* register adapter */
464	result = dvb_register_adapter(&dvb->adapter, dev->name, module, device,
465				      adapter_nr);
466	if (result < 0) {
467		dev_warn(dev->dev,
468		       "%s: dvb_register_adapter failed (errno = %d)\n",
469		       dev->name, result);
470		goto fail_adapter;
471	}
472	dvb_register_media_controller(&dvb->adapter, dev->media_dev);
473
474	/* Ensure all frontends negotiate bus access */
475	dvb->frontend[0]->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
476	if (dvb->frontend[1])
477		dvb->frontend[1]->ops.ts_bus_ctrl = cx231xx_dvb_bus_ctrl;
478
479	dvb->adapter.priv = dev;
480
481	/* register frontend */
482	result = dvb_register_frontend(&dvb->adapter, dvb->frontend[0]);
483	if (result < 0) {
484		dev_warn(dev->dev,
485		       "%s: dvb_register_frontend failed (errno = %d)\n",
486		       dev->name, result);
487		goto fail_frontend0;
488	}
489
490	if (dvb->frontend[1]) {
491		result = dvb_register_frontend(&dvb->adapter, dvb->frontend[1]);
492		if (result < 0) {
493			dev_warn(dev->dev,
494				 "%s: 2nd dvb_register_frontend failed (errno = %d)\n",
495				dev->name, result);
496			goto fail_frontend1;
497		}
498
499		/* MFE lock */
500		dvb->adapter.mfe_shared = 1;
501	}
502
503	/* register demux stuff */
504	dvb->demux.dmx.capabilities =
505	    DMX_TS_FILTERING | DMX_SECTION_FILTERING |
506	    DMX_MEMORY_BASED_FILTERING;
507	dvb->demux.priv = dvb;
508	dvb->demux.filternum = 256;
509	dvb->demux.feednum = 256;
510	dvb->demux.start_feed = start_feed;
511	dvb->demux.stop_feed = stop_feed;
512
513	result = dvb_dmx_init(&dvb->demux);
514	if (result < 0) {
515		dev_warn(dev->dev,
516			 "%s: dvb_dmx_init failed (errno = %d)\n",
517		       dev->name, result);
518		goto fail_dmx;
519	}
520
521	dvb->dmxdev.filternum = 256;
522	dvb->dmxdev.demux = &dvb->demux.dmx;
523	dvb->dmxdev.capabilities = 0;
524	result = dvb_dmxdev_init(&dvb->dmxdev, &dvb->adapter);
525	if (result < 0) {
526		dev_warn(dev->dev,
527			 "%s: dvb_dmxdev_init failed (errno = %d)\n",
528			 dev->name, result);
529		goto fail_dmxdev;
530	}
531
532	dvb->fe_hw.source = DMX_FRONTEND_0;
533	result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_hw);
534	if (result < 0) {
535		dev_warn(dev->dev,
536		       "%s: add_frontend failed (DMX_FRONTEND_0, errno = %d)\n",
537		       dev->name, result);
538		goto fail_fe_hw;
539	}
540
541	dvb->fe_mem.source = DMX_MEMORY_FE;
542	result = dvb->demux.dmx.add_frontend(&dvb->demux.dmx, &dvb->fe_mem);
543	if (result < 0) {
544		dev_warn(dev->dev,
545			 "%s: add_frontend failed (DMX_MEMORY_FE, errno = %d)\n",
546			 dev->name, result);
547		goto fail_fe_mem;
548	}
549
550	result = dvb->demux.dmx.connect_frontend(&dvb->demux.dmx, &dvb->fe_hw);
551	if (result < 0) {
552		dev_warn(dev->dev,
553			 "%s: connect_frontend failed (errno = %d)\n",
554			 dev->name, result);
555		goto fail_fe_conn;
556	}
557
558	/* register network adapter */
559	dvb_net_init(&dvb->adapter, &dvb->net, &dvb->demux.dmx);
560	result = dvb_create_media_graph(&dvb->adapter,
561					dev->tuner_type == TUNER_ABSENT);
562	if (result < 0)
563		goto fail_create_graph;
564
565	return 0;
566
567fail_create_graph:
568	dvb_net_release(&dvb->net);
569fail_fe_conn:
570	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
571fail_fe_mem:
572	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
573fail_fe_hw:
574	dvb_dmxdev_release(&dvb->dmxdev);
575fail_dmxdev:
576	dvb_dmx_release(&dvb->demux);
577fail_dmx:
578	if (dvb->frontend[1])
579		dvb_unregister_frontend(dvb->frontend[1]);
580	dvb_unregister_frontend(dvb->frontend[0]);
581fail_frontend1:
582	if (dvb->frontend[1])
583		dvb_frontend_detach(dvb->frontend[1]);
584fail_frontend0:
585	dvb_frontend_detach(dvb->frontend[0]);
586	dvb_unregister_adapter(&dvb->adapter);
587fail_adapter:
588	return result;
589}
590
591static void unregister_dvb(struct cx231xx_dvb *dvb)
592{
593	dvb_net_release(&dvb->net);
594	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_mem);
595	dvb->demux.dmx.remove_frontend(&dvb->demux.dmx, &dvb->fe_hw);
596	dvb_dmxdev_release(&dvb->dmxdev);
597	dvb_dmx_release(&dvb->demux);
598	if (dvb->frontend[1])
599		dvb_unregister_frontend(dvb->frontend[1]);
600	dvb_unregister_frontend(dvb->frontend[0]);
601	if (dvb->frontend[1])
602		dvb_frontend_detach(dvb->frontend[1]);
603	dvb_frontend_detach(dvb->frontend[0]);
604	dvb_unregister_adapter(&dvb->adapter);
605
606	/* remove I2C tuner */
607	dvb_module_release(dvb->i2c_client_tuner);
608	dvb->i2c_client_tuner = NULL;
609	/* remove I2C demod(s) */
610	dvb_module_release(dvb->i2c_client_demod[1]);
611	dvb->i2c_client_demod[1] = NULL;
612	dvb_module_release(dvb->i2c_client_demod[0]);
613	dvb->i2c_client_demod[0] = NULL;
614}
615
616static int dvb_init(struct cx231xx *dev)
617{
618	int result;
619	struct cx231xx_dvb *dvb;
620	struct i2c_adapter *tuner_i2c;
621	struct i2c_adapter *demod_i2c;
622	struct i2c_client *client;
623	struct i2c_adapter *adapter;
624
625	if (!dev->board.has_dvb) {
626		/* This device does not support the extension */
627		return 0;
628	}
629
630	dvb = kzalloc(sizeof(struct cx231xx_dvb), GFP_KERNEL);
631
632	if (dvb == NULL) {
633		dev_info(dev->dev,
634			 "cx231xx_dvb: memory allocation failed\n");
635		return -ENOMEM;
636	}
637	dev->dvb = dvb;
638	dev->cx231xx_set_analog_freq = cx231xx_set_analog_freq;
639	dev->cx231xx_reset_analog_tuner = cx231xx_reset_analog_tuner;
640
641	tuner_i2c = cx231xx_get_i2c_adap(dev, dev->board.tuner_i2c_master);
642	demod_i2c = cx231xx_get_i2c_adap(dev, dev->board.demod_i2c_master);
643	mutex_lock(&dev->lock);
644	cx231xx_set_mode(dev, CX231XX_DIGITAL_MODE);
645	cx231xx_demod_reset(dev);
646	/* init frontend */
647	switch (dev->model) {
648	case CX231XX_BOARD_CNXT_CARRAERA:
649	case CX231XX_BOARD_CNXT_RDE_250:
650
651		dev->dvb->frontend[0] = dvb_attach(s5h1432_attach,
652					&dvico_s5h1432_config,
653					demod_i2c);
654
655		if (!dev->dvb->frontend[0]) {
656			dev_err(dev->dev,
657				"Failed to attach s5h1432 front end\n");
658			result = -EINVAL;
659			goto out_free;
660		}
661
662		/* define general-purpose callback pointer */
663		dvb->frontend[0]->callback = cx231xx_tuner_callback;
664
665		if (!dvb_attach(xc5000_attach, dev->dvb->frontend[0],
666			       tuner_i2c,
667			       &cnxt_rde250_tunerconfig)) {
668			result = -EINVAL;
669			goto out_free;
670		}
671
672		break;
673	case CX231XX_BOARD_CNXT_SHELBY:
674	case CX231XX_BOARD_CNXT_RDU_250:
675
676		dev->dvb->frontend[0] = dvb_attach(s5h1411_attach,
677					       &xc5000_s5h1411_config,
678					       demod_i2c);
679
680		if (!dev->dvb->frontend[0]) {
681			dev_err(dev->dev,
682				"Failed to attach s5h1411 front end\n");
683			result = -EINVAL;
684			goto out_free;
685		}
686
687		/* define general-purpose callback pointer */
688		dvb->frontend[0]->callback = cx231xx_tuner_callback;
689
690		if (!dvb_attach(xc5000_attach, dev->dvb->frontend[0],
691			       tuner_i2c,
692			       &cnxt_rdu250_tunerconfig)) {
693			result = -EINVAL;
694			goto out_free;
695		}
696		break;
697	case CX231XX_BOARD_CNXT_RDE_253S:
698
699		dev->dvb->frontend[0] = dvb_attach(s5h1432_attach,
700					&dvico_s5h1432_config,
701					demod_i2c);
702
703		if (!dev->dvb->frontend[0]) {
704			dev_err(dev->dev,
705				"Failed to attach s5h1432 front end\n");
706			result = -EINVAL;
707			goto out_free;
708		}
709
710		/* define general-purpose callback pointer */
711		dvb->frontend[0]->callback = cx231xx_tuner_callback;
712
713		if (!dvb_attach(tda18271_attach, dev->dvb->frontend[0],
714			       dev->board.tuner_addr, tuner_i2c,
715			       &cnxt_rde253s_tunerconfig)) {
716			result = -EINVAL;
717			goto out_free;
718		}
719		break;
720	case CX231XX_BOARD_CNXT_RDU_253S:
721	case CX231XX_BOARD_KWORLD_UB445_USB_HYBRID:
722
723		dev->dvb->frontend[0] = dvb_attach(s5h1411_attach,
724					       &tda18271_s5h1411_config,
725					       demod_i2c);
726
727		if (!dev->dvb->frontend[0]) {
728			dev_err(dev->dev,
729				"Failed to attach s5h1411 front end\n");
730			result = -EINVAL;
731			goto out_free;
732		}
733
734		/* define general-purpose callback pointer */
735		dvb->frontend[0]->callback = cx231xx_tuner_callback;
736
737		if (!dvb_attach(tda18271_attach, dev->dvb->frontend[0],
738			       dev->board.tuner_addr, tuner_i2c,
739			       &cnxt_rde253s_tunerconfig)) {
740			result = -EINVAL;
741			goto out_free;
742		}
743		break;
744	case CX231XX_BOARD_HAUPPAUGE_EXETER:
745
746		dev_info(dev->dev,
747			 "%s: looking for tuner / demod on i2c bus: %d\n",
748		       __func__, i2c_adapter_id(tuner_i2c));
749
750		dev->dvb->frontend[0] = dvb_attach(lgdt3305_attach,
751						&hcw_lgdt3305_config,
752						demod_i2c);
753
754		if (!dev->dvb->frontend[0]) {
755			dev_err(dev->dev,
756				"Failed to attach LG3305 front end\n");
757			result = -EINVAL;
758			goto out_free;
759		}
760
761		/* define general-purpose callback pointer */
762		dvb->frontend[0]->callback = cx231xx_tuner_callback;
763
764		dvb_attach(tda18271_attach, dev->dvb->frontend[0],
765			   dev->board.tuner_addr, tuner_i2c,
766			   &hcw_tda18271_config);
767		break;
768
769	case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
770	{
771		struct si2165_platform_data si2165_pdata = {};
772
773		/* attach demod */
774		si2165_pdata.fe = &dev->dvb->frontend[0];
775		si2165_pdata.chip_mode = SI2165_MODE_PLL_XTAL;
776		si2165_pdata.ref_freq_hz = 16000000;
777
778		/* perform probe/init/attach */
779		client = dvb_module_probe("si2165", NULL, demod_i2c,
780						dev->board.demod_addr,
781						&si2165_pdata);
782		if (!client) {
783			result = -ENODEV;
784			goto out_free;
785		}
786		dvb->i2c_client_demod[0] = client;
787
788		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
789
790		/* define general-purpose callback pointer */
791		dvb->frontend[0]->callback = cx231xx_tuner_callback;
792
793		dvb_attach(tda18271_attach, dev->dvb->frontend[0],
794			dev->board.tuner_addr, tuner_i2c,
795			&hcw_tda18271_config);
796
797		dev->cx231xx_reset_analog_tuner = NULL;
798		break;
799	}
800	case CX231XX_BOARD_HAUPPAUGE_930C_HD_1114xx:
801	{
802		struct si2165_platform_data si2165_pdata = {};
803		struct si2157_config si2157_config = {};
804
805		/* attach demod */
806		si2165_pdata.fe = &dev->dvb->frontend[0];
807		si2165_pdata.chip_mode = SI2165_MODE_PLL_EXT;
808		si2165_pdata.ref_freq_hz = 24000000;
809
810		/* perform probe/init/attach */
811		client = dvb_module_probe("si2165", NULL, demod_i2c,
812						dev->board.demod_addr,
813						&si2165_pdata);
814		if (!client) {
815			result = -ENODEV;
816			goto out_free;
817		}
818		dvb->i2c_client_demod[0] = client;
819
820		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
821
822		/* define general-purpose callback pointer */
823		dvb->frontend[0]->callback = cx231xx_tuner_callback;
824
825		/* attach tuner */
826		si2157_config.fe = dev->dvb->frontend[0];
827#ifdef CONFIG_MEDIA_CONTROLLER_DVB
828		si2157_config.mdev = dev->media_dev;
829#endif
830		si2157_config.if_port = 1;
831		si2157_config.inversion = true;
832
833		/* perform probe/init/attach */
834		client = dvb_module_probe("si2157", NULL, tuner_i2c,
835						dev->board.tuner_addr,
836						&si2157_config);
837		if (!client) {
838			result = -ENODEV;
839			goto out_free;
840		}
841		dev->cx231xx_reset_analog_tuner = NULL;
842
843		dev->dvb->i2c_client_tuner = client;
844		break;
845	}
846	case CX231XX_BOARD_HAUPPAUGE_955Q:
847	{
848		struct si2157_config si2157_config = {};
849		struct lgdt3306a_config lgdt3306a_config = {};
850
851		lgdt3306a_config = hauppauge_955q_lgdt3306a_config;
852		lgdt3306a_config.fe = &dev->dvb->frontend[0];
853		lgdt3306a_config.i2c_adapter = &adapter;
854
855		/* perform probe/init/attach */
856		client = dvb_module_probe("lgdt3306a", NULL, demod_i2c,
857						dev->board.demod_addr,
858						&lgdt3306a_config);
859		if (!client) {
860			result = -ENODEV;
861			goto out_free;
862		}
863		dvb->i2c_client_demod[0] = client;
864
865		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
866
867		/* define general-purpose callback pointer */
868		dvb->frontend[0]->callback = cx231xx_tuner_callback;
869
870		/* attach tuner */
871		si2157_config.fe = dev->dvb->frontend[0];
872#ifdef CONFIG_MEDIA_CONTROLLER_DVB
873		si2157_config.mdev = dev->media_dev;
874#endif
875		si2157_config.if_port = 1;
876		si2157_config.inversion = true;
877
878		/* perform probe/init/attach */
879		client = dvb_module_probe("si2157", NULL, tuner_i2c,
880						dev->board.tuner_addr,
881						&si2157_config);
882		if (!client) {
883			result = -ENODEV;
884			goto out_free;
885		}
886		dev->cx231xx_reset_analog_tuner = NULL;
887
888		dev->dvb->i2c_client_tuner = client;
889		break;
890	}
891	case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
892	case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
893
894		dev_info(dev->dev,
895			 "%s: looking for demod on i2c bus: %d\n",
896			 __func__, i2c_adapter_id(tuner_i2c));
897
898		dev->dvb->frontend[0] = dvb_attach(mb86a20s_attach,
899						&pv_mb86a20s_config,
900						demod_i2c);
901
902		if (!dev->dvb->frontend[0]) {
903			dev_err(dev->dev,
904				"Failed to attach mb86a20s demod\n");
905			result = -EINVAL;
906			goto out_free;
907		}
908
909		/* define general-purpose callback pointer */
910		dvb->frontend[0]->callback = cx231xx_tuner_callback;
911
912		dvb_attach(tda18271_attach, dev->dvb->frontend[0],
913			   dev->board.tuner_addr, tuner_i2c,
914			   &pv_tda18271_config);
915		break;
916
917	case CX231XX_BOARD_EVROMEDIA_FULL_HYBRID_FULLHD:
918	{
919		struct si2157_config si2157_config = {};
920		struct si2168_config si2168_config = {};
921
922		/* attach demodulator chip */
923		si2168_config.ts_mode = SI2168_TS_SERIAL; /* from *.inf file */
924		si2168_config.fe = &dev->dvb->frontend[0];
925		si2168_config.i2c_adapter = &adapter;
926		si2168_config.ts_clock_inv = true;
927
928		/* perform probe/init/attach */
929		client = dvb_module_probe("si2168", NULL, demod_i2c,
930						dev->board.demod_addr,
931						&si2168_config);
932		if (!client) {
933			result = -ENODEV;
934			goto out_free;
935		}
936		dvb->i2c_client_demod[0] = client;
937
938		/* attach tuner chip */
939		si2157_config.fe = dev->dvb->frontend[0];
940#ifdef CONFIG_MEDIA_CONTROLLER_DVB
941		si2157_config.mdev = dev->media_dev;
942#endif
943		si2157_config.if_port = 1;
944		si2157_config.inversion = false;
945
946		/* perform probe/init/attach */
947		client = dvb_module_probe("si2157", NULL, tuner_i2c,
948						dev->board.tuner_addr,
949						&si2157_config);
950		if (!client) {
951			result = -ENODEV;
952			goto out_free;
953		}
954		dev->cx231xx_reset_analog_tuner = NULL;
955		dev->dvb->i2c_client_tuner = client;
956		break;
957	}
958	case CX231XX_BOARD_ASTROMETA_T2HYBRID:
959	{
960		struct mn88473_config mn88473_config = {};
961
962		/* attach demodulator chip */
963		mn88473_config.i2c_wr_max = 16;
964		mn88473_config.xtal = 25000000;
965		mn88473_config.fe = &dev->dvb->frontend[0];
966
967		/* perform probe/init/attach */
968		client = dvb_module_probe("mn88473", NULL, demod_i2c,
969						dev->board.demod_addr,
970						&mn88473_config);
971		if (!client) {
972			result = -ENODEV;
973			goto out_free;
974		}
975		dvb->i2c_client_demod[0] = client;
976
977		/* define general-purpose callback pointer */
978		dvb->frontend[0]->callback = cx231xx_tuner_callback;
979
980		/* attach tuner chip */
981		dvb_attach(r820t_attach, dev->dvb->frontend[0],
982			   tuner_i2c,
983			   &astrometa_t2hybrid_r820t_config);
984		break;
985	}
986	case CX231XX_BOARD_HAUPPAUGE_935C:
987	{
988		struct si2157_config si2157_config = {};
989		struct si2168_config si2168_config = {};
990
991		/* attach demodulator chip */
992		si2168_config.ts_mode = SI2168_TS_SERIAL;
993		si2168_config.fe = &dev->dvb->frontend[0];
994		si2168_config.i2c_adapter = &adapter;
995		si2168_config.ts_clock_inv = true;
996
997		/* perform probe/init/attach */
998		client = dvb_module_probe("si2168", NULL, demod_i2c,
999						dev->board.demod_addr,
1000						&si2168_config);
1001		if (!client) {
1002			result = -ENODEV;
1003			goto out_free;
1004		}
1005		dvb->i2c_client_demod[0] = client;
1006		dev->dvb->frontend[0]->ops.i2c_gate_ctrl = NULL;
1007
1008		/* define general-purpose callback pointer */
1009		dvb->frontend[0]->callback = cx231xx_tuner_callback;
1010
1011		/* attach tuner */
1012		si2157_config.fe = dev->dvb->frontend[0];
1013#ifdef CONFIG_MEDIA_CONTROLLER_DVB
1014		si2157_config.mdev = dev->media_dev;
1015#endif
1016		si2157_config.if_port = 1;
1017		si2157_config.inversion = true;
1018
1019		/* perform probe/init/attach */
1020		client = dvb_module_probe("si2157", NULL, tuner_i2c,
1021						dev->board.tuner_addr,
1022						&si2157_config);
1023		if (!client) {
1024			result = -ENODEV;
1025			goto out_free;
1026		}
1027		dev->cx231xx_reset_analog_tuner = NULL;
1028		dev->dvb->i2c_client_tuner = client;
1029		break;
1030	}
1031	case CX231XX_BOARD_HAUPPAUGE_975:
1032	{
1033		struct i2c_adapter *adapter2;
1034		struct si2157_config si2157_config = {};
1035		struct lgdt3306a_config lgdt3306a_config = {};
1036		struct si2168_config si2168_config = {};
1037
1038		/* attach first demodulator chip */
1039		lgdt3306a_config = hauppauge_955q_lgdt3306a_config;
1040		lgdt3306a_config.fe = &dev->dvb->frontend[0];
1041		lgdt3306a_config.i2c_adapter = &adapter;
1042
1043		/* perform probe/init/attach */
1044		client = dvb_module_probe("lgdt3306a", NULL, demod_i2c,
1045						dev->board.demod_addr,
1046						&lgdt3306a_config);
1047		if (!client) {
1048			result = -ENODEV;
1049			goto out_free;
1050		}
1051		dvb->i2c_client_demod[0] = client;
1052
1053		/* attach second demodulator chip */
1054		si2168_config.ts_mode = SI2168_TS_SERIAL;
1055		si2168_config.fe = &dev->dvb->frontend[1];
1056		si2168_config.i2c_adapter = &adapter2;
1057		si2168_config.ts_clock_inv = true;
1058
1059		/* perform probe/init/attach */
1060		client = dvb_module_probe("si2168", NULL, adapter,
1061						dev->board.demod_addr2,
1062						&si2168_config);
1063		if (!client) {
1064			result = -ENODEV;
1065			goto out_free;
1066		}
1067		dvb->i2c_client_demod[1] = client;
1068		dvb->frontend[1]->id = 1;
1069
1070		/* define general-purpose callback pointer */
1071		dvb->frontend[0]->callback = cx231xx_tuner_callback;
1072		dvb->frontend[1]->callback = cx231xx_tuner_callback;
1073
1074		/* attach tuner */
1075		si2157_config.fe = dev->dvb->frontend[0];
1076#ifdef CONFIG_MEDIA_CONTROLLER_DVB
1077		si2157_config.mdev = dev->media_dev;
1078#endif
1079		si2157_config.if_port = 1;
1080		si2157_config.inversion = true;
1081
1082		/* perform probe/init/attach */
1083		client = dvb_module_probe("si2157", NULL, adapter,
1084						dev->board.tuner_addr,
1085						&si2157_config);
1086		if (!client) {
1087			result = -ENODEV;
1088			goto out_free;
1089		}
1090		dev->cx231xx_reset_analog_tuner = NULL;
1091		dvb->i2c_client_tuner = client;
1092
1093		dvb->frontend[1]->tuner_priv = dvb->frontend[0]->tuner_priv;
1094
1095		memcpy(&dvb->frontend[1]->ops.tuner_ops,
1096			&dvb->frontend[0]->ops.tuner_ops,
1097			sizeof(struct dvb_tuner_ops));
1098		break;
1099	}
1100	default:
1101		dev_err(dev->dev,
1102			"%s/2: The frontend of your DVB/ATSC card isn't supported yet\n",
1103			dev->name);
1104		break;
1105	}
1106	if (!dvb->frontend[0]) {
1107		dev_err(dev->dev,
1108		       "%s/2: frontend initialization failed\n", dev->name);
1109		result = -EINVAL;
1110		goto out_free;
1111	}
1112
1113	/* register everything */
1114	result = register_dvb(dvb, THIS_MODULE, dev, dev->dev);
1115
1116	if (result < 0)
1117		goto out_free;
1118
1119
1120	dev_info(dev->dev, "Successfully loaded cx231xx-dvb\n");
1121
1122ret:
1123	cx231xx_set_mode(dev, CX231XX_SUSPEND);
1124	mutex_unlock(&dev->lock);
1125	return result;
1126
1127out_free:
1128	/* remove I2C tuner */
1129	dvb_module_release(dvb->i2c_client_tuner);
1130	dvb->i2c_client_tuner = NULL;
1131	/* remove I2C demod(s) */
1132	dvb_module_release(dvb->i2c_client_demod[1]);
1133	dvb->i2c_client_demod[1] = NULL;
1134	dvb_module_release(dvb->i2c_client_demod[0]);
1135	dvb->i2c_client_demod[0] = NULL;
1136	kfree(dvb);
1137	dev->dvb = NULL;
1138	goto ret;
1139}
1140
1141static int dvb_fini(struct cx231xx *dev)
1142{
1143	if (!dev->board.has_dvb) {
1144		/* This device does not support the extension */
1145		return 0;
1146	}
1147
1148	if (dev->dvb) {
1149		unregister_dvb(dev->dvb);
1150		kfree(dev->dvb);
1151		dev->dvb = NULL;
1152	}
1153
1154	return 0;
1155}
1156
1157static struct cx231xx_ops dvb_ops = {
1158	.id = CX231XX_DVB,
1159	.name = "Cx231xx dvb Extension",
1160	.init = dvb_init,
1161	.fini = dvb_fini,
1162};
1163
1164static int __init cx231xx_dvb_register(void)
1165{
1166	return cx231xx_register_extension(&dvb_ops);
1167}
1168
1169static void __exit cx231xx_dvb_unregister(void)
1170{
1171	cx231xx_unregister_extension(&dvb_ops);
1172}
1173
1174module_init(cx231xx_dvb_register);
1175module_exit(cx231xx_dvb_unregister);
1176