28 #include <linux/slab.h>
47 static int dvb_usb_cxusb_debug;
53 #define deb_info(args...) dprintk(dvb_usb_cxusb_debug, 0x03, args)
54 #define deb_i2c(args...) dprintk(dvb_usb_cxusb_debug, 0x02, args)
57 u8 cmd,
u8 *wbuf,
int wlen,
u8 *rbuf,
int rlen)
59 int wo = (rbuf ==
NULL || rlen == 0);
64 memcpy(&sndbuf[1], wbuf, wlen);
96 o[0] = 0xff & ~changemask;
97 o[1] = newval & changemask;
100 if (rc < 0 || (gpio_state & changemask) != (newval & changemask))
101 deb_info(
"bluebird_gpio_write failed.\n");
103 return rc < 0 ? rc : gpio_state;
108 cxusb_bluebird_gpio_rw(d, pin, low ? 0 : pin);
110 cxusb_bluebird_gpio_rw(d, pin, low ? pin : 0);
115 cxusb_bluebird_gpio_rw(d, 0x40, onoff ? 0 : 0x40);
147 for (i = 0; i < num; i++) {
150 switch (msg[i].addr) {
152 cxusb_gpio_tuner(d, 0);
155 cxusb_gpio_tuner(d, 1);
161 u8 obuf[3], ibuf[1+msg[
i].
len];
163 obuf[1] = msg[
i].len;
164 obuf[2] = msg[
i].addr;
167 ibuf, 1+msg[i].len) < 0) {
168 warn(
"i2c read failed");
171 memcpy(msg[i].
buf, &ibuf[1], msg[i].len);
172 }
else if (i+1 < num && (msg[i+1].
flags & I2C_M_RD) &&
173 msg[i].addr == msg[i+1].addr) {
175 u8 obuf[3+msg[
i].len], ibuf[1+msg[i+1].len];
176 obuf[0] = msg[
i].len;
177 obuf[1] = msg[i+1].len;
178 obuf[2] = msg[
i].addr;
179 memcpy(&obuf[3], msg[i].
buf, msg[i].len);
183 ibuf, 1+msg[i+1].len) < 0)
187 deb_i2c(
"i2c read may have failed\n");
189 memcpy(msg[i+1].
buf, &ibuf[1], msg[i+1].len);
194 u8 obuf[2+msg[
i].len], ibuf;
195 obuf[0] = msg[
i].addr;
196 obuf[1] = msg[
i].len;
197 memcpy(&obuf[2], msg[i].
buf, msg[i].len);
200 2+msg[i].len, &ibuf,1) < 0)
203 deb_i2c(
"i2c write may have failed\n");
217 .master_xfer = cxusb_i2c_xfer,
218 .functionality = cxusb_i2c_func,
230 static int cxusb_aver_power_ctrl(
struct dvb_usb_device *d,
int onoff)
237 err(
"set interface failed");
239 !(ret = cxusb_ctrl_msg(d, 0x15,
NULL, 0,
NULL, 0)) &&
240 !(ret = cxusb_ctrl_msg(d, 0x17,
NULL, 0,
NULL, 0)) && 0);
246 0x0e, 0x2, 0x00, 0x7f,
247 0x0e, 0x2, 0x02, 0xfe,
248 0x0e, 0x2, 0x02, 0x01,
249 0x0e, 0x2, 0x00, 0x03,
250 0x0e, 0x2, 0x0d, 0x40,
251 0x0e, 0x2, 0x0e, 0x87,
252 0x0e, 0x2, 0x0f, 0x8e,
253 0x0e, 0x2, 0x10, 0x01,
254 0x0e, 0x2, 0x14, 0xd7,
255 0x0e, 0x2, 0x47, 0x88,
258 for (i = 0; i <
sizeof(
bufs)/
sizeof(
u8); i += 4/
sizeof(
u8)) {
270 static int cxusb_bluebird_power_ctrl(
struct dvb_usb_device *d,
int onoff)
279 static int cxusb_nano2_power_ctrl(
struct dvb_usb_device *d,
int onoff)
283 rc = cxusb_power_ctrl(d, onoff);
285 cxusb_nano2_led(d, 0);
290 static int cxusb_d680_dmb_power_ctrl(
struct dvb_usb_device *d,
int onoff)
294 ret = cxusb_power_ctrl(d, onoff);
304 static int cxusb_streaming_ctrl(
struct dvb_usb_adapter *adap,
int onoff)
306 u8 buf[2] = { 0x03, 0x00 };
315 static int cxusb_aver_streaming_ctrl(
struct dvb_usb_adapter *adap,
int onoff)
325 static void cxusb_d680_dmb_drain_message(
struct dvb_usb_device *d)
327 int ep = d->
props.generic_bulk_ctrl_endpoint;
329 const int junk_len = 32;
339 usb_rcvbulkpipe(d->
udev, ep),
340 junk, junk_len, &rd_count, timeout) < 0)
351 const int timeout = 100;
352 const int junk_len = p->
u.
bulk.buffersize;
363 junk, junk_len, &rd_count, timeout) < 0)
371 static int cxusb_d680_dmb_streaming_ctrl(
375 u8 buf[2] = { 0x03, 0x00 };
376 cxusb_d680_dmb_drain_video(adap->
dev);
378 buf,
sizeof(buf),
NULL, 0);
380 int ret = cxusb_ctrl_msg(adap->
dev,
397 for (i = 0; i < d->
props.rc.legacy.rc_map_size; i++) {
398 if (rc5_custom(&keymap[i]) == ircode[2] &&
399 rc5_data(&keymap[i]) == ircode[3]) {
417 .buf = ircode, .len = 4 };
422 if (cxusb_i2c_xfer(&d->
i2c_adap, &msg, 1) != 1)
425 for (i = 0; i < d->
props.rc.legacy.rc_map_size; i++) {
426 if (rc5_custom(&keymap[i]) == ircode[1] &&
427 rc5_data(&keymap[i]) == ircode[2]) {
448 if (cxusb_ctrl_msg(d, 0x10,
NULL, 0, ircode, 2) < 0)
451 for (i = 0; i < d->
props.rc.legacy.rc_map_size; i++) {
452 if (rc5_custom(&keymap[i]) == ircode[0] &&
453 rc5_data(&keymap[i]) == ircode[1]) {
512 static struct rc_map_table rc_map_dvico_portable_table[] = {
589 static int cxusb_dee1601_demod_init(
struct dvb_frontend* fe)
591 static u8 clock_config [] = {
CLOCK_CTL, 0x38, 0x28 };
595 static u8 gpp_ctl_cfg [] = {
GPP_CTL, 0x33 };
598 mt352_write(fe, clock_config,
sizeof(clock_config));
600 mt352_write(fe, reset,
sizeof(reset));
601 mt352_write(fe, adc_ctl_1_cfg,
sizeof(adc_ctl_1_cfg));
603 mt352_write(fe, agc_cfg,
sizeof(agc_cfg));
604 mt352_write(fe, gpp_ctl_cfg,
sizeof(gpp_ctl_cfg));
605 mt352_write(fe, capt_range_cfg,
sizeof(capt_range_cfg));
610 static int cxusb_mt352_demod_init(
struct dvb_frontend* fe)
612 static u8 clock_config [] = {
CLOCK_CTL, 0x38, 0x29 };
613 static u8 reset [] = {
RESET, 0x80 };
616 static u8 gpp_ctl_cfg [] = {
GPP_CTL, 0x33 };
619 mt352_write(fe, clock_config,
sizeof(clock_config));
621 mt352_write(fe, reset,
sizeof(reset));
622 mt352_write(fe, adc_ctl_1_cfg,
sizeof(adc_ctl_1_cfg));
624 mt352_write(fe, agc_cfg,
sizeof(agc_cfg));
625 mt352_write(fe, gpp_ctl_cfg,
sizeof(gpp_ctl_cfg));
626 mt352_write(fe, capt_range_cfg,
sizeof(capt_range_cfg));
631 .demod_address = 0x63,
636 .demod_address = 0x0e,
641 .demod_address = 0x0e,
643 .clock_polarity_flip = 2,
647 .demod_address = 0x0f,
648 .demod_init = cxusb_dee1601_demod_init,
652 .demod_address = 0x0f,
658 .demod_address = 0x0f,
659 .demod_init = cxusb_mt352_demod_init,
663 .demod_address = 0x0f,
669 static struct zl10353_config cxusb_zl10353_xc3028_config_no_i2c_gate = {
670 .demod_address = 0x0f,
674 .disable_i2c_gate_ctrl = 1,
677 static struct mt352_config cxusb_mt352_xc3028_config = {
678 .demod_address = 0x0f,
681 .demod_init = cxusb_mt352_demod_init,
687 .if_freq = 6000000
UL,
699 .AgcMasterByte = 0x00,
705 .if_freq = 36125000
UL,
717 .AgcMasterByte = 0x00,
729 &adap->
dev->i2c_adap, 0x61,
730 TUNER_PHILIPS_FMD1216ME_MK3);
757 &adap->
dev->i2c_adap, 0x61, TUNER_LG_TDVS_H06XF);
761 static int dvico_bluebird_xc2028_callback(
void *
ptr,
int component,
769 deb_info(
"%s: XC2028_TUNER_RESET %d\n", __func__, arg);
770 cxusb_bluebird_gpio_pulse(d, 0x01, 1);
773 deb_info(
"%s: XC2028_RESET_CLK %d\n", __func__, arg);
776 deb_info(
"%s: unknown command %d, arg %d\n", __func__,
784 static int cxusb_dvico_xc3028_tuner_attach(
struct dvb_usb_adapter *adap)
788 .i2c_adap = &adap->
dev->i2c_adap,
798 adap->
fe_adap[0].fe->callback = dvico_bluebird_xc2028_callback;
801 if (fe ==
NULL || fe->
ops.tuner_ops.set_config ==
NULL)
804 fe->
ops.tuner_ops.set_config(fe, &ctl);
812 &adap->
dev->i2c_adap, &aver_a868r_tuner);
820 &adap->
dev->i2c_adap, &d680_dmb_tuner);
821 return (fe ==
NULL) ? -
EIO : 0;
824 static int cxusb_mygica_d689_tuner_attach(
struct dvb_usb_adapter *adap)
828 &adap->
dev->i2c_adap, &mygica_d689_max2165_cfg);
829 return (fe ==
NULL) ? -
EIO : 0;
836 err(
"set interface failed");
841 &adap->
dev->i2c_adap);
848 static int cxusb_lgdt3303_frontend_attach(
struct dvb_usb_adapter *adap)
851 err(
"set interface failed");
856 &cxusb_lgdt3303_config,
857 &adap->
dev->i2c_adap);
864 static int cxusb_aver_lgdt3303_frontend_attach(
struct dvb_usb_adapter *adap)
867 &adap->
dev->i2c_adap);
878 err(
"set interface failed");
883 &adap->
dev->i2c_adap);
893 err(
"set interface failed");
898 &adap->
dev->i2c_adap);
903 &cxusb_zl10353_dee1601_config,
904 &adap->
dev->i2c_adap);
911 static int cxusb_dualdig4_frontend_attach(
struct dvb_usb_adapter *adap)
916 .buf = ircode, .len = 4 };
919 err(
"set interface failed");
924 cxusb_bluebird_gpio_rw(adap->
dev, 0x04, 0);
925 cxusb_bluebird_gpio_pulse(adap->
dev, 0x01, 1);
926 cxusb_bluebird_gpio_pulse(adap->
dev, 0x02, 1);
930 &cxusb_zl10353_xc3028_config_no_i2c_gate,
931 &adap->
dev->i2c_adap);
936 for (i = 0; adap->
dev->props.rc.legacy.rc_map_table !=
NULL && i < 5; i++) {
938 if (cxusb_i2c_xfer(&adap->
dev->i2c_adap, &msg, 1) != 1)
940 if (ircode[0] == 0 && ircode[1] == 0)
942 if (ircode[2] + ircode[3] != 0xff) {
944 adap->
dev->props.rc.legacy.rc_map_table =
NULL;
945 info(
"No IR receiver detected on this device.");
961 .setup = (0 << 15) | (0 << 14) | (5 << 11) | (0 << 10) | (0 << 9) |
962 (0 << 8) | (3 << 5) | (0 << 4) | (5 << 1) | (0 << 0),
988 .perform_agc_softsplit = 0,
1001 .IO_CLK_en_core = 1,
1005 .sad_cfg = (3 << 14) | (1 << 12) | (524 << 0),
1006 .
ifreq = (0 << 25) | 0,
1008 .xtal_hz = 12000000,
1013 .output_mpeg2_in_188_bytes = 1,
1015 .agc_config_count = 1,
1016 .agc = &dib7070_agc_config,
1017 .bw = &dib7070_bw_config_12_mhz,
1018 .tuner_is_baseband = 1,
1026 .hostbus_diversity = 1,
1029 static int cxusb_dualdig4_rev2_frontend_attach(
struct dvb_usb_adapter *adap)
1032 err(
"set interface failed");
1036 cxusb_bluebird_gpio_pulse(adap->
dev, 0x02, 1);
1039 &cxusb_dualdig4_rev2_config) < 0) {
1045 &cxusb_dualdig4_rev2_config);
1052 static int dib7070_tuner_reset(
struct dvb_frontend *fe,
int onoff)
1057 static int dib7070_tuner_sleep(
struct dvb_frontend *fe,
int onoff)
1064 .reset = dib7070_tuner_reset,
1065 .sleep = dib7070_tuner_sleep,
1073 static int dib7070_set_param_override(
struct dvb_frontend *fe)
1082 case BAND_VHF: offset = 950;
break;
1084 case BAND_UHF: offset = 550;
break;
1092 static int cxusb_dualdig4_rev2_tuner_attach(
struct dvb_usb_adapter *adap)
1100 &dib7070p_dib0070_config) ==
NULL)
1104 adap->
fe_adap[0].fe->ops.tuner_ops.set_params = dib7070_set_param_override;
1111 err(
"set interface failed");
1116 cxusb_bluebird_gpio_rw(adap->
dev, 0x04, 0);
1117 cxusb_bluebird_gpio_pulse(adap->
dev, 0x01, 1);
1118 cxusb_bluebird_gpio_pulse(adap->
dev, 0x02, 1);
1121 &cxusb_zl10353_xc3028_config,
1122 &adap->
dev->i2c_adap);
1127 &cxusb_mt352_xc3028_config,
1128 &adap->
dev->i2c_adap);
1137 .demod_address = 0x19,
1141 .if_clk_freq = 30400,
1149 static int cxusb_d680_dmb_frontend_attach(
struct dvb_usb_adapter *adap)
1156 err(
"set interface failed");
1160 usb_sndbulkpipe(d->
udev, d->
props.generic_bulk_ctrl_endpoint));
1162 usb_rcvbulkpipe(d->
udev, d->
props.generic_bulk_ctrl_endpoint));
1164 usb_rcvbulkpipe(d->
udev, d->
props.adapter[0].fe[0].stream.endpoint));
1167 for (n = 0; n < 5; n++) {
1168 cxusb_d680_dmb_drain_message(d);
1169 cxusb_d680_dmb_drain_video(d);
1174 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1175 err(
"clear tuner gpio failed");
1179 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1180 err(
"set tuner gpio failed");
1195 .demod_address = 0x40,
1197 .ts_sampling_edge = 1,
1199 .osc_clk_freq = 30400,
1207 static int cxusb_mygica_d689_frontend_attach(
struct dvb_usb_adapter *adap)
1213 err(
"set interface failed");
1217 usb_sndbulkpipe(d->
udev, d->
props.generic_bulk_ctrl_endpoint));
1219 usb_rcvbulkpipe(d->
udev, d->
props.generic_bulk_ctrl_endpoint));
1221 usb_rcvbulkpipe(d->
udev, d->
props.adapter[0].fe[0].stream.endpoint));
1225 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 0) < 0) {
1226 err(
"clear tuner gpio failed");
1230 if (cxusb_d680_dmb_gpio_tuner(d, 0x07, 1) < 0) {
1231 err(
"set tuner gpio failed");
1251 static int bluebird_fx2_identify_state(
struct usb_device *
udev,
1256 int wascold = *cold;
1258 *cold = udev->descriptor.bDeviceClass == 0xff &&
1259 udev->descriptor.bDeviceSubClass == 0xff &&
1260 udev->descriptor.bDeviceProtocol == 0xff;
1262 if (*cold && !wascold)
1273 static const int dvico_firmware_id_offsets[] = { 6638, 3204 };
1274 static int bluebird_patch_dvico_firmware_download(
struct usb_device *udev,
1279 for (pos = 0; pos <
ARRAY_SIZE(dvico_firmware_id_offsets); pos++) {
1280 int idoff = dvico_firmware_id_offsets[
pos];
1282 if (fw->
size < idoff + 4)
1295 new_fw.size = fw->
size;
1296 new_fw.data = new_fw_data;
1298 new_fw_data[idoff + 2] =
1300 new_fw_data[idoff + 3] =
1345 &cxusb_bluebird_nano2_needsfirmware_properties,
1350 &cxusb_bluebird_dualdig4_rev2_properties,
1399 .streaming_ctrl = cxusb_streaming_ctrl,
1400 .frontend_attach = cxusb_cx22702_frontend_attach,
1401 .tuner_attach = cxusb_fmd1216me_tuner_attach,
1416 .power_ctrl = cxusb_power_ctrl,
1418 .i2c_algo = &cxusb_i2c_algo,
1420 .generic_bulk_ctrl_endpoint = 0x01,
1422 .num_device_descs = 1,
1424 {
"Medion MD95700 (MDUSBTV-HYBRID)",
1426 { &cxusb_table[0],
NULL },
1435 .firmware =
"dvb-usb-bluebird-01.fw",
1436 .download_firmware = bluebird_patch_dvico_firmware_download,
1447 .streaming_ctrl = cxusb_streaming_ctrl,
1448 .frontend_attach = cxusb_lgdt3303_frontend_attach,
1449 .tuner_attach = cxusb_lgh064f_tuner_attach,
1466 .power_ctrl = cxusb_bluebird_power_ctrl,
1468 .i2c_algo = &cxusb_i2c_algo,
1472 .rc_map_table = rc_map_dvico_portable_table,
1473 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_portable_table),
1474 .rc_query = cxusb_rc_query,
1477 .generic_bulk_ctrl_endpoint = 0x01,
1479 .num_device_descs = 1,
1481 {
"DViCO FusionHDTV5 USB Gold",
1482 { &cxusb_table[1],
NULL },
1483 { &cxusb_table[2],
NULL },
1492 .firmware =
"dvb-usb-bluebird-01.fw",
1493 .download_firmware = bluebird_patch_dvico_firmware_download,
1504 .streaming_ctrl = cxusb_streaming_ctrl,
1505 .frontend_attach = cxusb_dee1601_frontend_attach,
1506 .tuner_attach = cxusb_dee1601_tuner_attach,
1522 .power_ctrl = cxusb_bluebird_power_ctrl,
1524 .i2c_algo = &cxusb_i2c_algo,
1528 .rc_map_table = rc_map_dvico_mce_table,
1529 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_mce_table),
1530 .rc_query = cxusb_rc_query,
1533 .generic_bulk_ctrl_endpoint = 0x01,
1535 .num_device_descs = 3,
1537 {
"DViCO FusionHDTV DVB-T Dual USB",
1538 { &cxusb_table[3],
NULL },
1539 { &cxusb_table[4],
NULL },
1541 {
"DigitalNow DVB-T Dual USB",
1542 { &cxusb_table[9],
NULL },
1543 { &cxusb_table[10],
NULL },
1545 {
"DViCO FusionHDTV DVB-T Dual Digital 2",
1546 { &cxusb_table[11],
NULL },
1547 { &cxusb_table[12],
NULL },
1556 .firmware =
"dvb-usb-bluebird-01.fw",
1557 .download_firmware = bluebird_patch_dvico_firmware_download,
1568 .streaming_ctrl = cxusb_streaming_ctrl,
1569 .frontend_attach = cxusb_mt352_frontend_attach,
1570 .tuner_attach = cxusb_lgz201_tuner_attach,
1586 .power_ctrl = cxusb_bluebird_power_ctrl,
1588 .i2c_algo = &cxusb_i2c_algo,
1592 .rc_map_table = rc_map_dvico_portable_table,
1593 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_portable_table),
1594 .rc_query = cxusb_rc_query,
1597 .generic_bulk_ctrl_endpoint = 0x01,
1598 .num_device_descs = 1,
1600 {
"DViCO FusionHDTV DVB-T USB (LGZ201)",
1601 { &cxusb_table[5],
NULL },
1602 { &cxusb_table[6],
NULL },
1611 .firmware =
"dvb-usb-bluebird-01.fw",
1612 .download_firmware = bluebird_patch_dvico_firmware_download,
1623 .streaming_ctrl = cxusb_streaming_ctrl,
1624 .frontend_attach = cxusb_mt352_frontend_attach,
1625 .tuner_attach = cxusb_dtt7579_tuner_attach,
1641 .power_ctrl = cxusb_bluebird_power_ctrl,
1643 .i2c_algo = &cxusb_i2c_algo,
1647 .rc_map_table = rc_map_dvico_portable_table,
1648 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_portable_table),
1649 .rc_query = cxusb_rc_query,
1652 .generic_bulk_ctrl_endpoint = 0x01,
1654 .num_device_descs = 1,
1656 {
"DViCO FusionHDTV DVB-T USB (TH7579)",
1657 { &cxusb_table[7],
NULL },
1658 { &cxusb_table[8],
NULL },
1675 .streaming_ctrl = cxusb_streaming_ctrl,
1676 .frontend_attach = cxusb_dualdig4_frontend_attach,
1677 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1693 .power_ctrl = cxusb_power_ctrl,
1695 .i2c_algo = &cxusb_i2c_algo,
1697 .generic_bulk_ctrl_endpoint = 0x01,
1701 .rc_map_table = rc_map_dvico_mce_table,
1702 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_mce_table),
1703 .rc_query = cxusb_bluebird2_rc_query,
1706 .num_device_descs = 1,
1708 {
"DViCO FusionHDTV DVB-T Dual Digital 4",
1710 { &cxusb_table[13],
NULL },
1719 .identify_state = bluebird_fx2_identify_state,
1728 .streaming_ctrl = cxusb_streaming_ctrl,
1729 .frontend_attach = cxusb_nano2_frontend_attach,
1730 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1746 .power_ctrl = cxusb_nano2_power_ctrl,
1748 .i2c_algo = &cxusb_i2c_algo,
1750 .generic_bulk_ctrl_endpoint = 0x01,
1754 .rc_map_table = rc_map_dvico_portable_table,
1755 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_portable_table),
1756 .rc_query = cxusb_bluebird2_rc_query,
1759 .num_device_descs = 1,
1761 {
"DViCO FusionHDTV DVB-T NANO2",
1763 { &cxusb_table[14],
NULL },
1772 .firmware =
"dvb-usb-bluebird-02.fw",
1773 .download_firmware = bluebird_patch_dvico_firmware_download,
1774 .identify_state = bluebird_fx2_identify_state,
1783 .streaming_ctrl = cxusb_streaming_ctrl,
1784 .frontend_attach = cxusb_nano2_frontend_attach,
1785 .tuner_attach = cxusb_dvico_xc3028_tuner_attach,
1801 .power_ctrl = cxusb_nano2_power_ctrl,
1803 .i2c_algo = &cxusb_i2c_algo,
1805 .generic_bulk_ctrl_endpoint = 0x01,
1809 .rc_map_table = rc_map_dvico_portable_table,
1810 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_portable_table),
1811 .rc_query = cxusb_rc_query,
1814 .num_device_descs = 1,
1816 {
"DViCO FusionHDTV DVB-T NANO2 w/o firmware",
1817 { &cxusb_table[14],
NULL },
1818 { &cxusb_table[15],
NULL },
1835 .streaming_ctrl = cxusb_aver_streaming_ctrl,
1836 .frontend_attach = cxusb_aver_lgdt3303_frontend_attach,
1837 .tuner_attach = cxusb_mxl5003s_tuner_attach,
1852 .power_ctrl = cxusb_aver_power_ctrl,
1854 .i2c_algo = &cxusb_i2c_algo,
1856 .generic_bulk_ctrl_endpoint = 0x01,
1858 .num_device_descs = 1,
1860 {
"AVerMedia AVerTVHD Volar (A868R)",
1862 { &cxusb_table[16],
NULL },
1881 .streaming_ctrl = cxusb_streaming_ctrl,
1882 .frontend_attach = cxusb_dualdig4_rev2_frontend_attach,
1883 .tuner_attach = cxusb_dualdig4_rev2_tuner_attach,
1899 .power_ctrl = cxusb_bluebird_power_ctrl,
1901 .i2c_algo = &cxusb_i2c_algo,
1903 .generic_bulk_ctrl_endpoint = 0x01,
1907 .rc_map_table = rc_map_dvico_mce_table,
1908 .rc_map_size =
ARRAY_SIZE(rc_map_dvico_mce_table),
1909 .rc_query = cxusb_rc_query,
1912 .num_device_descs = 1,
1914 {
"DViCO FusionHDTV DVB-T Dual Digital 4 (rev 2)",
1916 { &cxusb_table[17],
NULL },
1933 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1934 .frontend_attach = cxusb_d680_dmb_frontend_attach,
1935 .tuner_attach = cxusb_d680_dmb_tuner_attach,
1952 .power_ctrl = cxusb_d680_dmb_power_ctrl,
1954 .i2c_algo = &cxusb_i2c_algo,
1956 .generic_bulk_ctrl_endpoint = 0x01,
1960 .rc_map_table = rc_map_d680_dmb_table,
1961 .rc_map_size =
ARRAY_SIZE(rc_map_d680_dmb_table),
1962 .rc_query = cxusb_d680_dmb_rc_query,
1965 .num_device_descs = 1,
1968 "Conexant DMB-TH Stick",
1970 { &cxusb_table[18],
NULL },
1987 .streaming_ctrl = cxusb_d680_dmb_streaming_ctrl,
1988 .frontend_attach = cxusb_mygica_d689_frontend_attach,
1989 .tuner_attach = cxusb_mygica_d689_tuner_attach,
2006 .power_ctrl = cxusb_d680_dmb_power_ctrl,
2008 .i2c_algo = &cxusb_i2c_algo,
2010 .generic_bulk_ctrl_endpoint = 0x01,
2014 .rc_map_table = rc_map_d680_dmb_table,
2015 .rc_map_size =
ARRAY_SIZE(rc_map_d680_dmb_table),
2016 .rc_query = cxusb_d680_dmb_rc_query,
2019 .num_device_descs = 1,
2022 "Mygica D689 DMB-TH",
2024 { &cxusb_table[19],
NULL },
2029 static struct usb_driver cxusb_driver = {
2030 .name =
"dvb_usb_cxusb",
2031 .probe = cxusb_probe,
2033 .id_table = cxusb_table,