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 | |
parent | 492b057c426e4aa747484958e18e9da29003985d (diff) | |
parent | 3fe0344faf7fdcb158bd5c1a9aec960a8d70c8e8 (diff) |
Merge commit 'origin/master' into next
Diffstat (limited to 'drivers/media/video/em28xx')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-audio.c | 5 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 222 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-core.c | 58 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-dvb.c | 21 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-i2c.c | 25 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-input.c | 8 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-reg.h | 16 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx.h | 9 |
8 files changed, 302 insertions, 62 deletions
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index 0131322475bf..7bd8a70f0a0b 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
@@ -339,6 +339,11 @@ static int snd_em28xx_pcm_close(struct snd_pcm_substream *substream) | |||
339 | mutex_lock(&dev->lock); | 339 | mutex_lock(&dev->lock); |
340 | dev->adev.users--; | 340 | dev->adev.users--; |
341 | em28xx_audio_analog_set(dev); | 341 | em28xx_audio_analog_set(dev); |
342 | if (substream->runtime->dma_area) { | ||
343 | dprintk("freeing\n"); | ||
344 | vfree(substream->runtime->dma_area); | ||
345 | substream->runtime->dma_area = NULL; | ||
346 | } | ||
342 | mutex_unlock(&dev->lock); | 347 | mutex_unlock(&dev->lock); |
343 | 348 | ||
344 | return 0; | 349 | return 0; |
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); |
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c index 192b76cdd5d7..c8d7ce8fbd36 100644 --- a/drivers/media/video/em28xx/em28xx-core.c +++ b/drivers/media/video/em28xx/em28xx-core.c | |||
@@ -500,18 +500,21 @@ int em28xx_audio_setup(struct em28xx *dev) | |||
500 | 500 | ||
501 | /* See how this device is configured */ | 501 | /* See how this device is configured */ |
502 | cfg = em28xx_read_reg(dev, EM28XX_R00_CHIPCFG); | 502 | cfg = em28xx_read_reg(dev, EM28XX_R00_CHIPCFG); |
503 | if (cfg < 0) | 503 | em28xx_info("Config register raw data: 0x%02x\n", cfg); |
504 | if (cfg < 0) { | ||
505 | /* Register read error? */ | ||
504 | cfg = EM28XX_CHIPCFG_AC97; /* Be conservative */ | 506 | cfg = EM28XX_CHIPCFG_AC97; /* Be conservative */ |
505 | else | 507 | } else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == 0x00) { |
506 | em28xx_info("Config register raw data: 0x%02x\n", cfg); | 508 | /* The device doesn't have vendor audio at all */ |
507 | 509 | dev->has_alsa_audio = 0; | |
508 | if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == | 510 | dev->audio_mode.has_audio = 0; |
509 | EM28XX_CHIPCFG_I2S_3_SAMPRATES) { | 511 | return 0; |
512 | } else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == | ||
513 | EM28XX_CHIPCFG_I2S_3_SAMPRATES) { | ||
510 | em28xx_info("I2S Audio (3 sample rates)\n"); | 514 | em28xx_info("I2S Audio (3 sample rates)\n"); |
511 | dev->audio_mode.i2s_3rates = 1; | 515 | dev->audio_mode.i2s_3rates = 1; |
512 | } | 516 | } else if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == |
513 | if ((cfg & EM28XX_CHIPCFG_AUDIOMASK) == | 517 | EM28XX_CHIPCFG_I2S_5_SAMPRATES) { |
514 | EM28XX_CHIPCFG_I2S_5_SAMPRATES) { | ||
515 | em28xx_info("I2S Audio (5 sample rates)\n"); | 518 | em28xx_info("I2S Audio (5 sample rates)\n"); |
516 | dev->audio_mode.i2s_5rates = 1; | 519 | dev->audio_mode.i2s_5rates = 1; |
517 | } | 520 | } |
@@ -938,7 +941,7 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, | |||
938 | dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs, | 941 | dev->isoc_ctl.transfer_buffer = kzalloc(sizeof(void *)*num_bufs, |
939 | GFP_KERNEL); | 942 | GFP_KERNEL); |
940 | if (!dev->isoc_ctl.transfer_buffer) { | 943 | if (!dev->isoc_ctl.transfer_buffer) { |
941 | em28xx_errdev("cannot allocate memory for usbtransfer\n"); | 944 | em28xx_errdev("cannot allocate memory for usb transfer\n"); |
942 | kfree(dev->isoc_ctl.urb); | 945 | kfree(dev->isoc_ctl.urb); |
943 | return -ENOMEM; | 946 | return -ENOMEM; |
944 | } | 947 | } |
@@ -1012,6 +1015,41 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, | |||
1012 | } | 1015 | } |
1013 | EXPORT_SYMBOL_GPL(em28xx_init_isoc); | 1016 | EXPORT_SYMBOL_GPL(em28xx_init_isoc); |
1014 | 1017 | ||
1018 | /* Determine the packet size for the DVB stream for the given device | ||
1019 | (underlying value programmed into the eeprom) */ | ||
1020 | int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev) | ||
1021 | { | ||
1022 | unsigned int chip_cfg2; | ||
1023 | unsigned int packet_size = 564; | ||
1024 | |||
1025 | if (dev->chip_id == CHIP_ID_EM2874) { | ||
1026 | /* FIXME - for now assume 564 like it was before, but the | ||
1027 | em2874 code should be added to return the proper value... */ | ||
1028 | packet_size = 564; | ||
1029 | } else { | ||
1030 | /* TS max packet size stored in bits 1-0 of R01 */ | ||
1031 | chip_cfg2 = em28xx_read_reg(dev, EM28XX_R01_CHIPCFG2); | ||
1032 | switch (chip_cfg2 & EM28XX_CHIPCFG2_TS_PACKETSIZE_MASK) { | ||
1033 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_188: | ||
1034 | packet_size = 188; | ||
1035 | break; | ||
1036 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_376: | ||
1037 | packet_size = 376; | ||
1038 | break; | ||
1039 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_564: | ||
1040 | packet_size = 564; | ||
1041 | break; | ||
1042 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_752: | ||
1043 | packet_size = 752; | ||
1044 | break; | ||
1045 | } | ||
1046 | } | ||
1047 | |||
1048 | em28xx_coredbg("dvb max packet size=%d\n", packet_size); | ||
1049 | return packet_size; | ||
1050 | } | ||
1051 | EXPORT_SYMBOL_GPL(em28xx_isoc_dvb_max_packetsize); | ||
1052 | |||
1015 | /* | 1053 | /* |
1016 | * em28xx_wake_i2c() | 1054 | * em28xx_wake_i2c() |
1017 | * configure i2c attached devices | 1055 | * configure i2c attached devices |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index fcd25511209b..563dd2b1c8e9 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
@@ -25,6 +25,8 @@ | |||
25 | #include "em28xx.h" | 25 | #include "em28xx.h" |
26 | #include <media/v4l2-common.h> | 26 | #include <media/v4l2-common.h> |
27 | #include <media/videobuf-vmalloc.h> | 27 | #include <media/videobuf-vmalloc.h> |
28 | #include <media/tuner.h> | ||
29 | #include "tuner-simple.h" | ||
28 | 30 | ||
29 | #include "lgdt330x.h" | 31 | #include "lgdt330x.h" |
30 | #include "zl10353.h" | 32 | #include "zl10353.h" |
@@ -46,7 +48,6 @@ if (debug >= level) \ | |||
46 | } while (0) | 48 | } while (0) |
47 | 49 | ||
48 | #define EM28XX_DVB_NUM_BUFS 5 | 50 | #define EM28XX_DVB_NUM_BUFS 5 |
49 | #define EM28XX_DVB_MAX_PACKETSIZE 564 | ||
50 | #define EM28XX_DVB_MAX_PACKETS 64 | 51 | #define EM28XX_DVB_MAX_PACKETS 64 |
51 | 52 | ||
52 | struct em28xx_dvb { | 53 | struct em28xx_dvb { |
@@ -142,14 +143,17 @@ static int start_streaming(struct em28xx_dvb *dvb) | |||
142 | { | 143 | { |
143 | int rc; | 144 | int rc; |
144 | struct em28xx *dev = dvb->adapter.priv; | 145 | struct em28xx *dev = dvb->adapter.priv; |
146 | int max_dvb_packet_size; | ||
145 | 147 | ||
146 | usb_set_interface(dev->udev, 0, 1); | 148 | usb_set_interface(dev->udev, 0, 1); |
147 | rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); | 149 | rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); |
148 | if (rc < 0) | 150 | if (rc < 0) |
149 | return rc; | 151 | return rc; |
150 | 152 | ||
153 | max_dvb_packet_size = em28xx_isoc_dvb_max_packetsize(dev); | ||
154 | |||
151 | return em28xx_init_isoc(dev, EM28XX_DVB_MAX_PACKETS, | 155 | return em28xx_init_isoc(dev, EM28XX_DVB_MAX_PACKETS, |
152 | EM28XX_DVB_NUM_BUFS, EM28XX_DVB_MAX_PACKETSIZE, | 156 | EM28XX_DVB_NUM_BUFS, max_dvb_packet_size, |
153 | dvb_isoc_copy); | 157 | dvb_isoc_copy); |
154 | } | 158 | } |
155 | 159 | ||
@@ -431,6 +435,7 @@ static int dvb_init(struct em28xx *dev) | |||
431 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 435 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
432 | case EM2880_BOARD_TERRATEC_HYBRID_XS: | 436 | case EM2880_BOARD_TERRATEC_HYBRID_XS: |
433 | case EM2880_BOARD_KWORLD_DVB_310U: | 437 | case EM2880_BOARD_KWORLD_DVB_310U: |
438 | case EM2880_BOARD_EMPIRE_DUAL_TV: | ||
434 | dvb->frontend = dvb_attach(zl10353_attach, | 439 | dvb->frontend = dvb_attach(zl10353_attach, |
435 | &em28xx_zl10353_with_xc3028, | 440 | &em28xx_zl10353_with_xc3028, |
436 | &dev->i2c_adap); | 441 | &dev->i2c_adap); |
@@ -448,6 +453,18 @@ static int dvb_init(struct em28xx *dev) | |||
448 | goto out_free; | 453 | goto out_free; |
449 | } | 454 | } |
450 | break; | 455 | break; |
456 | case EM2882_BOARD_KWORLD_ATSC_315U: | ||
457 | dvb->frontend = dvb_attach(lgdt330x_attach, | ||
458 | &em2880_lgdt3303_dev, | ||
459 | &dev->i2c_adap); | ||
460 | if (dvb->frontend != NULL) { | ||
461 | if (!dvb_attach(simple_tuner_attach, dvb->frontend, | ||
462 | &dev->i2c_adap, 0x61, TUNER_THOMSON_DTT761X)) { | ||
463 | result = -EINVAL; | ||
464 | goto out_free; | ||
465 | } | ||
466 | } | ||
467 | break; | ||
451 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: | 468 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: |
452 | #ifdef EM28XX_DRX397XD_SUPPORT | 469 | #ifdef EM28XX_DRX397XD_SUPPORT |
453 | /* We don't have the config structure properly populated, so | 470 | /* We don't have the config structure properly populated, so |
diff --git a/drivers/media/video/em28xx/em28xx-i2c.c b/drivers/media/video/em28xx/em28xx-i2c.c index f0bf1d960c75..2c86fcf089f5 100644 --- a/drivers/media/video/em28xx/em28xx-i2c.c +++ b/drivers/media/video/em28xx/em28xx-i2c.c | |||
@@ -451,27 +451,6 @@ static u32 functionality(struct i2c_adapter *adap) | |||
451 | return I2C_FUNC_SMBUS_EMUL; | 451 | return I2C_FUNC_SMBUS_EMUL; |
452 | } | 452 | } |
453 | 453 | ||
454 | /* | ||
455 | * attach_inform() | ||
456 | * gets called when a device attaches to the i2c bus | ||
457 | * does some basic configuration | ||
458 | */ | ||
459 | static int attach_inform(struct i2c_client *client) | ||
460 | { | ||
461 | struct em28xx *dev = client->adapter->algo_data; | ||
462 | struct IR_i2c *ir = i2c_get_clientdata(client); | ||
463 | |||
464 | switch (client->addr << 1) { | ||
465 | case 0x60: | ||
466 | case 0x8e: | ||
467 | dprintk1(1, "attach_inform: IR detected (%s).\n", ir->phys); | ||
468 | em28xx_set_ir(dev, ir); | ||
469 | break; | ||
470 | } | ||
471 | |||
472 | return 0; | ||
473 | } | ||
474 | |||
475 | static struct i2c_algorithm em28xx_algo = { | 454 | static struct i2c_algorithm em28xx_algo = { |
476 | .master_xfer = em28xx_i2c_xfer, | 455 | .master_xfer = em28xx_i2c_xfer, |
477 | .functionality = functionality, | 456 | .functionality = functionality, |
@@ -482,7 +461,6 @@ static struct i2c_adapter em28xx_adap_template = { | |||
482 | .name = "em28xx", | 461 | .name = "em28xx", |
483 | .id = I2C_HW_B_EM28XX, | 462 | .id = I2C_HW_B_EM28XX, |
484 | .algo = &em28xx_algo, | 463 | .algo = &em28xx_algo, |
485 | .client_register = attach_inform, | ||
486 | }; | 464 | }; |
487 | 465 | ||
488 | static struct i2c_client em28xx_client_template = { | 466 | static struct i2c_client em28xx_client_template = { |
@@ -575,6 +553,9 @@ int em28xx_i2c_register(struct em28xx *dev) | |||
575 | if (i2c_scan) | 553 | if (i2c_scan) |
576 | em28xx_do_i2c_scan(dev); | 554 | em28xx_do_i2c_scan(dev); |
577 | 555 | ||
556 | /* Instantiate the IR receiver device, if present */ | ||
557 | em28xx_register_i2c_ir(dev); | ||
558 | |||
578 | return 0; | 559 | return 0; |
579 | } | 560 | } |
580 | 561 | ||
diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c index a5abfd7a19f5..7a0fe3816e3d 100644 --- a/drivers/media/video/em28xx/em28xx-input.c +++ b/drivers/media/video/em28xx/em28xx-input.c | |||
@@ -40,7 +40,7 @@ MODULE_PARM_DESC(ir_debug, "enable debug messages [IR]"); | |||
40 | 40 | ||
41 | #define i2cdprintk(fmt, arg...) \ | 41 | #define i2cdprintk(fmt, arg...) \ |
42 | if (ir_debug) { \ | 42 | if (ir_debug) { \ |
43 | printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg); \ | 43 | printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg); \ |
44 | } | 44 | } |
45 | 45 | ||
46 | #define dprintk(fmt, arg...) \ | 46 | #define dprintk(fmt, arg...) \ |
@@ -85,7 +85,7 @@ int em28xx_get_key_terratec(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
85 | unsigned char b; | 85 | unsigned char b; |
86 | 86 | ||
87 | /* poll IR chip */ | 87 | /* poll IR chip */ |
88 | if (1 != i2c_master_recv(&ir->c, &b, 1)) { | 88 | if (1 != i2c_master_recv(ir->c, &b, 1)) { |
89 | i2cdprintk("read error\n"); | 89 | i2cdprintk("read error\n"); |
90 | return -EIO; | 90 | return -EIO; |
91 | } | 91 | } |
@@ -114,7 +114,7 @@ int em28xx_get_key_em_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
114 | unsigned char code; | 114 | unsigned char code; |
115 | 115 | ||
116 | /* poll IR chip */ | 116 | /* poll IR chip */ |
117 | if (2 != i2c_master_recv(&ir->c, buf, 2)) | 117 | if (2 != i2c_master_recv(ir->c, buf, 2)) |
118 | return -EIO; | 118 | return -EIO; |
119 | 119 | ||
120 | /* Does eliminate repeated parity code */ | 120 | /* Does eliminate repeated parity code */ |
@@ -147,7 +147,7 @@ int em28xx_get_key_pinnacle_usb_grey(struct IR_i2c *ir, u32 *ir_key, | |||
147 | 147 | ||
148 | /* poll IR chip */ | 148 | /* poll IR chip */ |
149 | 149 | ||
150 | if (3 != i2c_master_recv(&ir->c, buf, 3)) { | 150 | if (3 != i2c_master_recv(ir->c, buf, 3)) { |
151 | i2cdprintk("read error\n"); | 151 | i2cdprintk("read error\n"); |
152 | return -EIO; | 152 | return -EIO; |
153 | } | 153 | } |
diff --git a/drivers/media/video/em28xx/em28xx-reg.h b/drivers/media/video/em28xx/em28xx-reg.h index 24e39c56811e..a2676d63cfd0 100644 --- a/drivers/media/video/em28xx/em28xx-reg.h +++ b/drivers/media/video/em28xx/em28xx-reg.h | |||
@@ -27,6 +27,22 @@ | |||
27 | #define EM28XX_CHIPCFG_AC97 0x10 | 27 | #define EM28XX_CHIPCFG_AC97 0x10 |
28 | #define EM28XX_CHIPCFG_AUDIOMASK 0x30 | 28 | #define EM28XX_CHIPCFG_AUDIOMASK 0x30 |
29 | 29 | ||
30 | #define EM28XX_R01_CHIPCFG2 0x01 | ||
31 | |||
32 | /* em28xx Chip Configuration 2 0x01 */ | ||
33 | #define EM28XX_CHIPCFG2_TS_PRESENT 0x10 | ||
34 | #define EM28XX_CHIPCFG2_TS_REQ_INTERVAL_MASK 0x0c /* bits 3-2 */ | ||
35 | #define EM28XX_CHIPCFG2_TS_REQ_INTERVAL_1MF 0x00 | ||
36 | #define EM28XX_CHIPCFG2_TS_REQ_INTERVAL_2MF 0x04 | ||
37 | #define EM28XX_CHIPCFG2_TS_REQ_INTERVAL_4MF 0x08 | ||
38 | #define EM28XX_CHIPCFG2_TS_REQ_INTERVAL_8MF 0x0c | ||
39 | #define EM28XX_CHIPCFG2_TS_PACKETSIZE_MASK 0x03 /* bits 0-1 */ | ||
40 | #define EM28XX_CHIPCFG2_TS_PACKETSIZE_188 0x00 | ||
41 | #define EM28XX_CHIPCFG2_TS_PACKETSIZE_376 0x01 | ||
42 | #define EM28XX_CHIPCFG2_TS_PACKETSIZE_564 0x02 | ||
43 | #define EM28XX_CHIPCFG2_TS_PACKETSIZE_752 0x03 | ||
44 | |||
45 | |||
30 | /* GPIO/GPO registers */ | 46 | /* GPIO/GPO registers */ |
31 | #define EM2880_R04_GPO 0x04 /* em2880-em2883 only */ | 47 | #define EM2880_R04_GPO 0x04 /* em2880-em2883 only */ |
32 | #define EM28XX_R08_GPIO 0x08 /* em2820 or upper */ | 48 | #define EM28XX_R08_GPIO 0x08 /* em2820 or upper */ |
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 4c4e58004f54..8bf81be1da61 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
@@ -58,7 +58,7 @@ | |||
58 | #define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16 | 58 | #define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 16 |
59 | #define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17 | 59 | #define EM2880_BOARD_PINNACLE_PCTV_HD_PRO 17 |
60 | #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18 | 60 | #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 18 |
61 | #define EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA 19 | 61 | #define EM2860_BOARD_SAA711X_REFERENCE_DESIGN 19 |
62 | #define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20 | 62 | #define EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 20 |
63 | #define EM2800_BOARD_GRABBEEX_USB2800 21 | 63 | #define EM2800_BOARD_GRABBEEX_USB2800 21 |
64 | #define EM2750_BOARD_UNKNOWN 22 | 64 | #define EM2750_BOARD_UNKNOWN 22 |
@@ -102,6 +102,10 @@ | |||
102 | #define EM2860_BOARD_KAIOMY_TVNPC_U2 63 | 102 | #define EM2860_BOARD_KAIOMY_TVNPC_U2 63 |
103 | #define EM2860_BOARD_EASYCAP 64 | 103 | #define EM2860_BOARD_EASYCAP 64 |
104 | #define EM2820_BOARD_IODATA_GVMVP_SZ 65 | 104 | #define EM2820_BOARD_IODATA_GVMVP_SZ 65 |
105 | #define EM2880_BOARD_EMPIRE_DUAL_TV 66 | ||
106 | #define EM2860_BOARD_TERRATEC_GRABBY 67 | ||
107 | #define EM2860_BOARD_TERRATEC_AV350 68 | ||
108 | #define EM2882_BOARD_KWORLD_ATSC_315U 69 | ||
105 | 109 | ||
106 | /* Limits minimum and default number of buffers */ | 110 | /* Limits minimum and default number of buffers */ |
107 | #define EM28XX_MIN_BUF 4 | 111 | #define EM28XX_MIN_BUF 4 |
@@ -615,6 +619,7 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, | |||
615 | int num_bufs, int max_pkt_size, | 619 | int num_bufs, int max_pkt_size, |
616 | int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); | 620 | int (*isoc_copy) (struct em28xx *dev, struct urb *urb)); |
617 | void em28xx_uninit_isoc(struct em28xx *dev); | 621 | void em28xx_uninit_isoc(struct em28xx *dev); |
622 | int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev); | ||
618 | int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); | 623 | int em28xx_set_mode(struct em28xx *dev, enum em28xx_mode set_mode); |
619 | int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); | 624 | int em28xx_gpio_set(struct em28xx *dev, struct em28xx_reg_seq *gpio); |
620 | void em28xx_wake_i2c(struct em28xx *dev); | 625 | void em28xx_wake_i2c(struct em28xx *dev); |
@@ -639,7 +644,7 @@ extern void em28xx_card_setup(struct em28xx *dev); | |||
639 | extern struct em28xx_board em28xx_boards[]; | 644 | extern struct em28xx_board em28xx_boards[]; |
640 | extern struct usb_device_id em28xx_id_table[]; | 645 | extern struct usb_device_id em28xx_id_table[]; |
641 | extern const unsigned int em28xx_bcount; | 646 | extern const unsigned int em28xx_bcount; |
642 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir); | 647 | void em28xx_register_i2c_ir(struct em28xx *dev); |
643 | int em28xx_tuner_callback(void *ptr, int component, int command, int arg); | 648 | int em28xx_tuner_callback(void *ptr, int component, int command, int arg); |
644 | void em28xx_release_resources(struct em28xx *dev); | 649 | void em28xx_release_resources(struct em28xx *dev); |
645 | 650 | ||