31 #ifndef USB_PID_DW2102
32 #define USB_PID_DW2102 0x2102
35 #ifndef USB_PID_DW2104
36 #define USB_PID_DW2104 0x2104
39 #ifndef USB_PID_DW3101
40 #define USB_PID_DW3101 0x3101
43 #ifndef USB_PID_CINERGY_S
44 #define USB_PID_CINERGY_S 0x0064
47 #ifndef USB_PID_TEVII_S630
48 #define USB_PID_TEVII_S630 0xd630
51 #ifndef USB_PID_TEVII_S650
52 #define USB_PID_TEVII_S650 0xd650
55 #ifndef USB_PID_TEVII_S660
56 #define USB_PID_TEVII_S660 0xd660
59 #ifndef USB_PID_TEVII_S480_1
60 #define USB_PID_TEVII_S480_1 0xd481
63 #ifndef USB_PID_TEVII_S480_2
64 #define USB_PID_TEVII_S480_2 0xd482
67 #ifndef USB_PID_PROF_1100
68 #define USB_PID_PROF_1100 0xb012
71 #define DW210X_READ_MSG 0
72 #define DW210X_WRITE_MSG 1
74 #define REG_1F_SYMBOLRATE_BYTE0 0x1f
75 #define REG_20_SYMBOLRATE_BYTE1 0x20
76 #define REG_21_SYMBOLRATE_BYTE2 0x21
78 #define DW2102_VOLTAGE_CTRL (0x1800)
79 #define SU3000_STREAM_CTRL (0x1900)
80 #define DW2102_RC_QUERY (0x1a00)
81 #define DW2102_LED_CTRL (0x1b00)
83 #define err_str "did not find the firmware file. (%s) " \
84 "Please see linux/Documentation/dvb/ for more details " \
85 "on firmware-problems."
101 static int dvb_usb_dw2102_debug;
107 static int ir_keymap;
109 MODULE_PARM_DESC(keymap,
"set keymap 0=default 1=dvbworld 2=tevii 3=tbs ..."
113 static int demod_probe = 1;
116 "4=stv0903+stb6100(or-able)).");
126 usb_rcvctrlpipe(dev, 0) : usb_sndctrlpipe(dev, 0);
137 value, index , u8buf, len, 2000);
152 u8 buf6[] = {0x2c, 0x05, 0xc0, 0, 0, 0, 0};
163 value = msg[0].
buf[0];
164 for (i = 0; i < msg[1].
len; i++) {
165 dw210x_op_rw(d->
udev, 0xb5, value + i, 0,
167 msg[1].
buf[
i] = buf6[0];
171 switch (msg[0].
addr) {
175 buf6[1] = msg[0].
buf[0];
176 buf6[2] = msg[0].
buf[1];
177 dw210x_op_rw(d->
udev, 0xb2, 0, 0,
181 if (msg[0].flags == 0) {
186 buf6[3] = msg[0].
buf[0];
187 buf6[4] = msg[0].
buf[1];
188 buf6[5] = msg[0].
buf[2];
189 buf6[6] = msg[0].
buf[3];
190 dw210x_op_rw(d->
udev, 0xb2, 0, 0,
194 dw210x_op_rw(d->
udev, 0xb5, 0, 0,
196 msg[0].
buf[0] = buf6[0];
200 dw210x_op_rw(d->
udev, 0xb8, 0, 0,
202 msg[0].
buf[0] = buf6[0];
203 msg[0].
buf[1] = buf6[1];
207 buf6[1] = msg[0].
buf[0];
208 dw210x_op_rw(d->
udev, 0xb2, 0, 0,
220 static int dw2102_serit_i2c_transfer(
struct i2c_adapter *adap,
224 u8 buf6[] = {0, 0, 0, 0, 0, 0, 0};
234 buf6[0] = msg[0].
addr << 1;
235 buf6[1] = msg[0].
len;
236 buf6[2] = msg[0].
buf[0];
237 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
240 dw210x_op_rw(d->
udev, 0xc3, 0xd0, 0,
242 memcpy(msg[1].
buf, buf6 + 2, msg[1].len);
246 switch (msg[0].addr) {
249 buf6[0] = msg[0].
addr << 1;
250 buf6[1] = msg[0].
len;
251 memcpy(buf6 + 2, msg[0].
buf, msg[0].len);
252 dw210x_op_rw(d->
udev, 0xc2, 0, 0, buf6,
256 dw210x_op_rw(d->
udev, 0xb8, 0, 0,
258 msg[0].
buf[0] = buf6[0];
259 msg[0].
buf[1] = buf6[1];
263 buf6[1] = msg[0].
buf[0];
264 dw210x_op_rw(d->
udev, 0xb2, 0, 0,
275 static int dw2102_earda_i2c_transfer(
struct i2c_adapter *adap,
struct i2c_msg msg[],
int num)
288 u8 ibuf[msg[1].
len + 2], obuf[3];
289 obuf[0] = msg[0].addr << 1;
290 obuf[1] = msg[0].len;
291 obuf[2] = msg[0].buf[0];
292 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
295 dw210x_op_rw(d->
udev, 0xc3, 0xd1 , 0,
297 memcpy(msg[1].
buf, ibuf + 2, msg[1].len);
302 switch (msg[0].addr) {
305 u8 obuf[msg[0].
len + 2];
306 obuf[0] = msg[0].addr << 1;
307 obuf[1] = msg[0].len;
308 memcpy(obuf + 2, msg[0].
buf, msg[0].len);
309 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
315 u8 obuf[msg[0].
len + 2];
316 obuf[0] = msg[0].addr << 1;
317 obuf[1] = msg[0].len;
318 memcpy(obuf + 2, msg[0].
buf, msg[0].len);
319 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
325 dw210x_op_rw(d->
udev, 0xb8, 0, 0,
333 obuf[1] = msg[0].
buf[0];
334 dw210x_op_rw(d->
udev, 0xb2, 0, 0,
347 static int dw2104_i2c_transfer(
struct i2c_adapter *adap,
struct i2c_msg msg[],
int num)
357 for (j = 0; j < num; j++) {
358 switch (msg[j].addr) {
361 dw210x_op_rw(d->
udev, 0xb8, 0, 0,
369 obuf[1] = msg[
j].
buf[0];
370 dw210x_op_rw(d->
udev, 0xb2, 0, 0,
382 dw210x_op_rw(d->
udev, 0xc3,
383 (msg[j].addr << 1) + 1, 0,
384 ibuf, msg[j].len + 2,
386 memcpy(msg[j].
buf, ibuf + 2, msg[j].len);
388 }
else if (((msg[j].
buf[0] == 0xb0) &&
389 (msg[j].addr == 0x68)) ||
390 ((msg[j].
buf[0] == 0xf7) &&
391 (msg[j].addr == 0x55))) {
394 obuf[0] = msg[
j].
addr << 1;
395 obuf[1] = (msg[
j].
len > 15 ? 17 : msg[
j].
len);
396 obuf[2] = msg[
j].
buf[0];
397 len = msg[
j].
len - 1;
401 (len > 16 ? 16 : len));
402 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
403 obuf, (len > 16 ? 16 : len) + 3,
411 obuf[0] = msg[
j].addr << 1;
412 obuf[1] = msg[
j].len;
413 memcpy(obuf + 2, msg[j].
buf, msg[j].len);
414 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
415 obuf, msg[j].len + 2,
443 u8 ibuf[msg[1].
len + 2], obuf[3];
444 obuf[0] = msg[0].addr << 1;
445 obuf[1] = msg[0].len;
446 obuf[2] = msg[0].buf[0];
447 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
450 dw210x_op_rw(d->
udev, 0xc3, 0x19 , 0,
452 memcpy(msg[1].
buf, ibuf + 2, msg[1].len);
457 switch (msg[0].addr) {
461 u8 obuf[msg[0].
len + 2];
462 obuf[0] = msg[0].addr << 1;
463 obuf[1] = msg[0].len;
464 memcpy(obuf + 2, msg[0].
buf, msg[0].len);
465 dw210x_op_rw(d->
udev, 0xc2, 0, 0,
471 dw210x_op_rw(d->
udev, 0xb8, 0, 0,
481 for (i = 0; i < num; i++) {
482 deb_xfer(
"%02x:%02x: %s ", i, msg[i].addr,
483 msg[i].flags == 0 ?
">>>" :
"<<<");
495 struct usb_device *
udev;
504 for (j = 0; j < num; j++) {
505 switch (msg[j].addr) {
508 dw210x_op_rw(d->
udev, 0xb8, 0, 0,
517 obuf[1] = msg[
j].
buf[1];
518 dw210x_op_rw(d->
udev, 0x8a, 0, 0,
521 obuf[1] = msg[
j].
buf[0];
522 dw210x_op_rw(d->
udev, 0x8a, 0, 0,
530 obuf[1] = msg[
j].
buf[0];
531 dw210x_op_rw(d->
udev, 0x8a, 0, 0,
544 dw210x_op_rw(d->
udev, 0x91, 0, 0,
549 }
else if ((msg[j].
buf[0] == 0xb0) &&
550 (msg[j].addr == 0x68)) {
553 obuf[0] = (msg[
j].
len > 16 ?
554 18 : msg[
j].
len + 1);
555 obuf[1] = msg[
j].
addr << 1;
556 obuf[2] = msg[
j].
buf[0];
557 len = msg[
j].
len - 1;
561 (len > 16 ? 16 : len));
562 dw210x_op_rw(d->
udev, 0x80, 0, 0,
563 obuf, (len > 16 ? 16 : len) + 3,
568 }
else if (j < (num - 1)) {
571 obuf[0] = msg[j + 1].len;
572 obuf[1] = (msg[
j].addr << 1);
573 memcpy(obuf + 2, msg[j].
buf, msg[j].len);
574 dw210x_op_rw(d->
udev,
575 udev->descriptor.idProduct ==
576 0x7500 ? 0x92 : 0x90, 0, 0,
577 obuf, msg[j].len + 2,
583 obuf[0] = msg[
j].len + 1;
584 obuf[1] = (msg[
j].addr << 1);
585 memcpy(obuf + 2, msg[j].
buf, msg[j].len);
586 dw210x_op_rw(d->
udev, 0x80, 0, 0,
587 obuf, msg[j].len + 2,
604 u8 obuf[0x40], ibuf[0x40];
613 switch (msg[0].addr) {
615 obuf[0] = msg[0].
buf[0] + 0x36;
619 err(
"i2c transfer failed.");
624 err(
"i2c transfer failed.");
625 msg[0].
buf[1] = ibuf[0];
626 msg[0].
buf[0] = ibuf[1];
631 obuf[1] = msg[0].
addr;
632 obuf[2] = msg[0].
len;
634 memcpy(&obuf[3], msg[0].
buf, msg[0].len);
638 err(
"i2c transfer failed.");
645 obuf[1] = msg[0].
len;
646 obuf[2] = msg[1].
len;
647 obuf[3] = msg[0].
addr;
648 memcpy(&obuf[4], msg[0].
buf, msg[0].len);
651 ibuf, msg[1].len + 1, 0) < 0)
652 err(
"i2c transfer failed.");
654 memcpy(msg[1].
buf, &ibuf[1], msg[1].len);
657 warn(
"more than 2 i2c messages at a time is not handled yet.");
670 .master_xfer = dw2102_i2c_transfer,
671 .functionality = dw210x_i2c_func,
675 .master_xfer = dw2102_serit_i2c_transfer,
676 .functionality = dw210x_i2c_func,
680 .master_xfer = dw2102_earda_i2c_transfer,
681 .functionality = dw210x_i2c_func,
685 .master_xfer = dw2104_i2c_transfer,
686 .functionality = dw210x_i2c_func,
690 .master_xfer = dw3101_i2c_transfer,
691 .functionality = dw210x_i2c_func,
695 .master_xfer = s6x0_i2c_transfer,
696 .functionality = dw210x_i2c_func,
700 .master_xfer = su3000_i2c_transfer,
701 .functionality = dw210x_i2c_func,
710 for (i = 0; i < 256; i++) {
712 err(
"read eeprom failed.");
715 eepromline[i%16] = ibuf[0];
718 if ((i % 16) == 15) {
724 memcpy(mac, eeprom + 8, 6);
731 u8 ibuf[] = { 0 }, obuf[] = { 0 };
732 u8 eeprom[256], eepromline[16];
747 for (i = 0; i < 256; i++) {
749 ret = s6x0_i2c_transfer(&d->
i2c_adap, msg, 2);
751 err(
"read eeprom failed.");
754 eepromline[i % 16] = ibuf[0];
758 if ((i % 16) == 15) {
764 memcpy(mac, eeprom + 16, 6);
770 static u8 command_start[] = {0x00};
771 static u8 command_stop[] = {0x01};
775 .buf = onoff ? command_start : command_stop,
787 u8 obuf[] = {0xde, 0};
789 info(
"%s: %d, initialized %d\n", __func__, i,
state->initialized);
791 if (i && !
state->initialized) {
792 state->initialized = 1;
803 u8 obuf[] = { 0x1f, 0xf0 };
820 for (i = 0; i < 6; i++) {
833 static int su3000_identify_state(
struct usb_device *udev,
838 info(
"%s\n", __func__);
846 static u8 command_13v[] = {0x00, 0x01};
847 static u8 command_18v[] = {0x01, 0x01};
848 static u8 command_off[] = {0x00, 0x00};
859 msg.
buf = command_18v;
861 msg.
buf = command_13v;
874 dw210x_set_voltage(fe, voltage);
881 static void dw210x_led_ctrl(
struct dvb_frontend *fe,
int offon)
883 static u8 led_off[] = { 0 };
884 static u8 led_on[] = { 1 };
900 .demod_address = 0x68,
901 .inittab = sharp_z0194a_inittab,
908 .set_symbol_rate = sharp_z0194a_set_symbol_rate,
912 .demod_address = 0x55,
913 .mpg_clk_pos_pol = 0x01,
917 .demod_address = 0x68,
923 .demod_address = 0x0c,
928 .demod_address = 0x0e,
932 .demod_address = 0x68,
936 .demod_address = 0x6a,
947 .tuner_address = 0x60,
948 .refclock = 27000000,
952 .demod_address = 0x68,
969 .demod_address = 0x6a,
978 .set_lock_led = dw210x_led_ctrl,
982 .demod_address = 0x68,
990 if (demod_probe & 4) {
992 &d->
dev->i2c_adap, 0);
995 &dw2104a_stb6100_config,
996 &d->
dev->i2c_adap)) {
997 tuner_ops = &d->
fe_adap[0].fe->ops.tuner_ops;
1002 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1003 info(
"Attached STV0900+STB6100!\n");
1009 if (demod_probe & 2) {
1011 &d->
dev->i2c_adap, 0);
1014 &dw2104_stv6110_config,
1015 &d->
dev->i2c_adap)) {
1016 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1017 info(
"Attached STV0900+STV6110A!\n");
1023 if (demod_probe & 1) {
1027 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1028 info(
"Attached cx24116!\n");
1036 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1037 info(
"Attached DS3000!\n");
1050 if (dw2102_properties.i2c_algo == &dw2102_serit_i2c_algo) {
1055 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1056 info(
"Attached si21xx!\n");
1061 if (dw2102_properties.i2c_algo == &dw2102_earda_i2c_algo) {
1066 &d->
dev->i2c_adap)) {
1067 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1068 info(
"Attached stv0288!\n");
1074 if (dw2102_properties.i2c_algo == &dw2102_i2c_algo) {
1079 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1080 info(
"Attached stv0299!\n");
1090 &d->
dev->i2c_adap, 0x48);
1092 info(
"Attached tda10023!\n");
1104 &d->
dev->i2c_adap)) {
1105 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1106 info(
"Attached zl100313+zl10039!\n");
1127 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1131 info(
"Attached stv0288+stb6000!\n");
1149 d->
fe_adap[0].fe->ops.set_voltage = s660_set_voltage;
1153 info(
"Attached ds3000+ds2020!\n");
1163 &d->
dev->i2c_adap, 0);
1167 d->
fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
1171 info(
"Attached STV0900+STB6100A!\n");
1178 u8 obuf[3] = { 0xe, 0x80, 0 };
1182 err(
"command 0x0e transfer failed.");
1189 err(
"command 0x0e transfer failed.");
1196 err(
"command 0x0e transfer failed.");
1201 err(
"command 0x51 transfer failed.");
1208 info(
"Attached DS3000!\n");
1386 { rc_map_dw210x_table,
ARRAY_SIZE(rc_map_dw210x_table) },
1387 { rc_map_tevii_table,
ARRAY_SIZE(rc_map_tevii_table) },
1388 { rc_map_tbs_table,
ARRAY_SIZE(rc_map_tbs_table) },
1389 { rc_map_su3000_table,
ARRAY_SIZE(rc_map_su3000_table) },
1395 int keymap_size = d->
props.rc.legacy.rc_map_size;
1405 if ((ir_keymap > 0) && (ir_keymap <=
ARRAY_SIZE(keys_tables))) {
1406 keymap = keys_tables[ir_keymap - 1].
rc_keys ;
1408 }
else if (ir_keymap >
ARRAY_SIZE(keys_tables))
1412 if (d->
props.i2c_algo->master_xfer(&d->
i2c_adap, &msg, 1) == 1) {
1413 for (i = 0; i < keymap_size ; i++) {
1414 if (rc5_data(&keymap[i]) == msg.
buf[0]) {
1423 deb_rc(
"%s: found rc key: %x, %x, event: %x\n",
1424 __func__, key[0], key[1], (*event));
1425 else if (key[0] != 0xff)
1426 deb_rc(
"%s: unknown rc key: %x, %x\n",
1427 __func__, key[0], key[1]);
1462 [
PROF_7500] = {USB_DEVICE(0x3034, 0x7500)},
1473 static int dw2102_load_firmware(
struct usb_device *dev,
1479 u8 reset16[] = {0, 0, 0, 0, 0, 0, 0};
1481 const char *fw_2101 =
"dvb-usb-dw2101.fw";
1483 switch (dev->descriptor.idProduct) {
1495 info(
"start downloading DW210X firmware");
1504 for (i = 0; i < fw->
size; i += 0x40) {
1506 if (dw210x_op_rw(dev, 0xa0, i, 0, b , 0x40,
1508 err(
"error while transferring firmware");
1515 if (ret || dw210x_op_rw(dev, 0xa0, 0x7f92, 0, &reset, 1,
1517 err(
"could not restart the USB controller CPU.");
1520 if (ret || dw210x_op_rw(dev, 0xa0, 0xe600, 0, &reset, 1,
1522 err(
"could not restart the USB controller CPU.");
1526 switch (dev->descriptor.idProduct) {
1528 dw2104_properties.rc.legacy.rc_map_table = rc_map_tevii_table;
1529 dw2104_properties.rc.legacy.rc_map_size =
1533 dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1,
1538 dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0,
1543 dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0,
1545 dw210x_op_rw(dev, 0xb9, 0x0000, 0, &reset16[0], 2,
1548 dw210x_op_rw(dev, 0xb5, 0, 0, &reset16[0], 2,
1550 if ((reset16[0] == 0xa1) || (reset16[0] == 0x80)) {
1551 dw2102_properties.i2c_algo = &dw2102_i2c_algo;
1552 dw2102_properties.adapter->fe[0].tuner_attach = &dw2102_tuner_attach;
1559 dw210x_op_rw(dev, 0xc2, 0, 0, &reset16[0], 3,
1561 dw210x_op_rw(dev, 0xc3, 0xd1, 0, &reset16[0], 3,
1563 if (reset16[2] == 0x11) {
1564 dw2102_properties.i2c_algo = &dw2102_earda_i2c_algo;
1569 dw210x_op_rw(dev, 0xbc, 0x0030, 0, &reset16[0], 2,
1571 dw210x_op_rw(dev, 0xba, 0x0000, 0, &reset16[0], 7,
1573 dw210x_op_rw(dev, 0xba, 0x0000, 0, &reset16[0], 7,
1575 dw210x_op_rw(dev, 0xb9, 0x0000, 0, &reset16[0], 2,
1589 .firmware =
"dvb-usb-dw2102.fw",
1592 .i2c_algo = &dw2102_serit_i2c_algo,
1595 .rc_map_table = rc_map_dw210x_table,
1596 .rc_map_size =
ARRAY_SIZE(rc_map_dw210x_table),
1598 .rc_query = dw2102_rc_query,
1601 .generic_bulk_ctrl_endpoint = 0x81,
1604 .download_firmware = dw2102_load_firmware,
1605 .read_mac_address = dw210x_read_mac_address,
1610 .frontend_attach = dw2102_frontend_attach,
1624 .num_device_descs = 3,
1626 {
"DVBWorld DVB-S 2102 USB2.0",
1630 {
"DVBWorld DVB-S 2101 USB2.0",
1634 {
"TerraTec Cinergy S USB",
1644 .firmware =
"dvb-usb-dw2104.fw",
1647 .i2c_algo = &dw2104_i2c_algo,
1649 .rc_map_table = rc_map_dw210x_table,
1650 .rc_map_size =
ARRAY_SIZE(rc_map_dw210x_table),
1652 .rc_query = dw2102_rc_query,
1655 .generic_bulk_ctrl_endpoint = 0x81,
1658 .download_firmware = dw2102_load_firmware,
1659 .read_mac_address = dw210x_read_mac_address,
1664 .frontend_attach = dw2104_frontend_attach,
1678 .num_device_descs = 2,
1680 {
"DVBWorld DW2104 USB2.0",
1684 {
"TeVii S650 USB2.0",
1694 .firmware =
"dvb-usb-dw3101.fw",
1697 .i2c_algo = &dw3101_i2c_algo,
1699 .rc_map_table = rc_map_dw210x_table,
1700 .rc_map_size =
ARRAY_SIZE(rc_map_dw210x_table),
1702 .rc_query = dw2102_rc_query,
1705 .generic_bulk_ctrl_endpoint = 0x81,
1708 .download_firmware = dw2102_load_firmware,
1709 .read_mac_address = dw210x_read_mac_address,
1714 .frontend_attach = dw3101_frontend_attach,
1715 .tuner_attach = dw3101_tuner_attach,
1729 .num_device_descs = 1,
1731 {
"DVBWorld DVB-C 3101 USB2.0",
1745 .i2c_algo = &s6x0_i2c_algo,
1747 .rc_map_table = rc_map_tevii_table,
1748 .rc_map_size =
ARRAY_SIZE(rc_map_tevii_table),
1750 .rc_query = dw2102_rc_query,
1753 .generic_bulk_ctrl_endpoint = 0x81,
1755 .download_firmware = dw2102_load_firmware,
1756 .read_mac_address = s6x0_read_mac_address,
1761 .frontend_attach = zl100313_frontend_attach,
1775 .num_device_descs = 1,
1812 "Prof 7500 USB DVB-S2",
1821 .power_ctrl = su3000_power_ctrl,
1823 .identify_state = su3000_identify_state,
1824 .i2c_algo = &su3000_i2c_algo,
1827 .rc_map_table = rc_map_su3000_table,
1828 .rc_map_size =
ARRAY_SIZE(rc_map_su3000_table),
1830 .rc_query = dw2102_rc_query,
1833 .read_mac_address = su3000_read_mac_address,
1835 .generic_bulk_ctrl_endpoint = 0x01,
1841 .streaming_ctrl = su3000_streaming_ctrl,
1842 .frontend_attach = su3000_frontend_attach,
1856 .num_device_descs = 3,
1858 {
"SU3000HD DVB-S USB2.0",
1862 {
"Terratec Cinergy S2 USB HD",
1866 {
"X3M TV SPC1400HD PCI",
1876 p1100 =
kmemdup(&s6x0_properties,
1882 p1100->
firmware =
"dvb-usb-p1100.fw";
1884 p1100->
rc.legacy.rc_map_table = rc_map_tbs_table;
1885 p1100->
rc.legacy.rc_map_size =
ARRAY_SIZE(rc_map_tbs_table);
1886 p1100->
adapter->fe[0].frontend_attach = stv0288_frontend_attach;
1888 s660 =
kmemdup(&s6x0_properties,
1894 s660->
firmware =
"dvb-usb-s660.fw";
1899 s660->
adapter->fe[0].frontend_attach = ds3000_frontend_attach;
1901 p7500 =
kmemdup(&s6x0_properties,
1908 p7500->
firmware =
"dvb-usb-p7500.fw";
1910 p7500->
rc.legacy.rc_map_table = rc_map_tbs_table;
1911 p7500->
rc.legacy.rc_map_size =
ARRAY_SIZE(rc_map_tbs_table);
1912 p7500->
adapter->fe[0].frontend_attach = prof_7500_frontend_attach;
1935 static struct usb_driver dw2102_driver = {
1937 .probe = dw2102_probe,
1939 .id_table = dw2102_table,
1946 " DVB-C 3101 USB2.0,"
1947 " TeVii S600, S630, S650, S660, S480,"
1948 " Prof 1100, 7500 USB2.0,"
1949 " Geniatech SU3000 devices");