diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-15 15:49:56 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-01-15 15:49:56 -0500 |
commit | 122804ecb59493fbb4d31b3ba9ac59faaf45276f (patch) | |
tree | cff4d8a158c412e4a8d3abc8d91bb0eb52b01c9a /drivers/media/video/em28xx | |
parent | 16008d641670571ff4cd750b416c7caf2d89f467 (diff) | |
parent | 126400033940afb658123517a2e80eb68259fbd7 (diff) |
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media: (655 commits)
[media] revert patch: HDIC HD29L2 DMB-TH USB2.0 reference design driver
mb86a20s: Add a few more register settings at the init seq
mb86a20s: Group registers into the same line
[media] [PATCH] don't reset the delivery system on DTV_CLEAR
[media] [BUG] it913x-fe fix typo error making SNR levels unstable
[media] cx23885: Query the CX25840 during enum_input for status
[media] cx25840: Add support for g_input_status
[media] rc-videomate-m1f.c Rename to match remote controler name
[media] drivers: media: au0828: Fix dependency for VIDEO_AU0828
[media] convert drivers/media/* to use module_platform_driver()
[media] drivers: video: cx231xx: Fix dependency for VIDEO_CX231XX_DVB
[media] Exynos4 JPEG codec v4l2 driver
[media] doc: v4l: selection: choose pixels as units for selection rectangles
[media] v4l: s5p-tv: mixer: fix setup of VP scaling
[media] v4l: s5p-tv: mixer: add support for selection API
[media] v4l: emulate old crop API using extended crop/compose API
[media] doc: v4l: add documentation for selection API
[media] doc: v4l: add binary images for selection API
[media] v4l: add support for selection api
[media] hd29l2: fix review findings
...
Diffstat (limited to 'drivers/media/video/em28xx')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-audio.c | 2 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 256 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-core.c | 61 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-dvb.c | 190 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-input.c | 7 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-reg.h | 5 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx-video.c | 14 | ||||
-rw-r--r-- | drivers/media/video/em28xx/em28xx.h | 8 |
8 files changed, 351 insertions, 192 deletions
diff --git a/drivers/media/video/em28xx/em28xx-audio.c b/drivers/media/video/em28xx/em28xx-audio.c index cff0768afbf..e2a7b77c39c 100644 --- a/drivers/media/video/em28xx/em28xx-audio.c +++ b/drivers/media/video/em28xx/em28xx-audio.c | |||
@@ -193,7 +193,7 @@ static int em28xx_init_audio_isoc(struct em28xx *dev) | |||
193 | 193 | ||
194 | urb->dev = dev->udev; | 194 | urb->dev = dev->udev; |
195 | urb->context = dev; | 195 | urb->context = dev; |
196 | urb->pipe = usb_rcvisocpipe(dev->udev, 0x83); | 196 | urb->pipe = usb_rcvisocpipe(dev->udev, EM28XX_EP_AUDIO); |
197 | urb->transfer_flags = URB_ISO_ASAP; | 197 | urb->transfer_flags = URB_ISO_ASAP; |
198 | urb->transfer_buffer = dev->adev.transfer_buffer[i]; | 198 | urb->transfer_buffer = dev->adev.transfer_buffer[i]; |
199 | urb->interval = 1; | 199 | urb->interval = 1; |
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 93807dcf944..4561cd89938 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -336,6 +336,23 @@ static struct em28xx_reg_seq pctv_460e[] = { | |||
336 | { -1, -1, -1, -1}, | 336 | { -1, -1, -1, -1}, |
337 | }; | 337 | }; |
338 | 338 | ||
339 | #if 0 | ||
340 | static struct em28xx_reg_seq hauppauge_930c_gpio[] = { | ||
341 | {EM2874_R80_GPIO, 0x6f, 0xff, 10}, | ||
342 | {EM2874_R80_GPIO, 0x4f, 0xff, 10}, /* xc5000 reset */ | ||
343 | {EM2874_R80_GPIO, 0x6f, 0xff, 10}, | ||
344 | {EM2874_R80_GPIO, 0x4f, 0xff, 10}, | ||
345 | { -1, -1, -1, -1}, | ||
346 | }; | ||
347 | |||
348 | static struct em28xx_reg_seq hauppauge_930c_digital[] = { | ||
349 | {EM2874_R80_GPIO, 0xf6, 0xff, 10}, | ||
350 | {EM2874_R80_GPIO, 0xe6, 0xff, 100}, | ||
351 | {EM2874_R80_GPIO, 0xa6, 0xff, 10}, | ||
352 | { -1, -1, -1, -1}, | ||
353 | }; | ||
354 | #endif | ||
355 | |||
339 | /* | 356 | /* |
340 | * Board definitions | 357 | * Board definitions |
341 | */ | 358 | */ |
@@ -839,6 +856,10 @@ struct em28xx_board em28xx_boards[] = { | |||
839 | [EM2870_BOARD_KWORLD_355U] = { | 856 | [EM2870_BOARD_KWORLD_355U] = { |
840 | .name = "Kworld 355 U DVB-T", | 857 | .name = "Kworld 355 U DVB-T", |
841 | .valid = EM28XX_BOARD_NOT_VALIDATED, | 858 | .valid = EM28XX_BOARD_NOT_VALIDATED, |
859 | .tuner_type = TUNER_ABSENT, | ||
860 | .tuner_gpio = default_tuner_gpio, | ||
861 | .has_dvb = 1, | ||
862 | .dvb_gpio = default_digital, | ||
842 | }, | 863 | }, |
843 | [EM2870_BOARD_PINNACLE_PCTV_DVB] = { | 864 | [EM2870_BOARD_PINNACLE_PCTV_DVB] = { |
844 | .name = "Pinnacle PCTV DVB-T", | 865 | .name = "Pinnacle PCTV DVB-T", |
@@ -887,6 +908,37 @@ struct em28xx_board em28xx_boards[] = { | |||
887 | .tuner_addr = 0x41, | 908 | .tuner_addr = 0x41, |
888 | .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */ | 909 | .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */ |
889 | .tuner_gpio = terratec_h5_gpio, | 910 | .tuner_gpio = terratec_h5_gpio, |
911 | #else | ||
912 | .tuner_type = TUNER_ABSENT, | ||
913 | #endif | ||
914 | .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | | ||
915 | EM28XX_I2C_CLK_WAIT_ENABLE | | ||
916 | EM28XX_I2C_FREQ_400_KHZ, | ||
917 | }, | ||
918 | [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = { | ||
919 | .name = "Hauppauge WinTV HVR 930C", | ||
920 | .has_dvb = 1, | ||
921 | #if 0 /* FIXME: Add analog support */ | ||
922 | .tuner_type = TUNER_XC5000, | ||
923 | .tuner_addr = 0x41, | ||
924 | .dvb_gpio = hauppauge_930c_digital, | ||
925 | .tuner_gpio = hauppauge_930c_gpio, | ||
926 | #else | ||
927 | .tuner_type = TUNER_ABSENT, | ||
928 | #endif | ||
929 | .ir_codes = RC_MAP_HAUPPAUGE, | ||
930 | .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | | ||
931 | EM28XX_I2C_CLK_WAIT_ENABLE | | ||
932 | EM28XX_I2C_FREQ_400_KHZ, | ||
933 | }, | ||
934 | [EM2884_BOARD_CINERGY_HTC_STICK] = { | ||
935 | .name = "Terratec Cinergy HTC Stick", | ||
936 | .has_dvb = 1, | ||
937 | #if 0 | ||
938 | .tuner_type = TUNER_PHILIPS_TDA8290, | ||
939 | .tuner_addr = 0x41, | ||
940 | .dvb_gpio = terratec_h5_digital, /* FIXME: probably wrong */ | ||
941 | .tuner_gpio = terratec_h5_gpio, | ||
890 | #endif | 942 | #endif |
891 | .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | | 943 | .i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT | |
892 | EM28XX_I2C_CLK_WAIT_ENABLE | | 944 | EM28XX_I2C_CLK_WAIT_ENABLE | |
@@ -1127,7 +1179,7 @@ struct em28xx_board em28xx_boards[] = { | |||
1127 | .name = "Terratec Cinergy 200 USB", | 1179 | .name = "Terratec Cinergy 200 USB", |
1128 | .is_em2800 = 1, | 1180 | .is_em2800 = 1, |
1129 | .has_ir_i2c = 1, | 1181 | .has_ir_i2c = 1, |
1130 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | 1182 | .tuner_type = TUNER_LG_TALN, |
1131 | .tda9887_conf = TDA9887_PRESENT, | 1183 | .tda9887_conf = TDA9887_PRESENT, |
1132 | .decoder = EM28XX_SAA711X, | 1184 | .decoder = EM28XX_SAA711X, |
1133 | .input = { { | 1185 | .input = { { |
@@ -1218,7 +1270,7 @@ struct em28xx_board em28xx_boards[] = { | |||
1218 | }, | 1270 | }, |
1219 | [EM2820_BOARD_PINNACLE_DVC_90] = { | 1271 | [EM2820_BOARD_PINNACLE_DVC_90] = { |
1220 | .name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker " | 1272 | .name = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker " |
1221 | "/ Kworld DVD Maker 2", | 1273 | "/ Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U", |
1222 | .tuner_type = TUNER_ABSENT, /* capture only board */ | 1274 | .tuner_type = TUNER_ABSENT, /* capture only board */ |
1223 | .decoder = EM28XX_SAA711X, | 1275 | .decoder = EM28XX_SAA711X, |
1224 | .input = { { | 1276 | .input = { { |
@@ -1840,6 +1892,22 @@ struct em28xx_board em28xx_boards[] = { | |||
1840 | .has_dvb = 1, | 1892 | .has_dvb = 1, |
1841 | .ir_codes = RC_MAP_PINNACLE_PCTV_HD, | 1893 | .ir_codes = RC_MAP_PINNACLE_PCTV_HD, |
1842 | }, | 1894 | }, |
1895 | /* eb1a:5006 Honestech VIDBOX NW03 | ||
1896 | * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */ | ||
1897 | [EM2860_BOARD_HT_VIDBOX_NW03] = { | ||
1898 | .name = "Honestech Vidbox NW03", | ||
1899 | .tuner_type = TUNER_ABSENT, | ||
1900 | .decoder = EM28XX_SAA711X, | ||
1901 | .input = { { | ||
1902 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1903 | .vmux = SAA7115_COMPOSITE0, | ||
1904 | .amux = EM28XX_AMUX_LINE_IN, | ||
1905 | }, { | ||
1906 | .type = EM28XX_VMUX_SVIDEO, | ||
1907 | .vmux = SAA7115_SVIDEO3, /* S-VIDEO needs confirming */ | ||
1908 | .amux = EM28XX_AMUX_LINE_IN, | ||
1909 | } }, | ||
1910 | }, | ||
1843 | }; | 1911 | }; |
1844 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); | 1912 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
1845 | 1913 | ||
@@ -1899,6 +1967,8 @@ struct usb_device_id em28xx_id_table[] = { | |||
1899 | .driver_info = EM2800_BOARD_GRABBEEX_USB2800 }, | 1967 | .driver_info = EM2800_BOARD_GRABBEEX_USB2800 }, |
1900 | { USB_DEVICE(0xeb1a, 0xe357), | 1968 | { USB_DEVICE(0xeb1a, 0xe357), |
1901 | .driver_info = EM2870_BOARD_KWORLD_355U }, | 1969 | .driver_info = EM2870_BOARD_KWORLD_355U }, |
1970 | { USB_DEVICE(0xeb1a, 0xe359), | ||
1971 | .driver_info = EM2870_BOARD_KWORLD_355U }, | ||
1902 | { USB_DEVICE(0x1b80, 0xe302), | 1972 | { USB_DEVICE(0x1b80, 0xe302), |
1903 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */ | 1973 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */ |
1904 | { USB_DEVICE(0x1b80, 0xe304), | 1974 | { USB_DEVICE(0x1b80, 0xe304), |
@@ -1914,17 +1984,23 @@ struct usb_device_id em28xx_id_table[] = { | |||
1914 | { USB_DEVICE(0x0ccd, 0x0042), | 1984 | { USB_DEVICE(0x0ccd, 0x0042), |
1915 | .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, | 1985 | .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, |
1916 | { USB_DEVICE(0x0ccd, 0x0043), | 1986 | { USB_DEVICE(0x0ccd, 0x0043), |
1987 | .driver_info = EM2870_BOARD_TERRATEC_XS }, | ||
1988 | { USB_DEVICE(0x0ccd, 0x008e), /* Cinergy HTC USB XS Rev. 1 */ | ||
1989 | .driver_info = EM2884_BOARD_TERRATEC_H5 }, | ||
1990 | { USB_DEVICE(0x0ccd, 0x00ac), /* Cinergy HTC USB XS Rev. 2 */ | ||
1991 | .driver_info = EM2884_BOARD_TERRATEC_H5 }, | ||
1992 | { USB_DEVICE(0x0ccd, 0x10a2), /* H5 Rev. 1 */ | ||
1917 | .driver_info = EM2884_BOARD_TERRATEC_H5 }, | 1993 | .driver_info = EM2884_BOARD_TERRATEC_H5 }, |
1918 | { USB_DEVICE(0x0ccd, 0x10a2), /* Rev. 1 */ | 1994 | { USB_DEVICE(0x0ccd, 0x10ad), /* H5 Rev. 2 */ |
1919 | .driver_info = EM2884_BOARD_TERRATEC_H5 }, | 1995 | .driver_info = EM2884_BOARD_TERRATEC_H5 }, |
1920 | { USB_DEVICE(0x0ccd, 0x10ad), /* Rev. 2 */ | ||
1921 | .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, | ||
1922 | { USB_DEVICE(0x0ccd, 0x0084), | 1996 | { USB_DEVICE(0x0ccd, 0x0084), |
1923 | .driver_info = EM2860_BOARD_TERRATEC_AV350 }, | 1997 | .driver_info = EM2860_BOARD_TERRATEC_AV350 }, |
1924 | { USB_DEVICE(0x0ccd, 0x0096), | 1998 | { USB_DEVICE(0x0ccd, 0x0096), |
1925 | .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, | 1999 | .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, |
1926 | { USB_DEVICE(0x0ccd, 0x10AF), | 2000 | { USB_DEVICE(0x0ccd, 0x10AF), |
1927 | .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, | 2001 | .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, |
2002 | { USB_DEVICE(0x0ccd, 0x00b2), | ||
2003 | .driver_info = EM2884_BOARD_CINERGY_HTC_STICK }, | ||
1928 | { USB_DEVICE(0x0fd9, 0x0033), | 2004 | { USB_DEVICE(0x0fd9, 0x0033), |
1929 | .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE}, | 2005 | .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE}, |
1930 | { USB_DEVICE(0x185b, 0x2870), | 2006 | { USB_DEVICE(0x185b, 0x2870), |
@@ -1963,6 +2039,8 @@ struct usb_device_id em28xx_id_table[] = { | |||
1963 | .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO }, | 2039 | .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO }, |
1964 | { USB_DEVICE(0x0413, 0x6023), | 2040 | { USB_DEVICE(0x0413, 0x6023), |
1965 | .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII }, | 2041 | .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII }, |
2042 | { USB_DEVICE(0x093b, 0xa003), | ||
2043 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | ||
1966 | { USB_DEVICE(0x093b, 0xa005), | 2044 | { USB_DEVICE(0x093b, 0xa005), |
1967 | .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U }, | 2045 | .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U }, |
1968 | { USB_DEVICE(0x04bb, 0x0515), | 2046 | { USB_DEVICE(0x04bb, 0x0515), |
@@ -1975,6 +2053,12 @@ struct usb_device_id em28xx_id_table[] = { | |||
1975 | .driver_info = EM28174_BOARD_PCTV_290E }, | 2053 | .driver_info = EM28174_BOARD_PCTV_290E }, |
1976 | { USB_DEVICE(0x2013, 0x024c), | 2054 | { USB_DEVICE(0x2013, 0x024c), |
1977 | .driver_info = EM28174_BOARD_PCTV_460E }, | 2055 | .driver_info = EM28174_BOARD_PCTV_460E }, |
2056 | { USB_DEVICE(0x2040, 0x1605), | ||
2057 | .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C }, | ||
2058 | { USB_DEVICE(0xeb1a, 0x5006), | ||
2059 | .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 }, | ||
2060 | { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */ | ||
2061 | .driver_info = EM2860_BOARD_EASYCAP }, | ||
1978 | { }, | 2062 | { }, |
1979 | }; | 2063 | }; |
1980 | MODULE_DEVICE_TABLE(usb, em28xx_id_table); | 2064 | MODULE_DEVICE_TABLE(usb, em28xx_id_table); |
@@ -2028,10 +2112,10 @@ int em28xx_tuner_callback(void *ptr, int component, int command, int arg) | |||
2028 | int rc = 0; | 2112 | int rc = 0; |
2029 | struct em28xx *dev = ptr; | 2113 | struct em28xx *dev = ptr; |
2030 | 2114 | ||
2031 | if (dev->tuner_type != TUNER_XC2028) | 2115 | if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000) |
2032 | return 0; | 2116 | return 0; |
2033 | 2117 | ||
2034 | if (command != XC2028_TUNER_RESET) | 2118 | if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET) |
2035 | return 0; | 2119 | return 0; |
2036 | 2120 | ||
2037 | rc = em28xx_gpio_set(dev, dev->board.tuner_gpio); | 2121 | rc = em28xx_gpio_set(dev, dev->board.tuner_gpio); |
@@ -2203,7 +2287,8 @@ void em28xx_pre_card_setup(struct em28xx *dev) | |||
2203 | /* Set the initial XCLK and I2C clock values based on the board | 2287 | /* Set the initial XCLK and I2C clock values based on the board |
2204 | definition */ | 2288 | definition */ |
2205 | em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f); | 2289 | em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f); |
2206 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); | 2290 | if (!dev->board.is_em2800) |
2291 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); | ||
2207 | msleep(50); | 2292 | msleep(50); |
2208 | 2293 | ||
2209 | /* request some modules */ | 2294 | /* request some modules */ |
@@ -2832,11 +2917,10 @@ void em28xx_release_resources(struct em28xx *dev) | |||
2832 | * em28xx_init_dev() | 2917 | * em28xx_init_dev() |
2833 | * allocates and inits the device structs, registers i2c bus and v4l device | 2918 | * allocates and inits the device structs, registers i2c bus and v4l device |
2834 | */ | 2919 | */ |
2835 | static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | 2920 | static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev, |
2836 | struct usb_interface *interface, | 2921 | struct usb_interface *interface, |
2837 | int minor) | 2922 | int minor) |
2838 | { | 2923 | { |
2839 | struct em28xx *dev = *devhandle; | ||
2840 | int retval; | 2924 | int retval; |
2841 | 2925 | ||
2842 | dev->udev = udev; | 2926 | dev->udev = udev; |
@@ -2931,7 +3015,7 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2931 | 3015 | ||
2932 | if (!dev->board.is_em2800) { | 3016 | if (!dev->board.is_em2800) { |
2933 | /* Resets I2C speed */ | 3017 | /* Resets I2C speed */ |
2934 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); | 3018 | retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); |
2935 | if (retval < 0) { | 3019 | if (retval < 0) { |
2936 | em28xx_errdev("%s: em28xx_write_reg failed!" | 3020 | em28xx_errdev("%s: em28xx_write_reg failed!" |
2937 | " retval [%d]\n", | 3021 | " retval [%d]\n", |
@@ -3031,12 +3115,11 @@ unregister_dev: | |||
3031 | static int em28xx_usb_probe(struct usb_interface *interface, | 3115 | static int em28xx_usb_probe(struct usb_interface *interface, |
3032 | const struct usb_device_id *id) | 3116 | const struct usb_device_id *id) |
3033 | { | 3117 | { |
3034 | const struct usb_endpoint_descriptor *endpoint; | ||
3035 | struct usb_device *udev; | 3118 | struct usb_device *udev; |
3036 | struct em28xx *dev = NULL; | 3119 | struct em28xx *dev = NULL; |
3037 | int retval; | 3120 | int retval; |
3038 | bool is_audio_only = false, has_audio = false; | 3121 | bool has_audio = false, has_video = false, has_dvb = false; |
3039 | int i, nr, isoc_pipe; | 3122 | int i, nr; |
3040 | const int ifnum = interface->altsetting[0].desc.bInterfaceNumber; | 3123 | const int ifnum = interface->altsetting[0].desc.bInterfaceNumber; |
3041 | char *speed; | 3124 | char *speed; |
3042 | char descr[255] = ""; | 3125 | char descr[255] = ""; |
@@ -3068,54 +3151,65 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3068 | goto err; | 3151 | goto err; |
3069 | } | 3152 | } |
3070 | 3153 | ||
3154 | /* allocate memory for our device state and initialize it */ | ||
3155 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
3156 | if (dev == NULL) { | ||
3157 | em28xx_err(DRIVER_NAME ": out of memory!\n"); | ||
3158 | retval = -ENOMEM; | ||
3159 | goto err; | ||
3160 | } | ||
3161 | |||
3162 | /* compute alternate max packet sizes */ | ||
3163 | dev->alt_max_pkt_size = kmalloc(sizeof(dev->alt_max_pkt_size[0]) * | ||
3164 | interface->num_altsetting, GFP_KERNEL); | ||
3165 | if (dev->alt_max_pkt_size == NULL) { | ||
3166 | em28xx_errdev("out of memory!\n"); | ||
3167 | kfree(dev); | ||
3168 | retval = -ENOMEM; | ||
3169 | goto err; | ||
3170 | } | ||
3171 | |||
3071 | /* Get endpoints */ | 3172 | /* Get endpoints */ |
3072 | for (i = 0; i < interface->num_altsetting; i++) { | 3173 | for (i = 0; i < interface->num_altsetting; i++) { |
3073 | int ep; | 3174 | int ep; |
3074 | 3175 | ||
3075 | for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) { | 3176 | for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) { |
3076 | struct usb_host_endpoint *e; | 3177 | const struct usb_endpoint_descriptor *e; |
3077 | e = &interface->altsetting[i].endpoint[ep]; | 3178 | int sizedescr, size; |
3078 | 3179 | ||
3079 | if (e->desc.bEndpointAddress == 0x83) | 3180 | e = &interface->altsetting[i].endpoint[ep].desc; |
3080 | has_audio = true; | 3181 | |
3182 | sizedescr = le16_to_cpu(e->wMaxPacketSize); | ||
3183 | size = sizedescr & 0x7ff; | ||
3184 | |||
3185 | if (udev->speed == USB_SPEED_HIGH) | ||
3186 | size = size * hb_mult(sizedescr); | ||
3187 | |||
3188 | if (usb_endpoint_xfer_isoc(e) && | ||
3189 | usb_endpoint_dir_in(e)) { | ||
3190 | switch (e->bEndpointAddress) { | ||
3191 | case EM28XX_EP_AUDIO: | ||
3192 | has_audio = true; | ||
3193 | break; | ||
3194 | case EM28XX_EP_ANALOG: | ||
3195 | has_video = true; | ||
3196 | dev->alt_max_pkt_size[i] = size; | ||
3197 | break; | ||
3198 | case EM28XX_EP_DIGITAL: | ||
3199 | has_dvb = true; | ||
3200 | if (size > dev->dvb_max_pkt_size) { | ||
3201 | dev->dvb_max_pkt_size = size; | ||
3202 | dev->dvb_alt = i; | ||
3203 | } | ||
3204 | break; | ||
3205 | } | ||
3206 | } | ||
3081 | } | 3207 | } |
3082 | } | 3208 | } |
3083 | 3209 | ||
3084 | endpoint = &interface->cur_altsetting->endpoint[0].desc; | 3210 | if (!(has_audio || has_video || has_dvb)) { |
3085 | 3211 | retval = -ENODEV; | |
3086 | /* check if the device has the iso in endpoint at the correct place */ | 3212 | goto err_free; |
3087 | if (usb_endpoint_xfer_isoc(endpoint) | ||
3088 | && | ||
3089 | (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) { | ||
3090 | /* It's a newer em2874/em2875 device */ | ||
3091 | isoc_pipe = 0; | ||
3092 | } else { | ||
3093 | int check_interface = 1; | ||
3094 | isoc_pipe = 1; | ||
3095 | endpoint = &interface->cur_altsetting->endpoint[1].desc; | ||
3096 | if (!usb_endpoint_xfer_isoc(endpoint)) | ||
3097 | check_interface = 0; | ||
3098 | |||
3099 | if (usb_endpoint_dir_out(endpoint)) | ||
3100 | check_interface = 0; | ||
3101 | |||
3102 | if (!check_interface) { | ||
3103 | if (has_audio) { | ||
3104 | is_audio_only = true; | ||
3105 | } else { | ||
3106 | em28xx_err(DRIVER_NAME " video device (%04x:%04x): " | ||
3107 | "interface %i, class %i found.\n", | ||
3108 | le16_to_cpu(udev->descriptor.idVendor), | ||
3109 | le16_to_cpu(udev->descriptor.idProduct), | ||
3110 | ifnum, | ||
3111 | interface->altsetting[0].desc.bInterfaceClass); | ||
3112 | em28xx_err(DRIVER_NAME " This is an anciliary " | ||
3113 | "interface not used by the driver\n"); | ||
3114 | |||
3115 | retval = -ENODEV; | ||
3116 | goto err; | ||
3117 | } | ||
3118 | } | ||
3119 | } | 3213 | } |
3120 | 3214 | ||
3121 | switch (udev->speed) { | 3215 | switch (udev->speed) { |
@@ -3141,6 +3235,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3141 | strlcat(descr, " ", sizeof(descr)); | 3235 | strlcat(descr, " ", sizeof(descr)); |
3142 | strlcat(descr, udev->product, sizeof(descr)); | 3236 | strlcat(descr, udev->product, sizeof(descr)); |
3143 | } | 3237 | } |
3238 | |||
3144 | if (*descr) | 3239 | if (*descr) |
3145 | strlcat(descr, " ", sizeof(descr)); | 3240 | strlcat(descr, " ", sizeof(descr)); |
3146 | 3241 | ||
@@ -3157,6 +3252,14 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3157 | printk(KERN_INFO DRIVER_NAME | 3252 | printk(KERN_INFO DRIVER_NAME |
3158 | ": Audio Vendor Class interface %i found\n", | 3253 | ": Audio Vendor Class interface %i found\n", |
3159 | ifnum); | 3254 | ifnum); |
3255 | if (has_video) | ||
3256 | printk(KERN_INFO DRIVER_NAME | ||
3257 | ": Video interface %i found\n", | ||
3258 | ifnum); | ||
3259 | if (has_dvb) | ||
3260 | printk(KERN_INFO DRIVER_NAME | ||
3261 | ": DVB interface %i found\n", | ||
3262 | ifnum); | ||
3160 | 3263 | ||
3161 | /* | 3264 | /* |
3162 | * Make sure we have 480 Mbps of bandwidth, otherwise things like | 3265 | * Make sure we have 480 Mbps of bandwidth, otherwise things like |
@@ -3168,22 +3271,14 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3168 | printk(DRIVER_NAME ": Device must be connected to a high-speed" | 3271 | printk(DRIVER_NAME ": Device must be connected to a high-speed" |
3169 | " USB 2.0 port.\n"); | 3272 | " USB 2.0 port.\n"); |
3170 | retval = -ENODEV; | 3273 | retval = -ENODEV; |
3171 | goto err; | 3274 | goto err_free; |
3172 | } | ||
3173 | |||
3174 | /* allocate memory for our device state and initialize it */ | ||
3175 | dev = kzalloc(sizeof(*dev), GFP_KERNEL); | ||
3176 | if (dev == NULL) { | ||
3177 | em28xx_err(DRIVER_NAME ": out of memory!\n"); | ||
3178 | retval = -ENOMEM; | ||
3179 | goto err; | ||
3180 | } | 3275 | } |
3181 | 3276 | ||
3182 | snprintf(dev->name, sizeof(dev->name), "em28xx #%d", nr); | 3277 | snprintf(dev->name, sizeof(dev->name), "em28xx #%d", nr); |
3183 | dev->devno = nr; | 3278 | dev->devno = nr; |
3184 | dev->model = id->driver_info; | 3279 | dev->model = id->driver_info; |
3185 | dev->alt = -1; | 3280 | dev->alt = -1; |
3186 | dev->is_audio_only = is_audio_only; | 3281 | dev->is_audio_only = has_audio && !(has_video || has_dvb); |
3187 | dev->has_alsa_audio = has_audio; | 3282 | dev->has_alsa_audio = has_audio; |
3188 | dev->audio_ifnum = ifnum; | 3283 | dev->audio_ifnum = ifnum; |
3189 | 3284 | ||
@@ -3196,26 +3291,7 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3196 | } | 3291 | } |
3197 | } | 3292 | } |
3198 | 3293 | ||
3199 | /* compute alternate max packet sizes */ | ||
3200 | dev->num_alt = interface->num_altsetting; | 3294 | dev->num_alt = interface->num_altsetting; |
3201 | dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL); | ||
3202 | |||
3203 | if (dev->alt_max_pkt_size == NULL) { | ||
3204 | em28xx_errdev("out of memory!\n"); | ||
3205 | kfree(dev); | ||
3206 | retval = -ENOMEM; | ||
3207 | goto err; | ||
3208 | } | ||
3209 | |||
3210 | for (i = 0; i < dev->num_alt ; i++) { | ||
3211 | u16 tmp = le16_to_cpu(interface->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize); | ||
3212 | unsigned int size = tmp & 0x7ff; | ||
3213 | |||
3214 | if (udev->speed == USB_SPEED_HIGH) | ||
3215 | size = size * hb_mult(tmp); | ||
3216 | |||
3217 | dev->alt_max_pkt_size[i] = size; | ||
3218 | } | ||
3219 | 3295 | ||
3220 | if ((card[nr] >= 0) && (card[nr] < em28xx_bcount)) | 3296 | if ((card[nr] >= 0) && (card[nr] < em28xx_bcount)) |
3221 | dev->model = card[nr]; | 3297 | dev->model = card[nr]; |
@@ -3226,12 +3302,9 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3226 | /* allocate device struct */ | 3302 | /* allocate device struct */ |
3227 | mutex_init(&dev->lock); | 3303 | mutex_init(&dev->lock); |
3228 | mutex_lock(&dev->lock); | 3304 | mutex_lock(&dev->lock); |
3229 | retval = em28xx_init_dev(&dev, udev, interface, nr); | 3305 | retval = em28xx_init_dev(dev, udev, interface, nr); |
3230 | if (retval) { | 3306 | if (retval) { |
3231 | mutex_unlock(&dev->lock); | 3307 | goto unlock_and_free; |
3232 | kfree(dev->alt_max_pkt_size); | ||
3233 | kfree(dev); | ||
3234 | goto err; | ||
3235 | } | 3308 | } |
3236 | 3309 | ||
3237 | request_modules(dev); | 3310 | request_modules(dev); |
@@ -3250,6 +3323,13 @@ static int em28xx_usb_probe(struct usb_interface *interface, | |||
3250 | 3323 | ||
3251 | return 0; | 3324 | return 0; |
3252 | 3325 | ||
3326 | unlock_and_free: | ||
3327 | mutex_unlock(&dev->lock); | ||
3328 | |||
3329 | err_free: | ||
3330 | kfree(dev->alt_max_pkt_size); | ||
3331 | kfree(dev); | ||
3332 | |||
3253 | err: | 3333 | err: |
3254 | clear_bit(nr, &em28xx_devused); | 3334 | clear_bit(nr, &em28xx_devused); |
3255 | 3335 | ||
diff --git a/drivers/media/video/em28xx/em28xx-core.c b/drivers/media/video/em28xx/em28xx-core.c index 804a4ab47ac..0aacc96f9a2 100644 --- a/drivers/media/video/em28xx/em28xx-core.c +++ b/drivers/media/video/em28xx/em28xx-core.c | |||
@@ -568,7 +568,7 @@ int em28xx_audio_setup(struct em28xx *dev) | |||
568 | em28xx_warn("AC97 features = 0x%04x\n", feat); | 568 | em28xx_warn("AC97 features = 0x%04x\n", feat); |
569 | 569 | ||
570 | /* Try to identify what audio processor we have */ | 570 | /* Try to identify what audio processor we have */ |
571 | if ((vid == 0xffffffff) && (feat == 0x6a90)) | 571 | if (((vid == 0xffffffff) || (vid == 0x83847650)) && (feat == 0x6a90)) |
572 | dev->audio_mode.ac97 = EM28XX_AC97_EM202; | 572 | dev->audio_mode.ac97 = EM28XX_AC97_EM202; |
573 | else if ((vid >> 8) == 0x838476) | 573 | else if ((vid >> 8) == 0x838476) |
574 | dev->audio_mode.ac97 = EM28XX_AC97_SIGMATEL; | 574 | dev->audio_mode.ac97 = EM28XX_AC97_SIGMATEL; |
@@ -1070,7 +1070,8 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, | |||
1070 | should also be using 'desc.bInterval' | 1070 | should also be using 'desc.bInterval' |
1071 | */ | 1071 | */ |
1072 | pipe = usb_rcvisocpipe(dev->udev, | 1072 | pipe = usb_rcvisocpipe(dev->udev, |
1073 | dev->mode == EM28XX_ANALOG_MODE ? 0x82 : 0x84); | 1073 | dev->mode == EM28XX_ANALOG_MODE ? |
1074 | EM28XX_EP_ANALOG : EM28XX_EP_DIGITAL); | ||
1074 | 1075 | ||
1075 | usb_fill_int_urb(urb, dev->udev, pipe, | 1076 | usb_fill_int_urb(urb, dev->udev, pipe, |
1076 | dev->isoc_ctl.transfer_buffer[i], sb_size, | 1077 | dev->isoc_ctl.transfer_buffer[i], sb_size, |
@@ -1108,62 +1109,6 @@ int em28xx_init_isoc(struct em28xx *dev, int max_packets, | |||
1108 | } | 1109 | } |
1109 | EXPORT_SYMBOL_GPL(em28xx_init_isoc); | 1110 | EXPORT_SYMBOL_GPL(em28xx_init_isoc); |
1110 | 1111 | ||
1111 | /* Determine the packet size for the DVB stream for the given device | ||
1112 | (underlying value programmed into the eeprom) */ | ||
1113 | int em28xx_isoc_dvb_max_packetsize(struct em28xx *dev) | ||
1114 | { | ||
1115 | unsigned int chip_cfg2; | ||
1116 | unsigned int packet_size; | ||
1117 | |||
1118 | switch (dev->chip_id) { | ||
1119 | case CHIP_ID_EM2710: | ||
1120 | case CHIP_ID_EM2750: | ||
1121 | case CHIP_ID_EM2800: | ||
1122 | case CHIP_ID_EM2820: | ||
1123 | case CHIP_ID_EM2840: | ||
1124 | case CHIP_ID_EM2860: | ||
1125 | /* No DVB support */ | ||
1126 | return -EINVAL; | ||
1127 | case CHIP_ID_EM2870: | ||
1128 | case CHIP_ID_EM2883: | ||
1129 | /* TS max packet size stored in bits 1-0 of R01 */ | ||
1130 | chip_cfg2 = em28xx_read_reg(dev, EM28XX_R01_CHIPCFG2); | ||
1131 | switch (chip_cfg2 & EM28XX_CHIPCFG2_TS_PACKETSIZE_MASK) { | ||
1132 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_188: | ||
1133 | packet_size = 188; | ||
1134 | break; | ||
1135 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_376: | ||
1136 | packet_size = 376; | ||
1137 | break; | ||
1138 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_564: | ||
1139 | packet_size = 564; | ||
1140 | break; | ||
1141 | case EM28XX_CHIPCFG2_TS_PACKETSIZE_752: | ||
1142 | packet_size = 752; | ||
1143 | break; | ||
1144 | } | ||
1145 | break; | ||
1146 | case CHIP_ID_EM2874: | ||
1147 | /* | ||
1148 | * FIXME: for now assumes 564 like it was before, but the | ||
1149 | * em2874 code should be added to return the proper value | ||
1150 | */ | ||
1151 | packet_size = 564; | ||
1152 | break; | ||
1153 | case CHIP_ID_EM2884: | ||
1154 | case CHIP_ID_EM28174: | ||
1155 | default: | ||
1156 | /* | ||
1157 | * FIXME: same as em2874. 564 was enough for 22 Mbit DVB-T | ||
1158 | * but not enough for 44 Mbit DVB-C. | ||
1159 | */ | ||
1160 | packet_size = 752; | ||
1161 | } | ||
1162 | |||
1163 | return packet_size; | ||
1164 | } | ||
1165 | EXPORT_SYMBOL_GPL(em28xx_isoc_dvb_max_packetsize); | ||
1166 | |||
1167 | /* | 1112 | /* |
1168 | * em28xx_wake_i2c() | 1113 | * em28xx_wake_i2c() |
1169 | * configure i2c attached devices | 1114 | * configure i2c attached devices |
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c index cef7a2d409c..9449423098e 100644 --- a/drivers/media/video/em28xx/em28xx-dvb.c +++ b/drivers/media/video/em28xx/em28xx-dvb.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include "drxk.h" | 44 | #include "drxk.h" |
45 | #include "tda10071.h" | 45 | #include "tda10071.h" |
46 | #include "a8293.h" | 46 | #include "a8293.h" |
47 | #include "qt1010.h" | ||
47 | 48 | ||
48 | MODULE_DESCRIPTION("driver for em28xx based DVB cards"); | 49 | MODULE_DESCRIPTION("driver for em28xx based DVB cards"); |
49 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); | 50 | MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); |
@@ -163,12 +164,12 @@ static int em28xx_start_streaming(struct em28xx_dvb *dvb) | |||
163 | struct em28xx *dev = dvb->adapter.priv; | 164 | struct em28xx *dev = dvb->adapter.priv; |
164 | int max_dvb_packet_size; | 165 | int max_dvb_packet_size; |
165 | 166 | ||
166 | usb_set_interface(dev->udev, 0, 1); | 167 | usb_set_interface(dev->udev, 0, dev->dvb_alt); |
167 | rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); | 168 | rc = em28xx_set_mode(dev, EM28XX_DIGITAL_MODE); |
168 | if (rc < 0) | 169 | if (rc < 0) |
169 | return rc; | 170 | return rc; |
170 | 171 | ||
171 | max_dvb_packet_size = em28xx_isoc_dvb_max_packetsize(dev); | 172 | max_dvb_packet_size = dev->dvb_max_pkt_size; |
172 | if (max_dvb_packet_size < 0) | 173 | if (max_dvb_packet_size < 0) |
173 | return max_dvb_packet_size; | 174 | return max_dvb_packet_size; |
174 | dprintk(1, "Using %d buffers each with %d bytes\n", | 175 | dprintk(1, "Using %d buffers each with %d bytes\n", |
@@ -302,10 +303,12 @@ static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = { | |||
302 | }; | 303 | }; |
303 | 304 | ||
304 | static struct drxd_config em28xx_drxd = { | 305 | static struct drxd_config em28xx_drxd = { |
305 | .index = 0, .demod_address = 0x70, .demod_revision = 0xa2, | 306 | .demod_address = 0x70, |
306 | .demoda_address = 0x00, .pll_address = 0x00, | 307 | .demod_revision = 0xa2, |
307 | .pll_type = DRXD_PLL_NONE, .clock = 12000, .insert_rs_byte = 1, | 308 | .pll_type = DRXD_PLL_NONE, |
308 | .pll_set = NULL, .osc_deviation = NULL, .IF = 42800000, | 309 | .clock = 12000, |
310 | .insert_rs_byte = 1, | ||
311 | .IF = 42800000, | ||
309 | .disable_i2c_gate_ctrl = 1, | 312 | .disable_i2c_gate_ctrl = 1, |
310 | }; | 313 | }; |
311 | 314 | ||
@@ -316,6 +319,14 @@ struct drxk_config terratec_h5_drxk = { | |||
316 | .microcode_name = "dvb-usb-terratec-h5-drxk.fw", | 319 | .microcode_name = "dvb-usb-terratec-h5-drxk.fw", |
317 | }; | 320 | }; |
318 | 321 | ||
322 | struct drxk_config hauppauge_930c_drxk = { | ||
323 | .adr = 0x29, | ||
324 | .single_master = 1, | ||
325 | .no_i2c_bridge = 1, | ||
326 | .microcode_name = "dvb-usb-hauppauge-hvr930c-drxk.fw", | ||
327 | .chunk_size = 56, | ||
328 | }; | ||
329 | |||
319 | static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) | 330 | static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) |
320 | { | 331 | { |
321 | struct em28xx_dvb *dvb = fe->sec_priv; | 332 | struct em28xx_dvb *dvb = fe->sec_priv; |
@@ -334,6 +345,73 @@ static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) | |||
334 | return status; | 345 | return status; |
335 | } | 346 | } |
336 | 347 | ||
348 | static void hauppauge_hvr930c_init(struct em28xx *dev) | ||
349 | { | ||
350 | int i; | ||
351 | |||
352 | struct em28xx_reg_seq hauppauge_hvr930c_init[] = { | ||
353 | {EM2874_R80_GPIO, 0xff, 0xff, 0x65}, | ||
354 | {EM2874_R80_GPIO, 0xfb, 0xff, 0x32}, | ||
355 | {EM2874_R80_GPIO, 0xff, 0xff, 0xb8}, | ||
356 | { -1, -1, -1, -1}, | ||
357 | }; | ||
358 | struct em28xx_reg_seq hauppauge_hvr930c_end[] = { | ||
359 | {EM2874_R80_GPIO, 0xef, 0xff, 0x01}, | ||
360 | {EM2874_R80_GPIO, 0xaf, 0xff, 0x65}, | ||
361 | {EM2874_R80_GPIO, 0xef, 0xff, 0x76}, | ||
362 | {EM2874_R80_GPIO, 0xef, 0xff, 0x01}, | ||
363 | {EM2874_R80_GPIO, 0xcf, 0xff, 0x0b}, | ||
364 | {EM2874_R80_GPIO, 0xef, 0xff, 0x40}, | ||
365 | |||
366 | {EM2874_R80_GPIO, 0xcf, 0xff, 0x65}, | ||
367 | {EM2874_R80_GPIO, 0xef, 0xff, 0x65}, | ||
368 | {EM2874_R80_GPIO, 0xcf, 0xff, 0x0b}, | ||
369 | {EM2874_R80_GPIO, 0xef, 0xff, 0x65}, | ||
370 | |||
371 | { -1, -1, -1, -1}, | ||
372 | }; | ||
373 | |||
374 | struct { | ||
375 | unsigned char r[4]; | ||
376 | int len; | ||
377 | } regs[] = { | ||
378 | {{ 0x06, 0x02, 0x00, 0x31 }, 4}, | ||
379 | {{ 0x01, 0x02 }, 2}, | ||
380 | {{ 0x01, 0x02, 0x00, 0xc6 }, 4}, | ||
381 | {{ 0x01, 0x00 }, 2}, | ||
382 | {{ 0x01, 0x00, 0xff, 0xaf }, 4}, | ||
383 | {{ 0x01, 0x00, 0x03, 0xa0 }, 4}, | ||
384 | {{ 0x01, 0x00 }, 2}, | ||
385 | {{ 0x01, 0x00, 0x73, 0xaf }, 4}, | ||
386 | {{ 0x04, 0x00 }, 2}, | ||
387 | {{ 0x00, 0x04 }, 2}, | ||
388 | {{ 0x00, 0x04, 0x00, 0x0a }, 4}, | ||
389 | {{ 0x04, 0x14 }, 2}, | ||
390 | {{ 0x04, 0x14, 0x00, 0x00 }, 4}, | ||
391 | }; | ||
392 | |||
393 | em28xx_gpio_set(dev, hauppauge_hvr930c_init); | ||
394 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40); | ||
395 | msleep(10); | ||
396 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44); | ||
397 | msleep(10); | ||
398 | |||
399 | dev->i2c_client.addr = 0x82 >> 1; | ||
400 | |||
401 | for (i = 0; i < ARRAY_SIZE(regs); i++) | ||
402 | i2c_master_send(&dev->i2c_client, regs[i].r, regs[i].len); | ||
403 | em28xx_gpio_set(dev, hauppauge_hvr930c_end); | ||
404 | |||
405 | msleep(100); | ||
406 | |||
407 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x44); | ||
408 | msleep(30); | ||
409 | |||
410 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x45); | ||
411 | msleep(10); | ||
412 | |||
413 | } | ||
414 | |||
337 | static void terratec_h5_init(struct em28xx *dev) | 415 | static void terratec_h5_init(struct em28xx *dev) |
338 | { | 416 | { |
339 | int i; | 417 | int i; |
@@ -425,13 +503,6 @@ static struct tda10023_config em28xx_tda10023_config = { | |||
425 | static struct cxd2820r_config em28xx_cxd2820r_config = { | 503 | static struct cxd2820r_config em28xx_cxd2820r_config = { |
426 | .i2c_address = (0xd8 >> 1), | 504 | .i2c_address = (0xd8 >> 1), |
427 | .ts_mode = CXD2820R_TS_SERIAL, | 505 | .ts_mode = CXD2820R_TS_SERIAL, |
428 | .if_dvbt_6 = 3300, | ||
429 | .if_dvbt_7 = 3500, | ||
430 | .if_dvbt_8 = 4000, | ||
431 | .if_dvbt2_6 = 3300, | ||
432 | .if_dvbt2_7 = 3500, | ||
433 | .if_dvbt2_8 = 4000, | ||
434 | .if_dvbc = 5000, | ||
435 | 506 | ||
436 | /* enable LNA for DVB-T2 and DVB-C */ | 507 | /* enable LNA for DVB-T2 and DVB-C */ |
437 | .gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L, | 508 | .gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L, |
@@ -456,6 +527,17 @@ static const struct a8293_config em28xx_a8293_config = { | |||
456 | .i2c_addr = 0x08, /* (0x10 >> 1) */ | 527 | .i2c_addr = 0x08, /* (0x10 >> 1) */ |
457 | }; | 528 | }; |
458 | 529 | ||
530 | static struct zl10353_config em28xx_zl10353_no_i2c_gate_dev = { | ||
531 | .demod_address = (0x1e >> 1), | ||
532 | .disable_i2c_gate_ctrl = 1, | ||
533 | .no_tuner = 1, | ||
534 | .parallel_ts = 1, | ||
535 | }; | ||
536 | static struct qt1010_config em28xx_qt1010_config = { | ||
537 | .i2c_address = 0x62 | ||
538 | |||
539 | }; | ||
540 | |||
459 | /* ------------------------------------------------------------------ */ | 541 | /* ------------------------------------------------------------------ */ |
460 | 542 | ||
461 | static int em28xx_attach_xc3028(u8 addr, struct em28xx *dev) | 543 | static int em28xx_attach_xc3028(u8 addr, struct em28xx *dev) |
@@ -708,6 +790,14 @@ static int em28xx_dvb_init(struct em28xx *dev) | |||
708 | goto out_free; | 790 | goto out_free; |
709 | } | 791 | } |
710 | break; | 792 | break; |
793 | case EM2870_BOARD_KWORLD_355U: | ||
794 | dvb->fe[0] = dvb_attach(zl10353_attach, | ||
795 | &em28xx_zl10353_no_i2c_gate_dev, | ||
796 | &dev->i2c_adap); | ||
797 | if (dvb->fe[0] != NULL) | ||
798 | dvb_attach(qt1010_attach, dvb->fe[0], | ||
799 | &dev->i2c_adap, &em28xx_qt1010_config); | ||
800 | break; | ||
711 | case EM2883_BOARD_KWORLD_HYBRID_330U: | 801 | case EM2883_BOARD_KWORLD_HYBRID_330U: |
712 | case EM2882_BOARD_EVGA_INDTUBE: | 802 | case EM2882_BOARD_EVGA_INDTUBE: |
713 | dvb->fe[0] = dvb_attach(s5h1409_attach, | 803 | dvb->fe[0] = dvb_attach(s5h1409_attach, |
@@ -761,50 +851,72 @@ static int em28xx_dvb_init(struct em28xx *dev) | |||
761 | &dev->i2c_adap, &kworld_a340_config); | 851 | &dev->i2c_adap, &kworld_a340_config); |
762 | break; | 852 | break; |
763 | case EM28174_BOARD_PCTV_290E: | 853 | case EM28174_BOARD_PCTV_290E: |
764 | /* MFE | ||
765 | * FE 0 = DVB-T/T2 + FE 1 = DVB-C, both sharing same tuner. */ | ||
766 | /* FE 0 */ | ||
767 | dvb->fe[0] = dvb_attach(cxd2820r_attach, | 854 | dvb->fe[0] = dvb_attach(cxd2820r_attach, |
768 | &em28xx_cxd2820r_config, &dev->i2c_adap, NULL); | 855 | &em28xx_cxd2820r_config, |
856 | &dev->i2c_adap, | ||
857 | NULL); | ||
769 | if (dvb->fe[0]) { | 858 | if (dvb->fe[0]) { |
770 | /* FE 0 attach tuner */ | 859 | /* FE 0 attach tuner */ |
771 | if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60, | 860 | if (!dvb_attach(tda18271_attach, |
772 | &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { | 861 | dvb->fe[0], |
862 | 0x60, | ||
863 | &dev->i2c_adap, | ||
864 | &em28xx_cxd2820r_tda18271_config)) { | ||
865 | |||
773 | dvb_frontend_detach(dvb->fe[0]); | 866 | dvb_frontend_detach(dvb->fe[0]); |
774 | result = -EINVAL; | 867 | result = -EINVAL; |
775 | goto out_free; | 868 | goto out_free; |
776 | } | 869 | } |
777 | /* FE 1. This dvb_attach() cannot fail. */ | 870 | } |
778 | dvb->fe[1] = dvb_attach(cxd2820r_attach, NULL, NULL, | 871 | break; |
779 | dvb->fe[0]); | 872 | case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C: |
780 | dvb->fe[1]->id = 1; | 873 | { |
781 | /* FE 1 attach tuner */ | 874 | struct xc5000_config cfg; |
782 | if (!dvb_attach(tda18271_attach, dvb->fe[1], 0x60, | 875 | hauppauge_hvr930c_init(dev); |
783 | &dev->i2c_adap, &em28xx_cxd2820r_tda18271_config)) { | 876 | |
784 | dvb_frontend_detach(dvb->fe[1]); | 877 | dvb->fe[0] = dvb_attach(drxk_attach, |
785 | /* leave FE 0 still active */ | 878 | &hauppauge_930c_drxk, &dev->i2c_adap); |
786 | } | 879 | if (!dvb->fe[0]) { |
880 | result = -EINVAL; | ||
881 | goto out_free; | ||
882 | } | ||
883 | /* FIXME: do we need a pll semaphore? */ | ||
884 | dvb->fe[0]->sec_priv = dvb; | ||
885 | sema_init(&dvb->pll_mutex, 1); | ||
886 | dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl; | ||
887 | dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl; | ||
787 | 888 | ||
788 | mfe_shared = 1; | 889 | /* Attach xc5000 */ |
890 | memset(&cfg, 0, sizeof(cfg)); | ||
891 | cfg.i2c_address = 0x61; | ||
892 | cfg.if_khz = 4000; | ||
893 | |||
894 | if (dvb->fe[0]->ops.i2c_gate_ctrl) | ||
895 | dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 1); | ||
896 | if (!dvb_attach(xc5000_attach, dvb->fe[0], &dev->i2c_adap, | ||
897 | &cfg)) { | ||
898 | result = -EINVAL; | ||
899 | goto out_free; | ||
789 | } | 900 | } |
901 | if (dvb->fe[0]->ops.i2c_gate_ctrl) | ||
902 | dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0); | ||
903 | |||
790 | break; | 904 | break; |
905 | } | ||
791 | case EM2884_BOARD_TERRATEC_H5: | 906 | case EM2884_BOARD_TERRATEC_H5: |
907 | case EM2884_BOARD_CINERGY_HTC_STICK: | ||
792 | terratec_h5_init(dev); | 908 | terratec_h5_init(dev); |
793 | 909 | ||
794 | dvb->dont_attach_fe1 = 1; | 910 | dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap); |
795 | |||
796 | dvb->fe[0] = dvb_attach(drxk_attach, &terratec_h5_drxk, &dev->i2c_adap, &dvb->fe[1]); | ||
797 | if (!dvb->fe[0]) { | 911 | if (!dvb->fe[0]) { |
798 | result = -EINVAL; | 912 | result = -EINVAL; |
799 | goto out_free; | 913 | goto out_free; |
800 | } | 914 | } |
801 | |||
802 | /* FIXME: do we need a pll semaphore? */ | 915 | /* FIXME: do we need a pll semaphore? */ |
803 | dvb->fe[0]->sec_priv = dvb; | 916 | dvb->fe[0]->sec_priv = dvb; |
804 | sema_init(&dvb->pll_mutex, 1); | 917 | sema_init(&dvb->pll_mutex, 1); |
805 | dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl; | 918 | dvb->gate_ctrl = dvb->fe[0]->ops.i2c_gate_ctrl; |
806 | dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl; | 919 | dvb->fe[0]->ops.i2c_gate_ctrl = drxk_gate_ctrl; |
807 | dvb->fe[1]->id = 1; | ||
808 | 920 | ||
809 | /* Attach tda18271 to DVB-C frontend */ | 921 | /* Attach tda18271 to DVB-C frontend */ |
810 | if (dvb->fe[0]->ops.i2c_gate_ctrl) | 922 | if (dvb->fe[0]->ops.i2c_gate_ctrl) |
@@ -816,12 +928,6 @@ static int em28xx_dvb_init(struct em28xx *dev) | |||
816 | if (dvb->fe[0]->ops.i2c_gate_ctrl) | 928 | if (dvb->fe[0]->ops.i2c_gate_ctrl) |
817 | dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0); | 929 | dvb->fe[0]->ops.i2c_gate_ctrl(dvb->fe[0], 0); |
818 | 930 | ||
819 | /* Hack - needed by drxk/tda18271c2dd */ | ||
820 | dvb->fe[1]->tuner_priv = dvb->fe[0]->tuner_priv; | ||
821 | memcpy(&dvb->fe[1]->ops.tuner_ops, | ||
822 | &dvb->fe[0]->ops.tuner_ops, | ||
823 | sizeof(dvb->fe[0]->ops.tuner_ops)); | ||
824 | |||
825 | break; | 931 | break; |
826 | case EM28174_BOARD_PCTV_460E: | 932 | case EM28174_BOARD_PCTV_460E: |
827 | /* attach demod */ | 933 | /* attach demod */ |
@@ -845,6 +951,8 @@ static int em28xx_dvb_init(struct em28xx *dev) | |||
845 | } | 951 | } |
846 | /* define general-purpose callback pointer */ | 952 | /* define general-purpose callback pointer */ |
847 | dvb->fe[0]->callback = em28xx_tuner_callback; | 953 | dvb->fe[0]->callback = em28xx_tuner_callback; |
954 | if (dvb->fe[1]) | ||
955 | dvb->fe[1]->callback = em28xx_tuner_callback; | ||
848 | 956 | ||
849 | /* register everything */ | 957 | /* register everything */ |
850 | result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev); | 958 | result = em28xx_register_dvb(dvb, THIS_MODULE, dev, &dev->udev->dev); |
diff --git a/drivers/media/video/em28xx/em28xx-input.c b/drivers/media/video/em28xx/em28xx-input.c index 679da480428..2630b265b0e 100644 --- a/drivers/media/video/em28xx/em28xx-input.c +++ b/drivers/media/video/em28xx/em28xx-input.c | |||
@@ -306,7 +306,8 @@ static void em28xx_ir_handle_key(struct em28xx_IR *ir) | |||
306 | poll_result.rc_data[0], | 306 | poll_result.rc_data[0], |
307 | poll_result.toggle_bit); | 307 | poll_result.toggle_bit); |
308 | 308 | ||
309 | if (ir->dev->chip_id == CHIP_ID_EM2874) | 309 | if (ir->dev->chip_id == CHIP_ID_EM2874 || |
310 | ir->dev->chip_id == CHIP_ID_EM2884) | ||
310 | /* The em2874 clears the readcount field every time the | 311 | /* The em2874 clears the readcount field every time the |
311 | register is read. The em2860/2880 datasheet says that it | 312 | register is read. The em2860/2880 datasheet says that it |
312 | is supposed to clear the readcount, but it doesn't. So with | 313 | is supposed to clear the readcount, but it doesn't. So with |
@@ -371,13 +372,15 @@ int em28xx_ir_change_protocol(struct rc_dev *rc_dev, u64 rc_type) | |||
371 | case CHIP_ID_EM2883: | 372 | case CHIP_ID_EM2883: |
372 | ir->get_key = default_polling_getkey; | 373 | ir->get_key = default_polling_getkey; |
373 | break; | 374 | break; |
375 | case CHIP_ID_EM2884: | ||
374 | case CHIP_ID_EM2874: | 376 | case CHIP_ID_EM2874: |
375 | case CHIP_ID_EM28174: | 377 | case CHIP_ID_EM28174: |
376 | ir->get_key = em2874_polling_getkey; | 378 | ir->get_key = em2874_polling_getkey; |
377 | em28xx_write_regs(dev, EM2874_R50_IR_CONFIG, &ir_config, 1); | 379 | em28xx_write_regs(dev, EM2874_R50_IR_CONFIG, &ir_config, 1); |
378 | break; | 380 | break; |
379 | default: | 381 | default: |
380 | printk("Unrecognized em28xx chip id: IR not supported\n"); | 382 | printk("Unrecognized em28xx chip id 0x%02x: IR not supported\n", |
383 | dev->chip_id); | ||
381 | rc = -EINVAL; | 384 | rc = -EINVAL; |
382 | } | 385 | } |
383 | 386 | ||
diff --git a/drivers/media/video/em28xx/em28xx-reg.h b/drivers/media/video/em28xx/em28xx-reg.h index 66f792361b9..2f626850572 100644 --- a/drivers/media/video/em28xx/em28xx-reg.h +++ b/drivers/media/video/em28xx/em28xx-reg.h | |||
@@ -12,6 +12,11 @@ | |||
12 | #define EM_GPO_2 (1 << 2) | 12 | #define EM_GPO_2 (1 << 2) |
13 | #define EM_GPO_3 (1 << 3) | 13 | #define EM_GPO_3 (1 << 3) |
14 | 14 | ||
15 | /* em28xx endpoints */ | ||
16 | #define EM28XX_EP_ANALOG 0x82 | ||
17 | #define EM28XX_EP_AUDIO 0x83 | ||
18 | #define EM28XX_EP_DIGITAL 0x84 | ||
19 | |||
15 | /* em2800 registers */ | 20 | /* em2800 registers */ |
16 | #define EM2800_R08_AUDIOSRC 0x08 | 21 | #define EM2800_R08_AUDIOSRC 0x08 |
17 | 22 | ||
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c index 9b4557a2f6d..613300b51a9 100644 --- a/drivers/media/video/em28xx/em28xx-video.c +++ b/drivers/media/video/em28xx/em28xx-video.c | |||
@@ -1070,6 +1070,10 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | |||
1070 | /* the em2800 can only scale down to 50% */ | 1070 | /* the em2800 can only scale down to 50% */ |
1071 | height = height > (3 * maxh / 4) ? maxh : maxh / 2; | 1071 | height = height > (3 * maxh / 4) ? maxh : maxh / 2; |
1072 | width = width > (3 * maxw / 4) ? maxw : maxw / 2; | 1072 | width = width > (3 * maxw / 4) ? maxw : maxw / 2; |
1073 | /* MaxPacketSize for em2800 is too small to capture at full resolution | ||
1074 | * use half of maxw as the scaler can only scale to 50% */ | ||
1075 | if (width == maxw && height == maxh) | ||
1076 | width /= 2; | ||
1073 | } else { | 1077 | } else { |
1074 | /* width must even because of the YUYV format | 1078 | /* width must even because of the YUYV format |
1075 | height must be even because of interlacing */ | 1079 | height must be even because of interlacing */ |
@@ -2503,6 +2507,7 @@ int em28xx_register_analog_devices(struct em28xx *dev) | |||
2503 | { | 2507 | { |
2504 | u8 val; | 2508 | u8 val; |
2505 | int ret; | 2509 | int ret; |
2510 | unsigned int maxw; | ||
2506 | 2511 | ||
2507 | printk(KERN_INFO "%s: v4l2 driver version %s\n", | 2512 | printk(KERN_INFO "%s: v4l2 driver version %s\n", |
2508 | dev->name, EM28XX_VERSION); | 2513 | dev->name, EM28XX_VERSION); |
@@ -2515,8 +2520,15 @@ int em28xx_register_analog_devices(struct em28xx *dev) | |||
2515 | 2520 | ||
2516 | /* Analog specific initialization */ | 2521 | /* Analog specific initialization */ |
2517 | dev->format = &format[0]; | 2522 | dev->format = &format[0]; |
2523 | |||
2524 | maxw = norm_maxw(dev); | ||
2525 | /* MaxPacketSize for em2800 is too small to capture at full resolution | ||
2526 | * use half of maxw as the scaler can only scale to 50% */ | ||
2527 | if (dev->board.is_em2800) | ||
2528 | maxw /= 2; | ||
2529 | |||
2518 | em28xx_set_video_format(dev, format[0].fourcc, | 2530 | em28xx_set_video_format(dev, format[0].fourcc, |
2519 | norm_maxw(dev), norm_maxh(dev)); | 2531 | maxw, norm_maxh(dev)); |
2520 | 2532 | ||
2521 | video_mux(dev, dev->ctl_input); | 2533 | video_mux(dev, dev->ctl_input); |
2522 | 2534 | ||
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h index 2a2cb7ed001..22e252bcc41 100644 --- a/drivers/media/video/em28xx/em28xx.h +++ b/drivers/media/video/em28xx/em28xx.h | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <media/videobuf-dvb.h> | 38 | #include <media/videobuf-dvb.h> |
39 | #endif | 39 | #endif |
40 | #include "tuner-xc2028.h" | 40 | #include "tuner-xc2028.h" |
41 | #include "xc5000.h" | ||
41 | #include "em28xx-reg.h" | 42 | #include "em28xx-reg.h" |
42 | 43 | ||
43 | /* Boards supported by driver */ | 44 | /* Boards supported by driver */ |
@@ -121,6 +122,9 @@ | |||
121 | #define EM28174_BOARD_PCTV_290E 78 | 122 | #define EM28174_BOARD_PCTV_290E 78 |
122 | #define EM2884_BOARD_TERRATEC_H5 79 | 123 | #define EM2884_BOARD_TERRATEC_H5 79 |
123 | #define EM28174_BOARD_PCTV_460E 80 | 124 | #define EM28174_BOARD_PCTV_460E 80 |
125 | #define EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C 81 | ||
126 | #define EM2884_BOARD_CINERGY_HTC_STICK 82 | ||
127 | #define EM2860_BOARD_HT_VIDBOX_NW03 83 | ||
124 | 128 | ||
125 | /* Limits minimum and default number of buffers */ | 129 | /* Limits minimum and default number of buffers */ |
126 | #define EM28XX_MIN_BUF 4 | 130 | #define EM28XX_MIN_BUF 4 |
@@ -594,6 +598,8 @@ struct em28xx { | |||
594 | int max_pkt_size; /* max packet size of isoc transaction */ | 598 | int max_pkt_size; /* max packet size of isoc transaction */ |
595 | int num_alt; /* Number of alternative settings */ | 599 | int num_alt; /* Number of alternative settings */ |
596 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ | 600 | unsigned int *alt_max_pkt_size; /* array of wMaxPacketSize */ |
601 | int dvb_alt; /* alternate for DVB */ | ||
602 | unsigned int dvb_max_pkt_size; /* wMaxPacketSize for DVB */ | ||
597 | struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ | 603 | struct urb *urb[EM28XX_NUM_BUFS]; /* urb for isoc transfers */ |
598 | char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc | 604 | char *transfer_buffer[EM28XX_NUM_BUFS]; /* transfer buffers for isoc |
599 | transfer */ | 605 | transfer */ |
@@ -825,7 +831,7 @@ static inline unsigned int norm_maxw(struct em28xx *dev) | |||
825 | if (dev->board.is_webcam) | 831 | if (dev->board.is_webcam) |
826 | return dev->sensor_xres; | 832 | return dev->sensor_xres; |
827 | 833 | ||
828 | if (dev->board.max_range_640_480 || dev->board.is_em2800) | 834 | if (dev->board.max_range_640_480) |
829 | return 640; | 835 | return 640; |
830 | 836 | ||
831 | return 720; | 837 | return 720; |