xref: /openbmc/linux/drivers/media/usb/dvb-usb/cxusb.c (revision 2e554390)
1 /* DVB USB compliant linux driver for Conexant USB reference design.
2  *
3  * The Conexant reference design I saw on their website was only for analogue
4  * capturing (using the cx25842). The box I took to write this driver (reverse
5  * engineered) is the one labeled Medion MD95700. In addition to the cx25842
6  * for analogue capturing it also has a cx22702 DVB-T demodulator on the main
7  * board. Besides it has a atiremote (X10) and a USB2.0 hub onboard.
8  *
9  * Maybe it is a little bit premature to call this driver cxusb, but I assume
10  * the USB protocol is identical or at least inherited from the reference
11  * design, so it can be reused for the "analogue-only" device (if it will
12  * appear at all).
13  *
14  * TODO: Use the cx25840-driver for the analogue part
15  *
16  * Copyright (C) 2005 Patrick Boettcher (patrick.boettcher@posteo.de)
17  * Copyright (C) 2006 Michael Krufky (mkrufky@linuxtv.org)
18  * Copyright (C) 2006, 2007 Chris Pascoe (c.pascoe@itee.uq.edu.au)
19  *
20  *   This program is free software; you can redistribute it and/or modify it
21  *   under the terms of the GNU General Public License as published by the Free
22  *   Software Foundation, version 2.
23  *
24  * see Documentation/dvb/README.dvb-usb for more information
25  */
26 #include <media/tuner.h>
27 #include <linux/vmalloc.h>
28 #include <linux/slab.h>
29 #include <linux/kernel.h>
30 
31 #include "cxusb.h"
32 
33 #include "cx22702.h"
34 #include "lgdt330x.h"
35 #include "mt352.h"
36 #include "mt352_priv.h"
37 #include "zl10353.h"
38 #include "tuner-xc2028.h"
39 #include "tuner-simple.h"
40 #include "mxl5005s.h"
41 #include "max2165.h"
42 #include "dib7000p.h"
43 #include "dib0070.h"
44 #include "lgs8gxx.h"
45 #include "atbm8830.h"
46 #include "si2168.h"
47 #include "si2157.h"
48 
49 /* debug */
50 static int dvb_usb_cxusb_debug;
51 module_param_named(debug, dvb_usb_cxusb_debug, int, 0644);
52 MODULE_PARM_DESC(debug, "set debugging level (1=rc (or-able))." DVB_USB_DEBUG_STATUS);
53 
54 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
55 
56 #define deb_info(args...)   dprintk(dvb_usb_cxusb_debug, 0x03, args)
57 #define deb_i2c(args...)    dprintk(dvb_usb_cxusb_debug, 0x02, args)
58 
59 static int cxusb_ctrl_msg(struct dvb_usb_device *d,
60 			  u8 cmd, const u8 *wbuf, int wlen, u8 *rbuf, int rlen)
61 {
62 	struct cxusb_state *st = d->priv;
63 	int ret;
64 
65 	if (1 + wlen > MAX_XFER_SIZE) {
66 		warn("i2c wr: len=%d is too big!\n", wlen);
67 		return -EOPNOTSUPP;
68 	}
69 
70 	if (rlen > MAX_XFER_SIZE) {
71 		warn("i2c rd: len=%d is too big!\n", rlen);
72 		return -EOPNOTSUPP;
73 	}
74 
75 	mutex_lock(&d->data_mutex);
76 	st->data[0] = cmd;
77 	memcpy(&st->data[1], wbuf, wlen);
78 	ret = dvb_usb_generic_rw(d, st->data, 1 + wlen, st->data, rlen, 0);
79 	if (!ret && rbuf && rlen)
80 		memcpy(rbuf, st->data, rlen);
81 
82 	mutex_unlock(&d->data_mutex);
83 	return ret;
84 }
85 
86 /* GPIO */
87 static void cxusb_gpio_tuner(struct dvb_usb_device *d, int onoff)
88 {
89 	struct cxusb_state *st = d->priv;
90 	u8 o[2], i;
91 
92 	if (st->gpio_write_state[GPIO_TUNER] == onoff)
93 		return;
94 
95 	o[0] = GPIO_TUNER;
96 	o[1] = onoff;
97 	cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
98 
99 	if (i != 0x01)
100 		deb_info("gpio_write failed.\n");
101 
102 	st->gpio_write_state[GPIO_TUNER] = onoff;
103 }
104 
105 static int cxusb_bluebird_gpio_rw(struct dvb_usb_device *d, u8 changemask,
106 				 u8 newval)
107 {
108 	u8 o[2], gpio_state;
109 	int rc;
110 
111 	o[0] = 0xff & ~changemask;	/* mask of bits to keep */
112 	o[1] = newval & changemask;	/* new values for bits  */
113 
114 	rc = cxusb_ctrl_msg(d, CMD_BLUEBIRD_GPIO_RW, o, 2, &gpio_state, 1);
115 	if (rc < 0 || (gpio_state & changemask) != (newval & changemask))
116 		deb_info("bluebird_gpio_write failed.\n");
117 
118 	return rc < 0 ? rc : gpio_state;
119 }
120 
121 static void cxusb_bluebird_gpio_pulse(struct dvb_usb_device *d, u8 pin, int low)
122 {
123 	cxusb_bluebird_gpio_rw(d, pin, low ? 0 : pin);
124 	msleep(5);
125 	cxusb_bluebird_gpio_rw(d, pin, low ? pin : 0);
126 }
127 
128 static void cxusb_nano2_led(struct dvb_usb_device *d, int onoff)
129 {
130 	cxusb_bluebird_gpio_rw(d, 0x40, onoff ? 0 : 0x40);
131 }
132 
133 static int cxusb_d680_dmb_gpio_tuner(struct dvb_usb_device *d,
134 		u8 addr, int onoff)
135 {
136 	u8  o[2] = {addr, onoff};
137 	u8  i;
138 	int rc;
139 
140 	rc = cxusb_ctrl_msg(d, CMD_GPIO_WRITE, o, 2, &i, 1);
141 
142 	if (rc < 0)
143 		return rc;
144 	if (i == 0x01)
145 		return 0;
146 	else {
147 		deb_info("gpio_write failed.\n");
148 		return -EIO;
149 	}
150 }
151 
152 /* I2C */
153 static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
154 			  int num)
155 {
156 	struct dvb_usb_device *d = i2c_get_adapdata(adap);
157 	int ret;
158 	int i;
159 
160 	if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
161 		return -EAGAIN;
162 
163 	for (i = 0; i < num; i++) {
164 
165 		if (le16_to_cpu(d->udev->descriptor.idVendor) == USB_VID_MEDION)
166 			switch (msg[i].addr) {
167 			case 0x63:
168 				cxusb_gpio_tuner(d, 0);
169 				break;
170 			default:
171 				cxusb_gpio_tuner(d, 1);
172 				break;
173 			}
174 
175 		if (msg[i].flags & I2C_M_RD) {
176 			/* read only */
177 			u8 obuf[3], ibuf[MAX_XFER_SIZE];
178 
179 			if (1 + msg[i].len > sizeof(ibuf)) {
180 				warn("i2c rd: len=%d is too big!\n",
181 				     msg[i].len);
182 				ret = -EOPNOTSUPP;
183 				goto unlock;
184 			}
185 			obuf[0] = 0;
186 			obuf[1] = msg[i].len;
187 			obuf[2] = msg[i].addr;
188 			if (cxusb_ctrl_msg(d, CMD_I2C_READ,
189 					   obuf, 3,
190 					   ibuf, 1+msg[i].len) < 0) {
191 				warn("i2c read failed");
192 				break;
193 			}
194 			memcpy(msg[i].buf, &ibuf[1], msg[i].len);
195 		} else if (i+1 < num && (msg[i+1].flags & I2C_M_RD) &&
196 			   msg[i].addr == msg[i+1].addr) {
197 			/* write to then read from same address */
198 			u8 obuf[MAX_XFER_SIZE], ibuf[MAX_XFER_SIZE];
199 
200 			if (3 + msg[i].len > sizeof(obuf)) {
201 				warn("i2c wr: len=%d is too big!\n",
202 				     msg[i].len);
203 				ret = -EOPNOTSUPP;
204 				goto unlock;
205 			}
206 			if (1 + msg[i + 1].len > sizeof(ibuf)) {
207 				warn("i2c rd: len=%d is too big!\n",
208 				     msg[i + 1].len);
209 				ret = -EOPNOTSUPP;
210 				goto unlock;
211 			}
212 			obuf[0] = msg[i].len;
213 			obuf[1] = msg[i+1].len;
214 			obuf[2] = msg[i].addr;
215 			memcpy(&obuf[3], msg[i].buf, msg[i].len);
216 
217 			if (cxusb_ctrl_msg(d, CMD_I2C_READ,
218 					   obuf, 3+msg[i].len,
219 					   ibuf, 1+msg[i+1].len) < 0)
220 				break;
221 
222 			if (ibuf[0] != 0x08)
223 				deb_i2c("i2c read may have failed\n");
224 
225 			memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
226 
227 			i++;
228 		} else {
229 			/* write only */
230 			u8 obuf[MAX_XFER_SIZE], ibuf;
231 
232 			if (2 + msg[i].len > sizeof(obuf)) {
233 				warn("i2c wr: len=%d is too big!\n",
234 				     msg[i].len);
235 				ret = -EOPNOTSUPP;
236 				goto unlock;
237 			}
238 			obuf[0] = msg[i].addr;
239 			obuf[1] = msg[i].len;
240 			memcpy(&obuf[2], msg[i].buf, msg[i].len);
241 
242 			if (cxusb_ctrl_msg(d, CMD_I2C_WRITE, obuf,
243 					   2+msg[i].len, &ibuf,1) < 0)
244 				break;
245 			if (ibuf != 0x08)
246 				deb_i2c("i2c write may have failed\n");
247 		}
248 	}
249 
250 	if (i == num)
251 		ret = num;
252 	else
253 		ret = -EREMOTEIO;
254 
255 unlock:
256 	mutex_unlock(&d->i2c_mutex);
257 	return ret;
258 }
259 
260 static u32 cxusb_i2c_func(struct i2c_adapter *adapter)
261 {
262 	return I2C_FUNC_I2C;
263 }
264 
265 static struct i2c_algorithm cxusb_i2c_algo = {
266 	.master_xfer   = cxusb_i2c_xfer,
267 	.functionality = cxusb_i2c_func,
268 };
269 
270 static int cxusb_power_ctrl(struct dvb_usb_device *d, int onoff)
271 {
272 	u8 b = 0;
273 	if (onoff)
274 		return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
275 	else
276 		return cxusb_ctrl_msg(d, CMD_POWER_OFF, &b, 1, NULL, 0);
277 }
278 
279 static int cxusb_aver_power_ctrl(struct dvb_usb_device *d, int onoff)
280 {
281 	int ret;
282 	if (!onoff)
283 		return cxusb_ctrl_msg(d, CMD_POWER_OFF, NULL, 0, NULL, 0);
284 	if (d->state == DVB_USB_STATE_INIT &&
285 	    usb_set_interface(d->udev, 0, 0) < 0)
286 		err("set interface failed");
287 	do {} while (!(ret = cxusb_ctrl_msg(d, CMD_POWER_ON, NULL, 0, NULL, 0)) &&
288 		   !(ret = cxusb_ctrl_msg(d, 0x15, NULL, 0, NULL, 0)) &&
289 		   !(ret = cxusb_ctrl_msg(d, 0x17, NULL, 0, NULL, 0)) && 0);
290 	if (!ret) {
291 		/* FIXME: We don't know why, but we need to configure the
292 		 * lgdt3303 with the register settings below on resume */
293 		int i;
294 		u8 buf;
295 		static const u8 bufs[] = {
296 			0x0e, 0x2, 0x00, 0x7f,
297 			0x0e, 0x2, 0x02, 0xfe,
298 			0x0e, 0x2, 0x02, 0x01,
299 			0x0e, 0x2, 0x00, 0x03,
300 			0x0e, 0x2, 0x0d, 0x40,
301 			0x0e, 0x2, 0x0e, 0x87,
302 			0x0e, 0x2, 0x0f, 0x8e,
303 			0x0e, 0x2, 0x10, 0x01,
304 			0x0e, 0x2, 0x14, 0xd7,
305 			0x0e, 0x2, 0x47, 0x88,
306 		};
307 		msleep(20);
308 		for (i = 0; i < ARRAY_SIZE(bufs); i += 4 / sizeof(u8)) {
309 			ret = cxusb_ctrl_msg(d, CMD_I2C_WRITE,
310 					     bufs+i, 4, &buf, 1);
311 			if (ret)
312 				break;
313 			if (buf != 0x8)
314 				return -EREMOTEIO;
315 		}
316 	}
317 	return ret;
318 }
319 
320 static int cxusb_bluebird_power_ctrl(struct dvb_usb_device *d, int onoff)
321 {
322 	u8 b = 0;
323 	if (onoff)
324 		return cxusb_ctrl_msg(d, CMD_POWER_ON, &b, 1, NULL, 0);
325 	else
326 		return 0;
327 }
328 
329 static int cxusb_nano2_power_ctrl(struct dvb_usb_device *d, int onoff)
330 {
331 	int rc = 0;
332 
333 	rc = cxusb_power_ctrl(d, onoff);
334 	if (!onoff)
335 		cxusb_nano2_led(d, 0);
336 
337 	return rc;
338 }
339 
340 static int cxusb_d680_dmb_power_ctrl(struct dvb_usb_device *d, int onoff)
341 {
342 	int ret;
343 	u8  b;
344 	ret = cxusb_power_ctrl(d, onoff);
345 	if (!onoff)
346 		return ret;
347 
348 	msleep(128);
349 	cxusb_ctrl_msg(d, CMD_DIGITAL, NULL, 0, &b, 1);
350 	msleep(100);
351 	return ret;
352 }
353 
354 static int cxusb_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
355 {
356 	u8 buf[2] = { 0x03, 0x00 };
357 	if (onoff)
358 		cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON, buf, 2, NULL, 0);
359 	else
360 		cxusb_ctrl_msg(adap->dev, CMD_STREAMING_OFF, NULL, 0, NULL, 0);
361 
362 	return 0;
363 }
364 
365 static int cxusb_aver_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
366 {
367 	if (onoff)
368 		cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_ON, NULL, 0, NULL, 0);
369 	else
370 		cxusb_ctrl_msg(adap->dev, CMD_AVER_STREAM_OFF,
371 			       NULL, 0, NULL, 0);
372 	return 0;
373 }
374 
375 static int cxusb_read_status(struct dvb_frontend *fe,
376 				  enum fe_status *status)
377 {
378 	struct dvb_usb_adapter *adap = (struct dvb_usb_adapter *)fe->dvb->priv;
379 	struct cxusb_state *state = (struct cxusb_state *)adap->dev->priv;
380 	int ret;
381 
382 	ret = state->fe_read_status(fe, status);
383 
384 	/* it need resync slave fifo when signal change from unlock to lock.*/
385 	if ((*status & FE_HAS_LOCK) && (!state->last_lock)) {
386 		mutex_lock(&state->stream_mutex);
387 		cxusb_streaming_ctrl(adap, 1);
388 		mutex_unlock(&state->stream_mutex);
389 	}
390 
391 	state->last_lock = (*status & FE_HAS_LOCK) ? 1 : 0;
392 	return ret;
393 }
394 
395 static void cxusb_d680_dmb_drain_message(struct dvb_usb_device *d)
396 {
397 	int       ep = d->props.generic_bulk_ctrl_endpoint;
398 	const int timeout = 100;
399 	const int junk_len = 32;
400 	u8        *junk;
401 	int       rd_count;
402 
403 	/* Discard remaining data in video pipe */
404 	junk = kmalloc(junk_len, GFP_KERNEL);
405 	if (!junk)
406 		return;
407 	while (1) {
408 		if (usb_bulk_msg(d->udev,
409 			usb_rcvbulkpipe(d->udev, ep),
410 			junk, junk_len, &rd_count, timeout) < 0)
411 			break;
412 		if (!rd_count)
413 			break;
414 	}
415 	kfree(junk);
416 }
417 
418 static void cxusb_d680_dmb_drain_video(struct dvb_usb_device *d)
419 {
420 	struct usb_data_stream_properties *p = &d->props.adapter[0].fe[0].stream;
421 	const int timeout = 100;
422 	const int junk_len = p->u.bulk.buffersize;
423 	u8        *junk;
424 	int       rd_count;
425 
426 	/* Discard remaining data in video pipe */
427 	junk = kmalloc(junk_len, GFP_KERNEL);
428 	if (!junk)
429 		return;
430 	while (1) {
431 		if (usb_bulk_msg(d->udev,
432 			usb_rcvbulkpipe(d->udev, p->endpoint),
433 			junk, junk_len, &rd_count, timeout) < 0)
434 			break;
435 		if (!rd_count)
436 			break;
437 	}
438 	kfree(junk);
439 }
440 
441 static int cxusb_d680_dmb_streaming_ctrl(
442 		struct dvb_usb_adapter *adap, int onoff)
443 {
444 	if (onoff) {
445 		u8 buf[2] = { 0x03, 0x00 };
446 		cxusb_d680_dmb_drain_video(adap->dev);
447 		return cxusb_ctrl_msg(adap->dev, CMD_STREAMING_ON,
448 			buf, sizeof(buf), NULL, 0);
449 	} else {
450 		int ret = cxusb_ctrl_msg(adap->dev,
451 			CMD_STREAMING_OFF, NULL, 0, NULL, 0);
452 		return ret;
453 	}
454 }
455 
456 static int cxusb_rc_query(struct dvb_usb_device *d)
457 {
458 	u8 ircode[4];
459 
460 	cxusb_ctrl_msg(d, CMD_GET_IR_CODE, NULL, 0, ircode, 4);
461 
462 	if (ircode[2] || ircode[3])
463 		rc_keydown(d->rc_dev, RC_PROTO_NEC,
464 			   RC_SCANCODE_NEC(~ircode[2] & 0xff, ircode[3]), 0);
465 	return 0;
466 }
467 
468 static int cxusb_bluebird2_rc_query(struct dvb_usb_device *d)
469 {
470 	u8 ircode[4];
471 	struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
472 			       .buf = ircode, .len = 4 };
473 
474 	if (cxusb_i2c_xfer(&d->i2c_adap, &msg, 1) != 1)
475 		return 0;
476 
477 	if (ircode[1] || ircode[2])
478 		rc_keydown(d->rc_dev, RC_PROTO_NEC,
479 			   RC_SCANCODE_NEC(~ircode[1] & 0xff, ircode[2]), 0);
480 	return 0;
481 }
482 
483 static int cxusb_d680_dmb_rc_query(struct dvb_usb_device *d)
484 {
485 	u8 ircode[2];
486 
487 	if (cxusb_ctrl_msg(d, 0x10, NULL, 0, ircode, 2) < 0)
488 		return 0;
489 
490 	if (ircode[0] || ircode[1])
491 		rc_keydown(d->rc_dev, RC_PROTO_UNKNOWN,
492 			   RC_SCANCODE_RC5(ircode[0], ircode[1]), 0);
493 	return 0;
494 }
495 
496 static int cxusb_dee1601_demod_init(struct dvb_frontend* fe)
497 {
498 	static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x28 };
499 	static u8 reset []         = { RESET,      0x80 };
500 	static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
501 	static u8 agc_cfg []       = { AGC_TARGET, 0x28, 0x20 };
502 	static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
503 	static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
504 
505 	mt352_write(fe, clock_config,   sizeof(clock_config));
506 	udelay(200);
507 	mt352_write(fe, reset,          sizeof(reset));
508 	mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
509 
510 	mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
511 	mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
512 	mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
513 
514 	return 0;
515 }
516 
517 static int cxusb_mt352_demod_init(struct dvb_frontend* fe)
518 {	/* used in both lgz201 and th7579 */
519 	static u8 clock_config []  = { CLOCK_CTL,  0x38, 0x29 };
520 	static u8 reset []         = { RESET,      0x80 };
521 	static u8 adc_ctl_1_cfg [] = { ADC_CTL_1,  0x40 };
522 	static u8 agc_cfg []       = { AGC_TARGET, 0x24, 0x20 };
523 	static u8 gpp_ctl_cfg []   = { GPP_CTL,    0x33 };
524 	static u8 capt_range_cfg[] = { CAPT_RANGE, 0x32 };
525 
526 	mt352_write(fe, clock_config,   sizeof(clock_config));
527 	udelay(200);
528 	mt352_write(fe, reset,          sizeof(reset));
529 	mt352_write(fe, adc_ctl_1_cfg,  sizeof(adc_ctl_1_cfg));
530 
531 	mt352_write(fe, agc_cfg,        sizeof(agc_cfg));
532 	mt352_write(fe, gpp_ctl_cfg,    sizeof(gpp_ctl_cfg));
533 	mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
534 	return 0;
535 }
536 
537 static struct cx22702_config cxusb_cx22702_config = {
538 	.demod_address = 0x63,
539 	.output_mode = CX22702_PARALLEL_OUTPUT,
540 };
541 
542 static struct lgdt330x_config cxusb_lgdt3303_config = {
543 	.demod_address = 0x0e,
544 	.demod_chip    = LGDT3303,
545 };
546 
547 static struct lgdt330x_config cxusb_aver_lgdt3303_config = {
548 	.demod_address       = 0x0e,
549 	.demod_chip          = LGDT3303,
550 	.clock_polarity_flip = 2,
551 };
552 
553 static struct mt352_config cxusb_dee1601_config = {
554 	.demod_address = 0x0f,
555 	.demod_init    = cxusb_dee1601_demod_init,
556 };
557 
558 static struct zl10353_config cxusb_zl10353_dee1601_config = {
559 	.demod_address = 0x0f,
560 	.parallel_ts = 1,
561 };
562 
563 static struct mt352_config cxusb_mt352_config = {
564 	/* used in both lgz201 and th7579 */
565 	.demod_address = 0x0f,
566 	.demod_init    = cxusb_mt352_demod_init,
567 };
568 
569 static struct zl10353_config cxusb_zl10353_xc3028_config = {
570 	.demod_address = 0x0f,
571 	.if2 = 45600,
572 	.no_tuner = 1,
573 	.parallel_ts = 1,
574 };
575 
576 static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
577 	.demod_address = 0x0f,
578 	.if2 = 45600,
579 	.no_tuner = 1,
580 	.parallel_ts = 1,
581 	.disable_i2c_gate_ctrl = 1,
582 };
583 
584 static struct mt352_config cxusb_mt352_xc3028_config = {
585 	.demod_address = 0x0f,
586 	.if2 = 4560,
587 	.no_tuner = 1,
588 	.demod_init = cxusb_mt352_demod_init,
589 };
590 
591 /* FIXME: needs tweaking */
592 static struct mxl5005s_config aver_a868r_tuner = {
593 	.i2c_address     = 0x63,
594 	.if_freq         = 6000000UL,
595 	.xtal_freq       = CRYSTAL_FREQ_16000000HZ,
596 	.agc_mode        = MXL_SINGLE_AGC,
597 	.tracking_filter = MXL_TF_C,
598 	.rssi_enable     = MXL_RSSI_ENABLE,
599 	.cap_select      = MXL_CAP_SEL_ENABLE,
600 	.div_out         = MXL_DIV_OUT_4,
601 	.clock_out       = MXL_CLOCK_OUT_DISABLE,
602 	.output_load     = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
603 	.top		 = MXL5005S_TOP_25P2,
604 	.mod_mode        = MXL_DIGITAL_MODE,
605 	.if_mode         = MXL_ZERO_IF,
606 	.AgcMasterByte   = 0x00,
607 };
608 
609 /* FIXME: needs tweaking */
610 static struct mxl5005s_config d680_dmb_tuner = {
611 	.i2c_address     = 0x63,
612 	.if_freq         = 36125000UL,
613 	.xtal_freq       = CRYSTAL_FREQ_16000000HZ,
614 	.agc_mode        = MXL_SINGLE_AGC,
615 	.tracking_filter = MXL_TF_C,
616 	.rssi_enable     = MXL_RSSI_ENABLE,
617 	.cap_select      = MXL_CAP_SEL_ENABLE,
618 	.div_out         = MXL_DIV_OUT_4,
619 	.clock_out       = MXL_CLOCK_OUT_DISABLE,
620 	.output_load     = MXL5005S_IF_OUTPUT_LOAD_200_OHM,
621 	.top		 = MXL5005S_TOP_25P2,
622 	.mod_mode        = MXL_DIGITAL_MODE,
623 	.if_mode         = MXL_ZERO_IF,
624 	.AgcMasterByte   = 0x00,
625 };
626 
627 static struct max2165_config mygica_d689_max2165_cfg = {
628 	.i2c_address = 0x60,
629 	.osc_clk = 20
630 };
631 
632 /* Callbacks for DVB USB */
633 static int cxusb_fmd1216me_tuner_attach(struct dvb_usb_adapter *adap)
634 {
635 	dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
636 		   &adap->dev->i2c_adap, 0x61,
637 		   TUNER_PHILIPS_FMD1216ME_MK3);
638 	return 0;
639 }
640 
641 static int cxusb_dee1601_tuner_attach(struct dvb_usb_adapter *adap)
642 {
643 	dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61,
644 		   NULL, DVB_PLL_THOMSON_DTT7579);
645 	return 0;
646 }
647 
648 static int cxusb_lgz201_tuner_attach(struct dvb_usb_adapter *adap)
649 {
650 	dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x61, NULL, DVB_PLL_LG_Z201);
651 	return 0;
652 }
653 
654 static int cxusb_dtt7579_tuner_attach(struct dvb_usb_adapter *adap)
655 {
656 	dvb_attach(dvb_pll_attach, adap->fe_adap[0].fe, 0x60,
657 		   NULL, DVB_PLL_THOMSON_DTT7579);
658 	return 0;
659 }
660 
661 static int cxusb_lgh064f_tuner_attach(struct dvb_usb_adapter *adap)
662 {
663 	dvb_attach(simple_tuner_attach, adap->fe_adap[0].fe,
664 		   &adap->dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
665 	return 0;
666 }
667 
668 static int dvico_bluebird_xc2028_callback(void *ptr, int component,
669 					  int command, int arg)
670 {
671 	struct dvb_usb_adapter *adap = ptr;
672 	struct dvb_usb_device *d = adap->dev;
673 
674 	switch (command) {
675 	case XC2028_TUNER_RESET:
676 		deb_info("%s: XC2028_TUNER_RESET %d\n", __func__, arg);
677 		cxusb_bluebird_gpio_pulse(d, 0x01, 1);
678 		break;
679 	case XC2028_RESET_CLK:
680 		deb_info("%s: XC2028_RESET_CLK %d\n", __func__, arg);
681 		break;
682 	case XC2028_I2C_FLUSH:
683 		break;
684 	default:
685 		deb_info("%s: unknown command %d, arg %d\n", __func__,
686 			 command, arg);
687 		return -EINVAL;
688 	}
689 
690 	return 0;
691 }
692 
693 static int cxusb_dvico_xc3028_tuner_attach(struct dvb_usb_adapter *adap)
694 {
695 	struct dvb_frontend	 *fe;
696 	struct xc2028_config	  cfg = {
697 		.i2c_adap  = &adap->dev->i2c_adap,
698 		.i2c_addr  = 0x61,
699 	};
700 	static struct xc2028_ctrl ctl = {
701 		.fname       = XC2028_DEFAULT_FIRMWARE,
702 		.max_len     = 64,
703 		.demod       = XC3028_FE_ZARLINK456,
704 	};
705 
706 	/* FIXME: generalize & move to common area */
707 	adap->fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
708 
709 	fe = dvb_attach(xc2028_attach, adap->fe_adap[0].fe, &cfg);
710 	if (fe == NULL || fe->ops.tuner_ops.set_config == NULL)
711 		return -EIO;
712 
713 	fe->ops.tuner_ops.set_config(fe, &ctl);
714 
715 	return 0;
716 }
717 
718 static int cxusb_mxl5003s_tuner_attach(struct dvb_usb_adapter *adap)
719 {
720 	dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
721 		   &adap->dev->i2c_adap, &aver_a868r_tuner);
722 	return 0;
723 }
724 
725 static int cxusb_d680_dmb_tuner_attach(struct dvb_usb_adapter *adap)
726 {
727 	struct dvb_frontend *fe;
728 	fe = dvb_attach(mxl5005s_attach, adap->fe_adap[0].fe,
729 			&adap->dev->i2c_adap, &d680_dmb_tuner);
730 	return (fe == NULL) ? -EIO : 0;
731 }
732 
733 static int cxusb_mygica_d689_tuner_attach(struct dvb_usb_adapter *adap)
734 {
735 	struct dvb_frontend *fe;
736 	fe = dvb_attach(max2165_attach, adap->fe_adap[0].fe,
737 			&adap->dev->i2c_adap, &mygica_d689_max2165_cfg);
738 	return (fe == NULL) ? -EIO : 0;
739 }
740 
741 static int cxusb_cx22702_frontend_attach(struct dvb_usb_adapter *adap)
742 {
743 	u8 b;
744 	if (usb_set_interface(adap->dev->udev, 0, 6) < 0)
745 		err("set interface failed");
746 
747 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, &b, 1);
748 
749 	adap->fe_adap[0].fe = dvb_attach(cx22702_attach, &cxusb_cx22702_config,
750 					 &adap->dev->i2c_adap);
751 	if ((adap->fe_adap[0].fe) != NULL)
752 		return 0;
753 
754 	return -EIO;
755 }
756 
757 static int cxusb_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
758 {
759 	if (usb_set_interface(adap->dev->udev, 0, 7) < 0)
760 		err("set interface failed");
761 
762 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
763 
764 	adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach,
765 					 &cxusb_lgdt3303_config,
766 					 &adap->dev->i2c_adap);
767 	if ((adap->fe_adap[0].fe) != NULL)
768 		return 0;
769 
770 	return -EIO;
771 }
772 
773 static int cxusb_aver_lgdt3303_frontend_attach(struct dvb_usb_adapter *adap)
774 {
775 	adap->fe_adap[0].fe = dvb_attach(lgdt330x_attach, &cxusb_aver_lgdt3303_config,
776 			      &adap->dev->i2c_adap);
777 	if (adap->fe_adap[0].fe != NULL)
778 		return 0;
779 
780 	return -EIO;
781 }
782 
783 static int cxusb_mt352_frontend_attach(struct dvb_usb_adapter *adap)
784 {
785 	/* used in both lgz201 and th7579 */
786 	if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
787 		err("set interface failed");
788 
789 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
790 
791 	adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_mt352_config,
792 					 &adap->dev->i2c_adap);
793 	if ((adap->fe_adap[0].fe) != NULL)
794 		return 0;
795 
796 	return -EIO;
797 }
798 
799 static int cxusb_dee1601_frontend_attach(struct dvb_usb_adapter *adap)
800 {
801 	if (usb_set_interface(adap->dev->udev, 0, 0) < 0)
802 		err("set interface failed");
803 
804 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
805 
806 	adap->fe_adap[0].fe = dvb_attach(mt352_attach, &cxusb_dee1601_config,
807 					 &adap->dev->i2c_adap);
808 	if ((adap->fe_adap[0].fe) != NULL)
809 		return 0;
810 
811 	adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
812 					 &cxusb_zl10353_dee1601_config,
813 					 &adap->dev->i2c_adap);
814 	if ((adap->fe_adap[0].fe) != NULL)
815 		return 0;
816 
817 	return -EIO;
818 }
819 
820 static int cxusb_dualdig4_frontend_attach(struct dvb_usb_adapter *adap)
821 {
822 	u8 ircode[4];
823 	int i;
824 	struct i2c_msg msg = { .addr = 0x6b, .flags = I2C_M_RD,
825 			       .buf = ircode, .len = 4 };
826 
827 	if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
828 		err("set interface failed");
829 
830 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
831 
832 	/* reset the tuner and demodulator */
833 	cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
834 	cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
835 	cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
836 
837 	adap->fe_adap[0].fe =
838 		dvb_attach(zl10353_attach,
839 			   &cxusb_zl10353_xc3028_config_no_i2c_gate,
840 			   &adap->dev->i2c_adap);
841 	if ((adap->fe_adap[0].fe) == NULL)
842 		return -EIO;
843 
844 	/* try to determine if there is no IR decoder on the I2C bus */
845 	for (i = 0; adap->dev->props.rc.core.rc_codes && i < 5; i++) {
846 		msleep(20);
847 		if (cxusb_i2c_xfer(&adap->dev->i2c_adap, &msg, 1) != 1)
848 			goto no_IR;
849 		if (ircode[0] == 0 && ircode[1] == 0)
850 			continue;
851 		if (ircode[2] + ircode[3] != 0xff) {
852 no_IR:
853 			adap->dev->props.rc.core.rc_codes = NULL;
854 			info("No IR receiver detected on this device.");
855 			break;
856 		}
857 	}
858 
859 	return 0;
860 }
861 
862 static struct dibx000_agc_config dib7070_agc_config = {
863 	.band_caps = BAND_UHF | BAND_VHF | BAND_LBAND | BAND_SBAND,
864 
865 	/*
866 	 * P_agc_use_sd_mod1=0, P_agc_use_sd_mod2=0, P_agc_freq_pwm_div=5,
867 	 * P_agc_inv_pwm1=0, P_agc_inv_pwm2=0, P_agc_inh_dc_rv_est=0,
868 	 * P_agc_time_est=3, P_agc_freeze=0, P_agc_nb_est=5, P_agc_write=0
869 	 */
870 	.setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) |
871 		 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
872 	.inv_gain = 600,
873 	.time_stabiliz = 10,
874 	.alpha_level = 0,
875 	.thlock = 118,
876 	.wbd_inv = 0,
877 	.wbd_ref = 3530,
878 	.wbd_sel = 1,
879 	.wbd_alpha = 5,
880 	.agc1_max = 65535,
881 	.agc1_min = 0,
882 	.agc2_max = 65535,
883 	.agc2_min = 0,
884 	.agc1_pt1 = 0,
885 	.agc1_pt2 = 40,
886 	.agc1_pt3 = 183,
887 	.agc1_slope1 = 206,
888 	.agc1_slope2 = 255,
889 	.agc2_pt1 = 72,
890 	.agc2_pt2 = 152,
891 	.agc2_slope1 = 88,
892 	.agc2_slope2 = 90,
893 	.alpha_mant = 17,
894 	.alpha_exp = 27,
895 	.beta_mant = 23,
896 	.beta_exp = 51,
897 	.perform_agc_softsplit = 0,
898 };
899 
900 static struct dibx000_bandwidth_config dib7070_bw_config_12_mhz = {
901 	.internal = 60000,
902 	.sampling = 15000,
903 	.pll_prediv = 1,
904 	.pll_ratio = 20,
905 	.pll_range = 3,
906 	.pll_reset = 1,
907 	.pll_bypass = 0,
908 	.enable_refdiv = 0,
909 	.bypclk_div = 0,
910 	.IO_CLK_en_core = 1,
911 	.ADClkSrc = 1,
912 	.modulo = 2,
913 	/* refsel, sel, freq_15k */
914 	.sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
915 	.ifreq = (0 << 25) | 0,
916 	.timf = 20452225,
917 	.xtal_hz = 12000000,
918 };
919 
920 static struct dib7000p_config cxusb_dualdig4_rev2_config = {
921 	.output_mode = OUTMODE_MPEG2_PAR_GATED_CLK,
922 	.output_mpeg2_in_188_bytes = 1,
923 
924 	.agc_config_count = 1,
925 	.agc = &dib7070_agc_config,
926 	.bw  = &dib7070_bw_config_12_mhz,
927 	.tuner_is_baseband = 1,
928 	.spur_protect = 1,
929 
930 	.gpio_dir = 0xfcef,
931 	.gpio_val = 0x0110,
932 
933 	.gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS,
934 
935 	.hostbus_diversity = 1,
936 };
937 
938 struct dib0700_adapter_state {
939 	int (*set_param_save)(struct dvb_frontend *);
940 	struct dib7000p_ops dib7000p_ops;
941 };
942 
943 static int cxusb_dualdig4_rev2_frontend_attach(struct dvb_usb_adapter *adap)
944 {
945 	struct dib0700_adapter_state *state = adap->priv;
946 
947 	if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
948 		err("set interface failed");
949 
950 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
951 
952 	cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
953 
954 	if (!dvb_attach(dib7000p_attach, &state->dib7000p_ops))
955 		return -ENODEV;
956 
957 	if (state->dib7000p_ops.i2c_enumeration(&adap->dev->i2c_adap, 1, 18,
958 				       &cxusb_dualdig4_rev2_config) < 0) {
959 		printk(KERN_WARNING "Unable to enumerate dib7000p\n");
960 		return -ENODEV;
961 	}
962 
963 	adap->fe_adap[0].fe = state->dib7000p_ops.init(&adap->dev->i2c_adap, 0x80,
964 					      &cxusb_dualdig4_rev2_config);
965 	if (adap->fe_adap[0].fe == NULL)
966 		return -EIO;
967 
968 	return 0;
969 }
970 
971 static int dib7070_tuner_reset(struct dvb_frontend *fe, int onoff)
972 {
973 	struct dvb_usb_adapter *adap = fe->dvb->priv;
974 	struct dib0700_adapter_state *state = adap->priv;
975 
976 	return state->dib7000p_ops.set_gpio(fe, 8, 0, !onoff);
977 }
978 
979 static int dib7070_tuner_sleep(struct dvb_frontend *fe, int onoff)
980 {
981 	return 0;
982 }
983 
984 static struct dib0070_config dib7070p_dib0070_config = {
985 	.i2c_address = DEFAULT_DIB0070_I2C_ADDRESS,
986 	.reset = dib7070_tuner_reset,
987 	.sleep = dib7070_tuner_sleep,
988 	.clock_khz = 12000,
989 };
990 
991 static int dib7070_set_param_override(struct dvb_frontend *fe)
992 {
993 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
994 	struct dvb_usb_adapter *adap = fe->dvb->priv;
995 	struct dib0700_adapter_state *state = adap->priv;
996 
997 	u16 offset;
998 	u8 band = BAND_OF_FREQUENCY(p->frequency/1000);
999 	switch (band) {
1000 	case BAND_VHF: offset = 950; break;
1001 	default:
1002 	case BAND_UHF: offset = 550; break;
1003 	}
1004 
1005 	state->dib7000p_ops.set_wbd_ref(fe, offset + dib0070_wbd_offset(fe));
1006 
1007 	return state->set_param_save(fe);
1008 }
1009 
1010 static int cxusb_dualdig4_rev2_tuner_attach(struct dvb_usb_adapter *adap)
1011 {
1012 	struct dib0700_adapter_state *st = adap->priv;
1013 	struct i2c_adapter *tun_i2c;
1014 
1015 	/*
1016 	 * No need to call dvb7000p_attach here, as it was called
1017 	 * already, as frontend_attach method is called first, and
1018 	 * tuner_attach is only called on sucess.
1019 	 */
1020 	tun_i2c = st->dib7000p_ops.get_i2c_master(adap->fe_adap[0].fe,
1021 					DIBX000_I2C_INTERFACE_TUNER, 1);
1022 
1023 	if (dvb_attach(dib0070_attach, adap->fe_adap[0].fe, tun_i2c,
1024 	    &dib7070p_dib0070_config) == NULL)
1025 		return -ENODEV;
1026 
1027 	st->set_param_save = adap->fe_adap[0].fe->ops.tuner_ops.set_params;
1028 	adap->fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1029 	return 0;
1030 }
1031 
1032 static int cxusb_nano2_frontend_attach(struct dvb_usb_adapter *adap)
1033 {
1034 	if (usb_set_interface(adap->dev->udev, 0, 1) < 0)
1035 		err("set interface failed");
1036 
1037 	cxusb_ctrl_msg(adap->dev, CMD_DIGITAL, NULL, 0, NULL, 0);
1038 
1039 	/* reset the tuner and demodulator */
1040 	cxusb_bluebird_gpio_rw(adap->dev, 0x04, 0);
1041 	cxusb_bluebird_gpio_pulse(adap->dev, 0x01, 1);
1042 	cxusb_bluebird_gpio_pulse(adap->dev, 0x02, 1);
1043 
1044 	adap->fe_adap[0].fe = dvb_attach(zl10353_attach,
1045 					 &cxusb_zl10353_xc3028_config,
1046 					 &adap->dev->i2c_adap);
1047 	if ((adap->fe_adap[0].fe) != NULL)
1048 		return 0;
1049 
1050 	adap->fe_adap[0].fe = dvb_attach(mt352_attach,
1051 					 &cxusb_mt352_xc3028_config,
1052 					 &adap->dev->i2c_adap);
1053 	if ((adap->fe_adap[0].fe) != NULL)
1054 		return 0;
1055 
1056 	return -EIO;
1057 }
1058 
1059 static struct lgs8gxx_config d680_lgs8gl5_cfg = {
1060 	.prod = LGS8GXX_PROD_LGS8GL5,
1061 	.demod_address = 0x19,
1062 	.serial_ts = 0,
1063 	.ts_clk_pol = 0,
1064 	.ts_clk_gated = 1,
1065 	.if_clk_freq = 30400, /* 30.4 MHz */
1066 	.if_freq = 5725, /* 5.725 MHz */
1067 	.if_neg_center = 0,
1068 	.ext_adc = 0,
1069 	.adc_signed = 0,
1070 	.if_neg_edge = 0,
1071 };
1072 
1073 static int cxusb_d680_dmb_frontend_attach(struct dvb_usb_adapter *adap)
1074 {
1075 	struct dvb_usb_device *d = adap->dev;
1076 	int n;
1077 
1078 	/* Select required USB configuration */
1079 	if (usb_set_interface(d->udev, 0, 0) < 0)
1080 		err("set interface failed");
1081 
1082 	/* Unblock all USB pipes */
1083 	usb_clear_halt(d->udev,
1084 		usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1085 	usb_clear_halt(d->udev,
1086 		usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1087 	usb_clear_halt(d->udev,
1088 		usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1089 
1090 	/* Drain USB pipes to avoid hang after reboot */
1091 	for (n = 0;  n < 5;  n++) {
1092 		cxusb_d680_dmb_drain_message(d);
1093 		cxusb_d680_dmb_drain_video(d);
1094 		msleep(200);
1095 	}
1096 
1097 	/* Reset the tuner */
1098 	if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1099 		err("clear tuner gpio failed");
1100 		return -EIO;
1101 	}
1102 	msleep(100);
1103 	if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1104 		err("set tuner gpio failed");
1105 		return -EIO;
1106 	}
1107 	msleep(100);
1108 
1109 	/* Attach frontend */
1110 	adap->fe_adap[0].fe = dvb_attach(lgs8gxx_attach, &d680_lgs8gl5_cfg, &d->i2c_adap);
1111 	if (adap->fe_adap[0].fe == NULL)
1112 		return -EIO;
1113 
1114 	return 0;
1115 }
1116 
1117 static struct atbm8830_config mygica_d689_atbm8830_cfg = {
1118 	.prod = ATBM8830_PROD_8830,
1119 	.demod_address = 0x40,
1120 	.serial_ts = 0,
1121 	.ts_sampling_edge = 1,
1122 	.ts_clk_gated = 0,
1123 	.osc_clk_freq = 30400, /* in kHz */
1124 	.if_freq = 0, /* zero IF */
1125 	.zif_swap_iq = 1,
1126 	.agc_min = 0x2E,
1127 	.agc_max = 0x90,
1128 	.agc_hold_loop = 0,
1129 };
1130 
1131 static int cxusb_mygica_d689_frontend_attach(struct dvb_usb_adapter *adap)
1132 {
1133 	struct dvb_usb_device *d = adap->dev;
1134 
1135 	/* Select required USB configuration */
1136 	if (usb_set_interface(d->udev, 0, 0) < 0)
1137 		err("set interface failed");
1138 
1139 	/* Unblock all USB pipes */
1140 	usb_clear_halt(d->udev,
1141 		usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1142 	usb_clear_halt(d->udev,
1143 		usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1144 	usb_clear_halt(d->udev,
1145 		usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1146 
1147 
1148 	/* Reset the tuner */
1149 	if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1150 		err("clear tuner gpio failed");
1151 		return -EIO;
1152 	}
1153 	msleep(100);
1154 	if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1155 		err("set tuner gpio failed");
1156 		return -EIO;
1157 	}
1158 	msleep(100);
1159 
1160 	/* Attach frontend */
1161 	adap->fe_adap[0].fe = dvb_attach(atbm8830_attach, &mygica_d689_atbm8830_cfg,
1162 		&d->i2c_adap);
1163 	if (adap->fe_adap[0].fe == NULL)
1164 		return -EIO;
1165 
1166 	return 0;
1167 }
1168 
1169 static int cxusb_mygica_t230_frontend_attach(struct dvb_usb_adapter *adap)
1170 {
1171 	struct dvb_usb_device *d = adap->dev;
1172 	struct cxusb_state *st = d->priv;
1173 	struct i2c_adapter *adapter;
1174 	struct i2c_client *client_demod;
1175 	struct i2c_client *client_tuner;
1176 	struct i2c_board_info info;
1177 	struct si2168_config si2168_config;
1178 	struct si2157_config si2157_config;
1179 
1180 	/* Select required USB configuration */
1181 	if (usb_set_interface(d->udev, 0, 0) < 0)
1182 		err("set interface failed");
1183 
1184 	/* Unblock all USB pipes */
1185 	usb_clear_halt(d->udev,
1186 		usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1187 	usb_clear_halt(d->udev,
1188 		usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
1189 	usb_clear_halt(d->udev,
1190 		usb_rcvbulkpipe(d->udev, d->props.adapter[0].fe[0].stream.endpoint));
1191 
1192 	/* attach frontend */
1193 	si2168_config.i2c_adapter = &adapter;
1194 	si2168_config.fe = &adap->fe_adap[0].fe;
1195 	si2168_config.ts_mode = SI2168_TS_PARALLEL;
1196 	si2168_config.ts_clock_inv = 1;
1197 	memset(&info, 0, sizeof(struct i2c_board_info));
1198 	strlcpy(info.type, "si2168", I2C_NAME_SIZE);
1199 	info.addr = 0x64;
1200 	info.platform_data = &si2168_config;
1201 	request_module(info.type);
1202 	client_demod = i2c_new_device(&d->i2c_adap, &info);
1203 	if (client_demod == NULL || client_demod->dev.driver == NULL)
1204 		return -ENODEV;
1205 
1206 	if (!try_module_get(client_demod->dev.driver->owner)) {
1207 		i2c_unregister_device(client_demod);
1208 		return -ENODEV;
1209 	}
1210 
1211 	st->i2c_client_demod = client_demod;
1212 
1213 	/* attach tuner */
1214 	memset(&si2157_config, 0, sizeof(si2157_config));
1215 	si2157_config.fe = adap->fe_adap[0].fe;
1216 	si2157_config.if_port = 1;
1217 	memset(&info, 0, sizeof(struct i2c_board_info));
1218 	strlcpy(info.type, "si2157", I2C_NAME_SIZE);
1219 	info.addr = 0x60;
1220 	info.platform_data = &si2157_config;
1221 	request_module(info.type);
1222 	client_tuner = i2c_new_device(adapter, &info);
1223 	if (client_tuner == NULL || client_tuner->dev.driver == NULL) {
1224 		module_put(client_demod->dev.driver->owner);
1225 		i2c_unregister_device(client_demod);
1226 		return -ENODEV;
1227 	}
1228 	if (!try_module_get(client_tuner->dev.driver->owner)) {
1229 		i2c_unregister_device(client_tuner);
1230 		module_put(client_demod->dev.driver->owner);
1231 		i2c_unregister_device(client_demod);
1232 		return -ENODEV;
1233 	}
1234 
1235 	st->i2c_client_tuner = client_tuner;
1236 
1237 	/* hook fe: need to resync the slave fifo when signal locks. */
1238 	mutex_init(&st->stream_mutex);
1239 	st->last_lock = 0;
1240 	st->fe_read_status = adap->fe_adap[0].fe->ops.read_status;
1241 	adap->fe_adap[0].fe->ops.read_status = cxusb_read_status;
1242 
1243 	return 0;
1244 }
1245 
1246 /*
1247  * DViCO has shipped two devices with the same USB ID, but only one of them
1248  * needs a firmware download.  Check the device class details to see if they
1249  * have non-default values to decide whether the device is actually cold or
1250  * not, and forget a match if it turns out we selected the wrong device.
1251  */
1252 static int bluebird_fx2_identify_state(struct usb_device *udev,
1253 				       struct dvb_usb_device_properties *props,
1254 				       struct dvb_usb_device_description **desc,
1255 				       int *cold)
1256 {
1257 	int wascold = *cold;
1258 
1259 	*cold = udev->descriptor.bDeviceClass == 0xff &&
1260 		udev->descriptor.bDeviceSubClass == 0xff &&
1261 		udev->descriptor.bDeviceProtocol == 0xff;
1262 
1263 	if (*cold && !wascold)
1264 		*desc = NULL;
1265 
1266 	return 0;
1267 }
1268 
1269 /*
1270  * DViCO bluebird firmware needs the "warm" product ID to be patched into the
1271  * firmware file before download.
1272  */
1273 
1274 static const int dvico_firmware_id_offsets[] = { 6638, 3204 };
1275 static int bluebird_patch_dvico_firmware_download(struct usb_device *udev,
1276 						  const struct firmware *fw)
1277 {
1278 	int pos;
1279 
1280 	for (pos = 0; pos < ARRAY_SIZE(dvico_firmware_id_offsets); pos++) {
1281 		int idoff = dvico_firmware_id_offsets[pos];
1282 
1283 		if (fw->size < idoff + 4)
1284 			continue;
1285 
1286 		if (fw->data[idoff] == (USB_VID_DVICO & 0xff) &&
1287 		    fw->data[idoff + 1] == USB_VID_DVICO >> 8) {
1288 			struct firmware new_fw;
1289 			u8 *new_fw_data = vmalloc(fw->size);
1290 			int ret;
1291 
1292 			if (!new_fw_data)
1293 				return -ENOMEM;
1294 
1295 			memcpy(new_fw_data, fw->data, fw->size);
1296 			new_fw.size = fw->size;
1297 			new_fw.data = new_fw_data;
1298 
1299 			new_fw_data[idoff + 2] =
1300 				le16_to_cpu(udev->descriptor.idProduct) + 1;
1301 			new_fw_data[idoff + 3] =
1302 				le16_to_cpu(udev->descriptor.idProduct) >> 8;
1303 
1304 			ret = usb_cypress_load_firmware(udev, &new_fw,
1305 							CYPRESS_FX2);
1306 			vfree(new_fw_data);
1307 			return ret;
1308 		}
1309 	}
1310 
1311 	return -EINVAL;
1312 }
1313 
1314 /* DVB USB Driver stuff */
1315 static struct dvb_usb_device_properties cxusb_medion_properties;
1316 static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties;
1317 static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties;
1318 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties;
1319 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties;
1320 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties;
1321 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties;
1322 static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties;
1323 static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties;
1324 static struct dvb_usb_device_properties cxusb_aver_a868r_properties;
1325 static struct dvb_usb_device_properties cxusb_d680_dmb_properties;
1326 static struct dvb_usb_device_properties cxusb_mygica_d689_properties;
1327 static struct dvb_usb_device_properties cxusb_mygica_t230_properties;
1328 
1329 static int cxusb_probe(struct usb_interface *intf,
1330 		       const struct usb_device_id *id)
1331 {
1332 	if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties,
1333 				     THIS_MODULE, NULL, adapter_nr) ||
1334 	    0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties,
1335 				     THIS_MODULE, NULL, adapter_nr) ||
1336 	    0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties,
1337 				     THIS_MODULE, NULL, adapter_nr) ||
1338 	    0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties,
1339 				     THIS_MODULE, NULL, adapter_nr) ||
1340 	    0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties,
1341 				     THIS_MODULE, NULL, adapter_nr) ||
1342 	    0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
1343 				     THIS_MODULE, NULL, adapter_nr) ||
1344 	    0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
1345 				     THIS_MODULE, NULL, adapter_nr) ||
1346 	    0 == dvb_usb_device_init(intf,
1347 				&cxusb_bluebird_nano2_needsfirmware_properties,
1348 				     THIS_MODULE, NULL, adapter_nr) ||
1349 	    0 == dvb_usb_device_init(intf, &cxusb_aver_a868r_properties,
1350 				     THIS_MODULE, NULL, adapter_nr) ||
1351 	    0 == dvb_usb_device_init(intf,
1352 				     &cxusb_bluebird_dualdig4_rev2_properties,
1353 				     THIS_MODULE, NULL, adapter_nr) ||
1354 	    0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
1355 				     THIS_MODULE, NULL, adapter_nr) ||
1356 	    0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
1357 				     THIS_MODULE, NULL, adapter_nr) ||
1358 	    0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties,
1359 				     THIS_MODULE, NULL, adapter_nr) ||
1360 	    0)
1361 		return 0;
1362 
1363 	return -EINVAL;
1364 }
1365 
1366 static void cxusb_disconnect(struct usb_interface *intf)
1367 {
1368 	struct dvb_usb_device *d = usb_get_intfdata(intf);
1369 	struct cxusb_state *st = d->priv;
1370 	struct i2c_client *client;
1371 
1372 	/* remove I2C client for tuner */
1373 	client = st->i2c_client_tuner;
1374 	if (client) {
1375 		module_put(client->dev.driver->owner);
1376 		i2c_unregister_device(client);
1377 	}
1378 
1379 	/* remove I2C client for demodulator */
1380 	client = st->i2c_client_demod;
1381 	if (client) {
1382 		module_put(client->dev.driver->owner);
1383 		i2c_unregister_device(client);
1384 	}
1385 
1386 	dvb_usb_device_exit(intf);
1387 }
1388 
1389 enum cxusb_table_index {
1390 	MEDION_MD95700,
1391 	DVICO_BLUEBIRD_LG064F_COLD,
1392 	DVICO_BLUEBIRD_LG064F_WARM,
1393 	DVICO_BLUEBIRD_DUAL_1_COLD,
1394 	DVICO_BLUEBIRD_DUAL_1_WARM,
1395 	DVICO_BLUEBIRD_LGZ201_COLD,
1396 	DVICO_BLUEBIRD_LGZ201_WARM,
1397 	DVICO_BLUEBIRD_TH7579_COLD,
1398 	DVICO_BLUEBIRD_TH7579_WARM,
1399 	DIGITALNOW_BLUEBIRD_DUAL_1_COLD,
1400 	DIGITALNOW_BLUEBIRD_DUAL_1_WARM,
1401 	DVICO_BLUEBIRD_DUAL_2_COLD,
1402 	DVICO_BLUEBIRD_DUAL_2_WARM,
1403 	DVICO_BLUEBIRD_DUAL_4,
1404 	DVICO_BLUEBIRD_DVB_T_NANO_2,
1405 	DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM,
1406 	AVERMEDIA_VOLAR_A868R,
1407 	DVICO_BLUEBIRD_DUAL_4_REV_2,
1408 	CONEXANT_D680_DMB,
1409 	MYGICA_D689,
1410 	MYGICA_T230,
1411 	NR__cxusb_table_index
1412 };
1413 
1414 static struct usb_device_id cxusb_table[NR__cxusb_table_index + 1] = {
1415 	[MEDION_MD95700] = {
1416 		USB_DEVICE(USB_VID_MEDION, USB_PID_MEDION_MD95700)
1417 	},
1418 	[DVICO_BLUEBIRD_LG064F_COLD] = {
1419 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_COLD)
1420 	},
1421 	[DVICO_BLUEBIRD_LG064F_WARM] = {
1422 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LG064F_WARM)
1423 	},
1424 	[DVICO_BLUEBIRD_DUAL_1_COLD] = {
1425 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_COLD)
1426 	},
1427 	[DVICO_BLUEBIRD_DUAL_1_WARM] = {
1428 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_1_WARM)
1429 	},
1430 	[DVICO_BLUEBIRD_LGZ201_COLD] = {
1431 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_COLD)
1432 	},
1433 	[DVICO_BLUEBIRD_LGZ201_WARM] = {
1434 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_LGZ201_WARM)
1435 	},
1436 	[DVICO_BLUEBIRD_TH7579_COLD] = {
1437 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_COLD)
1438 	},
1439 	[DVICO_BLUEBIRD_TH7579_WARM] = {
1440 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_TH7579_WARM)
1441 	},
1442 	[DIGITALNOW_BLUEBIRD_DUAL_1_COLD] = {
1443 		USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_COLD)
1444 	},
1445 	[DIGITALNOW_BLUEBIRD_DUAL_1_WARM] = {
1446 		USB_DEVICE(USB_VID_DVICO, USB_PID_DIGITALNOW_BLUEBIRD_DUAL_1_WARM)
1447 	},
1448 	[DVICO_BLUEBIRD_DUAL_2_COLD] = {
1449 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_COLD)
1450 	},
1451 	[DVICO_BLUEBIRD_DUAL_2_WARM] = {
1452 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_2_WARM)
1453 	},
1454 	[DVICO_BLUEBIRD_DUAL_4] = {
1455 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4)
1456 	},
1457 	[DVICO_BLUEBIRD_DVB_T_NANO_2] = {
1458 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2)
1459 	},
1460 	[DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM] = {
1461 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM)
1462 	},
1463 	[AVERMEDIA_VOLAR_A868R] = {
1464 		USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_VOLAR_A868R)
1465 	},
1466 	[DVICO_BLUEBIRD_DUAL_4_REV_2] = {
1467 		USB_DEVICE(USB_VID_DVICO, USB_PID_DVICO_BLUEBIRD_DUAL_4_REV_2)
1468 	},
1469 	[CONEXANT_D680_DMB] = {
1470 		USB_DEVICE(USB_VID_CONEXANT, USB_PID_CONEXANT_D680_DMB)
1471 	},
1472 	[MYGICA_D689] = {
1473 		USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_D689)
1474 	},
1475 	[MYGICA_T230] = {
1476 		USB_DEVICE(USB_VID_CONEXANT, USB_PID_MYGICA_T230)
1477 	},
1478 	{}		/* Terminating entry */
1479 };
1480 MODULE_DEVICE_TABLE (usb, cxusb_table);
1481 
1482 static struct dvb_usb_device_properties cxusb_medion_properties = {
1483 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1484 
1485 	.usb_ctrl = CYPRESS_FX2,
1486 
1487 	.size_of_priv     = sizeof(struct cxusb_state),
1488 
1489 	.num_adapters = 1,
1490 	.adapter = {
1491 		{
1492 		.num_frontends = 1,
1493 		.fe = {{
1494 			.streaming_ctrl   = cxusb_streaming_ctrl,
1495 			.frontend_attach  = cxusb_cx22702_frontend_attach,
1496 			.tuner_attach     = cxusb_fmd1216me_tuner_attach,
1497 			/* parameter for the MPEG2-data transfer */
1498 					.stream = {
1499 						.type = USB_BULK,
1500 				.count = 5,
1501 				.endpoint = 0x02,
1502 				.u = {
1503 					.bulk = {
1504 						.buffersize = 8192,
1505 					}
1506 				}
1507 			},
1508 		}},
1509 		},
1510 	},
1511 	.power_ctrl       = cxusb_power_ctrl,
1512 
1513 	.i2c_algo         = &cxusb_i2c_algo,
1514 
1515 	.generic_bulk_ctrl_endpoint = 0x01,
1516 
1517 	.num_device_descs = 1,
1518 	.devices = {
1519 		{   "Medion MD95700 (MDUSBTV-HYBRID)",
1520 			{ NULL },
1521 			{ &cxusb_table[MEDION_MD95700], NULL },
1522 		},
1523 	}
1524 };
1525 
1526 static struct dvb_usb_device_properties cxusb_bluebird_lgh064f_properties = {
1527 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1528 
1529 	.usb_ctrl          = DEVICE_SPECIFIC,
1530 	.firmware          = "dvb-usb-bluebird-01.fw",
1531 	.download_firmware = bluebird_patch_dvico_firmware_download,
1532 	/* use usb alt setting 0 for EP4 transfer (dvb-t),
1533 	   use usb alt setting 7 for EP2 transfer (atsc) */
1534 
1535 	.size_of_priv     = sizeof(struct cxusb_state),
1536 
1537 	.num_adapters = 1,
1538 	.adapter = {
1539 		{
1540 		.num_frontends = 1,
1541 		.fe = {{
1542 			.streaming_ctrl   = cxusb_streaming_ctrl,
1543 			.frontend_attach  = cxusb_lgdt3303_frontend_attach,
1544 			.tuner_attach     = cxusb_lgh064f_tuner_attach,
1545 
1546 			/* parameter for the MPEG2-data transfer */
1547 					.stream = {
1548 						.type = USB_BULK,
1549 				.count = 5,
1550 				.endpoint = 0x02,
1551 				.u = {
1552 					.bulk = {
1553 						.buffersize = 8192,
1554 					}
1555 				}
1556 			},
1557 		}},
1558 		},
1559 	},
1560 
1561 	.power_ctrl       = cxusb_bluebird_power_ctrl,
1562 
1563 	.i2c_algo         = &cxusb_i2c_algo,
1564 
1565 	.rc.core = {
1566 		.rc_interval	= 100,
1567 		.rc_codes	= RC_MAP_DVICO_PORTABLE,
1568 		.module_name	= KBUILD_MODNAME,
1569 		.rc_query	= cxusb_rc_query,
1570 		.allowed_protos = RC_PROTO_BIT_NEC,
1571 	},
1572 
1573 	.generic_bulk_ctrl_endpoint = 0x01,
1574 
1575 	.num_device_descs = 1,
1576 	.devices = {
1577 		{   "DViCO FusionHDTV5 USB Gold",
1578 			{ &cxusb_table[DVICO_BLUEBIRD_LG064F_COLD], NULL },
1579 			{ &cxusb_table[DVICO_BLUEBIRD_LG064F_WARM], NULL },
1580 		},
1581 	}
1582 };
1583 
1584 static struct dvb_usb_device_properties cxusb_bluebird_dee1601_properties = {
1585 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1586 
1587 	.usb_ctrl          = DEVICE_SPECIFIC,
1588 	.firmware          = "dvb-usb-bluebird-01.fw",
1589 	.download_firmware = bluebird_patch_dvico_firmware_download,
1590 	/* use usb alt setting 0 for EP4 transfer (dvb-t),
1591 	   use usb alt setting 7 for EP2 transfer (atsc) */
1592 
1593 	.size_of_priv     = sizeof(struct cxusb_state),
1594 
1595 	.num_adapters = 1,
1596 	.adapter = {
1597 		{
1598 		.num_frontends = 1,
1599 		.fe = {{
1600 			.streaming_ctrl   = cxusb_streaming_ctrl,
1601 			.frontend_attach  = cxusb_dee1601_frontend_attach,
1602 			.tuner_attach     = cxusb_dee1601_tuner_attach,
1603 			/* parameter for the MPEG2-data transfer */
1604 			.stream = {
1605 				.type = USB_BULK,
1606 				.count = 5,
1607 				.endpoint = 0x04,
1608 				.u = {
1609 					.bulk = {
1610 						.buffersize = 8192,
1611 					}
1612 				}
1613 			},
1614 		}},
1615 		},
1616 	},
1617 
1618 	.power_ctrl       = cxusb_bluebird_power_ctrl,
1619 
1620 	.i2c_algo         = &cxusb_i2c_algo,
1621 
1622 	.rc.core = {
1623 		.rc_interval	= 100,
1624 		.rc_codes	= RC_MAP_DVICO_MCE,
1625 		.module_name	= KBUILD_MODNAME,
1626 		.rc_query	= cxusb_rc_query,
1627 		.allowed_protos = RC_PROTO_BIT_NEC,
1628 	},
1629 
1630 	.generic_bulk_ctrl_endpoint = 0x01,
1631 
1632 	.num_device_descs = 3,
1633 	.devices = {
1634 		{   "DViCO FusionHDTV DVB-T Dual USB",
1635 			{ &cxusb_table[DVICO_BLUEBIRD_DUAL_1_COLD], NULL },
1636 			{ &cxusb_table[DVICO_BLUEBIRD_DUAL_1_WARM], NULL },
1637 		},
1638 		{   "DigitalNow DVB-T Dual USB",
1639 			{ &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_COLD],  NULL },
1640 			{ &cxusb_table[DIGITALNOW_BLUEBIRD_DUAL_1_WARM], NULL },
1641 		},
1642 		{   "DViCO FusionHDTV DVB-T Dual Digital 2",
1643 			{ &cxusb_table[DVICO_BLUEBIRD_DUAL_2_COLD], NULL },
1644 			{ &cxusb_table[DVICO_BLUEBIRD_DUAL_2_WARM], NULL },
1645 		},
1646 	}
1647 };
1648 
1649 static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
1650 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1651 
1652 	.usb_ctrl          = DEVICE_SPECIFIC,
1653 	.firmware          = "dvb-usb-bluebird-01.fw",
1654 	.download_firmware = bluebird_patch_dvico_firmware_download,
1655 	/* use usb alt setting 0 for EP4 transfer (dvb-t),
1656 	   use usb alt setting 7 for EP2 transfer (atsc) */
1657 
1658 	.size_of_priv     = sizeof(struct cxusb_state),
1659 
1660 	.num_adapters = 2,
1661 	.adapter = {
1662 		{
1663 		.num_frontends = 1,
1664 		.fe = {{
1665 			.streaming_ctrl   = cxusb_streaming_ctrl,
1666 			.frontend_attach  = cxusb_mt352_frontend_attach,
1667 			.tuner_attach     = cxusb_lgz201_tuner_attach,
1668 
1669 			/* parameter for the MPEG2-data transfer */
1670 			.stream = {
1671 				.type = USB_BULK,
1672 				.count = 5,
1673 				.endpoint = 0x04,
1674 				.u = {
1675 					.bulk = {
1676 						.buffersize = 8192,
1677 					}
1678 				}
1679 			},
1680 		}},
1681 		},
1682 	},
1683 	.power_ctrl       = cxusb_bluebird_power_ctrl,
1684 
1685 	.i2c_algo         = &cxusb_i2c_algo,
1686 
1687 	.rc.core = {
1688 		.rc_interval	= 100,
1689 		.rc_codes	= RC_MAP_DVICO_PORTABLE,
1690 		.module_name	= KBUILD_MODNAME,
1691 		.rc_query	= cxusb_rc_query,
1692 		.allowed_protos = RC_PROTO_BIT_NEC,
1693 	},
1694 
1695 	.generic_bulk_ctrl_endpoint = 0x01,
1696 	.num_device_descs = 1,
1697 	.devices = {
1698 		{   "DViCO FusionHDTV DVB-T USB (LGZ201)",
1699 			{ &cxusb_table[DVICO_BLUEBIRD_LGZ201_COLD], NULL },
1700 			{ &cxusb_table[DVICO_BLUEBIRD_LGZ201_WARM], NULL },
1701 		},
1702 	}
1703 };
1704 
1705 static struct dvb_usb_device_properties cxusb_bluebird_dtt7579_properties = {
1706 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1707 
1708 	.usb_ctrl          = DEVICE_SPECIFIC,
1709 	.firmware          = "dvb-usb-bluebird-01.fw",
1710 	.download_firmware = bluebird_patch_dvico_firmware_download,
1711 	/* use usb alt setting 0 for EP4 transfer (dvb-t),
1712 	   use usb alt setting 7 for EP2 transfer (atsc) */
1713 
1714 	.size_of_priv     = sizeof(struct cxusb_state),
1715 
1716 	.num_adapters = 1,
1717 	.adapter = {
1718 		{
1719 		.num_frontends = 1,
1720 		.fe = {{
1721 			.streaming_ctrl   = cxusb_streaming_ctrl,
1722 			.frontend_attach  = cxusb_mt352_frontend_attach,
1723 			.tuner_attach     = cxusb_dtt7579_tuner_attach,
1724 
1725 			/* parameter for the MPEG2-data transfer */
1726 			.stream = {
1727 				.type = USB_BULK,
1728 				.count = 5,
1729 				.endpoint = 0x04,
1730 				.u = {
1731 					.bulk = {
1732 						.buffersize = 8192,
1733 					}
1734 				}
1735 			},
1736 		}},
1737 		},
1738 	},
1739 	.power_ctrl       = cxusb_bluebird_power_ctrl,
1740 
1741 	.i2c_algo         = &cxusb_i2c_algo,
1742 
1743 	.rc.core = {
1744 		.rc_interval	= 100,
1745 		.rc_codes	= RC_MAP_DVICO_PORTABLE,
1746 		.module_name	= KBUILD_MODNAME,
1747 		.rc_query	= cxusb_rc_query,
1748 		.allowed_protos = RC_PROTO_BIT_NEC,
1749 	},
1750 
1751 	.generic_bulk_ctrl_endpoint = 0x01,
1752 
1753 	.num_device_descs = 1,
1754 	.devices = {
1755 		{   "DViCO FusionHDTV DVB-T USB (TH7579)",
1756 			{ &cxusb_table[DVICO_BLUEBIRD_TH7579_COLD], NULL },
1757 			{ &cxusb_table[DVICO_BLUEBIRD_TH7579_WARM], NULL },
1758 		},
1759 	}
1760 };
1761 
1762 static struct dvb_usb_device_properties cxusb_bluebird_dualdig4_properties = {
1763 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1764 
1765 	.usb_ctrl         = CYPRESS_FX2,
1766 
1767 	.size_of_priv     = sizeof(struct cxusb_state),
1768 
1769 	.num_adapters = 1,
1770 	.adapter = {
1771 		{
1772 		.num_frontends = 1,
1773 		.fe = {{
1774 			.streaming_ctrl   = cxusb_streaming_ctrl,
1775 			.frontend_attach  = cxusb_dualdig4_frontend_attach,
1776 			.tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
1777 			/* parameter for the MPEG2-data transfer */
1778 			.stream = {
1779 				.type = USB_BULK,
1780 				.count = 5,
1781 				.endpoint = 0x02,
1782 				.u = {
1783 					.bulk = {
1784 						.buffersize = 8192,
1785 					}
1786 				}
1787 			},
1788 		}},
1789 		},
1790 	},
1791 
1792 	.power_ctrl       = cxusb_power_ctrl,
1793 
1794 	.i2c_algo         = &cxusb_i2c_algo,
1795 
1796 	.generic_bulk_ctrl_endpoint = 0x01,
1797 
1798 	.rc.core = {
1799 		.rc_interval	= 100,
1800 		.rc_codes	= RC_MAP_DVICO_MCE,
1801 		.module_name	= KBUILD_MODNAME,
1802 		.rc_query	= cxusb_bluebird2_rc_query,
1803 		.allowed_protos = RC_PROTO_BIT_NEC,
1804 	},
1805 
1806 	.num_device_descs = 1,
1807 	.devices = {
1808 		{   "DViCO FusionHDTV DVB-T Dual Digital 4",
1809 			{ NULL },
1810 			{ &cxusb_table[DVICO_BLUEBIRD_DUAL_4], NULL },
1811 		},
1812 	}
1813 };
1814 
1815 static struct dvb_usb_device_properties cxusb_bluebird_nano2_properties = {
1816 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1817 
1818 	.usb_ctrl         = CYPRESS_FX2,
1819 	.identify_state   = bluebird_fx2_identify_state,
1820 
1821 	.size_of_priv     = sizeof(struct cxusb_state),
1822 
1823 	.num_adapters = 1,
1824 	.adapter = {
1825 		{
1826 		.num_frontends = 1,
1827 		.fe = {{
1828 			.streaming_ctrl   = cxusb_streaming_ctrl,
1829 			.frontend_attach  = cxusb_nano2_frontend_attach,
1830 			.tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
1831 			/* parameter for the MPEG2-data transfer */
1832 			.stream = {
1833 				.type = USB_BULK,
1834 				.count = 5,
1835 				.endpoint = 0x02,
1836 				.u = {
1837 					.bulk = {
1838 						.buffersize = 8192,
1839 					}
1840 				}
1841 			},
1842 		}},
1843 		},
1844 	},
1845 
1846 	.power_ctrl       = cxusb_nano2_power_ctrl,
1847 
1848 	.i2c_algo         = &cxusb_i2c_algo,
1849 
1850 	.generic_bulk_ctrl_endpoint = 0x01,
1851 
1852 	.rc.core = {
1853 		.rc_interval	= 100,
1854 		.rc_codes	= RC_MAP_DVICO_PORTABLE,
1855 		.module_name	= KBUILD_MODNAME,
1856 		.rc_query       = cxusb_bluebird2_rc_query,
1857 		.allowed_protos = RC_PROTO_BIT_NEC,
1858 	},
1859 
1860 	.num_device_descs = 1,
1861 	.devices = {
1862 		{   "DViCO FusionHDTV DVB-T NANO2",
1863 			{ NULL },
1864 			{ &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
1865 		},
1866 	}
1867 };
1868 
1869 static struct dvb_usb_device_properties cxusb_bluebird_nano2_needsfirmware_properties = {
1870 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1871 
1872 	.usb_ctrl          = DEVICE_SPECIFIC,
1873 	.firmware          = "dvb-usb-bluebird-02.fw",
1874 	.download_firmware = bluebird_patch_dvico_firmware_download,
1875 	.identify_state    = bluebird_fx2_identify_state,
1876 
1877 	.size_of_priv      = sizeof(struct cxusb_state),
1878 
1879 	.num_adapters = 1,
1880 	.adapter = {
1881 		{
1882 		.num_frontends = 1,
1883 		.fe = {{
1884 			.streaming_ctrl   = cxusb_streaming_ctrl,
1885 			.frontend_attach  = cxusb_nano2_frontend_attach,
1886 			.tuner_attach     = cxusb_dvico_xc3028_tuner_attach,
1887 			/* parameter for the MPEG2-data transfer */
1888 			.stream = {
1889 				.type = USB_BULK,
1890 				.count = 5,
1891 				.endpoint = 0x02,
1892 				.u = {
1893 					.bulk = {
1894 						.buffersize = 8192,
1895 					}
1896 				}
1897 			},
1898 		}},
1899 		},
1900 	},
1901 
1902 	.power_ctrl       = cxusb_nano2_power_ctrl,
1903 
1904 	.i2c_algo         = &cxusb_i2c_algo,
1905 
1906 	.generic_bulk_ctrl_endpoint = 0x01,
1907 
1908 	.rc.core = {
1909 		.rc_interval	= 100,
1910 		.rc_codes	= RC_MAP_DVICO_PORTABLE,
1911 		.module_name	= KBUILD_MODNAME,
1912 		.rc_query	= cxusb_rc_query,
1913 		.allowed_protos = RC_PROTO_BIT_NEC,
1914 	},
1915 
1916 	.num_device_descs = 1,
1917 	.devices = {
1918 		{   "DViCO FusionHDTV DVB-T NANO2 w/o firmware",
1919 			{ &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2], NULL },
1920 			{ &cxusb_table[DVICO_BLUEBIRD_DVB_T_NANO_2_NFW_WARM], NULL },
1921 		},
1922 	}
1923 };
1924 
1925 static struct dvb_usb_device_properties cxusb_aver_a868r_properties = {
1926 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1927 
1928 	.usb_ctrl         = CYPRESS_FX2,
1929 
1930 	.size_of_priv     = sizeof(struct cxusb_state),
1931 
1932 	.num_adapters = 1,
1933 	.adapter = {
1934 		{
1935 		.num_frontends = 1,
1936 		.fe = {{
1937 			.streaming_ctrl   = cxusb_aver_streaming_ctrl,
1938 			.frontend_attach  = cxusb_aver_lgdt3303_frontend_attach,
1939 			.tuner_attach     = cxusb_mxl5003s_tuner_attach,
1940 			/* parameter for the MPEG2-data transfer */
1941 			.stream = {
1942 				.type = USB_BULK,
1943 				.count = 5,
1944 				.endpoint = 0x04,
1945 				.u = {
1946 					.bulk = {
1947 						.buffersize = 8192,
1948 					}
1949 				}
1950 			},
1951 		}},
1952 		},
1953 	},
1954 	.power_ctrl       = cxusb_aver_power_ctrl,
1955 
1956 	.i2c_algo         = &cxusb_i2c_algo,
1957 
1958 	.generic_bulk_ctrl_endpoint = 0x01,
1959 
1960 	.num_device_descs = 1,
1961 	.devices = {
1962 		{   "AVerMedia AVerTVHD Volar (A868R)",
1963 			{ NULL },
1964 			{ &cxusb_table[AVERMEDIA_VOLAR_A868R], NULL },
1965 		},
1966 	}
1967 };
1968 
1969 static
1970 struct dvb_usb_device_properties cxusb_bluebird_dualdig4_rev2_properties = {
1971 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
1972 
1973 	.usb_ctrl         = CYPRESS_FX2,
1974 
1975 	.size_of_priv     = sizeof(struct cxusb_state),
1976 
1977 	.num_adapters = 1,
1978 	.adapter = {
1979 		{
1980 		.size_of_priv    = sizeof(struct dib0700_adapter_state),
1981 		.num_frontends = 1,
1982 		.fe = {{
1983 			.streaming_ctrl  = cxusb_streaming_ctrl,
1984 			.frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
1985 			.tuner_attach    = cxusb_dualdig4_rev2_tuner_attach,
1986 			/* parameter for the MPEG2-data transfer */
1987 			.stream = {
1988 				.type = USB_BULK,
1989 				.count = 7,
1990 				.endpoint = 0x02,
1991 				.u = {
1992 					.bulk = {
1993 						.buffersize = 4096,
1994 					}
1995 				}
1996 			},
1997 		}},
1998 		},
1999 	},
2000 
2001 	.power_ctrl       = cxusb_bluebird_power_ctrl,
2002 
2003 	.i2c_algo         = &cxusb_i2c_algo,
2004 
2005 	.generic_bulk_ctrl_endpoint = 0x01,
2006 
2007 	.rc.core = {
2008 		.rc_interval	= 100,
2009 		.rc_codes	= RC_MAP_DVICO_MCE,
2010 		.module_name	= KBUILD_MODNAME,
2011 		.rc_query	= cxusb_rc_query,
2012 		.allowed_protos = RC_PROTO_BIT_NEC,
2013 	},
2014 
2015 	.num_device_descs = 1,
2016 	.devices = {
2017 		{   "DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
2018 			{ NULL },
2019 			{ &cxusb_table[DVICO_BLUEBIRD_DUAL_4_REV_2], NULL },
2020 		},
2021 	}
2022 };
2023 
2024 static struct dvb_usb_device_properties cxusb_d680_dmb_properties = {
2025 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
2026 
2027 	.usb_ctrl         = CYPRESS_FX2,
2028 
2029 	.size_of_priv     = sizeof(struct cxusb_state),
2030 
2031 	.num_adapters = 1,
2032 	.adapter = {
2033 		{
2034 		.num_frontends = 1,
2035 		.fe = {{
2036 			.streaming_ctrl   = cxusb_d680_dmb_streaming_ctrl,
2037 			.frontend_attach  = cxusb_d680_dmb_frontend_attach,
2038 			.tuner_attach     = cxusb_d680_dmb_tuner_attach,
2039 
2040 			/* parameter for the MPEG2-data transfer */
2041 			.stream = {
2042 				.type = USB_BULK,
2043 				.count = 5,
2044 				.endpoint = 0x02,
2045 				.u = {
2046 					.bulk = {
2047 						.buffersize = 8192,
2048 					}
2049 				}
2050 			},
2051 		}},
2052 		},
2053 	},
2054 
2055 	.power_ctrl       = cxusb_d680_dmb_power_ctrl,
2056 
2057 	.i2c_algo         = &cxusb_i2c_algo,
2058 
2059 	.generic_bulk_ctrl_endpoint = 0x01,
2060 
2061 	.rc.core = {
2062 		.rc_interval	= 100,
2063 		.rc_codes	= RC_MAP_TOTAL_MEDIA_IN_HAND_02,
2064 		.module_name	= KBUILD_MODNAME,
2065 		.rc_query       = cxusb_d680_dmb_rc_query,
2066 		.allowed_protos = RC_PROTO_BIT_UNKNOWN,
2067 	},
2068 
2069 	.num_device_descs = 1,
2070 	.devices = {
2071 		{
2072 			"Conexant DMB-TH Stick",
2073 			{ NULL },
2074 			{ &cxusb_table[CONEXANT_D680_DMB], NULL },
2075 		},
2076 	}
2077 };
2078 
2079 static struct dvb_usb_device_properties cxusb_mygica_d689_properties = {
2080 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
2081 
2082 	.usb_ctrl         = CYPRESS_FX2,
2083 
2084 	.size_of_priv     = sizeof(struct cxusb_state),
2085 
2086 	.num_adapters = 1,
2087 	.adapter = {
2088 		{
2089 		.num_frontends = 1,
2090 		.fe = {{
2091 			.streaming_ctrl   = cxusb_d680_dmb_streaming_ctrl,
2092 			.frontend_attach  = cxusb_mygica_d689_frontend_attach,
2093 			.tuner_attach     = cxusb_mygica_d689_tuner_attach,
2094 
2095 			/* parameter for the MPEG2-data transfer */
2096 			.stream = {
2097 				.type = USB_BULK,
2098 				.count = 5,
2099 				.endpoint = 0x02,
2100 				.u = {
2101 					.bulk = {
2102 						.buffersize = 8192,
2103 					}
2104 				}
2105 			},
2106 		}},
2107 		},
2108 	},
2109 
2110 	.power_ctrl       = cxusb_d680_dmb_power_ctrl,
2111 
2112 	.i2c_algo         = &cxusb_i2c_algo,
2113 
2114 	.generic_bulk_ctrl_endpoint = 0x01,
2115 
2116 	.rc.core = {
2117 		.rc_interval	= 100,
2118 		.rc_codes	= RC_MAP_D680_DMB,
2119 		.module_name	= KBUILD_MODNAME,
2120 		.rc_query       = cxusb_d680_dmb_rc_query,
2121 		.allowed_protos = RC_PROTO_BIT_UNKNOWN,
2122 	},
2123 
2124 	.num_device_descs = 1,
2125 	.devices = {
2126 		{
2127 			"Mygica D689 DMB-TH",
2128 			{ NULL },
2129 			{ &cxusb_table[MYGICA_D689], NULL },
2130 		},
2131 	}
2132 };
2133 
2134 static struct dvb_usb_device_properties cxusb_mygica_t230_properties = {
2135 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
2136 
2137 	.usb_ctrl         = CYPRESS_FX2,
2138 
2139 	.size_of_priv     = sizeof(struct cxusb_state),
2140 
2141 	.num_adapters = 1,
2142 	.adapter = {
2143 		{
2144 		.num_frontends = 1,
2145 		.fe = {{
2146 			.streaming_ctrl   = cxusb_streaming_ctrl,
2147 			.frontend_attach  = cxusb_mygica_t230_frontend_attach,
2148 
2149 			/* parameter for the MPEG2-data transfer */
2150 			.stream = {
2151 				.type = USB_BULK,
2152 				.count = 5,
2153 				.endpoint = 0x02,
2154 				.u = {
2155 					.bulk = {
2156 						.buffersize = 8192,
2157 					}
2158 				}
2159 			},
2160 		} },
2161 		},
2162 	},
2163 
2164 	.power_ctrl       = cxusb_d680_dmb_power_ctrl,
2165 
2166 	.i2c_algo         = &cxusb_i2c_algo,
2167 
2168 	.generic_bulk_ctrl_endpoint = 0x01,
2169 
2170 	.rc.core = {
2171 		.rc_interval	= 100,
2172 		.rc_codes	= RC_MAP_D680_DMB,
2173 		.module_name	= KBUILD_MODNAME,
2174 		.rc_query       = cxusb_d680_dmb_rc_query,
2175 		.allowed_protos = RC_PROTO_BIT_UNKNOWN,
2176 	},
2177 
2178 	.num_device_descs = 1,
2179 	.devices = {
2180 		{
2181 			"Mygica T230 DVB-T/T2/C",
2182 			{ NULL },
2183 			{ &cxusb_table[MYGICA_T230], NULL },
2184 		},
2185 	}
2186 };
2187 
2188 static struct usb_driver cxusb_driver = {
2189 	.name		= "dvb_usb_cxusb",
2190 	.probe		= cxusb_probe,
2191 	.disconnect     = cxusb_disconnect,
2192 	.id_table	= cxusb_table,
2193 };
2194 
2195 module_usb_driver(cxusb_driver);
2196 
2197 MODULE_AUTHOR("Patrick Boettcher <patrick.boettcher@posteo.de>");
2198 MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
2199 MODULE_AUTHOR("Chris Pascoe <c.pascoe@itee.uq.edu.au>");
2200 MODULE_DESCRIPTION("Driver for Conexant USB2.0 hybrid reference design");
2201 MODULE_VERSION("1.0-alpha");
2202 MODULE_LICENSE("GPL");
2203