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