diff options
Diffstat (limited to 'drivers/media/dvb/dvb-usb')
-rw-r--r-- | drivers/media/dvb/dvb-usb/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/af9015.c | 94 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dib0700_devices.c | 31 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dibusb-common.c | 7 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dvb-usb-ids.h | 8 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dvb-usb.h | 2 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dw2102.c | 325 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/dw2102.h | 1 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/gp8psk.c | 8 |
9 files changed, 422 insertions, 55 deletions
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 1bb66e1ed5a7..496c1a37034c 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
@@ -261,6 +261,7 @@ config DVB_USB_DW2102 | |||
261 | select DVB_STB6000 if !DVB_FE_CUSTOMISE | 261 | select DVB_STB6000 if !DVB_FE_CUSTOMISE |
262 | select DVB_CX24116 if !DVB_FE_CUSTOMISE | 262 | select DVB_CX24116 if !DVB_FE_CUSTOMISE |
263 | select DVB_SI21XX if !DVB_FE_CUSTOMISE | 263 | select DVB_SI21XX if !DVB_FE_CUSTOMISE |
264 | select DVB_TDA10021 if !DVB_FE_CUSTOMISE | ||
264 | help | 265 | help |
265 | Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers | 266 | Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers |
266 | and the TeVii S650. | 267 | and the TeVii S650. |
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index 53bfc8e42fb9..4cb31e7c13c2 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
@@ -40,7 +40,7 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | |||
40 | static DEFINE_MUTEX(af9015_usb_mutex); | 40 | static DEFINE_MUTEX(af9015_usb_mutex); |
41 | 41 | ||
42 | static struct af9015_config af9015_config; | 42 | static struct af9015_config af9015_config; |
43 | static struct dvb_usb_device_properties af9015_properties[2]; | 43 | static struct dvb_usb_device_properties af9015_properties[3]; |
44 | static int af9015_properties_count = ARRAY_SIZE(af9015_properties); | 44 | static int af9015_properties_count = ARRAY_SIZE(af9015_properties); |
45 | 45 | ||
46 | static struct af9013_config af9015_af9013_config[] = { | 46 | static struct af9013_config af9015_af9013_config[] = { |
@@ -538,7 +538,7 @@ exit: | |||
538 | /* dump eeprom */ | 538 | /* dump eeprom */ |
539 | static int af9015_eeprom_dump(struct dvb_usb_device *d) | 539 | static int af9015_eeprom_dump(struct dvb_usb_device *d) |
540 | { | 540 | { |
541 | char buf[52], buf2[4]; | 541 | char buf[4+3*16+1], buf2[4]; |
542 | u8 reg, val; | 542 | u8 reg, val; |
543 | 543 | ||
544 | for (reg = 0; ; reg++) { | 544 | for (reg = 0; ; reg++) { |
@@ -1261,7 +1261,11 @@ static struct usb_device_id af9015_usb_table[] = { | |||
1261 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)}, | 1261 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_2)}, |
1262 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)}, | 1262 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_395U_3)}, |
1263 | {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)}, | 1263 | {USB_DEVICE(USB_VID_AFATECH, USB_PID_TREKSTOR_DVBT)}, |
1264 | {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)}, | 1264 | /* 20 */{USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A850)}, |
1265 | {USB_DEVICE(USB_VID_AVERMEDIA, USB_PID_AVERMEDIA_A805)}, | ||
1266 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_CONCEPTRONIC_CTVDIGRCU)}, | ||
1267 | {USB_DEVICE(USB_VID_KWORLD_2, USB_PID_KWORLD_MC810)}, | ||
1268 | {USB_DEVICE(USB_VID_KYE, USB_PID_GENIUS_TVGO_DVB_T03)}, | ||
1265 | {0}, | 1269 | {0}, |
1266 | }; | 1270 | }; |
1267 | MODULE_DEVICE_TABLE(usb, af9015_usb_table); | 1271 | MODULE_DEVICE_TABLE(usb, af9015_usb_table); |
@@ -1321,7 +1325,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1321 | 1325 | ||
1322 | .i2c_algo = &af9015_i2c_algo, | 1326 | .i2c_algo = &af9015_i2c_algo, |
1323 | 1327 | ||
1324 | .num_device_descs = 9, | 1328 | .num_device_descs = 9, /* max 9 */ |
1325 | .devices = { | 1329 | .devices = { |
1326 | { | 1330 | { |
1327 | .name = "Afatech AF9015 DVB-T USB2.0 stick", | 1331 | .name = "Afatech AF9015 DVB-T USB2.0 stick", |
@@ -1426,7 +1430,7 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1426 | 1430 | ||
1427 | .i2c_algo = &af9015_i2c_algo, | 1431 | .i2c_algo = &af9015_i2c_algo, |
1428 | 1432 | ||
1429 | .num_device_descs = 9, | 1433 | .num_device_descs = 9, /* max 9 */ |
1430 | .devices = { | 1434 | .devices = { |
1431 | { | 1435 | { |
1432 | .name = "Xtensions XD-380", | 1436 | .name = "Xtensions XD-380", |
@@ -1478,7 +1482,85 @@ static struct dvb_usb_device_properties af9015_properties[] = { | |||
1478 | .warm_ids = {NULL}, | 1482 | .warm_ids = {NULL}, |
1479 | }, | 1483 | }, |
1480 | } | 1484 | } |
1481 | } | 1485 | }, { |
1486 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | ||
1487 | |||
1488 | .usb_ctrl = DEVICE_SPECIFIC, | ||
1489 | .download_firmware = af9015_download_firmware, | ||
1490 | .firmware = "dvb-usb-af9015.fw", | ||
1491 | .no_reconnect = 1, | ||
1492 | |||
1493 | .size_of_priv = sizeof(struct af9015_state), \ | ||
1494 | |||
1495 | .num_adapters = 2, | ||
1496 | .adapter = { | ||
1497 | { | ||
1498 | .caps = DVB_USB_ADAP_HAS_PID_FILTER | | ||
1499 | DVB_USB_ADAP_PID_FILTER_CAN_BE_TURNED_OFF, | ||
1500 | |||
1501 | .pid_filter_count = 32, | ||
1502 | .pid_filter = af9015_pid_filter, | ||
1503 | .pid_filter_ctrl = af9015_pid_filter_ctrl, | ||
1504 | |||
1505 | .frontend_attach = | ||
1506 | af9015_af9013_frontend_attach, | ||
1507 | .tuner_attach = af9015_tuner_attach, | ||
1508 | .stream = { | ||
1509 | .type = USB_BULK, | ||
1510 | .count = 6, | ||
1511 | .endpoint = 0x84, | ||
1512 | }, | ||
1513 | }, | ||
1514 | { | ||
1515 | .frontend_attach = | ||
1516 | af9015_af9013_frontend_attach, | ||
1517 | .tuner_attach = af9015_tuner_attach, | ||
1518 | .stream = { | ||
1519 | .type = USB_BULK, | ||
1520 | .count = 6, | ||
1521 | .endpoint = 0x85, | ||
1522 | .u = { | ||
1523 | .bulk = { | ||
1524 | .buffersize = | ||
1525 | TS_USB20_MAX_PACKET_SIZE, | ||
1526 | } | ||
1527 | } | ||
1528 | }, | ||
1529 | } | ||
1530 | }, | ||
1531 | |||
1532 | .identify_state = af9015_identify_state, | ||
1533 | |||
1534 | .rc_query = af9015_rc_query, | ||
1535 | .rc_interval = 150, | ||
1536 | |||
1537 | .i2c_algo = &af9015_i2c_algo, | ||
1538 | |||
1539 | .num_device_descs = 4, /* max 9 */ | ||
1540 | .devices = { | ||
1541 | { | ||
1542 | .name = "AverMedia AVerTV Volar GPS 805 (A805)", | ||
1543 | .cold_ids = {&af9015_usb_table[21], NULL}, | ||
1544 | .warm_ids = {NULL}, | ||
1545 | }, | ||
1546 | { | ||
1547 | .name = "Conceptronic USB2.0 DVB-T CTVDIGRCU " \ | ||
1548 | "V3.0", | ||
1549 | .cold_ids = {&af9015_usb_table[22], NULL}, | ||
1550 | .warm_ids = {NULL}, | ||
1551 | }, | ||
1552 | { | ||
1553 | .name = "KWorld Digial MC-810", | ||
1554 | .cold_ids = {&af9015_usb_table[23], NULL}, | ||
1555 | .warm_ids = {NULL}, | ||
1556 | }, | ||
1557 | { | ||
1558 | .name = "Genius TVGo DVB-T03", | ||
1559 | .cold_ids = {&af9015_usb_table[24], NULL}, | ||
1560 | .warm_ids = {NULL}, | ||
1561 | }, | ||
1562 | } | ||
1563 | }, | ||
1482 | }; | 1564 | }; |
1483 | 1565 | ||
1484 | static int af9015_usb_probe(struct usb_interface *intf, | 1566 | static int af9015_usb_probe(struct usb_interface *intf, |
diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c index 8ddbadf62194..818b2ab584bf 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_devices.c +++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c | |||
@@ -1346,9 +1346,9 @@ static int dib0700_xc5000_tuner_callback(void *priv, int component, | |||
1346 | if (command == XC5000_TUNER_RESET) { | 1346 | if (command == XC5000_TUNER_RESET) { |
1347 | /* Reset the tuner */ | 1347 | /* Reset the tuner */ |
1348 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0); | 1348 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 0); |
1349 | msleep(330); /* from Windows USB trace */ | 1349 | msleep(10); |
1350 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1); | 1350 | dib0700_set_gpio(adap->dev, GPIO1, GPIO_OUT, 1); |
1351 | msleep(330); /* from Windows USB trace */ | 1351 | msleep(10); |
1352 | } else { | 1352 | } else { |
1353 | err("xc5000: unknown tuner callback command: %d\n", command); | 1353 | err("xc5000: unknown tuner callback command: %d\n", command); |
1354 | return -EINVAL; | 1354 | return -EINVAL; |
@@ -1493,6 +1493,10 @@ struct usb_device_id dib0700_usb_id_table[] = { | |||
1493 | { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) }, | 1493 | { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_TIGER_ATSC_B210) }, |
1494 | { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) }, | 1494 | { USB_DEVICE(USB_VID_YUAN, USB_PID_YUAN_MC770) }, |
1495 | { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) }, | 1495 | { USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT) }, |
1496 | /* 50 */{ USB_DEVICE(USB_VID_ELGATO, USB_PID_ELGATO_EYETV_DTT_Dlx) }, | ||
1497 | { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_H) }, | ||
1498 | { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T3) }, | ||
1499 | { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_T5) }, | ||
1496 | { 0 } /* Terminating entry */ | 1500 | { 0 } /* Terminating entry */ |
1497 | }; | 1501 | }; |
1498 | MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); | 1502 | MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table); |
@@ -1692,7 +1696,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1692 | }, | 1696 | }, |
1693 | }, | 1697 | }, |
1694 | 1698 | ||
1695 | .num_device_descs = 11, | 1699 | .num_device_descs = 12, |
1696 | .devices = { | 1700 | .devices = { |
1697 | { "DiBcom STK7070P reference design", | 1701 | { "DiBcom STK7070P reference design", |
1698 | { &dib0700_usb_id_table[15], NULL }, | 1702 | { &dib0700_usb_id_table[15], NULL }, |
@@ -1726,8 +1730,9 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1726 | { &dib0700_usb_id_table[30], NULL }, | 1730 | { &dib0700_usb_id_table[30], NULL }, |
1727 | { NULL }, | 1731 | { NULL }, |
1728 | }, | 1732 | }, |
1729 | { "Terratec Cinergy T USB XXS", | 1733 | { "Terratec Cinergy T USB XXS/ T3", |
1730 | { &dib0700_usb_id_table[33], NULL }, | 1734 | { &dib0700_usb_id_table[33], |
1735 | &dib0700_usb_id_table[52], NULL }, | ||
1731 | { NULL }, | 1736 | { NULL }, |
1732 | }, | 1737 | }, |
1733 | { "Elgato EyeTV DTT", | 1738 | { "Elgato EyeTV DTT", |
@@ -1738,6 +1743,10 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1738 | { &dib0700_usb_id_table[45], NULL }, | 1743 | { &dib0700_usb_id_table[45], NULL }, |
1739 | { NULL }, | 1744 | { NULL }, |
1740 | }, | 1745 | }, |
1746 | { "Elgato EyeTV Dtt Dlx PD378S", | ||
1747 | { &dib0700_usb_id_table[50], NULL }, | ||
1748 | { NULL }, | ||
1749 | }, | ||
1741 | }, | 1750 | }, |
1742 | 1751 | ||
1743 | .rc_interval = DEFAULT_RC_INTERVAL, | 1752 | .rc_interval = DEFAULT_RC_INTERVAL, |
@@ -1784,8 +1793,9 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1784 | { &dib0700_usb_id_table[36], NULL }, | 1793 | { &dib0700_usb_id_table[36], NULL }, |
1785 | { NULL }, | 1794 | { NULL }, |
1786 | }, | 1795 | }, |
1787 | { "Terratec Cinergy DT USB XS Diversity", | 1796 | { "Terratec Cinergy DT USB XS Diversity/ T5", |
1788 | { &dib0700_usb_id_table[43], NULL }, | 1797 | { &dib0700_usb_id_table[43], |
1798 | &dib0700_usb_id_table[53], NULL}, | ||
1789 | { NULL }, | 1799 | { NULL }, |
1790 | }, | 1800 | }, |
1791 | { "Sony PlayTV", | 1801 | { "Sony PlayTV", |
@@ -1812,7 +1822,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1812 | }, | 1822 | }, |
1813 | }, | 1823 | }, |
1814 | 1824 | ||
1815 | .num_device_descs = 7, | 1825 | .num_device_descs = 8, |
1816 | .devices = { | 1826 | .devices = { |
1817 | { "Terratec Cinergy HT USB XE", | 1827 | { "Terratec Cinergy HT USB XE", |
1818 | { &dib0700_usb_id_table[27], NULL }, | 1828 | { &dib0700_usb_id_table[27], NULL }, |
@@ -1842,6 +1852,11 @@ struct dvb_usb_device_properties dib0700_devices[] = { | |||
1842 | { &dib0700_usb_id_table[48], NULL }, | 1852 | { &dib0700_usb_id_table[48], NULL }, |
1843 | { NULL }, | 1853 | { NULL }, |
1844 | }, | 1854 | }, |
1855 | { "Leadtek WinFast DTV Dongle H", | ||
1856 | { &dib0700_usb_id_table[51], NULL }, | ||
1857 | { NULL }, | ||
1858 | }, | ||
1859 | |||
1845 | }, | 1860 | }, |
1846 | .rc_interval = DEFAULT_RC_INTERVAL, | 1861 | .rc_interval = DEFAULT_RC_INTERVAL, |
1847 | .rc_key_map = dib0700_rc_keys, | 1862 | .rc_key_map = dib0700_rc_keys, |
diff --git a/drivers/media/dvb/dvb-usb/dibusb-common.c b/drivers/media/dvb/dvb-usb/dibusb-common.c index 8ee6cd4da9e7..8dbad1ec53c4 100644 --- a/drivers/media/dvb/dvb-usb/dibusb-common.c +++ b/drivers/media/dvb/dvb-usb/dibusb-common.c | |||
@@ -133,14 +133,17 @@ static int dibusb_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num | |||
133 | 133 | ||
134 | for (i = 0; i < num; i++) { | 134 | for (i = 0; i < num; i++) { |
135 | /* write/read request */ | 135 | /* write/read request */ |
136 | if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) { | 136 | if (i+1 < num && (msg[i].flags & I2C_M_RD) == 0 |
137 | && (msg[i+1].flags & I2C_M_RD)) { | ||
137 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len, | 138 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len, |
138 | msg[i+1].buf,msg[i+1].len) < 0) | 139 | msg[i+1].buf,msg[i+1].len) < 0) |
139 | break; | 140 | break; |
140 | i++; | 141 | i++; |
141 | } else | 142 | } else if ((msg[i].flags & I2C_M_RD) == 0) { |
142 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0) | 143 | if (dibusb_i2c_msg(d, msg[i].addr, msg[i].buf,msg[i].len,NULL,0) < 0) |
143 | break; | 144 | break; |
145 | } else | ||
146 | break; | ||
144 | } | 147 | } |
145 | 148 | ||
146 | mutex_unlock(&d->i2c_mutex); | 149 | mutex_unlock(&d->i2c_mutex); |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h index f506c74119f3..9593b7289994 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h | |||
@@ -80,6 +80,7 @@ | |||
80 | #define USB_PID_COMPRO_DVBU2000_UNK_WARM 0x010d | 80 | #define USB_PID_COMPRO_DVBU2000_UNK_WARM 0x010d |
81 | #define USB_PID_COMPRO_VIDEOMATE_U500 0x1e78 | 81 | #define USB_PID_COMPRO_VIDEOMATE_U500 0x1e78 |
82 | #define USB_PID_COMPRO_VIDEOMATE_U500_PC 0x1e80 | 82 | #define USB_PID_COMPRO_VIDEOMATE_U500_PC 0x1e80 |
83 | #define USB_PID_CONCEPTRONIC_CTVDIGRCU 0xe397 | ||
83 | #define USB_PID_CONEXANT_D680_DMB 0x86d6 | 84 | #define USB_PID_CONEXANT_D680_DMB 0x86d6 |
84 | #define USB_PID_DIBCOM_HOOK_DEFAULT 0x0064 | 85 | #define USB_PID_DIBCOM_HOOK_DEFAULT 0x0064 |
85 | #define USB_PID_DIBCOM_HOOK_DEFAULT_REENUM 0x0065 | 86 | #define USB_PID_DIBCOM_HOOK_DEFAULT_REENUM 0x0065 |
@@ -97,6 +98,7 @@ | |||
97 | #define USB_PID_DPOSH_M9206_COLD 0x9206 | 98 | #define USB_PID_DPOSH_M9206_COLD 0x9206 |
98 | #define USB_PID_DPOSH_M9206_WARM 0xa090 | 99 | #define USB_PID_DPOSH_M9206_WARM 0xa090 |
99 | #define USB_PID_UNIWILL_STK7700P 0x6003 | 100 | #define USB_PID_UNIWILL_STK7700P 0x6003 |
101 | #define USB_PID_GENIUS_TVGO_DVB_T03 0x4012 | ||
100 | #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 | 102 | #define USB_PID_GRANDTEC_DVBT_USB_COLD 0x0fa0 |
101 | #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 | 103 | #define USB_PID_GRANDTEC_DVBT_USB_WARM 0x0fa1 |
102 | #define USB_PID_INTEL_CE9500 0x9500 | 104 | #define USB_PID_INTEL_CE9500 0x9500 |
@@ -104,6 +106,7 @@ | |||
104 | #define USB_PID_KWORLD_395U 0xe396 | 106 | #define USB_PID_KWORLD_395U 0xe396 |
105 | #define USB_PID_KWORLD_395U_2 0xe39b | 107 | #define USB_PID_KWORLD_395U_2 0xe39b |
106 | #define USB_PID_KWORLD_395U_3 0xe395 | 108 | #define USB_PID_KWORLD_395U_3 0xe395 |
109 | #define USB_PID_KWORLD_MC810 0xc810 | ||
107 | #define USB_PID_KWORLD_PC160_2T 0xc160 | 110 | #define USB_PID_KWORLD_PC160_2T 0xc160 |
108 | #define USB_PID_KWORLD_VSTREAM_COLD 0x17de | 111 | #define USB_PID_KWORLD_VSTREAM_COLD 0x17de |
109 | #define USB_PID_KWORLD_VSTREAM_WARM 0x17df | 112 | #define USB_PID_KWORLD_VSTREAM_WARM 0x17df |
@@ -171,6 +174,7 @@ | |||
171 | #define USB_PID_AVERMEDIA_A309 0xa309 | 174 | #define USB_PID_AVERMEDIA_A309 0xa309 |
172 | #define USB_PID_AVERMEDIA_A310 0xa310 | 175 | #define USB_PID_AVERMEDIA_A310 0xa310 |
173 | #define USB_PID_AVERMEDIA_A850 0x850a | 176 | #define USB_PID_AVERMEDIA_A850 0x850a |
177 | #define USB_PID_AVERMEDIA_A805 0xa805 | ||
174 | #define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006 | 178 | #define USB_PID_TECHNOTREND_CONNECT_S2400 0x3006 |
175 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a | 179 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY 0x005a |
176 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081 | 180 | #define USB_PID_TERRATEC_CINERGY_DT_XS_DIVERSITY_2 0x0081 |
@@ -178,6 +182,8 @@ | |||
178 | #define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060 | 182 | #define USB_PID_TERRATEC_CINERGY_HT_EXPRESS 0x0060 |
179 | #define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062 | 183 | #define USB_PID_TERRATEC_CINERGY_T_EXPRESS 0x0062 |
180 | #define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078 | 184 | #define USB_PID_TERRATEC_CINERGY_T_XXS 0x0078 |
185 | #define USB_PID_TERRATEC_T3 0x10a0 | ||
186 | #define USB_PID_TERRATEC_T5 0x10a1 | ||
181 | #define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e | 187 | #define USB_PID_PINNACLE_EXPRESSCARD_320CX 0x022e |
182 | #define USB_PID_PINNACLE_PCTV2000E 0x022c | 188 | #define USB_PID_PINNACLE_PCTV2000E 0x022c |
183 | #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228 | 189 | #define USB_PID_PINNACLE_PCTV_DVB_T_FLASH 0x0228 |
@@ -222,6 +228,7 @@ | |||
222 | #define USB_PID_WINFAST_DTV_DONGLE_COLD 0x6025 | 228 | #define USB_PID_WINFAST_DTV_DONGLE_COLD 0x6025 |
223 | #define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026 | 229 | #define USB_PID_WINFAST_DTV_DONGLE_WARM 0x6026 |
224 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00 | 230 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P 0x6f00 |
231 | #define USB_PID_WINFAST_DTV_DONGLE_H 0x60f6 | ||
225 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P_2 0x6f01 | 232 | #define USB_PID_WINFAST_DTV_DONGLE_STK7700P_2 0x6f01 |
226 | #define USB_PID_WINFAST_DTV_DONGLE_GOLD 0x6029 | 233 | #define USB_PID_WINFAST_DTV_DONGLE_GOLD 0x6029 |
227 | #define USB_PID_GENPIX_8PSK_REV_1_COLD 0x0200 | 234 | #define USB_PID_GENPIX_8PSK_REV_1_COLD 0x0200 |
@@ -251,5 +258,6 @@ | |||
251 | #define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807 | 258 | #define USB_PID_MSI_DIGI_VOX_MINI_III 0x8807 |
252 | #define USB_PID_SONY_PLAYTV 0x0003 | 259 | #define USB_PID_SONY_PLAYTV 0x0003 |
253 | #define USB_PID_ELGATO_EYETV_DTT 0x0021 | 260 | #define USB_PID_ELGATO_EYETV_DTT 0x0021 |
261 | #define USB_PID_ELGATO_EYETV_DTT_Dlx 0x0020 | ||
254 | 262 | ||
255 | #endif | 263 | #endif |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb.h b/drivers/media/dvb/dvb-usb/dvb-usb.h index b5157518a300..e441d274e6c1 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb.h +++ b/drivers/media/dvb/dvb-usb/dvb-usb.h | |||
@@ -223,7 +223,7 @@ struct dvb_usb_device_properties { | |||
223 | int generic_bulk_ctrl_endpoint; | 223 | int generic_bulk_ctrl_endpoint; |
224 | 224 | ||
225 | int num_device_descs; | 225 | int num_device_descs; |
226 | struct dvb_usb_device_description devices[11]; | 226 | struct dvb_usb_device_description devices[12]; |
227 | }; | 227 | }; |
228 | 228 | ||
229 | /** | 229 | /** |
diff --git a/drivers/media/dvb/dvb-usb/dw2102.c b/drivers/media/dvb/dvb-usb/dw2102.c index c65f273ff313..75de49c0d943 100644 --- a/drivers/media/dvb/dvb-usb/dw2102.c +++ b/drivers/media/dvb/dvb-usb/dw2102.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* DVB USB framework compliant Linux driver for the | 1 | /* DVB USB framework compliant Linux driver for the |
2 | * DVBWorld DVB-S 2101, 2102, DVB-S2 2104 Card | 2 | * DVBWorld DVB-S 2101, 2102, DVB-S2 2104, DVB-C 3101, |
3 | * | 3 | * TeVii S600, S650 Cards |
4 | * Copyright (C) 2008 Igor M. Liplianin (liplianin@me.by) | 4 | * Copyright (C) 2008,2009 Igor M. Liplianin (liplianin@me.by) |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify it | 6 | * This program is free software; you can redistribute it and/or modify it |
7 | * under the terms of the GNU General Public License as published by the | 7 | * under the terms of the GNU General Public License as published by the |
@@ -17,6 +17,7 @@ | |||
17 | #include "stb6000.h" | 17 | #include "stb6000.h" |
18 | #include "eds1547.h" | 18 | #include "eds1547.h" |
19 | #include "cx24116.h" | 19 | #include "cx24116.h" |
20 | #include "tda1002x.h" | ||
20 | 21 | ||
21 | #ifndef USB_PID_DW2102 | 22 | #ifndef USB_PID_DW2102 |
22 | #define USB_PID_DW2102 0x2102 | 23 | #define USB_PID_DW2102 0x2102 |
@@ -26,10 +27,18 @@ | |||
26 | #define USB_PID_DW2104 0x2104 | 27 | #define USB_PID_DW2104 0x2104 |
27 | #endif | 28 | #endif |
28 | 29 | ||
30 | #ifndef USB_PID_DW3101 | ||
31 | #define USB_PID_DW3101 0x3101 | ||
32 | #endif | ||
33 | |||
29 | #ifndef USB_PID_CINERGY_S | 34 | #ifndef USB_PID_CINERGY_S |
30 | #define USB_PID_CINERGY_S 0x0064 | 35 | #define USB_PID_CINERGY_S 0x0064 |
31 | #endif | 36 | #endif |
32 | 37 | ||
38 | #ifndef USB_PID_TEVII_S650 | ||
39 | #define USB_PID_TEVII_S650 0xd650 | ||
40 | #endif | ||
41 | |||
33 | #define DW210X_READ_MSG 0 | 42 | #define DW210X_READ_MSG 0 |
34 | #define DW210X_WRITE_MSG 1 | 43 | #define DW210X_WRITE_MSG 1 |
35 | 44 | ||
@@ -40,18 +49,21 @@ | |||
40 | #define DW2102_VOLTAGE_CTRL (0x1800) | 49 | #define DW2102_VOLTAGE_CTRL (0x1800) |
41 | #define DW2102_RC_QUERY (0x1a00) | 50 | #define DW2102_RC_QUERY (0x1a00) |
42 | 51 | ||
43 | struct dw210x_state { | 52 | struct dvb_usb_rc_keys_table { |
44 | u32 last_key_pressed; | 53 | struct dvb_usb_rc_key *rc_keys; |
45 | }; | 54 | int rc_keys_size; |
46 | struct dw210x_rc_keys { | ||
47 | u32 keycode; | ||
48 | u32 event; | ||
49 | }; | 55 | }; |
50 | 56 | ||
51 | /* debug */ | 57 | /* debug */ |
52 | static int dvb_usb_dw2102_debug; | 58 | static int dvb_usb_dw2102_debug; |
53 | module_param_named(debug, dvb_usb_dw2102_debug, int, 0644); | 59 | module_param_named(debug, dvb_usb_dw2102_debug, int, 0644); |
54 | MODULE_PARM_DESC(debug, "set debugging level (1=info 2=xfer (or-able))." DVB_USB_DEBUG_STATUS); | 60 | MODULE_PARM_DESC(debug, "set debugging level (1=info 2=xfer 4=rc(or-able))." |
61 | DVB_USB_DEBUG_STATUS); | ||
62 | |||
63 | /* keymaps */ | ||
64 | static int ir_keymap; | ||
65 | module_param_named(keymap, ir_keymap, int, 0644); | ||
66 | MODULE_PARM_DESC(keymap, "set keymap 0=default 1=dvbworld 2=tevii 3=tbs ..."); | ||
55 | 67 | ||
56 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 68 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
57 | 69 | ||
@@ -79,7 +91,7 @@ static int dw210x_op_rw(struct usb_device *dev, u8 request, u16 value, | |||
79 | static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | 91 | static int dw2102_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], |
80 | int num) | 92 | int num) |
81 | { | 93 | { |
82 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | 94 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
83 | int i = 0, ret = 0; | 95 | int i = 0, ret = 0; |
84 | u8 buf6[] = {0x2c, 0x05, 0xc0, 0, 0, 0, 0}; | 96 | u8 buf6[] = {0x2c, 0x05, 0xc0, 0, 0, 0, 0}; |
85 | u16 value; | 97 | u16 value; |
@@ -205,6 +217,7 @@ static int dw2102_serit_i2c_transfer(struct i2c_adapter *adap, | |||
205 | mutex_unlock(&d->i2c_mutex); | 217 | mutex_unlock(&d->i2c_mutex); |
206 | return num; | 218 | return num; |
207 | } | 219 | } |
220 | |||
208 | static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) | 221 | static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) |
209 | { | 222 | { |
210 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | 223 | struct dvb_usb_device *d = i2c_get_adapdata(adap); |
@@ -219,7 +232,7 @@ static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg ms | |||
219 | case 2: { | 232 | case 2: { |
220 | /* read */ | 233 | /* read */ |
221 | /* first write first register number */ | 234 | /* first write first register number */ |
222 | u8 ibuf [msg[1].len + 2], obuf[3]; | 235 | u8 ibuf[msg[1].len + 2], obuf[3]; |
223 | obuf[0] = 0xd0; | 236 | obuf[0] = 0xd0; |
224 | obuf[1] = msg[0].len; | 237 | obuf[1] = msg[0].len; |
225 | obuf[2] = msg[0].buf[0]; | 238 | obuf[2] = msg[0].buf[0]; |
@@ -293,7 +306,7 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | |||
293 | case 2: { | 306 | case 2: { |
294 | /* read */ | 307 | /* read */ |
295 | /* first write first register number */ | 308 | /* first write first register number */ |
296 | u8 ibuf [msg[1].len + 2], obuf[3]; | 309 | u8 ibuf[msg[1].len + 2], obuf[3]; |
297 | obuf[0] = 0xaa; | 310 | obuf[0] = 0xaa; |
298 | obuf[1] = msg[0].len; | 311 | obuf[1] = msg[0].len; |
299 | obuf[2] = msg[0].buf[0]; | 312 | obuf[2] = msg[0].buf[0]; |
@@ -360,6 +373,69 @@ static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], i | |||
360 | return num; | 373 | return num; |
361 | } | 374 | } |
362 | 375 | ||
376 | static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], | ||
377 | int num) | ||
378 | { | ||
379 | struct dvb_usb_device *d = i2c_get_adapdata(adap); | ||
380 | int ret = 0, i; | ||
381 | |||
382 | if (!d) | ||
383 | return -ENODEV; | ||
384 | if (mutex_lock_interruptible(&d->i2c_mutex) < 0) | ||
385 | return -EAGAIN; | ||
386 | |||
387 | switch (num) { | ||
388 | case 2: { | ||
389 | /* read */ | ||
390 | /* first write first register number */ | ||
391 | u8 ibuf[msg[1].len + 2], obuf[3]; | ||
392 | obuf[0] = msg[0].addr << 1; | ||
393 | obuf[1] = msg[0].len; | ||
394 | obuf[2] = msg[0].buf[0]; | ||
395 | ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, | ||
396 | obuf, msg[0].len + 2, DW210X_WRITE_MSG); | ||
397 | /* second read registers */ | ||
398 | ret = dw210x_op_rw(d->udev, 0xc3, 0x19 , 0, | ||
399 | ibuf, msg[1].len + 2, DW210X_READ_MSG); | ||
400 | memcpy(msg[1].buf, ibuf + 2, msg[1].len); | ||
401 | |||
402 | break; | ||
403 | } | ||
404 | case 1: | ||
405 | switch (msg[0].addr) { | ||
406 | case 0x60: | ||
407 | case 0x0c: { | ||
408 | /* write to register */ | ||
409 | u8 obuf[msg[0].len + 2]; | ||
410 | obuf[0] = msg[0].addr << 1; | ||
411 | obuf[1] = msg[0].len; | ||
412 | memcpy(obuf + 2, msg[0].buf, msg[0].len); | ||
413 | ret = dw210x_op_rw(d->udev, 0xc2, 0, 0, | ||
414 | obuf, msg[0].len + 2, DW210X_WRITE_MSG); | ||
415 | break; | ||
416 | } | ||
417 | case(DW2102_RC_QUERY): { | ||
418 | u8 ibuf[2]; | ||
419 | ret = dw210x_op_rw(d->udev, 0xb8, 0, 0, | ||
420 | ibuf, 2, DW210X_READ_MSG); | ||
421 | memcpy(msg[0].buf, ibuf , 2); | ||
422 | break; | ||
423 | } | ||
424 | } | ||
425 | |||
426 | break; | ||
427 | } | ||
428 | |||
429 | for (i = 0; i < num; i++) { | ||
430 | deb_xfer("%02x:%02x: %s ", i, msg[i].addr, | ||
431 | msg[i].flags == 0 ? ">>>" : "<<<"); | ||
432 | debug_dump(msg[i].buf, msg[i].len, deb_xfer); | ||
433 | } | ||
434 | |||
435 | mutex_unlock(&d->i2c_mutex); | ||
436 | return num; | ||
437 | } | ||
438 | |||
363 | static u32 dw210x_i2c_func(struct i2c_adapter *adapter) | 439 | static u32 dw210x_i2c_func(struct i2c_adapter *adapter) |
364 | { | 440 | { |
365 | return I2C_FUNC_I2C; | 441 | return I2C_FUNC_I2C; |
@@ -385,6 +461,11 @@ static struct i2c_algorithm dw2104_i2c_algo = { | |||
385 | .functionality = dw210x_i2c_func, | 461 | .functionality = dw210x_i2c_func, |
386 | }; | 462 | }; |
387 | 463 | ||
464 | static struct i2c_algorithm dw3101_i2c_algo = { | ||
465 | .master_xfer = dw3101_i2c_transfer, | ||
466 | .functionality = dw210x_i2c_func, | ||
467 | }; | ||
468 | |||
388 | static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) | 469 | static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) |
389 | { | 470 | { |
390 | int i; | 471 | int i; |
@@ -404,6 +485,7 @@ static int dw210x_read_mac_address(struct dvb_usb_device *d, u8 mac[6]) | |||
404 | debug_dump(eepromline, 16, deb_xfer); | 485 | debug_dump(eepromline, 16, deb_xfer); |
405 | } | 486 | } |
406 | } | 487 | } |
488 | |||
407 | memcpy(mac, eeprom + 8, 6); | 489 | memcpy(mac, eeprom + 8, 6); |
408 | return 0; | 490 | return 0; |
409 | }; | 491 | }; |
@@ -448,6 +530,11 @@ static struct si21xx_config serit_sp1511lhb_config = { | |||
448 | 530 | ||
449 | }; | 531 | }; |
450 | 532 | ||
533 | static struct tda10023_config dw3101_tda10023_config = { | ||
534 | .demod_address = 0x0c, | ||
535 | .invert = 1, | ||
536 | }; | ||
537 | |||
451 | static int dw2104_frontend_attach(struct dvb_usb_adapter *d) | 538 | static int dw2104_frontend_attach(struct dvb_usb_adapter *d) |
452 | { | 539 | { |
453 | if ((d->fe = dvb_attach(cx24116_attach, &dw2104_config, | 540 | if ((d->fe = dvb_attach(cx24116_attach, &dw2104_config, |
@@ -460,6 +547,7 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d) | |||
460 | } | 547 | } |
461 | 548 | ||
462 | static struct dvb_usb_device_properties dw2102_properties; | 549 | static struct dvb_usb_device_properties dw2102_properties; |
550 | static struct dvb_usb_device_properties dw2104_properties; | ||
463 | 551 | ||
464 | static int dw2102_frontend_attach(struct dvb_usb_adapter *d) | 552 | static int dw2102_frontend_attach(struct dvb_usb_adapter *d) |
465 | { | 553 | { |
@@ -497,6 +585,17 @@ static int dw2102_frontend_attach(struct dvb_usb_adapter *d) | |||
497 | return -EIO; | 585 | return -EIO; |
498 | } | 586 | } |
499 | 587 | ||
588 | static int dw3101_frontend_attach(struct dvb_usb_adapter *d) | ||
589 | { | ||
590 | d->fe = dvb_attach(tda10023_attach, &dw3101_tda10023_config, | ||
591 | &d->dev->i2c_adap, 0x48); | ||
592 | if (d->fe != NULL) { | ||
593 | info("Attached tda10023!\n"); | ||
594 | return 0; | ||
595 | } | ||
596 | return -EIO; | ||
597 | } | ||
598 | |||
500 | static int dw2102_tuner_attach(struct dvb_usb_adapter *adap) | 599 | static int dw2102_tuner_attach(struct dvb_usb_adapter *adap) |
501 | { | 600 | { |
502 | dvb_attach(dvb_pll_attach, adap->fe, 0x60, | 601 | dvb_attach(dvb_pll_attach, adap->fe, 0x60, |
@@ -512,6 +611,14 @@ static int dw2102_earda_tuner_attach(struct dvb_usb_adapter *adap) | |||
512 | return 0; | 611 | return 0; |
513 | } | 612 | } |
514 | 613 | ||
614 | static int dw3101_tuner_attach(struct dvb_usb_adapter *adap) | ||
615 | { | ||
616 | dvb_attach(dvb_pll_attach, adap->fe, 0x60, | ||
617 | &adap->dev->i2c_adap, DVB_PLL_TUA6034); | ||
618 | |||
619 | return 0; | ||
620 | } | ||
621 | |||
515 | static struct dvb_usb_rc_key dw210x_rc_keys[] = { | 622 | static struct dvb_usb_rc_key dw210x_rc_keys[] = { |
516 | { 0xf8, 0x0a, KEY_Q }, /*power*/ | 623 | { 0xf8, 0x0a, KEY_Q }, /*power*/ |
517 | { 0xf8, 0x0c, KEY_M }, /*mute*/ | 624 | { 0xf8, 0x0c, KEY_M }, /*mute*/ |
@@ -544,44 +651,147 @@ static struct dvb_usb_rc_key dw210x_rc_keys[] = { | |||
544 | { 0xf8, 0x40, KEY_F }, /*full*/ | 651 | { 0xf8, 0x40, KEY_F }, /*full*/ |
545 | { 0xf8, 0x1e, KEY_W }, /*tvmode*/ | 652 | { 0xf8, 0x1e, KEY_W }, /*tvmode*/ |
546 | { 0xf8, 0x1b, KEY_B }, /*recall*/ | 653 | { 0xf8, 0x1b, KEY_B }, /*recall*/ |
654 | }; | ||
547 | 655 | ||
656 | static struct dvb_usb_rc_key tevii_rc_keys[] = { | ||
657 | { 0xf8, 0x0a, KEY_POWER }, | ||
658 | { 0xf8, 0x0c, KEY_MUTE }, | ||
659 | { 0xf8, 0x11, KEY_1 }, | ||
660 | { 0xf8, 0x12, KEY_2 }, | ||
661 | { 0xf8, 0x13, KEY_3 }, | ||
662 | { 0xf8, 0x14, KEY_4 }, | ||
663 | { 0xf8, 0x15, KEY_5 }, | ||
664 | { 0xf8, 0x16, KEY_6 }, | ||
665 | { 0xf8, 0x17, KEY_7 }, | ||
666 | { 0xf8, 0x18, KEY_8 }, | ||
667 | { 0xf8, 0x19, KEY_9 }, | ||
668 | { 0xf8, 0x10, KEY_0 }, | ||
669 | { 0xf8, 0x1c, KEY_MENU }, | ||
670 | { 0xf8, 0x0f, KEY_VOLUMEDOWN }, | ||
671 | { 0xf8, 0x1a, KEY_LAST }, | ||
672 | { 0xf8, 0x0e, KEY_OPEN }, | ||
673 | { 0xf8, 0x04, KEY_RECORD }, | ||
674 | { 0xf8, 0x09, KEY_VOLUMEUP }, | ||
675 | { 0xf8, 0x08, KEY_CHANNELUP }, | ||
676 | { 0xf8, 0x07, KEY_PVR }, | ||
677 | { 0xf8, 0x0b, KEY_TIME }, | ||
678 | { 0xf8, 0x02, KEY_RIGHT }, | ||
679 | { 0xf8, 0x03, KEY_LEFT }, | ||
680 | { 0xf8, 0x00, KEY_UP }, | ||
681 | { 0xf8, 0x1f, KEY_OK }, | ||
682 | { 0xf8, 0x01, KEY_DOWN }, | ||
683 | { 0xf8, 0x05, KEY_TUNER }, | ||
684 | { 0xf8, 0x06, KEY_CHANNELDOWN }, | ||
685 | { 0xf8, 0x40, KEY_PLAYPAUSE }, | ||
686 | { 0xf8, 0x1e, KEY_REWIND }, | ||
687 | { 0xf8, 0x1b, KEY_FAVORITES }, | ||
688 | { 0xf8, 0x1d, KEY_BACK }, | ||
689 | { 0xf8, 0x4d, KEY_FASTFORWARD }, | ||
690 | { 0xf8, 0x44, KEY_EPG }, | ||
691 | { 0xf8, 0x4c, KEY_INFO }, | ||
692 | { 0xf8, 0x41, KEY_AB }, | ||
693 | { 0xf8, 0x43, KEY_AUDIO }, | ||
694 | { 0xf8, 0x45, KEY_SUBTITLE }, | ||
695 | { 0xf8, 0x4a, KEY_LIST }, | ||
696 | { 0xf8, 0x46, KEY_F1 }, | ||
697 | { 0xf8, 0x47, KEY_F2 }, | ||
698 | { 0xf8, 0x5e, KEY_F3 }, | ||
699 | { 0xf8, 0x5c, KEY_F4 }, | ||
700 | { 0xf8, 0x52, KEY_F5 }, | ||
701 | { 0xf8, 0x5a, KEY_F6 }, | ||
702 | { 0xf8, 0x56, KEY_MODE }, | ||
703 | { 0xf8, 0x58, KEY_SWITCHVIDEOMODE }, | ||
548 | }; | 704 | }; |
549 | 705 | ||
706 | static struct dvb_usb_rc_key tbs_rc_keys[] = { | ||
707 | { 0xf8, 0x84, KEY_POWER }, | ||
708 | { 0xf8, 0x94, KEY_MUTE }, | ||
709 | { 0xf8, 0x87, KEY_1 }, | ||
710 | { 0xf8, 0x86, KEY_2 }, | ||
711 | { 0xf8, 0x85, KEY_3 }, | ||
712 | { 0xf8, 0x8b, KEY_4 }, | ||
713 | { 0xf8, 0x8a, KEY_5 }, | ||
714 | { 0xf8, 0x89, KEY_6 }, | ||
715 | { 0xf8, 0x8f, KEY_7 }, | ||
716 | { 0xf8, 0x8e, KEY_8 }, | ||
717 | { 0xf8, 0x8d, KEY_9 }, | ||
718 | { 0xf8, 0x92, KEY_0 }, | ||
719 | { 0xf8, 0x96, KEY_CHANNELUP }, | ||
720 | { 0xf8, 0x91, KEY_CHANNELDOWN }, | ||
721 | { 0xf8, 0x93, KEY_VOLUMEUP }, | ||
722 | { 0xf8, 0x8c, KEY_VOLUMEDOWN }, | ||
723 | { 0xf8, 0x83, KEY_RECORD }, | ||
724 | { 0xf8, 0x98, KEY_PAUSE }, | ||
725 | { 0xf8, 0x99, KEY_OK }, | ||
726 | { 0xf8, 0x9a, KEY_SHUFFLE }, | ||
727 | { 0xf8, 0x81, KEY_UP }, | ||
728 | { 0xf8, 0x90, KEY_LEFT }, | ||
729 | { 0xf8, 0x82, KEY_RIGHT }, | ||
730 | { 0xf8, 0x88, KEY_DOWN }, | ||
731 | { 0xf8, 0x95, KEY_FAVORITES }, | ||
732 | { 0xf8, 0x97, KEY_SUBTITLE }, | ||
733 | { 0xf8, 0x9d, KEY_ZOOM }, | ||
734 | { 0xf8, 0x9f, KEY_EXIT }, | ||
735 | { 0xf8, 0x9e, KEY_MENU }, | ||
736 | { 0xf8, 0x9c, KEY_EPG }, | ||
737 | { 0xf8, 0x80, KEY_PREVIOUS }, | ||
738 | { 0xf8, 0x9b, KEY_MODE } | ||
739 | }; | ||
550 | 740 | ||
741 | static struct dvb_usb_rc_keys_table keys_tables[] = { | ||
742 | { dw210x_rc_keys, ARRAY_SIZE(dw210x_rc_keys) }, | ||
743 | { tevii_rc_keys, ARRAY_SIZE(tevii_rc_keys) }, | ||
744 | { tbs_rc_keys, ARRAY_SIZE(tbs_rc_keys) }, | ||
745 | }; | ||
551 | 746 | ||
552 | static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | 747 | static int dw2102_rc_query(struct dvb_usb_device *d, u32 *event, int *state) |
553 | { | 748 | { |
554 | struct dw210x_state *st = d->priv; | 749 | struct dvb_usb_rc_key *keymap = d->props.rc_key_map; |
750 | int keymap_size = d->props.rc_key_map_size; | ||
555 | u8 key[2]; | 751 | u8 key[2]; |
556 | struct i2c_msg msg[] = { | 752 | struct i2c_msg msg = { |
557 | {.addr = DW2102_RC_QUERY, .flags = I2C_M_RD, .buf = key, | 753 | .addr = DW2102_RC_QUERY, |
558 | .len = 2}, | 754 | .flags = I2C_M_RD, |
755 | .buf = key, | ||
756 | .len = 2 | ||
559 | }; | 757 | }; |
560 | int i; | 758 | int i; |
759 | /* override keymap */ | ||
760 | if ((ir_keymap > 0) && (ir_keymap <= ARRAY_SIZE(keys_tables))) { | ||
761 | keymap = keys_tables[ir_keymap - 1].rc_keys ; | ||
762 | keymap_size = keys_tables[ir_keymap - 1].rc_keys_size; | ||
763 | } | ||
561 | 764 | ||
562 | *state = REMOTE_NO_KEY_PRESSED; | 765 | *state = REMOTE_NO_KEY_PRESSED; |
563 | if (dw2102_i2c_transfer(&d->i2c_adap, msg, 1) == 1) { | 766 | if (dw2102_i2c_transfer(&d->i2c_adap, &msg, 1) == 1) { |
564 | for (i = 0; i < ARRAY_SIZE(dw210x_rc_keys); i++) { | 767 | for (i = 0; i < keymap_size ; i++) { |
565 | if (dw210x_rc_keys[i].data == msg[0].buf[0]) { | 768 | if (keymap[i].data == msg.buf[0]) { |
566 | *state = REMOTE_KEY_PRESSED; | 769 | *state = REMOTE_KEY_PRESSED; |
567 | *event = dw210x_rc_keys[i].event; | 770 | *event = keymap[i].event; |
568 | st->last_key_pressed = | ||
569 | dw210x_rc_keys[i].event; | ||
570 | break; | 771 | break; |
571 | } | 772 | } |
572 | st->last_key_pressed = 0; | 773 | |
573 | } | 774 | } |
775 | |||
776 | if ((*state) == REMOTE_KEY_PRESSED) | ||
777 | deb_rc("%s: found rc key: %x, %x, event: %x\n", | ||
778 | __func__, key[0], key[1], (*event)); | ||
779 | else if (key[0] != 0xff) | ||
780 | deb_rc("%s: unknown rc key: %x, %x\n", | ||
781 | __func__, key[0], key[1]); | ||
782 | |||
574 | } | 783 | } |
575 | /* info("key: %x %x\n",key[0],key[1]); */ | 784 | |
576 | return 0; | 785 | return 0; |
577 | } | 786 | } |
578 | 787 | ||
579 | static struct usb_device_id dw2102_table[] = { | 788 | static struct usb_device_id dw2102_table[] = { |
580 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2102)}, | 789 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2102)}, |
581 | {USB_DEVICE(USB_VID_CYPRESS, 0x2101)}, | 790 | {USB_DEVICE(USB_VID_CYPRESS, 0x2101)}, |
582 | {USB_DEVICE(USB_VID_CYPRESS, 0x2104)}, | 791 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW2104)}, |
583 | {USB_DEVICE(0x9022, 0xd650)}, | 792 | {USB_DEVICE(0x9022, USB_PID_TEVII_S650)}, |
584 | {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)}, | 793 | {USB_DEVICE(USB_VID_TERRATEC, USB_PID_CINERGY_S)}, |
794 | {USB_DEVICE(USB_VID_CYPRESS, USB_PID_DW3101)}, | ||
585 | { } | 795 | { } |
586 | }; | 796 | }; |
587 | 797 | ||
@@ -642,11 +852,16 @@ static int dw2102_load_firmware(struct usb_device *dev, | |||
642 | } | 852 | } |
643 | /* init registers */ | 853 | /* init registers */ |
644 | switch (dev->descriptor.idProduct) { | 854 | switch (dev->descriptor.idProduct) { |
855 | case USB_PID_TEVII_S650: | ||
856 | dw2104_properties.rc_key_map = tevii_rc_keys; | ||
857 | dw2104_properties.rc_key_map_size = | ||
858 | ARRAY_SIZE(tevii_rc_keys); | ||
645 | case USB_PID_DW2104: | 859 | case USB_PID_DW2104: |
646 | case 0xd650: | ||
647 | reset = 1; | 860 | reset = 1; |
648 | dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1, | 861 | dw210x_op_rw(dev, 0xc4, 0x0000, 0, &reset, 1, |
649 | DW210X_WRITE_MSG); | 862 | DW210X_WRITE_MSG); |
863 | /* break omitted intentionally */ | ||
864 | case USB_PID_DW3101: | ||
650 | reset = 0; | 865 | reset = 0; |
651 | dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0, | 866 | dw210x_op_rw(dev, 0xbf, 0x0040, 0, &reset, 0, |
652 | DW210X_WRITE_MSG); | 867 | DW210X_WRITE_MSG); |
@@ -690,6 +905,7 @@ static int dw2102_load_firmware(struct usb_device *dev, | |||
690 | DW210X_READ_MSG); | 905 | DW210X_READ_MSG); |
691 | break; | 906 | break; |
692 | } | 907 | } |
908 | |||
693 | msleep(100); | 909 | msleep(100); |
694 | kfree(p); | 910 | kfree(p); |
695 | } | 911 | } |
@@ -700,7 +916,6 @@ static struct dvb_usb_device_properties dw2102_properties = { | |||
700 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 916 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
701 | .usb_ctrl = DEVICE_SPECIFIC, | 917 | .usb_ctrl = DEVICE_SPECIFIC, |
702 | .firmware = "dvb-usb-dw2102.fw", | 918 | .firmware = "dvb-usb-dw2102.fw", |
703 | .size_of_priv = sizeof(struct dw210x_state), | ||
704 | .no_reconnect = 1, | 919 | .no_reconnect = 1, |
705 | 920 | ||
706 | .i2c_algo = &dw2102_serit_i2c_algo, | 921 | .i2c_algo = &dw2102_serit_i2c_algo, |
@@ -714,7 +929,7 @@ static struct dvb_usb_device_properties dw2102_properties = { | |||
714 | .num_adapters = 1, | 929 | .num_adapters = 1, |
715 | .download_firmware = dw2102_load_firmware, | 930 | .download_firmware = dw2102_load_firmware, |
716 | .read_mac_address = dw210x_read_mac_address, | 931 | .read_mac_address = dw210x_read_mac_address, |
717 | .adapter = { | 932 | .adapter = { |
718 | { | 933 | { |
719 | .frontend_attach = dw2102_frontend_attach, | 934 | .frontend_attach = dw2102_frontend_attach, |
720 | .streaming_ctrl = NULL, | 935 | .streaming_ctrl = NULL, |
@@ -752,7 +967,6 @@ static struct dvb_usb_device_properties dw2104_properties = { | |||
752 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | 967 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, |
753 | .usb_ctrl = DEVICE_SPECIFIC, | 968 | .usb_ctrl = DEVICE_SPECIFIC, |
754 | .firmware = "dvb-usb-dw2104.fw", | 969 | .firmware = "dvb-usb-dw2104.fw", |
755 | .size_of_priv = sizeof(struct dw210x_state), | ||
756 | .no_reconnect = 1, | 970 | .no_reconnect = 1, |
757 | 971 | ||
758 | .i2c_algo = &dw2104_i2c_algo, | 972 | .i2c_algo = &dw2104_i2c_algo, |
@@ -796,12 +1010,57 @@ static struct dvb_usb_device_properties dw2104_properties = { | |||
796 | } | 1010 | } |
797 | }; | 1011 | }; |
798 | 1012 | ||
1013 | static struct dvb_usb_device_properties dw3101_properties = { | ||
1014 | .caps = DVB_USB_IS_AN_I2C_ADAPTER, | ||
1015 | .usb_ctrl = DEVICE_SPECIFIC, | ||
1016 | .firmware = "dvb-usb-dw3101.fw", | ||
1017 | .no_reconnect = 1, | ||
1018 | |||
1019 | .i2c_algo = &dw3101_i2c_algo, | ||
1020 | .rc_key_map = dw210x_rc_keys, | ||
1021 | .rc_key_map_size = ARRAY_SIZE(dw210x_rc_keys), | ||
1022 | .rc_interval = 150, | ||
1023 | .rc_query = dw2102_rc_query, | ||
1024 | |||
1025 | .generic_bulk_ctrl_endpoint = 0x81, | ||
1026 | /* parameter for the MPEG2-data transfer */ | ||
1027 | .num_adapters = 1, | ||
1028 | .download_firmware = dw2102_load_firmware, | ||
1029 | .read_mac_address = dw210x_read_mac_address, | ||
1030 | .adapter = { | ||
1031 | { | ||
1032 | .frontend_attach = dw3101_frontend_attach, | ||
1033 | .streaming_ctrl = NULL, | ||
1034 | .tuner_attach = dw3101_tuner_attach, | ||
1035 | .stream = { | ||
1036 | .type = USB_BULK, | ||
1037 | .count = 8, | ||
1038 | .endpoint = 0x82, | ||
1039 | .u = { | ||
1040 | .bulk = { | ||
1041 | .buffersize = 4096, | ||
1042 | } | ||
1043 | } | ||
1044 | }, | ||
1045 | } | ||
1046 | }, | ||
1047 | .num_device_descs = 1, | ||
1048 | .devices = { | ||
1049 | { "DVBWorld DVB-C 3101 USB2.0", | ||
1050 | {&dw2102_table[5], NULL}, | ||
1051 | {NULL}, | ||
1052 | }, | ||
1053 | } | ||
1054 | }; | ||
1055 | |||
799 | static int dw2102_probe(struct usb_interface *intf, | 1056 | static int dw2102_probe(struct usb_interface *intf, |
800 | const struct usb_device_id *id) | 1057 | const struct usb_device_id *id) |
801 | { | 1058 | { |
802 | if (0 == dvb_usb_device_init(intf, &dw2102_properties, | 1059 | if (0 == dvb_usb_device_init(intf, &dw2102_properties, |
803 | THIS_MODULE, NULL, adapter_nr) || | 1060 | THIS_MODULE, NULL, adapter_nr) || |
804 | 0 == dvb_usb_device_init(intf, &dw2104_properties, | 1061 | 0 == dvb_usb_device_init(intf, &dw2104_properties, |
1062 | THIS_MODULE, NULL, adapter_nr) || | ||
1063 | 0 == dvb_usb_device_init(intf, &dw3101_properties, | ||
805 | THIS_MODULE, NULL, adapter_nr)) { | 1064 | THIS_MODULE, NULL, adapter_nr)) { |
806 | return 0; | 1065 | return 0; |
807 | } | 1066 | } |
@@ -833,6 +1092,8 @@ module_init(dw2102_module_init); | |||
833 | module_exit(dw2102_module_exit); | 1092 | module_exit(dw2102_module_exit); |
834 | 1093 | ||
835 | MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by"); | 1094 | MODULE_AUTHOR("Igor M. Liplianin (c) liplianin@me.by"); |
836 | MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104 USB2.0 device"); | 1095 | MODULE_DESCRIPTION("Driver for DVBWorld DVB-S 2101, 2102, DVB-S2 2104," |
1096 | " DVB-C 3101 USB2.0," | ||
1097 | " TeVii S600, S650 USB2.0 devices"); | ||
837 | MODULE_VERSION("0.1"); | 1098 | MODULE_VERSION("0.1"); |
838 | MODULE_LICENSE("GPL"); | 1099 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/media/dvb/dvb-usb/dw2102.h b/drivers/media/dvb/dvb-usb/dw2102.h index e3370734e95a..5cd0b0eb6ce1 100644 --- a/drivers/media/dvb/dvb-usb/dw2102.h +++ b/drivers/media/dvb/dvb-usb/dw2102.h | |||
@@ -5,4 +5,5 @@ | |||
5 | #include "dvb-usb.h" | 5 | #include "dvb-usb.h" |
6 | 6 | ||
7 | #define deb_xfer(args...) dprintk(dvb_usb_dw2102_debug, 0x02, args) | 7 | #define deb_xfer(args...) dprintk(dvb_usb_dw2102_debug, 0x02, args) |
8 | #define deb_rc(args...) dprintk(dvb_usb_dw2102_debug, 0x04, args) | ||
8 | #endif | 9 | #endif |
diff --git a/drivers/media/dvb/dvb-usb/gp8psk.c b/drivers/media/dvb/dvb-usb/gp8psk.c index 3dd6843864ed..afb444db43ad 100644 --- a/drivers/media/dvb/dvb-usb/gp8psk.c +++ b/drivers/media/dvb/dvb-usb/gp8psk.c | |||
@@ -223,7 +223,7 @@ static struct usb_device_id gp8psk_usb_table [] = { | |||
223 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_1_WARM) }, | 223 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_1_WARM) }, |
224 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_2) }, | 224 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_8PSK_REV_2) }, |
225 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_1) }, | 225 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_1) }, |
226 | { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_CW3K) }, | 226 | /* { USB_DEVICE(USB_VID_GENPIX, USB_PID_GENPIX_SKYWALKER_CW3K) }, */ |
227 | { 0 }, | 227 | { 0 }, |
228 | }; | 228 | }; |
229 | MODULE_DEVICE_TABLE(usb, gp8psk_usb_table); | 229 | MODULE_DEVICE_TABLE(usb, gp8psk_usb_table); |
@@ -254,7 +254,7 @@ static struct dvb_usb_device_properties gp8psk_properties = { | |||
254 | 254 | ||
255 | .generic_bulk_ctrl_endpoint = 0x01, | 255 | .generic_bulk_ctrl_endpoint = 0x01, |
256 | 256 | ||
257 | .num_device_descs = 4, | 257 | .num_device_descs = 3, |
258 | .devices = { | 258 | .devices = { |
259 | { .name = "Genpix 8PSK-to-USB2 Rev.1 DVB-S receiver", | 259 | { .name = "Genpix 8PSK-to-USB2 Rev.1 DVB-S receiver", |
260 | .cold_ids = { &gp8psk_usb_table[0], NULL }, | 260 | .cold_ids = { &gp8psk_usb_table[0], NULL }, |
@@ -268,10 +268,6 @@ static struct dvb_usb_device_properties gp8psk_properties = { | |||
268 | .cold_ids = { NULL }, | 268 | .cold_ids = { NULL }, |
269 | .warm_ids = { &gp8psk_usb_table[3], NULL }, | 269 | .warm_ids = { &gp8psk_usb_table[3], NULL }, |
270 | }, | 270 | }, |
271 | { .name = "Genpix SkyWalker-CW3K DVB-S receiver", | ||
272 | .cold_ids = { NULL }, | ||
273 | .warm_ids = { &gp8psk_usb_table[4], NULL }, | ||
274 | }, | ||
275 | { NULL }, | 271 | { NULL }, |
276 | } | 272 | } |
277 | }; | 273 | }; |