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