diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-06-17 21:16:55 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2009-06-17 21:16:55 -0400 |
commit | 4b337c5f245b6587ba844ac7bb13c313a2912f7b (patch) | |
tree | 999c6a6580b76a083c8efb9dabff709d1c49fcd0 /drivers/media/video/em28xx/em28xx-cards.c | |
parent | 492b057c426e4aa747484958e18e9da29003985d (diff) | |
parent | 3fe0344faf7fdcb158bd5c1a9aec960a8d70c8e8 (diff) |
Merge commit 'origin/master' into next
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-cards.c')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 222 |
1 files changed, 200 insertions, 22 deletions
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 7c70738479dd..00cc791a9e44 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -49,6 +49,11 @@ static unsigned int disable_ir; | |||
49 | module_param(disable_ir, int, 0444); | 49 | module_param(disable_ir, int, 0444); |
50 | MODULE_PARM_DESC(disable_ir, "disable infrared remote support"); | 50 | MODULE_PARM_DESC(disable_ir, "disable infrared remote support"); |
51 | 51 | ||
52 | static unsigned int disable_usb_speed_check; | ||
53 | module_param(disable_usb_speed_check, int, 0444); | ||
54 | MODULE_PARM_DESC(disable_usb_speed_check, | ||
55 | "override min bandwidth requirement of 480M bps"); | ||
56 | |||
52 | static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; | 57 | static unsigned int card[] = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET }; |
53 | module_param_array(card, int, NULL, 0444); | 58 | module_param_array(card, int, NULL, 0444); |
54 | MODULE_PARM_DESC(card, "card type"); | 59 | MODULE_PARM_DESC(card, "card type"); |
@@ -104,6 +109,24 @@ static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = { | |||
104 | /* Board - EM2870 Kworld 355u | 109 | /* Board - EM2870 Kworld 355u |
105 | Analog - No input analog */ | 110 | Analog - No input analog */ |
106 | 111 | ||
112 | /* Board - EM2882 Kworld 315U digital */ | ||
113 | static struct em28xx_reg_seq em2882_kworld_315u_digital[] = { | ||
114 | {EM28XX_R08_GPIO, 0xff, 0xff, 10}, | ||
115 | {EM28XX_R08_GPIO, 0xfe, 0xff, 10}, | ||
116 | {EM2880_R04_GPO, 0x04, 0xff, 10}, | ||
117 | {EM2880_R04_GPO, 0x0c, 0xff, 10}, | ||
118 | {EM28XX_R08_GPIO, 0x7e, 0xff, 10}, | ||
119 | { -1, -1, -1, -1}, | ||
120 | }; | ||
121 | |||
122 | static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = { | ||
123 | {EM2880_R04_GPO, 0x08, 0xff, 10}, | ||
124 | {EM2880_R04_GPO, 0x0c, 0xff, 10}, | ||
125 | {EM2880_R04_GPO, 0x08, 0xff, 10}, | ||
126 | {EM2880_R04_GPO, 0x0c, 0xff, 10}, | ||
127 | { -1, -1, -1, -1}, | ||
128 | }; | ||
129 | |||
107 | static struct em28xx_reg_seq kworld_330u_analog[] = { | 130 | static struct em28xx_reg_seq kworld_330u_analog[] = { |
108 | {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, | 131 | {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, |
109 | {EM2880_R04_GPO, 0x00, 0xff, 10}, | 132 | {EM2880_R04_GPO, 0x00, 0xff, 10}, |
@@ -140,6 +163,16 @@ static struct em28xx_reg_seq compro_mute_gpio[] = { | |||
140 | { -1, -1, -1, -1}, | 163 | { -1, -1, -1, -1}, |
141 | }; | 164 | }; |
142 | 165 | ||
166 | /* Terratec AV350 */ | ||
167 | static struct em28xx_reg_seq terratec_av350_mute_gpio[] = { | ||
168 | {EM28XX_R08_GPIO, 0xff, 0x7f, 10}, | ||
169 | { -1, -1, -1, -1}, | ||
170 | }; | ||
171 | |||
172 | static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = { | ||
173 | {EM28XX_R08_GPIO, 0xff, 0xff, 10}, | ||
174 | { -1, -1, -1, -1}, | ||
175 | }; | ||
143 | /* | 176 | /* |
144 | * Board definitions | 177 | * Board definitions |
145 | */ | 178 | */ |
@@ -992,16 +1025,17 @@ struct em28xx_board em28xx_boards[] = { | |||
992 | .amux = EM28XX_AMUX_LINE_IN, | 1025 | .amux = EM28XX_AMUX_LINE_IN, |
993 | } }, | 1026 | } }, |
994 | }, | 1027 | }, |
995 | [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = { | 1028 | [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = { |
996 | .name = "PointNix Intra-Oral Camera", | 1029 | .name = "EM2860/SAA711X Reference Design", |
997 | .has_snapshot_button = 1, | 1030 | .has_snapshot_button = 1, |
998 | .tda9887_conf = TDA9887_PRESENT, | ||
999 | .tuner_type = TUNER_ABSENT, | 1031 | .tuner_type = TUNER_ABSENT, |
1000 | .decoder = EM28XX_SAA711X, | 1032 | .decoder = EM28XX_SAA711X, |
1001 | .input = { { | 1033 | .input = { { |
1002 | .type = EM28XX_VMUX_SVIDEO, | 1034 | .type = EM28XX_VMUX_SVIDEO, |
1003 | .vmux = SAA7115_SVIDEO3, | 1035 | .vmux = SAA7115_SVIDEO3, |
1004 | .amux = EM28XX_AMUX_VIDEO, | 1036 | }, { |
1037 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1038 | .vmux = SAA7115_COMPOSITE0, | ||
1005 | } }, | 1039 | } }, |
1006 | }, | 1040 | }, |
1007 | [EM2880_BOARD_MSI_DIGIVOX_AD] = { | 1041 | [EM2880_BOARD_MSI_DIGIVOX_AD] = { |
@@ -1095,6 +1129,63 @@ struct em28xx_board em28xx_boards[] = { | |||
1095 | .gpio = default_analog, | 1129 | .gpio = default_analog, |
1096 | } }, | 1130 | } }, |
1097 | }, | 1131 | }, |
1132 | [EM2882_BOARD_KWORLD_ATSC_315U] = { | ||
1133 | .name = "KWorld ATSC 315U HDTV TV Box", | ||
1134 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
1135 | .tuner_type = TUNER_THOMSON_DTT761X, | ||
1136 | .tuner_gpio = em2882_kworld_315u_tuner_gpio, | ||
1137 | .tda9887_conf = TDA9887_PRESENT, | ||
1138 | .decoder = EM28XX_SAA711X, | ||
1139 | .has_dvb = 1, | ||
1140 | .dvb_gpio = em2882_kworld_315u_digital, | ||
1141 | .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, | ||
1142 | .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE, | ||
1143 | /* Analog mode - still not ready */ | ||
1144 | /*.input = { { | ||
1145 | .type = EM28XX_VMUX_TELEVISION, | ||
1146 | .vmux = SAA7115_COMPOSITE2, | ||
1147 | .amux = EM28XX_AMUX_VIDEO, | ||
1148 | .gpio = em2882_kworld_315u_analog, | ||
1149 | .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, | ||
1150 | }, { | ||
1151 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1152 | .vmux = SAA7115_COMPOSITE0, | ||
1153 | .amux = EM28XX_AMUX_LINE_IN, | ||
1154 | .gpio = em2882_kworld_315u_analog1, | ||
1155 | .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, | ||
1156 | }, { | ||
1157 | .type = EM28XX_VMUX_SVIDEO, | ||
1158 | .vmux = SAA7115_SVIDEO3, | ||
1159 | .amux = EM28XX_AMUX_LINE_IN, | ||
1160 | .gpio = em2882_kworld_315u_analog1, | ||
1161 | .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO, | ||
1162 | } }, */ | ||
1163 | }, | ||
1164 | [EM2880_BOARD_EMPIRE_DUAL_TV] = { | ||
1165 | .name = "Empire dual TV", | ||
1166 | .tuner_type = TUNER_XC2028, | ||
1167 | .tuner_gpio = default_tuner_gpio, | ||
1168 | .has_dvb = 1, | ||
1169 | .dvb_gpio = default_digital, | ||
1170 | .mts_firmware = 1, | ||
1171 | .decoder = EM28XX_TVP5150, | ||
1172 | .input = { { | ||
1173 | .type = EM28XX_VMUX_TELEVISION, | ||
1174 | .vmux = TVP5150_COMPOSITE0, | ||
1175 | .amux = EM28XX_AMUX_VIDEO, | ||
1176 | .gpio = default_analog, | ||
1177 | }, { | ||
1178 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1179 | .vmux = TVP5150_COMPOSITE1, | ||
1180 | .amux = EM28XX_AMUX_LINE_IN, | ||
1181 | .gpio = default_analog, | ||
1182 | }, { | ||
1183 | .type = EM28XX_VMUX_SVIDEO, | ||
1184 | .vmux = TVP5150_SVIDEO, | ||
1185 | .amux = EM28XX_AMUX_LINE_IN, | ||
1186 | .gpio = default_analog, | ||
1187 | } }, | ||
1188 | }, | ||
1098 | [EM2881_BOARD_DNT_DA2_HYBRID] = { | 1189 | [EM2881_BOARD_DNT_DA2_HYBRID] = { |
1099 | .name = "DNT DA2 Hybrid", | 1190 | .name = "DNT DA2 Hybrid", |
1100 | .valid = EM28XX_BOARD_NOT_VALIDATED, | 1191 | .valid = EM28XX_BOARD_NOT_VALIDATED, |
@@ -1322,6 +1413,42 @@ struct em28xx_board em28xx_boards[] = { | |||
1322 | .amux = EM28XX_AMUX_VIDEO, | 1413 | .amux = EM28XX_AMUX_VIDEO, |
1323 | } }, | 1414 | } }, |
1324 | }, | 1415 | }, |
1416 | [EM2860_BOARD_TERRATEC_GRABBY] = { | ||
1417 | .name = "Terratec Grabby", | ||
1418 | .vchannels = 2, | ||
1419 | .tuner_type = TUNER_ABSENT, | ||
1420 | .decoder = EM28XX_SAA711X, | ||
1421 | .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, | ||
1422 | .input = { { | ||
1423 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1424 | .vmux = SAA7115_COMPOSITE0, | ||
1425 | .amux = EM28XX_AMUX_VIDEO2, | ||
1426 | }, { | ||
1427 | .type = EM28XX_VMUX_SVIDEO, | ||
1428 | .vmux = SAA7115_SVIDEO3, | ||
1429 | .amux = EM28XX_AMUX_VIDEO2, | ||
1430 | } }, | ||
1431 | }, | ||
1432 | [EM2860_BOARD_TERRATEC_AV350] = { | ||
1433 | .name = "Terratec AV350", | ||
1434 | .vchannels = 2, | ||
1435 | .tuner_type = TUNER_ABSENT, | ||
1436 | .decoder = EM28XX_TVP5150, | ||
1437 | .xclk = EM28XX_XCLK_FREQUENCY_12MHZ, | ||
1438 | .mute_gpio = terratec_av350_mute_gpio, | ||
1439 | .input = { { | ||
1440 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1441 | .vmux = TVP5150_COMPOSITE1, | ||
1442 | .amux = EM28XX_AUDIO_SRC_LINE, | ||
1443 | .gpio = terratec_av350_unmute_gpio, | ||
1444 | |||
1445 | }, { | ||
1446 | .type = EM28XX_VMUX_SVIDEO, | ||
1447 | .vmux = TVP5150_SVIDEO, | ||
1448 | .amux = EM28XX_AUDIO_SRC_LINE, | ||
1449 | .gpio = terratec_av350_unmute_gpio, | ||
1450 | } }, | ||
1451 | }, | ||
1325 | }; | 1452 | }; |
1326 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); | 1453 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
1327 | 1454 | ||
@@ -1355,6 +1482,8 @@ struct usb_device_id em28xx_id_table[] = { | |||
1355 | .driver_info = EM2880_BOARD_KWORLD_DVB_305U }, | 1482 | .driver_info = EM2880_BOARD_KWORLD_DVB_305U }, |
1356 | { USB_DEVICE(0xeb1a, 0xe310), | 1483 | { USB_DEVICE(0xeb1a, 0xe310), |
1357 | .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, | 1484 | .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, |
1485 | { USB_DEVICE(0xeb1a, 0xa313), | ||
1486 | .driver_info = EM2882_BOARD_KWORLD_ATSC_315U }, | ||
1358 | { USB_DEVICE(0xeb1a, 0xa316), | 1487 | { USB_DEVICE(0xeb1a, 0xa316), |
1359 | .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U }, | 1488 | .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U }, |
1360 | { USB_DEVICE(0xeb1a, 0xe320), | 1489 | { USB_DEVICE(0xeb1a, 0xe320), |
@@ -1385,6 +1514,10 @@ struct usb_device_id em28xx_id_table[] = { | |||
1385 | .driver_info = EM2870_BOARD_TERRATEC_XS }, | 1514 | .driver_info = EM2870_BOARD_TERRATEC_XS }, |
1386 | { USB_DEVICE(0x0ccd, 0x0047), | 1515 | { USB_DEVICE(0x0ccd, 0x0047), |
1387 | .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, | 1516 | .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, |
1517 | { USB_DEVICE(0x0ccd, 0x0084), | ||
1518 | .driver_info = EM2860_BOARD_TERRATEC_AV350 }, | ||
1519 | { USB_DEVICE(0x0ccd, 0x0096), | ||
1520 | .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, | ||
1388 | { USB_DEVICE(0x185b, 0x2870), | 1521 | { USB_DEVICE(0x185b, 0x2870), |
1389 | .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, | 1522 | .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, |
1390 | { USB_DEVICE(0x185b, 0x2041), | 1523 | { USB_DEVICE(0x185b, 0x2041), |
@@ -1437,13 +1570,14 @@ static struct em28xx_hash_table em28xx_eeprom_hash[] = { | |||
1437 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, | 1570 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, |
1438 | {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF}, | 1571 | {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF}, |
1439 | {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, | 1572 | {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, |
1573 | {0x9567eb1a, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028}, | ||
1440 | }; | 1574 | }; |
1441 | 1575 | ||
1442 | /* I2C devicelist hash table for devices with generic USB IDs */ | 1576 | /* I2C devicelist hash table for devices with generic USB IDs */ |
1443 | static struct em28xx_hash_table em28xx_i2c_hash[] = { | 1577 | static struct em28xx_hash_table em28xx_i2c_hash[] = { |
1444 | {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, | 1578 | {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, |
1445 | {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, | 1579 | {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, |
1446 | {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT}, | 1580 | {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT}, |
1447 | {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC}, | 1581 | {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC}, |
1448 | }; | 1582 | }; |
1449 | 1583 | ||
@@ -1619,6 +1753,17 @@ void em28xx_pre_card_setup(struct em28xx *dev) | |||
1619 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); | 1753 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); |
1620 | break; | 1754 | break; |
1621 | 1755 | ||
1756 | case EM2882_BOARD_KWORLD_ATSC_315U: | ||
1757 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff); | ||
1758 | msleep(10); | ||
1759 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); | ||
1760 | msleep(10); | ||
1761 | em28xx_write_reg(dev, EM2880_R04_GPO, 0x00); | ||
1762 | msleep(10); | ||
1763 | em28xx_write_reg(dev, EM2880_R04_GPO, 0x08); | ||
1764 | msleep(10); | ||
1765 | break; | ||
1766 | |||
1622 | case EM2860_BOARD_KAIOMY_TVNPC_U2: | 1767 | case EM2860_BOARD_KAIOMY_TVNPC_U2: |
1623 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1); | 1768 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1); |
1624 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | 1769 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); |
@@ -1664,6 +1809,7 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) | |||
1664 | ctl->mts = em28xx_boards[dev->model].mts_firmware; | 1809 | ctl->mts = em28xx_boards[dev->model].mts_firmware; |
1665 | 1810 | ||
1666 | switch (dev->model) { | 1811 | switch (dev->model) { |
1812 | case EM2880_BOARD_EMPIRE_DUAL_TV: | ||
1667 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 1813 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
1668 | ctl->demod = XC3028_FE_ZARLINK456; | 1814 | ctl->demod = XC3028_FE_ZARLINK456; |
1669 | break; | 1815 | break; |
@@ -1835,12 +1981,20 @@ static int em28xx_hint_board(struct em28xx *dev) | |||
1835 | } | 1981 | } |
1836 | 1982 | ||
1837 | /* ----------------------------------------------------------------------- */ | 1983 | /* ----------------------------------------------------------------------- */ |
1838 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) | 1984 | void em28xx_register_i2c_ir(struct em28xx *dev) |
1839 | { | 1985 | { |
1840 | if (disable_ir) { | 1986 | struct i2c_board_info info; |
1841 | ir->get_key = NULL; | 1987 | struct IR_i2c_init_data init_data; |
1842 | return ; | 1988 | const unsigned short addr_list[] = { |
1843 | } | 1989 | 0x30, 0x47, I2C_CLIENT_END |
1990 | }; | ||
1991 | |||
1992 | if (disable_ir) | ||
1993 | return; | ||
1994 | |||
1995 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
1996 | memset(&init_data, 0, sizeof(struct IR_i2c_init_data)); | ||
1997 | strlcpy(info.type, "ir_video", I2C_NAME_SIZE); | ||
1844 | 1998 | ||
1845 | /* detect & configure */ | 1999 | /* detect & configure */ |
1846 | switch (dev->model) { | 2000 | switch (dev->model) { |
@@ -1850,22 +2004,19 @@ void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) | |||
1850 | break; | 2004 | break; |
1851 | case (EM2800_BOARD_TERRATEC_CINERGY_200): | 2005 | case (EM2800_BOARD_TERRATEC_CINERGY_200): |
1852 | case (EM2820_BOARD_TERRATEC_CINERGY_250): | 2006 | case (EM2820_BOARD_TERRATEC_CINERGY_250): |
1853 | ir->ir_codes = ir_codes_em_terratec; | 2007 | init_data.ir_codes = ir_codes_em_terratec; |
1854 | ir->get_key = em28xx_get_key_terratec; | 2008 | init_data.get_key = em28xx_get_key_terratec; |
1855 | snprintf(ir->c.name, sizeof(ir->c.name), | 2009 | init_data.name = "i2c IR (EM28XX Terratec)"; |
1856 | "i2c IR (EM28XX Terratec)"); | ||
1857 | break; | 2010 | break; |
1858 | case (EM2820_BOARD_PINNACLE_USB_2): | 2011 | case (EM2820_BOARD_PINNACLE_USB_2): |
1859 | ir->ir_codes = ir_codes_pinnacle_grey; | 2012 | init_data.ir_codes = ir_codes_pinnacle_grey; |
1860 | ir->get_key = em28xx_get_key_pinnacle_usb_grey; | 2013 | init_data.get_key = em28xx_get_key_pinnacle_usb_grey; |
1861 | snprintf(ir->c.name, sizeof(ir->c.name), | 2014 | init_data.name = "i2c IR (EM28XX Pinnacle PCTV)"; |
1862 | "i2c IR (EM28XX Pinnacle PCTV)"); | ||
1863 | break; | 2015 | break; |
1864 | case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): | 2016 | case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): |
1865 | ir->ir_codes = ir_codes_hauppauge_new; | 2017 | init_data.ir_codes = ir_codes_hauppauge_new; |
1866 | ir->get_key = em28xx_get_key_em_haup; | 2018 | init_data.get_key = em28xx_get_key_em_haup; |
1867 | snprintf(ir->c.name, sizeof(ir->c.name), | 2019 | init_data.name = "i2c IR (EM2840 Hauppauge)"; |
1868 | "i2c IR (EM2840 Hauppauge)"); | ||
1869 | break; | 2020 | break; |
1870 | case (EM2820_BOARD_MSI_VOX_USB_2): | 2021 | case (EM2820_BOARD_MSI_VOX_USB_2): |
1871 | break; | 2022 | break; |
@@ -1876,6 +2027,10 @@ void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) | |||
1876 | case (EM2800_BOARD_GRABBEEX_USB2800): | 2027 | case (EM2800_BOARD_GRABBEEX_USB2800): |
1877 | break; | 2028 | break; |
1878 | } | 2029 | } |
2030 | |||
2031 | if (init_data.name) | ||
2032 | info.platform_data = &init_data; | ||
2033 | i2c_new_probed_device(&dev->i2c_adap, &info, addr_list); | ||
1879 | } | 2034 | } |
1880 | 2035 | ||
1881 | void em28xx_card_setup(struct em28xx *dev) | 2036 | void em28xx_card_setup(struct em28xx *dev) |
@@ -1886,6 +2041,9 @@ void em28xx_card_setup(struct em28xx *dev) | |||
1886 | if (em28xx_boards[dev->model].tuner_addr) | 2041 | if (em28xx_boards[dev->model].tuner_addr) |
1887 | dev->tuner_addr = em28xx_boards[dev->model].tuner_addr; | 2042 | dev->tuner_addr = em28xx_boards[dev->model].tuner_addr; |
1888 | 2043 | ||
2044 | if (em28xx_boards[dev->model].tda9887_conf) | ||
2045 | dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf; | ||
2046 | |||
1889 | /* request some modules */ | 2047 | /* request some modules */ |
1890 | switch (dev->model) { | 2048 | switch (dev->model) { |
1891 | case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: | 2049 | case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: |
@@ -1915,6 +2073,12 @@ void em28xx_card_setup(struct em28xx *dev) | |||
1915 | #endif | 2073 | #endif |
1916 | break; | 2074 | break; |
1917 | } | 2075 | } |
2076 | case EM2882_BOARD_KWORLD_ATSC_315U: | ||
2077 | em28xx_write_reg(dev, 0x0d, 0x42); | ||
2078 | msleep(10); | ||
2079 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); | ||
2080 | msleep(10); | ||
2081 | break; | ||
1918 | case EM2820_BOARD_KWORLD_PVRTV2800RF: | 2082 | case EM2820_BOARD_KWORLD_PVRTV2800RF: |
1919 | /* GPIO enables sound on KWORLD PVR TV 2800RF */ | 2083 | /* GPIO enables sound on KWORLD PVR TV 2800RF */ |
1920 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9); | 2084 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9); |
@@ -2279,6 +2443,20 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
2279 | ifnum, | 2443 | ifnum, |
2280 | interface->altsetting->desc.bInterfaceNumber); | 2444 | interface->altsetting->desc.bInterfaceNumber); |
2281 | 2445 | ||
2446 | /* | ||
2447 | * Make sure we have 480 Mbps of bandwidth, otherwise things like | ||
2448 | * video stream wouldn't likely work, since 12 Mbps is generally | ||
2449 | * not enough even for most Digital TV streams. | ||
2450 | */ | ||
2451 | if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) { | ||
2452 | printk(DRIVER_NAME ": Device initialization failed.\n"); | ||
2453 | printk(DRIVER_NAME ": Device must be connected to a high-speed" | ||
2454 | " USB 2.0 port.\n"); | ||
2455 | em28xx_devused &= ~(1<<nr); | ||
2456 | retval = -ENODEV; | ||
2457 | goto err; | ||
2458 | } | ||
2459 | |||
2282 | if (nr >= EM28XX_MAXBOARDS) { | 2460 | if (nr >= EM28XX_MAXBOARDS) { |
2283 | printk(DRIVER_NAME ": Supports only %i em28xx boards.\n", | 2461 | printk(DRIVER_NAME ": Supports only %i em28xx boards.\n", |
2284 | EM28XX_MAXBOARDS); | 2462 | EM28XX_MAXBOARDS); |