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