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