aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/em28xx
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-01-15 15:49:56 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-01-15 15:49:56 -0500
commit122804ecb59493fbb4d31b3ba9ac59faaf45276f (patch)
treecff4d8a158c412e4a8d3abc8d91bb0eb52b01c9a /drivers/media/video/em28xx
parent16008d641670571ff4cd750b416c7caf2d89f467 (diff)
parent126400033940afb658123517a2e80eb68259fbd7 (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.c2
-rw-r--r--drivers/media/video/em28xx/em28xx-cards.c256
-rw-r--r--drivers/media/video/em28xx/em28xx-core.c61
-rw-r--r--drivers/media/video/em28xx/em28xx-dvb.c190
-rw-r--r--drivers/media/video/em28xx/em28xx-input.c7
-rw-r--r--drivers/media/video/em28xx/em28xx-reg.h5
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c14
-rw-r--r--drivers/media/video/em28xx/em28xx.h8
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
340static 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
348static 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};
1844const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); 1912const 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};
1980MODULE_DEVICE_TABLE(usb, em28xx_id_table); 2064MODULE_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 */
2835static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, 2920static 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:
3031static int em28xx_usb_probe(struct usb_interface *interface, 3115static 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
3326unlock_and_free:
3327 mutex_unlock(&dev->lock);
3328
3329err_free:
3330 kfree(dev->alt_max_pkt_size);
3331 kfree(dev);
3332
3253err: 3333err:
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}
1109EXPORT_SYMBOL_GPL(em28xx_init_isoc); 1110EXPORT_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) */
1113int 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}
1165EXPORT_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
48MODULE_DESCRIPTION("driver for em28xx based DVB cards"); 49MODULE_DESCRIPTION("driver for em28xx based DVB cards");
49MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); 50MODULE_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
304static struct drxd_config em28xx_drxd = { 305static 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
322struct 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
319static int drxk_gate_ctrl(struct dvb_frontend *fe, int enable) 330static 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
348static 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
337static void terratec_h5_init(struct em28xx *dev) 415static 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 = {
425static struct cxd2820r_config em28xx_cxd2820r_config = { 503static 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
530static 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};
536static struct qt1010_config em28xx_qt1010_config = {
537 .i2c_address = 0x62
538
539};
540
459/* ------------------------------------------------------------------ */ 541/* ------------------------------------------------------------------ */
460 542
461static int em28xx_attach_xc3028(u8 addr, struct em28xx *dev) 543static 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;