Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 //
0003 // em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
0004 //          video capture devices
0005 //
0006 // Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
0007 //            Markus Rechberger <mrechberger@gmail.com>
0008 //            Mauro Carvalho Chehab <mchehab@kernel.org>
0009 //            Sascha Sommer <saschasommer@freenet.de>
0010 // Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
0011 
0012 #include "em28xx.h"
0013 
0014 #include <linux/init.h>
0015 #include <linux/module.h>
0016 #include <linux/slab.h>
0017 #include <linux/delay.h>
0018 #include <linux/i2c.h>
0019 #include <linux/usb.h>
0020 #include <media/tuner.h>
0021 #include <media/drv-intf/msp3400.h>
0022 #include <media/i2c/saa7115.h>
0023 #include <dt-bindings/media/tvp5150.h>
0024 #include <media/i2c/tvaudio.h>
0025 #include <media/tveeprom.h>
0026 #include <media/v4l2-common.h>
0027 #include <sound/ac97_codec.h>
0028 
0029 #define DRIVER_NAME         "em28xx"
0030 
0031 static int tuner = -1;
0032 module_param(tuner, int, 0444);
0033 MODULE_PARM_DESC(tuner, "tuner type");
0034 
0035 static unsigned int disable_ir;
0036 module_param(disable_ir, int, 0444);
0037 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
0038 
0039 static unsigned int disable_usb_speed_check;
0040 module_param(disable_usb_speed_check, int, 0444);
0041 MODULE_PARM_DESC(disable_usb_speed_check,
0042          "override min bandwidth requirement of 480M bps");
0043 
0044 static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
0045 module_param_array(card,  int, NULL, 0444);
0046 MODULE_PARM_DESC(card,     "card type");
0047 
0048 static int usb_xfer_mode = -1;
0049 module_param(usb_xfer_mode, int, 0444);
0050 MODULE_PARM_DESC(usb_xfer_mode,
0051          "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
0052 
0053 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
0054 static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
0055 
0056 struct em28xx_hash_table {
0057     unsigned long hash;
0058     unsigned int  model;
0059     unsigned int  tuner;
0060 };
0061 
0062 static void em28xx_pre_card_setup(struct em28xx *dev);
0063 
0064 /*
0065  *  Reset sequences for analog/digital modes
0066  */
0067 
0068 /* Reset for the most [analog] boards */
0069 static const struct em28xx_reg_seq default_analog[] = {
0070     {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4, 10},
0071     {   -1,     -1, -1,     -1},
0072 };
0073 
0074 /* Reset for the most [digital] boards */
0075 static const struct em28xx_reg_seq default_digital[] = {
0076     {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4, 10},
0077     {   -1,     -1, -1,     -1},
0078 };
0079 
0080 /* Board :Zolid Hybrid Tv Stick */
0081 static struct em28xx_reg_seq zolid_tuner[] = {
0082     {EM2820_R08_GPIO_CTRL,      0xfd,       0xff,   100},
0083     {EM2820_R08_GPIO_CTRL,      0xfe,       0xff,   100},
0084     {       -1,                 -1,         -1,      -1},
0085 };
0086 
0087 static struct em28xx_reg_seq zolid_digital[] = {
0088     {EM2820_R08_GPIO_CTRL,      0x6a,       0xff,   100},
0089     {EM2820_R08_GPIO_CTRL,      0x7a,       0xff,   100},
0090     {EM2880_R04_GPO,            0x04,       0xff,   100},
0091     {EM2880_R04_GPO,            0x0c,       0xff,   100},
0092     {   -1,                     -1,         -1,      -1},
0093 };
0094 
0095 /* Board Hauppauge WinTV HVR 900 analog */
0096 static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
0097     {EM2820_R08_GPIO_CTRL,  0x2d,   ~EM_GPIO_4, 10},
0098     {   0x05,       0xff,   0x10,       10},
0099     {   -1,     -1, -1,     -1},
0100 };
0101 
0102 /* Board Hauppauge WinTV HVR 900 digital */
0103 static const struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
0104     {EM2820_R08_GPIO_CTRL,  0x2e,   ~EM_GPIO_4, 10},
0105     {EM2880_R04_GPO,    0x04,   0x0f,       10},
0106     {EM2880_R04_GPO,    0x0c,   0x0f,       10},
0107     {   -1,     -1, -1,     -1},
0108 };
0109 
0110 /* Board Hauppauge WinTV HVR 900 (R2) digital */
0111 static const struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
0112     {EM2820_R08_GPIO_CTRL,  0x2e,   ~EM_GPIO_4, 10},
0113     {EM2880_R04_GPO,    0x0c,   0x0f,       10},
0114     {   -1,     -1, -1,     -1},
0115 };
0116 
0117 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
0118 static const struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
0119     {EM2820_R08_GPIO_CTRL,  0x69,   ~EM_GPIO_4, 10},
0120     {   -1,     -1, -1,     -1},
0121 };
0122 
0123 /* Board - EM2882 Kworld 315U digital */
0124 static const struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
0125     {EM2820_R08_GPIO_CTRL,  0xff,   0xff,       10},
0126     {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,       10},
0127     {EM2880_R04_GPO,    0x04,   0xff,       10},
0128     {EM2880_R04_GPO,    0x0c,   0xff,       10},
0129     {EM2820_R08_GPIO_CTRL,  0x7e,   0xff,       10},
0130     {   -1,     -1, -1,     -1},
0131 };
0132 
0133 static const struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
0134     {EM2880_R04_GPO,    0x08,   0xff,       10},
0135     {EM2880_R04_GPO,    0x0c,   0xff,       10},
0136     {EM2880_R04_GPO,    0x08,   0xff,       10},
0137     {EM2880_R04_GPO,    0x0c,   0xff,       10},
0138     {   -1,     -1, -1,     -1},
0139 };
0140 
0141 static const struct em28xx_reg_seq kworld_330u_analog[] = {
0142     {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4, 10},
0143     {EM2880_R04_GPO,    0x00,   0xff,       10},
0144     {   -1,     -1, -1,     -1},
0145 };
0146 
0147 static const struct em28xx_reg_seq kworld_330u_digital[] = {
0148     {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4, 10},
0149     {EM2880_R04_GPO,    0x08,   0xff,       10},
0150     {   -1,     -1, -1,     -1},
0151 };
0152 
0153 /*
0154  * Evga inDtube
0155  * GPIO0 - Enable digital power (s5h1409) - low to enable
0156  * GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
0157  * GPIO4 - xc3028 reset
0158  * GOP3  - s5h1409 reset
0159  */
0160 static const struct em28xx_reg_seq evga_indtube_analog[] = {
0161     {EM2820_R08_GPIO_CTRL,  0x79,   0xff,       60},
0162     {   -1,     -1, -1,     -1},
0163 };
0164 
0165 static const struct em28xx_reg_seq evga_indtube_digital[] = {
0166     {EM2820_R08_GPIO_CTRL,  0x7a,   0xff,        1},
0167     {EM2880_R04_GPO,    0x04,   0xff,       10},
0168     {EM2880_R04_GPO,    0x0c,   0xff,        1},
0169     {   -1,     -1, -1,     -1},
0170 };
0171 
0172 /*
0173  * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
0174  * EM_GPIO_0 - currently unknown
0175  * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
0176  * EM_GPIO_2 - currently unknown
0177  * EM_GPIO_3 - currently unknown
0178  * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
0179  * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
0180  * EM_GPIO_6 - currently unknown
0181  * EM_GPIO_7 - currently unknown
0182  */
0183 static const struct em28xx_reg_seq kworld_a340_digital[] = {
0184     {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4, 10},
0185     {   -1,     -1, -1,     -1},
0186 };
0187 
0188 static const struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
0189     {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xff,   100},
0190     {EM2874_R80_GPIO_P0_CTRL,   0xfe,   0xff,   100},
0191     {EM2874_R80_GPIO_P0_CTRL,   0xbe,   0xff,   100},
0192     {EM2874_R80_GPIO_P0_CTRL,   0xfe,   0xff,   100},
0193     {   -1,         -1, -1, -1},
0194 };
0195 
0196 /* Pinnacle Hybrid Pro eb1a:2881 */
0197 static const struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
0198     {EM2820_R08_GPIO_CTRL,  0xfd,   ~EM_GPIO_4, 10},
0199     {   -1,     -1, -1,     -1},
0200 };
0201 
0202 static const struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
0203     {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4, 10},
0204     {EM2880_R04_GPO,    0x04,   0xff,          100},/* zl10353 reset */
0205     {EM2880_R04_GPO,    0x0c,   0xff,        1},
0206     {   -1,     -1, -1,     -1},
0207 };
0208 
0209 static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
0210     {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4, 10},
0211     {EM2880_R04_GPO,    0x00,   0xff,       10},
0212     {   -1,     -1, -1,     -1},
0213 };
0214 
0215 static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
0216     {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4, 10},
0217     {EM2880_R04_GPO,    0x08,   0xff,       10},
0218     {   -1,     -1, -1,     -1},
0219 };
0220 
0221 /*
0222  * PCTV HD Mini (80e) GPIOs
0223  * 0-5: not used
0224  * 6:   demod reset, active low
0225  * 7:   LED on, active high
0226  */
0227 static const struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
0228     {EM28XX_R06_I2C_CLK,    0x45,   0xff,         10}, /*400 KHz*/
0229     {EM2874_R80_GPIO_P0_CTRL, 0x00,   0xff,       100},/*Demod reset*/
0230     {EM2874_R80_GPIO_P0_CTRL, 0x40,   0xff,       10},
0231     {  -1,          -1, -1,       -1},
0232 };
0233 
0234 /*
0235  * eb1a:2868 Reddo DVB-C USB TV Box
0236  * GPIO4 - CU1216L NIM
0237  * Other GPIOs seems to be don't care.
0238  */
0239 static const struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
0240     {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,       10},
0241     {EM2820_R08_GPIO_CTRL,  0xde,   0xff,       10},
0242     {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,       10},
0243     {EM2820_R08_GPIO_CTRL,  0xff,   0xff,       10},
0244     {EM2820_R08_GPIO_CTRL,  0x7f,   0xff,       10},
0245     {EM2820_R08_GPIO_CTRL,  0x6f,   0xff,       10},
0246     {EM2820_R08_GPIO_CTRL,  0xff,   0xff,       10},
0247     {   -1,     -1, -1,     -1},
0248 };
0249 
0250 /* Callback for the most boards */
0251 static const struct em28xx_reg_seq default_tuner_gpio[] = {
0252     {EM2820_R08_GPIO_CTRL,  EM_GPIO_4,  EM_GPIO_4,  10},
0253     {EM2820_R08_GPIO_CTRL,  0,      EM_GPIO_4,  10},
0254     {EM2820_R08_GPIO_CTRL,  EM_GPIO_4,  EM_GPIO_4,  10},
0255     {   -1,     -1,     -1,     -1},
0256 };
0257 
0258 /* Mute/unmute */
0259 static const struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
0260     {EM2820_R08_GPIO_CTRL,  5,  7,  10},
0261     {   -1,     -1, -1, -1},
0262 };
0263 
0264 static const struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
0265     {EM2820_R08_GPIO_CTRL,  4,  7,  10},
0266     {   -1,     -1, -1, -1},
0267 };
0268 
0269 static const struct em28xx_reg_seq compro_mute_gpio[] = {
0270     {EM2820_R08_GPIO_CTRL,  6,  7,  10},
0271     {   -1,     -1, -1, -1},
0272 };
0273 
0274 /* Terratec AV350 */
0275 static const struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
0276     {EM2820_R08_GPIO_CTRL,  0xff,   0x7f,       10},
0277     {   -1,     -1, -1,     -1},
0278 };
0279 
0280 static const struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
0281     {EM2820_R08_GPIO_CTRL,  0xff,   0xff,       10},
0282     {   -1,     -1, -1,     -1},
0283 };
0284 
0285 static const struct em28xx_reg_seq silvercrest_reg_seq[] = {
0286     {EM2820_R08_GPIO_CTRL,  0xff,   0xff,       10},
0287     {EM2820_R08_GPIO_CTRL,  0x01,   0xf7,       10},
0288     {   -1,     -1, -1,     -1},
0289 };
0290 
0291 static const struct em28xx_reg_seq vc211a_enable[] = {
0292     {EM2820_R08_GPIO_CTRL,  0xff,   0x07,       10},
0293     {EM2820_R08_GPIO_CTRL,  0xff,   0x0f,       10},
0294     {EM2820_R08_GPIO_CTRL,  0xff,   0x0b,       10},
0295     {   -1,     -1, -1,     -1},
0296 };
0297 
0298 static const struct em28xx_reg_seq dikom_dk300_digital[] = {
0299     {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4, 10},
0300     {EM2880_R04_GPO,    0x08,   0xff,       10},
0301     {   -1,     -1, -1,     -1},
0302 };
0303 
0304 /* Reset for the most [digital] boards */
0305 static const struct em28xx_reg_seq leadership_digital[] = {
0306     {EM2874_R80_GPIO_P0_CTRL,   0x70,   0xff,   10},
0307     {   -1,         -1, -1, -1},
0308 };
0309 
0310 static const struct em28xx_reg_seq leadership_reset[] = {
0311     {EM2874_R80_GPIO_P0_CTRL,   0xf0,   0xff,   10},
0312     {EM2874_R80_GPIO_P0_CTRL,   0xb0,   0xff,   10},
0313     {EM2874_R80_GPIO_P0_CTRL,   0xf0,   0xff,   10},
0314     {   -1,         -1, -1, -1},
0315 };
0316 
0317 /*
0318  * 2013:024f PCTV nanoStick T2 290e
0319  * GPIO_6 - demod reset
0320  * GPIO_7 - LED
0321  */
0322 static const struct em28xx_reg_seq pctv_290e[] = {
0323     {EM2874_R80_GPIO_P0_CTRL,   0x00,   0xff,   80},
0324     {EM2874_R80_GPIO_P0_CTRL,   0x40,   0xff,   80}, /* GPIO_6 = 1 */
0325     {EM2874_R80_GPIO_P0_CTRL,   0xc0,   0xff,   80}, /* GPIO_7 = 1 */
0326     {   -1,         -1, -1, -1},
0327 };
0328 
0329 #if 0
0330 static const struct em28xx_reg_seq terratec_h5_gpio[] = {
0331     {EM2820_R08_GPIO_CTRL,      0xff,   0xff,   10},
0332     {EM2874_R80_GPIO_P0_CTRL,   0xf6,   0xff,   100},
0333     {EM2874_R80_GPIO_P0_CTRL,   0xf2,   0xff,   50},
0334     {EM2874_R80_GPIO_P0_CTRL,   0xf6,   0xff,   50},
0335     {   -1,         -1, -1, -1},
0336 };
0337 
0338 static const struct em28xx_reg_seq terratec_h5_digital[] = {
0339     {EM2874_R80_GPIO_P0_CTRL,   0xf6,   0xff,   10},
0340     {EM2874_R80_GPIO_P0_CTRL,   0xe6,   0xff,   100},
0341     {EM2874_R80_GPIO_P0_CTRL,   0xa6,   0xff,   10},
0342     {   -1,         -1, -1, -1},
0343 };
0344 #endif
0345 
0346 /*
0347  * 2013:024f PCTV DVB-S2 Stick 460e
0348  * GPIO_0 - POWER_ON
0349  * GPIO_1 - BOOST
0350  * GPIO_2 - VUV_LNB (red LED)
0351  * GPIO_3 - EXT_12V
0352  * GPIO_4 - INT_DEM (DEMOD GPIO_0)
0353  * GPIO_5 - INT_LNB
0354  * GPIO_6 - RESET_DEM
0355  * GPIO_7 - LED (green LED)
0356  */
0357 static const struct em28xx_reg_seq pctv_460e[] = {
0358     {EM2874_R80_GPIO_P0_CTRL,   0x01,   0xff,   50},
0359     {   0x0d,           0xff,   0xff,   50},
0360     {EM2874_R80_GPIO_P0_CTRL,   0x41,   0xff,   50}, /* GPIO_6=1 */
0361     {   0x0d,           0x42,   0xff,   50},
0362     {EM2874_R80_GPIO_P0_CTRL,   0x61,   0xff,   50}, /* GPIO_5=1 */
0363     {   -1,         -1, -1, -1},
0364 };
0365 
0366 static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
0367     {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xff,   10},
0368     {EM2874_R80_GPIO_P0_CTRL,   0xfd,   0xff,   10}, /* xc5000 reset */
0369     {EM2874_R80_GPIO_P0_CTRL,   0xf9,   0xff,   35},
0370     {EM2874_R80_GPIO_P0_CTRL,   0xfd,   0xff,   10},
0371     {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xff,   10},
0372     {EM2874_R80_GPIO_P0_CTRL,   0xfe,   0xff,   10},
0373     {EM2874_R80_GPIO_P0_CTRL,   0xbe,   0xff,   10},
0374     {EM2874_R80_GPIO_P0_CTRL,   0xfe,   0xff,   20},
0375     {   -1,         -1, -1, -1},
0376 };
0377 
0378 /*
0379  * 2013:0258 PCTV DVB-S2 Stick (461e)
0380  * GPIO 0 = POWER_ON
0381  * GPIO 1 = BOOST
0382  * GPIO 2 = VUV_LNB (red LED)
0383  * GPIO 3 = #EXT_12V
0384  * GPIO 4 = INT_DEM
0385  * GPIO 5 = INT_LNB
0386  * GPIO 6 = #RESET_DEM
0387  * GPIO 7 = P07_LED (green LED)
0388  */
0389 static const struct em28xx_reg_seq pctv_461e[] = {
0390     {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},
0391     {0x0d,                 0xff, 0xff,    0},
0392     {EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */
0393     {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */
0394     {0x0d,                 0x42, 0xff,    0},
0395     {EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},
0396     {EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */
0397     {                  -1,   -1,   -1,   -1},
0398 };
0399 
0400 #if 0
0401 static const struct em28xx_reg_seq hauppauge_930c_gpio[] = {
0402     {EM2874_R80_GPIO_P0_CTRL,   0x6f,   0xff,   10},
0403     {EM2874_R80_GPIO_P0_CTRL,   0x4f,   0xff,   10}, /* xc5000 reset */
0404     {EM2874_R80_GPIO_P0_CTRL,   0x6f,   0xff,   10},
0405     {EM2874_R80_GPIO_P0_CTRL,   0x4f,   0xff,   10},
0406     {   -1,         -1, -1, -1},
0407 };
0408 
0409 static const struct em28xx_reg_seq hauppauge_930c_digital[] = {
0410     {EM2874_R80_GPIO_P0_CTRL,   0xf6,   0xff,   10},
0411     {EM2874_R80_GPIO_P0_CTRL,   0xe6,   0xff,   100},
0412     {EM2874_R80_GPIO_P0_CTRL,   0xa6,   0xff,   10},
0413     {   -1,         -1, -1, -1},
0414 };
0415 #endif
0416 
0417 /*
0418  * 1b80:e425 MaxMedia UB425-TC
0419  * 1b80:e1cc Delock 61959
0420  * GPIO_6 - demod reset, 0=active
0421  * GPIO_7 - LED, 0=active
0422  */
0423 static const struct em28xx_reg_seq maxmedia_ub425_tc[] = {
0424     {EM2874_R80_GPIO_P0_CTRL,   0x83,   0xff,   100},
0425     {EM2874_R80_GPIO_P0_CTRL,   0xc3,   0xff,   100}, /* GPIO_6 = 1 */
0426     {EM2874_R80_GPIO_P0_CTRL,   0x43,   0xff,   000}, /* GPIO_7 = 0 */
0427     {   -1,         -1, -1, -1},
0428 };
0429 
0430 /*
0431  * 2304:0242 PCTV QuatroStick (510e)
0432  * GPIO_2: decoder reset, 0=active
0433  * GPIO_4: decoder suspend, 0=active
0434  * GPIO_6: demod reset, 0=active
0435  * GPIO_7: LED, 1=active
0436  */
0437 static const struct em28xx_reg_seq pctv_510e[] = {
0438     {EM2874_R80_GPIO_P0_CTRL,   0x10,   0xff,   100},
0439     {EM2874_R80_GPIO_P0_CTRL,   0x14,   0xff,   100}, /* GPIO_2 = 1 */
0440     {EM2874_R80_GPIO_P0_CTRL,   0x54,   0xff,   050}, /* GPIO_6 = 1 */
0441     {   -1,         -1, -1, -1},
0442 };
0443 
0444 /*
0445  * 2013:0251 PCTV QuatroStick nano (520e)
0446  * GPIO_2: decoder reset, 0=active
0447  * GPIO_4: decoder suspend, 0=active
0448  * GPIO_6: demod reset, 0=active
0449  * GPIO_7: LED, 1=active
0450  */
0451 static const struct em28xx_reg_seq pctv_520e[] = {
0452     {EM2874_R80_GPIO_P0_CTRL,   0x10,   0xff,   100},
0453     {EM2874_R80_GPIO_P0_CTRL,   0x14,   0xff,   100}, /* GPIO_2 = 1 */
0454     {EM2874_R80_GPIO_P0_CTRL,   0x54,   0xff,   050}, /* GPIO_6 = 1 */
0455     {EM2874_R80_GPIO_P0_CTRL,   0xd4,   0xff,   000}, /* GPIO_7 = 1 */
0456     {   -1,         -1, -1, -1},
0457 };
0458 
0459 /*
0460  * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
0461  * reg 0x80/0x84:
0462  * GPIO_0: capturing LED, 0=on, 1=off
0463  * GPIO_2: AV mute button, 0=pressed, 1=unpressed
0464  * GPIO 3: illumination button, 0=pressed, 1=unpressed
0465  * GPIO_6: illumination/flash LED, 0=on, 1=off
0466  * reg 0x81/0x85:
0467  * GPIO_7: snapshot button, 0=pressed, 1=unpressed
0468  */
0469 static const struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
0470     {EM2820_R08_GPIO_CTRL,      0xf7,   0xff,   10},
0471     {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xb2,   10},
0472     {   -1,         -1, -1, -1},
0473 };
0474 
0475 static const struct em28xx_reg_seq pctv_292e[] = {
0476     {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
0477     {0x0d,                         0xff, 0xff,    950},
0478     {EM2874_R80_GPIO_P0_CTRL,      0xbd, 0xff,    100},
0479     {EM2874_R80_GPIO_P0_CTRL,      0xfd, 0xff,    410},
0480     {EM2874_R80_GPIO_P0_CTRL,      0x7d, 0xff,    300},
0481     {EM2874_R80_GPIO_P0_CTRL,      0x7c, 0xff,     60},
0482     {0x0d,                         0x42, 0xff,     50},
0483     {EM2874_R5F_TS_ENABLE,         0x85, 0xff,      0},
0484     {-1,                             -1,   -1,     -1},
0485 };
0486 
0487 static const struct em28xx_reg_seq terratec_t2_stick_hd[] = {
0488     {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xff,   0},
0489     {0x0d,              0xff,   0xff,   600},
0490     {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   10},
0491     {EM2874_R80_GPIO_P0_CTRL,   0xbc,   0xff,   100},
0492     {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   100},
0493     {EM2874_R80_GPIO_P0_CTRL,   0x00,   0xff,   300},
0494     {EM2874_R80_GPIO_P0_CTRL,   0xf8,   0xff,   100},
0495     {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   300},
0496     {0x0d,              0x42,   0xff,   1000},
0497     {EM2874_R5F_TS_ENABLE,      0x85,   0xff,   0},
0498     {-1,                             -1,   -1,     -1},
0499 };
0500 
0501 static const struct em28xx_reg_seq plex_px_bcud[] = {
0502     {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xff,   0},
0503     {0x0d,              0xff,   0xff,   0},
0504     {EM2874_R50_IR_CONFIG,      0x01,   0xff,   0},
0505     {EM28XX_R06_I2C_CLK,        0x40,   0xff,   0},
0506     {EM2874_R80_GPIO_P0_CTRL,   0xfd,   0xff,   100},
0507     {EM28XX_R12_VINENABLE,      0x20,   0x20,   0},
0508     {0x0d,              0x42,   0xff,   1000},
0509     {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   10},
0510     {EM2874_R80_GPIO_P0_CTRL,   0xfd,   0xff,   10},
0511     {0x73,              0xfd,   0xff,   100},
0512     {-1,                -1, -1, -1},
0513 };
0514 
0515 /*
0516  * 2040:0265 Hauppauge WinTV-dualHD DVB Isoc
0517  * 2040:8265 Hauppauge WinTV-dualHD DVB Bulk
0518  * 2040:026d Hauppauge WinTV-dualHD ATSC/QAM Isoc
0519  * 2040:826d Hauppauge WinTV-dualHD ATSC/QAM Bulk
0520  * reg 0x80/0x84:
0521  * GPIO_0: Yellow LED tuner 1, 0=on, 1=off
0522  * GPIO_1: Green LED tuner 1, 0=on, 1=off
0523  * GPIO_2: Yellow LED tuner 2, 0=on, 1=off
0524  * GPIO_3: Green LED tuner 2, 0=on, 1=off
0525  * GPIO_5: Reset #2, 0=active
0526  * GPIO_6: Reset #1, 0=active
0527  */
0528 static const struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {
0529     {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
0530     {0x0d,                         0xff, 0xff,    200},
0531     {0x50,                         0x04, 0xff,    300},
0532     {EM2874_R80_GPIO_P0_CTRL,      0xbf, 0xff,    100}, /* demod 1 reset */
0533     {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
0534     {EM2874_R80_GPIO_P0_CTRL,      0xdf, 0xff,    100}, /* demod 2 reset */
0535     {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
0536     {EM2874_R5F_TS_ENABLE,         0x00, 0xff,     50}, /* disable TS filters */
0537     {EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
0538     {EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
0539     {-1,                             -1,   -1,     -1},
0540 };
0541 
0542 /* Hauppauge USB QuadHD */
0543 static struct em28xx_reg_seq hauppauge_usb_quadhd_atsc_reg_seq[] = {
0544     {EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
0545     {0x0d,                         0xff, 0xff,    200},
0546     {0x50,                         0x04, 0xff,    300},
0547     {EM2874_R80_GPIO_P0_CTRL,      0xb0, 0xf0,    100}, /* demod 1 reset */
0548     {EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},
0549     {EM2874_R80_GPIO_P0_CTRL,      0xd0, 0xf0,    100}, /* demod 2 reset */
0550     {EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},
0551     {EM2874_R5F_TS_ENABLE,         0x44, 0xff,     50},
0552     {EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
0553     {EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
0554     {-1,                           -1,   -1,       -1},
0555 };
0556 
0557 /*
0558  *  Button definitions
0559  */
0560 static const struct em28xx_button std_snapshot_button[] = {
0561     {
0562         .role         = EM28XX_BUTTON_SNAPSHOT,
0563         .reg_r        = EM28XX_R0C_USBSUSP,
0564         .reg_clearing = EM28XX_R0C_USBSUSP,
0565         .mask         = EM28XX_R0C_USBSUSP_SNAPSHOT,
0566         .inverted     = 0,
0567     },
0568     {-1, 0, 0, 0, 0},
0569 };
0570 
0571 static const struct em28xx_button speedlink_vad_laplace_buttons[] = {
0572     {
0573         .role     = EM28XX_BUTTON_SNAPSHOT,
0574         .reg_r    = EM2874_R85_GPIO_P1_STATE,
0575         .mask     = 0x80,
0576         .inverted = 1,
0577     },
0578     {
0579         .role     = EM28XX_BUTTON_ILLUMINATION,
0580         .reg_r    = EM2874_R84_GPIO_P0_STATE,
0581         .mask     = 0x08,
0582         .inverted = 1,
0583     },
0584     {-1, 0, 0, 0, 0},
0585 };
0586 
0587 /*
0588  *  LED definitions
0589  */
0590 static struct em28xx_led speedlink_vad_laplace_leds[] = {
0591     {
0592         .role      = EM28XX_LED_ANALOG_CAPTURING,
0593         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0594         .gpio_mask = 0x01,
0595         .inverted  = 1,
0596     },
0597     {
0598         .role      = EM28XX_LED_ILLUMINATION,
0599         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0600         .gpio_mask = 0x40,
0601         .inverted  = 1,
0602     },
0603     {-1, 0, 0, 0},
0604 };
0605 
0606 static struct em28xx_led kworld_ub435q_v3_leds[] = {
0607     {
0608         .role      = EM28XX_LED_DIGITAL_CAPTURING,
0609         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0610         .gpio_mask = 0x80,
0611         .inverted  = 1,
0612     },
0613     {-1, 0, 0, 0},
0614 };
0615 
0616 static struct em28xx_led pctv_80e_leds[] = {
0617     {
0618         .role      = EM28XX_LED_DIGITAL_CAPTURING,
0619         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0620         .gpio_mask = 0x80,
0621         .inverted  = 0,
0622     },
0623     {-1, 0, 0, 0},
0624 };
0625 
0626 static struct em28xx_led terratec_grabby_leds[] = {
0627     {
0628         .role      = EM28XX_LED_ANALOG_CAPTURING,
0629         .gpio_reg  = EM2820_R08_GPIO_CTRL,
0630         .gpio_mask = EM_GPIO_3,
0631         .inverted  = 1,
0632     },
0633     {-1, 0, 0, 0},
0634 };
0635 
0636 static struct em28xx_led hauppauge_dualhd_leds[] = {
0637     {
0638         .role      = EM28XX_LED_DIGITAL_CAPTURING,
0639         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0640         .gpio_mask = EM_GPIO_1,
0641         .inverted  = 1,
0642     },
0643     {
0644         .role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
0645         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0646         .gpio_mask = EM_GPIO_3,
0647         .inverted  = 1,
0648     },
0649     {-1, 0, 0, 0},
0650 };
0651 
0652 static struct em28xx_led hauppauge_usb_quadhd_leds[] = {
0653     {
0654         .role      = EM28XX_LED_DIGITAL_CAPTURING,
0655         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0656         .gpio_mask = EM_GPIO_2,
0657         .inverted  = 1,
0658     },
0659     {
0660         .role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
0661         .gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
0662         .gpio_mask = EM_GPIO_0,
0663         .inverted  = 1,
0664     },
0665     {-1, 0, 0, 0},
0666 };
0667 
0668 /*
0669  *  Board definitions
0670  */
0671 const struct em28xx_board em28xx_boards[] = {
0672     [EM2750_BOARD_UNKNOWN] = {
0673         .name          = "EM2710/EM2750/EM2751 webcam grabber",
0674         .xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,
0675         .tuner_type    = TUNER_ABSENT,
0676         .is_webcam     = 1,
0677         .input         = { {
0678             .type     = EM28XX_VMUX_COMPOSITE,
0679             .vmux     = 0,
0680             .amux     = EM28XX_AMUX_VIDEO,
0681             .gpio     = silvercrest_reg_seq,
0682         } },
0683     },
0684     [EM2800_BOARD_UNKNOWN] = {
0685         .name         = "Unknown EM2800 video grabber",
0686         .is_em2800    = 1,
0687         .tda9887_conf = TDA9887_PRESENT,
0688         .decoder      = EM28XX_SAA711X,
0689         .tuner_type   = TUNER_ABSENT,
0690         .input        = { {
0691             .type     = EM28XX_VMUX_COMPOSITE,
0692             .vmux     = SAA7115_COMPOSITE0,
0693             .amux     = EM28XX_AMUX_LINE_IN,
0694         }, {
0695             .type     = EM28XX_VMUX_SVIDEO,
0696             .vmux     = SAA7115_SVIDEO3,
0697             .amux     = EM28XX_AMUX_LINE_IN,
0698         } },
0699     },
0700     [EM2820_BOARD_UNKNOWN] = {
0701         .name          = "Unknown EM2750/28xx video grabber",
0702         .tuner_type    = TUNER_ABSENT,
0703         .is_webcam     = 1, /* To enable sensor probe */
0704     },
0705     [EM2882_BOARD_ZOLID_HYBRID_TV_STICK] = {
0706         .name           = ":ZOLID HYBRID TV STICK",
0707         .tuner_type     = TUNER_XC2028,
0708         .tuner_gpio     = zolid_tuner,
0709         .decoder        = EM28XX_TVP5150,
0710         .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ,
0711         .mts_firmware   = 1,
0712         .has_dvb        = 1,
0713         .dvb_gpio       = zolid_digital,
0714     },
0715     [EM2750_BOARD_DLCW_130] = {
0716         /* Beijing Huaqi Information Digital Technology Co., Ltd */
0717         .name          = "Huaqi DLCW-130",
0718         .valid         = EM28XX_BOARD_NOT_VALIDATED,
0719         .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
0720         .tuner_type    = TUNER_ABSENT,
0721         .is_webcam     = 1,
0722         .input         = { {
0723             .type     = EM28XX_VMUX_COMPOSITE,
0724             .vmux     = 0,
0725             .amux     = EM28XX_AMUX_VIDEO,
0726         } },
0727     },
0728     [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
0729         .name         = "Kworld PVR TV 2800 RF",
0730         .tuner_type   = TUNER_TEMIC_PAL,
0731         .tda9887_conf = TDA9887_PRESENT,
0732         .decoder      = EM28XX_SAA711X,
0733         .input        = { {
0734             .type     = EM28XX_VMUX_COMPOSITE,
0735             .vmux     = SAA7115_COMPOSITE0,
0736             .amux     = EM28XX_AMUX_LINE_IN,
0737         }, {
0738             .type     = EM28XX_VMUX_SVIDEO,
0739             .vmux     = SAA7115_SVIDEO3,
0740             .amux     = EM28XX_AMUX_LINE_IN,
0741         } },
0742     },
0743     [EM2820_BOARD_GADMEI_TVR200] = {
0744         .name         = "Gadmei TVR200",
0745         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
0746         .tda9887_conf = TDA9887_PRESENT,
0747         .decoder      = EM28XX_SAA711X,
0748         .input        = { {
0749             .type     = EM28XX_VMUX_TELEVISION,
0750             .vmux     = SAA7115_COMPOSITE2,
0751             .amux     = EM28XX_AMUX_LINE_IN,
0752         }, {
0753             .type     = EM28XX_VMUX_COMPOSITE,
0754             .vmux     = SAA7115_COMPOSITE0,
0755             .amux     = EM28XX_AMUX_LINE_IN,
0756         }, {
0757             .type     = EM28XX_VMUX_SVIDEO,
0758             .vmux     = SAA7115_SVIDEO3,
0759             .amux     = EM28XX_AMUX_LINE_IN,
0760         } },
0761     },
0762     [EM2820_BOARD_TERRATEC_CINERGY_250] = {
0763         .name         = "Terratec Cinergy 250 USB",
0764         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
0765         .has_ir_i2c   = 1,
0766         .tda9887_conf = TDA9887_PRESENT,
0767         .decoder      = EM28XX_SAA711X,
0768         .input        = { {
0769             .type     = EM28XX_VMUX_TELEVISION,
0770             .vmux     = SAA7115_COMPOSITE2,
0771             .amux     = EM28XX_AMUX_VIDEO,
0772         }, {
0773             .type     = EM28XX_VMUX_COMPOSITE,
0774             .vmux     = SAA7115_COMPOSITE0,
0775             .amux     = EM28XX_AMUX_LINE_IN,
0776         }, {
0777             .type     = EM28XX_VMUX_SVIDEO,
0778             .vmux     = SAA7115_SVIDEO3,
0779             .amux     = EM28XX_AMUX_LINE_IN,
0780         } },
0781     },
0782     [EM2820_BOARD_PINNACLE_USB_2] = {
0783         .name         = "Pinnacle PCTV USB 2",
0784         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
0785         .has_ir_i2c   = 1,
0786         .tda9887_conf = TDA9887_PRESENT,
0787         .decoder      = EM28XX_SAA711X,
0788         .input        = { {
0789             .type     = EM28XX_VMUX_TELEVISION,
0790             .vmux     = SAA7115_COMPOSITE2,
0791             .amux     = EM28XX_AMUX_VIDEO,
0792         }, {
0793             .type     = EM28XX_VMUX_COMPOSITE,
0794             .vmux     = SAA7115_COMPOSITE0,
0795             .amux     = EM28XX_AMUX_LINE_IN,
0796         }, {
0797             .type     = EM28XX_VMUX_SVIDEO,
0798             .vmux     = SAA7115_SVIDEO3,
0799             .amux     = EM28XX_AMUX_LINE_IN,
0800         } },
0801     },
0802     [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
0803         .name         = "Hauppauge WinTV USB 2",
0804         .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
0805         .tda9887_conf = TDA9887_PRESENT |
0806                 TDA9887_PORT1_ACTIVE |
0807                 TDA9887_PORT2_ACTIVE,
0808         .decoder      = EM28XX_TVP5150,
0809         .has_msp34xx  = 1,
0810         .has_ir_i2c   = 1,
0811         .input        = { {
0812             .type     = EM28XX_VMUX_TELEVISION,
0813             .vmux     = TVP5150_COMPOSITE0,
0814             .amux     = MSP_INPUT_DEFAULT,
0815         }, {
0816             .type     = EM28XX_VMUX_SVIDEO,
0817             .vmux     = TVP5150_SVIDEO,
0818             .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
0819                     MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
0820         } },
0821     },
0822     [EM2820_BOARD_DLINK_USB_TV] = {
0823         .name         = "D-Link DUB-T210 TV Tuner",
0824         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0825         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
0826         .tda9887_conf = TDA9887_PRESENT,
0827         .decoder      = EM28XX_SAA711X,
0828         .input        = { {
0829             .type     = EM28XX_VMUX_TELEVISION,
0830             .vmux     = SAA7115_COMPOSITE2,
0831             .amux     = EM28XX_AMUX_LINE_IN,
0832         }, {
0833             .type     = EM28XX_VMUX_COMPOSITE,
0834             .vmux     = SAA7115_COMPOSITE0,
0835             .amux     = EM28XX_AMUX_LINE_IN,
0836         }, {
0837             .type     = EM28XX_VMUX_SVIDEO,
0838             .vmux     = SAA7115_SVIDEO3,
0839             .amux     = EM28XX_AMUX_LINE_IN,
0840         } },
0841     },
0842     [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
0843         .name         = "Hercules Smart TV USB 2.0",
0844         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0845         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
0846         .tda9887_conf = TDA9887_PRESENT,
0847         .decoder      = EM28XX_SAA711X,
0848         .input        = { {
0849             .type     = EM28XX_VMUX_TELEVISION,
0850             .vmux     = SAA7115_COMPOSITE2,
0851             .amux     = EM28XX_AMUX_LINE_IN,
0852         }, {
0853             .type     = EM28XX_VMUX_COMPOSITE,
0854             .vmux     = SAA7115_COMPOSITE0,
0855             .amux     = EM28XX_AMUX_LINE_IN,
0856         }, {
0857             .type     = EM28XX_VMUX_SVIDEO,
0858             .vmux     = SAA7115_SVIDEO3,
0859             .amux     = EM28XX_AMUX_LINE_IN,
0860         } },
0861     },
0862     [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
0863         .name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
0864         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0865         .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
0866         .tda9887_conf = TDA9887_PRESENT,
0867         .decoder      = EM28XX_SAA711X,
0868         .input        = { {
0869             .type     = EM28XX_VMUX_TELEVISION,
0870             .vmux     = SAA7115_COMPOSITE2,
0871             .amux     = EM28XX_AMUX_VIDEO,
0872         }, {
0873             .type     = EM28XX_VMUX_COMPOSITE,
0874             .vmux     = SAA7115_COMPOSITE0,
0875             .amux     = EM28XX_AMUX_LINE_IN,
0876         }, {
0877             .type     = EM28XX_VMUX_SVIDEO,
0878             .vmux     = SAA7115_SVIDEO3,
0879             .amux     = EM28XX_AMUX_LINE_IN,
0880         } },
0881     },
0882     [EM2820_BOARD_GADMEI_UTV310] = {
0883         .name         = "Gadmei UTV310",
0884         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0885         .tuner_type   = TUNER_TNF_5335MF,
0886         .tda9887_conf = TDA9887_PRESENT,
0887         .decoder      = EM28XX_SAA711X,
0888         .input        = { {
0889             .type     = EM28XX_VMUX_TELEVISION,
0890             .vmux     = SAA7115_COMPOSITE1,
0891             .amux     = EM28XX_AMUX_LINE_IN,
0892         }, {
0893             .type     = EM28XX_VMUX_COMPOSITE,
0894             .vmux     = SAA7115_COMPOSITE0,
0895             .amux     = EM28XX_AMUX_LINE_IN,
0896         }, {
0897             .type     = EM28XX_VMUX_SVIDEO,
0898             .vmux     = SAA7115_SVIDEO3,
0899             .amux     = EM28XX_AMUX_LINE_IN,
0900         } },
0901     },
0902     [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
0903         .name         = "Leadtek Winfast USB II Deluxe",
0904         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0905         .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
0906         .has_ir_i2c   = 1,
0907         .tvaudio_addr = 0x58,
0908         .tda9887_conf = TDA9887_PRESENT |
0909                 TDA9887_PORT2_ACTIVE |
0910                 TDA9887_QSS,
0911         .decoder      = EM28XX_SAA711X,
0912         .adecoder     = EM28XX_TVAUDIO,
0913         .input        = { {
0914             .type     = EM28XX_VMUX_TELEVISION,
0915             .vmux     = SAA7115_COMPOSITE4,
0916             .amux     = EM28XX_AMUX_AUX,
0917         }, {
0918             .type     = EM28XX_VMUX_COMPOSITE,
0919             .vmux     = SAA7115_COMPOSITE5,
0920             .amux     = EM28XX_AMUX_LINE_IN,
0921         }, {
0922             .type     = EM28XX_VMUX_SVIDEO,
0923             .vmux     = SAA7115_SVIDEO3,
0924             .amux     = EM28XX_AMUX_LINE_IN,
0925         } },
0926             .radio    = {
0927             .type     = EM28XX_RADIO,
0928             .amux     = EM28XX_AMUX_AUX,
0929             }
0930     },
0931     [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
0932         .name         = "Videology 20K14XUSB USB2.0",
0933         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0934         .tuner_type   = TUNER_ABSENT,
0935         .is_webcam    = 1,
0936         .input        = { {
0937             .type     = EM28XX_VMUX_COMPOSITE,
0938             .vmux     = 0,
0939             .amux     = EM28XX_AMUX_VIDEO,
0940         } },
0941     },
0942     [EM2820_BOARD_SILVERCREST_WEBCAM] = {
0943         .name         = "Silvercrest Webcam 1.3mpix",
0944         .tuner_type   = TUNER_ABSENT,
0945         .is_webcam    = 1,
0946         .input        = { {
0947             .type     = EM28XX_VMUX_COMPOSITE,
0948             .vmux     = 0,
0949             .amux     = EM28XX_AMUX_VIDEO,
0950             .gpio     = silvercrest_reg_seq,
0951         } },
0952     },
0953     [EM2821_BOARD_SUPERCOMP_USB_2] = {
0954         .name         = "Supercomp USB 2.0 TV",
0955         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0956         .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
0957         .tda9887_conf = TDA9887_PRESENT |
0958                 TDA9887_PORT1_ACTIVE |
0959                 TDA9887_PORT2_ACTIVE,
0960         .decoder      = EM28XX_SAA711X,
0961         .input        = { {
0962             .type     = EM28XX_VMUX_TELEVISION,
0963             .vmux     = SAA7115_COMPOSITE2,
0964             .amux     = EM28XX_AMUX_LINE_IN,
0965         }, {
0966             .type     = EM28XX_VMUX_COMPOSITE,
0967             .vmux     = SAA7115_COMPOSITE0,
0968             .amux     = EM28XX_AMUX_VIDEO,
0969         }, {
0970             .type     = EM28XX_VMUX_SVIDEO,
0971             .vmux     = SAA7115_SVIDEO3,
0972             .amux     = EM28XX_AMUX_LINE_IN,
0973         } },
0974     },
0975     [EM2821_BOARD_USBGEAR_VD204] = {
0976         .name         = "Usbgear VD204v9",
0977         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0978         .tuner_type   = TUNER_ABSENT,   /* Capture only device */
0979         .decoder      = EM28XX_SAA711X,
0980         .input        = { {
0981             .type  = EM28XX_VMUX_COMPOSITE,
0982             .vmux  = SAA7115_COMPOSITE0,
0983             .amux  = EM28XX_AMUX_LINE_IN,
0984         }, {
0985             .type  = EM28XX_VMUX_SVIDEO,
0986             .vmux  = SAA7115_SVIDEO3,
0987             .amux  = EM28XX_AMUX_LINE_IN,
0988         } },
0989     },
0990     [EM2860_BOARD_NETGMBH_CAM] = {
0991         /* Beijing Huaqi Information Digital Technology Co., Ltd */
0992         .name         = "NetGMBH Cam",
0993         .valid        = EM28XX_BOARD_NOT_VALIDATED,
0994         .tuner_type   = TUNER_ABSENT,
0995         .is_webcam    = 1,
0996         .input        = { {
0997             .type     = EM28XX_VMUX_COMPOSITE,
0998             .vmux     = 0,
0999             .amux     = EM28XX_AMUX_VIDEO,
1000         } },
1001     },
1002     [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
1003         .name         = "Typhoon DVD Maker",
1004         .decoder      = EM28XX_SAA711X,
1005         .tuner_type   = TUNER_ABSENT,   /* Capture only device */
1006         .input        = { {
1007             .type  = EM28XX_VMUX_COMPOSITE,
1008             .vmux  = SAA7115_COMPOSITE0,
1009             .amux  = EM28XX_AMUX_LINE_IN,
1010         }, {
1011             .type  = EM28XX_VMUX_SVIDEO,
1012             .vmux  = SAA7115_SVIDEO3,
1013             .amux  = EM28XX_AMUX_LINE_IN,
1014         } },
1015     },
1016     [EM2860_BOARD_GADMEI_UTV330] = {
1017         .name         = "Gadmei UTV330",
1018         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1019         .tuner_type   = TUNER_TNF_5335MF,
1020         .tda9887_conf = TDA9887_PRESENT,
1021         .decoder      = EM28XX_SAA711X,
1022         .input        = { {
1023             .type     = EM28XX_VMUX_TELEVISION,
1024             .vmux     = SAA7115_COMPOSITE2,
1025             .amux     = EM28XX_AMUX_VIDEO,
1026         }, {
1027             .type     = EM28XX_VMUX_COMPOSITE,
1028             .vmux     = SAA7115_COMPOSITE0,
1029             .amux     = EM28XX_AMUX_LINE_IN,
1030         }, {
1031             .type     = EM28XX_VMUX_SVIDEO,
1032             .vmux     = SAA7115_SVIDEO3,
1033             .amux     = EM28XX_AMUX_LINE_IN,
1034         } },
1035     },
1036     [EM2861_BOARD_GADMEI_UTV330PLUS] = {
1037         .name         = "Gadmei UTV330+",
1038         .tuner_type   = TUNER_TNF_5335MF,
1039         .tda9887_conf = TDA9887_PRESENT,
1040         .ir_codes     = RC_MAP_GADMEI_RM008Z,
1041         .decoder      = EM28XX_SAA711X,
1042         .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
1043         .input        = { {
1044             .type     = EM28XX_VMUX_TELEVISION,
1045             .vmux     = SAA7115_COMPOSITE2,
1046             .amux     = EM28XX_AMUX_VIDEO,
1047         }, {
1048             .type     = EM28XX_VMUX_COMPOSITE,
1049             .vmux     = SAA7115_COMPOSITE0,
1050             .amux     = EM28XX_AMUX_LINE_IN,
1051         }, {
1052             .type     = EM28XX_VMUX_SVIDEO,
1053             .vmux     = SAA7115_SVIDEO3,
1054             .amux     = EM28XX_AMUX_LINE_IN,
1055         } },
1056     },
1057     [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
1058         .name         = "Terratec Cinergy A Hybrid XS",
1059         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1060         .tuner_type   = TUNER_XC2028,
1061         .tuner_gpio   = default_tuner_gpio,
1062         .decoder      = EM28XX_TVP5150,
1063 
1064         .input        = { {
1065             .type     = EM28XX_VMUX_TELEVISION,
1066             .vmux     = TVP5150_COMPOSITE0,
1067             .amux     = EM28XX_AMUX_VIDEO,
1068             .gpio     = hauppauge_wintv_hvr_900_analog,
1069         }, {
1070             .type     = EM28XX_VMUX_COMPOSITE,
1071             .vmux     = TVP5150_COMPOSITE1,
1072             .amux     = EM28XX_AMUX_LINE_IN,
1073             .gpio     = hauppauge_wintv_hvr_900_analog,
1074         }, {
1075             .type     = EM28XX_VMUX_SVIDEO,
1076             .vmux     = TVP5150_SVIDEO,
1077             .amux     = EM28XX_AMUX_LINE_IN,
1078             .gpio     = hauppauge_wintv_hvr_900_analog,
1079         } },
1080     },
1081     [EM2861_BOARD_KWORLD_PVRTV_300U] = {
1082         .name         = "KWorld PVRTV 300U",
1083         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1084         .tuner_type   = TUNER_XC2028,
1085         .tuner_gpio   = default_tuner_gpio,
1086         .decoder      = EM28XX_TVP5150,
1087         .input        = { {
1088             .type     = EM28XX_VMUX_TELEVISION,
1089             .vmux     = TVP5150_COMPOSITE0,
1090             .amux     = EM28XX_AMUX_VIDEO,
1091         }, {
1092             .type     = EM28XX_VMUX_COMPOSITE,
1093             .vmux     = TVP5150_COMPOSITE1,
1094             .amux     = EM28XX_AMUX_LINE_IN,
1095         }, {
1096             .type     = EM28XX_VMUX_SVIDEO,
1097             .vmux     = TVP5150_SVIDEO,
1098             .amux     = EM28XX_AMUX_LINE_IN,
1099         } },
1100     },
1101     [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
1102         .name          = "Yakumo MovieMixer",
1103         .tuner_type    = TUNER_ABSENT,  /* Capture only device */
1104         .decoder       = EM28XX_TVP5150,
1105         .input         = { {
1106             .type     = EM28XX_VMUX_TELEVISION,
1107             .vmux     = TVP5150_COMPOSITE0,
1108             .amux     = EM28XX_AMUX_VIDEO,
1109         }, {
1110             .type     = EM28XX_VMUX_COMPOSITE,
1111             .vmux     = TVP5150_COMPOSITE1,
1112             .amux     = EM28XX_AMUX_LINE_IN,
1113         }, {
1114             .type     = EM28XX_VMUX_SVIDEO,
1115             .vmux     = TVP5150_SVIDEO,
1116             .amux     = EM28XX_AMUX_LINE_IN,
1117         } },
1118     },
1119     [EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
1120         .name          = "EM2860/TVP5150 Reference Design",
1121         .tuner_type    = TUNER_ABSENT,  /* Capture only device */
1122         .decoder       = EM28XX_TVP5150,
1123         .input         = { {
1124             .type     = EM28XX_VMUX_COMPOSITE,
1125             .vmux     = TVP5150_COMPOSITE1,
1126             .amux     = EM28XX_AMUX_LINE_IN,
1127         }, {
1128             .type     = EM28XX_VMUX_SVIDEO,
1129             .vmux     = TVP5150_SVIDEO,
1130             .amux     = EM28XX_AMUX_LINE_IN,
1131         } },
1132     },
1133     [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
1134         .name         = "Plextor ConvertX PX-TV100U",
1135         .tuner_type   = TUNER_TNF_5335MF,
1136         .xclk         = EM28XX_XCLK_I2S_MSB_TIMING |
1137                 EM28XX_XCLK_FREQUENCY_12MHZ,
1138         .tda9887_conf = TDA9887_PRESENT,
1139         .decoder      = EM28XX_TVP5150,
1140         .has_msp34xx  = 1,
1141         .input        = { {
1142             .type     = EM28XX_VMUX_TELEVISION,
1143             .vmux     = TVP5150_COMPOSITE0,
1144             .amux     = EM28XX_AMUX_LINE_IN,
1145             .gpio     = pinnacle_hybrid_pro_analog,
1146         }, {
1147             .type     = EM28XX_VMUX_COMPOSITE,
1148             .vmux     = TVP5150_COMPOSITE1,
1149             .amux     = EM28XX_AMUX_LINE_IN,
1150             .gpio     = pinnacle_hybrid_pro_analog,
1151         }, {
1152             .type     = EM28XX_VMUX_SVIDEO,
1153             .vmux     = TVP5150_SVIDEO,
1154             .amux     = EM28XX_AMUX_LINE_IN,
1155             .gpio     = pinnacle_hybrid_pro_analog,
1156         } },
1157     },
1158 
1159     /* Those boards with em2870 are DVB Only*/
1160 
1161     [EM2870_BOARD_TERRATEC_XS] = {
1162         .name         = "Terratec Cinergy T XS",
1163         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1164         .tuner_type   = TUNER_XC2028,
1165         .tuner_gpio   = default_tuner_gpio,
1166     },
1167     [EM2870_BOARD_TERRATEC_XS_MT2060] = {
1168         .name         = "Terratec Cinergy T XS (MT2060)",
1169         .xclk         = EM28XX_XCLK_IR_RC5_MODE |
1170                 EM28XX_XCLK_FREQUENCY_12MHZ,
1171         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
1172         .tuner_type   = TUNER_ABSENT, /* MT2060 */
1173         .has_dvb      = 1,
1174         .tuner_gpio   = default_tuner_gpio,
1175     },
1176     [EM2870_BOARD_KWORLD_350U] = {
1177         .name         = "Kworld 350 U DVB-T",
1178         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1179         .tuner_type   = TUNER_XC2028,
1180         .tuner_gpio   = default_tuner_gpio,
1181     },
1182     [EM2870_BOARD_KWORLD_355U] = {
1183         .name         = "Kworld 355 U DVB-T",
1184         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1185         .tuner_type   = TUNER_ABSENT,
1186         .tuner_gpio   = default_tuner_gpio,
1187         .has_dvb      = 1,
1188         .dvb_gpio     = default_digital,
1189     },
1190     [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
1191         .name         = "Pinnacle PCTV DVB-T",
1192         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1193         .tuner_type   = TUNER_ABSENT, /* MT2060 */
1194         /* djh - I have serious doubts this is right... */
1195         .xclk         = EM28XX_XCLK_IR_RC5_MODE |
1196                 EM28XX_XCLK_FREQUENCY_10MHZ,
1197     },
1198     [EM2870_BOARD_COMPRO_VIDEOMATE] = {
1199         .name         = "Compro, VideoMate U3",
1200         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1201         .tuner_type   = TUNER_ABSENT, /* MT2060 */
1202     },
1203 
1204     [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
1205         .name         = "Terratec Hybrid XS Secam",
1206         .has_msp34xx  = 1,
1207         .tuner_type   = TUNER_XC2028,
1208         .tuner_gpio   = default_tuner_gpio,
1209         .decoder      = EM28XX_TVP5150,
1210         .has_dvb      = 1,
1211         .dvb_gpio     = terratec_cinergy_USB_XS_FR_digital,
1212         .input        = { {
1213             .type     = EM28XX_VMUX_TELEVISION,
1214             .vmux     = TVP5150_COMPOSITE0,
1215             .amux     = EM28XX_AMUX_VIDEO,
1216             .gpio     = terratec_cinergy_USB_XS_FR_analog,
1217         }, {
1218             .type     = EM28XX_VMUX_COMPOSITE,
1219             .vmux     = TVP5150_COMPOSITE1,
1220             .amux     = EM28XX_AMUX_LINE_IN,
1221             .gpio     = terratec_cinergy_USB_XS_FR_analog,
1222         }, {
1223             .type     = EM28XX_VMUX_SVIDEO,
1224             .vmux     = TVP5150_SVIDEO,
1225             .amux     = EM28XX_AMUX_LINE_IN,
1226             .gpio     = terratec_cinergy_USB_XS_FR_analog,
1227         } },
1228     },
1229     [EM2884_BOARD_TERRATEC_H5] = {
1230         .name         = "Terratec Cinergy H5",
1231         .has_dvb      = 1,
1232 #if 0
1233         .tuner_type   = TUNER_PHILIPS_TDA8290,
1234         .tuner_addr   = 0x41,
1235         .dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
1236         .tuner_gpio   = terratec_h5_gpio,
1237 #else
1238         .tuner_type   = TUNER_ABSENT,
1239 #endif
1240         .def_i2c_bus  = 1,
1241         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1242                 EM28XX_I2C_FREQ_400_KHZ,
1243     },
1244     [EM2884_BOARD_TERRATEC_H6] = {
1245         .name         = "Terratec Cinergy H6 rev. 2",
1246         .has_dvb      = 1,
1247         .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1248 #if 0
1249         .tuner_type   = TUNER_PHILIPS_TDA8290,
1250         .tuner_addr   = 0x41,
1251         .dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
1252         .tuner_gpio   = terratec_h5_gpio,
1253 #else
1254         .tuner_type   = TUNER_ABSENT,
1255 #endif
1256         .def_i2c_bus  = 1,
1257         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1258                 EM28XX_I2C_FREQ_400_KHZ,
1259     },
1260     [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
1261         .name         = "Hauppauge WinTV HVR 930C",
1262         .has_dvb      = 1,
1263 #if 0 /* FIXME: Add analog support */
1264         .tuner_type   = TUNER_XC5000,
1265         .tuner_addr   = 0x41,
1266         .dvb_gpio     = hauppauge_930c_digital,
1267         .tuner_gpio   = hauppauge_930c_gpio,
1268 #else
1269         .tuner_type   = TUNER_ABSENT,
1270 #endif
1271         .ir_codes     = RC_MAP_HAUPPAUGE,
1272         .def_i2c_bus  = 1,
1273         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1274                 EM28XX_I2C_FREQ_400_KHZ,
1275     },
1276     [EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
1277         .name         = "C3 Tech Digital Duo HDTV/SDTV USB",
1278         .has_dvb      = 1,
1279         /* FIXME: Add analog support - need a saa7136 driver */
1280         .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
1281         .ir_codes     = RC_MAP_EMPTY,
1282         .def_i2c_bus  = 1,
1283         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
1284         .dvb_gpio     = c3tech_digital_duo_digital,
1285     },
1286     [EM2884_BOARD_CINERGY_HTC_STICK] = {
1287         .name         = "Terratec Cinergy HTC Stick",
1288         .has_dvb      = 1,
1289         .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1290         .tuner_type   = TUNER_ABSENT,
1291         .def_i2c_bus  = 1,
1292         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1293                 EM28XX_I2C_FREQ_400_KHZ,
1294     },
1295     [EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {
1296         .name         = "Elgato EyeTV Hybrid 2008 INT",
1297         .has_dvb      = 1,
1298         .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1299         .tuner_type   = TUNER_ABSENT,
1300         .def_i2c_bus  = 1,
1301         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1302                 EM28XX_I2C_FREQ_400_KHZ,
1303     },
1304     [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
1305         .name         = "Hauppauge WinTV HVR 900",
1306         .tda9887_conf = TDA9887_PRESENT,
1307         .tuner_type   = TUNER_XC2028,
1308         .tuner_gpio   = default_tuner_gpio,
1309         .mts_firmware = 1,
1310         .has_dvb      = 1,
1311         .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1312         .ir_codes     = RC_MAP_HAUPPAUGE,
1313         .decoder      = EM28XX_TVP5150,
1314         .input        = { {
1315             .type     = EM28XX_VMUX_TELEVISION,
1316             .vmux     = TVP5150_COMPOSITE0,
1317             .amux     = EM28XX_AMUX_VIDEO,
1318             .gpio     = hauppauge_wintv_hvr_900_analog,
1319         }, {
1320             .type     = EM28XX_VMUX_COMPOSITE,
1321             .vmux     = TVP5150_COMPOSITE1,
1322             .amux     = EM28XX_AMUX_LINE_IN,
1323             .gpio     = hauppauge_wintv_hvr_900_analog,
1324         }, {
1325             .type     = EM28XX_VMUX_SVIDEO,
1326             .vmux     = TVP5150_SVIDEO,
1327             .amux     = EM28XX_AMUX_LINE_IN,
1328             .gpio     = hauppauge_wintv_hvr_900_analog,
1329         } },
1330     },
1331     [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
1332         .name         = "Hauppauge WinTV HVR 900 (R2)",
1333         .tda9887_conf = TDA9887_PRESENT,
1334         .tuner_type   = TUNER_XC2028,
1335         .tuner_gpio   = default_tuner_gpio,
1336         .mts_firmware = 1,
1337         .has_dvb      = 1,
1338         .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1339         .ir_codes     = RC_MAP_HAUPPAUGE,
1340         .decoder      = EM28XX_TVP5150,
1341         .input        = { {
1342             .type     = EM28XX_VMUX_TELEVISION,
1343             .vmux     = TVP5150_COMPOSITE0,
1344             .amux     = EM28XX_AMUX_VIDEO,
1345             .gpio     = hauppauge_wintv_hvr_900_analog,
1346         }, {
1347             .type     = EM28XX_VMUX_COMPOSITE,
1348             .vmux     = TVP5150_COMPOSITE1,
1349             .amux     = EM28XX_AMUX_LINE_IN,
1350             .gpio     = hauppauge_wintv_hvr_900_analog,
1351         }, {
1352             .type     = EM28XX_VMUX_SVIDEO,
1353             .vmux     = TVP5150_SVIDEO,
1354             .amux     = EM28XX_AMUX_LINE_IN,
1355             .gpio     = hauppauge_wintv_hvr_900_analog,
1356         } },
1357     },
1358     [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
1359         .name           = "Hauppauge WinTV HVR 850",
1360         .tuner_type     = TUNER_XC2028,
1361         .tuner_gpio     = default_tuner_gpio,
1362         .mts_firmware   = 1,
1363         .has_dvb        = 1,
1364         .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1365         .ir_codes       = RC_MAP_HAUPPAUGE,
1366         .decoder        = EM28XX_TVP5150,
1367         .input          = { {
1368             .type     = EM28XX_VMUX_TELEVISION,
1369             .vmux     = TVP5150_COMPOSITE0,
1370             .amux     = EM28XX_AMUX_VIDEO,
1371             .gpio     = hauppauge_wintv_hvr_900_analog,
1372         }, {
1373             .type     = EM28XX_VMUX_COMPOSITE,
1374             .vmux     = TVP5150_COMPOSITE1,
1375             .amux     = EM28XX_AMUX_LINE_IN,
1376             .gpio     = hauppauge_wintv_hvr_900_analog,
1377         }, {
1378             .type     = EM28XX_VMUX_SVIDEO,
1379             .vmux     = TVP5150_SVIDEO,
1380             .amux     = EM28XX_AMUX_LINE_IN,
1381             .gpio     = hauppauge_wintv_hvr_900_analog,
1382         } },
1383     },
1384     [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
1385         .name           = "Hauppauge WinTV HVR 950",
1386         .tuner_type     = TUNER_XC2028,
1387         .tuner_gpio     = default_tuner_gpio,
1388         .mts_firmware   = 1,
1389         .has_dvb        = 1,
1390         .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1391         .ir_codes       = RC_MAP_HAUPPAUGE,
1392         .decoder        = EM28XX_TVP5150,
1393         .input          = { {
1394             .type     = EM28XX_VMUX_TELEVISION,
1395             .vmux     = TVP5150_COMPOSITE0,
1396             .amux     = EM28XX_AMUX_VIDEO,
1397             .gpio     = hauppauge_wintv_hvr_900_analog,
1398         }, {
1399             .type     = EM28XX_VMUX_COMPOSITE,
1400             .vmux     = TVP5150_COMPOSITE1,
1401             .amux     = EM28XX_AMUX_LINE_IN,
1402             .gpio     = hauppauge_wintv_hvr_900_analog,
1403         }, {
1404             .type     = EM28XX_VMUX_SVIDEO,
1405             .vmux     = TVP5150_SVIDEO,
1406             .amux     = EM28XX_AMUX_LINE_IN,
1407             .gpio     = hauppauge_wintv_hvr_900_analog,
1408         } },
1409     },
1410     [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
1411         .name           = "Pinnacle PCTV HD Pro Stick",
1412         .tuner_type     = TUNER_XC2028,
1413         .tuner_gpio   = default_tuner_gpio,
1414         .mts_firmware   = 1,
1415         .has_dvb        = 1,
1416         .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1417         .ir_codes       = RC_MAP_PINNACLE_PCTV_HD,
1418         .decoder        = EM28XX_TVP5150,
1419         .input          = { {
1420             .type     = EM28XX_VMUX_TELEVISION,
1421             .vmux     = TVP5150_COMPOSITE0,
1422             .amux     = EM28XX_AMUX_VIDEO,
1423             .gpio     = hauppauge_wintv_hvr_900_analog,
1424         }, {
1425             .type     = EM28XX_VMUX_COMPOSITE,
1426             .vmux     = TVP5150_COMPOSITE1,
1427             .amux     = EM28XX_AMUX_LINE_IN,
1428             .gpio     = hauppauge_wintv_hvr_900_analog,
1429         }, {
1430             .type     = EM28XX_VMUX_SVIDEO,
1431             .vmux     = TVP5150_SVIDEO,
1432             .amux     = EM28XX_AMUX_LINE_IN,
1433             .gpio     = hauppauge_wintv_hvr_900_analog,
1434         } },
1435     },
1436     [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
1437         .name           = "AMD ATI TV Wonder HD 600",
1438         .tuner_type     = TUNER_XC2028,
1439         .tuner_gpio     = default_tuner_gpio,
1440         .mts_firmware   = 1,
1441         .has_dvb        = 1,
1442         .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1443         .ir_codes       = RC_MAP_ATI_TV_WONDER_HD_600,
1444         .decoder        = EM28XX_TVP5150,
1445         .input          = { {
1446             .type     = EM28XX_VMUX_TELEVISION,
1447             .vmux     = TVP5150_COMPOSITE0,
1448             .amux     = EM28XX_AMUX_VIDEO,
1449             .gpio     = hauppauge_wintv_hvr_900_analog,
1450         }, {
1451             .type     = EM28XX_VMUX_COMPOSITE,
1452             .vmux     = TVP5150_COMPOSITE1,
1453             .amux     = EM28XX_AMUX_LINE_IN,
1454             .gpio     = hauppauge_wintv_hvr_900_analog,
1455         }, {
1456             .type     = EM28XX_VMUX_SVIDEO,
1457             .vmux     = TVP5150_SVIDEO,
1458             .amux     = EM28XX_AMUX_LINE_IN,
1459             .gpio     = hauppauge_wintv_hvr_900_analog,
1460         } },
1461     },
1462     [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
1463         .name           = "Terratec Hybrid XS",
1464         .tuner_type     = TUNER_XC2028,
1465         .tuner_gpio     = default_tuner_gpio,
1466         .decoder        = EM28XX_TVP5150,
1467         .has_dvb        = 1,
1468         .dvb_gpio       = default_digital,
1469         .ir_codes       = RC_MAP_TERRATEC_CINERGY_XS,
1470         .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1471         .input          = { {
1472             .type     = EM28XX_VMUX_TELEVISION,
1473             .vmux     = TVP5150_COMPOSITE0,
1474             .amux     = EM28XX_AMUX_VIDEO,
1475             .gpio     = default_analog,
1476         }, {
1477             .type     = EM28XX_VMUX_COMPOSITE,
1478             .vmux     = TVP5150_COMPOSITE1,
1479             .amux     = EM28XX_AMUX_LINE_IN,
1480             .gpio     = default_analog,
1481         }, {
1482             .type     = EM28XX_VMUX_SVIDEO,
1483             .vmux     = TVP5150_SVIDEO,
1484             .amux     = EM28XX_AMUX_LINE_IN,
1485             .gpio     = default_analog,
1486         } },
1487     },
1488     /*
1489      * maybe there's a reason behind it why Terratec sells the Hybrid XS
1490      * as Prodigy XS with a different PID, let's keep it separated for now
1491      * maybe we'll need it later on
1492      */
1493     [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
1494         .name         = "Terratec Prodigy XS",
1495         .tuner_type   = TUNER_XC2028,
1496         .tuner_gpio   = default_tuner_gpio,
1497         .decoder      = EM28XX_TVP5150,
1498         .input        = { {
1499             .type     = EM28XX_VMUX_TELEVISION,
1500             .vmux     = TVP5150_COMPOSITE0,
1501             .amux     = EM28XX_AMUX_VIDEO,
1502             .gpio     = hauppauge_wintv_hvr_900_analog,
1503         }, {
1504             .type     = EM28XX_VMUX_COMPOSITE,
1505             .vmux     = TVP5150_COMPOSITE1,
1506             .amux     = EM28XX_AMUX_LINE_IN,
1507             .gpio     = hauppauge_wintv_hvr_900_analog,
1508         }, {
1509             .type     = EM28XX_VMUX_SVIDEO,
1510             .vmux     = TVP5150_SVIDEO,
1511             .amux     = EM28XX_AMUX_LINE_IN,
1512             .gpio     = hauppauge_wintv_hvr_900_analog,
1513         } },
1514     },
1515     [EM2820_BOARD_MSI_VOX_USB_2] = {
1516         .name          = "MSI VOX USB 2.0",
1517         .tuner_type    = TUNER_LG_PAL_NEW_TAPC,
1518         .tda9887_conf      = TDA9887_PRESENT      |
1519                      TDA9887_PORT1_ACTIVE |
1520                      TDA9887_PORT2_ACTIVE,
1521         .max_range_640_480 = 1,
1522         .decoder           = EM28XX_SAA711X,
1523         .input             = { {
1524             .type      = EM28XX_VMUX_TELEVISION,
1525             .vmux      = SAA7115_COMPOSITE4,
1526             .amux      = EM28XX_AMUX_VIDEO,
1527         }, {
1528             .type      = EM28XX_VMUX_COMPOSITE,
1529             .vmux      = SAA7115_COMPOSITE0,
1530             .amux      = EM28XX_AMUX_LINE_IN,
1531         }, {
1532             .type      = EM28XX_VMUX_SVIDEO,
1533             .vmux      = SAA7115_SVIDEO3,
1534             .amux      = EM28XX_AMUX_LINE_IN,
1535         } },
1536     },
1537     [EM2800_BOARD_TERRATEC_CINERGY_200] = {
1538         .name         = "Terratec Cinergy 200 USB",
1539         .is_em2800    = 1,
1540         .has_ir_i2c   = 1,
1541         .tuner_type   = TUNER_LG_TALN,
1542         .tda9887_conf = TDA9887_PRESENT,
1543         .decoder      = EM28XX_SAA711X,
1544         .input        = { {
1545             .type     = EM28XX_VMUX_TELEVISION,
1546             .vmux     = SAA7115_COMPOSITE2,
1547             .amux     = EM28XX_AMUX_VIDEO,
1548         }, {
1549             .type     = EM28XX_VMUX_COMPOSITE,
1550             .vmux     = SAA7115_COMPOSITE0,
1551             .amux     = EM28XX_AMUX_LINE_IN,
1552         }, {
1553             .type     = EM28XX_VMUX_SVIDEO,
1554             .vmux     = SAA7115_SVIDEO3,
1555             .amux     = EM28XX_AMUX_LINE_IN,
1556         } },
1557     },
1558     [EM2800_BOARD_GRABBEEX_USB2800] = {
1559         .name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
1560         .is_em2800  = 1,
1561         .decoder    = EM28XX_SAA711X,
1562         .tuner_type = TUNER_ABSENT, /* capture only board */
1563         .input      = { {
1564             .type     = EM28XX_VMUX_COMPOSITE,
1565             .vmux     = SAA7115_COMPOSITE0,
1566             .amux     = EM28XX_AMUX_LINE_IN,
1567         }, {
1568             .type     = EM28XX_VMUX_SVIDEO,
1569             .vmux     = SAA7115_SVIDEO3,
1570             .amux     = EM28XX_AMUX_LINE_IN,
1571         } },
1572     },
1573     [EM2800_BOARD_VC211A] = {
1574         .name         = "Actionmaster/LinXcel/Digitus VC211A",
1575         .is_em2800    = 1,
1576         .tuner_type   = TUNER_ABSENT,   /* Capture-only board */
1577         .decoder      = EM28XX_SAA711X,
1578         .input        = { {
1579             .type     = EM28XX_VMUX_COMPOSITE,
1580             .vmux     = SAA7115_COMPOSITE0,
1581             .amux     = EM28XX_AMUX_LINE_IN,
1582             .gpio     = vc211a_enable,
1583         }, {
1584             .type     = EM28XX_VMUX_SVIDEO,
1585             .vmux     = SAA7115_SVIDEO3,
1586             .amux     = EM28XX_AMUX_LINE_IN,
1587             .gpio     = vc211a_enable,
1588         } },
1589     },
1590     [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
1591         .name         = "Leadtek Winfast USB II",
1592         .is_em2800    = 1,
1593         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1594         .tda9887_conf = TDA9887_PRESENT,
1595         .decoder      = EM28XX_SAA711X,
1596         .input        = { {
1597             .type     = EM28XX_VMUX_TELEVISION,
1598             .vmux     = SAA7115_COMPOSITE2,
1599             .amux     = EM28XX_AMUX_VIDEO,
1600         }, {
1601             .type     = EM28XX_VMUX_COMPOSITE,
1602             .vmux     = SAA7115_COMPOSITE0,
1603             .amux     = EM28XX_AMUX_LINE_IN,
1604         }, {
1605             .type     = EM28XX_VMUX_SVIDEO,
1606             .vmux     = SAA7115_SVIDEO3,
1607             .amux     = EM28XX_AMUX_LINE_IN,
1608         } },
1609     },
1610     [EM2800_BOARD_KWORLD_USB2800] = {
1611         .name         = "Kworld USB2800",
1612         .is_em2800    = 1,
1613         .tuner_type   = TUNER_PHILIPS_FCV1236D,
1614         .tda9887_conf = TDA9887_PRESENT,
1615         .decoder      = EM28XX_SAA711X,
1616         .input        = { {
1617             .type     = EM28XX_VMUX_TELEVISION,
1618             .vmux     = SAA7115_COMPOSITE2,
1619             .amux     = EM28XX_AMUX_VIDEO,
1620         }, {
1621             .type     = EM28XX_VMUX_COMPOSITE,
1622             .vmux     = SAA7115_COMPOSITE0,
1623             .amux     = EM28XX_AMUX_LINE_IN,
1624         }, {
1625             .type     = EM28XX_VMUX_SVIDEO,
1626             .vmux     = SAA7115_SVIDEO3,
1627             .amux     = EM28XX_AMUX_LINE_IN,
1628         } },
1629     },
1630     [EM2820_BOARD_PINNACLE_DVC_90] = {
1631         .name         = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
1632         .tuner_type   = TUNER_ABSENT, /* capture only board */
1633         .decoder      = EM28XX_SAA711X,
1634         .input        = { {
1635             .type     = EM28XX_VMUX_COMPOSITE,
1636             .vmux     = SAA7115_COMPOSITE0,
1637             .amux     = EM28XX_AMUX_LINE_IN,
1638         }, {
1639             .type     = EM28XX_VMUX_SVIDEO,
1640             .vmux     = SAA7115_SVIDEO3,
1641             .amux     = EM28XX_AMUX_LINE_IN,
1642         } },
1643     },
1644     [EM2800_BOARD_VGEAR_POCKETTV] = {
1645         .name         = "V-Gear PocketTV",
1646         .is_em2800    = 1,
1647         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1648         .tda9887_conf = TDA9887_PRESENT,
1649         .decoder      = EM28XX_SAA711X,
1650         .input        = { {
1651             .type     = EM28XX_VMUX_TELEVISION,
1652             .vmux     = SAA7115_COMPOSITE2,
1653             .amux     = EM28XX_AMUX_VIDEO,
1654         }, {
1655             .type     = EM28XX_VMUX_COMPOSITE,
1656             .vmux     = SAA7115_COMPOSITE0,
1657             .amux     = EM28XX_AMUX_LINE_IN,
1658         }, {
1659             .type     = EM28XX_VMUX_SVIDEO,
1660             .vmux     = SAA7115_SVIDEO3,
1661             .amux     = EM28XX_AMUX_LINE_IN,
1662         } },
1663     },
1664     [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
1665         .name         = "Pixelview PlayTV Box 4 USB 2.0",
1666         .tda9887_conf = TDA9887_PRESENT,
1667         .tuner_type   = TUNER_YMEC_TVF_5533MF,
1668         .decoder      = EM28XX_SAA711X,
1669         .input        = { {
1670             .type     = EM28XX_VMUX_TELEVISION,
1671             .vmux     = SAA7115_COMPOSITE2,
1672             .amux     = EM28XX_AMUX_VIDEO,
1673             .aout     = EM28XX_AOUT_MONO |  /* I2S */
1674                     EM28XX_AOUT_MASTER, /* Line out pin */
1675         }, {
1676             .type     = EM28XX_VMUX_COMPOSITE,
1677             .vmux     = SAA7115_COMPOSITE0,
1678             .amux     = EM28XX_AMUX_LINE_IN,
1679         }, {
1680             .type     = EM28XX_VMUX_SVIDEO,
1681             .vmux     = SAA7115_SVIDEO3,
1682             .amux     = EM28XX_AMUX_LINE_IN,
1683         } },
1684     },
1685     [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
1686         .name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
1687         .buttons = std_snapshot_button,
1688         .tda9887_conf = TDA9887_PRESENT,
1689         .tuner_type   = TUNER_YMEC_TVF_5533MF,
1690         .tuner_addr   = 0x60,
1691         .decoder      = EM28XX_SAA711X,
1692         .input        = { {
1693             .type     = EM28XX_VMUX_TELEVISION,
1694             .vmux     = SAA7115_COMPOSITE2,
1695             .amux     = EM28XX_AMUX_VIDEO,
1696             .aout     = EM28XX_AOUT_MONO |  /* I2S */
1697                     EM28XX_AOUT_MASTER, /* Line out pin */
1698         }, {
1699             .type     = EM28XX_VMUX_COMPOSITE,
1700             .vmux     = SAA7115_COMPOSITE0,
1701             .amux     = EM28XX_AMUX_LINE_IN,
1702         }, {
1703             .type     = EM28XX_VMUX_SVIDEO,
1704             .vmux     = SAA7115_SVIDEO3,
1705             .amux     = EM28XX_AMUX_LINE_IN,
1706         } },
1707     },
1708     [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
1709         .name                = "EM2860/SAA711X Reference Design",
1710         .buttons = std_snapshot_button,
1711         .tuner_type          = TUNER_ABSENT,
1712         .decoder             = EM28XX_SAA711X,
1713         .input               = { {
1714             .type     = EM28XX_VMUX_SVIDEO,
1715             .vmux     = SAA7115_SVIDEO3,
1716         }, {
1717             .type     = EM28XX_VMUX_COMPOSITE,
1718             .vmux     = SAA7115_COMPOSITE0,
1719         } },
1720     },
1721 
1722     [EM2874_BOARD_LEADERSHIP_ISDBT] = {
1723         .def_i2c_bus    = 1,
1724         .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
1725                   EM28XX_I2C_FREQ_100_KHZ,
1726         .xclk       = EM28XX_XCLK_FREQUENCY_10MHZ,
1727         .name       = "EM2874 Leadership ISDBT",
1728         .tuner_type = TUNER_ABSENT,
1729         .tuner_gpio     = leadership_reset,
1730         .dvb_gpio       = leadership_digital,
1731         .has_dvb    = 1,
1732     },
1733 
1734     [EM2880_BOARD_MSI_DIGIVOX_AD] = {
1735         .name         = "MSI DigiVox A/D",
1736         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1737         .tuner_type   = TUNER_XC2028,
1738         .tuner_gpio   = default_tuner_gpio,
1739         .decoder      = EM28XX_TVP5150,
1740         .input        = { {
1741             .type     = EM28XX_VMUX_TELEVISION,
1742             .vmux     = TVP5150_COMPOSITE0,
1743             .amux     = EM28XX_AMUX_VIDEO,
1744             .gpio     = em2880_msi_digivox_ad_analog,
1745         }, {
1746             .type     = EM28XX_VMUX_COMPOSITE,
1747             .vmux     = TVP5150_COMPOSITE1,
1748             .amux     = EM28XX_AMUX_LINE_IN,
1749             .gpio     = em2880_msi_digivox_ad_analog,
1750         }, {
1751             .type     = EM28XX_VMUX_SVIDEO,
1752             .vmux     = TVP5150_SVIDEO,
1753             .amux     = EM28XX_AMUX_LINE_IN,
1754             .gpio     = em2880_msi_digivox_ad_analog,
1755         } },
1756     },
1757     [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1758         .name         = "MSI DigiVox A/D II",
1759         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1760         .tuner_type   = TUNER_XC2028,
1761         .tuner_gpio   = default_tuner_gpio,
1762         .decoder      = EM28XX_TVP5150,
1763         .input        = { {
1764             .type     = EM28XX_VMUX_TELEVISION,
1765             .vmux     = TVP5150_COMPOSITE0,
1766             .amux     = EM28XX_AMUX_VIDEO,
1767             .gpio     = em2880_msi_digivox_ad_analog,
1768         }, {
1769             .type     = EM28XX_VMUX_COMPOSITE,
1770             .vmux     = TVP5150_COMPOSITE1,
1771             .amux     = EM28XX_AMUX_LINE_IN,
1772             .gpio     = em2880_msi_digivox_ad_analog,
1773         }, {
1774             .type     = EM28XX_VMUX_SVIDEO,
1775             .vmux     = TVP5150_SVIDEO,
1776             .amux     = EM28XX_AMUX_LINE_IN,
1777             .gpio     = em2880_msi_digivox_ad_analog,
1778         } },
1779     },
1780     [EM2880_BOARD_KWORLD_DVB_305U] = {
1781         .name         = "KWorld DVB-T 305U",
1782         .tuner_type   = TUNER_XC2028,
1783         .tuner_gpio   = default_tuner_gpio,
1784         .decoder      = EM28XX_TVP5150,
1785         .input        = { {
1786             .type     = EM28XX_VMUX_TELEVISION,
1787             .vmux     = TVP5150_COMPOSITE0,
1788             .amux     = EM28XX_AMUX_VIDEO,
1789         }, {
1790             .type     = EM28XX_VMUX_COMPOSITE,
1791             .vmux     = TVP5150_COMPOSITE1,
1792             .amux     = EM28XX_AMUX_LINE_IN,
1793         }, {
1794             .type     = EM28XX_VMUX_SVIDEO,
1795             .vmux     = TVP5150_SVIDEO,
1796             .amux     = EM28XX_AMUX_LINE_IN,
1797         } },
1798     },
1799     [EM2880_BOARD_KWORLD_DVB_310U] = {
1800         .name         = "KWorld DVB-T 310U",
1801         .tuner_type   = TUNER_XC2028,
1802         .tuner_gpio   = default_tuner_gpio,
1803         .has_dvb      = 1,
1804         .dvb_gpio     = default_digital,
1805         .mts_firmware = 1,
1806         .decoder      = EM28XX_TVP5150,
1807         .input        = { {
1808             .type     = EM28XX_VMUX_TELEVISION,
1809             .vmux     = TVP5150_COMPOSITE0,
1810             .amux     = EM28XX_AMUX_VIDEO,
1811             .gpio     = default_analog,
1812         }, {
1813             .type     = EM28XX_VMUX_COMPOSITE,
1814             .vmux     = TVP5150_COMPOSITE1,
1815             .amux     = EM28XX_AMUX_LINE_IN,
1816             .gpio     = default_analog,
1817         }, {    /* S-video has not been tested yet */
1818             .type     = EM28XX_VMUX_SVIDEO,
1819             .vmux     = TVP5150_SVIDEO,
1820             .amux     = EM28XX_AMUX_LINE_IN,
1821             .gpio     = default_analog,
1822         } },
1823     },
1824     [EM2882_BOARD_KWORLD_ATSC_315U] = {
1825         .name       = "KWorld ATSC 315U HDTV TV Box",
1826         .valid      = EM28XX_BOARD_NOT_VALIDATED,
1827         .tuner_type = TUNER_THOMSON_DTT761X,
1828         .tuner_gpio = em2882_kworld_315u_tuner_gpio,
1829         .tda9887_conf   = TDA9887_PRESENT,
1830         .decoder    = EM28XX_SAA711X,
1831         .has_dvb    = 1,
1832         .dvb_gpio   = em2882_kworld_315u_digital,
1833         .ir_codes   = RC_MAP_KWORLD_315U,
1834         .xclk       = EM28XX_XCLK_FREQUENCY_12MHZ,
1835         .i2c_speed  = EM28XX_I2C_CLK_WAIT_ENABLE,
1836 #if 0
1837         /* FIXME: Analog mode - still not ready */
1838         .input        = { {
1839             .type = EM28XX_VMUX_TELEVISION,
1840             .vmux = SAA7115_COMPOSITE2,
1841             .amux = EM28XX_AMUX_VIDEO,
1842             .gpio = em2882_kworld_315u_analog,
1843             .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1844         }, {
1845             .type = EM28XX_VMUX_COMPOSITE,
1846             .vmux = SAA7115_COMPOSITE0,
1847             .amux = EM28XX_AMUX_LINE_IN,
1848             .gpio = em2882_kworld_315u_analog1,
1849             .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1850         }, {
1851             .type = EM28XX_VMUX_SVIDEO,
1852             .vmux = SAA7115_SVIDEO3,
1853             .amux = EM28XX_AMUX_LINE_IN,
1854             .gpio = em2882_kworld_315u_analog1,
1855             .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1856         } },
1857 #endif
1858     },
1859     [EM2880_BOARD_EMPIRE_DUAL_TV] = {
1860         .name = "Empire dual TV",
1861         .tuner_type = TUNER_XC2028,
1862         .tuner_gpio = default_tuner_gpio,
1863         .has_dvb = 1,
1864         .dvb_gpio = default_digital,
1865         .mts_firmware = 1,
1866         .decoder = EM28XX_TVP5150,
1867         .input = { {
1868             .type = EM28XX_VMUX_TELEVISION,
1869             .vmux = TVP5150_COMPOSITE0,
1870             .amux = EM28XX_AMUX_VIDEO,
1871             .gpio = default_analog,
1872         }, {
1873             .type = EM28XX_VMUX_COMPOSITE,
1874             .vmux = TVP5150_COMPOSITE1,
1875             .amux = EM28XX_AMUX_LINE_IN,
1876             .gpio = default_analog,
1877         }, {
1878             .type = EM28XX_VMUX_SVIDEO,
1879             .vmux = TVP5150_SVIDEO,
1880             .amux = EM28XX_AMUX_LINE_IN,
1881             .gpio = default_analog,
1882         } },
1883     },
1884     [EM2881_BOARD_DNT_DA2_HYBRID] = {
1885         .name         = "DNT DA2 Hybrid",
1886         .valid        = EM28XX_BOARD_NOT_VALIDATED,
1887         .tuner_type   = TUNER_XC2028,
1888         .tuner_gpio   = default_tuner_gpio,
1889         .decoder      = EM28XX_TVP5150,
1890         .input        = { {
1891             .type     = EM28XX_VMUX_TELEVISION,
1892             .vmux     = TVP5150_COMPOSITE0,
1893             .amux     = EM28XX_AMUX_VIDEO,
1894             .gpio     = default_analog,
1895         }, {
1896             .type     = EM28XX_VMUX_COMPOSITE,
1897             .vmux     = TVP5150_COMPOSITE1,
1898             .amux     = EM28XX_AMUX_LINE_IN,
1899             .gpio     = default_analog,
1900         }, {
1901             .type     = EM28XX_VMUX_SVIDEO,
1902             .vmux     = TVP5150_SVIDEO,
1903             .amux     = EM28XX_AMUX_LINE_IN,
1904             .gpio     = default_analog,
1905         } },
1906     },
1907     [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1908         .name         = "Pinnacle Hybrid Pro",
1909         .tuner_type   = TUNER_XC2028,
1910         .tuner_gpio   = default_tuner_gpio,
1911         .decoder      = EM28XX_TVP5150,
1912         .has_dvb      = 1,
1913         .dvb_gpio     = pinnacle_hybrid_pro_digital,
1914         .input        = { {
1915             .type     = EM28XX_VMUX_TELEVISION,
1916             .vmux     = TVP5150_COMPOSITE0,
1917             .amux     = EM28XX_AMUX_VIDEO,
1918             .gpio     = pinnacle_hybrid_pro_analog,
1919         }, {
1920             .type     = EM28XX_VMUX_COMPOSITE,
1921             .vmux     = TVP5150_COMPOSITE1,
1922             .amux     = EM28XX_AMUX_LINE_IN,
1923             .gpio     = pinnacle_hybrid_pro_analog,
1924         }, {
1925             .type     = EM28XX_VMUX_SVIDEO,
1926             .vmux     = TVP5150_SVIDEO,
1927             .amux     = EM28XX_AMUX_LINE_IN,
1928             .gpio     = pinnacle_hybrid_pro_analog,
1929         } },
1930     },
1931     [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
1932         .name         = "Pinnacle Hybrid Pro (330e)",
1933         .tuner_type   = TUNER_XC2028,
1934         .tuner_gpio   = default_tuner_gpio,
1935         .mts_firmware = 1,
1936         .has_dvb      = 1,
1937         .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1938         .ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
1939         .decoder      = EM28XX_TVP5150,
1940         .input        = { {
1941             .type     = EM28XX_VMUX_TELEVISION,
1942             .vmux     = TVP5150_COMPOSITE0,
1943             .amux     = EM28XX_AMUX_VIDEO,
1944             .gpio     = hauppauge_wintv_hvr_900_analog,
1945         }, {
1946             .type     = EM28XX_VMUX_COMPOSITE,
1947             .vmux     = TVP5150_COMPOSITE1,
1948             .amux     = EM28XX_AMUX_LINE_IN,
1949             .gpio     = hauppauge_wintv_hvr_900_analog,
1950         }, {
1951             .type     = EM28XX_VMUX_SVIDEO,
1952             .vmux     = TVP5150_SVIDEO,
1953             .amux     = EM28XX_AMUX_LINE_IN,
1954             .gpio     = hauppauge_wintv_hvr_900_analog,
1955         } },
1956     },
1957     [EM2882_BOARD_KWORLD_VS_DVBT] = {
1958         .name         = "Kworld VS-DVB-T 323UR",
1959         .tuner_type   = TUNER_XC2028,
1960         .tuner_gpio   = default_tuner_gpio,
1961         .decoder      = EM28XX_TVP5150,
1962         .mts_firmware = 1,
1963         .has_dvb      = 1,
1964         .dvb_gpio     = kworld_330u_digital,
1965         .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1966         .ir_codes     = RC_MAP_KWORLD_315U,
1967         .input        = { {
1968             .type     = EM28XX_VMUX_TELEVISION,
1969             .vmux     = TVP5150_COMPOSITE0,
1970             .amux     = EM28XX_AMUX_VIDEO,
1971         }, {
1972             .type     = EM28XX_VMUX_COMPOSITE,
1973             .vmux     = TVP5150_COMPOSITE1,
1974             .amux     = EM28XX_AMUX_LINE_IN,
1975         }, {
1976             .type     = EM28XX_VMUX_SVIDEO,
1977             .vmux     = TVP5150_SVIDEO,
1978             .amux     = EM28XX_AMUX_LINE_IN,
1979         } },
1980     },
1981     [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1982         .name         = "Terratec Cinergy Hybrid T USB XS (em2882)",
1983         .tuner_type   = TUNER_XC2028,
1984         .tuner_gpio   = default_tuner_gpio,
1985         .mts_firmware = 1,
1986         .decoder      = EM28XX_TVP5150,
1987         .has_dvb      = 1,
1988         .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1989         .ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,
1990         .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
1991         .input        = { {
1992             .type     = EM28XX_VMUX_TELEVISION,
1993             .vmux     = TVP5150_COMPOSITE0,
1994             .amux     = EM28XX_AMUX_VIDEO,
1995             .gpio     = hauppauge_wintv_hvr_900_analog,
1996         }, {
1997             .type     = EM28XX_VMUX_COMPOSITE,
1998             .vmux     = TVP5150_COMPOSITE1,
1999             .amux     = EM28XX_AMUX_LINE_IN,
2000             .gpio     = hauppauge_wintv_hvr_900_analog,
2001         }, {
2002             .type     = EM28XX_VMUX_SVIDEO,
2003             .vmux     = TVP5150_SVIDEO,
2004             .amux     = EM28XX_AMUX_LINE_IN,
2005             .gpio     = hauppauge_wintv_hvr_900_analog,
2006         } },
2007     },
2008     [EM2882_BOARD_DIKOM_DK300] = {
2009         .name         = "Dikom DK300",
2010         .tuner_type   = TUNER_XC2028,
2011         .tuner_gpio   = default_tuner_gpio,
2012         .decoder      = EM28XX_TVP5150,
2013         .mts_firmware = 1,
2014         .has_dvb      = 1,
2015         .dvb_gpio     = dikom_dk300_digital,
2016         .input        = { {
2017             .type     = EM28XX_VMUX_TELEVISION,
2018             .vmux     = TVP5150_COMPOSITE0,
2019             .amux     = EM28XX_AMUX_VIDEO,
2020             .gpio     = default_analog,
2021         } },
2022     },
2023     [EM2883_BOARD_KWORLD_HYBRID_330U] = {
2024         .name         = "Kworld PlusTV HD Hybrid 330",
2025         .tuner_type   = TUNER_XC2028,
2026         .tuner_gpio   = default_tuner_gpio,
2027         .decoder      = EM28XX_TVP5150,
2028         .mts_firmware = 1,
2029         .has_dvb      = 1,
2030         .dvb_gpio     = kworld_330u_digital,
2031         .xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
2032         .i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
2033                     EM28XX_I2C_EEPROM_ON_BOARD |
2034                     EM28XX_I2C_EEPROM_KEY_VALID,
2035         .input        = { {
2036             .type     = EM28XX_VMUX_TELEVISION,
2037             .vmux     = TVP5150_COMPOSITE0,
2038             .amux     = EM28XX_AMUX_VIDEO,
2039             .gpio     = kworld_330u_analog,
2040             .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
2041         }, {
2042             .type     = EM28XX_VMUX_COMPOSITE,
2043             .vmux     = TVP5150_COMPOSITE1,
2044             .amux     = EM28XX_AMUX_LINE_IN,
2045             .gpio     = kworld_330u_analog,
2046             .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
2047         }, {
2048             .type     = EM28XX_VMUX_SVIDEO,
2049             .vmux     = TVP5150_SVIDEO,
2050             .amux     = EM28XX_AMUX_LINE_IN,
2051             .gpio     = kworld_330u_analog,
2052         } },
2053     },
2054     [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
2055         .name         = "Compro VideoMate ForYou/Stereo",
2056         .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
2057         .tvaudio_addr = 0xb0,
2058         .tda9887_conf = TDA9887_PRESENT,
2059         .decoder      = EM28XX_TVP5150,
2060         .adecoder     = EM28XX_TVAUDIO,
2061         .mute_gpio    = compro_mute_gpio,
2062         .input        = { {
2063             .type     = EM28XX_VMUX_TELEVISION,
2064             .vmux     = TVP5150_COMPOSITE0,
2065             .amux     = EM28XX_AMUX_VIDEO,
2066             .gpio     = compro_unmute_tv_gpio,
2067         }, {
2068             .type     = EM28XX_VMUX_SVIDEO,
2069             .vmux     = TVP5150_SVIDEO,
2070             .amux     = EM28XX_AMUX_LINE_IN,
2071             .gpio     = compro_unmute_svid_gpio,
2072         } },
2073     },
2074     [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
2075         .name         = "Kaiomy TVnPC U2",
2076         .vchannels    = 3,
2077         .tuner_type   = TUNER_XC2028,
2078         .tuner_addr   = 0x61,
2079         .mts_firmware = 1,
2080         .decoder      = EM28XX_TVP5150,
2081         .tuner_gpio   = default_tuner_gpio,
2082         .ir_codes     = RC_MAP_KAIOMY,
2083         .input          = { {
2084             .type     = EM28XX_VMUX_TELEVISION,
2085             .vmux     = TVP5150_COMPOSITE0,
2086             .amux     = EM28XX_AMUX_VIDEO,
2087 
2088         }, {
2089             .type     = EM28XX_VMUX_COMPOSITE,
2090             .vmux     = TVP5150_COMPOSITE1,
2091             .amux     = EM28XX_AMUX_LINE_IN,
2092         }, {
2093             .type     = EM28XX_VMUX_SVIDEO,
2094             .vmux     = TVP5150_SVIDEO,
2095             .amux     = EM28XX_AMUX_LINE_IN,
2096         } },
2097         .radio      = {
2098             .type     = EM28XX_RADIO,
2099             .amux     = EM28XX_AMUX_LINE_IN,
2100         }
2101     },
2102     [EM2860_BOARD_EASYCAP] = {
2103         .name         = "Easy Cap Capture DC-60",
2104         .vchannels    = 2,
2105         .tuner_type   = TUNER_ABSENT,
2106         .decoder      = EM28XX_SAA711X,
2107         .input           = { {
2108             .type     = EM28XX_VMUX_COMPOSITE,
2109             .vmux     = SAA7115_COMPOSITE0,
2110             .amux     = EM28XX_AMUX_LINE_IN,
2111         }, {
2112             .type     = EM28XX_VMUX_SVIDEO,
2113             .vmux     = SAA7115_SVIDEO3,
2114             .amux     = EM28XX_AMUX_LINE_IN,
2115         } },
2116     },
2117     [EM2820_BOARD_IODATA_GVMVP_SZ] = {
2118         .name       = "IO-DATA GV-MVP/SZ",
2119         .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
2120         .tuner_gpio   = default_tuner_gpio,
2121         .tda9887_conf = TDA9887_PRESENT,
2122         .decoder      = EM28XX_TVP5150,
2123         .input        = { {
2124             .type     = EM28XX_VMUX_TELEVISION,
2125             .vmux     = TVP5150_COMPOSITE0,
2126             .amux     = EM28XX_AMUX_VIDEO,
2127         }, { /* Composite has not been tested yet */
2128             .type     = EM28XX_VMUX_COMPOSITE,
2129             .vmux     = TVP5150_COMPOSITE1,
2130             .amux     = EM28XX_AMUX_VIDEO,
2131         }, { /* S-video has not been tested yet */
2132             .type     = EM28XX_VMUX_SVIDEO,
2133             .vmux     = TVP5150_SVIDEO,
2134             .amux     = EM28XX_AMUX_VIDEO,
2135         } },
2136     },
2137     [EM2860_BOARD_TERRATEC_GRABBY] = {
2138         .name            = "Terratec Grabby",
2139         .vchannels       = 2,
2140         .tuner_type      = TUNER_ABSENT,
2141         .decoder         = EM28XX_SAA711X,
2142         .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
2143         .input           = { {
2144             .type     = EM28XX_VMUX_COMPOSITE,
2145             .vmux     = SAA7115_COMPOSITE0,
2146             .amux     = EM28XX_AMUX_LINE_IN,
2147         }, {
2148             .type     = EM28XX_VMUX_SVIDEO,
2149             .vmux     = SAA7115_SVIDEO3,
2150             .amux     = EM28XX_AMUX_LINE_IN,
2151         } },
2152         .buttons         = std_snapshot_button,
2153         .leds            = terratec_grabby_leds,
2154     },
2155     [EM2860_BOARD_TERRATEC_AV350] = {
2156         .name            = "Terratec AV350",
2157         .vchannels       = 2,
2158         .tuner_type      = TUNER_ABSENT,
2159         .decoder         = EM28XX_TVP5150,
2160         .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
2161         .mute_gpio       = terratec_av350_mute_gpio,
2162         .input           = { {
2163             .type     = EM28XX_VMUX_COMPOSITE,
2164             .vmux     = TVP5150_COMPOSITE1,
2165             .amux     = EM28XX_AMUX_LINE_IN,
2166             .gpio     = terratec_av350_unmute_gpio,
2167 
2168         }, {
2169             .type     = EM28XX_VMUX_SVIDEO,
2170             .vmux     = TVP5150_SVIDEO,
2171             .amux     = EM28XX_AMUX_LINE_IN,
2172             .gpio     = terratec_av350_unmute_gpio,
2173         } },
2174     },
2175 
2176     [EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
2177         .name         = "Elgato Video Capture",
2178         .decoder      = EM28XX_SAA711X,
2179         .tuner_type   = TUNER_ABSENT,   /* Capture only device */
2180         .input        = { {
2181             .type  = EM28XX_VMUX_COMPOSITE,
2182             .vmux  = SAA7115_COMPOSITE0,
2183             .amux  = EM28XX_AMUX_LINE_IN,
2184         }, {
2185             .type  = EM28XX_VMUX_SVIDEO,
2186             .vmux  = SAA7115_SVIDEO3,
2187             .amux  = EM28XX_AMUX_LINE_IN,
2188         } },
2189     },
2190 
2191     [EM2882_BOARD_EVGA_INDTUBE] = {
2192         .name         = "Evga inDtube",
2193         .tuner_type   = TUNER_XC2028,
2194         .tuner_gpio   = default_tuner_gpio,
2195         .decoder      = EM28XX_TVP5150,
2196         .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
2197         .mts_firmware = 1,
2198         .has_dvb      = 1,
2199         .dvb_gpio     = evga_indtube_digital,
2200         .ir_codes     = RC_MAP_EVGA_INDTUBE,
2201         .input        = { {
2202             .type     = EM28XX_VMUX_TELEVISION,
2203             .vmux     = TVP5150_COMPOSITE0,
2204             .amux     = EM28XX_AMUX_VIDEO,
2205             .gpio     = evga_indtube_analog,
2206         }, {
2207             .type     = EM28XX_VMUX_COMPOSITE,
2208             .vmux     = TVP5150_COMPOSITE1,
2209             .amux     = EM28XX_AMUX_LINE_IN,
2210             .gpio     = evga_indtube_analog,
2211         }, {
2212             .type     = EM28XX_VMUX_SVIDEO,
2213             .vmux     = TVP5150_SVIDEO,
2214             .amux     = EM28XX_AMUX_LINE_IN,
2215             .gpio     = evga_indtube_analog,
2216         } },
2217     },
2218     /*
2219      * eb1a:2868 Empia EM2870 + Philips CU1216L NIM
2220      * (Philips TDA10023 + Infineon TUA6034)
2221      */
2222     [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
2223         .name          = "Reddo DVB-C USB TV Box",
2224         .tuner_type    = TUNER_ABSENT,
2225         .tuner_gpio    = reddo_dvb_c_usb_box,
2226         .has_dvb       = 1,
2227     },
2228     /*
2229      * 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
2230      * initially as the KWorld PlusTV 340U, then as the UB435-Q.
2231      * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2
2232      */
2233     [EM2870_BOARD_KWORLD_A340] = {
2234         .name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",
2235         .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */
2236         .has_dvb    = 1,
2237         .dvb_gpio   = kworld_a340_digital,
2238         .tuner_gpio = default_tuner_gpio,
2239     },
2240     /*
2241      * 2013:024f PCTV nanoStick T2 290e.
2242      * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2
2243      */
2244     [EM28174_BOARD_PCTV_290E] = {
2245         .name          = "PCTV nanoStick T2 290e",
2246         .def_i2c_bus   = 1,
2247         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2248                  EM28XX_I2C_FREQ_100_KHZ,
2249         .tuner_type    = TUNER_ABSENT,
2250         .tuner_gpio    = pctv_290e,
2251         .has_dvb       = 1,
2252         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2253     },
2254     /*
2255      * 2013:024f PCTV DVB-S2 Stick 460e
2256      * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293
2257      */
2258     [EM28174_BOARD_PCTV_460E] = {
2259         .def_i2c_bus   = 1,
2260         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2261                  EM28XX_I2C_FREQ_400_KHZ,
2262         .name          = "PCTV DVB-S2 Stick (460e)",
2263         .tuner_type    = TUNER_ABSENT,
2264         .tuner_gpio    = pctv_460e,
2265         .has_dvb       = 1,
2266         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2267     },
2268     /*
2269      * eb1a:5006 Honestech VIDBOX NW03
2270      * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
2271      */
2272     [EM2860_BOARD_HT_VIDBOX_NW03] = {
2273         .name                = "Honestech Vidbox NW03",
2274         .tuner_type          = TUNER_ABSENT,
2275         .decoder             = EM28XX_SAA711X,
2276         .input               = { {
2277             .type     = EM28XX_VMUX_COMPOSITE,
2278             .vmux     = SAA7115_COMPOSITE0,
2279             .amux     = EM28XX_AMUX_LINE_IN,
2280         }, {
2281             .type     = EM28XX_VMUX_SVIDEO,
2282             .vmux     = SAA7115_SVIDEO3,  /* S-VIDEO needs check */
2283             .amux     = EM28XX_AMUX_LINE_IN,
2284         } },
2285     },
2286     /*
2287      * 1b80:e425 MaxMedia UB425-TC
2288      * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
2289      */
2290     [EM2874_BOARD_MAXMEDIA_UB425_TC] = {
2291         .name          = "MaxMedia UB425-TC",
2292         .tuner_type    = TUNER_ABSENT,
2293         .tuner_gpio    = maxmedia_ub425_tc,
2294         .has_dvb       = 1,
2295         .ir_codes      = RC_MAP_REDDO,
2296         .def_i2c_bus   = 1,
2297         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2298                 EM28XX_I2C_FREQ_400_KHZ,
2299     },
2300     /*
2301      * 2304:0242 PCTV QuatroStick (510e)
2302      * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2
2303      */
2304     [EM2884_BOARD_PCTV_510E] = {
2305         .name          = "PCTV QuatroStick (510e)",
2306         .tuner_type    = TUNER_ABSENT,
2307         .tuner_gpio    = pctv_510e,
2308         .has_dvb       = 1,
2309         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2310         .def_i2c_bus   = 1,
2311         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2312                 EM28XX_I2C_FREQ_400_KHZ,
2313     },
2314     /*
2315      * 2013:0251 PCTV QuatroStick nano (520e)
2316      * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2
2317      */
2318     [EM2884_BOARD_PCTV_520E] = {
2319         .name          = "PCTV QuatroStick nano (520e)",
2320         .tuner_type    = TUNER_ABSENT,
2321         .tuner_gpio    = pctv_520e,
2322         .has_dvb       = 1,
2323         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2324         .def_i2c_bus   = 1,
2325         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2326                 EM28XX_I2C_FREQ_400_KHZ,
2327     },
2328     [EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
2329         .name         = "Terratec Cinergy HTC USB XS",
2330         .has_dvb      = 1,
2331         .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
2332         .tuner_type   = TUNER_ABSENT,
2333         .def_i2c_bus  = 1,
2334         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2335                 EM28XX_I2C_FREQ_400_KHZ,
2336     },
2337     /*
2338      * 1b80:e1cc Delock 61959
2339      * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
2340      * mostly the same as MaxMedia UB-425-TC but different remote
2341      */
2342     [EM2874_BOARD_DELOCK_61959] = {
2343         .name          = "Delock 61959",
2344         .tuner_type    = TUNER_ABSENT,
2345         .tuner_gpio    = maxmedia_ub425_tc,
2346         .has_dvb       = 1,
2347         .ir_codes      = RC_MAP_DELOCK_61959,
2348         .def_i2c_bus   = 1,
2349         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2350                 EM28XX_I2C_FREQ_400_KHZ,
2351     },
2352     /*
2353      * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
2354      * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2355      */
2356     [EM2874_BOARD_KWORLD_UB435Q_V2] = {
2357         .name       = "KWorld USB ATSC TV Stick UB435-Q V2",
2358         .tuner_type = TUNER_ABSENT,
2359         .has_dvb    = 1,
2360         .dvb_gpio   = kworld_a340_digital,
2361         .tuner_gpio = default_tuner_gpio,
2362         .def_i2c_bus    = 1,
2363     },
2364     /*
2365      * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
2366      * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2367      */
2368     [EM2874_BOARD_KWORLD_UB435Q_V3] = {
2369         .name       = "KWorld USB ATSC TV Stick UB435-Q V3",
2370         .tuner_type = TUNER_ABSENT,
2371         .has_dvb    = 1,
2372         .tuner_gpio = kworld_ub435q_v3_digital,
2373         .def_i2c_bus    = 1,
2374         .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
2375                   EM28XX_I2C_FREQ_100_KHZ,
2376         .leds = kworld_ub435q_v3_leds,
2377     },
2378     [EM2874_BOARD_PCTV_HD_MINI_80E] = {
2379         .name         = "Pinnacle PCTV HD Mini",
2380         .tuner_type   = TUNER_ABSENT,
2381         .has_dvb      = 1,
2382         .dvb_gpio     = em2874_pctv_80e_digital,
2383         .decoder      = EM28XX_NODECODER,
2384         .ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
2385         .leds         = pctv_80e_leds,
2386     },
2387     /*
2388      * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
2389      * Empia EM2765 + OmniVision OV2640
2390      */
2391     [EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
2392         .name         = "SpeedLink Vicious And Devine Laplace webcam",
2393         .xclk         = EM28XX_XCLK_FREQUENCY_24MHZ,
2394         .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2395                 EM28XX_I2C_FREQ_100_KHZ,
2396         .def_i2c_bus  = 1,
2397         .tuner_type   = TUNER_ABSENT,
2398         .is_webcam    = 1,
2399         .input        = { {
2400             .type     = EM28XX_VMUX_COMPOSITE,
2401             .amux     = EM28XX_AMUX_VIDEO,
2402             .gpio     = speedlink_vad_laplace_reg_seq,
2403         } },
2404         .buttons = speedlink_vad_laplace_buttons,
2405         .leds = speedlink_vad_laplace_leds,
2406     },
2407     /*
2408      * 2013:0258 PCTV DVB-S2 Stick (461e)
2409      * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293
2410      */
2411     [EM28178_BOARD_PCTV_461E] = {
2412         .def_i2c_bus   = 1,
2413         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2414                  EM28XX_I2C_FREQ_400_KHZ,
2415         .name          = "PCTV DVB-S2 Stick (461e)",
2416         .tuner_type    = TUNER_ABSENT,
2417         .tuner_gpio    = pctv_461e,
2418         .has_dvb       = 1,
2419         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2420     },
2421     /*
2422      * 2013:0259 PCTV DVB-S2 Stick (461e_v2)
2423      * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293
2424      */
2425     [EM28178_BOARD_PCTV_461E_V2] = {
2426         .def_i2c_bus   = 1,
2427         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2428                  EM28XX_I2C_FREQ_400_KHZ,
2429         .name          = "PCTV DVB-S2 Stick (461e v2)",
2430         .tuner_type    = TUNER_ABSENT,
2431         .tuner_gpio    = pctv_461e,
2432         .has_dvb       = 1,
2433         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2434     },
2435     /*
2436      * 2013:025f PCTV tripleStick (292e).
2437      * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157
2438      */
2439     [EM28178_BOARD_PCTV_292E] = {
2440         .name          = "PCTV tripleStick (292e)",
2441         .def_i2c_bus   = 1,
2442         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2443                  EM28XX_I2C_FREQ_400_KHZ,
2444         .tuner_type    = TUNER_ABSENT,
2445         .tuner_gpio    = pctv_292e,
2446         .has_dvb       = 1,
2447         .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2448     },
2449     [EM2861_BOARD_LEADTEK_VC100] = {
2450         .name          = "Leadtek VC100",
2451         .tuner_type    = TUNER_ABSENT,  /* Capture only device */
2452         .decoder       = EM28XX_TVP5150,
2453         .input         = { {
2454             .type     = EM28XX_VMUX_COMPOSITE,
2455             .vmux     = TVP5150_COMPOSITE1,
2456             .amux     = EM28XX_AMUX_LINE_IN,
2457         }, {
2458             .type     = EM28XX_VMUX_SVIDEO,
2459             .vmux     = TVP5150_SVIDEO,
2460             .amux     = EM28XX_AMUX_LINE_IN,
2461         } },
2462     },
2463     /*
2464      * eb1a:8179 Terratec Cinergy T2 Stick HD.
2465      * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146
2466      */
2467     [EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
2468         .name          = "Terratec Cinergy T2 Stick HD",
2469         .def_i2c_bus   = 1,
2470         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2471                  EM28XX_I2C_FREQ_400_KHZ,
2472         .tuner_type    = TUNER_ABSENT,
2473         .tuner_gpio    = terratec_t2_stick_hd,
2474         .has_dvb       = 1,
2475         .ir_codes      = RC_MAP_TERRATEC_SLIM_2,
2476     },
2477 
2478     /*
2479      * 3275:0085 PLEX PX-BCUD.
2480      * Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C0042
2481      */
2482     [EM28178_BOARD_PLEX_PX_BCUD] = {
2483         .name          = "PLEX PX-BCUD",
2484         .xclk          = EM28XX_XCLK_FREQUENCY_4_3MHZ,
2485         .def_i2c_bus   = 1,
2486         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE,
2487         .tuner_type    = TUNER_ABSENT,
2488         .tuner_gpio    = plex_px_bcud,
2489         .has_dvb       = 1,
2490     },
2491     /*
2492      * 2040:0265 Hauppauge WinTV-dualHD (DVB version) Isoc.
2493      * 2040:8265 Hauppauge WinTV-dualHD (DVB version) Bulk.
2494      * Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si2157
2495      */
2496     [EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {
2497         .name          = "Hauppauge WinTV-dualHD DVB",
2498         .def_i2c_bus   = 1,
2499         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2500                  EM28XX_I2C_FREQ_400_KHZ,
2501         .tuner_type    = TUNER_SI2157,
2502         .tuner_gpio    = hauppauge_dualhd_dvb,
2503         .has_dvb       = 1,
2504         .has_dual_ts   = 1,
2505         .ir_codes      = RC_MAP_HAUPPAUGE,
2506         .leds          = hauppauge_dualhd_leds,
2507         .input         = { {
2508             .type     = EM28XX_VMUX_COMPOSITE,
2509             .vmux     = TVP5150_COMPOSITE1,
2510             .amux     = EM28XX_AMUX_LINE_IN,
2511         } },
2512     },
2513     /*
2514      * 2040:026d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Isoc.
2515      * 2040:826d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Bulk.
2516      * Empia EM28274, 2x LG LGDT3306A, 2x Silicon Labs Si2157
2517      */
2518     [EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595] = {
2519         .name          = "Hauppauge WinTV-dualHD 01595 ATSC/QAM",
2520         .def_i2c_bus   = 1,
2521         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2522                  EM28XX_I2C_FREQ_400_KHZ,
2523         .tuner_type    = TUNER_ABSENT,
2524         .tuner_gpio    = hauppauge_dualhd_dvb,
2525         .has_dvb       = 1,
2526         .has_dual_ts   = 1,
2527         .ir_codes      = RC_MAP_HAUPPAUGE,
2528         .leds          = hauppauge_dualhd_leds,
2529     },
2530     /*
2531      * 1b80:e349 Magix USB Videowandler-2
2532      * (same chips as Honestech VIDBOX NW03)
2533      * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
2534      */
2535     [EM2861_BOARD_MAGIX_VIDEOWANDLER2] = {
2536         .name                = "Magix USB Videowandler-2",
2537         .tuner_type          = TUNER_ABSENT,
2538         .decoder             = EM28XX_SAA711X,
2539         .input               = { {
2540             .type     = EM28XX_VMUX_COMPOSITE,
2541             .vmux     = SAA7115_COMPOSITE0,
2542             .amux     = EM28XX_AMUX_LINE_IN,
2543         }, {
2544             .type     = EM28XX_VMUX_SVIDEO,
2545             .amux     = EM28XX_AMUX_LINE_IN,
2546         } },
2547     },
2548     /*
2549      * 1f4d:1abe MyGica iGrabber
2550      * (same as several other EM2860 devices)
2551      * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
2552      */
2553     [EM2860_BOARD_MYGICA_IGRABBER] = {
2554         .name         = "MyGica iGrabber",
2555         .vchannels    = 2,
2556         .tuner_type   = TUNER_ABSENT,
2557         .decoder      = EM28XX_SAA711X,
2558         .input           = { {
2559             .type     = EM28XX_VMUX_COMPOSITE,
2560             .vmux     = SAA7115_COMPOSITE0,
2561             .amux     = EM28XX_AMUX_LINE_IN,
2562         }, {
2563             .type     = EM28XX_VMUX_SVIDEO,
2564             .vmux     = SAA7115_SVIDEO3,
2565             .amux     = EM28XX_AMUX_LINE_IN,
2566         } },
2567     },
2568     /* 2040:826d Hauppauge USB QuadHD
2569      * Empia 28274, Max Linear 692 ATSC combo demod/tuner
2570      */
2571     [EM2874_BOARD_HAUPPAUGE_USB_QUADHD] = {
2572         .name          = "Hauppauge USB QuadHD ATSC",
2573         .def_i2c_bus   = 1,
2574         .has_dual_ts   = 1,
2575         .has_dvb       = 1,
2576         .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
2577         .tuner_type    = TUNER_ABSENT,
2578         .tuner_gpio    = hauppauge_usb_quadhd_atsc_reg_seq,
2579         .leds          = hauppauge_usb_quadhd_leds,
2580     },
2581 };
2582 EXPORT_SYMBOL_GPL(em28xx_boards);
2583 
2584 static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
2585 
2586 /* table of devices that work with this driver */
2587 struct usb_device_id em28xx_id_table[] = {
2588     { USB_DEVICE(0xeb1a, 0x2750),
2589             .driver_info = EM2750_BOARD_UNKNOWN },
2590     { USB_DEVICE(0xeb1a, 0x2751),
2591             .driver_info = EM2750_BOARD_UNKNOWN },
2592     { USB_DEVICE(0xeb1a, 0x2800),
2593             .driver_info = EM2800_BOARD_UNKNOWN },
2594     { USB_DEVICE(0xeb1a, 0x2710),
2595             .driver_info = EM2820_BOARD_UNKNOWN },
2596     { USB_DEVICE(0xeb1a, 0x2820),
2597             .driver_info = EM2820_BOARD_UNKNOWN },
2598     { USB_DEVICE(0xeb1a, 0x2821),
2599             .driver_info = EM2820_BOARD_UNKNOWN },
2600     { USB_DEVICE(0xeb1a, 0x2860),
2601             .driver_info = EM2820_BOARD_UNKNOWN },
2602     { USB_DEVICE(0xeb1a, 0x2861),
2603             .driver_info = EM2820_BOARD_UNKNOWN },
2604     { USB_DEVICE(0xeb1a, 0x2862),
2605             .driver_info = EM2820_BOARD_UNKNOWN },
2606     { USB_DEVICE(0xeb1a, 0x2863),
2607             .driver_info = EM2820_BOARD_UNKNOWN },
2608     { USB_DEVICE(0xeb1a, 0x2870),
2609             .driver_info = EM2820_BOARD_UNKNOWN },
2610     { USB_DEVICE(0xeb1a, 0x2881),
2611             .driver_info = EM2820_BOARD_UNKNOWN },
2612     { USB_DEVICE(0xeb1a, 0x2883), /* used by :Zolid Hybrid Tv Stick */
2613             .driver_info = EM2820_BOARD_UNKNOWN },
2614     { USB_DEVICE(0xeb1a, 0x2868),
2615             .driver_info = EM2820_BOARD_UNKNOWN },
2616     { USB_DEVICE(0xeb1a, 0x2875),
2617             .driver_info = EM2820_BOARD_UNKNOWN },
2618     { USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */
2619             .driver_info = EM2884_BOARD_TERRATEC_H5 },
2620     { USB_DEVICE(0xeb1a, 0xe300),
2621             .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
2622     { USB_DEVICE(0xeb1a, 0xe303),
2623             .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
2624     { USB_DEVICE(0xeb1a, 0xe305),
2625             .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
2626     { USB_DEVICE(0xeb1a, 0xe310),
2627             .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
2628     { USB_DEVICE(0xeb1a, 0xa313),
2629         .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
2630     { USB_DEVICE(0xeb1a, 0xa316),
2631             .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
2632     { USB_DEVICE(0xeb1a, 0xe320),
2633             .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
2634     { USB_DEVICE(0xeb1a, 0xe323),
2635             .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
2636     { USB_DEVICE(0xeb1a, 0xe350),
2637             .driver_info = EM2870_BOARD_KWORLD_350U },
2638     { USB_DEVICE(0xeb1a, 0xe355),
2639             .driver_info = EM2870_BOARD_KWORLD_355U },
2640     { USB_DEVICE(0xeb1a, 0x2801),
2641             .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
2642     { USB_DEVICE(0xeb1a, 0xe357),
2643             .driver_info = EM2870_BOARD_KWORLD_355U },
2644     { USB_DEVICE(0xeb1a, 0xe359),
2645             .driver_info = EM2870_BOARD_KWORLD_355U },
2646     { USB_DEVICE(0x1b80, 0xe302), /* Kaiser Baas Video to DVD maker */
2647             .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2648     { USB_DEVICE(0x1b80, 0xe304), /* Kworld DVD Maker 2 */
2649             .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2650     { USB_DEVICE(0x0ccd, 0x0036),
2651             .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
2652     { USB_DEVICE(0x0ccd, 0x004c),
2653             .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
2654     { USB_DEVICE(0x0ccd, 0x004f),
2655             .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
2656     { USB_DEVICE(0x0ccd, 0x005e),
2657             .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2658     { USB_DEVICE(0x0ccd, 0x0042),
2659             .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2660     { USB_DEVICE(0x0ccd, 0x0043),
2661             .driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },
2662     { USB_DEVICE(0x0ccd, 0x008e),   /* Cinergy HTC USB XS Rev. 1 */
2663             .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2664     { USB_DEVICE(0x0ccd, 0x00ac),   /* Cinergy HTC USB XS Rev. 2 */
2665             .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2666     { USB_DEVICE(0x0ccd, 0x10a2),   /* H5 Rev. 1 */
2667             .driver_info = EM2884_BOARD_TERRATEC_H5 },
2668     { USB_DEVICE(0x0ccd, 0x10ad),   /* H5 Rev. 2 */
2669             .driver_info = EM2884_BOARD_TERRATEC_H5 },
2670     { USB_DEVICE(0x0ccd, 0x10b6),   /* H5 Rev. 3 */
2671             .driver_info = EM2884_BOARD_TERRATEC_H5 },
2672     { USB_DEVICE(0x0ccd, 0x10b2),   /* H6 */
2673             .driver_info = EM2884_BOARD_TERRATEC_H6 },
2674     { USB_DEVICE(0x0ccd, 0x0084),
2675             .driver_info = EM2860_BOARD_TERRATEC_AV350 },
2676     { USB_DEVICE(0x0ccd, 0x0096),
2677             .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2678     { USB_DEVICE(0x0ccd, 0x10AF),
2679             .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2680     { USB_DEVICE(0x0ccd, 0x00b2),
2681             .driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
2682     { USB_DEVICE(0x0fd9, 0x0018),
2683             .driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },
2684     { USB_DEVICE(0x0fd9, 0x0033),
2685             .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },
2686     { USB_DEVICE(0x185b, 0x2870),
2687             .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
2688     { USB_DEVICE(0x185b, 0x2041),
2689             .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
2690     { USB_DEVICE(0x2040, 0x4200),
2691             .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2692     { USB_DEVICE(0x2040, 0x4201),
2693             .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2694     { USB_DEVICE(0x2040, 0x6500),
2695             .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
2696     { USB_DEVICE(0x2040, 0x6502),
2697             .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
2698     { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
2699             .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2700     { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
2701             .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2702     { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
2703             .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2704     { USB_DEVICE(0x2040, 0x651f),
2705             .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
2706     { USB_DEVICE(0x2040, 0x0265),
2707             .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2708     { USB_DEVICE(0x2040, 0x8265),
2709             .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2710     { USB_DEVICE(0x2040, 0x026d),
2711             .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
2712     { USB_DEVICE(0x2040, 0x826d),
2713             .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
2714     { USB_DEVICE(0x2040, 0x846d),
2715             .driver_info = EM2874_BOARD_HAUPPAUGE_USB_QUADHD },
2716     { USB_DEVICE(0x0438, 0xb002),
2717             .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
2718     { USB_DEVICE(0x2001, 0xf112),
2719             .driver_info = EM2820_BOARD_DLINK_USB_TV },
2720     { USB_DEVICE(0x2304, 0x0207),
2721             .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2722     { USB_DEVICE(0x2304, 0x0208),
2723             .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
2724     { USB_DEVICE(0x2304, 0x021a),
2725             .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2726     { USB_DEVICE(0x2304, 0x0226),
2727             .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
2728     { USB_DEVICE(0x2304, 0x0227),
2729             .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
2730     { USB_DEVICE(0x2304, 0x023f),
2731             .driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
2732     { USB_DEVICE(0x0413, 0x6023),
2733             .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
2734     { USB_DEVICE(0x093b, 0xa003),
2735                .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2736     { USB_DEVICE(0x093b, 0xa005),
2737             .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
2738     { USB_DEVICE(0x04bb, 0x0515),
2739             .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
2740     { USB_DEVICE(0xeb1a, 0x50a6),
2741             .driver_info = EM2860_BOARD_GADMEI_UTV330 },
2742     { USB_DEVICE(0x1b80, 0xa340),
2743             .driver_info = EM2870_BOARD_KWORLD_A340 },
2744     { USB_DEVICE(0x1b80, 0xe346),
2745             .driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
2746     { USB_DEVICE(0x1b80, 0xe34c),
2747             .driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
2748     { USB_DEVICE(0x2013, 0x024f),
2749             .driver_info = EM28174_BOARD_PCTV_290E },
2750     { USB_DEVICE(0x2013, 0x024c),
2751             .driver_info = EM28174_BOARD_PCTV_460E },
2752     { USB_DEVICE(0x2040, 0x1605),
2753             .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
2754     { USB_DEVICE(0x1b80, 0xe755),
2755             .driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
2756     { USB_DEVICE(0xeb1a, 0x5006),
2757             .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
2758     { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
2759             .driver_info = EM2860_BOARD_EASYCAP },
2760     { USB_DEVICE(0x1b80, 0xe425),
2761             .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
2762     { USB_DEVICE(0x1f4d, 0x1abe),
2763             .driver_info = EM2860_BOARD_MYGICA_IGRABBER },
2764     { USB_DEVICE(0x2304, 0x0242),
2765             .driver_info = EM2884_BOARD_PCTV_510E },
2766     { USB_DEVICE(0x2013, 0x0251),
2767             .driver_info = EM2884_BOARD_PCTV_520E },
2768     { USB_DEVICE(0x1b80, 0xe1cc),
2769             .driver_info = EM2874_BOARD_DELOCK_61959 },
2770     { USB_DEVICE(0x1ae7, 0x9003),
2771             .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2772     { USB_DEVICE(0x1ae7, 0x9004),
2773             .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2774     { USB_DEVICE(0x2013, 0x0258),
2775             .driver_info = EM28178_BOARD_PCTV_461E },
2776     { USB_DEVICE(0x2013, 0x8258), /* Bulk transport 461e */
2777             .driver_info = EM28178_BOARD_PCTV_461E },
2778     { USB_DEVICE(0x2013, 0x0461),
2779             .driver_info = EM28178_BOARD_PCTV_461E_V2 },
2780     { USB_DEVICE(0x2013, 0x8461), /* Bulk transport 461e v2 */
2781             .driver_info = EM28178_BOARD_PCTV_461E_V2 },
2782     { USB_DEVICE(0x2013, 0x0259),
2783             .driver_info = EM28178_BOARD_PCTV_461E_V2 },
2784     { USB_DEVICE(0x2013, 0x025f),
2785             .driver_info = EM28178_BOARD_PCTV_292E },
2786     { USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */
2787             .driver_info = EM28178_BOARD_PCTV_292E },
2788     { USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD Isoc */
2789             .driver_info = EM28178_BOARD_PCTV_292E },
2790     { USB_DEVICE(0x2040, 0x8264), /* Hauppauge OEM Generic WinTV-soloHD Bulk */
2791             .driver_info = EM28178_BOARD_PCTV_292E },
2792     { USB_DEVICE(0x2040, 0x8268), /* Hauppauge Retail WinTV-soloHD Bulk */
2793             .driver_info = EM28178_BOARD_PCTV_292E },
2794     { USB_DEVICE(0x0413, 0x6f07),
2795             .driver_info = EM2861_BOARD_LEADTEK_VC100 },
2796     { USB_DEVICE(0xeb1a, 0x8179),
2797             .driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
2798     { USB_DEVICE(0x3275, 0x0085),
2799             .driver_info = EM28178_BOARD_PLEX_PX_BCUD },
2800     { USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */
2801             .driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN },
2802     { USB_DEVICE(0x1b80, 0xe349), /* Magix USB Videowandler-2 */
2803         .driver_info = EM2861_BOARD_MAGIX_VIDEOWANDLER2 },
2804     { },
2805 };
2806 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
2807 
2808 /*
2809  * EEPROM hash table for devices with generic USB IDs
2810  */
2811 static const struct em28xx_hash_table em28xx_eeprom_hash[] = {
2812     /* P/N: SA 60002070465 Tuner: TVF7533-MF */
2813     {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
2814     {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
2815     {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
2816     {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
2817     {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
2818     {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
2819     {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
2820     {0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
2821     {0x85dd871e, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},
2822 };
2823 
2824 /* I2C devicelist hash table for devices with generic USB IDs */
2825 static const struct em28xx_hash_table em28xx_i2c_hash[] = {
2826     {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
2827     {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
2828     {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
2829     {0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
2830     {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
2831     {0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
2832     {0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
2833     {0x27e10080, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},
2834 };
2835 
2836 /* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
2837 
2838 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
2839 {
2840     struct em28xx_i2c_bus *i2c_bus = ptr;
2841     struct em28xx *dev = i2c_bus->dev;
2842     int rc = 0;
2843 
2844     if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
2845         return 0;
2846 
2847     if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
2848         return 0;
2849 
2850     rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
2851 
2852     return rc;
2853 }
2854 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
2855 
2856 static inline void em28xx_set_xclk_i2c_speed(struct em28xx *dev)
2857 {
2858     const struct em28xx_board *board = &em28xx_boards[dev->model];
2859     u8 xclk = board->xclk, i2c_speed = board->i2c_speed;
2860 
2861     /*
2862      * Those are the default values for the majority of boards
2863      * Use those values if not specified otherwise at boards entry
2864      */
2865     if (!xclk)
2866         xclk = EM28XX_XCLK_IR_RC5_MODE |
2867                EM28XX_XCLK_FREQUENCY_12MHZ;
2868 
2869     em28xx_write_reg(dev, EM28XX_R0F_XCLK, xclk);
2870 
2871     if (!i2c_speed)
2872         i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2873                 EM28XX_I2C_FREQ_100_KHZ;
2874 
2875     dev->i2c_speed = i2c_speed & 0x03;
2876 
2877     if (!dev->board.is_em2800)
2878         em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, i2c_speed);
2879     msleep(50);
2880 }
2881 
2882 static inline void em28xx_set_model(struct em28xx *dev)
2883 {
2884     dev->board = em28xx_boards[dev->model];
2885     dev->has_msp34xx = dev->board.has_msp34xx;
2886     dev->is_webcam = dev->board.is_webcam;
2887 
2888     em28xx_set_xclk_i2c_speed(dev);
2889 
2890     /* Should be initialized early, for I2C to work */
2891     dev->def_i2c_bus = dev->board.def_i2c_bus;
2892 }
2893 
2894 /*
2895  * Wait until AC97_RESET reports the expected value reliably before proceeding.
2896  * We also check that two unrelated registers accesses don't return the same
2897  * value to avoid premature return.
2898  * This procedure helps ensuring AC97 register accesses are reliable.
2899  */
2900 static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,
2901                           int expected_feat)
2902 {
2903     unsigned long timeout = jiffies + msecs_to_jiffies(2000);
2904     int feat, powerdown;
2905 
2906     while (time_is_after_jiffies(timeout)) {
2907         feat = em28xx_read_ac97(dev, AC97_RESET);
2908         if (feat < 0)
2909             return feat;
2910 
2911         powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);
2912         if (powerdown < 0)
2913             return powerdown;
2914 
2915         if (feat == expected_feat && feat != powerdown)
2916             return 0;
2917 
2918         msleep(50);
2919     }
2920 
2921     dev_warn(&dev->intf->dev, "AC97 registers access is not reliable !\n");
2922     return -ETIMEDOUT;
2923 }
2924 
2925 /*
2926  * Since em28xx_pre_card_setup() requires a proper dev->model,
2927  * this won't work for boards with generic PCI IDs
2928  */
2929 static void em28xx_pre_card_setup(struct em28xx *dev)
2930 {
2931     /*
2932      * Set the initial XCLK and I2C clock values based on the board
2933      * definition
2934      */
2935     em28xx_set_xclk_i2c_speed(dev);
2936 
2937     /* request some modules */
2938     switch (dev->model) {
2939     case EM2861_BOARD_PLEXTOR_PX_TV100U:
2940         /* Sets the msp34xx I2S speed */
2941         dev->i2s_speed = 2048000;
2942         break;
2943     case EM2861_BOARD_KWORLD_PVRTV_300U:
2944     case EM2880_BOARD_KWORLD_DVB_305U:
2945         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
2946         usleep_range(10000, 11000);
2947         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
2948         usleep_range(10000, 11000);
2949         break;
2950     case EM2870_BOARD_COMPRO_VIDEOMATE:
2951         /*
2952          * TODO: someone can do some cleanup here...
2953          *   not everything's needed
2954          */
2955         em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2956         usleep_range(10000, 11000);
2957         em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
2958         usleep_range(10000, 11000);
2959         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2960         msleep(70);
2961         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
2962         msleep(70);
2963         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
2964         msleep(70);
2965         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
2966         msleep(70);
2967         break;
2968     case EM2870_BOARD_TERRATEC_XS_MT2060:
2969         /*
2970          * this device needs some gpio writes to get the DVB-T
2971          * demod work
2972          */
2973         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2974         msleep(70);
2975         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
2976         msleep(70);
2977         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2978         msleep(70);
2979         break;
2980     case EM2870_BOARD_PINNACLE_PCTV_DVB:
2981         /*
2982          * this device needs some gpio writes to get the
2983          * DVB-T demod work
2984          */
2985         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2986         msleep(70);
2987         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
2988         msleep(70);
2989         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2990         msleep(70);
2991         break;
2992     case EM2820_BOARD_GADMEI_UTV310:
2993     case EM2820_BOARD_MSI_VOX_USB_2:
2994         /* enables audio for that devices */
2995         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2996         break;
2997 
2998     case EM2882_BOARD_KWORLD_ATSC_315U:
2999         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
3000         usleep_range(10000, 11000);
3001         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3002         usleep_range(10000, 11000);
3003         em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
3004         usleep_range(10000, 11000);
3005         em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
3006         usleep_range(10000, 11000);
3007         break;
3008 
3009     case EM2860_BOARD_KAIOMY_TVNPC_U2:
3010         em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
3011         em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
3012         em28xx_write_regs(dev, 0x0d, "\x42", 1);
3013         em28xx_write_regs(dev, 0x08, "\xfd", 1);
3014         usleep_range(10000, 11000);
3015         em28xx_write_regs(dev, 0x08, "\xff", 1);
3016         usleep_range(10000, 11000);
3017         em28xx_write_regs(dev, 0x08, "\x7f", 1);
3018         usleep_range(10000, 11000);
3019         em28xx_write_regs(dev, 0x08, "\x6b", 1);
3020 
3021         break;
3022     case EM2860_BOARD_EASYCAP:
3023         em28xx_write_regs(dev, 0x08, "\xf8", 1);
3024         break;
3025 
3026     case EM2820_BOARD_IODATA_GVMVP_SZ:
3027         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
3028         msleep(70);
3029         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
3030         usleep_range(10000, 11000);
3031         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3032         msleep(70);
3033         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3034         msleep(70);
3035         break;
3036 
3037     case EM2860_BOARD_TERRATEC_GRABBY:
3038         /*
3039          * HACK?: Ensure AC97 register reading is reliable before
3040          * proceeding. In practice, this will wait about 1.6 seconds.
3041          */
3042         em28xx_wait_until_ac97_features_equals(dev, 0x6a90);
3043         break;
3044     }
3045 
3046     em28xx_gpio_set(dev, dev->board.tuner_gpio);
3047     em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3048 
3049     /* Unlock device */
3050     em28xx_set_mode(dev, EM28XX_SUSPEND);
3051 }
3052 
3053 static int em28xx_hint_board(struct em28xx *dev)
3054 {
3055     int i;
3056 
3057     if (dev->is_webcam) {
3058         if (dev->em28xx_sensor == EM28XX_MT9V011) {
3059             dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
3060         } else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
3061                dev->em28xx_sensor == EM28XX_MT9M111) {
3062             dev->model = EM2750_BOARD_UNKNOWN;
3063         }
3064         /* FIXME: IMPROVE ! */
3065 
3066         return 0;
3067     }
3068 
3069     /*
3070      * HINT method: EEPROM
3071      *
3072      * This method works only for boards with eeprom.
3073      * Uses a hash of all eeprom bytes. The hash should be
3074      * unique for a vendor/tuner pair.
3075      * There are a high chance that tuners for different
3076      * video standards produce different hashes.
3077      */
3078     for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
3079         if (dev->hash == em28xx_eeprom_hash[i].hash) {
3080             dev->model = em28xx_eeprom_hash[i].model;
3081             dev->tuner_type = em28xx_eeprom_hash[i].tuner;
3082 
3083             dev_err(&dev->intf->dev,
3084                 "Your board has no unique USB ID.\n"
3085                 "A hint were successfully done, based on eeprom hash.\n"
3086                 "This method is not 100%% failproof.\n"
3087                 "If the board were misdetected, please email this log to:\n"
3088                 "\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
3089                 "Board detected as %s\n",
3090                    em28xx_boards[dev->model].name);
3091 
3092             return 0;
3093         }
3094     }
3095 
3096     /*
3097      * HINT method: I2C attached devices
3098      *
3099      * This method works for all boards.
3100      * Uses a hash of i2c scanned devices.
3101      * Devices with the same i2c attached chips will
3102      * be considered equal.
3103      * This method is less precise than the eeprom one.
3104      */
3105 
3106     /* user did not request i2c scanning => do it now */
3107     if (!dev->i2c_hash)
3108         em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
3109 
3110     for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
3111         if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
3112             dev->model = em28xx_i2c_hash[i].model;
3113             dev->tuner_type = em28xx_i2c_hash[i].tuner;
3114             dev_err(&dev->intf->dev,
3115                 "Your board has no unique USB ID.\n"
3116                 "A hint were successfully done, based on i2c devicelist hash.\n"
3117                 "This method is not 100%% failproof.\n"
3118                 "If the board were misdetected, please email this log to:\n"
3119                 "\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
3120                 "Board detected as %s\n",
3121                 em28xx_boards[dev->model].name);
3122 
3123             return 0;
3124         }
3125     }
3126 
3127     dev_err(&dev->intf->dev,
3128         "Your board has no unique USB ID and thus need a hint to be detected.\n"
3129         "You may try to use card=<n> insmod option to workaround that.\n"
3130         "Please send an email with this log to:\n"
3131         "\tV4L Mailing List <linux-media@vger.kernel.org>\n"
3132         "Board eeprom hash is 0x%08lx\n"
3133         "Board i2c devicelist hash is 0x%08lx\n",
3134         dev->hash, dev->i2c_hash);
3135 
3136     dev_err(&dev->intf->dev,
3137         "Here is a list of valid choices for the card=<n> insmod option:\n");
3138     for (i = 0; i < em28xx_bcount; i++) {
3139         dev_err(&dev->intf->dev,
3140             "    card=%d -> %s\n", i, em28xx_boards[i].name);
3141     }
3142     return -1;
3143 }
3144 
3145 static void em28xx_card_setup(struct em28xx *dev)
3146 {
3147     int i, j, idx;
3148     bool duplicate_entry;
3149 
3150     /*
3151      * If the device can be a webcam, seek for a sensor.
3152      * If sensor is not found, then it isn't a webcam.
3153      */
3154     if (dev->is_webcam) {
3155         em28xx_detect_sensor(dev);
3156         if (dev->em28xx_sensor == EM28XX_NOSENSOR)
3157             /* NOTE: error/unknown sensor/no sensor */
3158             dev->is_webcam = 0;
3159     }
3160 
3161     switch (dev->model) {
3162     case EM2750_BOARD_UNKNOWN:
3163     case EM2820_BOARD_UNKNOWN:
3164     case EM2800_BOARD_UNKNOWN:
3165         /*
3166          * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
3167          *
3168          * This occurs because they share identical USB vendor and
3169          * product IDs.
3170          *
3171          * What we do here is look up the EEPROM hash of the K-WORLD
3172          * and if it is found then we decide that we do not have
3173          * a DIGIVOX and reset the device to the K-WORLD instead.
3174          *
3175          * This solution is only valid if they do not share eeprom
3176          * hash identities which has not been determined as yet.
3177          */
3178         if (em28xx_hint_board(dev) < 0) {
3179             dev_err(&dev->intf->dev, "Board not discovered\n");
3180         } else {
3181             em28xx_set_model(dev);
3182             em28xx_pre_card_setup(dev);
3183         }
3184         break;
3185     default:
3186         em28xx_set_model(dev);
3187     }
3188 
3189     dev_info(&dev->intf->dev, "Identified as %s (card=%d)\n",
3190          dev->board.name, dev->model);
3191 
3192     dev->tuner_type = em28xx_boards[dev->model].tuner_type;
3193 
3194     /* request some modules */
3195     switch (dev->model) {
3196     case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
3197     case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
3198     case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
3199     case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
3200     case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
3201     case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
3202     case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:
3203     case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595:
3204     {
3205         struct tveeprom tv;
3206 
3207         if (!dev->eedata)
3208             break;
3209 #if defined(CONFIG_MODULES) && defined(MODULE)
3210         request_module("tveeprom");
3211 #endif
3212         /* Call first TVeeprom */
3213 
3214         tveeprom_hauppauge_analog(&tv, dev->eedata);
3215 
3216         dev->tuner_type = tv.tuner_type;
3217 
3218         if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
3219             dev->i2s_speed = 2048000;
3220             dev->has_msp34xx = 1;
3221         }
3222         break;
3223     }
3224     case EM2882_BOARD_KWORLD_ATSC_315U:
3225         em28xx_write_reg(dev, 0x0d, 0x42);
3226         usleep_range(10000, 11000);
3227         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3228         usleep_range(10000, 11000);
3229         break;
3230     case EM2820_BOARD_KWORLD_PVRTV2800RF:
3231         /* GPIO enables sound on KWORLD PVR TV 2800RF */
3232         em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
3233         break;
3234     case EM2820_BOARD_UNKNOWN:
3235     case EM2800_BOARD_UNKNOWN:
3236         /*
3237          * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
3238          *
3239          * This occurs because they share identical USB vendor and
3240          * product IDs.
3241          *
3242          * What we do here is look up the EEPROM hash of the K-WORLD
3243          * and if it is found then we decide that we do not have
3244          * a DIGIVOX and reset the device to the K-WORLD instead.
3245          *
3246          * This solution is only valid if they do not share eeprom
3247          * hash identities which has not been determined as yet.
3248          */
3249     case EM2880_BOARD_MSI_DIGIVOX_AD:
3250         if (!em28xx_hint_board(dev))
3251             em28xx_set_model(dev);
3252 
3253         /*
3254          * In cases where we had to use a board hint, the call to
3255          * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
3256          * so make the call now so the analog GPIOs are set properly
3257          * before probing the i2c bus.
3258          */
3259         em28xx_gpio_set(dev, dev->board.tuner_gpio);
3260         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3261         break;
3262 
3263         /*
3264          * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
3265          *
3266          * This occurs because they share identical USB vendor and
3267          * product IDs.
3268          *
3269          * What we do here is look up the EEPROM hash of the Dikom
3270          * and if it is found then we decide that we do not have
3271          * a Kworld and reset the device to the Dikom instead.
3272          *
3273          * This solution is only valid if they do not share eeprom
3274          * hash identities which has not been determined as yet.
3275          */
3276     case EM2882_BOARD_KWORLD_VS_DVBT:
3277         if (!em28xx_hint_board(dev))
3278             em28xx_set_model(dev);
3279 
3280         /*
3281          * In cases where we had to use a board hint, the call to
3282          * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
3283          * so make the call now so the analog GPIOs are set properly
3284          * before probing the i2c bus.
3285          */
3286         em28xx_gpio_set(dev, dev->board.tuner_gpio);
3287         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3288         break;
3289     }
3290 
3291     if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
3292         dev_err(&dev->intf->dev,
3293             "\n\n"
3294             "The support for this board weren't valid yet.\n"
3295             "Please send a report of having this working\n"
3296             "not to V4L mailing list (and/or to other addresses)\n\n");
3297     }
3298 
3299     /* Free eeprom data memory */
3300     kfree(dev->eedata);
3301     dev->eedata = NULL;
3302 
3303     /* Allow override tuner type by a module parameter */
3304     if (tuner >= 0)
3305         dev->tuner_type = tuner;
3306 
3307     /*
3308      * Dynamically generate a list of valid audio inputs for this
3309      * specific board, mapping them via enum em28xx_amux.
3310      */
3311 
3312     idx = 0;
3313     for (i = 0; i < MAX_EM28XX_INPUT; i++) {
3314         if (!INPUT(i)->type)
3315             continue;
3316 
3317         /* Skip already mapped audio inputs */
3318         duplicate_entry = false;
3319         for (j = 0; j < idx; j++) {
3320             if (INPUT(i)->amux == dev->amux_map[j]) {
3321                 duplicate_entry = true;
3322                 break;
3323             }
3324         }
3325         if (duplicate_entry)
3326             continue;
3327 
3328         dev->amux_map[idx++] = INPUT(i)->amux;
3329     }
3330     for (; idx < MAX_EM28XX_INPUT; idx++)
3331         dev->amux_map[idx] = EM28XX_AMUX_UNUSED;
3332 }
3333 
3334 void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
3335 {
3336     memset(ctl, 0, sizeof(*ctl));
3337 
3338     ctl->fname   = XC2028_DEFAULT_FIRMWARE;
3339     ctl->max_len = 64;
3340     ctl->mts = em28xx_boards[dev->model].mts_firmware;
3341 
3342     switch (dev->model) {
3343     case EM2880_BOARD_EMPIRE_DUAL_TV:
3344     case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
3345     case EM2882_BOARD_TERRATEC_HYBRID_XS:
3346     case EM2880_BOARD_TERRATEC_HYBRID_XS:
3347     case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
3348     case EM2881_BOARD_PINNACLE_HYBRID_PRO:
3349     case EM2882_BOARD_ZOLID_HYBRID_TV_STICK:
3350         ctl->demod = XC3028_FE_ZARLINK456;
3351         break;
3352     case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
3353     case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
3354         ctl->demod = XC3028_FE_DEFAULT;
3355         break;
3356     case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
3357         ctl->demod = XC3028_FE_DEFAULT;
3358         ctl->fname = XC3028L_DEFAULT_FIRMWARE;
3359         break;
3360     case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
3361     case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
3362     case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
3363         /* FIXME: Better to specify the needed IF */
3364         ctl->demod = XC3028_FE_DEFAULT;
3365         break;
3366     case EM2883_BOARD_KWORLD_HYBRID_330U:
3367     case EM2882_BOARD_DIKOM_DK300:
3368     case EM2882_BOARD_KWORLD_VS_DVBT:
3369         ctl->demod = XC3028_FE_CHINA;
3370         ctl->fname = XC2028_DEFAULT_FIRMWARE;
3371         break;
3372     case EM2882_BOARD_EVGA_INDTUBE:
3373         ctl->demod = XC3028_FE_CHINA;
3374         ctl->fname = XC3028L_DEFAULT_FIRMWARE;
3375         break;
3376     default:
3377         ctl->demod = XC3028_FE_OREN538;
3378     }
3379 }
3380 EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);
3381 
3382 static void request_module_async(struct work_struct *work)
3383 {
3384     struct em28xx *dev = container_of(work,
3385                  struct em28xx, request_module_wk);
3386 
3387     /*
3388      * The em28xx extensions can be modules or builtin. If the
3389      * modules are already loaded or are built in, those extensions
3390      * can be initialised right now. Otherwise, the module init
3391      * code will do it.
3392      */
3393 
3394     /*
3395      * Devices with an audio-only intf also have a V4L/DVB/RC
3396      * intf. Don't register extensions twice on those devices.
3397      */
3398     if (dev->is_audio_only) {
3399 #if defined(CONFIG_MODULES) && defined(MODULE)
3400         request_module("em28xx-alsa");
3401 #endif
3402         return;
3403     }
3404 
3405     em28xx_init_extension(dev);
3406 
3407 #if defined(CONFIG_MODULES) && defined(MODULE)
3408     if (dev->has_video)
3409         request_module("em28xx-v4l");
3410     if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
3411         request_module("snd-usb-audio");
3412     else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
3413         request_module("em28xx-alsa");
3414     if (dev->board.has_dvb)
3415         request_module("em28xx-dvb");
3416     if (dev->board.buttons ||
3417         ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
3418         request_module("em28xx-rc");
3419 #endif /* CONFIG_MODULES */
3420 }
3421 
3422 static void request_modules(struct em28xx *dev)
3423 {
3424     INIT_WORK(&dev->request_module_wk, request_module_async);
3425     schedule_work(&dev->request_module_wk);
3426 }
3427 
3428 static void flush_request_modules(struct em28xx *dev)
3429 {
3430     flush_work(&dev->request_module_wk);
3431 }
3432 
3433 static int em28xx_media_device_init(struct em28xx *dev,
3434                     struct usb_device *udev)
3435 {
3436 #ifdef CONFIG_MEDIA_CONTROLLER
3437     struct media_device *mdev;
3438 
3439     mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
3440     if (!mdev)
3441         return -ENOMEM;
3442 
3443     if (udev->product)
3444         media_device_usb_init(mdev, udev, udev->product);
3445     else if (udev->manufacturer)
3446         media_device_usb_init(mdev, udev, udev->manufacturer);
3447     else
3448         media_device_usb_init(mdev, udev, dev_name(&dev->intf->dev));
3449 
3450     dev->media_dev = mdev;
3451 #endif
3452     return 0;
3453 }
3454 
3455 static void em28xx_unregister_media_device(struct em28xx *dev)
3456 {
3457 #ifdef CONFIG_MEDIA_CONTROLLER
3458     if (dev->media_dev) {
3459         media_device_unregister(dev->media_dev);
3460         media_device_cleanup(dev->media_dev);
3461         kfree(dev->media_dev);
3462         dev->media_dev = NULL;
3463     }
3464 #endif
3465 }
3466 
3467 /*
3468  * em28xx_release_resources()
3469  * unregisters the v4l2,i2c and usb devices
3470  * called when the device gets disconnected or at module unload
3471  */
3472 static void em28xx_release_resources(struct em28xx *dev)
3473 {
3474     struct usb_device *udev = interface_to_usbdev(dev->intf);
3475 
3476     /*FIXME: I2C IR should be disconnected */
3477 
3478     mutex_lock(&dev->lock);
3479 
3480     em28xx_unregister_media_device(dev);
3481 
3482     if (dev->def_i2c_bus)
3483         em28xx_i2c_unregister(dev, 1);
3484     em28xx_i2c_unregister(dev, 0);
3485 
3486     if (dev->ts == PRIMARY_TS)
3487         usb_put_dev(udev);
3488 
3489     /* Mark device as unused */
3490     clear_bit(dev->devno, em28xx_devused);
3491 
3492     mutex_unlock(&dev->lock);
3493 };
3494 
3495 /**
3496  * em28xx_free_device() - Free em28xx device
3497  *
3498  * @ref: struct kref for em28xx device
3499  *
3500  * This is called when all extensions and em28xx core unregisters a device
3501  */
3502 void em28xx_free_device(struct kref *ref)
3503 {
3504     struct em28xx *dev = kref_to_dev(ref);
3505 
3506     dev_info(&dev->intf->dev, "Freeing device\n");
3507 
3508     if (!dev->disconnected)
3509         em28xx_release_resources(dev);
3510 
3511     if (dev->ts == PRIMARY_TS)
3512         kfree(dev->alt_max_pkt_size_isoc);
3513 
3514     kfree(dev);
3515 }
3516 EXPORT_SYMBOL_GPL(em28xx_free_device);
3517 
3518 /*
3519  * em28xx_init_dev()
3520  * allocates and inits the device structs, registers i2c bus and v4l device
3521  */
3522 static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
3523                struct usb_interface *intf,
3524                int minor)
3525 {
3526     int retval;
3527     const char *chip_name = NULL;
3528 
3529     dev->intf = intf;
3530     mutex_init(&dev->ctrl_urb_lock);
3531     spin_lock_init(&dev->slock);
3532 
3533     dev->em28xx_write_regs = em28xx_write_regs;
3534     dev->em28xx_read_reg = em28xx_read_reg;
3535     dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
3536     dev->em28xx_write_regs_req = em28xx_write_regs_req;
3537     dev->em28xx_read_reg_req = em28xx_read_reg_req;
3538     dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
3539 
3540     em28xx_set_model(dev);
3541 
3542     dev->wait_after_write = 5;
3543 
3544     /* Based on the Chip ID, set the device configuration */
3545     retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
3546     if (retval > 0) {
3547         dev->chip_id = retval;
3548 
3549         switch (dev->chip_id) {
3550         case CHIP_ID_EM2800:
3551             chip_name = "em2800";
3552             break;
3553         case CHIP_ID_EM2710:
3554             chip_name = "em2710";
3555             break;
3556         case CHIP_ID_EM2750:
3557             chip_name = "em2750";
3558             break;
3559         case CHIP_ID_EM2765:
3560             chip_name = "em2765";
3561             dev->wait_after_write = 0;
3562             dev->is_em25xx = 1;
3563             dev->eeprom_addrwidth_16bit = 1;
3564             break;
3565         case CHIP_ID_EM2820:
3566             chip_name = "em2710/2820";
3567             if (le16_to_cpu(udev->descriptor.idVendor) == 0xeb1a) {
3568                 __le16 idProd = udev->descriptor.idProduct;
3569 
3570                 if (le16_to_cpu(idProd) == 0x2710)
3571                     chip_name = "em2710";
3572                 else if (le16_to_cpu(idProd) == 0x2820)
3573                     chip_name = "em2820";
3574             }
3575             /* NOTE: the em2820 is used in webcams, too ! */
3576             break;
3577         case CHIP_ID_EM2840:
3578             chip_name = "em2840";
3579             break;
3580         case CHIP_ID_EM2860:
3581             chip_name = "em2860";
3582             break;
3583         case CHIP_ID_EM2870:
3584             chip_name = "em2870";
3585             dev->wait_after_write = 0;
3586             break;
3587         case CHIP_ID_EM2874:
3588             chip_name = "em2874";
3589             dev->wait_after_write = 0;
3590             dev->eeprom_addrwidth_16bit = 1;
3591             break;
3592         case CHIP_ID_EM28174:
3593             chip_name = "em28174";
3594             dev->wait_after_write = 0;
3595             dev->eeprom_addrwidth_16bit = 1;
3596             break;
3597         case CHIP_ID_EM28178:
3598             chip_name = "em28178";
3599             dev->wait_after_write = 0;
3600             dev->eeprom_addrwidth_16bit = 1;
3601             break;
3602         case CHIP_ID_EM2883:
3603             chip_name = "em2882/3";
3604             dev->wait_after_write = 0;
3605             break;
3606         case CHIP_ID_EM2884:
3607             chip_name = "em2884";
3608             dev->wait_after_write = 0;
3609             dev->eeprom_addrwidth_16bit = 1;
3610             break;
3611         }
3612     }
3613     if (!chip_name)
3614         dev_info(&dev->intf->dev,
3615              "unknown em28xx chip ID (%d)\n", dev->chip_id);
3616     else
3617         dev_info(&dev->intf->dev, "chip ID is %s\n", chip_name);
3618 
3619     em28xx_media_device_init(dev, udev);
3620 
3621     if (dev->is_audio_only) {
3622         retval = em28xx_audio_setup(dev);
3623         if (retval) {
3624             retval = -ENODEV;
3625             goto err_deinit_media;
3626         }
3627         em28xx_init_extension(dev);
3628 
3629         return 0;
3630     }
3631 
3632     em28xx_pre_card_setup(dev);
3633 
3634     rt_mutex_init(&dev->i2c_bus_lock);
3635 
3636     /* register i2c bus 0 */
3637     if (dev->board.is_em2800)
3638         retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
3639     else
3640         retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
3641     if (retval < 0) {
3642         dev_err(&dev->intf->dev,
3643             "%s: em28xx_i2c_register bus 0 - error [%d]!\n",
3644                __func__, retval);
3645         goto err_deinit_media;
3646     }
3647 
3648     /* register i2c bus 1 */
3649     if (dev->def_i2c_bus) {
3650         if (dev->is_em25xx)
3651             retval = em28xx_i2c_register(dev, 1,
3652                              EM28XX_I2C_ALGO_EM25XX_BUS_B);
3653         else
3654             retval = em28xx_i2c_register(dev, 1,
3655                              EM28XX_I2C_ALGO_EM28XX);
3656         if (retval < 0) {
3657             dev_err(&dev->intf->dev,
3658                 "%s: em28xx_i2c_register bus 1 - error [%d]!\n",
3659                 __func__, retval);
3660 
3661             goto err_unreg_i2c;
3662         }
3663     }
3664 
3665     /* Do board specific init and eeprom reading */
3666     em28xx_card_setup(dev);
3667 
3668     return 0;
3669 
3670 err_unreg_i2c:
3671     em28xx_i2c_unregister(dev, 0);
3672 err_deinit_media:
3673     em28xx_unregister_media_device(dev);
3674     return retval;
3675 }
3676 
3677 static int em28xx_duplicate_dev(struct em28xx *dev)
3678 {
3679     int nr;
3680     struct em28xx *sec_dev = kmemdup(dev, sizeof(*sec_dev), GFP_KERNEL);
3681 
3682     if (!sec_dev) {
3683         dev->dev_next = NULL;
3684         return -ENOMEM;
3685     }
3686     /* Check to see next free device and mark as used */
3687     do {
3688         nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
3689         if (nr >= EM28XX_MAXBOARDS) {
3690             /* No free device slots */
3691             dev_warn(&dev->intf->dev, ": Supports only %i em28xx boards.\n",
3692                  EM28XX_MAXBOARDS);
3693             kfree(sec_dev);
3694             dev->dev_next = NULL;
3695             return -ENOMEM;
3696         }
3697     } while (test_and_set_bit(nr, em28xx_devused));
3698     sec_dev->devno = nr;
3699     snprintf(sec_dev->name, 28, "em28xx #%d", nr);
3700     sec_dev->dev_next = NULL;
3701     dev->dev_next = sec_dev;
3702     return 0;
3703 }
3704 
3705 /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
3706 #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3707 
3708 static void em28xx_check_usb_descriptor(struct em28xx *dev,
3709                     struct usb_device *udev,
3710                     struct usb_interface *intf,
3711                     int alt, int ep,
3712                     bool *has_vendor_audio,
3713                     bool *has_video,
3714                     bool *has_dvb)
3715 {
3716     const struct usb_endpoint_descriptor *e;
3717     int sizedescr, size;
3718 
3719     /*
3720      * NOTE:
3721      *
3722      * Old logic with support for isoc transfers only was:
3723      *  0x82    isoc        => analog
3724      *  0x83    isoc        => audio
3725      *  0x84    isoc        => digital
3726      *
3727      * New logic with support for bulk transfers
3728      *  0x82    isoc        => analog
3729      *  0x82    bulk        => analog
3730      *  0x83    isoc*       => audio
3731      *  0x84    isoc        => digital
3732      *  0x84    bulk        => analog or digital**
3733      *  0x85    isoc        => digital TS2
3734      *  0x85    bulk        => digital TS2
3735      * (*: audio should always be isoc)
3736      * (**: analog, if ep 0x82 is isoc, otherwise digital)
3737      *
3738      * The new logic preserves backwards compatibility and
3739      * reflects the endpoint configurations we have seen
3740      * so far. But there might be devices for which this
3741      * logic is not sufficient...
3742      */
3743 
3744     e = &intf->altsetting[alt].endpoint[ep].desc;
3745 
3746     if (!usb_endpoint_dir_in(e))
3747         return;
3748 
3749     sizedescr = le16_to_cpu(e->wMaxPacketSize);
3750     size = sizedescr & 0x7ff;
3751 
3752     if (udev->speed == USB_SPEED_HIGH)
3753         size = size * hb_mult(sizedescr);
3754 
3755     /* Only inspect input endpoints */
3756 
3757     switch (e->bEndpointAddress) {
3758     case 0x82:
3759         *has_video = true;
3760         if (usb_endpoint_xfer_isoc(e)) {
3761             dev->analog_ep_isoc = e->bEndpointAddress;
3762             dev->alt_max_pkt_size_isoc[alt] = size;
3763         } else if (usb_endpoint_xfer_bulk(e)) {
3764             dev->analog_ep_bulk = e->bEndpointAddress;
3765         }
3766         return;
3767     case 0x83:
3768         if (usb_endpoint_xfer_isoc(e))
3769             *has_vendor_audio = true;
3770         else
3771             dev_err(&intf->dev,
3772                 "error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
3773         return;
3774     case 0x84:
3775         if (*has_video && (usb_endpoint_xfer_bulk(e))) {
3776             dev->analog_ep_bulk = e->bEndpointAddress;
3777         } else {
3778             if (usb_endpoint_xfer_isoc(e)) {
3779                 if (size > dev->dvb_max_pkt_size_isoc) {
3780                     /*
3781                      * 2) some manufacturers (e.g. Terratec)
3782                      * disable endpoints by setting
3783                      * wMaxPacketSize to 0 bytes for all
3784                      * alt settings. So far, we've seen
3785                      * this for DVB isoc endpoints only.
3786                      */
3787                     *has_dvb = true;
3788                     dev->dvb_ep_isoc = e->bEndpointAddress;
3789                     dev->dvb_max_pkt_size_isoc = size;
3790                     dev->dvb_alt_isoc = alt;
3791                 }
3792             } else {
3793                 *has_dvb = true;
3794                 dev->dvb_ep_bulk = e->bEndpointAddress;
3795             }
3796         }
3797         return;
3798     case 0x85:
3799         if (usb_endpoint_xfer_isoc(e)) {
3800             if (size > dev->dvb_max_pkt_size_isoc_ts2) {
3801                 dev->dvb_ep_isoc_ts2 = e->bEndpointAddress;
3802                 dev->dvb_max_pkt_size_isoc_ts2 = size;
3803                 dev->dvb_alt_isoc = alt;
3804             }
3805         } else {
3806             dev->dvb_ep_bulk_ts2 = e->bEndpointAddress;
3807         }
3808         return;
3809     }
3810 }
3811 
3812 /*
3813  * em28xx_usb_probe()
3814  * checks for supported devices
3815  */
3816 static int em28xx_usb_probe(struct usb_interface *intf,
3817                 const struct usb_device_id *id)
3818 {
3819     struct usb_device *udev;
3820     struct em28xx *dev = NULL;
3821     int retval;
3822     bool has_vendor_audio = false, has_video = false, has_dvb = false;
3823     int i, nr, try_bulk;
3824     const int ifnum = intf->altsetting[0].desc.bInterfaceNumber;
3825     char *speed;
3826 
3827     udev = usb_get_dev(interface_to_usbdev(intf));
3828 
3829     /* Check to see next free device and mark as used */
3830     do {
3831         nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
3832         if (nr >= EM28XX_MAXBOARDS) {
3833             /* No free device slots */
3834             dev_err(&intf->dev,
3835                 "Driver supports up to %i em28xx boards.\n",
3836                    EM28XX_MAXBOARDS);
3837             retval = -ENOMEM;
3838             goto err_no_slot;
3839         }
3840     } while (test_and_set_bit(nr, em28xx_devused));
3841 
3842     /* Don't register audio interfaces */
3843     if (intf->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3844         dev_info(&intf->dev,
3845             "audio device (%04x:%04x): interface %i, class %i\n",
3846             le16_to_cpu(udev->descriptor.idVendor),
3847             le16_to_cpu(udev->descriptor.idProduct),
3848             ifnum,
3849             intf->altsetting[0].desc.bInterfaceClass);
3850 
3851         retval = -ENODEV;
3852         goto err;
3853     }
3854 
3855     /* allocate memory for our device state and initialize it */
3856     dev = kzalloc(sizeof(*dev), GFP_KERNEL);
3857     if (!dev) {
3858         retval = -ENOMEM;
3859         goto err;
3860     }
3861 
3862     /* compute alternate max packet sizes */
3863     dev->alt_max_pkt_size_isoc = kcalloc(intf->num_altsetting,
3864                          sizeof(dev->alt_max_pkt_size_isoc[0]),
3865                          GFP_KERNEL);
3866     if (!dev->alt_max_pkt_size_isoc) {
3867         kfree(dev);
3868         retval = -ENOMEM;
3869         goto err;
3870     }
3871 
3872     /* Get endpoints */
3873     for (i = 0; i < intf->num_altsetting; i++) {
3874         int ep;
3875 
3876         for (ep = 0;
3877              ep < intf->altsetting[i].desc.bNumEndpoints;
3878              ep++)
3879             em28xx_check_usb_descriptor(dev, udev, intf,
3880                             i, ep,
3881                             &has_vendor_audio,
3882                             &has_video,
3883                             &has_dvb);
3884     }
3885 
3886     if (!(has_vendor_audio || has_video || has_dvb)) {
3887         retval = -ENODEV;
3888         goto err_free;
3889     }
3890 
3891     switch (udev->speed) {
3892     case USB_SPEED_LOW:
3893         speed = "1.5";
3894         break;
3895     case USB_SPEED_UNKNOWN:
3896     case USB_SPEED_FULL:
3897         speed = "12";
3898         break;
3899     case USB_SPEED_HIGH:
3900         speed = "480";
3901         break;
3902     default:
3903         speed = "unknown";
3904     }
3905 
3906     dev_info(&intf->dev,
3907         "New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",
3908         udev->manufacturer ? udev->manufacturer : "",
3909         udev->product ? udev->product : "",
3910         speed,
3911         le16_to_cpu(udev->descriptor.idVendor),
3912         le16_to_cpu(udev->descriptor.idProduct),
3913         ifnum,
3914         intf->altsetting->desc.bInterfaceNumber);
3915 
3916     /*
3917      * Make sure we have 480 Mbps of bandwidth, otherwise things like
3918      * video stream wouldn't likely work, since 12 Mbps is generally
3919      * not enough even for most Digital TV streams.
3920      */
3921     if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
3922         dev_err(&intf->dev, "Device initialization failed.\n");
3923         dev_err(&intf->dev,
3924             "Device must be connected to a high-speed USB 2.0 port.\n");
3925         retval = -ENODEV;
3926         goto err_free;
3927     }
3928 
3929     kref_init(&dev->ref);
3930 
3931     dev->devno = nr;
3932     dev->model = id->driver_info;
3933     dev->alt   = -1;
3934     dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
3935     dev->has_video = has_video;
3936     dev->ifnum = ifnum;
3937 
3938     dev->ts = PRIMARY_TS;
3939     snprintf(dev->name, 28, "em28xx");
3940     dev->dev_next = NULL;
3941 
3942     if (has_vendor_audio) {
3943         dev_info(&intf->dev,
3944             "Audio interface %i found (Vendor Class)\n", ifnum);
3945         dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
3946     }
3947     /* Checks if audio is provided by a USB Audio Class intf */
3948     for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
3949         struct usb_interface *uif = udev->config->interface[i];
3950 
3951         if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3952             if (has_vendor_audio)
3953                 dev_err(&intf->dev,
3954                     "em28xx: device seems to have vendor AND usb audio class interfaces !\n"
3955                     "\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
3956             dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
3957             break;
3958         }
3959     }
3960 
3961     if (has_video)
3962         dev_info(&intf->dev, "Video interface %i found:%s%s\n",
3963             ifnum,
3964             dev->analog_ep_bulk ? " bulk" : "",
3965             dev->analog_ep_isoc ? " isoc" : "");
3966     if (has_dvb)
3967         dev_info(&intf->dev, "DVB interface %i found:%s%s\n",
3968             ifnum,
3969             dev->dvb_ep_bulk ? " bulk" : "",
3970             dev->dvb_ep_isoc ? " isoc" : "");
3971 
3972     dev->num_alt = intf->num_altsetting;
3973 
3974     if ((unsigned int)card[nr] < em28xx_bcount)
3975         dev->model = card[nr];
3976 
3977     /* save our data pointer in this intf device */
3978     usb_set_intfdata(intf, dev);
3979 
3980     /* allocate device struct and check if the device is a webcam */
3981     mutex_init(&dev->lock);
3982     retval = em28xx_init_dev(dev, udev, intf, nr);
3983     if (retval)
3984         goto err_free;
3985 
3986     if (usb_xfer_mode < 0) {
3987         if (dev->is_webcam)
3988             try_bulk = 1;
3989         else
3990             try_bulk = 0;
3991     } else {
3992         try_bulk = usb_xfer_mode > 0;
3993     }
3994 
3995     /* Disable V4L2 if the device doesn't have a decoder or image sensor */
3996     if (has_video &&
3997         dev->board.decoder == EM28XX_NODECODER &&
3998         dev->em28xx_sensor == EM28XX_NOSENSOR) {
3999         dev_err(&intf->dev,
4000             "Currently, V4L2 is not supported on this model\n");
4001         has_video = false;
4002         dev->has_video = false;
4003     }
4004 
4005     if (dev->board.has_dual_ts &&
4006         (dev->tuner_type != TUNER_ABSENT || INPUT(0)->type)) {
4007         /*
4008          * The logic with sets alternate is not ready for dual-tuners
4009          * which analog modes.
4010          */
4011         dev_err(&intf->dev,
4012             "We currently don't support analog TV or stream capture on dual tuners.\n");
4013         has_video = false;
4014     }
4015 
4016     /* Select USB transfer types to use */
4017     if (has_video) {
4018         if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
4019             dev->analog_xfer_bulk = 1;
4020         dev_info(&intf->dev, "analog set to %s mode.\n",
4021             dev->analog_xfer_bulk ? "bulk" : "isoc");
4022     }
4023     if (has_dvb) {
4024         if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
4025             dev->dvb_xfer_bulk = 1;
4026         dev_info(&intf->dev, "dvb set to %s mode.\n",
4027             dev->dvb_xfer_bulk ? "bulk" : "isoc");
4028     }
4029 
4030     if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) {
4031         kref_init(&dev->dev_next->ref);
4032 
4033         dev->dev_next->ts = SECONDARY_TS;
4034         dev->dev_next->alt   = -1;
4035         dev->dev_next->is_audio_only = has_vendor_audio &&
4036                         !(has_video || has_dvb);
4037         dev->dev_next->has_video = false;
4038         dev->dev_next->ifnum = ifnum;
4039         dev->dev_next->model = id->driver_info;
4040 
4041         mutex_init(&dev->dev_next->lock);
4042         retval = em28xx_init_dev(dev->dev_next, udev, intf,
4043                      dev->dev_next->devno);
4044         if (retval)
4045             goto err_free;
4046 
4047         dev->dev_next->board.ir_codes = NULL; /* No IR for 2nd tuner */
4048         dev->dev_next->board.has_ir_i2c = 0; /* No IR for 2nd tuner */
4049 
4050         if (usb_xfer_mode < 0) {
4051             if (dev->dev_next->is_webcam)
4052                 try_bulk = 1;
4053             else
4054                 try_bulk = 0;
4055         } else {
4056             try_bulk = usb_xfer_mode > 0;
4057         }
4058 
4059         /* Select USB transfer types to use */
4060         if (has_dvb) {
4061             if (!dev->dvb_ep_isoc_ts2 ||
4062                 (try_bulk && dev->dvb_ep_bulk_ts2))
4063                 dev->dev_next->dvb_xfer_bulk = 1;
4064             dev_info(&dev->intf->dev, "dvb ts2 set to %s mode.\n",
4065                  dev->dev_next->dvb_xfer_bulk ? "bulk" : "isoc");
4066         }
4067 
4068         dev->dev_next->dvb_ep_isoc = dev->dvb_ep_isoc_ts2;
4069         dev->dev_next->dvb_ep_bulk = dev->dvb_ep_bulk_ts2;
4070         dev->dev_next->dvb_max_pkt_size_isoc = dev->dvb_max_pkt_size_isoc_ts2;
4071         dev->dev_next->dvb_alt_isoc = dev->dvb_alt_isoc;
4072 
4073         /* Configure hardware to support TS2*/
4074         if (dev->dvb_xfer_bulk) {
4075             /* The ep4 and ep5 are configured for BULK */
4076             em28xx_write_reg(dev, 0x0b, 0x96);
4077             mdelay(100);
4078             em28xx_write_reg(dev, 0x0b, 0x80);
4079             mdelay(100);
4080         } else {
4081             /* The ep4 and ep5 are configured for ISO */
4082             em28xx_write_reg(dev, 0x0b, 0x96);
4083             mdelay(100);
4084             em28xx_write_reg(dev, 0x0b, 0x82);
4085             mdelay(100);
4086         }
4087     }
4088 
4089     request_modules(dev);
4090 
4091     /*
4092      * Do it at the end, to reduce dynamic configuration changes during
4093      * the device init. Yet, as request_modules() can be async, the
4094      * topology will likely change after the load of the em28xx subdrivers.
4095      */
4096 #ifdef CONFIG_MEDIA_CONTROLLER
4097     retval = media_device_register(dev->media_dev);
4098 #endif
4099 
4100     return 0;
4101 
4102 err_free:
4103     kfree(dev->alt_max_pkt_size_isoc);
4104     kfree(dev);
4105 
4106 err:
4107     clear_bit(nr, em28xx_devused);
4108 
4109 err_no_slot:
4110     usb_put_dev(udev);
4111     return retval;
4112 }
4113 
4114 /*
4115  * em28xx_usb_disconnect()
4116  * called when the device gets disconnected
4117  * video device will be unregistered on v4l2_close in case it is still open
4118  */
4119 static void em28xx_usb_disconnect(struct usb_interface *intf)
4120 {
4121     struct em28xx *dev;
4122 
4123     dev = usb_get_intfdata(intf);
4124     usb_set_intfdata(intf, NULL);
4125 
4126     if (!dev)
4127         return;
4128 
4129     if (dev->dev_next) {
4130         dev->dev_next->disconnected = 1;
4131         dev_info(&dev->intf->dev, "Disconnecting %s\n",
4132              dev->dev_next->name);
4133     }
4134 
4135     dev->disconnected = 1;
4136 
4137     dev_info(&dev->intf->dev, "Disconnecting %s\n", dev->name);
4138 
4139     flush_request_modules(dev);
4140 
4141     em28xx_close_extension(dev);
4142 
4143     if (dev->dev_next)
4144         em28xx_release_resources(dev->dev_next);
4145     em28xx_release_resources(dev);
4146 
4147     if (dev->dev_next) {
4148         kref_put(&dev->dev_next->ref, em28xx_free_device);
4149         dev->dev_next = NULL;
4150     }
4151     kref_put(&dev->ref, em28xx_free_device);
4152 }
4153 
4154 static int em28xx_usb_suspend(struct usb_interface *intf,
4155                   pm_message_t message)
4156 {
4157     struct em28xx *dev;
4158 
4159     dev = usb_get_intfdata(intf);
4160     if (!dev)
4161         return 0;
4162     em28xx_suspend_extension(dev);
4163     return 0;
4164 }
4165 
4166 static int em28xx_usb_resume(struct usb_interface *intf)
4167 {
4168     struct em28xx *dev;
4169 
4170     dev = usb_get_intfdata(intf);
4171     if (!dev)
4172         return 0;
4173     em28xx_resume_extension(dev);
4174     return 0;
4175 }
4176 
4177 static struct usb_driver em28xx_usb_driver = {
4178     .name = "em28xx",
4179     .probe = em28xx_usb_probe,
4180     .disconnect = em28xx_usb_disconnect,
4181     .suspend = em28xx_usb_suspend,
4182     .resume = em28xx_usb_resume,
4183     .reset_resume = em28xx_usb_resume,
4184     .id_table = em28xx_id_table,
4185 };
4186 
4187 module_usb_driver(em28xx_usb_driver);