Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/media/video/em28xx/em28xx-cards.c (Version 2.6.25.8) and /linux/drivers/media/video/em28xx/em28xx-cards.c (Version 2.6.31.13)


  1 /*                                                  1 /*
  2    em28xx-cards.c - driver for Empia EM2800/EM      2    em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
  3                     video capture devices           3                     video capture devices
  4                                                     4 
  5    Copyright (C) 2005 Ludovico Cavedon <cavedo      5    Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
  6                       Markus Rechberger <mrech      6                       Markus Rechberger <mrechberger@gmail.com>
  7                       Mauro Carvalho Chehab <m      7                       Mauro Carvalho Chehab <mchehab@infradead.org>
  8                       Sascha Sommer <saschasom      8                       Sascha Sommer <saschasommer@freenet.de>
  9                                                     9 
 10    This program is free software; you can redi     10    This program is free software; you can redistribute it and/or modify
 11    it under the terms of the GNU General Publi     11    it under the terms of the GNU General Public License as published by
 12    the Free Software Foundation; either versio     12    the Free Software Foundation; either version 2 of the License, or
 13    (at your option) any later version.             13    (at your option) any later version.
 14                                                    14 
 15    This program is distributed in the hope tha     15    This program is distributed in the hope that it will be useful,
 16    but WITHOUT ANY WARRANTY; without even the      16    but WITHOUT ANY WARRANTY; without even the implied warranty of
 17    MERCHANTABILITY or FITNESS FOR A PARTICULAR     17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 18    GNU General Public License for more details     18    GNU General Public License for more details.
 19                                                    19 
 20    You should have received a copy of the GNU      20    You should have received a copy of the GNU General Public License
 21    along with this program; if not, write to t     21    along with this program; if not, write to the Free Software
 22    Foundation, Inc., 675 Mass Ave, Cambridge,      22    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 23  */                                                23  */
 24                                                    24 
 25 #include <linux/init.h>                            25 #include <linux/init.h>
 26 #include <linux/module.h>                          26 #include <linux/module.h>
 27 #include <linux/delay.h>                           27 #include <linux/delay.h>
 28 #include <linux/i2c.h>                             28 #include <linux/i2c.h>
 29 #include <linux/usb.h>                             29 #include <linux/usb.h>
 30 #include <media/tuner.h>                           30 #include <media/tuner.h>
 31 #include <media/msp3400.h>                         31 #include <media/msp3400.h>
 32 #include <media/saa7115.h>                         32 #include <media/saa7115.h>
 33 #include <media/tvp5150.h>                         33 #include <media/tvp5150.h>
                                                   >>  34 #include <media/tvaudio.h>
                                                   >>  35 #include <media/i2c-addr.h>
 34 #include <media/tveeprom.h>                        36 #include <media/tveeprom.h>
 35 #include <media/audiochip.h>                   << 
 36 #include <media/v4l2-common.h>                     37 #include <media/v4l2-common.h>
                                                   >>  38 #include <media/v4l2-chip-ident.h>
 37                                                    39 
 38 #include "em28xx.h"                                40 #include "em28xx.h"
 39 #include "tuner-xc2028.h"                      !!  41 
                                                   >>  42 #define DRIVER_NAME         "em28xx"
 40                                                    43 
 41 static int tuner = -1;                             44 static int tuner = -1;
 42 module_param(tuner, int, 0444);                    45 module_param(tuner, int, 0444);
 43 MODULE_PARM_DESC(tuner, "tuner type");             46 MODULE_PARM_DESC(tuner, "tuner type");
 44                                                    47 
 45 static unsigned int disable_ir;                    48 static unsigned int disable_ir;
 46 module_param(disable_ir, int, 0444);               49 module_param(disable_ir, int, 0444);
 47 MODULE_PARM_DESC(disable_ir, "disable infrared     50 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
 48                                                    51 
                                                   >>  52 static unsigned int disable_usb_speed_check;
                                                   >>  53 module_param(disable_usb_speed_check, int, 0444);
                                                   >>  54 MODULE_PARM_DESC(disable_usb_speed_check,
                                                   >>  55                  "override min bandwidth requirement of 480M bps");
                                                   >>  56 
                                                   >>  57 static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
                                                   >>  58 module_param_array(card,  int, NULL, 0444);
                                                   >>  59 MODULE_PARM_DESC(card,     "card type");
                                                   >>  60 
                                                   >>  61 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS */
                                                   >>  62 static unsigned long em28xx_devused;
                                                   >>  63 
 49 struct em28xx_hash_table {                         64 struct em28xx_hash_table {
 50         unsigned long hash;                        65         unsigned long hash;
 51         unsigned int  model;                       66         unsigned int  model;
 52         unsigned int  tuner;                       67         unsigned int  tuner;
 53 };                                                 68 };
 54                                                    69 
 55 /* Boards supported by driver */               !!  70 /*
                                                   >>  71  *  Reset sequences for analog/digital modes
                                                   >>  72  */
                                                   >>  73 
                                                   >>  74 /* Reset for the most [analog] boards */
                                                   >>  75 static struct em28xx_reg_seq default_analog[] = {
                                                   >>  76         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
                                                   >>  77         {       -1,             -1,     -1,             -1},
                                                   >>  78 };
                                                   >>  79 
                                                   >>  80 /* Reset for the most [digital] boards */
                                                   >>  81 static struct em28xx_reg_seq default_digital[] = {
                                                   >>  82         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
                                                   >>  83         {       -1,             -1,     -1,             -1},
                                                   >>  84 };
                                                   >>  85 
                                                   >>  86 /* Board Hauppauge WinTV HVR 900 analog */
                                                   >>  87 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
                                                   >>  88         {EM28XX_R08_GPIO,       0x2d,   ~EM_GPIO_4,     10},
                                                   >>  89         {0x05,                  0xff,   0x10,           10},
                                                   >>  90         {  -1,                  -1,     -1,             -1},
                                                   >>  91 };
                                                   >>  92 
                                                   >>  93 /* Board Hauppauge WinTV HVR 900 digital */
                                                   >>  94 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
                                                   >>  95         {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
                                                   >>  96         {EM2880_R04_GPO,        0x04,   0x0f,           10},
                                                   >>  97         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
                                                   >>  98         { -1,                   -1,     -1,             -1},
                                                   >>  99 };
                                                   >> 100 
                                                   >> 101 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
                                                   >> 102 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
                                                   >> 103         {EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,      10},
                                                   >> 104         {       -1,             -1,     -1,              -1},
                                                   >> 105 };
                                                   >> 106 
                                                   >> 107 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
                                                   >> 108 
                                                   >> 109 /* Board  - EM2870 Kworld 355u
                                                   >> 110    Analog - No input analog */
                                                   >> 111 
                                                   >> 112 /* Board - EM2882 Kworld 315U digital */
                                                   >> 113 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
                                                   >> 114         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
                                                   >> 115         {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
                                                   >> 116         {EM2880_R04_GPO,        0x04,   0xff,           10},
                                                   >> 117         {EM2880_R04_GPO,        0x0c,   0xff,           10},
                                                   >> 118         {EM28XX_R08_GPIO,       0x7e,   0xff,           10},
                                                   >> 119         {  -1,                  -1,     -1,             -1},
                                                   >> 120 };
                                                   >> 121 
                                                   >> 122 static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
                                                   >> 123         {EM2880_R04_GPO,        0x08,   0xff,           10},
                                                   >> 124         {EM2880_R04_GPO,        0x0c,   0xff,           10},
                                                   >> 125         {EM2880_R04_GPO,        0x08,   0xff,           10},
                                                   >> 126         {EM2880_R04_GPO,        0x0c,   0xff,           10},
                                                   >> 127         {  -1,                  -1,     -1,             -1},
                                                   >> 128 };
                                                   >> 129 
                                                   >> 130 static struct em28xx_reg_seq kworld_330u_analog[] = {
                                                   >> 131         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
                                                   >> 132         {EM2880_R04_GPO,        0x00,   0xff,           10},
                                                   >> 133         { -1,                   -1,     -1,             -1},
                                                   >> 134 };
                                                   >> 135 
                                                   >> 136 static struct em28xx_reg_seq kworld_330u_digital[] = {
                                                   >> 137         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
                                                   >> 138         {EM2880_R04_GPO,        0x08,   0xff,           10},
                                                   >> 139         { -1,                   -1,     -1,             -1},
                                                   >> 140 };
                                                   >> 141 
                                                   >> 142 /* Evga inDtube
                                                   >> 143    GPIO0 - Enable digital power (s5h1409) - low to enable
                                                   >> 144    GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
                                                   >> 145    GPIO4 - xc3028 reset
                                                   >> 146    GOP3  - s5h1409 reset
                                                   >> 147  */
                                                   >> 148 static struct em28xx_reg_seq evga_indtube_analog[] = {
                                                   >> 149         {EM28XX_R08_GPIO,       0x79,   0xff,           60},
                                                   >> 150         {       -1,             -1,     -1,             -1},
                                                   >> 151 };
                                                   >> 152 
                                                   >> 153 static struct em28xx_reg_seq evga_indtube_digital[] = {
                                                   >> 154         {EM28XX_R08_GPIO,       0x7a,   0xff,            1},
                                                   >> 155         {EM2880_R04_GPO,        0x04,   0xff,           10},
                                                   >> 156         {EM2880_R04_GPO,        0x0c,   0xff,            1},
                                                   >> 157         { -1,                   -1,     -1,             -1},
                                                   >> 158 };
                                                   >> 159 
                                                   >> 160 /* Pinnacle Hybrid Pro eb1a:2881 */
                                                   >> 161 static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
                                                   >> 162         {EM28XX_R08_GPIO,       0xfd,   ~EM_GPIO_4,     10},
                                                   >> 163         {       -1,             -1,     -1,             -1},
                                                   >> 164 };
                                                   >> 165 
                                                   >> 166 static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
                                                   >> 167         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
                                                   >> 168         {EM2880_R04_GPO,        0x04,   0xff,          100},/* zl10353 reset */
                                                   >> 169         {EM2880_R04_GPO,        0x0c,   0xff,            1},
                                                   >> 170         {       -1,             -1,     -1,             -1},
                                                   >> 171 };
                                                   >> 172 
                                                   >> 173 
                                                   >> 174 /* Callback for the most boards */
                                                   >> 175 static struct em28xx_reg_seq default_tuner_gpio[] = {
                                                   >> 176         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
                                                   >> 177         {EM28XX_R08_GPIO,       0,              EM_GPIO_4,      10},
                                                   >> 178         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
                                                   >> 179         {  -1,                  -1,             -1,             -1},
                                                   >> 180 };
                                                   >> 181 
                                                   >> 182 /* Mute/unmute */
                                                   >> 183 static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
                                                   >> 184         {EM28XX_R08_GPIO,       5,              7,              10},
                                                   >> 185         {  -1,                  -1,             -1,             -1},
                                                   >> 186 };
                                                   >> 187 
                                                   >> 188 static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
                                                   >> 189         {EM28XX_R08_GPIO,       4,              7,              10},
                                                   >> 190         {  -1,                  -1,             -1,             -1},
                                                   >> 191 };
 56                                                   192 
 57 #define EM2800_BOARD_UNKNOWN                   !! 193 static struct em28xx_reg_seq compro_mute_gpio[] = {
 58 #define EM2820_BOARD_UNKNOWN                   !! 194         {EM28XX_R08_GPIO,       6,              7,              10},
 59 #define EM2820_BOARD_TERRATEC_CINERGY_250      !! 195         {  -1,                  -1,             -1,             -1},
 60 #define EM2820_BOARD_PINNACLE_USB_2            !! 196 };
 61 #define EM2820_BOARD_HAUPPAUGE_WINTV_USB_2     !! 197 
 62 #define EM2820_BOARD_MSI_VOX_USB_2             !! 198 /* Terratec AV350 */
 63 #define EM2800_BOARD_TERRATEC_CINERGY_200      !! 199 static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
 64 #define EM2800_BOARD_LEADTEK_WINFAST_USBII     !! 200         {EM28XX_R08_GPIO,       0xff,   0x7f,           10},
 65 #define EM2800_BOARD_KWORLD_USB2800            !! 201         {       -1,             -1,     -1,             -1},
 66 #define EM2820_BOARD_PINNACLE_DVC_90           !! 202 };
 67 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900   !! 203 
 68 #define EM2880_BOARD_TERRATEC_HYBRID_XS        !! 204 static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
 69 #define EM2820_BOARD_KWORLD_PVRTV2800RF        !! 205         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
 70 #define EM2880_BOARD_TERRATEC_PRODIGY_XS       !! 206         {       -1,             -1,     -1,             -1},
 71 #define EM2820_BOARD_PROLINK_PLAYTV_USB2       !! 207 };
 72 #define EM2800_BOARD_VGEAR_POCKETTV            !! 208 
 73 #define EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950   !! 209 static struct em28xx_reg_seq silvercrest_reg_seq[] = {
                                                   >> 210         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
                                                   >> 211         {EM28XX_R08_GPIO,       0x01,   0xf7,           10},
                                                   >> 212         {       -1,             -1,     -1,             -1},
                                                   >> 213 };
 74                                                   214 
                                                   >> 215 /*
                                                   >> 216  *  Board definitions
                                                   >> 217  */
 75 struct em28xx_board em28xx_boards[] = {           218 struct em28xx_board em28xx_boards[] = {
                                                   >> 219         [EM2750_BOARD_UNKNOWN] = {
                                                   >> 220                 .name          = "EM2710/EM2750/EM2751 webcam grabber",
                                                   >> 221                 .xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,
                                                   >> 222                 .tuner_type    = TUNER_ABSENT,
                                                   >> 223                 .is_webcam     = 1,
                                                   >> 224                 .input         = { {
                                                   >> 225                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 226                         .vmux     = 0,
                                                   >> 227                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 228                         .gpio     = silvercrest_reg_seq,
                                                   >> 229                 } },
                                                   >> 230         },
 76         [EM2800_BOARD_UNKNOWN] = {                231         [EM2800_BOARD_UNKNOWN] = {
 77                 .name         = "Unknown EM280    232                 .name         = "Unknown EM2800 video grabber",
 78                 .is_em2800    = 1,                233                 .is_em2800    = 1,
 79                 .vchannels    = 2,             << 
 80                 .tda9887_conf = TDA9887_PRESEN    234                 .tda9887_conf = TDA9887_PRESENT,
 81                 .decoder      = EM28XX_SAA7113 !! 235                 .decoder      = EM28XX_SAA711X,
 82                 .input           = { {         !! 236                 .tuner_type   = TUNER_ABSENT,
                                                   >> 237                 .input        = { {
 83                         .type     = EM28XX_VMU    238                         .type     = EM28XX_VMUX_COMPOSITE1,
 84                         .vmux     = SAA7115_CO    239                         .vmux     = SAA7115_COMPOSITE0,
 85                         .amux     = 1,         !! 240                         .amux     = EM28XX_AMUX_LINE_IN,
 86                 }, {                              241                 }, {
 87                         .type     = EM28XX_VMU    242                         .type     = EM28XX_VMUX_SVIDEO,
 88                         .vmux     = SAA7115_SV    243                         .vmux     = SAA7115_SVIDEO3,
 89                         .amux     = 1,         !! 244                         .amux     = EM28XX_AMUX_LINE_IN,
 90                 } },                              245                 } },
 91         },                                        246         },
 92         [EM2820_BOARD_UNKNOWN] = {                247         [EM2820_BOARD_UNKNOWN] = {
 93                 .name         = "Unknown EM275 !! 248                 .name          = "Unknown EM2750/28xx video grabber",
 94                 .is_em2800    = 0,             !! 249                 .tuner_type    = TUNER_ABSENT,
 95                 .tuner_type   = TUNER_ABSENT,  !! 250                 .is_webcam     = 1,     /* To enable sensor probe */
                                                   >> 251         },
                                                   >> 252         [EM2750_BOARD_DLCW_130] = {
                                                   >> 253                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
                                                   >> 254                 .name          = "Huaqi DLCW-130",
                                                   >> 255                 .valid         = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 256                 .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
                                                   >> 257                 .tuner_type    = TUNER_ABSENT,
                                                   >> 258                 .is_webcam     = 1,
                                                   >> 259                 .input         = { {
                                                   >> 260                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 261                         .vmux     = 0,
                                                   >> 262                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 263                 } },
 96         },                                        264         },
 97         [EM2820_BOARD_KWORLD_PVRTV2800RF] = {     265         [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
 98                 .name         = "Kworld PVR TV    266                 .name         = "Kworld PVR TV 2800 RF",
 99                 .is_em2800    = 0,             << 
100                 .vchannels    = 2,             << 
101                 .tuner_type   = TUNER_TEMIC_PA    267                 .tuner_type   = TUNER_TEMIC_PAL,
102                 .tda9887_conf = TDA9887_PRESEN    268                 .tda9887_conf = TDA9887_PRESENT,
103                 .decoder      = EM28XX_SAA7113 !! 269                 .decoder      = EM28XX_SAA711X,
104                 .input           = { {         !! 270                 .input        = { {
                                                   >> 271                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 272                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 273                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 274                 }, {
                                                   >> 275                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 276                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 277                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 278                 } },
                                                   >> 279         },
                                                   >> 280         [EM2820_BOARD_GADMEI_TVR200] = {
                                                   >> 281                 .name         = "Gadmei TVR200",
                                                   >> 282                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
                                                   >> 283                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 284                 .decoder      = EM28XX_SAA711X,
                                                   >> 285                 .input        = { {
                                                   >> 286                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 287                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 288                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 289                 }, {
105                         .type     = EM28XX_VMU    290                         .type     = EM28XX_VMUX_COMPOSITE1,
106                         .vmux     = SAA7115_CO    291                         .vmux     = SAA7115_COMPOSITE0,
107                         .amux     = 1,         !! 292                         .amux     = EM28XX_AMUX_LINE_IN,
108                 }, {                              293                 }, {
109                         .type     = EM28XX_VMU    294                         .type     = EM28XX_VMUX_SVIDEO,
110                         .vmux     = SAA7115_SV    295                         .vmux     = SAA7115_SVIDEO3,
111                         .amux     = 1,         !! 296                         .amux     = EM28XX_AMUX_LINE_IN,
112                 } },                              297                 } },
113         },                                        298         },
114         [EM2820_BOARD_TERRATEC_CINERGY_250] =     299         [EM2820_BOARD_TERRATEC_CINERGY_250] = {
115                 .name         = "Terratec Cine    300                 .name         = "Terratec Cinergy 250 USB",
116                 .vchannels    = 3,             << 
117                 .tuner_type   = TUNER_LG_PAL_N    301                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
118                 .tda9887_conf = TDA9887_PRESEN    302                 .tda9887_conf = TDA9887_PRESENT,
119                 .decoder      = EM28XX_SAA7113 !! 303                 .decoder      = EM28XX_SAA711X,
120                 .input          = { {          !! 304                 .input        = { {
121                         .type     = EM28XX_VMU    305                         .type     = EM28XX_VMUX_TELEVISION,
122                         .vmux     = SAA7115_CO    306                         .vmux     = SAA7115_COMPOSITE2,
123                         .amux     = 1,         !! 307                         .amux     = EM28XX_AMUX_LINE_IN,
124                 }, {                              308                 }, {
125                         .type     = EM28XX_VMU    309                         .type     = EM28XX_VMUX_COMPOSITE1,
126                         .vmux     = SAA7115_CO    310                         .vmux     = SAA7115_COMPOSITE0,
127                         .amux     = 1,         !! 311                         .amux     = EM28XX_AMUX_LINE_IN,
128                 }, {                              312                 }, {
129                         .type     = EM28XX_VMU    313                         .type     = EM28XX_VMUX_SVIDEO,
130                         .vmux     = SAA7115_SV    314                         .vmux     = SAA7115_SVIDEO3,
131                         .amux     = 1,         !! 315                         .amux     = EM28XX_AMUX_LINE_IN,
132                 } },                              316                 } },
133         },                                        317         },
134         [EM2820_BOARD_PINNACLE_USB_2] = {         318         [EM2820_BOARD_PINNACLE_USB_2] = {
135                 .name         = "Pinnacle PCTV    319                 .name         = "Pinnacle PCTV USB 2",
136                 .vchannels    = 3,             << 
137                 .tuner_type   = TUNER_LG_PAL_N    320                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
138                 .tda9887_conf = TDA9887_PRESEN    321                 .tda9887_conf = TDA9887_PRESENT,
139                 .decoder      = EM28XX_SAA7113 !! 322                 .decoder      = EM28XX_SAA711X,
140                 .input          = { {          !! 323                 .input        = { {
141                         .type     = EM28XX_VMU    324                         .type     = EM28XX_VMUX_TELEVISION,
142                         .vmux     = SAA7115_CO    325                         .vmux     = SAA7115_COMPOSITE2,
143                         .amux     = 0,         !! 326                         .amux     = EM28XX_AMUX_VIDEO,
144                 }, {                              327                 }, {
145                         .type     = EM28XX_VMU    328                         .type     = EM28XX_VMUX_COMPOSITE1,
146                         .vmux     = SAA7115_CO    329                         .vmux     = SAA7115_COMPOSITE0,
147                         .amux     = 1,         !! 330                         .amux     = EM28XX_AMUX_LINE_IN,
148                 }, {                              331                 }, {
149                         .type     = EM28XX_VMU    332                         .type     = EM28XX_VMUX_SVIDEO,
150                         .vmux     = SAA7115_SV    333                         .vmux     = SAA7115_SVIDEO3,
151                         .amux     = 1,         !! 334                         .amux     = EM28XX_AMUX_LINE_IN,
152                 } },                              335                 } },
153         },                                        336         },
154         [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] =    337         [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
155                 .name         = "Hauppauge Win    338                 .name         = "Hauppauge WinTV USB 2",
156                 .vchannels    = 3,             << 
157                 .tuner_type   = TUNER_PHILIPS_    339                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
158                 .tda9887_conf = TDA9887_PRESEN    340                 .tda9887_conf = TDA9887_PRESENT |
159                                 TDA9887_PORT1_ !! 341                                 TDA9887_PORT1_ACTIVE |
160                                 TDA9887_PORT2_    342                                 TDA9887_PORT2_ACTIVE,
161                 .decoder      = EM28XX_TVP5150    343                 .decoder      = EM28XX_TVP5150,
162                 .has_msp34xx  = 1,                344                 .has_msp34xx  = 1,
163                 /*FIXME: S-Video not tested */ !! 345                 .input        = { {
164                 .input          = { {          << 
165                         .type     = EM28XX_VMU    346                         .type     = EM28XX_VMUX_TELEVISION,
166                         .vmux     = TVP5150_CO    347                         .vmux     = TVP5150_COMPOSITE0,
167                         .amux     = MSP_INPUT_    348                         .amux     = MSP_INPUT_DEFAULT,
168                 }, {                              349                 }, {
169                         .type     = EM28XX_VMU    350                         .type     = EM28XX_VMUX_SVIDEO,
170                         .vmux     = TVP5150_SV    351                         .vmux     = TVP5150_SVIDEO,
171                         .amux     = MSP_INPUT(    352                         .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
172                                         MSP_DS    353                                         MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
173                 } },                              354                 } },
174         },                                        355         },
175         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] !! 356         [EM2820_BOARD_DLINK_USB_TV] = {
176                 .name         = "Hauppauge Win !! 357                 .name         = "D-Link DUB-T210 TV Tuner",
177                 .vchannels    = 3,             !! 358                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 359                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
178                 .tda9887_conf = TDA9887_PRESEN    360                 .tda9887_conf = TDA9887_PRESENT,
179                 .tuner_type   = TUNER_XC2028,  !! 361                 .decoder      = EM28XX_SAA711X,
180                 .mts_firmware = 1,             !! 362                 .input        = { {
181                 .decoder      = EM28XX_TVP5150 << 
182                 .input          = { {          << 
183                         .type     = EM28XX_VMU << 
184                         .vmux     = TVP5150_CO << 
185                         .amux     = 0,         << 
186                 }, {                           << 
187                         .type     = EM28XX_VMU << 
188                         .vmux     = TVP5150_CO << 
189                         .amux     = 1,         << 
190                 }, {                           << 
191                         .type     = EM28XX_VMU << 
192                         .vmux     = TVP5150_SV << 
193                         .amux     = 1,         << 
194                 } },                           << 
195         },                                     << 
196         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950] << 
197                 .name           = "Hauppauge W << 
198                 .vchannels      = 3,           << 
199                 .tda9887_conf   = TDA9887_PRES << 
200                 .tuner_type     = TUNER_XC2028 << 
201                 .mts_firmware   = 1,           << 
202                 .has_12mhz_i2s  = 1,           << 
203                 .decoder        = EM28XX_TVP51 << 
204                 .input          = { {          << 
205                         .type     = EM28XX_VMU    363                         .type     = EM28XX_VMUX_TELEVISION,
206                         .vmux     = TVP5150_CO !! 364                         .vmux     = SAA7115_COMPOSITE2,
207                         .amux     = 0,         !! 365                         .amux     = EM28XX_AMUX_LINE_IN,
208                 }, {                              366                 }, {
209                         .type     = EM28XX_VMU    367                         .type     = EM28XX_VMUX_COMPOSITE1,
210                         .vmux     = TVP5150_CO !! 368                         .vmux     = SAA7115_COMPOSITE0,
211                         .amux     = 1,         !! 369                         .amux     = EM28XX_AMUX_LINE_IN,
212                 }, {                              370                 }, {
213                         .type     = EM28XX_VMU    371                         .type     = EM28XX_VMUX_SVIDEO,
214                         .vmux     = TVP5150_SV !! 372                         .vmux     = SAA7115_SVIDEO3,
215                         .amux     = 1,         !! 373                         .amux     = EM28XX_AMUX_LINE_IN,
216                 } },                              374                 } },
217                                                << 
218                 /* gpio's 4, 1, 0 */           << 
219                 .analog_gpio = 0x003d2d,       << 
220         },                                        375         },
221         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {  !! 376         [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
222                 .name         = "Terratec Hybr !! 377                 .name         = "Hercules Smart TV USB 2.0",
223                 .vchannels    = 3,             !! 378                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 379                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
224                 .tda9887_conf = TDA9887_PRESEN    380                 .tda9887_conf = TDA9887_PRESENT,
225                 .tuner_type   = TUNER_XC2028,  !! 381                 .decoder      = EM28XX_SAA711X,
226                 .decoder      = EM28XX_TVP5150 !! 382                 .input        = { {
227                 .input          = { {          << 
228                         .type     = EM28XX_VMU    383                         .type     = EM28XX_VMUX_TELEVISION,
229                         .vmux     = TVP5150_CO !! 384                         .vmux     = SAA7115_COMPOSITE2,
230                         .amux     = 0,         !! 385                         .amux     = EM28XX_AMUX_LINE_IN,
231                 }, {                              386                 }, {
232                         .type     = EM28XX_VMU    387                         .type     = EM28XX_VMUX_COMPOSITE1,
233                         .vmux     = TVP5150_CO !! 388                         .vmux     = SAA7115_COMPOSITE0,
234                         .amux     = 1,         !! 389                         .amux     = EM28XX_AMUX_LINE_IN,
235                 }, {                              390                 }, {
236                         .type     = EM28XX_VMU    391                         .type     = EM28XX_VMUX_SVIDEO,
237                         .vmux     = TVP5150_SV !! 392                         .vmux     = SAA7115_SVIDEO3,
238                         .amux     = 1,         !! 393                         .amux     = EM28XX_AMUX_LINE_IN,
239                 } },                              394                 } },
240         },                                        395         },
241         /* maybe there's a reason behind it wh !! 396         [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
242            as Prodigy XS with a different PID, !! 397                 .name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
243            maybe we'll need it lateron */      !! 398                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
244         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = { !! 399                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
245                 .name         = "Terratec Prod << 
246                 .vchannels    = 3,             << 
247                 .tda9887_conf = TDA9887_PRESEN    400                 .tda9887_conf = TDA9887_PRESENT,
248                 .tuner_type   = TUNER_XC2028,  !! 401                 .decoder      = EM28XX_SAA711X,
249                 .decoder      = EM28XX_TVP5150 !! 402                 .input        = { {
250                 .input          = { {          << 
251                         .type     = EM28XX_VMU    403                         .type     = EM28XX_VMUX_TELEVISION,
252                         .vmux     = TVP5150_CO !! 404                         .vmux     = SAA7115_COMPOSITE2,
253                         .amux     = 0,         !! 405                         .amux     = EM28XX_AMUX_VIDEO,
254                 }, {                              406                 }, {
255                         .type     = EM28XX_VMU    407                         .type     = EM28XX_VMUX_COMPOSITE1,
256                         .vmux     = TVP5150_CO !! 408                         .vmux     = SAA7115_COMPOSITE0,
257                         .amux     = 1,         !! 409                         .amux     = EM28XX_AMUX_LINE_IN,
258                 }, {                              410                 }, {
259                         .type     = EM28XX_VMU    411                         .type     = EM28XX_VMUX_SVIDEO,
260                         .vmux     = TVP5150_SV !! 412                         .vmux     = SAA7115_SVIDEO3,
261                         .amux     = 1,         !! 413                         .amux     = EM28XX_AMUX_LINE_IN,
262                 } },                           << 
263         },                                     << 
264         [EM2820_BOARD_MSI_VOX_USB_2] = {       << 
265                 .name              = "MSI VOX  << 
266                 .vchannels         = 3,        << 
267                 .tuner_type        = TUNER_LG_ << 
268                 .tda9887_conf      = TDA9887_P << 
269                                      TDA9887_P << 
270                                      TDA9887_P << 
271                 .max_range_640_480 = 1,        << 
272                                                << 
273                 .decoder           = EM28XX_SA << 
274                 .input             = { {       << 
275                         .type      = EM28XX_VM << 
276                         .vmux      = SAA7115_C << 
277                         .amux      = 0,        << 
278                 }, {                           << 
279                         .type      = EM28XX_VM << 
280                         .vmux      = SAA7115_C << 
281                         .amux      = 1,        << 
282                 }, {                           << 
283                         .type      = EM28XX_VM << 
284                         .vmux      = SAA7115_S << 
285                         .amux      = 1,        << 
286                 } },                              414                 } },
287         },                                        415         },
288         [EM2800_BOARD_TERRATEC_CINERGY_200] =  !! 416         [EM2820_BOARD_GADMEI_UTV310] = {
289                 .name         = "Terratec Cine !! 417                 .name         = "Gadmei UTV310",
290                 .is_em2800    = 1,             !! 418                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
291                 .vchannels    = 3,             !! 419                 .tuner_type   = TUNER_TNF_5335MF,
292                 .tuner_type   = TUNER_LG_PAL_N << 
293                 .tda9887_conf = TDA9887_PRESEN    420                 .tda9887_conf = TDA9887_PRESENT,
294                 .decoder      = EM28XX_SAA7113 !! 421                 .decoder      = EM28XX_SAA711X,
295                 .input          = { {          !! 422                 .input        = { {
296                         .type     = EM28XX_VMU    423                         .type     = EM28XX_VMUX_TELEVISION,
297                         .vmux     = SAA7115_CO !! 424                         .vmux     = SAA7115_COMPOSITE1,
298                         .amux     = 0,         !! 425                         .amux     = EM28XX_AMUX_LINE_IN,
299                 }, {                              426                 }, {
300                         .type     = EM28XX_VMU    427                         .type     = EM28XX_VMUX_COMPOSITE1,
301                         .vmux     = SAA7115_CO    428                         .vmux     = SAA7115_COMPOSITE0,
302                         .amux     = 1,         !! 429                         .amux     = EM28XX_AMUX_LINE_IN,
303                 }, {                              430                 }, {
304                         .type     = EM28XX_VMU    431                         .type     = EM28XX_VMUX_SVIDEO,
305                         .vmux     = SAA7115_SV    432                         .vmux     = SAA7115_SVIDEO3,
306                         .amux     = 1,         !! 433                         .amux     = EM28XX_AMUX_LINE_IN,
307                 } },                              434                 } },
308         },                                        435         },
309         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = !! 436         [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
310                 .name         = "Leadtek Winfa !! 437                 .name         = "Leadtek Winfast USB II Deluxe",
311                 .is_em2800    = 1,             !! 438                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
312                 .vchannels    = 3,             !! 439                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
313                 .tuner_type   = TUNER_LG_PAL_N << 
314                 .tda9887_conf = TDA9887_PRESEN    440                 .tda9887_conf = TDA9887_PRESENT,
315                 .decoder      = EM28XX_SAA7113 !! 441                 .decoder      = EM28XX_SAA711X,
316                 .input          = { {          !! 442                 .input        = { {
317                         .type     = EM28XX_VMU    443                         .type     = EM28XX_VMUX_TELEVISION,
318                         .vmux     = SAA7115_CO    444                         .vmux     = SAA7115_COMPOSITE2,
319                         .amux     = 0,         !! 445                         .amux     = EM28XX_AMUX_VIDEO,
320                 }, {                              446                 }, {
321                         .type     = EM28XX_VMU    447                         .type     = EM28XX_VMUX_COMPOSITE1,
322                         .vmux     = SAA7115_CO    448                         .vmux     = SAA7115_COMPOSITE0,
323                         .amux     = 1,         !! 449                         .amux     = EM28XX_AMUX_LINE_IN,
324                 }, {                              450                 }, {
325                         .type     = EM28XX_VMU    451                         .type     = EM28XX_VMUX_SVIDEO,
326                         .vmux     = SAA7115_SV !! 452                         .vmux     = SAA7115_COMPOSITE0,
327                         .amux     = 1,         !! 453                         .amux     = EM28XX_AMUX_LINE_IN,
328                 } },                              454                 } },
329         },                                        455         },
330         [EM2800_BOARD_KWORLD_USB2800] = {      !! 456         [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
331                 .name         = "Kworld USB280 !! 457                 .name         = "Videology 20K14XUSB USB2.0",
332                 .is_em2800    = 1,             !! 458                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
333                 .vchannels    = 3,             !! 459                 .tuner_type   = TUNER_ABSENT,
334                 .tuner_type   = TUNER_PHILIPS_ !! 460                 .is_webcam    = 1,
335                 .tda9887_conf = TDA9887_PRESEN !! 461                 .input        = { {
336                 .decoder      = EM28XX_SAA7113 !! 462                         .type     = EM28XX_VMUX_COMPOSITE1,
337                 .input          = { {          !! 463                         .vmux     = 0,
                                                   >> 464                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 465                 } },
                                                   >> 466         },
                                                   >> 467         [EM2820_BOARD_SILVERCREST_WEBCAM] = {
                                                   >> 468                 .name         = "Silvercrest Webcam 1.3mpix",
                                                   >> 469                 .tuner_type   = TUNER_ABSENT,
                                                   >> 470                 .is_webcam    = 1,
                                                   >> 471                 .input        = { {
                                                   >> 472                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 473                         .vmux     = 0,
                                                   >> 474                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 475                         .gpio     = silvercrest_reg_seq,
                                                   >> 476                 } },
                                                   >> 477         },
                                                   >> 478         [EM2821_BOARD_SUPERCOMP_USB_2] = {
                                                   >> 479                 .name         = "Supercomp USB 2.0 TV",
                                                   >> 480                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 481                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
                                                   >> 482                 .tda9887_conf = TDA9887_PRESENT |
                                                   >> 483                                 TDA9887_PORT1_ACTIVE |
                                                   >> 484                                 TDA9887_PORT2_ACTIVE,
                                                   >> 485                 .decoder      = EM28XX_SAA711X,
                                                   >> 486                 .input        = { {
338                         .type     = EM28XX_VMU    487                         .type     = EM28XX_VMUX_TELEVISION,
339                         .vmux     = SAA7115_CO    488                         .vmux     = SAA7115_COMPOSITE2,
340                         .amux     = 0,         !! 489                         .amux     = EM28XX_AMUX_LINE_IN,
341                 }, {                              490                 }, {
342                         .type     = EM28XX_VMU    491                         .type     = EM28XX_VMUX_COMPOSITE1,
343                         .vmux     = SAA7115_CO    492                         .vmux     = SAA7115_COMPOSITE0,
344                         .amux     = 1,         !! 493                         .amux     = EM28XX_AMUX_VIDEO,
345                 }, {                              494                 }, {
346                         .type     = EM28XX_VMU    495                         .type     = EM28XX_VMUX_SVIDEO,
347                         .vmux     = SAA7115_SV    496                         .vmux     = SAA7115_SVIDEO3,
348                         .amux     = 1,         !! 497                         .amux     = EM28XX_AMUX_LINE_IN,
349                 } },                              498                 } },
350         },                                        499         },
351         [EM2820_BOARD_PINNACLE_DVC_90] = {     !! 500         [EM2821_BOARD_USBGEAR_VD204] = {
352                 .name         = "Pinnacle Dazz !! 501                 .name         = "Usbgear VD204v9",
353                 .vchannels    = 3,             !! 502                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 503                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
                                                   >> 504                 .decoder      = EM28XX_SAA711X,
                                                   >> 505                 .input        = { {
                                                   >> 506                         .type  = EM28XX_VMUX_COMPOSITE1,
                                                   >> 507                         .vmux  = SAA7115_COMPOSITE0,
                                                   >> 508                         .amux  = EM28XX_AMUX_LINE_IN,
                                                   >> 509                 }, {
                                                   >> 510                         .type  = EM28XX_VMUX_SVIDEO,
                                                   >> 511                         .vmux  = SAA7115_SVIDEO3,
                                                   >> 512                         .amux  = EM28XX_AMUX_LINE_IN,
                                                   >> 513                 } },
                                                   >> 514         },
                                                   >> 515         [EM2860_BOARD_NETGMBH_CAM] = {
                                                   >> 516                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
                                                   >> 517                 .name         = "NetGMBH Cam",
                                                   >> 518                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
354                 .tuner_type   = TUNER_ABSENT,     519                 .tuner_type   = TUNER_ABSENT,
355                 .decoder      = EM28XX_SAA7113 !! 520                 .is_webcam    = 1,
356                 .input          = { {          !! 521                 .input        = { {
357                         .type     = EM28XX_VMU    522                         .type     = EM28XX_VMUX_COMPOSITE1,
358                         .vmux     = SAA7115_CO !! 523                         .vmux     = 0,
359                         .amux     = 1,         !! 524                         .amux     = EM28XX_AMUX_VIDEO,
360                 }, {                           << 
361                         .type     = EM28XX_VMU << 
362                         .vmux     = SAA7115_SV << 
363                         .amux     = 1,         << 
364                 } },                              525                 } },
365         },                                        526         },
366         [EM2800_BOARD_VGEAR_POCKETTV] = {      !! 527         [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
367                 .name         = "V-Gear Pocket !! 528                 .name         = "Typhoon DVD Maker",
368                 .is_em2800    = 1,             !! 529                 .decoder      = EM28XX_SAA711X,
369                 .vchannels    = 3,             !! 530                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
370                 .tuner_type   = TUNER_LG_PAL_N !! 531                 .input        = { {
                                                   >> 532                         .type  = EM28XX_VMUX_COMPOSITE1,
                                                   >> 533                         .vmux  = SAA7115_COMPOSITE0,
                                                   >> 534                         .amux  = EM28XX_AMUX_LINE_IN,
                                                   >> 535                 }, {
                                                   >> 536                         .type  = EM28XX_VMUX_SVIDEO,
                                                   >> 537                         .vmux  = SAA7115_SVIDEO3,
                                                   >> 538                         .amux  = EM28XX_AMUX_LINE_IN,
                                                   >> 539                 } },
                                                   >> 540         },
                                                   >> 541         [EM2860_BOARD_GADMEI_UTV330] = {
                                                   >> 542                 .name         = "Gadmei UTV330",
                                                   >> 543                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 544                 .tuner_type   = TUNER_TNF_5335MF,
371                 .tda9887_conf = TDA9887_PRESEN    545                 .tda9887_conf = TDA9887_PRESENT,
372                 .decoder      = EM28XX_SAA7113 !! 546                 .decoder      = EM28XX_SAA711X,
373                 .input          = { {          !! 547                 .input        = { {
374                         .type     = EM28XX_VMU    548                         .type     = EM28XX_VMUX_TELEVISION,
375                         .vmux     = SAA7115_CO    549                         .vmux     = SAA7115_COMPOSITE2,
376                         .amux     = 0,         !! 550                         .amux     = EM28XX_AMUX_VIDEO,
377                 }, {                              551                 }, {
378                         .type     = EM28XX_VMU    552                         .type     = EM28XX_VMUX_COMPOSITE1,
379                         .vmux     = SAA7115_CO    553                         .vmux     = SAA7115_COMPOSITE0,
380                         .amux     = 1,         !! 554                         .amux     = EM28XX_AMUX_LINE_IN,
381                 }, {                              555                 }, {
382                         .type     = EM28XX_VMU    556                         .type     = EM28XX_VMUX_SVIDEO,
383                         .vmux     = SAA7115_SV    557                         .vmux     = SAA7115_SVIDEO3,
384                         .amux     = 1,         !! 558                         .amux     = EM28XX_AMUX_LINE_IN,
385                 } },                              559                 } },
386         },                                        560         },
387         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = { !! 561         [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
388                 .name         = "Pixelview Pro !! 562                 .name         = "Terratec Cinergy A Hybrid XS",
389                 .vchannels    = 3,             !! 563                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
390                 .tda9887_conf = TDA9887_PRESEN !! 564                 .tuner_type   = TUNER_XC2028,
391                 .tuner_type   = TUNER_YMEC_TVF !! 565                 .tuner_gpio   = default_tuner_gpio,
392                 .decoder      = EM28XX_SAA7113 !! 566                 .decoder      = EM28XX_TVP5150,
393                 .input          = { {          !! 567 
                                                   >> 568                 .input        = { {
394                         .type     = EM28XX_VMU    569                         .type     = EM28XX_VMUX_TELEVISION,
395                         .vmux     = SAA7115_CO !! 570                         .vmux     = TVP5150_COMPOSITE0,
396                         .amux     = EM28XX_AMU !! 571                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 572                         .gpio     = hauppauge_wintv_hvr_900_analog,
397                 }, {                              573                 }, {
398                         .type     = EM28XX_VMU    574                         .type     = EM28XX_VMUX_COMPOSITE1,
399                         .vmux     = SAA7115_CO !! 575                         .vmux     = TVP5150_COMPOSITE1,
400                         .amux     = EM28XX_AMU    576                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 577                         .gpio     = hauppauge_wintv_hvr_900_analog,
401                 }, {                              578                 }, {
402                         .type     = EM28XX_VMU    579                         .type     = EM28XX_VMUX_SVIDEO,
403                         .vmux     = SAA7115_SV !! 580                         .vmux     = TVP5150_SVIDEO,
404                         .amux     = EM28XX_AMU    581                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 582                         .gpio     = hauppauge_wintv_hvr_900_analog,
405                 } },                              583                 } },
406         },                                        584         },
407 };                                             !! 585         [EM2861_BOARD_KWORLD_PVRTV_300U] = {
408 const unsigned int em28xx_bcount = ARRAY_SIZE( !! 586                 .name         = "KWorld PVRTV 300U",
409                                                !! 587                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
410 /* table of devices that work with this driver !! 588                 .tuner_type   = TUNER_XC2028,
411 struct usb_device_id em28xx_id_table [] = {    !! 589                 .tuner_gpio   = default_tuner_gpio,
412         { USB_DEVICE(0xeb1a, 0x2750),          !! 590                 .decoder      = EM28XX_TVP5150,
413                         .driver_info = EM2820_ !! 591                 .input        = { {
414         { USB_DEVICE(0xeb1a, 0x2800),          !! 592                         .type     = EM28XX_VMUX_TELEVISION,
415                         .driver_info = EM2800_ !! 593                         .vmux     = TVP5150_COMPOSITE0,
416         { USB_DEVICE(0xeb1a, 0x2820),          !! 594                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 595                 }, {
                                                   >> 596                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 597                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 598                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 599                 }, {
                                                   >> 600                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 601                         .vmux     = TVP5150_SVIDEO,
                                                   >> 602                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 603                 } },
                                                   >> 604         },
                                                   >> 605         [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
                                                   >> 606                 .name          = "Yakumo MovieMixer",
                                                   >> 607                 .tuner_type    = TUNER_ABSENT,  /* Capture only device */
                                                   >> 608                 .decoder       = EM28XX_TVP5150,
                                                   >> 609                 .input         = { {
                                                   >> 610                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 611                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 612                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 613                 }, {
                                                   >> 614                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 615                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 616                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 617                 }, {
                                                   >> 618                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 619                         .vmux     = TVP5150_SVIDEO,
                                                   >> 620                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 621                 } },
                                                   >> 622         },
                                                   >> 623         [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
                                                   >> 624                 .name         = "Plextor ConvertX PX-TV100U",
                                                   >> 625                 .tuner_type   = TUNER_TNF_5335MF,
                                                   >> 626                 .xclk         = EM28XX_XCLK_I2S_MSB_TIMING |
                                                   >> 627                                 EM28XX_XCLK_FREQUENCY_12MHZ,
                                                   >> 628                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 629                 .decoder      = EM28XX_TVP5150,
                                                   >> 630                 .has_msp34xx  = 1,
                                                   >> 631                 .input        = { {
                                                   >> 632                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 633                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 634                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 635                         .gpio     = pinnacle_hybrid_pro_analog,
                                                   >> 636                 }, {
                                                   >> 637                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 638                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 639                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 640                         .gpio     = pinnacle_hybrid_pro_analog,
                                                   >> 641                 }, {
                                                   >> 642                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 643                         .vmux     = TVP5150_SVIDEO,
                                                   >> 644                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 645                         .gpio     = pinnacle_hybrid_pro_analog,
                                                   >> 646                 } },
                                                   >> 647         },
                                                   >> 648 
                                                   >> 649         /* Those boards with em2870 are DVB Only*/
                                                   >> 650 
                                                   >> 651         [EM2870_BOARD_TERRATEC_XS] = {
                                                   >> 652                 .name         = "Terratec Cinergy T XS",
                                                   >> 653                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 654                 .tuner_type   = TUNER_XC2028,
                                                   >> 655                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 656         },
                                                   >> 657         [EM2870_BOARD_TERRATEC_XS_MT2060] = {
                                                   >> 658                 .name         = "Terratec Cinergy T XS (MT2060)",
                                                   >> 659                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 660                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
                                                   >> 661         },
                                                   >> 662         [EM2870_BOARD_KWORLD_350U] = {
                                                   >> 663                 .name         = "Kworld 350 U DVB-T",
                                                   >> 664                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 665                 .tuner_type   = TUNER_XC2028,
                                                   >> 666                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 667         },
                                                   >> 668         [EM2870_BOARD_KWORLD_355U] = {
                                                   >> 669                 .name         = "Kworld 355 U DVB-T",
                                                   >> 670                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 671         },
                                                   >> 672         [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
                                                   >> 673                 .name         = "Pinnacle PCTV DVB-T",
                                                   >> 674                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 675                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
                                                   >> 676                 /* djh - I have serious doubts this is right... */
                                                   >> 677                 .xclk         = EM28XX_XCLK_IR_RC5_MODE |
                                                   >> 678                                 EM28XX_XCLK_FREQUENCY_10MHZ,
                                                   >> 679         },
                                                   >> 680         [EM2870_BOARD_COMPRO_VIDEOMATE] = {
                                                   >> 681                 .name         = "Compro, VideoMate U3",
                                                   >> 682                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 683                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
                                                   >> 684         },
                                                   >> 685 
                                                   >> 686         [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
                                                   >> 687                 .name         = "Terratec Hybrid XS Secam",
                                                   >> 688                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 689                 .has_msp34xx  = 1,
                                                   >> 690                 .tuner_type   = TUNER_XC2028,
                                                   >> 691                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 692                 .decoder      = EM28XX_TVP5150,
                                                   >> 693                 .input        = { {
                                                   >> 694                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 695                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 696                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 697                         .gpio     = default_analog,
                                                   >> 698                 }, {
                                                   >> 699                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 700                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 701                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 702                         .gpio     = default_analog,
                                                   >> 703                 }, {
                                                   >> 704                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 705                         .vmux     = TVP5150_SVIDEO,
                                                   >> 706                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 707                         .gpio     = default_analog,
                                                   >> 708                 } },
                                                   >> 709         },
                                                   >> 710         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
                                                   >> 711                 .name         = "Hauppauge WinTV HVR 900",
                                                   >> 712                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 713                 .tuner_type   = TUNER_XC2028,
                                                   >> 714                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 715                 .mts_firmware = 1,
                                                   >> 716                 .has_dvb      = 1,
                                                   >> 717                 .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
                                                   >> 718                 .ir_codes     = ir_codes_hauppauge_new,
                                                   >> 719                 .decoder      = EM28XX_TVP5150,
                                                   >> 720                 .input        = { {
                                                   >> 721                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 722                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 723                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 724                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 725                 }, {
                                                   >> 726                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 727                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 728                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 729                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 730                 }, {
                                                   >> 731                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 732                         .vmux     = TVP5150_SVIDEO,
                                                   >> 733                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 734                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 735                 } },
                                                   >> 736         },
                                                   >> 737         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
                                                   >> 738                 .name         = "Hauppauge WinTV HVR 900 (R2)",
                                                   >> 739                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 740                 .tuner_type   = TUNER_XC2028,
                                                   >> 741                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 742                 .mts_firmware = 1,
                                                   >> 743                 .ir_codes     = ir_codes_hauppauge_new,
                                                   >> 744                 .decoder      = EM28XX_TVP5150,
                                                   >> 745                 .input        = { {
                                                   >> 746                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 747                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 748                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 749                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 750                 }, {
                                                   >> 751                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 752                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 753                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 754                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 755                 }, {
                                                   >> 756                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 757                         .vmux     = TVP5150_SVIDEO,
                                                   >> 758                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 759                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 760                 } },
                                                   >> 761         },
                                                   >> 762         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
                                                   >> 763                 .name           = "Hauppauge WinTV HVR 850",
                                                   >> 764                 .tuner_type     = TUNER_XC2028,
                                                   >> 765                 .tuner_gpio     = default_tuner_gpio,
                                                   >> 766                 .mts_firmware   = 1,
                                                   >> 767                 .has_dvb        = 1,
                                                   >> 768                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
                                                   >> 769                 .ir_codes       = ir_codes_hauppauge_new,
                                                   >> 770                 .decoder        = EM28XX_TVP5150,
                                                   >> 771                 .input          = { {
                                                   >> 772                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 773                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 774                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 775                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 776                 }, {
                                                   >> 777                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 778                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 779                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 780                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 781                 }, {
                                                   >> 782                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 783                         .vmux     = TVP5150_SVIDEO,
                                                   >> 784                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 785                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 786                 } },
                                                   >> 787         },
                                                   >> 788         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
                                                   >> 789                 .name           = "Hauppauge WinTV HVR 950",
                                                   >> 790                 .tuner_type     = TUNER_XC2028,
                                                   >> 791                 .tuner_gpio     = default_tuner_gpio,
                                                   >> 792                 .mts_firmware   = 1,
                                                   >> 793                 .has_dvb        = 1,
                                                   >> 794                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
                                                   >> 795                 .ir_codes       = ir_codes_hauppauge_new,
                                                   >> 796                 .decoder        = EM28XX_TVP5150,
                                                   >> 797                 .input          = { {
                                                   >> 798                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 799                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 800                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 801                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 802                 }, {
                                                   >> 803                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 804                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 805                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 806                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 807                 }, {
                                                   >> 808                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 809                         .vmux     = TVP5150_SVIDEO,
                                                   >> 810                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 811                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 812                 } },
                                                   >> 813         },
                                                   >> 814         [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
                                                   >> 815                 .name           = "Pinnacle PCTV HD Pro Stick",
                                                   >> 816                 .tuner_type     = TUNER_XC2028,
                                                   >> 817                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 818                 .mts_firmware   = 1,
                                                   >> 819                 .has_dvb        = 1,
                                                   >> 820                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
                                                   >> 821                 .ir_codes       = ir_codes_pinnacle_pctv_hd,
                                                   >> 822                 .decoder        = EM28XX_TVP5150,
                                                   >> 823                 .input          = { {
                                                   >> 824                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 825                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 826                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 827                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 828                 }, {
                                                   >> 829                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 830                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 831                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 832                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 833                 }, {
                                                   >> 834                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 835                         .vmux     = TVP5150_SVIDEO,
                                                   >> 836                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 837                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 838                 } },
                                                   >> 839         },
                                                   >> 840         [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
                                                   >> 841                 .name           = "AMD ATI TV Wonder HD 600",
                                                   >> 842                 .tuner_type     = TUNER_XC2028,
                                                   >> 843                 .tuner_gpio     = default_tuner_gpio,
                                                   >> 844                 .mts_firmware   = 1,
                                                   >> 845                 .has_dvb        = 1,
                                                   >> 846                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
                                                   >> 847                 .ir_codes       = ir_codes_ati_tv_wonder_hd_600,
                                                   >> 848                 .decoder        = EM28XX_TVP5150,
                                                   >> 849                 .input          = { {
                                                   >> 850                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 851                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 852                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 853                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 854                 }, {
                                                   >> 855                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 856                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 857                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 858                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 859                 }, {
                                                   >> 860                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 861                         .vmux     = TVP5150_SVIDEO,
                                                   >> 862                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 863                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 864                 } },
                                                   >> 865         },
                                                   >> 866         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
                                                   >> 867                 .name           = "Terratec Hybrid XS",
                                                   >> 868                 .tuner_type     = TUNER_XC2028,
                                                   >> 869                 .tuner_gpio     = default_tuner_gpio,
                                                   >> 870                 .decoder        = EM28XX_TVP5150,
                                                   >> 871                 .has_dvb        = 1,
                                                   >> 872                 .dvb_gpio       = default_digital,
                                                   >> 873                 .input          = { {
                                                   >> 874                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 875                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 876                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 877                         .gpio     = default_analog,
                                                   >> 878                 }, {
                                                   >> 879                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 880                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 881                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 882                         .gpio     = default_analog,
                                                   >> 883                 }, {
                                                   >> 884                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 885                         .vmux     = TVP5150_SVIDEO,
                                                   >> 886                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 887                         .gpio     = default_analog,
                                                   >> 888                 } },
                                                   >> 889         },
                                                   >> 890         /* maybe there's a reason behind it why Terratec sells the Hybrid XS
                                                   >> 891            as Prodigy XS with a different PID, let's keep it separated for now
                                                   >> 892            maybe we'll need it lateron */
                                                   >> 893         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
                                                   >> 894                 .name         = "Terratec Prodigy XS",
                                                   >> 895                 .tuner_type   = TUNER_XC2028,
                                                   >> 896                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 897                 .decoder      = EM28XX_TVP5150,
                                                   >> 898                 .input        = { {
                                                   >> 899                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 900                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 901                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 902                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 903                 }, {
                                                   >> 904                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 905                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 906                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 907                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 908                 }, {
                                                   >> 909                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 910                         .vmux     = TVP5150_SVIDEO,
                                                   >> 911                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 912                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 913                 } },
                                                   >> 914         },
                                                   >> 915         [EM2820_BOARD_MSI_VOX_USB_2] = {
                                                   >> 916                 .name              = "MSI VOX USB 2.0",
                                                   >> 917                 .tuner_type        = TUNER_LG_PAL_NEW_TAPC,
                                                   >> 918                 .tda9887_conf      = TDA9887_PRESENT      |
                                                   >> 919                                      TDA9887_PORT1_ACTIVE |
                                                   >> 920                                      TDA9887_PORT2_ACTIVE,
                                                   >> 921                 .max_range_640_480 = 1,
                                                   >> 922                 .decoder           = EM28XX_SAA711X,
                                                   >> 923                 .input             = { {
                                                   >> 924                         .type      = EM28XX_VMUX_TELEVISION,
                                                   >> 925                         .vmux      = SAA7115_COMPOSITE4,
                                                   >> 926                         .amux      = EM28XX_AMUX_VIDEO,
                                                   >> 927                 }, {
                                                   >> 928                         .type      = EM28XX_VMUX_COMPOSITE1,
                                                   >> 929                         .vmux      = SAA7115_COMPOSITE0,
                                                   >> 930                         .amux      = EM28XX_AMUX_LINE_IN,
                                                   >> 931                 }, {
                                                   >> 932                         .type      = EM28XX_VMUX_SVIDEO,
                                                   >> 933                         .vmux      = SAA7115_SVIDEO3,
                                                   >> 934                         .amux      = EM28XX_AMUX_LINE_IN,
                                                   >> 935                 } },
                                                   >> 936         },
                                                   >> 937         [EM2800_BOARD_TERRATEC_CINERGY_200] = {
                                                   >> 938                 .name         = "Terratec Cinergy 200 USB",
                                                   >> 939                 .is_em2800    = 1,
                                                   >> 940                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
                                                   >> 941                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 942                 .decoder      = EM28XX_SAA711X,
                                                   >> 943                 .input        = { {
                                                   >> 944                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 945                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 946                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 947                 }, {
                                                   >> 948                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 949                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 950                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 951                 }, {
                                                   >> 952                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 953                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 954                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 955                 } },
                                                   >> 956         },
                                                   >> 957         [EM2800_BOARD_GRABBEEX_USB2800] = {
                                                   >> 958                 .name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
                                                   >> 959                 .is_em2800  = 1,
                                                   >> 960                 .decoder    = EM28XX_SAA711X,
                                                   >> 961                 .tuner_type = TUNER_ABSENT, /* capture only board */
                                                   >> 962                 .input      = { {
                                                   >> 963                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 964                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 965                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 966                 }, {
                                                   >> 967                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 968                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 969                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 970                 } },
                                                   >> 971         },
                                                   >> 972         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
                                                   >> 973                 .name         = "Leadtek Winfast USB II",
                                                   >> 974                 .is_em2800    = 1,
                                                   >> 975                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
                                                   >> 976                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 977                 .decoder      = EM28XX_SAA711X,
                                                   >> 978                 .input        = { {
                                                   >> 979                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 980                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 981                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 982                 }, {
                                                   >> 983                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 984                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 985                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 986                 }, {
                                                   >> 987                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 988                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 989                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 990                 } },
                                                   >> 991         },
                                                   >> 992         [EM2800_BOARD_KWORLD_USB2800] = {
                                                   >> 993                 .name         = "Kworld USB2800",
                                                   >> 994                 .is_em2800    = 1,
                                                   >> 995                 .tuner_type   = TUNER_PHILIPS_FCV1236D,
                                                   >> 996                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 997                 .decoder      = EM28XX_SAA711X,
                                                   >> 998                 .input        = { {
                                                   >> 999                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1000                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 1001                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1002                 }, {
                                                   >> 1003                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1004                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1005                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1006                 }, {
                                                   >> 1007                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1008                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1009                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1010                 } },
                                                   >> 1011         },
                                                   >> 1012         [EM2820_BOARD_PINNACLE_DVC_90] = {
                                                   >> 1013                 .name         = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker",
                                                   >> 1014                 .tuner_type   = TUNER_ABSENT, /* capture only board */
                                                   >> 1015                 .decoder      = EM28XX_SAA711X,
                                                   >> 1016                 .input        = { {
                                                   >> 1017                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1018                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1019                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1020                 }, {
                                                   >> 1021                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1022                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1023                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1024                 } },
                                                   >> 1025         },
                                                   >> 1026         [EM2800_BOARD_VGEAR_POCKETTV] = {
                                                   >> 1027                 .name         = "V-Gear PocketTV",
                                                   >> 1028                 .is_em2800    = 1,
                                                   >> 1029                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
                                                   >> 1030                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 1031                 .decoder      = EM28XX_SAA711X,
                                                   >> 1032                 .input        = { {
                                                   >> 1033                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1034                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 1035                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1036                 }, {
                                                   >> 1037                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1038                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1039                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1040                 }, {
                                                   >> 1041                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1042                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1043                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1044                 } },
                                                   >> 1045         },
                                                   >> 1046         [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
                                                   >> 1047                 .name         = "Pixelview PlayTV Box 4 USB 2.0",
                                                   >> 1048                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 1049                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
                                                   >> 1050                 .decoder      = EM28XX_SAA711X,
                                                   >> 1051                 .input        = { {
                                                   >> 1052                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1053                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 1054                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1055                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
                                                   >> 1056                                     EM28XX_AOUT_MASTER, /* Line out pin */
                                                   >> 1057                 }, {
                                                   >> 1058                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1059                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1060                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1061                 }, {
                                                   >> 1062                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1063                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1064                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1065                 } },
                                                   >> 1066         },
                                                   >> 1067         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
                                                   >> 1068                 .name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
                                                   >> 1069                 .has_snapshot_button = 1,
                                                   >> 1070                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 1071                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
                                                   >> 1072                 .decoder      = EM28XX_SAA711X,
                                                   >> 1073                 .input        = { {
                                                   >> 1074                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1075                         .vmux     = SAA7115_COMPOSITE2,
                                                   >> 1076                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1077                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
                                                   >> 1078                                     EM28XX_AOUT_MASTER, /* Line out pin */
                                                   >> 1079                 }, {
                                                   >> 1080                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1081                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1082                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1083                 }, {
                                                   >> 1084                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1085                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1086                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1087                 } },
                                                   >> 1088         },
                                                   >> 1089         [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
                                                   >> 1090                 .name                = "EM2860/SAA711X Reference Design",
                                                   >> 1091                 .has_snapshot_button = 1,
                                                   >> 1092                 .tuner_type          = TUNER_ABSENT,
                                                   >> 1093                 .decoder             = EM28XX_SAA711X,
                                                   >> 1094                 .input               = { {
                                                   >> 1095                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1096                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1097                 }, {
                                                   >> 1098                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1099                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1100                 } },
                                                   >> 1101         },
                                                   >> 1102         [EM2880_BOARD_MSI_DIGIVOX_AD] = {
                                                   >> 1103                 .name         = "MSI DigiVox A/D",
                                                   >> 1104                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1105                 .tuner_type   = TUNER_XC2028,
                                                   >> 1106                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1107                 .decoder      = EM28XX_TVP5150,
                                                   >> 1108                 .input        = { {
                                                   >> 1109                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1110                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1111                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1112                         .gpio     = em2880_msi_digivox_ad_analog,
                                                   >> 1113                 }, {
                                                   >> 1114                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1115                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1116                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1117                         .gpio     = em2880_msi_digivox_ad_analog,
                                                   >> 1118                 }, {
                                                   >> 1119                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1120                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1121                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1122                         .gpio     = em2880_msi_digivox_ad_analog,
                                                   >> 1123                 } },
                                                   >> 1124         },
                                                   >> 1125         [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
                                                   >> 1126                 .name         = "MSI DigiVox A/D II",
                                                   >> 1127                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1128                 .tuner_type   = TUNER_XC2028,
                                                   >> 1129                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1130                 .decoder      = EM28XX_TVP5150,
                                                   >> 1131                 .input        = { {
                                                   >> 1132                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1133                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1134                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1135                         .gpio     = em2880_msi_digivox_ad_analog,
                                                   >> 1136                 }, {
                                                   >> 1137                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1138                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1139                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1140                         .gpio     = em2880_msi_digivox_ad_analog,
                                                   >> 1141                 }, {
                                                   >> 1142                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1143                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1144                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1145                         .gpio     = em2880_msi_digivox_ad_analog,
                                                   >> 1146                 } },
                                                   >> 1147         },
                                                   >> 1148         [EM2880_BOARD_KWORLD_DVB_305U] = {
                                                   >> 1149                 .name         = "KWorld DVB-T 305U",
                                                   >> 1150                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1151                 .tuner_type   = TUNER_XC2028,
                                                   >> 1152                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1153                 .decoder      = EM28XX_TVP5150,
                                                   >> 1154                 .input        = { {
                                                   >> 1155                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1156                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1157                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1158                 }, {
                                                   >> 1159                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1160                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1161                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1162                 }, {
                                                   >> 1163                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1164                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1165                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1166                 } },
                                                   >> 1167         },
                                                   >> 1168         [EM2880_BOARD_KWORLD_DVB_310U] = {
                                                   >> 1169                 .name         = "KWorld DVB-T 310U",
                                                   >> 1170                 .tuner_type   = TUNER_XC2028,
                                                   >> 1171                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1172                 .has_dvb      = 1,
                                                   >> 1173                 .dvb_gpio     = default_digital,
                                                   >> 1174                 .mts_firmware = 1,
                                                   >> 1175                 .decoder      = EM28XX_TVP5150,
                                                   >> 1176                 .input        = { {
                                                   >> 1177                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1178                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1179                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1180                         .gpio     = default_analog,
                                                   >> 1181                 }, {
                                                   >> 1182                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1183                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1184                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1185                         .gpio     = default_analog,
                                                   >> 1186                 }, {    /* S-video has not been tested yet */
                                                   >> 1187                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1188                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1189                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1190                         .gpio     = default_analog,
                                                   >> 1191                 } },
                                                   >> 1192         },
                                                   >> 1193         [EM2882_BOARD_KWORLD_ATSC_315U] = {
                                                   >> 1194                 .name           = "KWorld ATSC 315U HDTV TV Box",
                                                   >> 1195                 .valid          = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1196                 .tuner_type     = TUNER_THOMSON_DTT761X,
                                                   >> 1197                 .tuner_gpio     = em2882_kworld_315u_tuner_gpio,
                                                   >> 1198                 .tda9887_conf   = TDA9887_PRESENT,
                                                   >> 1199                 .decoder        = EM28XX_SAA711X,
                                                   >> 1200                 .has_dvb        = 1,
                                                   >> 1201                 .dvb_gpio       = em2882_kworld_315u_digital,
                                                   >> 1202                 .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ,
                                                   >> 1203                 .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE,
                                                   >> 1204                 /* Analog mode - still not ready */
                                                   >> 1205                 /*.input        = { {
                                                   >> 1206                         .type = EM28XX_VMUX_TELEVISION,
                                                   >> 1207                         .vmux = SAA7115_COMPOSITE2,
                                                   >> 1208                         .amux = EM28XX_AMUX_VIDEO,
                                                   >> 1209                         .gpio = em2882_kworld_315u_analog,
                                                   >> 1210                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
                                                   >> 1211                 }, {
                                                   >> 1212                         .type = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1213                         .vmux = SAA7115_COMPOSITE0,
                                                   >> 1214                         .amux = EM28XX_AMUX_LINE_IN,
                                                   >> 1215                         .gpio = em2882_kworld_315u_analog1,
                                                   >> 1216                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
                                                   >> 1217                 }, {
                                                   >> 1218                         .type = EM28XX_VMUX_SVIDEO,
                                                   >> 1219                         .vmux = SAA7115_SVIDEO3,
                                                   >> 1220                         .amux = EM28XX_AMUX_LINE_IN,
                                                   >> 1221                         .gpio = em2882_kworld_315u_analog1,
                                                   >> 1222                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
                                                   >> 1223                 } }, */
                                                   >> 1224         },
                                                   >> 1225         [EM2880_BOARD_EMPIRE_DUAL_TV] = {
                                                   >> 1226                 .name = "Empire dual TV",
                                                   >> 1227                 .tuner_type = TUNER_XC2028,
                                                   >> 1228                 .tuner_gpio = default_tuner_gpio,
                                                   >> 1229                 .has_dvb = 1,
                                                   >> 1230                 .dvb_gpio = default_digital,
                                                   >> 1231                 .mts_firmware = 1,
                                                   >> 1232                 .decoder = EM28XX_TVP5150,
                                                   >> 1233                 .input = { {
                                                   >> 1234                         .type = EM28XX_VMUX_TELEVISION,
                                                   >> 1235                         .vmux = TVP5150_COMPOSITE0,
                                                   >> 1236                         .amux = EM28XX_AMUX_VIDEO,
                                                   >> 1237                         .gpio = default_analog,
                                                   >> 1238                 }, {
                                                   >> 1239                         .type = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1240                         .vmux = TVP5150_COMPOSITE1,
                                                   >> 1241                         .amux = EM28XX_AMUX_LINE_IN,
                                                   >> 1242                         .gpio = default_analog,
                                                   >> 1243                 }, {
                                                   >> 1244                         .type = EM28XX_VMUX_SVIDEO,
                                                   >> 1245                         .vmux = TVP5150_SVIDEO,
                                                   >> 1246                         .amux = EM28XX_AMUX_LINE_IN,
                                                   >> 1247                         .gpio = default_analog,
                                                   >> 1248                 } },
                                                   >> 1249         },
                                                   >> 1250         [EM2881_BOARD_DNT_DA2_HYBRID] = {
                                                   >> 1251                 .name         = "DNT DA2 Hybrid",
                                                   >> 1252                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1253                 .tuner_type   = TUNER_XC2028,
                                                   >> 1254                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1255                 .decoder      = EM28XX_TVP5150,
                                                   >> 1256                 .input        = { {
                                                   >> 1257                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1258                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1259                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1260                         .gpio     = default_analog,
                                                   >> 1261                 }, {
                                                   >> 1262                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1263                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1264                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1265                         .gpio     = default_analog,
                                                   >> 1266                 }, {
                                                   >> 1267                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1268                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1269                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1270                         .gpio     = default_analog,
                                                   >> 1271                 } },
                                                   >> 1272         },
                                                   >> 1273         [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
                                                   >> 1274                 .name         = "Pinnacle Hybrid Pro",
                                                   >> 1275                 .tuner_type   = TUNER_XC2028,
                                                   >> 1276                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1277                 .decoder      = EM28XX_TVP5150,
                                                   >> 1278                 .has_dvb      = 1,
                                                   >> 1279                 .dvb_gpio     = pinnacle_hybrid_pro_digital,
                                                   >> 1280                 .input        = { {
                                                   >> 1281                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1282                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1283                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1284                         .gpio     = pinnacle_hybrid_pro_analog,
                                                   >> 1285                 }, {
                                                   >> 1286                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1287                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1288                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1289                         .gpio     = pinnacle_hybrid_pro_analog,
                                                   >> 1290                 }, {
                                                   >> 1291                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1292                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1293                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1294                         .gpio     = pinnacle_hybrid_pro_analog,
                                                   >> 1295                 } },
                                                   >> 1296         },
                                                   >> 1297         [EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
                                                   >> 1298                 .name         = "Pinnacle Hybrid Pro (2)",
                                                   >> 1299                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1300                 .tuner_type   = TUNER_XC2028,
                                                   >> 1301                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1302                 .mts_firmware = 1,
                                                   >> 1303                 .decoder      = EM28XX_TVP5150,
                                                   >> 1304                 .input        = { {
                                                   >> 1305                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1306                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1307                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1308                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 1309                 }, {
                                                   >> 1310                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1311                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1312                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1313                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 1314                 }, {
                                                   >> 1315                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1316                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1317                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1318                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 1319                 } },
                                                   >> 1320         },
                                                   >> 1321         [EM2882_BOARD_KWORLD_VS_DVBT] = {
                                                   >> 1322                 .name         = "Kworld VS-DVB-T 323UR",
                                                   >> 1323                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1324                 .tuner_type   = TUNER_XC2028,
                                                   >> 1325                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1326                 .decoder      = EM28XX_TVP5150,
                                                   >> 1327                 .input        = { {
                                                   >> 1328                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1329                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1330                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1331                 }, {
                                                   >> 1332                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1333                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1334                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1335                 }, {
                                                   >> 1336                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1337                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1338                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1339                 } },
                                                   >> 1340         },
                                                   >> 1341         [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
                                                   >> 1342                 .name         = "Terratec Hybrid XS (em2882)",
                                                   >> 1343                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
                                                   >> 1344                 .tuner_type   = TUNER_XC2028,
                                                   >> 1345                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1346                 .decoder      = EM28XX_TVP5150,
                                                   >> 1347                 .input        = { {
                                                   >> 1348                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1349                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1350                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1351                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 1352                 }, {
                                                   >> 1353                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1354                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1355                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1356                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 1357                 }, {
                                                   >> 1358                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1359                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1360                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1361                         .gpio     = hauppauge_wintv_hvr_900_analog,
                                                   >> 1362                 } },
                                                   >> 1363         },
                                                   >> 1364         [EM2883_BOARD_KWORLD_HYBRID_330U] = {
                                                   >> 1365                 .name         = "Kworld PlusTV HD Hybrid 330",
                                                   >> 1366                 .tuner_type   = TUNER_XC2028,
                                                   >> 1367                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1368                 .decoder      = EM28XX_TVP5150,
                                                   >> 1369                 .mts_firmware = 1,
                                                   >> 1370                 .has_dvb      = 1,
                                                   >> 1371                 .dvb_gpio     = kworld_330u_digital,
                                                   >> 1372                 .xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
                                                   >> 1373                 .i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
                                                   >> 1374                                     EM28XX_I2C_EEPROM_ON_BOARD |
                                                   >> 1375                                     EM28XX_I2C_EEPROM_KEY_VALID,
                                                   >> 1376                 .input        = { {
                                                   >> 1377                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1378                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1379                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1380                         .gpio     = kworld_330u_analog,
                                                   >> 1381                         .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
                                                   >> 1382                 }, {
                                                   >> 1383                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1384                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1385                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1386                         .gpio     = kworld_330u_analog,
                                                   >> 1387                         .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
                                                   >> 1388                 }, {
                                                   >> 1389                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1390                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1391                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1392                         .gpio     = kworld_330u_analog,
                                                   >> 1393                 } },
                                                   >> 1394         },
                                                   >> 1395         [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
                                                   >> 1396                 .name         = "Compro VideoMate ForYou/Stereo",
                                                   >> 1397                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
                                                   >> 1398                 .tvaudio_addr = 0xb0,
                                                   >> 1399                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 1400                 .decoder      = EM28XX_TVP5150,
                                                   >> 1401                 .adecoder     = EM28XX_TVAUDIO,
                                                   >> 1402                 .mute_gpio    = compro_mute_gpio,
                                                   >> 1403                 .input        = { {
                                                   >> 1404                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1405                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1406                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1407                         .gpio     = compro_unmute_tv_gpio,
                                                   >> 1408                 }, {
                                                   >> 1409                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1410                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1411                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1412                         .gpio     = compro_unmute_svid_gpio,
                                                   >> 1413                 } },
                                                   >> 1414         },
                                                   >> 1415         [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
                                                   >> 1416                 .name         = "Kaiomy TVnPC U2",
                                                   >> 1417                 .vchannels    = 3,
                                                   >> 1418                 .tuner_type   = TUNER_XC2028,
                                                   >> 1419                 .tuner_addr   = 0x61,
                                                   >> 1420                 .mts_firmware = 1,
                                                   >> 1421                 .decoder      = EM28XX_TVP5150,
                                                   >> 1422                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1423                 .ir_codes     = ir_codes_kaiomy,
                                                   >> 1424                 .input          = { {
                                                   >> 1425                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1426                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1427                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1428 
                                                   >> 1429                 }, {
                                                   >> 1430                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1431                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1432                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1433                 }, {
                                                   >> 1434                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1435                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1436                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1437                 } },
                                                   >> 1438                 .radio          = {
                                                   >> 1439                         .type     = EM28XX_RADIO,
                                                   >> 1440                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1441                 }
                                                   >> 1442         },
                                                   >> 1443         [EM2860_BOARD_EASYCAP] = {
                                                   >> 1444                 .name         = "Easy Cap Capture DC-60",
                                                   >> 1445                 .vchannels    = 2,
                                                   >> 1446                 .tuner_type   = TUNER_ABSENT,
                                                   >> 1447                 .decoder      = EM28XX_SAA711X,
                                                   >> 1448                 .input           = { {
                                                   >> 1449                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1450                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1451                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1452                 }, {
                                                   >> 1453                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1454                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1455                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1456                 } },
                                                   >> 1457         },
                                                   >> 1458         [EM2820_BOARD_IODATA_GVMVP_SZ] = {
                                                   >> 1459                 .name       = "IO-DATA GV-MVP/SZ",
                                                   >> 1460                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
                                                   >> 1461                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1462                 .tda9887_conf = TDA9887_PRESENT,
                                                   >> 1463                 .decoder      = EM28XX_TVP5150,
                                                   >> 1464                 .input        = { {
                                                   >> 1465                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1466                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1467                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1468                 }, { /* Composite has not been tested yet */
                                                   >> 1469                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1470                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1471                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1472                 }, { /* S-video has not been tested yet */
                                                   >> 1473                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1474                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1475                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1476                 } },
                                                   >> 1477         },
                                                   >> 1478         [EM2860_BOARD_TERRATEC_GRABBY] = {
                                                   >> 1479                 .name            = "Terratec Grabby",
                                                   >> 1480                 .vchannels       = 2,
                                                   >> 1481                 .tuner_type      = TUNER_ABSENT,
                                                   >> 1482                 .decoder         = EM28XX_SAA711X,
                                                   >> 1483                 .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
                                                   >> 1484                 .input           = { {
                                                   >> 1485                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1486                         .vmux     = SAA7115_COMPOSITE0,
                                                   >> 1487                         .amux     = EM28XX_AMUX_VIDEO2,
                                                   >> 1488                 }, {
                                                   >> 1489                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1490                         .vmux     = SAA7115_SVIDEO3,
                                                   >> 1491                         .amux     = EM28XX_AMUX_VIDEO2,
                                                   >> 1492                 } },
                                                   >> 1493         },
                                                   >> 1494         [EM2860_BOARD_TERRATEC_AV350] = {
                                                   >> 1495                 .name            = "Terratec AV350",
                                                   >> 1496                 .vchannels       = 2,
                                                   >> 1497                 .tuner_type      = TUNER_ABSENT,
                                                   >> 1498                 .decoder         = EM28XX_TVP5150,
                                                   >> 1499                 .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
                                                   >> 1500                 .mute_gpio       = terratec_av350_mute_gpio,
                                                   >> 1501                 .input           = { {
                                                   >> 1502                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1503                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1504                         .amux     = EM28XX_AUDIO_SRC_LINE,
                                                   >> 1505                         .gpio     = terratec_av350_unmute_gpio,
                                                   >> 1506 
                                                   >> 1507                 }, {
                                                   >> 1508                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1509                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1510                         .amux     = EM28XX_AUDIO_SRC_LINE,
                                                   >> 1511                         .gpio     = terratec_av350_unmute_gpio,
                                                   >> 1512                 } },
                                                   >> 1513         },
                                                   >> 1514         [EM2882_BOARD_EVGA_INDTUBE] = {
                                                   >> 1515                 .name         = "Evga inDtube",
                                                   >> 1516                 .tuner_type   = TUNER_XC2028,
                                                   >> 1517                 .tuner_gpio   = default_tuner_gpio,
                                                   >> 1518                 .decoder      = EM28XX_TVP5150,
                                                   >> 1519                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
                                                   >> 1520                 .mts_firmware = 1,
                                                   >> 1521                 .has_dvb      = 1,
                                                   >> 1522                 .dvb_gpio     = evga_indtube_digital,
                                                   >> 1523                 .ir_codes     = ir_codes_evga_indtube,
                                                   >> 1524                 .input        = { {
                                                   >> 1525                         .type     = EM28XX_VMUX_TELEVISION,
                                                   >> 1526                         .vmux     = TVP5150_COMPOSITE0,
                                                   >> 1527                         .amux     = EM28XX_AMUX_VIDEO,
                                                   >> 1528                         .gpio     = evga_indtube_analog,
                                                   >> 1529                 }, {
                                                   >> 1530                         .type     = EM28XX_VMUX_COMPOSITE1,
                                                   >> 1531                         .vmux     = TVP5150_COMPOSITE1,
                                                   >> 1532                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1533                         .gpio     = evga_indtube_analog,
                                                   >> 1534                 }, {
                                                   >> 1535                         .type     = EM28XX_VMUX_SVIDEO,
                                                   >> 1536                         .vmux     = TVP5150_SVIDEO,
                                                   >> 1537                         .amux     = EM28XX_AMUX_LINE_IN,
                                                   >> 1538                         .gpio     = evga_indtube_analog,
                                                   >> 1539                 } },
                                                   >> 1540         },
                                                   >> 1541 };
                                                   >> 1542 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
                                                   >> 1543 
                                                   >> 1544 /* table of devices that work with this driver */
                                                   >> 1545 struct usb_device_id em28xx_id_table[] = {
                                                   >> 1546         { USB_DEVICE(0xeb1a, 0x2750),
                                                   >> 1547                         .driver_info = EM2750_BOARD_UNKNOWN },
                                                   >> 1548         { USB_DEVICE(0xeb1a, 0x2751),
                                                   >> 1549                         .driver_info = EM2750_BOARD_UNKNOWN },
                                                   >> 1550         { USB_DEVICE(0xeb1a, 0x2800),
                                                   >> 1551                         .driver_info = EM2800_BOARD_UNKNOWN },
                                                   >> 1552         { USB_DEVICE(0xeb1a, 0x2710),
                                                   >> 1553                         .driver_info = EM2820_BOARD_UNKNOWN },
                                                   >> 1554         { USB_DEVICE(0xeb1a, 0x2820),
417                         .driver_info = EM2820_    1555                         .driver_info = EM2820_BOARD_UNKNOWN },
418         { USB_DEVICE(0xeb1a, 0x2821),             1556         { USB_DEVICE(0xeb1a, 0x2821),
419                         .driver_info = EM2820_    1557                         .driver_info = EM2820_BOARD_UNKNOWN },
420         { USB_DEVICE(0xeb1a, 0x2860),             1558         { USB_DEVICE(0xeb1a, 0x2860),
421                         .driver_info = EM2820_    1559                         .driver_info = EM2820_BOARD_UNKNOWN },
422         { USB_DEVICE(0xeb1a, 0x2861),             1560         { USB_DEVICE(0xeb1a, 0x2861),
423                         .driver_info = EM2820_    1561                         .driver_info = EM2820_BOARD_UNKNOWN },
424         { USB_DEVICE(0xeb1a, 0x2870),             1562         { USB_DEVICE(0xeb1a, 0x2870),
425                         .driver_info = EM2820_    1563                         .driver_info = EM2820_BOARD_UNKNOWN },
426         { USB_DEVICE(0xeb1a, 0x2881),             1564         { USB_DEVICE(0xeb1a, 0x2881),
427                         .driver_info = EM2820_    1565                         .driver_info = EM2820_BOARD_UNKNOWN },
428         { USB_DEVICE(0xeb1a, 0x2883),             1566         { USB_DEVICE(0xeb1a, 0x2883),
429                         .driver_info = EM2820_    1567                         .driver_info = EM2820_BOARD_UNKNOWN },
                                                   >> 1568         { USB_DEVICE(0xeb1a, 0xe300),
                                                   >> 1569                         .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
                                                   >> 1570         { USB_DEVICE(0xeb1a, 0xe303),
                                                   >> 1571                         .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
                                                   >> 1572         { USB_DEVICE(0xeb1a, 0xe305),
                                                   >> 1573                         .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
                                                   >> 1574         { USB_DEVICE(0xeb1a, 0xe310),
                                                   >> 1575                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
                                                   >> 1576         { USB_DEVICE(0xeb1a, 0xa313),
                                                   >> 1577                 .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
                                                   >> 1578         { USB_DEVICE(0xeb1a, 0xa316),
                                                   >> 1579                         .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
                                                   >> 1580         { USB_DEVICE(0xeb1a, 0xe320),
                                                   >> 1581                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
                                                   >> 1582         { USB_DEVICE(0xeb1a, 0xe323),
                                                   >> 1583                         .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
                                                   >> 1584         { USB_DEVICE(0xeb1a, 0xe350),
                                                   >> 1585                         .driver_info = EM2870_BOARD_KWORLD_350U },
                                                   >> 1586         { USB_DEVICE(0xeb1a, 0xe355),
                                                   >> 1587                         .driver_info = EM2870_BOARD_KWORLD_355U },
                                                   >> 1588         { USB_DEVICE(0xeb1a, 0x2801),
                                                   >> 1589                         .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
                                                   >> 1590         { USB_DEVICE(0xeb1a, 0xe357),
                                                   >> 1591                         .driver_info = EM2870_BOARD_KWORLD_355U },
                                                   >> 1592         { USB_DEVICE(0x1b80, 0xe302),
                                                   >> 1593                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
430         { USB_DEVICE(0x0ccd, 0x0036),             1594         { USB_DEVICE(0x0ccd, 0x0036),
431                         .driver_info = EM2820_    1595                         .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
432         { USB_DEVICE(0x2304, 0x0208),          !! 1596         { USB_DEVICE(0x0ccd, 0x004c),
433                         .driver_info = EM2820_ !! 1597                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
                                                   >> 1598         { USB_DEVICE(0x0ccd, 0x004f),
                                                   >> 1599                         .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
                                                   >> 1600         { USB_DEVICE(0x0ccd, 0x005e),
                                                   >> 1601                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
                                                   >> 1602         { USB_DEVICE(0x0ccd, 0x0042),
                                                   >> 1603                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
                                                   >> 1604         { USB_DEVICE(0x0ccd, 0x0043),
                                                   >> 1605                         .driver_info = EM2870_BOARD_TERRATEC_XS },
                                                   >> 1606         { USB_DEVICE(0x0ccd, 0x0047),
                                                   >> 1607                         .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
                                                   >> 1608         { USB_DEVICE(0x0ccd, 0x0084),
                                                   >> 1609                         .driver_info = EM2860_BOARD_TERRATEC_AV350 },
                                                   >> 1610         { USB_DEVICE(0x0ccd, 0x0096),
                                                   >> 1611                         .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
                                                   >> 1612         { USB_DEVICE(0x185b, 0x2870),
                                                   >> 1613                         .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
                                                   >> 1614         { USB_DEVICE(0x185b, 0x2041),
                                                   >> 1615                         .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
434         { USB_DEVICE(0x2040, 0x4200),             1616         { USB_DEVICE(0x2040, 0x4200),
435                         .driver_info = EM2820_    1617                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
436         { USB_DEVICE(0x2040, 0x4201),             1618         { USB_DEVICE(0x2040, 0x4201),
437                         .driver_info = EM2820_    1619                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
                                                   >> 1620         { USB_DEVICE(0x2040, 0x6500),
                                                   >> 1621                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
                                                   >> 1622         { USB_DEVICE(0x2040, 0x6502),
                                                   >> 1623                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
                                                   >> 1624         { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
                                                   >> 1625                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
                                                   >> 1626         { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
                                                   >> 1627                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
                                                   >> 1628         { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
                                                   >> 1629                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
                                                   >> 1630         { USB_DEVICE(0x2040, 0x651f),
                                                   >> 1631                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
                                                   >> 1632         { USB_DEVICE(0x0438, 0xb002),
                                                   >> 1633                         .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
                                                   >> 1634         { USB_DEVICE(0x2001, 0xf112),
                                                   >> 1635                         .driver_info = EM2820_BOARD_DLINK_USB_TV },
438         { USB_DEVICE(0x2304, 0x0207),             1636         { USB_DEVICE(0x2304, 0x0207),
439                         .driver_info = EM2820_    1637                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
                                                   >> 1638         { USB_DEVICE(0x2304, 0x0208),
                                                   >> 1639                         .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
440         { USB_DEVICE(0x2304, 0x021a),             1640         { USB_DEVICE(0x2304, 0x021a),
441                         .driver_info = EM2820_    1641                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
442         { USB_DEVICE(0x2040, 0x6500),          !! 1642         { USB_DEVICE(0x2304, 0x0226),
443                         .driver_info = EM2880_ !! 1643                         .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
444         { USB_DEVICE(0x2040, 0x6502),          !! 1644         { USB_DEVICE(0x2304, 0x0227),
445                         .driver_info = EM2880_ !! 1645                         .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
446         { USB_DEVICE(0x2040, 0x6513),          !! 1646         { USB_DEVICE(0x0413, 0x6023),
447                         .driver_info = EM2880_ !! 1647                         .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
448         { USB_DEVICE(0x0ccd, 0x0042),          !! 1648         { USB_DEVICE(0x093b, 0xa005),
449                         .driver_info = EM2880_ !! 1649                         .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
450         { USB_DEVICE(0x0ccd, 0x0047),          !! 1650         { USB_DEVICE(0x04bb, 0x0515),
451                         .driver_info = EM2880_ !! 1651                         .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
452         { },                                      1652         { },
453 };                                                1653 };
454 MODULE_DEVICE_TABLE(usb, em28xx_id_table);        1654 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
455                                                   1655 
456 /* EEPROM hash table for devices with generic  !! 1656 /*
457 static struct em28xx_hash_table em28xx_eeprom_ !! 1657  * EEPROM hash table for devices with generic USB IDs
                                                   >> 1658  */
                                                   >> 1659 static struct em28xx_hash_table em28xx_eeprom_hash[] = {
458         /* P/N: SA 60002070465 Tuner: TVF7533-    1660         /* P/N: SA 60002070465 Tuner: TVF7533-MF */
459         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAY    1661         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
                                                   >> 1662         {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
                                                   >> 1663         {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
                                                   >> 1664         {0x9567eb1a, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
                                                   >> 1665         {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
                                                   >> 1666         {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
                                                   >> 1667 };
                                                   >> 1668 
                                                   >> 1669 /* I2C devicelist hash table for devices with generic USB IDs */
                                                   >> 1670 static struct em28xx_hash_table em28xx_i2c_hash[] = {
                                                   >> 1671         {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
                                                   >> 1672         {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
                                                   >> 1673         {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
                                                   >> 1674         {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
                                                   >> 1675 };
                                                   >> 1676 
                                                   >> 1677 /* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
                                                   >> 1678 static unsigned short saa711x_addrs[] = {
                                                   >> 1679         0x4a >> 1, 0x48 >> 1,   /* SAA7111, SAA7111A and SAA7113 */
                                                   >> 1680         0x42 >> 1, 0x40 >> 1,   /* SAA7114, SAA7115 and SAA7118 */
                                                   >> 1681         I2C_CLIENT_END };
                                                   >> 1682 
                                                   >> 1683 static unsigned short tvp5150_addrs[] = {
                                                   >> 1684         0xb8 >> 1,
                                                   >> 1685         0xba >> 1,
                                                   >> 1686         I2C_CLIENT_END
                                                   >> 1687 };
                                                   >> 1688 
                                                   >> 1689 static unsigned short mt9v011_addrs[] = {
                                                   >> 1690         0xba >> 1,
                                                   >> 1691         I2C_CLIENT_END
460 };                                                1692 };
461                                                   1693 
462 /* I2C devicelist hash table for devices with  !! 1694 static unsigned short msp3400_addrs[] = {
463 static struct em28xx_hash_table em28xx_i2c_has !! 1695         0x80 >> 1,
464         {0xb06a32c3, EM2800_BOARD_TERRATEC_CIN !! 1696         0x88 >> 1,
465         {0xf51200e3, EM2800_BOARD_VGEAR_POCKET !! 1697         I2C_CLIENT_END
466 };                                                1698 };
467                                                   1699 
                                                   >> 1700 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
                                                   >> 1701 {
                                                   >> 1702         int rc = 0;
                                                   >> 1703         struct em28xx *dev = ptr;
                                                   >> 1704 
                                                   >> 1705         if (dev->tuner_type != TUNER_XC2028)
                                                   >> 1706                 return 0;
                                                   >> 1707 
                                                   >> 1708         if (command != XC2028_TUNER_RESET)
                                                   >> 1709                 return 0;
                                                   >> 1710 
                                                   >> 1711         rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
                                                   >> 1712 
                                                   >> 1713         return rc;
                                                   >> 1714 }
                                                   >> 1715 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
                                                   >> 1716 
                                                   >> 1717 static inline void em28xx_set_model(struct em28xx *dev)
                                                   >> 1718 {
                                                   >> 1719         memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board));
                                                   >> 1720 
                                                   >> 1721         /* Those are the default values for the majority of boards
                                                   >> 1722            Use those values if not specified otherwise at boards entry
                                                   >> 1723          */
                                                   >> 1724         if (!dev->board.xclk)
                                                   >> 1725                 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
                                                   >> 1726                                   EM28XX_XCLK_FREQUENCY_12MHZ;
                                                   >> 1727 
                                                   >> 1728         if (!dev->board.i2c_speed)
                                                   >> 1729                 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
                                                   >> 1730                                        EM28XX_I2C_FREQ_100_KHZ;
                                                   >> 1731 }
                                                   >> 1732 
                                                   >> 1733 
                                                   >> 1734 /* FIXME: Should be replaced by a proper mt9m111 driver */
                                                   >> 1735 static int em28xx_initialize_mt9m111(struct em28xx *dev)
                                                   >> 1736 {
                                                   >> 1737         int i;
                                                   >> 1738         unsigned char regs[][3] = {
                                                   >> 1739                 { 0x0d, 0x00, 0x01, },  /* reset and use defaults */
                                                   >> 1740                 { 0x0d, 0x00, 0x00, },
                                                   >> 1741                 { 0x0a, 0x00, 0x21, },
                                                   >> 1742                 { 0x21, 0x04, 0x00, },  /* full readout speed, no row/col skipping */
                                                   >> 1743         };
                                                   >> 1744 
                                                   >> 1745         for (i = 0; i < ARRAY_SIZE(regs); i++)
                                                   >> 1746                 i2c_master_send(&dev->i2c_client, &regs[i][0], 3);
                                                   >> 1747 
                                                   >> 1748         return 0;
                                                   >> 1749 }
                                                   >> 1750 
                                                   >> 1751 
                                                   >> 1752 /* FIXME: Should be replaced by a proper mt9m001 driver */
                                                   >> 1753 static int em28xx_initialize_mt9m001(struct em28xx *dev)
                                                   >> 1754 {
                                                   >> 1755         int i;
                                                   >> 1756         unsigned char regs[][3] = {
                                                   >> 1757                 { 0x0d, 0x00, 0x01, },
                                                   >> 1758                 { 0x0d, 0x00, 0x00, },
                                                   >> 1759                 { 0x04, 0x05, 0x00, },  /* hres = 1280 */
                                                   >> 1760                 { 0x03, 0x04, 0x00, },  /* vres = 1024 */
                                                   >> 1761                 { 0x20, 0x11, 0x00, },
                                                   >> 1762                 { 0x06, 0x00, 0x10, },
                                                   >> 1763                 { 0x2b, 0x00, 0x24, },
                                                   >> 1764                 { 0x2e, 0x00, 0x24, },
                                                   >> 1765                 { 0x35, 0x00, 0x24, },
                                                   >> 1766                 { 0x2d, 0x00, 0x20, },
                                                   >> 1767                 { 0x2c, 0x00, 0x20, },
                                                   >> 1768                 { 0x09, 0x0a, 0xd4, },
                                                   >> 1769                 { 0x35, 0x00, 0x57, },
                                                   >> 1770         };
                                                   >> 1771 
                                                   >> 1772         for (i = 0; i < ARRAY_SIZE(regs); i++)
                                                   >> 1773                 i2c_master_send(&dev->i2c_client, &regs[i][0], 3);
                                                   >> 1774 
                                                   >> 1775         return 0;
                                                   >> 1776 }
                                                   >> 1777 
                                                   >> 1778 /* HINT method: webcam I2C chips
                                                   >> 1779  *
                                                   >> 1780  * This method works for webcams with Micron sensors
                                                   >> 1781  */
                                                   >> 1782 static int em28xx_hint_sensor(struct em28xx *dev)
                                                   >> 1783 {
                                                   >> 1784         int rc;
                                                   >> 1785         char *sensor_name;
                                                   >> 1786         unsigned char cmd;
                                                   >> 1787         __be16 version_be;
                                                   >> 1788         u16 version;
                                                   >> 1789 
                                                   >> 1790         /* Micron sensor detection */
                                                   >> 1791         dev->i2c_client.addr = 0xba >> 1;
                                                   >> 1792         cmd = 0;
                                                   >> 1793         i2c_master_send(&dev->i2c_client, &cmd, 1);
                                                   >> 1794         rc = i2c_master_recv(&dev->i2c_client, (char *)&version_be, 2);
                                                   >> 1795         if (rc != 2)
                                                   >> 1796                 return -EINVAL;
                                                   >> 1797 
                                                   >> 1798         version = be16_to_cpu(version_be);
                                                   >> 1799         switch (version) {
                                                   >> 1800         case 0x8232:            /* mt9v011 640x480 1.3 Mpix sensor */
                                                   >> 1801         case 0x8243:            /* mt9v011 rev B 640x480 1.3 Mpix sensor */
                                                   >> 1802                 dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
                                                   >> 1803                 em28xx_set_model(dev);
                                                   >> 1804 
                                                   >> 1805                 sensor_name = "mt9v011";
                                                   >> 1806                 dev->em28xx_sensor = EM28XX_MT9V011;
                                                   >> 1807                 dev->sensor_xres = 640;
                                                   >> 1808                 dev->sensor_yres = 480;
                                                   >> 1809                 /*
                                                   >> 1810                  * FIXME: mt9v011 uses I2S speed as xtal clk - at least with
                                                   >> 1811                  * the Silvercrest cam I have here for testing - for higher
                                                   >> 1812                  * resolutions, a high clock cause horizontal artifacts, so we
                                                   >> 1813                  * need to use a lower xclk frequency.
                                                   >> 1814                  * Yet, it would be possible to adjust xclk depending on the
                                                   >> 1815                  * desired resolution, since this affects directly the
                                                   >> 1816                  * frame rate.
                                                   >> 1817                  */
                                                   >> 1818                 dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ;
                                                   >> 1819                 dev->sensor_xtal = 4300000;
                                                   >> 1820 
                                                   >> 1821                 /* probably means GRGB 16 bit bayer */
                                                   >> 1822                 dev->vinmode = 0x0d;
                                                   >> 1823                 dev->vinctl = 0x00;
                                                   >> 1824 
                                                   >> 1825                 break;
                                                   >> 1826 
                                                   >> 1827         case 0x143a:    /* MT9M111 as found in the ECS G200 */
                                                   >> 1828                 dev->model = EM2750_BOARD_UNKNOWN;
                                                   >> 1829                 em28xx_set_model(dev);
                                                   >> 1830 
                                                   >> 1831                 sensor_name = "mt9m111";
                                                   >> 1832                 dev->board.xclk = EM28XX_XCLK_FREQUENCY_48MHZ;
                                                   >> 1833                 dev->em28xx_sensor = EM28XX_MT9M111;
                                                   >> 1834                 em28xx_initialize_mt9m111(dev);
                                                   >> 1835                 dev->sensor_xres = 640;
                                                   >> 1836                 dev->sensor_yres = 512;
                                                   >> 1837 
                                                   >> 1838                 dev->vinmode = 0x0a;
                                                   >> 1839                 dev->vinctl = 0x00;
                                                   >> 1840 
                                                   >> 1841                 break;
                                                   >> 1842 
                                                   >> 1843         case 0x8431:
                                                   >> 1844                 dev->model = EM2750_BOARD_UNKNOWN;
                                                   >> 1845                 em28xx_set_model(dev);
                                                   >> 1846 
                                                   >> 1847                 sensor_name = "mt9m001";
                                                   >> 1848                 dev->em28xx_sensor = EM28XX_MT9M001;
                                                   >> 1849                 em28xx_initialize_mt9m001(dev);
                                                   >> 1850                 dev->sensor_xres = 1280;
                                                   >> 1851                 dev->sensor_yres = 1024;
                                                   >> 1852 
                                                   >> 1853                 /* probably means BGGR 16 bit bayer */
                                                   >> 1854                 dev->vinmode = 0x0c;
                                                   >> 1855                 dev->vinctl = 0x00;
                                                   >> 1856 
                                                   >> 1857                 break;
                                                   >> 1858         default:
                                                   >> 1859                 printk("Unknown Micron Sensor 0x%04x\n", version);
                                                   >> 1860                 return -EINVAL;
                                                   >> 1861         }
                                                   >> 1862 
                                                   >> 1863         /* Setup webcam defaults */
                                                   >> 1864         em28xx_pre_card_setup(dev);
                                                   >> 1865 
                                                   >> 1866         em28xx_errdev("Sensor is %s, using model %s entry.\n",
                                                   >> 1867                       sensor_name, em28xx_boards[dev->model].name);
                                                   >> 1868 
                                                   >> 1869         return 0;
                                                   >> 1870 }
                                                   >> 1871 
468 /* Since em28xx_pre_card_setup() requires a pr    1872 /* Since em28xx_pre_card_setup() requires a proper dev->model,
469  * this won't work for boards with generic PCI    1873  * this won't work for boards with generic PCI IDs
470  */                                               1874  */
471 void em28xx_pre_card_setup(struct em28xx *dev)    1875 void em28xx_pre_card_setup(struct em28xx *dev)
472 {                                                 1876 {
                                                   >> 1877         /* Set the initial XCLK and I2C clock values based on the board
                                                   >> 1878            definition */
                                                   >> 1879         em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
                                                   >> 1880         em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
                                                   >> 1881         msleep(50);
                                                   >> 1882 
473         /* request some modules */                1883         /* request some modules */
474         switch (dev->model) {                     1884         switch (dev->model) {
475         case EM2880_BOARD_TERRATEC_PRODIGY_XS: !! 1885         case EM2861_BOARD_PLEXTOR_PX_TV100U:
476         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ !! 1886                 /* Sets the msp34xx I2S speed */
477         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ !! 1887                 dev->i2s_speed = 2048000;
478         case EM2880_BOARD_TERRATEC_HYBRID_XS:  !! 1888                 break;
479                 em28xx_write_regs(dev, XCLK_RE !! 1889         case EM2861_BOARD_KWORLD_PVRTV_300U:
480                 em28xx_write_regs(dev, I2C_CLK !! 1890         case EM2880_BOARD_KWORLD_DVB_305U:
481                 em28xx_write_regs(dev, 0x08, " !! 1891                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
482                 em28xx_write_regs(dev, 0x04, " !! 1892                 msleep(10);
483                 msleep(100);                   !! 1893                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
484                 em28xx_write_regs(dev, 0x04, " !! 1894                 msleep(10);
485                 msleep(100);                   !! 1895                 break;
                                                   >> 1896         case EM2870_BOARD_COMPRO_VIDEOMATE:
                                                   >> 1897                 /* TODO: someone can do some cleanup here...
                                                   >> 1898                          not everything's needed */
                                                   >> 1899                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
                                                   >> 1900                 msleep(10);
                                                   >> 1901                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
                                                   >> 1902                 msleep(10);
                                                   >> 1903                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
                                                   >> 1904                 mdelay(70);
                                                   >> 1905                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
                                                   >> 1906                 mdelay(70);
                                                   >> 1907                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
                                                   >> 1908                 mdelay(70);
                                                   >> 1909                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
                                                   >> 1910                 mdelay(70);
                                                   >> 1911                 break;
                                                   >> 1912         case EM2870_BOARD_TERRATEC_XS_MT2060:
                                                   >> 1913                 /* this device needs some gpio writes to get the DVB-T
                                                   >> 1914                    demod work */
                                                   >> 1915                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
                                                   >> 1916                 mdelay(70);
                                                   >> 1917                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
                                                   >> 1918                 mdelay(70);
                                                   >> 1919                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
                                                   >> 1920                 mdelay(70);
                                                   >> 1921                 break;
                                                   >> 1922         case EM2870_BOARD_PINNACLE_PCTV_DVB:
                                                   >> 1923                 /* this device needs some gpio writes to get the
                                                   >> 1924                    DVB-T demod work */
                                                   >> 1925                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
                                                   >> 1926                 mdelay(70);
                                                   >> 1927                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
                                                   >> 1928                 mdelay(70);
                                                   >> 1929                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
                                                   >> 1930                 mdelay(70);
                                                   >> 1931                 break;
                                                   >> 1932         case EM2820_BOARD_GADMEI_UTV310:
                                                   >> 1933         case EM2820_BOARD_MSI_VOX_USB_2:
                                                   >> 1934                 /* enables audio for that devices */
                                                   >> 1935                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
                                                   >> 1936                 break;
                                                   >> 1937 
                                                   >> 1938         case EM2882_BOARD_KWORLD_ATSC_315U:
                                                   >> 1939                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
                                                   >> 1940                 msleep(10);
                                                   >> 1941                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
                                                   >> 1942                 msleep(10);
                                                   >> 1943                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
                                                   >> 1944                 msleep(10);
                                                   >> 1945                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
                                                   >> 1946                 msleep(10);
                                                   >> 1947                 break;
                                                   >> 1948 
                                                   >> 1949         case EM2860_BOARD_KAIOMY_TVNPC_U2:
                                                   >> 1950                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
                                                   >> 1951                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
                                                   >> 1952                 em28xx_write_regs(dev, 0x0d, "\x42", 1);
                                                   >> 1953                 em28xx_write_regs(dev, 0x08, "\xfd", 1);
                                                   >> 1954                 msleep(10);
486                 em28xx_write_regs(dev, 0x08, "    1955                 em28xx_write_regs(dev, 0x08, "\xff", 1);
487                 msleep(50);                    !! 1956                 msleep(10);
488                 em28xx_write_regs(dev, 0x08, " !! 1957                 em28xx_write_regs(dev, 0x08, "\x7f", 1);
489                 msleep(50);                    !! 1958                 msleep(10);
490                 em28xx_write_regs(dev, 0x08, " !! 1959                 em28xx_write_regs(dev, 0x08, "\x6b", 1);
                                                   >> 1960 
                                                   >> 1961                 break;
                                                   >> 1962         case EM2860_BOARD_EASYCAP:
                                                   >> 1963                 em28xx_write_regs(dev, 0x08, "\xf8", 1);
491                 break;                            1964                 break;
492         }                                      << 
493 }                                              << 
494                                                   1965 
495 static int em28xx_tuner_callback(void *ptr, in !! 1966         case EM2820_BOARD_IODATA_GVMVP_SZ:
496 {                                              !! 1967                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
497         int rc = 0;                            !! 1968                 msleep(70);
498         struct em28xx *dev = ptr;              !! 1969                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
                                                   >> 1970                 msleep(10);
                                                   >> 1971                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
                                                   >> 1972                 msleep(70);
                                                   >> 1973                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
                                                   >> 1974                 msleep(70);
                                                   >> 1975                 break;
                                                   >> 1976         }
499                                                   1977 
500         if (dev->tuner_type != TUNER_XC2028)   !! 1978         em28xx_gpio_set(dev, dev->board.tuner_gpio);
501                 return 0;                      !! 1979         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
502                                                   1980 
503         switch (command) {                     !! 1981         /* Unlock device */
504         case XC2028_TUNER_RESET:               !! 1982         em28xx_set_mode(dev, EM28XX_SUSPEND);
505         {                                      !! 1983 }
506                 /* GPIO and initialization cod << 
507                    This code should be complem << 
508                    codes are different.        << 
509                  */                            << 
510                                                   1984 
511                 dev->em28xx_write_regs_req(dev !! 1985 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
512                 dev->em28xx_write_regs_req(dev !! 1986 {
                                                   >> 1987         memset(ctl, 0, sizeof(*ctl));
513                                                   1988 
514                 if (dev->analog_gpio) {        !! 1989         ctl->fname   = XC2028_DEFAULT_FIRMWARE;
515                         char gpio0 = dev->anal !! 1990         ctl->max_len = 64;
516                         char gpio1 = (dev->ana !! 1991         ctl->mts = em28xx_boards[dev->model].mts_firmware;
517                         char gpio4 = dev->anal << 
518                                                << 
519                         if (gpio4) {           << 
520                                 dev->em28xx_wr << 
521                                 msleep(140);   << 
522                         }                      << 
523                                                << 
524                         msleep(6);             << 
525                         dev->em28xx_write_regs << 
526                         msleep(10);            << 
527                         dev->em28xx_write_regs << 
528                         msleep(5);             << 
529                 }                              << 
530                                                   1992 
                                                   >> 1993         switch (dev->model) {
                                                   >> 1994         case EM2880_BOARD_EMPIRE_DUAL_TV:
                                                   >> 1995         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
                                                   >> 1996                 ctl->demod = XC3028_FE_ZARLINK456;
531                 break;                            1997                 break;
                                                   >> 1998         case EM2880_BOARD_TERRATEC_HYBRID_XS:
                                                   >> 1999         case EM2881_BOARD_PINNACLE_HYBRID_PRO:
                                                   >> 2000                 ctl->demod = XC3028_FE_ZARLINK456;
                                                   >> 2001                 break;
                                                   >> 2002         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
                                                   >> 2003                 /* djh - Not sure which demod we need here */
                                                   >> 2004                 ctl->demod = XC3028_FE_DEFAULT;
                                                   >> 2005                 break;
                                                   >> 2006         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
                                                   >> 2007                 ctl->demod = XC3028_FE_DEFAULT;
                                                   >> 2008                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
                                                   >> 2009                 break;
                                                   >> 2010         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
                                                   >> 2011         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
                                                   >> 2012         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
                                                   >> 2013                 /* FIXME: Better to specify the needed IF */
                                                   >> 2014                 ctl->demod = XC3028_FE_DEFAULT;
                                                   >> 2015                 break;
                                                   >> 2016         case EM2883_BOARD_KWORLD_HYBRID_330U:
                                                   >> 2017                 ctl->demod = XC3028_FE_CHINA;
                                                   >> 2018                 ctl->fname = XC2028_DEFAULT_FIRMWARE;
                                                   >> 2019                 break;
                                                   >> 2020         case EM2882_BOARD_EVGA_INDTUBE:
                                                   >> 2021                 ctl->demod = XC3028_FE_CHINA;
                                                   >> 2022                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
                                                   >> 2023                 break;
                                                   >> 2024         default:
                                                   >> 2025                 ctl->demod = XC3028_FE_OREN538;
532         }                                         2026         }
533         }                                      << 
534         return rc;                             << 
535 }                                                 2027 }
536                                                   2028 
537 static void em28xx_config_tuner(struct em28xx  !! 2029 static void em28xx_tuner_setup(struct em28xx *dev)
538 {                                                 2030 {
539         struct v4l2_priv_tun_config  xc2028_cf << 
540         struct xc2028_ctrl           ctl;      << 
541         struct tuner_setup           tun_setup    2031         struct tuner_setup           tun_setup;
542         struct v4l2_frequency        f;           2032         struct v4l2_frequency        f;
543                                                   2033 
544         if (dev->tuner_type == TUNER_ABSENT)      2034         if (dev->tuner_type == TUNER_ABSENT)
545                 return;                           2035                 return;
546                                                   2036 
                                                   >> 2037         memset(&tun_setup, 0, sizeof(tun_setup));
                                                   >> 2038 
547         tun_setup.mode_mask = T_ANALOG_TV | T_    2039         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
548         tun_setup.type = dev->tuner_type;      << 
549         tun_setup.addr = dev->tuner_addr;      << 
550         tun_setup.tuner_callback = em28xx_tune    2040         tun_setup.tuner_callback = em28xx_tuner_callback;
551                                                   2041 
552         em28xx_i2c_call_clients(dev, TUNER_SET !! 2042         if (dev->board.radio.type) {
                                                   >> 2043                 tun_setup.type = dev->board.radio.type;
                                                   >> 2044                 tun_setup.addr = dev->board.radio_addr;
                                                   >> 2045 
                                                   >> 2046                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
                                                   >> 2047         }
                                                   >> 2048 
                                                   >> 2049         if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) {
                                                   >> 2050                 tun_setup.type   = dev->tuner_type;
                                                   >> 2051                 tun_setup.addr   = dev->tuner_addr;
                                                   >> 2052 
                                                   >> 2053                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
                                                   >> 2054         }
                                                   >> 2055 
                                                   >> 2056         if (dev->tda9887_conf) {
                                                   >> 2057                 struct v4l2_priv_tun_config tda9887_cfg;
                                                   >> 2058 
                                                   >> 2059                 tda9887_cfg.tuner = TUNER_TDA9887;
                                                   >> 2060                 tda9887_cfg.priv = &dev->tda9887_conf;
                                                   >> 2061 
                                                   >> 2062                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &tda9887_cfg);
                                                   >> 2063         }
553                                                   2064 
554         if (dev->tuner_type == TUNER_XC2028) {    2065         if (dev->tuner_type == TUNER_XC2028) {
                                                   >> 2066                 struct v4l2_priv_tun_config  xc2028_cfg;
                                                   >> 2067                 struct xc2028_ctrl           ctl;
                                                   >> 2068 
                                                   >> 2069                 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
555                 memset(&ctl, 0, sizeof(ctl));     2070                 memset(&ctl, 0, sizeof(ctl));
556                                                   2071 
557                 ctl.fname   = XC2028_DEFAULT_F !! 2072                 em28xx_setup_xc3028(dev, &ctl);
558                 ctl.max_len = 64;              << 
559                 ctl.mts = em28xx_boards[dev->m << 
560                                                   2073 
561                 xc2028_cfg.tuner = TUNER_XC202    2074                 xc2028_cfg.tuner = TUNER_XC2028;
562                 xc2028_cfg.priv  = &ctl;          2075                 xc2028_cfg.priv  = &ctl;
563                                                   2076 
564                 em28xx_i2c_call_clients(dev, T !! 2077                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &xc2028_cfg);
565         }                                         2078         }
566                                                   2079 
567         /* configure tuner */                     2080         /* configure tuner */
568         f.tuner = 0;                              2081         f.tuner = 0;
569         f.type = V4L2_TUNER_ANALOG_TV;            2082         f.type = V4L2_TUNER_ANALOG_TV;
570         f.frequency = 9076;     /* just a magi    2083         f.frequency = 9076;     /* just a magic number */
571         dev->ctl_freq = f.frequency;              2084         dev->ctl_freq = f.frequency;
572         em28xx_i2c_call_clients(dev, VIDIOC_S_ !! 2085         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
573 }                                                 2086 }
574                                                   2087 
575 static int em28xx_hint_board(struct em28xx *de    2088 static int em28xx_hint_board(struct em28xx *dev)
576 {                                                 2089 {
577         int i;                                    2090         int i;
578                                                   2091 
579         /* HINT method: EEPROM                    2092         /* HINT method: EEPROM
580          *                                        2093          *
581          * This method works only for boards w    2094          * This method works only for boards with eeprom.
582          * Uses a hash of all eeprom bytes. Th    2095          * Uses a hash of all eeprom bytes. The hash should be
583          * unique for a vendor/tuner pair.        2096          * unique for a vendor/tuner pair.
584          * There are a high chance that tuners    2097          * There are a high chance that tuners for different
585          * video standards produce different h    2098          * video standards produce different hashes.
586          */                                       2099          */
587         for (i = 0; i < ARRAY_SIZE(em28xx_eepr    2100         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
588                 if (dev->hash == em28xx_eeprom    2101                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
589                         dev->model = em28xx_ee    2102                         dev->model = em28xx_eeprom_hash[i].model;
590                         dev->tuner_type = em28    2103                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
591                                                   2104 
592                         em28xx_errdev("Your bo    2105                         em28xx_errdev("Your board has no unique USB ID.\n");
593                         em28xx_errdev("A hint     2106                         em28xx_errdev("A hint were successfully done, "
594                                       "based o    2107                                       "based on eeprom hash.\n");
595                         em28xx_errdev("This me    2108                         em28xx_errdev("This method is not 100%% failproof.\n");
596                         em28xx_errdev("If the     2109                         em28xx_errdev("If the board were missdetected, "
597                                       "please     2110                                       "please email this log to:\n");
598                         em28xx_errdev("\tV4L M    2111                         em28xx_errdev("\tV4L Mailing List "
599                                       " <video !! 2112                                       " <linux-media@vger.kernel.org>\n");
600                         em28xx_errdev("Board d    2113                         em28xx_errdev("Board detected as %s\n",
601                                       em28xx_b    2114                                       em28xx_boards[dev->model].name);
602                                                   2115 
603                         return 0;                 2116                         return 0;
604                 }                                 2117                 }
605         }                                         2118         }
606                                                   2119 
607         /* HINT method: I2C attached devices      2120         /* HINT method: I2C attached devices
608          *                                        2121          *
609          * This method works for all boards.      2122          * This method works for all boards.
610          * Uses a hash of i2c scanned devices.    2123          * Uses a hash of i2c scanned devices.
611          * Devices with the same i2c attached     2124          * Devices with the same i2c attached chips will
612          * be considered equal.                   2125          * be considered equal.
613          * This method is less precise than th    2126          * This method is less precise than the eeprom one.
614          */                                       2127          */
615                                                   2128 
616         /* user did not request i2c scanning =    2129         /* user did not request i2c scanning => do it now */
617         if (!dev->i2c_hash)                       2130         if (!dev->i2c_hash)
618                 em28xx_do_i2c_scan(dev);          2131                 em28xx_do_i2c_scan(dev);
619                                                   2132 
620         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_    2133         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
621                 if (dev->i2c_hash == em28xx_i2    2134                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
622                         dev->model = em28xx_i2    2135                         dev->model = em28xx_i2c_hash[i].model;
623                         dev->tuner_type = em28    2136                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
624                         em28xx_errdev("Your bo    2137                         em28xx_errdev("Your board has no unique USB ID.\n");
625                         em28xx_errdev("A hint     2138                         em28xx_errdev("A hint were successfully done, "
626                                       "based o    2139                                       "based on i2c devicelist hash.\n");
627                         em28xx_errdev("This me    2140                         em28xx_errdev("This method is not 100%% failproof.\n");
628                         em28xx_errdev("If the     2141                         em28xx_errdev("If the board were missdetected, "
629                                       "please     2142                                       "please email this log to:\n");
630                         em28xx_errdev("\tV4L M    2143                         em28xx_errdev("\tV4L Mailing List "
631                                       " <video !! 2144                                       " <linux-media@vger.kernel.org>\n");
632                         em28xx_errdev("Board d    2145                         em28xx_errdev("Board detected as %s\n",
633                                       em28xx_b    2146                                       em28xx_boards[dev->model].name);
634                                                   2147 
635                         return 0;                 2148                         return 0;
636                 }                                 2149                 }
637         }                                         2150         }
638                                                   2151 
639         em28xx_errdev("Your board has no uniqu    2152         em28xx_errdev("Your board has no unique USB ID and thus need a "
640                       "hint to be detected.\n"    2153                       "hint to be detected.\n");
641         em28xx_errdev("You may try to use card    2154         em28xx_errdev("You may try to use card=<n> insmod option to "
642                       "workaround that.\n");      2155                       "workaround that.\n");
643         em28xx_errdev("Please send an email wi    2156         em28xx_errdev("Please send an email with this log to:\n");
644         em28xx_errdev("\tV4L Mailing List <vid !! 2157         em28xx_errdev("\tV4L Mailing List <linux-media@vger.kernel.org>\n");
645         em28xx_errdev("Board eeprom hash is 0x    2158         em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
646         em28xx_errdev("Board i2c devicelist ha    2159         em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
647                                                   2160 
648         em28xx_errdev("Here is a list of valid    2161         em28xx_errdev("Here is a list of valid choices for the card=<n>"
649                       " insmod option:\n");       2162                       " insmod option:\n");
650         for (i = 0; i < em28xx_bcount; i++) {     2163         for (i = 0; i < em28xx_bcount; i++) {
651                 em28xx_errdev("    card=%d ->     2164                 em28xx_errdev("    card=%d -> %s\n",
652                                 i, em28xx_boar    2165                                 i, em28xx_boards[i].name);
653         }                                         2166         }
654         return -1;                                2167         return -1;
655 }                                                 2168 }
656                                                   2169 
657                                                << 
658 static void em28xx_set_model(struct em28xx *de << 
659 {                                              << 
660         dev->is_em2800 = em28xx_boards[dev->mo << 
661         dev->has_msp34xx = em28xx_boards[dev-> << 
662         dev->tda9887_conf = em28xx_boards[dev- << 
663         dev->decoder = em28xx_boards[dev->mode << 
664         dev->video_inputs = em28xx_boards[dev- << 
665         dev->analog_gpio = em28xx_boards[dev-> << 
666         dev->has_12mhz_i2s = em28xx_boards[dev << 
667         dev->max_range_640_480 = em28xx_boards << 
668 }                                              << 
669                                                << 
670 /* -------------------------------------------    2170 /* ----------------------------------------------------------------------- */
671 void em28xx_set_ir(struct em28xx *dev, struct  !! 2171 void em28xx_register_i2c_ir(struct em28xx *dev)
672 {                                                 2172 {
673         if (disable_ir) {                      !! 2173         const unsigned short addr_list[] = {
674                 ir->get_key = NULL;            !! 2174                  0x30, 0x47, I2C_CLIENT_END
675                 return ;                       !! 2175         };
676         }                                      !! 2176 
                                                   >> 2177         if (disable_ir)
                                                   >> 2178                 return;
                                                   >> 2179 
                                                   >> 2180         memset(&dev->info, 0, sizeof(&dev->info));
                                                   >> 2181         memset(&dev->init_data, 0, sizeof(dev->init_data));
                                                   >> 2182         strlcpy(dev->info.type, "ir_video", I2C_NAME_SIZE);
677                                                   2183 
678         /* detect & configure */                  2184         /* detect & configure */
679         switch (dev->model) {                     2185         switch (dev->model) {
680         case (EM2800_BOARD_UNKNOWN):              2186         case (EM2800_BOARD_UNKNOWN):
681                 break;                            2187                 break;
682         case (EM2820_BOARD_UNKNOWN):              2188         case (EM2820_BOARD_UNKNOWN):
683                 break;                            2189                 break;
684         case (EM2800_BOARD_TERRATEC_CINERGY_20    2190         case (EM2800_BOARD_TERRATEC_CINERGY_200):
685         case (EM2820_BOARD_TERRATEC_CINERGY_25    2191         case (EM2820_BOARD_TERRATEC_CINERGY_250):
686                 ir->ir_codes = ir_codes_em_ter !! 2192                 dev->init_data.ir_codes = ir_codes_em_terratec;
687                 ir->get_key = em28xx_get_key_t !! 2193                 dev->init_data.get_key = em28xx_get_key_terratec;
688                 snprintf(ir->c.name, sizeof(ir !! 2194                 dev->init_data.name = "i2c IR (EM28XX Terratec)";
689                          "i2c IR (EM28XX Terra << 
690                 break;                            2195                 break;
691         case (EM2820_BOARD_PINNACLE_USB_2):       2196         case (EM2820_BOARD_PINNACLE_USB_2):
692                 ir->ir_codes = ir_codes_pinnac !! 2197                 dev->init_data.ir_codes = ir_codes_pinnacle_grey;
693                 ir->get_key = em28xx_get_key_p !! 2198                 dev->init_data.get_key = em28xx_get_key_pinnacle_usb_grey;
694                 snprintf(ir->c.name, sizeof(ir !! 2199                 dev->init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
695                          "i2c IR (EM28XX Pinna << 
696                 break;                            2200                 break;
697         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB    2201         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
698                 ir->ir_codes = ir_codes_hauppa !! 2202                 dev->init_data.ir_codes = ir_codes_hauppauge_new;
699                 ir->get_key = em28xx_get_key_e !! 2203                 dev->init_data.get_key = em28xx_get_key_em_haup;
700                 snprintf(ir->c.name, sizeof(ir !! 2204                 dev->init_data.name = "i2c IR (EM2840 Hauppauge)";
701                          "i2c IR (EM2840 Haupp << 
702                 break;                            2205                 break;
703         case (EM2820_BOARD_MSI_VOX_USB_2):        2206         case (EM2820_BOARD_MSI_VOX_USB_2):
704                 break;                            2207                 break;
705         case (EM2800_BOARD_LEADTEK_WINFAST_USB    2208         case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
706                 break;                            2209                 break;
707         case (EM2800_BOARD_KWORLD_USB2800):       2210         case (EM2800_BOARD_KWORLD_USB2800):
708                 break;                            2211                 break;
                                                   >> 2212         case (EM2800_BOARD_GRABBEEX_USB2800):
                                                   >> 2213                 break;
709         }                                         2214         }
                                                   >> 2215 
                                                   >> 2216         if (dev->init_data.name)
                                                   >> 2217                 dev->info.platform_data = &dev->init_data;
                                                   >> 2218         i2c_new_probed_device(&dev->i2c_adap, &dev->info, addr_list);
710 }                                                 2219 }
711                                                   2220 
712 void em28xx_card_setup(struct em28xx *dev)        2221 void em28xx_card_setup(struct em28xx *dev)
713 {                                                 2222 {
714         em28xx_set_model(dev);                 !! 2223         /*
                                                   >> 2224          * If the device can be a webcam, seek for a sensor.
                                                   >> 2225          * If sensor is not found, then it isn't a webcam.
                                                   >> 2226          */
                                                   >> 2227         if (dev->board.is_webcam) {
                                                   >> 2228                 if (em28xx_hint_sensor(dev) < 0)
                                                   >> 2229                         dev->board.is_webcam = 0;
                                                   >> 2230                 else
                                                   >> 2231                         dev->progressive = 1;
                                                   >> 2232         } else
                                                   >> 2233                 em28xx_set_model(dev);
                                                   >> 2234 
                                                   >> 2235         em28xx_info("Identified as %s (card=%d)\n",
                                                   >> 2236                     dev->board.name, dev->model);
715                                                   2237 
716         dev->tuner_type = em28xx_boards[dev->m    2238         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
                                                   >> 2239         if (em28xx_boards[dev->model].tuner_addr)
                                                   >> 2240                 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
                                                   >> 2241 
                                                   >> 2242         if (em28xx_boards[dev->model].tda9887_conf)
                                                   >> 2243                 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
717                                                   2244 
718         /* request some modules */                2245         /* request some modules */
719         switch (dev->model) {                     2246         switch (dev->model) {
720         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_    2247         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
721         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_    2248         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
722         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_ !! 2249         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
                                                   >> 2250         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
                                                   >> 2251         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
723         {                                         2252         {
724                 struct tveeprom tv;               2253                 struct tveeprom tv;
725 #ifdef CONFIG_MODULES                             2254 #ifdef CONFIG_MODULES
726                 request_module("tveeprom");       2255                 request_module("tveeprom");
727 #endif                                            2256 #endif
728                 /* Call first TVeeprom */         2257                 /* Call first TVeeprom */
729                                                   2258 
730                 dev->i2c_client.addr = 0xa0 >>    2259                 dev->i2c_client.addr = 0xa0 >> 1;
731                 tveeprom_hauppauge_analog(&dev    2260                 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
732                                                   2261 
733                 dev->tuner_type = tv.tuner_typ    2262                 dev->tuner_type = tv.tuner_type;
734                                                   2263 
735                 if (tv.audio_processor == AUDI !! 2264                 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
736                         dev->i2s_speed = 20480    2265                         dev->i2s_speed = 2048000;
737                         dev->has_msp34xx = 1;  !! 2266                         dev->board.has_msp34xx = 1;
738                 }                                 2267                 }
739 #ifdef CONFIG_MODULES                             2268 #ifdef CONFIG_MODULES
740                 if (tv.has_ir)                    2269                 if (tv.has_ir)
741                         request_module("ir-kbd    2270                         request_module("ir-kbd-i2c");
742 #endif                                            2271 #endif
743                 break;                            2272                 break;
744         }                                         2273         }
                                                   >> 2274         case EM2882_BOARD_KWORLD_ATSC_315U:
                                                   >> 2275                 em28xx_write_reg(dev, 0x0d, 0x42);
                                                   >> 2276                 msleep(10);
                                                   >> 2277                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
                                                   >> 2278                 msleep(10);
                                                   >> 2279                 break;
745         case EM2820_BOARD_KWORLD_PVRTV2800RF:     2280         case EM2820_BOARD_KWORLD_PVRTV2800RF:
746                 /* GPIO enables sound on KWORL    2281                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
747                 em28xx_write_regs_req(dev, 0x0 !! 2282                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
748                 break;                            2283                 break;
749         case EM2820_BOARD_UNKNOWN:                2284         case EM2820_BOARD_UNKNOWN:
750         case EM2800_BOARD_UNKNOWN:                2285         case EM2800_BOARD_UNKNOWN:
                                                   >> 2286                 /*
                                                   >> 2287                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
                                                   >> 2288                  *
                                                   >> 2289                  * This occurs because they share identical USB vendor and
                                                   >> 2290                  * product IDs.
                                                   >> 2291                  *
                                                   >> 2292                  * What we do here is look up the EEPROM hash of the K-WORLD
                                                   >> 2293                  * and if it is found then we decide that we do not have
                                                   >> 2294                  * a DIGIVOX and reset the device to the K-WORLD instead.
                                                   >> 2295                  *
                                                   >> 2296                  * This solution is only valid if they do not share eeprom
                                                   >> 2297                  * hash identities which has not been determined as yet.
                                                   >> 2298                  */
                                                   >> 2299         case EM2880_BOARD_MSI_DIGIVOX_AD:
751                 if (!em28xx_hint_board(dev))      2300                 if (!em28xx_hint_board(dev))
752                         em28xx_set_model(dev);    2301                         em28xx_set_model(dev);
                                                   >> 2302 
                                                   >> 2303                 /* In cases where we had to use a board hint, the call to
                                                   >> 2304                    em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
                                                   >> 2305                    so make the call now so the analog GPIOs are set properly
                                                   >> 2306                    before probing the i2c bus. */
                                                   >> 2307                 em28xx_gpio_set(dev, dev->board.tuner_gpio);
                                                   >> 2308                 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
                                                   >> 2309                 break;
                                                   >> 2310         }
                                                   >> 2311 
                                                   >> 2312         if (dev->board.has_snapshot_button)
                                                   >> 2313                 em28xx_register_snapshot_button(dev);
                                                   >> 2314 
                                                   >> 2315         if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
                                                   >> 2316                 em28xx_errdev("\n\n");
                                                   >> 2317                 em28xx_errdev("The support for this board weren't "
                                                   >> 2318                               "valid yet.\n");
                                                   >> 2319                 em28xx_errdev("Please send a report of having this working\n");
                                                   >> 2320                 em28xx_errdev("not to V4L mailing list (and/or to other "
                                                   >> 2321                                 "addresses)\n\n");
753         }                                         2322         }
754                                                   2323 
755         /* Allow override tuner type by a modu    2324         /* Allow override tuner type by a module parameter */
756         if (tuner >= 0)                           2325         if (tuner >= 0)
757                 dev->tuner_type = tuner;          2326                 dev->tuner_type = tuner;
758                                                   2327 
759 #ifdef CONFIG_MODULES                          << 
760         /* request some modules */                2328         /* request some modules */
761         if (dev->has_msp34xx)                  !! 2329         if (dev->board.has_msp34xx)
762                 request_module("msp3400");     !! 2330                 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
763         if (dev->decoder == EM28XX_SAA7113 ||  !! 2331                         "msp3400", "msp3400", msp3400_addrs);
764                 request_module("saa7115");     !! 2332 
765         if (dev->decoder == EM28XX_TVP5150)    !! 2333         if (dev->board.decoder == EM28XX_SAA711X)
766                 request_module("tvp5150");     !! 2334                 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
767         if (dev->tuner_type != TUNER_ABSENT)   !! 2335                         "saa7115", "saa7115_auto", saa711x_addrs);
768                 request_module("tuner");       !! 2336 
769 #endif                                         !! 2337         if (dev->board.decoder == EM28XX_TVP5150)
                                                   >> 2338                 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                                                   >> 2339                         "tvp5150", "tvp5150", tvp5150_addrs);
                                                   >> 2340 
                                                   >> 2341         if (dev->em28xx_sensor == EM28XX_MT9V011) {
                                                   >> 2342                 struct v4l2_subdev *sd;
                                                   >> 2343 
                                                   >> 2344                 sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
                                                   >> 2345                          &dev->i2c_adap, "mt9v011", "mt9v011", mt9v011_addrs);
                                                   >> 2346                 v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal);
                                                   >> 2347         }
                                                   >> 2348 
                                                   >> 2349 
                                                   >> 2350         if (dev->board.adecoder == EM28XX_TVAUDIO)
                                                   >> 2351                 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                                                   >> 2352                         "tvaudio", "tvaudio", dev->board.tvaudio_addr);
                                                   >> 2353 
                                                   >> 2354         if (dev->board.tuner_type != TUNER_ABSENT) {
                                                   >> 2355                 int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
                                                   >> 2356 
                                                   >> 2357                 if (dev->board.radio.type)
                                                   >> 2358                         v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                                                   >> 2359                                 "tuner", "tuner", dev->board.radio_addr);
                                                   >> 2360 
                                                   >> 2361                 if (has_demod)
                                                   >> 2362                         v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
                                                   >> 2363                                 &dev->i2c_adap, "tuner", "tuner",
                                                   >> 2364                                 v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
                                                   >> 2365                 if (dev->tuner_addr == 0) {
                                                   >> 2366                         enum v4l2_i2c_tuner_type type =
                                                   >> 2367                                 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
                                                   >> 2368                         struct v4l2_subdev *sd;
                                                   >> 2369 
                                                   >> 2370                         sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
                                                   >> 2371                                 &dev->i2c_adap, "tuner", "tuner",
                                                   >> 2372                                 v4l2_i2c_tuner_addrs(type));
                                                   >> 2373 
                                                   >> 2374                         if (sd)
                                                   >> 2375                                 dev->tuner_addr = v4l2_i2c_subdev_addr(sd);
                                                   >> 2376                 } else {
                                                   >> 2377                         v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
                                                   >> 2378                                 "tuner", "tuner", dev->tuner_addr);
                                                   >> 2379                 }
                                                   >> 2380         }
                                                   >> 2381 
                                                   >> 2382         em28xx_tuner_setup(dev);
                                                   >> 2383 
                                                   >> 2384         if(!disable_ir)
                                                   >> 2385                 em28xx_ir_init(dev);
                                                   >> 2386 }
                                                   >> 2387 
                                                   >> 2388 
                                                   >> 2389 #if defined(CONFIG_MODULES) && defined(MODULE)
                                                   >> 2390 static void request_module_async(struct work_struct *work)
                                                   >> 2391 {
                                                   >> 2392         struct em28xx *dev = container_of(work,
                                                   >> 2393                              struct em28xx, request_module_wk);
                                                   >> 2394 
                                                   >> 2395         if (dev->has_audio_class)
                                                   >> 2396                 request_module("snd-usb-audio");
                                                   >> 2397         else if (dev->has_alsa_audio)
                                                   >> 2398                 request_module("em28xx-alsa");
                                                   >> 2399 
                                                   >> 2400         if (dev->board.has_dvb)
                                                   >> 2401                 request_module("em28xx-dvb");
                                                   >> 2402 }
                                                   >> 2403 
                                                   >> 2404 static void request_modules(struct em28xx *dev)
                                                   >> 2405 {
                                                   >> 2406         INIT_WORK(&dev->request_module_wk, request_module_async);
                                                   >> 2407         schedule_work(&dev->request_module_wk);
                                                   >> 2408 }
                                                   >> 2409 #else
                                                   >> 2410 #define request_modules(dev)
                                                   >> 2411 #endif /* CONFIG_MODULES */
                                                   >> 2412 
                                                   >> 2413 /*
                                                   >> 2414  * em28xx_realease_resources()
                                                   >> 2415  * unregisters the v4l2,i2c and usb devices
                                                   >> 2416  * called when the device gets disconected or at module unload
                                                   >> 2417 */
                                                   >> 2418 void em28xx_release_resources(struct em28xx *dev)
                                                   >> 2419 {
                                                   >> 2420         if (dev->sbutton_input_dev)
                                                   >> 2421                 em28xx_deregister_snapshot_button(dev);
                                                   >> 2422 
                                                   >> 2423         if (dev->ir)
                                                   >> 2424                 em28xx_ir_fini(dev);
                                                   >> 2425 
                                                   >> 2426         /*FIXME: I2C IR should be disconnected */
                                                   >> 2427 
                                                   >> 2428         em28xx_release_analog_resources(dev);
                                                   >> 2429 
                                                   >> 2430         em28xx_remove_from_devlist(dev);
                                                   >> 2431 
                                                   >> 2432         em28xx_i2c_unregister(dev);
                                                   >> 2433 
                                                   >> 2434         v4l2_device_unregister(&dev->v4l2_dev);
                                                   >> 2435 
                                                   >> 2436         usb_put_dev(dev->udev);
                                                   >> 2437 
                                                   >> 2438         /* Mark device as unused */
                                                   >> 2439         em28xx_devused &= ~(1 << dev->devno);
                                                   >> 2440 };
                                                   >> 2441 
                                                   >> 2442 /*
                                                   >> 2443  * em28xx_init_dev()
                                                   >> 2444  * allocates and inits the device structs, registers i2c bus and v4l device
                                                   >> 2445  */
                                                   >> 2446 static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
                                                   >> 2447                            struct usb_interface *interface,
                                                   >> 2448                            int minor)
                                                   >> 2449 {
                                                   >> 2450         struct em28xx *dev = *devhandle;
                                                   >> 2451         int retval;
                                                   >> 2452         int errCode;
                                                   >> 2453 
                                                   >> 2454         dev->udev = udev;
                                                   >> 2455         mutex_init(&dev->ctrl_urb_lock);
                                                   >> 2456         spin_lock_init(&dev->slock);
                                                   >> 2457         init_waitqueue_head(&dev->open);
                                                   >> 2458         init_waitqueue_head(&dev->wait_frame);
                                                   >> 2459         init_waitqueue_head(&dev->wait_stream);
                                                   >> 2460 
                                                   >> 2461         dev->em28xx_write_regs = em28xx_write_regs;
                                                   >> 2462         dev->em28xx_read_reg = em28xx_read_reg;
                                                   >> 2463         dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
                                                   >> 2464         dev->em28xx_write_regs_req = em28xx_write_regs_req;
                                                   >> 2465         dev->em28xx_read_reg_req = em28xx_read_reg_req;
                                                   >> 2466         dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
                                                   >> 2467 
                                                   >> 2468         em28xx_set_model(dev);
                                                   >> 2469 
                                                   >> 2470         /* Set the default GPO/GPIO for legacy devices */
                                                   >> 2471         dev->reg_gpo_num = EM2880_R04_GPO;
                                                   >> 2472         dev->reg_gpio_num = EM28XX_R08_GPIO;
                                                   >> 2473 
                                                   >> 2474         dev->wait_after_write = 5;
                                                   >> 2475 
                                                   >> 2476         /* Based on the Chip ID, set the device configuration */
                                                   >> 2477         retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
                                                   >> 2478         if (retval > 0) {
                                                   >> 2479                 dev->chip_id = retval;
                                                   >> 2480 
                                                   >> 2481                 switch (dev->chip_id) {
                                                   >> 2482                 case CHIP_ID_EM2710:
                                                   >> 2483                         em28xx_info("chip ID is em2710\n");
                                                   >> 2484                         break;
                                                   >> 2485                 case CHIP_ID_EM2750:
                                                   >> 2486                         em28xx_info("chip ID is em2750\n");
                                                   >> 2487                         break;
                                                   >> 2488                 case CHIP_ID_EM2820:
                                                   >> 2489                         em28xx_info("chip ID is em2820 (or em2710)\n");
                                                   >> 2490                         break;
                                                   >> 2491                 case CHIP_ID_EM2840:
                                                   >> 2492                         em28xx_info("chip ID is em2840\n");
                                                   >> 2493                         break;
                                                   >> 2494                 case CHIP_ID_EM2860:
                                                   >> 2495                         em28xx_info("chip ID is em2860\n");
                                                   >> 2496                         break;
                                                   >> 2497                 case CHIP_ID_EM2870:
                                                   >> 2498                         em28xx_info("chip ID is em2870\n");
                                                   >> 2499                         dev->wait_after_write = 0;
                                                   >> 2500                         break;
                                                   >> 2501                 case CHIP_ID_EM2874:
                                                   >> 2502                         em28xx_info("chip ID is em2874\n");
                                                   >> 2503                         dev->reg_gpio_num = EM2874_R80_GPIO;
                                                   >> 2504                         dev->wait_after_write = 0;
                                                   >> 2505                         break;
                                                   >> 2506                 case CHIP_ID_EM2883:
                                                   >> 2507                         em28xx_info("chip ID is em2882/em2883\n");
                                                   >> 2508                         dev->wait_after_write = 0;
                                                   >> 2509                         break;
                                                   >> 2510                 default:
                                                   >> 2511                         em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
                                                   >> 2512                 }
                                                   >> 2513         }
                                                   >> 2514 
                                                   >> 2515         /* Prepopulate cached GPO register content */
                                                   >> 2516         retval = em28xx_read_reg(dev, dev->reg_gpo_num);
                                                   >> 2517         if (retval >= 0)
                                                   >> 2518                 dev->reg_gpo = retval;
                                                   >> 2519 
                                                   >> 2520         em28xx_pre_card_setup(dev);
                                                   >> 2521 
                                                   >> 2522         if (!dev->board.is_em2800) {
                                                   >> 2523                 /* Sets I2C speed to 100 KHz */
                                                   >> 2524                 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
                                                   >> 2525                 if (retval < 0) {
                                                   >> 2526                         em28xx_errdev("%s: em28xx_write_regs_req failed!"
                                                   >> 2527                                       " retval [%d]\n",
                                                   >> 2528                                       __func__, retval);
                                                   >> 2529                         return retval;
                                                   >> 2530                 }
                                                   >> 2531         }
                                                   >> 2532 
                                                   >> 2533         retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
                                                   >> 2534         if (retval < 0) {
                                                   >> 2535                 em28xx_errdev("Call to v4l2_device_register() failed!\n");
                                                   >> 2536                 return retval;
                                                   >> 2537         }
                                                   >> 2538 
                                                   >> 2539         /* register i2c bus */
                                                   >> 2540         errCode = em28xx_i2c_register(dev);
                                                   >> 2541         if (errCode < 0) {
                                                   >> 2542                 v4l2_device_unregister(&dev->v4l2_dev);
                                                   >> 2543                 em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n",
                                                   >> 2544                         __func__, errCode);
                                                   >> 2545                 return errCode;
                                                   >> 2546         }
                                                   >> 2547 
                                                   >> 2548         /*
                                                   >> 2549          * Default format, used for tvp5150 or saa711x output formats
                                                   >> 2550          */
                                                   >> 2551         dev->vinmode = 0x10;
                                                   >> 2552         dev->vinctl  = 0x11;
                                                   >> 2553 
                                                   >> 2554         /* Do board specific init and eeprom reading */
                                                   >> 2555         em28xx_card_setup(dev);
                                                   >> 2556 
                                                   >> 2557         /* Configure audio */
                                                   >> 2558         errCode = em28xx_audio_setup(dev);
                                                   >> 2559         if (errCode < 0) {
                                                   >> 2560                 v4l2_device_unregister(&dev->v4l2_dev);
                                                   >> 2561                 em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n",
                                                   >> 2562                         __func__, errCode);
                                                   >> 2563         }
                                                   >> 2564 
                                                   >> 2565         /* wake i2c devices */
                                                   >> 2566         em28xx_wake_i2c(dev);
                                                   >> 2567 
                                                   >> 2568         /* init video dma queues */
                                                   >> 2569         INIT_LIST_HEAD(&dev->vidq.active);
                                                   >> 2570         INIT_LIST_HEAD(&dev->vidq.queued);
                                                   >> 2571 
                                                   >> 2572 
                                                   >> 2573         if (dev->board.has_msp34xx) {
                                                   >> 2574                 /* Send a reset to other chips via gpio */
                                                   >> 2575                 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
                                                   >> 2576                 if (errCode < 0) {
                                                   >> 2577                         em28xx_errdev("%s: em28xx_write_regs_req - "
                                                   >> 2578                                       "msp34xx(1) failed! errCode [%d]\n",
                                                   >> 2579                                       __func__, errCode);
                                                   >> 2580                         return errCode;
                                                   >> 2581                 }
                                                   >> 2582                 msleep(3);
                                                   >> 2583 
                                                   >> 2584                 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
                                                   >> 2585                 if (errCode < 0) {
                                                   >> 2586                         em28xx_errdev("%s: em28xx_write_regs_req - "
                                                   >> 2587                                       "msp34xx(2) failed! errCode [%d]\n",
                                                   >> 2588                                       __func__, errCode);
                                                   >> 2589                         return errCode;
                                                   >> 2590                 }
                                                   >> 2591                 msleep(3);
                                                   >> 2592         }
                                                   >> 2593 
                                                   >> 2594         em28xx_add_into_devlist(dev);
                                                   >> 2595 
                                                   >> 2596         retval = em28xx_register_analog_devices(dev);
                                                   >> 2597         if (retval < 0) {
                                                   >> 2598                 em28xx_release_resources(dev);
                                                   >> 2599                 goto fail_reg_devices;
                                                   >> 2600         }
                                                   >> 2601 
                                                   >> 2602         em28xx_init_extension(dev);
                                                   >> 2603 
                                                   >> 2604         /* Save some power by putting tuner to sleep */
                                                   >> 2605         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
                                                   >> 2606 
                                                   >> 2607         return 0;
                                                   >> 2608 
                                                   >> 2609 fail_reg_devices:
                                                   >> 2610         return retval;
                                                   >> 2611 }
                                                   >> 2612 
                                                   >> 2613 /*
                                                   >> 2614  * em28xx_usb_probe()
                                                   >> 2615  * checks for supported devices
                                                   >> 2616  */
                                                   >> 2617 static int em28xx_usb_probe(struct usb_interface *interface,
                                                   >> 2618                             const struct usb_device_id *id)
                                                   >> 2619 {
                                                   >> 2620         const struct usb_endpoint_descriptor *endpoint;
                                                   >> 2621         struct usb_device *udev;
                                                   >> 2622         struct usb_interface *uif;
                                                   >> 2623         struct em28xx *dev = NULL;
                                                   >> 2624         int retval;
                                                   >> 2625         int i, nr, ifnum, isoc_pipe;
                                                   >> 2626         char *speed;
                                                   >> 2627         char descr[255] = "";
                                                   >> 2628 
                                                   >> 2629         udev = usb_get_dev(interface_to_usbdev(interface));
                                                   >> 2630         ifnum = interface->altsetting[0].desc.bInterfaceNumber;
                                                   >> 2631 
                                                   >> 2632         /* Check to see next free device and mark as used */
                                                   >> 2633         nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
                                                   >> 2634         em28xx_devused |= 1<<nr;
                                                   >> 2635 
                                                   >> 2636         /* Don't register audio interfaces */
                                                   >> 2637         if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
                                                   >> 2638                 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
                                                   >> 2639                         "interface %i, class %i\n",
                                                   >> 2640                         le16_to_cpu(udev->descriptor.idVendor),
                                                   >> 2641                         le16_to_cpu(udev->descriptor.idProduct),
                                                   >> 2642                         ifnum,
                                                   >> 2643                         interface->altsetting[0].desc.bInterfaceClass);
                                                   >> 2644 
                                                   >> 2645                 em28xx_devused &= ~(1<<nr);
                                                   >> 2646                 retval = -ENODEV;
                                                   >> 2647                 goto err;
                                                   >> 2648         }
                                                   >> 2649 
                                                   >> 2650         endpoint = &interface->cur_altsetting->endpoint[0].desc;
                                                   >> 2651 
                                                   >> 2652         /* check if the device has the iso in endpoint at the correct place */
                                                   >> 2653         if (usb_endpoint_xfer_isoc(endpoint)
                                                   >> 2654             &&
                                                   >> 2655             (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) {
                                                   >> 2656                 /* It's a newer em2874/em2875 device */
                                                   >> 2657                 isoc_pipe = 0;
                                                   >> 2658         } else {
                                                   >> 2659                 int check_interface = 1;
                                                   >> 2660                 isoc_pipe = 1;
                                                   >> 2661                 endpoint = &interface->cur_altsetting->endpoint[1].desc;
                                                   >> 2662                 if (!usb_endpoint_xfer_isoc(endpoint))
                                                   >> 2663                         check_interface = 0;
                                                   >> 2664 
                                                   >> 2665                 if (usb_endpoint_dir_out(endpoint))
                                                   >> 2666                         check_interface = 0;
                                                   >> 2667 
                                                   >> 2668                 if (!check_interface) {
                                                   >> 2669                         em28xx_err(DRIVER_NAME " video device (%04x:%04x): "
                                                   >> 2670                                 "interface %i, class %i found.\n",
                                                   >> 2671                                 le16_to_cpu(udev->descriptor.idVendor),
                                                   >> 2672                                 le16_to_cpu(udev->descriptor.idProduct),
                                                   >> 2673                                 ifnum,
                                                   >> 2674                                 interface->altsetting[0].desc.bInterfaceClass);
                                                   >> 2675 
                                                   >> 2676                         em28xx_err(DRIVER_NAME " This is an anciliary "
                                                   >> 2677                                 "interface not used by the driver\n");
                                                   >> 2678 
                                                   >> 2679                         em28xx_devused &= ~(1<<nr);
                                                   >> 2680                         retval = -ENODEV;
                                                   >> 2681                         goto err;
                                                   >> 2682                 }
                                                   >> 2683         }
                                                   >> 2684 
                                                   >> 2685         switch (udev->speed) {
                                                   >> 2686         case USB_SPEED_LOW:
                                                   >> 2687                 speed = "1.5";
                                                   >> 2688                 break;
                                                   >> 2689         case USB_SPEED_UNKNOWN:
                                                   >> 2690         case USB_SPEED_FULL:
                                                   >> 2691                 speed = "12";
                                                   >> 2692                 break;
                                                   >> 2693         case USB_SPEED_HIGH:
                                                   >> 2694                 speed = "480";
                                                   >> 2695                 break;
                                                   >> 2696         default:
                                                   >> 2697                 speed = "unknown";
                                                   >> 2698         }
                                                   >> 2699 
                                                   >> 2700         if (udev->manufacturer)
                                                   >> 2701                 strlcpy(descr, udev->manufacturer, sizeof(descr));
                                                   >> 2702 
                                                   >> 2703         if (udev->product) {
                                                   >> 2704                 if (*descr)
                                                   >> 2705                         strlcat(descr, " ", sizeof(descr));
                                                   >> 2706                 strlcat(descr, udev->product, sizeof(descr));
                                                   >> 2707         }
                                                   >> 2708         if (*descr)
                                                   >> 2709                 strlcat(descr, " ", sizeof(descr));
                                                   >> 2710 
                                                   >> 2711         printk(DRIVER_NAME ": New device %s@ %s Mbps "
                                                   >> 2712                 "(%04x:%04x, interface %d, class %d)\n",
                                                   >> 2713                 descr,
                                                   >> 2714                 speed,
                                                   >> 2715                 le16_to_cpu(udev->descriptor.idVendor),
                                                   >> 2716                 le16_to_cpu(udev->descriptor.idProduct),
                                                   >> 2717                 ifnum,
                                                   >> 2718                 interface->altsetting->desc.bInterfaceNumber);
                                                   >> 2719 
                                                   >> 2720         /*
                                                   >> 2721          * Make sure we have 480 Mbps of bandwidth, otherwise things like
                                                   >> 2722          * video stream wouldn't likely work, since 12 Mbps is generally
                                                   >> 2723          * not enough even for most Digital TV streams.
                                                   >> 2724          */
                                                   >> 2725         if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
                                                   >> 2726                 printk(DRIVER_NAME ": Device initialization failed.\n");
                                                   >> 2727                 printk(DRIVER_NAME ": Device must be connected to a high-speed"
                                                   >> 2728                        " USB 2.0 port.\n");
                                                   >> 2729                 em28xx_devused &= ~(1<<nr);
                                                   >> 2730                 retval = -ENODEV;
                                                   >> 2731                 goto err;
                                                   >> 2732         }
                                                   >> 2733 
                                                   >> 2734         if (nr >= EM28XX_MAXBOARDS) {
                                                   >> 2735                 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
                                                   >> 2736                                 EM28XX_MAXBOARDS);
                                                   >> 2737                 em28xx_devused &= ~(1<<nr);
                                                   >> 2738                 retval = -ENOMEM;
                                                   >> 2739                 goto err;
                                                   >> 2740         }
                                                   >> 2741 
                                                   >> 2742         /* allocate memory for our device state and initialize it */
                                                   >> 2743         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
                                                   >> 2744         if (dev == NULL) {
                                                   >> 2745                 em28xx_err(DRIVER_NAME ": out of memory!\n");
                                                   >> 2746                 em28xx_devused &= ~(1<<nr);
                                                   >> 2747                 retval = -ENOMEM;
                                                   >> 2748                 goto err;
                                                   >> 2749         }
                                                   >> 2750 
                                                   >> 2751         snprintf(dev->name, 29, "em28xx #%d", nr);
                                                   >> 2752         dev->devno = nr;
                                                   >> 2753         dev->model = id->driver_info;
                                                   >> 2754         dev->alt   = -1;
                                                   >> 2755 
                                                   >> 2756         /* Checks if audio is provided by some interface */
                                                   >> 2757         for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
                                                   >> 2758                 uif = udev->config->interface[i];
                                                   >> 2759                 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
                                                   >> 2760                         dev->has_audio_class = 1;
                                                   >> 2761                         break;
                                                   >> 2762                 }
                                                   >> 2763         }
                                                   >> 2764 
                                                   >> 2765         /* compute alternate max packet sizes */
                                                   >> 2766         uif = udev->actconfig->interface[0];
                                                   >> 2767 
                                                   >> 2768         dev->num_alt = uif->num_altsetting;
                                                   >> 2769         dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL);
                                                   >> 2770 
                                                   >> 2771         if (dev->alt_max_pkt_size == NULL) {
                                                   >> 2772                 em28xx_errdev("out of memory!\n");
                                                   >> 2773                 em28xx_devused &= ~(1<<nr);
                                                   >> 2774                 kfree(dev);
                                                   >> 2775                 retval = -ENOMEM;
                                                   >> 2776                 goto err;
                                                   >> 2777         }
                                                   >> 2778 
                                                   >> 2779         for (i = 0; i < dev->num_alt ; i++) {
                                                   >> 2780                 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
                                                   >> 2781                 dev->alt_max_pkt_size[i] =
                                                   >> 2782                     (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
                                                   >> 2783         }
                                                   >> 2784 
                                                   >> 2785         if ((card[nr] >= 0) && (card[nr] < em28xx_bcount))
                                                   >> 2786                 dev->model = card[nr];
                                                   >> 2787 
                                                   >> 2788         /* allocate device struct */
                                                   >> 2789         mutex_init(&dev->lock);
                                                   >> 2790         mutex_lock(&dev->lock);
                                                   >> 2791         retval = em28xx_init_dev(&dev, udev, interface, nr);
                                                   >> 2792         if (retval) {
                                                   >> 2793                 em28xx_devused &= ~(1<<dev->devno);
                                                   >> 2794                 mutex_unlock(&dev->lock);
                                                   >> 2795                 kfree(dev);
                                                   >> 2796                 goto err;
                                                   >> 2797         }
                                                   >> 2798 
                                                   >> 2799         /* save our data pointer in this interface device */
                                                   >> 2800         usb_set_intfdata(interface, dev);
                                                   >> 2801 
                                                   >> 2802         request_modules(dev);
                                                   >> 2803 
                                                   >> 2804         /* Should be the last thing to do, to avoid newer udev's to
                                                   >> 2805            open the device before fully initializing it
                                                   >> 2806          */
                                                   >> 2807         mutex_unlock(&dev->lock);
                                                   >> 2808 
                                                   >> 2809         return 0;
                                                   >> 2810 
                                                   >> 2811 err:
                                                   >> 2812         return retval;
                                                   >> 2813 }
                                                   >> 2814 
                                                   >> 2815 /*
                                                   >> 2816  * em28xx_usb_disconnect()
                                                   >> 2817  * called when the device gets diconencted
                                                   >> 2818  * video device will be unregistered on v4l2_close in case it is still open
                                                   >> 2819  */
                                                   >> 2820 static void em28xx_usb_disconnect(struct usb_interface *interface)
                                                   >> 2821 {
                                                   >> 2822         struct em28xx *dev;
                                                   >> 2823 
                                                   >> 2824         dev = usb_get_intfdata(interface);
                                                   >> 2825         usb_set_intfdata(interface, NULL);
                                                   >> 2826 
                                                   >> 2827         if (!dev)
                                                   >> 2828                 return;
                                                   >> 2829 
                                                   >> 2830         em28xx_info("disconnecting %s\n", dev->vdev->name);
                                                   >> 2831 
                                                   >> 2832         /* wait until all current v4l2 io is finished then deallocate
                                                   >> 2833            resources */
                                                   >> 2834         mutex_lock(&dev->lock);
                                                   >> 2835 
                                                   >> 2836         wake_up_interruptible_all(&dev->open);
                                                   >> 2837 
                                                   >> 2838         v4l2_device_disconnect(&dev->v4l2_dev);
                                                   >> 2839 
                                                   >> 2840         if (dev->users) {
                                                   >> 2841                 em28xx_warn
                                                   >> 2842                     ("device /dev/video%d is open! Deregistration and memory "
                                                   >> 2843                      "deallocation are deferred on close.\n",
                                                   >> 2844                                 dev->vdev->num);
                                                   >> 2845 
                                                   >> 2846                 dev->state |= DEV_MISCONFIGURED;
                                                   >> 2847                 em28xx_uninit_isoc(dev);
                                                   >> 2848                 dev->state |= DEV_DISCONNECTED;
                                                   >> 2849                 wake_up_interruptible(&dev->wait_frame);
                                                   >> 2850                 wake_up_interruptible(&dev->wait_stream);
                                                   >> 2851         } else {
                                                   >> 2852                 dev->state |= DEV_DISCONNECTED;
                                                   >> 2853                 em28xx_release_resources(dev);
                                                   >> 2854         }
                                                   >> 2855 
                                                   >> 2856         em28xx_close_extension(dev);
                                                   >> 2857 
                                                   >> 2858         mutex_unlock(&dev->lock);
                                                   >> 2859 
                                                   >> 2860         if (!dev->users) {
                                                   >> 2861                 kfree(dev->alt_max_pkt_size);
                                                   >> 2862                 kfree(dev);
                                                   >> 2863         }
                                                   >> 2864 }
                                                   >> 2865 
                                                   >> 2866 static struct usb_driver em28xx_usb_driver = {
                                                   >> 2867         .name = "em28xx",
                                                   >> 2868         .probe = em28xx_usb_probe,
                                                   >> 2869         .disconnect = em28xx_usb_disconnect,
                                                   >> 2870         .id_table = em28xx_id_table,
                                                   >> 2871 };
770                                                   2872 
771         em28xx_config_tuner(dev);              !! 2873 static int __init em28xx_module_init(void)
                                                   >> 2874 {
                                                   >> 2875         int result;
                                                   >> 2876 
                                                   >> 2877         /* register this driver with the USB subsystem */
                                                   >> 2878         result = usb_register(&em28xx_usb_driver);
                                                   >> 2879         if (result)
                                                   >> 2880                 em28xx_err(DRIVER_NAME
                                                   >> 2881                            " usb_register failed. Error number %d.\n", result);
                                                   >> 2882 
                                                   >> 2883         printk(KERN_INFO DRIVER_NAME " driver loaded\n");
                                                   >> 2884 
                                                   >> 2885         return result;
772 }                                                 2886 }
                                                   >> 2887 
                                                   >> 2888 static void __exit em28xx_module_exit(void)
                                                   >> 2889 {
                                                   >> 2890         /* deregister this driver with the USB subsystem */
                                                   >> 2891         usb_deregister(&em28xx_usb_driver);
                                                   >> 2892 }
                                                   >> 2893 
                                                   >> 2894 module_init(em28xx_module_init);
                                                   >> 2895 module_exit(em28xx_module_exit);
773                                                   2896 
  This page was automatically generated by the LXR engine.