xref: /linux/drivers/media/usb/em28xx/em28xx-cards.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0+
2 //
3 // em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
4 //		    video capture devices
5 //
6 // Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
7 //		      Markus Rechberger <mrechberger@gmail.com>
8 //		      Mauro Carvalho Chehab <mchehab@kernel.org>
9 //		      Sascha Sommer <saschasommer@freenet.de>
10 // Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
11 
12 #include "em28xx.h"
13 
14 #include <linux/init.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
17 #include <linux/delay.h>
18 #include <linux/i2c.h>
19 #include <linux/usb.h>
20 #include <media/tuner.h>
21 #include <media/drv-intf/msp3400.h>
22 #include <media/i2c/saa7115.h>
23 #include <dt-bindings/media/tvp5150.h>
24 #include <media/i2c/tvaudio.h>
25 #include <media/tveeprom.h>
26 #include <media/v4l2-common.h>
27 #include <sound/ac97_codec.h>
28 
29 #define DRIVER_NAME         "em28xx"
30 
31 static int tuner = -1;
32 module_param(tuner, int, 0444);
33 MODULE_PARM_DESC(tuner, "tuner type");
34 
35 static unsigned int disable_ir;
36 module_param(disable_ir, int, 0444);
37 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
38 
39 static unsigned int disable_usb_speed_check;
40 module_param(disable_usb_speed_check, int, 0444);
41 MODULE_PARM_DESC(disable_usb_speed_check,
42 		 "override min bandwidth requirement of 480M bps");
43 
44 static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
45 module_param_array(card,  int, NULL, 0444);
46 MODULE_PARM_DESC(card,     "card type");
47 
48 static int usb_xfer_mode = -1;
49 module_param(usb_xfer_mode, int, 0444);
50 MODULE_PARM_DESC(usb_xfer_mode,
51 		 "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
52 
53 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
54 static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
55 
56 struct em28xx_hash_table {
57 	unsigned long hash;
58 	unsigned int  model;
59 	unsigned int  tuner;
60 };
61 
62 static void em28xx_pre_card_setup(struct em28xx *dev);
63 
64 /*
65  *  Reset sequences for analog/digital modes
66  */
67 
68 /* Reset for the most [analog] boards */
69 static const struct em28xx_reg_seq default_analog[] = {
70 	{EM2820_R08_GPIO_CTRL,	0x6d,   ~EM_GPIO_4,	10},
71 	{	-1,		-1,	-1,		-1},
72 };
73 
74 /* Reset for the most [digital] boards */
75 static const struct em28xx_reg_seq default_digital[] = {
76 	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
77 	{	-1,		-1,	-1,		-1},
78 };
79 
80 /* Board :Zolid Hybrid Tv Stick */
81 static struct em28xx_reg_seq zolid_tuner[] = {
82 	{EM2820_R08_GPIO_CTRL,		0xfd,		0xff,	100},
83 	{EM2820_R08_GPIO_CTRL,		0xfe,		0xff,	100},
84 	{		-1,					-1,			-1,		 -1},
85 };
86 
87 static struct em28xx_reg_seq zolid_digital[] = {
88 	{EM2820_R08_GPIO_CTRL,		0x6a,		0xff,	100},
89 	{EM2820_R08_GPIO_CTRL,		0x7a,		0xff,	100},
90 	{EM2880_R04_GPO,			0x04,		0xff,	100},
91 	{EM2880_R04_GPO,			0x0c,		0xff,	100},
92 	{	-1,						-1,			-1,		 -1},
93 };
94 
95 /* Board Hauppauge WinTV HVR 900 analog */
96 static const 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 const 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 const 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 const 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 /* Board - EM2882 Kworld 315U digital */
124 static const struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
125 	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
126 	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},
127 	{EM2880_R04_GPO,	0x04,	0xff,		10},
128 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
129 	{EM2820_R08_GPIO_CTRL,	0x7e,	0xff,		10},
130 	{	-1,		-1,	-1,		-1},
131 };
132 
133 static const struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
134 	{EM2880_R04_GPO,	0x08,	0xff,		10},
135 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
136 	{EM2880_R04_GPO,	0x08,	0xff,		10},
137 	{EM2880_R04_GPO,	0x0c,	0xff,		10},
138 	{	-1,		-1,	-1,		-1},
139 };
140 
141 static const struct em28xx_reg_seq kworld_330u_analog[] = {
142 	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},
143 	{EM2880_R04_GPO,	0x00,	0xff,		10},
144 	{	-1,		-1,	-1,		-1},
145 };
146 
147 static const struct em28xx_reg_seq kworld_330u_digital[] = {
148 	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
149 	{EM2880_R04_GPO,	0x08,	0xff,		10},
150 	{	-1,		-1,	-1,		-1},
151 };
152 
153 /*
154  * Evga inDtube
155  * GPIO0 - Enable digital power (s5h1409) - low to enable
156  * GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
157  * GPIO4 - xc3028 reset
158  * GOP3  - s5h1409 reset
159  */
160 static const struct em28xx_reg_seq evga_indtube_analog[] = {
161 	{EM2820_R08_GPIO_CTRL,	0x79,   0xff,		60},
162 	{	-1,		-1,	-1,		-1},
163 };
164 
165 static const struct em28xx_reg_seq evga_indtube_digital[] = {
166 	{EM2820_R08_GPIO_CTRL,	0x7a,	0xff,		 1},
167 	{EM2880_R04_GPO,	0x04,	0xff,		10},
168 	{EM2880_R04_GPO,	0x0c,	0xff,		 1},
169 	{	-1,		-1,	-1,		-1},
170 };
171 
172 /*
173  * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
174  * EM_GPIO_0 - currently unknown
175  * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
176  * EM_GPIO_2 - currently unknown
177  * EM_GPIO_3 - currently unknown
178  * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
179  * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
180  * EM_GPIO_6 - currently unknown
181  * EM_GPIO_7 - currently unknown
182  */
183 static const struct em28xx_reg_seq kworld_a340_digital[] = {
184 	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},
185 	{	-1,		-1,	-1,		-1},
186 };
187 
188 static const struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
189 	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	100},
190 	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	100},
191 	{EM2874_R80_GPIO_P0_CTRL,	0xbe,	0xff,	100},
192 	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	100},
193 	{	-1,			-1,	-1,	-1},
194 };
195 
196 /* Pinnacle Hybrid Pro eb1a:2881 */
197 static const struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
198 	{EM2820_R08_GPIO_CTRL,	0xfd,   ~EM_GPIO_4,	10},
199 	{	-1,		-1,	-1,		-1},
200 };
201 
202 static const struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
203 	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
204 	{EM2880_R04_GPO,	0x04,	0xff,	       100},/* zl10353 reset */
205 	{EM2880_R04_GPO,	0x0c,	0xff,		 1},
206 	{	-1,		-1,	-1,		-1},
207 };
208 
209 static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
210 	{EM2820_R08_GPIO_CTRL,	0x6d,	~EM_GPIO_4,	10},
211 	{EM2880_R04_GPO,	0x00,	0xff,		10},
212 	{	-1,		-1,	-1,		-1},
213 };
214 
215 static const struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
216 	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
217 	{EM2880_R04_GPO,	0x08,	0xff,		10},
218 	{	-1,		-1,	-1,		-1},
219 };
220 
221 /*
222  * PCTV HD Mini (80e) GPIOs
223  * 0-5: not used
224  * 6:   demod reset, active low
225  * 7:   LED on, active high
226  */
227 static const struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
228 	{EM28XX_R06_I2C_CLK,    0x45,   0xff,		  10}, /*400 KHz*/
229 	{EM2874_R80_GPIO_P0_CTRL, 0x00,   0xff,		  100},/*Demod reset*/
230 	{EM2874_R80_GPIO_P0_CTRL, 0x40,   0xff,		  10},
231 	{  -1,			-1,	-1,		  -1},
232 };
233 
234 /*
235  * eb1a:2868 Reddo DVB-C USB TV Box
236  * GPIO4 - CU1216L NIM
237  * Other GPIOs seems to be don't care.
238  */
239 static const struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
240 	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},
241 	{EM2820_R08_GPIO_CTRL,	0xde,	0xff,		10},
242 	{EM2820_R08_GPIO_CTRL,	0xfe,	0xff,		10},
243 	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
244 	{EM2820_R08_GPIO_CTRL,	0x7f,	0xff,		10},
245 	{EM2820_R08_GPIO_CTRL,	0x6f,	0xff,		10},
246 	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
247 	{	-1,		-1,	-1,		-1},
248 };
249 
250 /* Callback for the most boards */
251 static const struct em28xx_reg_seq default_tuner_gpio[] = {
252 	{EM2820_R08_GPIO_CTRL,	EM_GPIO_4,	EM_GPIO_4,	10},
253 	{EM2820_R08_GPIO_CTRL,	0,		EM_GPIO_4,	10},
254 	{EM2820_R08_GPIO_CTRL,	EM_GPIO_4,	EM_GPIO_4,	10},
255 	{	-1,		-1,		-1,		-1},
256 };
257 
258 /* Mute/unmute */
259 static const struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
260 	{EM2820_R08_GPIO_CTRL,	5,	7,	10},
261 	{	-1,		-1,	-1,	-1},
262 };
263 
264 static const struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
265 	{EM2820_R08_GPIO_CTRL,	4,	7,	10},
266 	{	-1,		-1,	-1,	-1},
267 };
268 
269 static const struct em28xx_reg_seq compro_mute_gpio[] = {
270 	{EM2820_R08_GPIO_CTRL,	6,	7,	10},
271 	{	-1,		-1,	-1,	-1},
272 };
273 
274 /* Terratec AV350 */
275 static const struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
276 	{EM2820_R08_GPIO_CTRL,	0xff,	0x7f,		10},
277 	{	-1,		-1,	-1,		-1},
278 };
279 
280 static const struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
281 	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
282 	{	-1,		-1,	-1,		-1},
283 };
284 
285 static const struct em28xx_reg_seq silvercrest_reg_seq[] = {
286 	{EM2820_R08_GPIO_CTRL,	0xff,	0xff,		10},
287 	{EM2820_R08_GPIO_CTRL,	0x01,	0xf7,		10},
288 	{	-1,		-1,	-1,		-1},
289 };
290 
291 static const struct em28xx_reg_seq vc211a_enable[] = {
292 	{EM2820_R08_GPIO_CTRL,	0xff,	0x07,		10},
293 	{EM2820_R08_GPIO_CTRL,	0xff,	0x0f,		10},
294 	{EM2820_R08_GPIO_CTRL,	0xff,	0x0b,		10},
295 	{	-1,		-1,	-1,		-1},
296 };
297 
298 static const struct em28xx_reg_seq dikom_dk300_digital[] = {
299 	{EM2820_R08_GPIO_CTRL,	0x6e,	~EM_GPIO_4,	10},
300 	{EM2880_R04_GPO,	0x08,	0xff,		10},
301 	{	-1,		-1,	-1,		-1},
302 };
303 
304 /* Reset for the most [digital] boards */
305 static const struct em28xx_reg_seq leadership_digital[] = {
306 	{EM2874_R80_GPIO_P0_CTRL,	0x70,	0xff,	10},
307 	{	-1,			-1,	-1,	-1},
308 };
309 
310 static const struct em28xx_reg_seq leadership_reset[] = {
311 	{EM2874_R80_GPIO_P0_CTRL,	0xf0,	0xff,	10},
312 	{EM2874_R80_GPIO_P0_CTRL,	0xb0,	0xff,	10},
313 	{EM2874_R80_GPIO_P0_CTRL,	0xf0,	0xff,	10},
314 	{	-1,			-1,	-1,	-1},
315 };
316 
317 /*
318  * 2013:024f PCTV nanoStick T2 290e
319  * GPIO_6 - demod reset
320  * GPIO_7 - LED
321  */
322 static const struct em28xx_reg_seq pctv_290e[] = {
323 	{EM2874_R80_GPIO_P0_CTRL,	0x00,	0xff,	80},
324 	{EM2874_R80_GPIO_P0_CTRL,	0x40,	0xff,	80}, /* GPIO_6 = 1 */
325 	{EM2874_R80_GPIO_P0_CTRL,	0xc0,	0xff,	80}, /* GPIO_7 = 1 */
326 	{	-1,			-1,	-1,	-1},
327 };
328 
329 #if 0
330 static const struct em28xx_reg_seq terratec_h5_gpio[] = {
331 	{EM2820_R08_GPIO_CTRL,		0xff,	0xff,	10},
332 	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	100},
333 	{EM2874_R80_GPIO_P0_CTRL,	0xf2,	0xff,	50},
334 	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	50},
335 	{	-1,			-1,	-1,	-1},
336 };
337 
338 static const struct em28xx_reg_seq terratec_h5_digital[] = {
339 	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	10},
340 	{EM2874_R80_GPIO_P0_CTRL,	0xe6,	0xff,	100},
341 	{EM2874_R80_GPIO_P0_CTRL,	0xa6,	0xff,	10},
342 	{	-1,			-1,	-1,	-1},
343 };
344 #endif
345 
346 /*
347  * 2013:024f PCTV DVB-S2 Stick 460e
348  * GPIO_0 - POWER_ON
349  * GPIO_1 - BOOST
350  * GPIO_2 - VUV_LNB (red LED)
351  * GPIO_3 - EXT_12V
352  * GPIO_4 - INT_DEM (DEMOD GPIO_0)
353  * GPIO_5 - INT_LNB
354  * GPIO_6 - RESET_DEM
355  * GPIO_7 - LED (green LED)
356  */
357 static const struct em28xx_reg_seq pctv_460e[] = {
358 	{EM2874_R80_GPIO_P0_CTRL,	0x01,	0xff,	50},
359 	{	0x0d,			0xff,	0xff,	50},
360 	{EM2874_R80_GPIO_P0_CTRL,	0x41,	0xff,	50}, /* GPIO_6=1 */
361 	{	0x0d,			0x42,	0xff,	50},
362 	{EM2874_R80_GPIO_P0_CTRL,	0x61,	0xff,	50}, /* GPIO_5=1 */
363 	{	-1,			-1,	-1,	-1},
364 };
365 
366 static const struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
367 	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	10},
368 	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10}, /* xc5000 reset */
369 	{EM2874_R80_GPIO_P0_CTRL,	0xf9,	0xff,	35},
370 	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10},
371 	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	10},
372 	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	10},
373 	{EM2874_R80_GPIO_P0_CTRL,	0xbe,	0xff,	10},
374 	{EM2874_R80_GPIO_P0_CTRL,	0xfe,	0xff,	20},
375 	{	-1,			-1,	-1,	-1},
376 };
377 
378 /*
379  * 2013:0258 PCTV DVB-S2 Stick (461e)
380  * GPIO 0 = POWER_ON
381  * GPIO 1 = BOOST
382  * GPIO 2 = VUV_LNB (red LED)
383  * GPIO 3 = #EXT_12V
384  * GPIO 4 = INT_DEM
385  * GPIO 5 = INT_LNB
386  * GPIO 6 = #RESET_DEM
387  * GPIO 7 = P07_LED (green LED)
388  */
389 static const struct em28xx_reg_seq pctv_461e[] = {
390 	{EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},
391 	{0x0d,                 0xff, 0xff,    0},
392 	{EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */
393 	{EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */
394 	{0x0d,                 0x42, 0xff,    0},
395 	{EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},
396 	{EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */
397 	{                  -1,   -1,   -1,   -1},
398 };
399 
400 #if 0
401 static const struct em28xx_reg_seq hauppauge_930c_gpio[] = {
402 	{EM2874_R80_GPIO_P0_CTRL,	0x6f,	0xff,	10},
403 	{EM2874_R80_GPIO_P0_CTRL,	0x4f,	0xff,	10}, /* xc5000 reset */
404 	{EM2874_R80_GPIO_P0_CTRL,	0x6f,	0xff,	10},
405 	{EM2874_R80_GPIO_P0_CTRL,	0x4f,	0xff,	10},
406 	{	-1,			-1,	-1,	-1},
407 };
408 
409 static const struct em28xx_reg_seq hauppauge_930c_digital[] = {
410 	{EM2874_R80_GPIO_P0_CTRL,	0xf6,	0xff,	10},
411 	{EM2874_R80_GPIO_P0_CTRL,	0xe6,	0xff,	100},
412 	{EM2874_R80_GPIO_P0_CTRL,	0xa6,	0xff,	10},
413 	{	-1,			-1,	-1,	-1},
414 };
415 #endif
416 
417 /*
418  * 1b80:e425 MaxMedia UB425-TC
419  * 1b80:e1cc Delock 61959
420  * GPIO_6 - demod reset, 0=active
421  * GPIO_7 - LED, 0=active
422  */
423 static const struct em28xx_reg_seq maxmedia_ub425_tc[] = {
424 	{EM2874_R80_GPIO_P0_CTRL,	0x83,	0xff,	100},
425 	{EM2874_R80_GPIO_P0_CTRL,	0xc3,	0xff,	100}, /* GPIO_6 = 1 */
426 	{EM2874_R80_GPIO_P0_CTRL,	0x43,	0xff,	000}, /* GPIO_7 = 0 */
427 	{	-1,			-1,	-1,	-1},
428 };
429 
430 /*
431  * 2304:0242 PCTV QuatroStick (510e)
432  * GPIO_2: decoder reset, 0=active
433  * GPIO_4: decoder suspend, 0=active
434  * GPIO_6: demod reset, 0=active
435  * GPIO_7: LED, 1=active
436  */
437 static const struct em28xx_reg_seq pctv_510e[] = {
438 	{EM2874_R80_GPIO_P0_CTRL,	0x10,	0xff,	100},
439 	{EM2874_R80_GPIO_P0_CTRL,	0x14,	0xff,	100}, /* GPIO_2 = 1 */
440 	{EM2874_R80_GPIO_P0_CTRL,	0x54,	0xff,	050}, /* GPIO_6 = 1 */
441 	{	-1,			-1,	-1,	-1},
442 };
443 
444 /*
445  * 2013:0251 PCTV QuatroStick nano (520e)
446  * GPIO_2: decoder reset, 0=active
447  * GPIO_4: decoder suspend, 0=active
448  * GPIO_6: demod reset, 0=active
449  * GPIO_7: LED, 1=active
450  */
451 static const struct em28xx_reg_seq pctv_520e[] = {
452 	{EM2874_R80_GPIO_P0_CTRL,	0x10,	0xff,	100},
453 	{EM2874_R80_GPIO_P0_CTRL,	0x14,	0xff,	100}, /* GPIO_2 = 1 */
454 	{EM2874_R80_GPIO_P0_CTRL,	0x54,	0xff,	050}, /* GPIO_6 = 1 */
455 	{EM2874_R80_GPIO_P0_CTRL,	0xd4,	0xff,	000}, /* GPIO_7 = 1 */
456 	{	-1,			-1,	-1,	-1},
457 };
458 
459 /*
460  * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
461  * reg 0x80/0x84:
462  * GPIO_0: capturing LED, 0=on, 1=off
463  * GPIO_2: AV mute button, 0=pressed, 1=unpressed
464  * GPIO 3: illumination button, 0=pressed, 1=unpressed
465  * GPIO_6: illumination/flash LED, 0=on, 1=off
466  * reg 0x81/0x85:
467  * GPIO_7: snapshot button, 0=pressed, 1=unpressed
468  */
469 static const struct em28xx_reg_seq speedlink_vad_laplace_reg_seq[] = {
470 	{EM2820_R08_GPIO_CTRL,		0xf7,	0xff,	10},
471 	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xb2,	10},
472 	{	-1,			-1,	-1,	-1},
473 };
474 
475 static const struct em28xx_reg_seq pctv_292e[] = {
476 	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
477 	{0x0d,                         0xff, 0xff,    950},
478 	{EM2874_R80_GPIO_P0_CTRL,      0xbd, 0xff,    100},
479 	{EM2874_R80_GPIO_P0_CTRL,      0xfd, 0xff,    410},
480 	{EM2874_R80_GPIO_P0_CTRL,      0x7d, 0xff,    300},
481 	{EM2874_R80_GPIO_P0_CTRL,      0x7c, 0xff,     60},
482 	{0x0d,                         0x42, 0xff,     50},
483 	{EM2874_R5F_TS_ENABLE,         0x85, 0xff,      0},
484 	{-1,                             -1,   -1,     -1},
485 };
486 
487 static const struct em28xx_reg_seq terratec_t2_stick_hd[] = {
488 	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	0},
489 	{0x0d,				0xff,	0xff,	600},
490 	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	10},
491 	{EM2874_R80_GPIO_P0_CTRL,	0xbc,	0xff,	100},
492 	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	100},
493 	{EM2874_R80_GPIO_P0_CTRL,	0x00,	0xff,	300},
494 	{EM2874_R80_GPIO_P0_CTRL,	0xf8,	0xff,	100},
495 	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	300},
496 	{0x0d,				0x42,	0xff,	1000},
497 	{EM2874_R5F_TS_ENABLE,		0x85,	0xff,	0},
498 	{-1,                             -1,   -1,     -1},
499 };
500 
501 static const struct em28xx_reg_seq plex_px_bcud[] = {
502 	{EM2874_R80_GPIO_P0_CTRL,	0xff,	0xff,	0},
503 	{0x0d,				0xff,	0xff,	0},
504 	{EM2874_R50_IR_CONFIG,		0x01,	0xff,	0},
505 	{EM28XX_R06_I2C_CLK,		0x40,	0xff,	0},
506 	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	100},
507 	{EM28XX_R12_VINENABLE,		0x20,	0x20,	0},
508 	{0x0d,				0x42,	0xff,	1000},
509 	{EM2874_R80_GPIO_P0_CTRL,	0xfc,	0xff,	10},
510 	{EM2874_R80_GPIO_P0_CTRL,	0xfd,	0xff,	10},
511 	{0x73,				0xfd,	0xff,	100},
512 	{-1,				-1,	-1,	-1},
513 };
514 
515 /*
516  * 2040:0265 Hauppauge WinTV-dualHD DVB Isoc
517  * 2040:8265 Hauppauge WinTV-dualHD DVB Bulk
518  * 2040:026d Hauppauge WinTV-dualHD ATSC/QAM Isoc
519  * 2040:826d Hauppauge WinTV-dualHD ATSC/QAM Bulk
520  * reg 0x80/0x84:
521  * GPIO_0: Yellow LED tuner 1, 0=on, 1=off
522  * GPIO_1: Green LED tuner 1, 0=on, 1=off
523  * GPIO_2: Yellow LED tuner 2, 0=on, 1=off
524  * GPIO_3: Green LED tuner 2, 0=on, 1=off
525  * GPIO_5: Reset #2, 0=active
526  * GPIO_6: Reset #1, 0=active
527  */
528 static const struct em28xx_reg_seq hauppauge_dualhd_dvb[] = {
529 	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
530 	{0x0d,                         0xff, 0xff,    200},
531 	{0x50,                         0x04, 0xff,    300},
532 	{EM2874_R80_GPIO_P0_CTRL,      0xbf, 0xff,    100}, /* demod 1 reset */
533 	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
534 	{EM2874_R80_GPIO_P0_CTRL,      0xdf, 0xff,    100}, /* demod 2 reset */
535 	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,    100},
536 	{EM2874_R5F_TS_ENABLE,         0x00, 0xff,     50}, /* disable TS filters */
537 	{EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
538 	{EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
539 	{-1,                             -1,   -1,     -1},
540 };
541 
542 /* Hauppauge USB QuadHD */
543 static struct em28xx_reg_seq hauppauge_usb_quadhd_atsc_reg_seq[] = {
544 	{EM2874_R80_GPIO_P0_CTRL,      0xff, 0xff,      0},
545 	{0x0d,                         0xff, 0xff,    200},
546 	{0x50,                         0x04, 0xff,    300},
547 	{EM2874_R80_GPIO_P0_CTRL,      0xb0, 0xf0,    100}, /* demod 1 reset */
548 	{EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},
549 	{EM2874_R80_GPIO_P0_CTRL,      0xd0, 0xf0,    100}, /* demod 2 reset */
550 	{EM2874_R80_GPIO_P0_CTRL,      0xf0, 0xf0,    100},
551 	{EM2874_R5F_TS_ENABLE,         0x44, 0xff,     50},
552 	{EM2874_R5D_TS1_PKT_SIZE,      0x05, 0xff,     50},
553 	{EM2874_R5E_TS2_PKT_SIZE,      0x05, 0xff,     50},
554 	{-1,                           -1,   -1,       -1},
555 };
556 
557 /*
558  * MyGica USB TV Box
559  * GPIO_1,0: 00=Composite audio
560  *           01=Tuner audio
561  *           10=Mute audio
562  *           11=FM radio? (if equipped)
563  * GPIO_2-6: Unused
564  * GPIO_7:   ??
565  */
566 static const struct em28xx_reg_seq mygica_utv3_composite_audio_gpio[] = {
567 	{EM2820_R08_GPIO_CTRL, 0xfc, 0xff, 0},
568 	{ -1, -1, -1, -1},
569 };
570 
571 static const struct em28xx_reg_seq mygica_utv3_tuner_audio_gpio[] = {
572 	{EM2820_R08_GPIO_CTRL, 0xfd, 0xff, 0},
573 	{ -1, -1, -1, -1},
574 };
575 
576 static const struct em28xx_reg_seq mygica_utv3_suspend_gpio[] = {
577 	{EM2820_R08_GPIO_CTRL, 0xfe, 0xff, 0},
578 	{ -1, -1, -1, -1},
579 };
580 
581 /*
582  *  Button definitions
583  */
584 static const struct em28xx_button std_snapshot_button[] = {
585 	{
586 		.role         = EM28XX_BUTTON_SNAPSHOT,
587 		.reg_r        = EM28XX_R0C_USBSUSP,
588 		.reg_clearing = EM28XX_R0C_USBSUSP,
589 		.mask         = EM28XX_R0C_USBSUSP_SNAPSHOT,
590 		.inverted     = 0,
591 	},
592 	{-1, 0, 0, 0, 0},
593 };
594 
595 static const struct em28xx_button speedlink_vad_laplace_buttons[] = {
596 	{
597 		.role     = EM28XX_BUTTON_SNAPSHOT,
598 		.reg_r    = EM2874_R85_GPIO_P1_STATE,
599 		.mask     = 0x80,
600 		.inverted = 1,
601 	},
602 	{
603 		.role     = EM28XX_BUTTON_ILLUMINATION,
604 		.reg_r    = EM2874_R84_GPIO_P0_STATE,
605 		.mask     = 0x08,
606 		.inverted = 1,
607 	},
608 	{-1, 0, 0, 0, 0},
609 };
610 
611 /*
612  *  LED definitions
613  */
614 static struct em28xx_led speedlink_vad_laplace_leds[] = {
615 	{
616 		.role      = EM28XX_LED_ANALOG_CAPTURING,
617 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
618 		.gpio_mask = 0x01,
619 		.inverted  = 1,
620 	},
621 	{
622 		.role      = EM28XX_LED_ILLUMINATION,
623 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
624 		.gpio_mask = 0x40,
625 		.inverted  = 1,
626 	},
627 	{-1, 0, 0, 0},
628 };
629 
630 static struct em28xx_led kworld_ub435q_v3_leds[] = {
631 	{
632 		.role      = EM28XX_LED_DIGITAL_CAPTURING,
633 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
634 		.gpio_mask = 0x80,
635 		.inverted  = 1,
636 	},
637 	{-1, 0, 0, 0},
638 };
639 
640 static struct em28xx_led pctv_80e_leds[] = {
641 	{
642 		.role      = EM28XX_LED_DIGITAL_CAPTURING,
643 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
644 		.gpio_mask = 0x80,
645 		.inverted  = 0,
646 	},
647 	{-1, 0, 0, 0},
648 };
649 
650 static struct em28xx_led terratec_grabby_leds[] = {
651 	{
652 		.role      = EM28XX_LED_ANALOG_CAPTURING,
653 		.gpio_reg  = EM2820_R08_GPIO_CTRL,
654 		.gpio_mask = EM_GPIO_3,
655 		.inverted  = 1,
656 	},
657 	{-1, 0, 0, 0},
658 };
659 
660 static struct em28xx_led hauppauge_dualhd_leds[] = {
661 	{
662 		.role      = EM28XX_LED_DIGITAL_CAPTURING,
663 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
664 		.gpio_mask = EM_GPIO_1,
665 		.inverted  = 1,
666 	},
667 	{
668 		.role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
669 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
670 		.gpio_mask = EM_GPIO_3,
671 		.inverted  = 1,
672 	},
673 	{-1, 0, 0, 0},
674 };
675 
676 static struct em28xx_led hauppauge_usb_quadhd_leds[] = {
677 	{
678 		.role      = EM28XX_LED_DIGITAL_CAPTURING,
679 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
680 		.gpio_mask = EM_GPIO_2,
681 		.inverted  = 1,
682 	},
683 	{
684 		.role      = EM28XX_LED_DIGITAL_CAPTURING_TS2,
685 		.gpio_reg  = EM2874_R80_GPIO_P0_CTRL,
686 		.gpio_mask = EM_GPIO_0,
687 		.inverted  = 1,
688 	},
689 	{-1, 0, 0, 0},
690 };
691 
692 /*
693  *  Board definitions
694  */
695 const struct em28xx_board em28xx_boards[] = {
696 	[EM2750_BOARD_UNKNOWN] = {
697 		.name          = "EM2710/EM2750/EM2751 webcam grabber",
698 		.xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,
699 		.tuner_type    = TUNER_ABSENT,
700 		.is_webcam     = 1,
701 		.input         = { {
702 			.type     = EM28XX_VMUX_COMPOSITE,
703 			.vmux     = 0,
704 			.amux     = EM28XX_AMUX_VIDEO,
705 			.gpio     = silvercrest_reg_seq,
706 		} },
707 	},
708 	[EM2800_BOARD_UNKNOWN] = {
709 		.name         = "Unknown EM2800 video grabber",
710 		.is_em2800    = 1,
711 		.tda9887_conf = TDA9887_PRESENT,
712 		.decoder      = EM28XX_SAA711X,
713 		.tuner_type   = TUNER_ABSENT,
714 		.input        = { {
715 			.type     = EM28XX_VMUX_COMPOSITE,
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_UNKNOWN] = {
725 		.name          = "Unknown EM2750/28xx video grabber",
726 		.tuner_type    = TUNER_ABSENT,
727 		.is_webcam     = 1,	/* To enable sensor probe */
728 	},
729 	[EM2882_BOARD_ZOLID_HYBRID_TV_STICK] = {
730 		.name			= ":ZOLID HYBRID TV STICK",
731 		.tuner_type		= TUNER_XC2028,
732 		.tuner_gpio		= zolid_tuner,
733 		.decoder		= EM28XX_TVP5150,
734 		.xclk			= EM28XX_XCLK_FREQUENCY_12MHZ,
735 		.mts_firmware	= 1,
736 		.has_dvb		= 1,
737 		.dvb_gpio		= zolid_digital,
738 	},
739 	[EM2750_BOARD_DLCW_130] = {
740 		/* Beijing Huaqi Information Digital Technology Co., Ltd */
741 		.name          = "Huaqi DLCW-130",
742 		.valid         = EM28XX_BOARD_NOT_VALIDATED,
743 		.xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
744 		.tuner_type    = TUNER_ABSENT,
745 		.is_webcam     = 1,
746 		.input         = { {
747 			.type     = EM28XX_VMUX_COMPOSITE,
748 			.vmux     = 0,
749 			.amux     = EM28XX_AMUX_VIDEO,
750 		} },
751 	},
752 	[EM2820_BOARD_KWORLD_PVRTV2800RF] = {
753 		.name         = "Kworld PVR TV 2800 RF",
754 		.tuner_type   = TUNER_TEMIC_PAL,
755 		.tda9887_conf = TDA9887_PRESENT,
756 		.decoder      = EM28XX_SAA711X,
757 		.input        = { {
758 			.type     = EM28XX_VMUX_COMPOSITE,
759 			.vmux     = SAA7115_COMPOSITE0,
760 			.amux     = EM28XX_AMUX_LINE_IN,
761 		}, {
762 			.type     = EM28XX_VMUX_SVIDEO,
763 			.vmux     = SAA7115_SVIDEO3,
764 			.amux     = EM28XX_AMUX_LINE_IN,
765 		} },
766 	},
767 	[EM2820_BOARD_GADMEI_TVR200] = {
768 		.name         = "Gadmei TVR200",
769 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
770 		.tda9887_conf = TDA9887_PRESENT,
771 		.decoder      = EM28XX_SAA711X,
772 		.input        = { {
773 			.type     = EM28XX_VMUX_TELEVISION,
774 			.vmux     = SAA7115_COMPOSITE2,
775 			.amux     = EM28XX_AMUX_LINE_IN,
776 		}, {
777 			.type     = EM28XX_VMUX_COMPOSITE,
778 			.vmux     = SAA7115_COMPOSITE0,
779 			.amux     = EM28XX_AMUX_LINE_IN,
780 		}, {
781 			.type     = EM28XX_VMUX_SVIDEO,
782 			.vmux     = SAA7115_SVIDEO3,
783 			.amux     = EM28XX_AMUX_LINE_IN,
784 		} },
785 	},
786 	[EM2820_BOARD_TERRATEC_CINERGY_250] = {
787 		.name         = "Terratec Cinergy 250 USB",
788 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
789 		.has_ir_i2c   = 1,
790 		.tda9887_conf = TDA9887_PRESENT,
791 		.decoder      = EM28XX_SAA711X,
792 		.input        = { {
793 			.type     = EM28XX_VMUX_TELEVISION,
794 			.vmux     = SAA7115_COMPOSITE2,
795 			.amux     = EM28XX_AMUX_VIDEO,
796 		}, {
797 			.type     = EM28XX_VMUX_COMPOSITE,
798 			.vmux     = SAA7115_COMPOSITE0,
799 			.amux     = EM28XX_AMUX_LINE_IN,
800 		}, {
801 			.type     = EM28XX_VMUX_SVIDEO,
802 			.vmux     = SAA7115_SVIDEO3,
803 			.amux     = EM28XX_AMUX_LINE_IN,
804 		} },
805 	},
806 	[EM2820_BOARD_PINNACLE_USB_2] = {
807 		.name         = "Pinnacle PCTV USB 2",
808 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
809 		.has_ir_i2c   = 1,
810 		.tda9887_conf = TDA9887_PRESENT,
811 		.decoder      = EM28XX_SAA711X,
812 		.input        = { {
813 			.type     = EM28XX_VMUX_TELEVISION,
814 			.vmux     = SAA7115_COMPOSITE2,
815 			.amux     = EM28XX_AMUX_VIDEO,
816 		}, {
817 			.type     = EM28XX_VMUX_COMPOSITE,
818 			.vmux     = SAA7115_COMPOSITE0,
819 			.amux     = EM28XX_AMUX_LINE_IN,
820 		}, {
821 			.type     = EM28XX_VMUX_SVIDEO,
822 			.vmux     = SAA7115_SVIDEO3,
823 			.amux     = EM28XX_AMUX_LINE_IN,
824 		} },
825 	},
826 	[EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
827 		.name         = "Hauppauge WinTV USB 2",
828 		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
829 		.tda9887_conf = TDA9887_PRESENT |
830 				TDA9887_PORT1_ACTIVE |
831 				TDA9887_PORT2_ACTIVE,
832 		.decoder      = EM28XX_TVP5150,
833 		.has_msp34xx  = 1,
834 		.has_ir_i2c   = 1,
835 		.input        = { {
836 			.type     = EM28XX_VMUX_TELEVISION,
837 			.vmux     = TVP5150_COMPOSITE0,
838 			.amux     = MSP_INPUT_DEFAULT,
839 		}, {
840 			.type     = EM28XX_VMUX_SVIDEO,
841 			.vmux     = TVP5150_SVIDEO,
842 			.amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
843 					MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
844 		} },
845 	},
846 	[EM2820_BOARD_DLINK_USB_TV] = {
847 		.name         = "D-Link DUB-T210 TV Tuner",
848 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
849 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
850 		.tda9887_conf = TDA9887_PRESENT,
851 		.decoder      = EM28XX_SAA711X,
852 		.input        = { {
853 			.type     = EM28XX_VMUX_TELEVISION,
854 			.vmux     = SAA7115_COMPOSITE2,
855 			.amux     = EM28XX_AMUX_LINE_IN,
856 		}, {
857 			.type     = EM28XX_VMUX_COMPOSITE,
858 			.vmux     = SAA7115_COMPOSITE0,
859 			.amux     = EM28XX_AMUX_LINE_IN,
860 		}, {
861 			.type     = EM28XX_VMUX_SVIDEO,
862 			.vmux     = SAA7115_SVIDEO3,
863 			.amux     = EM28XX_AMUX_LINE_IN,
864 		} },
865 	},
866 	[EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
867 		.name         = "Hercules Smart TV USB 2.0",
868 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
869 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
870 		.tda9887_conf = TDA9887_PRESENT,
871 		.decoder      = EM28XX_SAA711X,
872 		.input        = { {
873 			.type     = EM28XX_VMUX_TELEVISION,
874 			.vmux     = SAA7115_COMPOSITE2,
875 			.amux     = EM28XX_AMUX_LINE_IN,
876 		}, {
877 			.type     = EM28XX_VMUX_COMPOSITE,
878 			.vmux     = SAA7115_COMPOSITE0,
879 			.amux     = EM28XX_AMUX_LINE_IN,
880 		}, {
881 			.type     = EM28XX_VMUX_SVIDEO,
882 			.vmux     = SAA7115_SVIDEO3,
883 			.amux     = EM28XX_AMUX_LINE_IN,
884 		} },
885 	},
886 	[EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
887 		.name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
888 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
889 		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
890 		.tda9887_conf = TDA9887_PRESENT,
891 		.decoder      = EM28XX_SAA711X,
892 		.input        = { {
893 			.type     = EM28XX_VMUX_TELEVISION,
894 			.vmux     = SAA7115_COMPOSITE2,
895 			.amux     = EM28XX_AMUX_VIDEO,
896 		}, {
897 			.type     = EM28XX_VMUX_COMPOSITE,
898 			.vmux     = SAA7115_COMPOSITE0,
899 			.amux     = EM28XX_AMUX_LINE_IN,
900 		}, {
901 			.type     = EM28XX_VMUX_SVIDEO,
902 			.vmux     = SAA7115_SVIDEO3,
903 			.amux     = EM28XX_AMUX_LINE_IN,
904 		} },
905 	},
906 	[EM2820_BOARD_GADMEI_UTV310] = {
907 		.name         = "Gadmei UTV310",
908 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
909 		.tuner_type   = TUNER_TNF_5335MF,
910 		.tda9887_conf = TDA9887_PRESENT,
911 		.decoder      = EM28XX_SAA711X,
912 		.input        = { {
913 			.type     = EM28XX_VMUX_TELEVISION,
914 			.vmux     = SAA7115_COMPOSITE1,
915 			.amux     = EM28XX_AMUX_LINE_IN,
916 		}, {
917 			.type     = EM28XX_VMUX_COMPOSITE,
918 			.vmux     = SAA7115_COMPOSITE0,
919 			.amux     = EM28XX_AMUX_LINE_IN,
920 		}, {
921 			.type     = EM28XX_VMUX_SVIDEO,
922 			.vmux     = SAA7115_SVIDEO3,
923 			.amux     = EM28XX_AMUX_LINE_IN,
924 		} },
925 	},
926 	[EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
927 		.name         = "Leadtek Winfast USB II Deluxe",
928 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
929 		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
930 		.has_ir_i2c   = 1,
931 		.tvaudio_addr = 0x58,
932 		.tda9887_conf = TDA9887_PRESENT |
933 				TDA9887_PORT2_ACTIVE |
934 				TDA9887_QSS,
935 		.decoder      = EM28XX_SAA711X,
936 		.adecoder     = EM28XX_TVAUDIO,
937 		.input        = { {
938 			.type     = EM28XX_VMUX_TELEVISION,
939 			.vmux     = SAA7115_COMPOSITE4,
940 			.amux     = EM28XX_AMUX_AUX,
941 		}, {
942 			.type     = EM28XX_VMUX_COMPOSITE,
943 			.vmux     = SAA7115_COMPOSITE5,
944 			.amux     = EM28XX_AMUX_LINE_IN,
945 		}, {
946 			.type     = EM28XX_VMUX_SVIDEO,
947 			.vmux     = SAA7115_SVIDEO3,
948 			.amux     = EM28XX_AMUX_LINE_IN,
949 		} },
950 			.radio	  = {
951 			.type     = EM28XX_RADIO,
952 			.amux     = EM28XX_AMUX_AUX,
953 			}
954 	},
955 	[EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
956 		.name         = "Videology 20K14XUSB USB2.0",
957 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
958 		.tuner_type   = TUNER_ABSENT,
959 		.is_webcam    = 1,
960 		.input        = { {
961 			.type     = EM28XX_VMUX_COMPOSITE,
962 			.vmux     = 0,
963 			.amux     = EM28XX_AMUX_VIDEO,
964 		} },
965 	},
966 	[EM2820_BOARD_SILVERCREST_WEBCAM] = {
967 		.name         = "Silvercrest Webcam 1.3mpix",
968 		.tuner_type   = TUNER_ABSENT,
969 		.is_webcam    = 1,
970 		.input        = { {
971 			.type     = EM28XX_VMUX_COMPOSITE,
972 			.vmux     = 0,
973 			.amux     = EM28XX_AMUX_VIDEO,
974 			.gpio     = silvercrest_reg_seq,
975 		} },
976 	},
977 	[EM2821_BOARD_SUPERCOMP_USB_2] = {
978 		.name         = "Supercomp USB 2.0 TV",
979 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
980 		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
981 		.tda9887_conf = TDA9887_PRESENT |
982 				TDA9887_PORT1_ACTIVE |
983 				TDA9887_PORT2_ACTIVE,
984 		.decoder      = EM28XX_SAA711X,
985 		.input        = { {
986 			.type     = EM28XX_VMUX_TELEVISION,
987 			.vmux     = SAA7115_COMPOSITE2,
988 			.amux     = EM28XX_AMUX_LINE_IN,
989 		}, {
990 			.type     = EM28XX_VMUX_COMPOSITE,
991 			.vmux     = SAA7115_COMPOSITE0,
992 			.amux     = EM28XX_AMUX_VIDEO,
993 		}, {
994 			.type     = EM28XX_VMUX_SVIDEO,
995 			.vmux     = SAA7115_SVIDEO3,
996 			.amux     = EM28XX_AMUX_LINE_IN,
997 		} },
998 	},
999 	[EM2821_BOARD_USBGEAR_VD204] = {
1000 		.name         = "Usbgear VD204v9",
1001 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1002 		.tuner_type   = TUNER_ABSENT,	/* Capture only device */
1003 		.decoder      = EM28XX_SAA711X,
1004 		.input        = { {
1005 			.type  = EM28XX_VMUX_COMPOSITE,
1006 			.vmux  = SAA7115_COMPOSITE0,
1007 			.amux  = EM28XX_AMUX_LINE_IN,
1008 		}, {
1009 			.type  = EM28XX_VMUX_SVIDEO,
1010 			.vmux  = SAA7115_SVIDEO3,
1011 			.amux  = EM28XX_AMUX_LINE_IN,
1012 		} },
1013 	},
1014 	[EM2860_BOARD_NETGMBH_CAM] = {
1015 		/* Beijing Huaqi Information Digital Technology Co., Ltd */
1016 		.name         = "NetGMBH Cam",
1017 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1018 		.tuner_type   = TUNER_ABSENT,
1019 		.is_webcam    = 1,
1020 		.input        = { {
1021 			.type     = EM28XX_VMUX_COMPOSITE,
1022 			.vmux     = 0,
1023 			.amux     = EM28XX_AMUX_VIDEO,
1024 		} },
1025 	},
1026 	[EM2860_BOARD_TYPHOON_DVD_MAKER] = {
1027 		.name         = "Typhoon DVD Maker",
1028 		.decoder      = EM28XX_SAA711X,
1029 		.tuner_type   = TUNER_ABSENT,	/* Capture only device */
1030 		.input        = { {
1031 			.type  = EM28XX_VMUX_COMPOSITE,
1032 			.vmux  = SAA7115_COMPOSITE0,
1033 			.amux  = EM28XX_AMUX_LINE_IN,
1034 		}, {
1035 			.type  = EM28XX_VMUX_SVIDEO,
1036 			.vmux  = SAA7115_SVIDEO3,
1037 			.amux  = EM28XX_AMUX_LINE_IN,
1038 		} },
1039 	},
1040 	[EM2860_BOARD_GADMEI_UTV330] = {
1041 		.name         = "Gadmei UTV330",
1042 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1043 		.tuner_type   = TUNER_TNF_5335MF,
1044 		.tda9887_conf = TDA9887_PRESENT,
1045 		.decoder      = EM28XX_SAA711X,
1046 		.input        = { {
1047 			.type     = EM28XX_VMUX_TELEVISION,
1048 			.vmux     = SAA7115_COMPOSITE2,
1049 			.amux     = EM28XX_AMUX_VIDEO,
1050 		}, {
1051 			.type     = EM28XX_VMUX_COMPOSITE,
1052 			.vmux     = SAA7115_COMPOSITE0,
1053 			.amux     = EM28XX_AMUX_LINE_IN,
1054 		}, {
1055 			.type     = EM28XX_VMUX_SVIDEO,
1056 			.vmux     = SAA7115_SVIDEO3,
1057 			.amux     = EM28XX_AMUX_LINE_IN,
1058 		} },
1059 	},
1060 	[EM2861_BOARD_GADMEI_UTV330PLUS] = {
1061 		.name         = "Gadmei UTV330+",
1062 		.tuner_type   = TUNER_TNF_5335MF,
1063 		.tda9887_conf = TDA9887_PRESENT,
1064 		.ir_codes     = RC_MAP_GADMEI_RM008Z,
1065 		.decoder      = EM28XX_SAA711X,
1066 		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
1067 		.input        = { {
1068 			.type     = EM28XX_VMUX_TELEVISION,
1069 			.vmux     = SAA7115_COMPOSITE2,
1070 			.amux     = EM28XX_AMUX_VIDEO,
1071 		}, {
1072 			.type     = EM28XX_VMUX_COMPOSITE,
1073 			.vmux     = SAA7115_COMPOSITE0,
1074 			.amux     = EM28XX_AMUX_LINE_IN,
1075 		}, {
1076 			.type     = EM28XX_VMUX_SVIDEO,
1077 			.vmux     = SAA7115_SVIDEO3,
1078 			.amux     = EM28XX_AMUX_LINE_IN,
1079 		} },
1080 	},
1081 	[EM2860_BOARD_TERRATEC_HYBRID_XS] = {
1082 		.name         = "Terratec Cinergy A Hybrid XS",
1083 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1084 		.tuner_type   = TUNER_XC2028,
1085 		.tuner_gpio   = default_tuner_gpio,
1086 		.decoder      = EM28XX_TVP5150,
1087 
1088 		.input        = { {
1089 			.type     = EM28XX_VMUX_TELEVISION,
1090 			.vmux     = TVP5150_COMPOSITE0,
1091 			.amux     = EM28XX_AMUX_VIDEO,
1092 			.gpio     = hauppauge_wintv_hvr_900_analog,
1093 		}, {
1094 			.type     = EM28XX_VMUX_COMPOSITE,
1095 			.vmux     = TVP5150_COMPOSITE1,
1096 			.amux     = EM28XX_AMUX_LINE_IN,
1097 			.gpio     = hauppauge_wintv_hvr_900_analog,
1098 		}, {
1099 			.type     = EM28XX_VMUX_SVIDEO,
1100 			.vmux     = TVP5150_SVIDEO,
1101 			.amux     = EM28XX_AMUX_LINE_IN,
1102 			.gpio     = hauppauge_wintv_hvr_900_analog,
1103 		} },
1104 	},
1105 	[EM2861_BOARD_KWORLD_PVRTV_300U] = {
1106 		.name	      = "KWorld PVRTV 300U",
1107 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1108 		.tuner_type   = TUNER_XC2028,
1109 		.tuner_gpio   = default_tuner_gpio,
1110 		.decoder      = EM28XX_TVP5150,
1111 		.input        = { {
1112 			.type     = EM28XX_VMUX_TELEVISION,
1113 			.vmux     = TVP5150_COMPOSITE0,
1114 			.amux     = EM28XX_AMUX_VIDEO,
1115 		}, {
1116 			.type     = EM28XX_VMUX_COMPOSITE,
1117 			.vmux     = TVP5150_COMPOSITE1,
1118 			.amux     = EM28XX_AMUX_LINE_IN,
1119 		}, {
1120 			.type     = EM28XX_VMUX_SVIDEO,
1121 			.vmux     = TVP5150_SVIDEO,
1122 			.amux     = EM28XX_AMUX_LINE_IN,
1123 		} },
1124 	},
1125 	[EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
1126 		.name          = "Yakumo MovieMixer",
1127 		.tuner_type    = TUNER_ABSENT,	/* Capture only device */
1128 		.decoder       = EM28XX_TVP5150,
1129 		.input         = { {
1130 			.type     = EM28XX_VMUX_TELEVISION,
1131 			.vmux     = TVP5150_COMPOSITE0,
1132 			.amux     = EM28XX_AMUX_VIDEO,
1133 		}, {
1134 			.type     = EM28XX_VMUX_COMPOSITE,
1135 			.vmux     = TVP5150_COMPOSITE1,
1136 			.amux     = EM28XX_AMUX_LINE_IN,
1137 		}, {
1138 			.type     = EM28XX_VMUX_SVIDEO,
1139 			.vmux     = TVP5150_SVIDEO,
1140 			.amux     = EM28XX_AMUX_LINE_IN,
1141 		} },
1142 	},
1143 	[EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
1144 		.name          = "EM2860/TVP5150 Reference Design",
1145 		.tuner_type    = TUNER_ABSENT,	/* Capture only device */
1146 		.decoder       = EM28XX_TVP5150,
1147 		.input         = { {
1148 			.type     = EM28XX_VMUX_COMPOSITE,
1149 			.vmux     = TVP5150_COMPOSITE1,
1150 			.amux     = EM28XX_AMUX_LINE_IN,
1151 		}, {
1152 			.type     = EM28XX_VMUX_SVIDEO,
1153 			.vmux     = TVP5150_SVIDEO,
1154 			.amux     = EM28XX_AMUX_LINE_IN,
1155 		} },
1156 	},
1157 	[EM2861_BOARD_PLEXTOR_PX_TV100U] = {
1158 		.name         = "Plextor ConvertX PX-TV100U",
1159 		.tuner_type   = TUNER_TNF_5335MF,
1160 		.xclk         = EM28XX_XCLK_I2S_MSB_TIMING |
1161 				EM28XX_XCLK_FREQUENCY_12MHZ,
1162 		.tda9887_conf = TDA9887_PRESENT,
1163 		.decoder      = EM28XX_TVP5150,
1164 		.has_msp34xx  = 1,
1165 		.input        = { {
1166 			.type     = EM28XX_VMUX_TELEVISION,
1167 			.vmux     = TVP5150_COMPOSITE0,
1168 			.amux     = EM28XX_AMUX_LINE_IN,
1169 			.gpio     = pinnacle_hybrid_pro_analog,
1170 		}, {
1171 			.type     = EM28XX_VMUX_COMPOSITE,
1172 			.vmux     = TVP5150_COMPOSITE1,
1173 			.amux     = EM28XX_AMUX_LINE_IN,
1174 			.gpio     = pinnacle_hybrid_pro_analog,
1175 		}, {
1176 			.type     = EM28XX_VMUX_SVIDEO,
1177 			.vmux     = TVP5150_SVIDEO,
1178 			.amux     = EM28XX_AMUX_LINE_IN,
1179 			.gpio     = pinnacle_hybrid_pro_analog,
1180 		} },
1181 	},
1182 
1183 	/* Those boards with em2870 are DVB Only*/
1184 
1185 	[EM2870_BOARD_TERRATEC_XS] = {
1186 		.name         = "Terratec Cinergy T XS",
1187 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1188 		.tuner_type   = TUNER_XC2028,
1189 		.tuner_gpio   = default_tuner_gpio,
1190 	},
1191 	[EM2870_BOARD_TERRATEC_XS_MT2060] = {
1192 		.name         = "Terratec Cinergy T XS (MT2060)",
1193 		.xclk         = EM28XX_XCLK_IR_RC5_MODE |
1194 				EM28XX_XCLK_FREQUENCY_12MHZ,
1195 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
1196 		.tuner_type   = TUNER_ABSENT, /* MT2060 */
1197 		.has_dvb      = 1,
1198 		.tuner_gpio   = default_tuner_gpio,
1199 	},
1200 	[EM2870_BOARD_KWORLD_350U] = {
1201 		.name         = "Kworld 350 U DVB-T",
1202 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1203 		.tuner_type   = TUNER_XC2028,
1204 		.tuner_gpio   = default_tuner_gpio,
1205 	},
1206 	[EM2870_BOARD_KWORLD_355U] = {
1207 		.name         = "Kworld 355 U DVB-T",
1208 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1209 		.tuner_type   = TUNER_ABSENT,
1210 		.tuner_gpio   = default_tuner_gpio,
1211 		.has_dvb      = 1,
1212 		.dvb_gpio     = default_digital,
1213 	},
1214 	[EM2870_BOARD_PINNACLE_PCTV_DVB] = {
1215 		.name         = "Pinnacle PCTV DVB-T",
1216 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1217 		.tuner_type   = TUNER_ABSENT, /* MT2060 */
1218 		/* djh - I have serious doubts this is right... */
1219 		.xclk         = EM28XX_XCLK_IR_RC5_MODE |
1220 				EM28XX_XCLK_FREQUENCY_10MHZ,
1221 	},
1222 	[EM2870_BOARD_COMPRO_VIDEOMATE] = {
1223 		.name         = "Compro, VideoMate U3",
1224 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1225 		.tuner_type   = TUNER_ABSENT, /* MT2060 */
1226 	},
1227 
1228 	[EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
1229 		.name         = "Terratec Hybrid XS Secam",
1230 		.has_msp34xx  = 1,
1231 		.tuner_type   = TUNER_XC2028,
1232 		.tuner_gpio   = default_tuner_gpio,
1233 		.decoder      = EM28XX_TVP5150,
1234 		.has_dvb      = 1,
1235 		.dvb_gpio     = terratec_cinergy_USB_XS_FR_digital,
1236 		.input        = { {
1237 			.type     = EM28XX_VMUX_TELEVISION,
1238 			.vmux     = TVP5150_COMPOSITE0,
1239 			.amux     = EM28XX_AMUX_VIDEO,
1240 			.gpio     = terratec_cinergy_USB_XS_FR_analog,
1241 		}, {
1242 			.type     = EM28XX_VMUX_COMPOSITE,
1243 			.vmux     = TVP5150_COMPOSITE1,
1244 			.amux     = EM28XX_AMUX_LINE_IN,
1245 			.gpio     = terratec_cinergy_USB_XS_FR_analog,
1246 		}, {
1247 			.type     = EM28XX_VMUX_SVIDEO,
1248 			.vmux     = TVP5150_SVIDEO,
1249 			.amux     = EM28XX_AMUX_LINE_IN,
1250 			.gpio     = terratec_cinergy_USB_XS_FR_analog,
1251 		} },
1252 	},
1253 	[EM2884_BOARD_TERRATEC_H5] = {
1254 		.name         = "Terratec Cinergy H5",
1255 		.has_dvb      = 1,
1256 #if 0
1257 		.tuner_type   = TUNER_PHILIPS_TDA8290,
1258 		.tuner_addr   = 0x41,
1259 		.dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
1260 		.tuner_gpio   = terratec_h5_gpio,
1261 #else
1262 		.tuner_type   = TUNER_ABSENT,
1263 #endif
1264 		.def_i2c_bus  = 1,
1265 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1266 				EM28XX_I2C_FREQ_400_KHZ,
1267 	},
1268 	[EM2884_BOARD_TERRATEC_H6] = {
1269 		.name         = "Terratec Cinergy H6 rev. 2",
1270 		.has_dvb      = 1,
1271 		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1272 #if 0
1273 		.tuner_type   = TUNER_PHILIPS_TDA8290,
1274 		.tuner_addr   = 0x41,
1275 		.dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
1276 		.tuner_gpio   = terratec_h5_gpio,
1277 #else
1278 		.tuner_type   = TUNER_ABSENT,
1279 #endif
1280 		.def_i2c_bus  = 1,
1281 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1282 				EM28XX_I2C_FREQ_400_KHZ,
1283 	},
1284 	[EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
1285 		.name         = "Hauppauge WinTV HVR 930C",
1286 		.has_dvb      = 1,
1287 #if 0 /* FIXME: Add analog support */
1288 		.tuner_type   = TUNER_XC5000,
1289 		.tuner_addr   = 0x41,
1290 		.dvb_gpio     = hauppauge_930c_digital,
1291 		.tuner_gpio   = hauppauge_930c_gpio,
1292 #else
1293 		.tuner_type   = TUNER_ABSENT,
1294 #endif
1295 		.ir_codes     = RC_MAP_HAUPPAUGE,
1296 		.def_i2c_bus  = 1,
1297 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1298 				EM28XX_I2C_FREQ_400_KHZ,
1299 	},
1300 	[EM2884_BOARD_C3TECH_DIGITAL_DUO] = {
1301 		.name         = "C3 Tech Digital Duo HDTV/SDTV USB",
1302 		.has_dvb      = 1,
1303 		/* FIXME: Add analog support - need a saa7136 driver */
1304 		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */
1305 		.ir_codes     = RC_MAP_EMPTY,
1306 		.def_i2c_bus  = 1,
1307 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE,
1308 		.dvb_gpio     = c3tech_digital_duo_digital,
1309 	},
1310 	[EM2884_BOARD_CINERGY_HTC_STICK] = {
1311 		.name         = "Terratec Cinergy HTC Stick",
1312 		.has_dvb      = 1,
1313 		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1314 		.tuner_type   = TUNER_ABSENT,
1315 		.def_i2c_bus  = 1,
1316 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1317 				EM28XX_I2C_FREQ_400_KHZ,
1318 	},
1319 	[EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = {
1320 		.name         = "Elgato EyeTV Hybrid 2008 INT",
1321 		.has_dvb      = 1,
1322 		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1323 		.tuner_type   = TUNER_ABSENT,
1324 		.def_i2c_bus  = 1,
1325 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
1326 				EM28XX_I2C_FREQ_400_KHZ,
1327 	},
1328 	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
1329 		.name         = "Hauppauge WinTV HVR 900",
1330 		.tda9887_conf = TDA9887_PRESENT,
1331 		.tuner_type   = TUNER_XC2028,
1332 		.tuner_gpio   = default_tuner_gpio,
1333 		.mts_firmware = 1,
1334 		.has_dvb      = 1,
1335 		.dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1336 		.ir_codes     = RC_MAP_HAUPPAUGE,
1337 		.decoder      = EM28XX_TVP5150,
1338 		.input        = { {
1339 			.type     = EM28XX_VMUX_TELEVISION,
1340 			.vmux     = TVP5150_COMPOSITE0,
1341 			.amux     = EM28XX_AMUX_VIDEO,
1342 			.gpio     = hauppauge_wintv_hvr_900_analog,
1343 		}, {
1344 			.type     = EM28XX_VMUX_COMPOSITE,
1345 			.vmux     = TVP5150_COMPOSITE1,
1346 			.amux     = EM28XX_AMUX_LINE_IN,
1347 			.gpio     = hauppauge_wintv_hvr_900_analog,
1348 		}, {
1349 			.type     = EM28XX_VMUX_SVIDEO,
1350 			.vmux     = TVP5150_SVIDEO,
1351 			.amux     = EM28XX_AMUX_LINE_IN,
1352 			.gpio     = hauppauge_wintv_hvr_900_analog,
1353 		} },
1354 	},
1355 	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
1356 		.name         = "Hauppauge WinTV HVR 900 (R2)",
1357 		.tda9887_conf = TDA9887_PRESENT,
1358 		.tuner_type   = TUNER_XC2028,
1359 		.tuner_gpio   = default_tuner_gpio,
1360 		.mts_firmware = 1,
1361 		.has_dvb      = 1,
1362 		.dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1363 		.ir_codes     = RC_MAP_HAUPPAUGE,
1364 		.decoder      = EM28XX_TVP5150,
1365 		.input        = { {
1366 			.type     = EM28XX_VMUX_TELEVISION,
1367 			.vmux     = TVP5150_COMPOSITE0,
1368 			.amux     = EM28XX_AMUX_VIDEO,
1369 			.gpio     = hauppauge_wintv_hvr_900_analog,
1370 		}, {
1371 			.type     = EM28XX_VMUX_COMPOSITE,
1372 			.vmux     = TVP5150_COMPOSITE1,
1373 			.amux     = EM28XX_AMUX_LINE_IN,
1374 			.gpio     = hauppauge_wintv_hvr_900_analog,
1375 		}, {
1376 			.type     = EM28XX_VMUX_SVIDEO,
1377 			.vmux     = TVP5150_SVIDEO,
1378 			.amux     = EM28XX_AMUX_LINE_IN,
1379 			.gpio     = hauppauge_wintv_hvr_900_analog,
1380 		} },
1381 	},
1382 	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
1383 		.name           = "Hauppauge WinTV HVR 850",
1384 		.tuner_type     = TUNER_XC2028,
1385 		.tuner_gpio     = default_tuner_gpio,
1386 		.mts_firmware   = 1,
1387 		.has_dvb        = 1,
1388 		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1389 		.ir_codes       = RC_MAP_HAUPPAUGE,
1390 		.decoder        = EM28XX_TVP5150,
1391 		.input          = { {
1392 			.type     = EM28XX_VMUX_TELEVISION,
1393 			.vmux     = TVP5150_COMPOSITE0,
1394 			.amux     = EM28XX_AMUX_VIDEO,
1395 			.gpio     = hauppauge_wintv_hvr_900_analog,
1396 		}, {
1397 			.type     = EM28XX_VMUX_COMPOSITE,
1398 			.vmux     = TVP5150_COMPOSITE1,
1399 			.amux     = EM28XX_AMUX_LINE_IN,
1400 			.gpio     = hauppauge_wintv_hvr_900_analog,
1401 		}, {
1402 			.type     = EM28XX_VMUX_SVIDEO,
1403 			.vmux     = TVP5150_SVIDEO,
1404 			.amux     = EM28XX_AMUX_LINE_IN,
1405 			.gpio     = hauppauge_wintv_hvr_900_analog,
1406 		} },
1407 	},
1408 	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
1409 		.name           = "Hauppauge WinTV HVR 950",
1410 		.tuner_type     = TUNER_XC2028,
1411 		.tuner_gpio     = default_tuner_gpio,
1412 		.mts_firmware   = 1,
1413 		.has_dvb        = 1,
1414 		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1415 		.ir_codes       = RC_MAP_HAUPPAUGE,
1416 		.decoder        = EM28XX_TVP5150,
1417 		.input          = { {
1418 			.type     = EM28XX_VMUX_TELEVISION,
1419 			.vmux     = TVP5150_COMPOSITE0,
1420 			.amux     = EM28XX_AMUX_VIDEO,
1421 			.gpio     = hauppauge_wintv_hvr_900_analog,
1422 		}, {
1423 			.type     = EM28XX_VMUX_COMPOSITE,
1424 			.vmux     = TVP5150_COMPOSITE1,
1425 			.amux     = EM28XX_AMUX_LINE_IN,
1426 			.gpio     = hauppauge_wintv_hvr_900_analog,
1427 		}, {
1428 			.type     = EM28XX_VMUX_SVIDEO,
1429 			.vmux     = TVP5150_SVIDEO,
1430 			.amux     = EM28XX_AMUX_LINE_IN,
1431 			.gpio     = hauppauge_wintv_hvr_900_analog,
1432 		} },
1433 	},
1434 	[EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
1435 		.name           = "Pinnacle PCTV HD Pro Stick",
1436 		.tuner_type     = TUNER_XC2028,
1437 		.tuner_gpio   = default_tuner_gpio,
1438 		.mts_firmware   = 1,
1439 		.has_dvb        = 1,
1440 		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1441 		.ir_codes       = RC_MAP_PINNACLE_PCTV_HD,
1442 		.decoder        = EM28XX_TVP5150,
1443 		.input          = { {
1444 			.type     = EM28XX_VMUX_TELEVISION,
1445 			.vmux     = TVP5150_COMPOSITE0,
1446 			.amux     = EM28XX_AMUX_VIDEO,
1447 			.gpio     = hauppauge_wintv_hvr_900_analog,
1448 		}, {
1449 			.type     = EM28XX_VMUX_COMPOSITE,
1450 			.vmux     = TVP5150_COMPOSITE1,
1451 			.amux     = EM28XX_AMUX_LINE_IN,
1452 			.gpio     = hauppauge_wintv_hvr_900_analog,
1453 		}, {
1454 			.type     = EM28XX_VMUX_SVIDEO,
1455 			.vmux     = TVP5150_SVIDEO,
1456 			.amux     = EM28XX_AMUX_LINE_IN,
1457 			.gpio     = hauppauge_wintv_hvr_900_analog,
1458 		} },
1459 	},
1460 	[EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
1461 		.name           = "AMD ATI TV Wonder HD 600",
1462 		.tuner_type     = TUNER_XC2028,
1463 		.tuner_gpio     = default_tuner_gpio,
1464 		.mts_firmware   = 1,
1465 		.has_dvb        = 1,
1466 		.dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1467 		.ir_codes       = RC_MAP_ATI_TV_WONDER_HD_600,
1468 		.decoder        = EM28XX_TVP5150,
1469 		.input          = { {
1470 			.type     = EM28XX_VMUX_TELEVISION,
1471 			.vmux     = TVP5150_COMPOSITE0,
1472 			.amux     = EM28XX_AMUX_VIDEO,
1473 			.gpio     = hauppauge_wintv_hvr_900_analog,
1474 		}, {
1475 			.type     = EM28XX_VMUX_COMPOSITE,
1476 			.vmux     = TVP5150_COMPOSITE1,
1477 			.amux     = EM28XX_AMUX_LINE_IN,
1478 			.gpio     = hauppauge_wintv_hvr_900_analog,
1479 		}, {
1480 			.type     = EM28XX_VMUX_SVIDEO,
1481 			.vmux     = TVP5150_SVIDEO,
1482 			.amux     = EM28XX_AMUX_LINE_IN,
1483 			.gpio     = hauppauge_wintv_hvr_900_analog,
1484 		} },
1485 	},
1486 	[EM2880_BOARD_TERRATEC_HYBRID_XS] = {
1487 		.name           = "Terratec Hybrid XS",
1488 		.tuner_type     = TUNER_XC2028,
1489 		.tuner_gpio     = default_tuner_gpio,
1490 		.decoder        = EM28XX_TVP5150,
1491 		.has_dvb        = 1,
1492 		.dvb_gpio       = default_digital,
1493 		.ir_codes       = RC_MAP_TERRATEC_CINERGY_XS,
1494 		.xclk           = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1495 		.input          = { {
1496 			.type     = EM28XX_VMUX_TELEVISION,
1497 			.vmux     = TVP5150_COMPOSITE0,
1498 			.amux     = EM28XX_AMUX_VIDEO,
1499 			.gpio     = default_analog,
1500 		}, {
1501 			.type     = EM28XX_VMUX_COMPOSITE,
1502 			.vmux     = TVP5150_COMPOSITE1,
1503 			.amux     = EM28XX_AMUX_LINE_IN,
1504 			.gpio     = default_analog,
1505 		}, {
1506 			.type     = EM28XX_VMUX_SVIDEO,
1507 			.vmux     = TVP5150_SVIDEO,
1508 			.amux     = EM28XX_AMUX_LINE_IN,
1509 			.gpio     = default_analog,
1510 		} },
1511 	},
1512 	/*
1513 	 * maybe there's a reason behind it why Terratec sells the Hybrid XS
1514 	 * as Prodigy XS with a different PID, let's keep it separated for now
1515 	 * maybe we'll need it later on
1516 	 */
1517 	[EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
1518 		.name         = "Terratec Prodigy XS",
1519 		.tuner_type   = TUNER_XC2028,
1520 		.tuner_gpio   = default_tuner_gpio,
1521 		.decoder      = EM28XX_TVP5150,
1522 		.input        = { {
1523 			.type     = EM28XX_VMUX_TELEVISION,
1524 			.vmux     = TVP5150_COMPOSITE0,
1525 			.amux     = EM28XX_AMUX_VIDEO,
1526 			.gpio     = hauppauge_wintv_hvr_900_analog,
1527 		}, {
1528 			.type     = EM28XX_VMUX_COMPOSITE,
1529 			.vmux     = TVP5150_COMPOSITE1,
1530 			.amux     = EM28XX_AMUX_LINE_IN,
1531 			.gpio     = hauppauge_wintv_hvr_900_analog,
1532 		}, {
1533 			.type     = EM28XX_VMUX_SVIDEO,
1534 			.vmux     = TVP5150_SVIDEO,
1535 			.amux     = EM28XX_AMUX_LINE_IN,
1536 			.gpio     = hauppauge_wintv_hvr_900_analog,
1537 		} },
1538 	},
1539 	[EM2820_BOARD_MSI_VOX_USB_2] = {
1540 		.name		   = "MSI VOX USB 2.0",
1541 		.tuner_type	   = TUNER_LG_PAL_NEW_TAPC,
1542 		.tda9887_conf	   = TDA9887_PRESENT      |
1543 				     TDA9887_PORT1_ACTIVE |
1544 				     TDA9887_PORT2_ACTIVE,
1545 		.max_range_640_480 = 1,
1546 		.decoder           = EM28XX_SAA711X,
1547 		.input             = { {
1548 			.type      = EM28XX_VMUX_TELEVISION,
1549 			.vmux      = SAA7115_COMPOSITE4,
1550 			.amux      = EM28XX_AMUX_VIDEO,
1551 		}, {
1552 			.type      = EM28XX_VMUX_COMPOSITE,
1553 			.vmux      = SAA7115_COMPOSITE0,
1554 			.amux      = EM28XX_AMUX_LINE_IN,
1555 		}, {
1556 			.type      = EM28XX_VMUX_SVIDEO,
1557 			.vmux      = SAA7115_SVIDEO3,
1558 			.amux      = EM28XX_AMUX_LINE_IN,
1559 		} },
1560 	},
1561 	[EM2800_BOARD_TERRATEC_CINERGY_200] = {
1562 		.name         = "Terratec Cinergy 200 USB",
1563 		.is_em2800    = 1,
1564 		.has_ir_i2c   = 1,
1565 		.tuner_type   = TUNER_LG_TALN,
1566 		.tda9887_conf = TDA9887_PRESENT,
1567 		.decoder      = EM28XX_SAA711X,
1568 		.input        = { {
1569 			.type     = EM28XX_VMUX_TELEVISION,
1570 			.vmux     = SAA7115_COMPOSITE2,
1571 			.amux     = EM28XX_AMUX_VIDEO,
1572 		}, {
1573 			.type     = EM28XX_VMUX_COMPOSITE,
1574 			.vmux     = SAA7115_COMPOSITE0,
1575 			.amux     = EM28XX_AMUX_LINE_IN,
1576 		}, {
1577 			.type     = EM28XX_VMUX_SVIDEO,
1578 			.vmux     = SAA7115_SVIDEO3,
1579 			.amux     = EM28XX_AMUX_LINE_IN,
1580 		} },
1581 	},
1582 	[EM2800_BOARD_GRABBEEX_USB2800] = {
1583 		.name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
1584 		.is_em2800  = 1,
1585 		.decoder    = EM28XX_SAA711X,
1586 		.tuner_type = TUNER_ABSENT, /* capture only board */
1587 		.input      = { {
1588 			.type     = EM28XX_VMUX_COMPOSITE,
1589 			.vmux     = SAA7115_COMPOSITE0,
1590 			.amux     = EM28XX_AMUX_LINE_IN,
1591 		}, {
1592 			.type     = EM28XX_VMUX_SVIDEO,
1593 			.vmux     = SAA7115_SVIDEO3,
1594 			.amux     = EM28XX_AMUX_LINE_IN,
1595 		} },
1596 	},
1597 	[EM2800_BOARD_VC211A] = {
1598 		.name         = "Actionmaster/LinXcel/Digitus VC211A",
1599 		.is_em2800    = 1,
1600 		.tuner_type   = TUNER_ABSENT,	/* Capture-only board */
1601 		.decoder      = EM28XX_SAA711X,
1602 		.input        = { {
1603 			.type     = EM28XX_VMUX_COMPOSITE,
1604 			.vmux     = SAA7115_COMPOSITE0,
1605 			.amux     = EM28XX_AMUX_LINE_IN,
1606 			.gpio     = vc211a_enable,
1607 		}, {
1608 			.type     = EM28XX_VMUX_SVIDEO,
1609 			.vmux     = SAA7115_SVIDEO3,
1610 			.amux     = EM28XX_AMUX_LINE_IN,
1611 			.gpio     = vc211a_enable,
1612 		} },
1613 	},
1614 	[EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
1615 		.name         = "Leadtek Winfast USB II",
1616 		.is_em2800    = 1,
1617 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1618 		.tda9887_conf = TDA9887_PRESENT,
1619 		.decoder      = EM28XX_SAA711X,
1620 		.input        = { {
1621 			.type     = EM28XX_VMUX_TELEVISION,
1622 			.vmux     = SAA7115_COMPOSITE2,
1623 			.amux     = EM28XX_AMUX_VIDEO,
1624 		}, {
1625 			.type     = EM28XX_VMUX_COMPOSITE,
1626 			.vmux     = SAA7115_COMPOSITE0,
1627 			.amux     = EM28XX_AMUX_LINE_IN,
1628 		}, {
1629 			.type     = EM28XX_VMUX_SVIDEO,
1630 			.vmux     = SAA7115_SVIDEO3,
1631 			.amux     = EM28XX_AMUX_LINE_IN,
1632 		} },
1633 	},
1634 	[EM2800_BOARD_KWORLD_USB2800] = {
1635 		.name         = "Kworld USB2800",
1636 		.is_em2800    = 1,
1637 		.tuner_type   = TUNER_PHILIPS_FCV1236D,
1638 		.tda9887_conf = TDA9887_PRESENT,
1639 		.decoder      = EM28XX_SAA711X,
1640 		.input        = { {
1641 			.type     = EM28XX_VMUX_TELEVISION,
1642 			.vmux     = SAA7115_COMPOSITE2,
1643 			.amux     = EM28XX_AMUX_VIDEO,
1644 		}, {
1645 			.type     = EM28XX_VMUX_COMPOSITE,
1646 			.vmux     = SAA7115_COMPOSITE0,
1647 			.amux     = EM28XX_AMUX_LINE_IN,
1648 		}, {
1649 			.type     = EM28XX_VMUX_SVIDEO,
1650 			.vmux     = SAA7115_SVIDEO3,
1651 			.amux     = EM28XX_AMUX_LINE_IN,
1652 		} },
1653 	},
1654 	[EM2820_BOARD_PINNACLE_DVC_90] = {
1655 		.name	      = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
1656 		.tuner_type   = TUNER_ABSENT, /* capture only board */
1657 		.decoder      = EM28XX_SAA711X,
1658 		.input        = { {
1659 			.type     = EM28XX_VMUX_COMPOSITE,
1660 			.vmux     = SAA7115_COMPOSITE0,
1661 			.amux     = EM28XX_AMUX_LINE_IN,
1662 		}, {
1663 			.type     = EM28XX_VMUX_SVIDEO,
1664 			.vmux     = SAA7115_SVIDEO3,
1665 			.amux     = EM28XX_AMUX_LINE_IN,
1666 		} },
1667 	},
1668 	[EM2800_BOARD_VGEAR_POCKETTV] = {
1669 		.name         = "V-Gear PocketTV",
1670 		.is_em2800    = 1,
1671 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1672 		.tda9887_conf = TDA9887_PRESENT,
1673 		.decoder      = EM28XX_SAA711X,
1674 		.input        = { {
1675 			.type     = EM28XX_VMUX_TELEVISION,
1676 			.vmux     = SAA7115_COMPOSITE2,
1677 			.amux     = EM28XX_AMUX_VIDEO,
1678 		}, {
1679 			.type     = EM28XX_VMUX_COMPOSITE,
1680 			.vmux     = SAA7115_COMPOSITE0,
1681 			.amux     = EM28XX_AMUX_LINE_IN,
1682 		}, {
1683 			.type     = EM28XX_VMUX_SVIDEO,
1684 			.vmux     = SAA7115_SVIDEO3,
1685 			.amux     = EM28XX_AMUX_LINE_IN,
1686 		} },
1687 	},
1688 	[EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
1689 		.name         = "Pixelview PlayTV Box 4 USB 2.0",
1690 		.tda9887_conf = TDA9887_PRESENT,
1691 		.tuner_type   = TUNER_YMEC_TVF_5533MF,
1692 		.decoder      = EM28XX_SAA711X,
1693 		.input        = { {
1694 			.type     = EM28XX_VMUX_TELEVISION,
1695 			.vmux     = SAA7115_COMPOSITE2,
1696 			.amux     = EM28XX_AMUX_VIDEO,
1697 			.aout     = EM28XX_AOUT_MONO |	/* I2S */
1698 				    EM28XX_AOUT_MASTER,	/* Line out pin */
1699 		}, {
1700 			.type     = EM28XX_VMUX_COMPOSITE,
1701 			.vmux     = SAA7115_COMPOSITE0,
1702 			.amux     = EM28XX_AMUX_LINE_IN,
1703 		}, {
1704 			.type     = EM28XX_VMUX_SVIDEO,
1705 			.vmux     = SAA7115_SVIDEO3,
1706 			.amux     = EM28XX_AMUX_LINE_IN,
1707 		} },
1708 	},
1709 	[EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
1710 		.name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
1711 		.buttons = std_snapshot_button,
1712 		.tda9887_conf = TDA9887_PRESENT,
1713 		.tuner_type   = TUNER_YMEC_TVF_5533MF,
1714 		.tuner_addr   = 0x60,
1715 		.decoder      = EM28XX_SAA711X,
1716 		.input        = { {
1717 			.type     = EM28XX_VMUX_TELEVISION,
1718 			.vmux     = SAA7115_COMPOSITE2,
1719 			.amux     = EM28XX_AMUX_VIDEO,
1720 			.aout     = EM28XX_AOUT_MONO |	/* I2S */
1721 				    EM28XX_AOUT_MASTER,	/* Line out pin */
1722 		}, {
1723 			.type     = EM28XX_VMUX_COMPOSITE,
1724 			.vmux     = SAA7115_COMPOSITE0,
1725 			.amux     = EM28XX_AMUX_LINE_IN,
1726 		}, {
1727 			.type     = EM28XX_VMUX_SVIDEO,
1728 			.vmux     = SAA7115_SVIDEO3,
1729 			.amux     = EM28XX_AMUX_LINE_IN,
1730 		} },
1731 	},
1732 	[EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
1733 		.name                = "EM2860/SAA711X Reference Design",
1734 		.buttons = std_snapshot_button,
1735 		.tuner_type          = TUNER_ABSENT,
1736 		.decoder             = EM28XX_SAA711X,
1737 		.input               = { {
1738 			.type     = EM28XX_VMUX_SVIDEO,
1739 			.vmux     = SAA7115_SVIDEO3,
1740 		}, {
1741 			.type     = EM28XX_VMUX_COMPOSITE,
1742 			.vmux     = SAA7115_COMPOSITE0,
1743 		} },
1744 	},
1745 
1746 	[EM2874_BOARD_LEADERSHIP_ISDBT] = {
1747 		.def_i2c_bus	= 1,
1748 		.i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
1749 				  EM28XX_I2C_FREQ_100_KHZ,
1750 		.xclk		= EM28XX_XCLK_FREQUENCY_10MHZ,
1751 		.name		= "EM2874 Leadership ISDBT",
1752 		.tuner_type	= TUNER_ABSENT,
1753 		.tuner_gpio     = leadership_reset,
1754 		.dvb_gpio       = leadership_digital,
1755 		.has_dvb	= 1,
1756 	},
1757 
1758 	[EM2880_BOARD_MSI_DIGIVOX_AD] = {
1759 		.name         = "MSI DigiVox A/D",
1760 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1761 		.tuner_type   = TUNER_XC2028,
1762 		.tuner_gpio   = default_tuner_gpio,
1763 		.decoder      = EM28XX_TVP5150,
1764 		.input        = { {
1765 			.type     = EM28XX_VMUX_TELEVISION,
1766 			.vmux     = TVP5150_COMPOSITE0,
1767 			.amux     = EM28XX_AMUX_VIDEO,
1768 			.gpio     = em2880_msi_digivox_ad_analog,
1769 		}, {
1770 			.type     = EM28XX_VMUX_COMPOSITE,
1771 			.vmux     = TVP5150_COMPOSITE1,
1772 			.amux     = EM28XX_AMUX_LINE_IN,
1773 			.gpio     = em2880_msi_digivox_ad_analog,
1774 		}, {
1775 			.type     = EM28XX_VMUX_SVIDEO,
1776 			.vmux     = TVP5150_SVIDEO,
1777 			.amux     = EM28XX_AMUX_LINE_IN,
1778 			.gpio     = em2880_msi_digivox_ad_analog,
1779 		} },
1780 	},
1781 	[EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1782 		.name         = "MSI DigiVox A/D II",
1783 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1784 		.tuner_type   = TUNER_XC2028,
1785 		.tuner_gpio   = default_tuner_gpio,
1786 		.decoder      = EM28XX_TVP5150,
1787 		.input        = { {
1788 			.type     = EM28XX_VMUX_TELEVISION,
1789 			.vmux     = TVP5150_COMPOSITE0,
1790 			.amux     = EM28XX_AMUX_VIDEO,
1791 			.gpio     = em2880_msi_digivox_ad_analog,
1792 		}, {
1793 			.type     = EM28XX_VMUX_COMPOSITE,
1794 			.vmux     = TVP5150_COMPOSITE1,
1795 			.amux     = EM28XX_AMUX_LINE_IN,
1796 			.gpio     = em2880_msi_digivox_ad_analog,
1797 		}, {
1798 			.type     = EM28XX_VMUX_SVIDEO,
1799 			.vmux     = TVP5150_SVIDEO,
1800 			.amux     = EM28XX_AMUX_LINE_IN,
1801 			.gpio     = em2880_msi_digivox_ad_analog,
1802 		} },
1803 	},
1804 	[EM2880_BOARD_KWORLD_DVB_305U] = {
1805 		.name	      = "KWorld DVB-T 305U",
1806 		.tuner_type   = TUNER_XC2028,
1807 		.tuner_gpio   = default_tuner_gpio,
1808 		.decoder      = EM28XX_TVP5150,
1809 		.input        = { {
1810 			.type     = EM28XX_VMUX_TELEVISION,
1811 			.vmux     = TVP5150_COMPOSITE0,
1812 			.amux     = EM28XX_AMUX_VIDEO,
1813 		}, {
1814 			.type     = EM28XX_VMUX_COMPOSITE,
1815 			.vmux     = TVP5150_COMPOSITE1,
1816 			.amux     = EM28XX_AMUX_LINE_IN,
1817 		}, {
1818 			.type     = EM28XX_VMUX_SVIDEO,
1819 			.vmux     = TVP5150_SVIDEO,
1820 			.amux     = EM28XX_AMUX_LINE_IN,
1821 		} },
1822 	},
1823 	[EM2880_BOARD_KWORLD_DVB_310U] = {
1824 		.name	      = "KWorld DVB-T 310U",
1825 		.tuner_type   = TUNER_XC2028,
1826 		.tuner_gpio   = default_tuner_gpio,
1827 		.has_dvb      = 1,
1828 		.dvb_gpio     = default_digital,
1829 		.mts_firmware = 1,
1830 		.decoder      = EM28XX_TVP5150,
1831 		.input        = { {
1832 			.type     = EM28XX_VMUX_TELEVISION,
1833 			.vmux     = TVP5150_COMPOSITE0,
1834 			.amux     = EM28XX_AMUX_VIDEO,
1835 			.gpio     = default_analog,
1836 		}, {
1837 			.type     = EM28XX_VMUX_COMPOSITE,
1838 			.vmux     = TVP5150_COMPOSITE1,
1839 			.amux     = EM28XX_AMUX_LINE_IN,
1840 			.gpio     = default_analog,
1841 		}, {	/* S-video has not been tested yet */
1842 			.type     = EM28XX_VMUX_SVIDEO,
1843 			.vmux     = TVP5150_SVIDEO,
1844 			.amux     = EM28XX_AMUX_LINE_IN,
1845 			.gpio     = default_analog,
1846 		} },
1847 	},
1848 	[EM2882_BOARD_KWORLD_ATSC_315U] = {
1849 		.name		= "KWorld ATSC 315U HDTV TV Box",
1850 		.valid		= EM28XX_BOARD_NOT_VALIDATED,
1851 		.tuner_type	= TUNER_THOMSON_DTT761X,
1852 		.tuner_gpio	= em2882_kworld_315u_tuner_gpio,
1853 		.tda9887_conf	= TDA9887_PRESENT,
1854 		.decoder	= EM28XX_SAA711X,
1855 		.has_dvb	= 1,
1856 		.dvb_gpio	= em2882_kworld_315u_digital,
1857 		.ir_codes	= RC_MAP_KWORLD_315U,
1858 		.xclk		= EM28XX_XCLK_FREQUENCY_12MHZ,
1859 		.i2c_speed	= EM28XX_I2C_CLK_WAIT_ENABLE,
1860 #if 0
1861 		/* FIXME: Analog mode - still not ready */
1862 		.input        = { {
1863 			.type = EM28XX_VMUX_TELEVISION,
1864 			.vmux = SAA7115_COMPOSITE2,
1865 			.amux = EM28XX_AMUX_VIDEO,
1866 			.gpio = em2882_kworld_315u_analog,
1867 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1868 		}, {
1869 			.type = EM28XX_VMUX_COMPOSITE,
1870 			.vmux = SAA7115_COMPOSITE0,
1871 			.amux = EM28XX_AMUX_LINE_IN,
1872 			.gpio = em2882_kworld_315u_analog1,
1873 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1874 		}, {
1875 			.type = EM28XX_VMUX_SVIDEO,
1876 			.vmux = SAA7115_SVIDEO3,
1877 			.amux = EM28XX_AMUX_LINE_IN,
1878 			.gpio = em2882_kworld_315u_analog1,
1879 			.aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1880 		} },
1881 #endif
1882 	},
1883 	[EM2880_BOARD_EMPIRE_DUAL_TV] = {
1884 		.name = "Empire dual TV",
1885 		.tuner_type = TUNER_XC2028,
1886 		.tuner_gpio = default_tuner_gpio,
1887 		.has_dvb = 1,
1888 		.dvb_gpio = default_digital,
1889 		.mts_firmware = 1,
1890 		.decoder = EM28XX_TVP5150,
1891 		.input = { {
1892 			.type = EM28XX_VMUX_TELEVISION,
1893 			.vmux = TVP5150_COMPOSITE0,
1894 			.amux = EM28XX_AMUX_VIDEO,
1895 			.gpio = default_analog,
1896 		}, {
1897 			.type = EM28XX_VMUX_COMPOSITE,
1898 			.vmux = TVP5150_COMPOSITE1,
1899 			.amux = EM28XX_AMUX_LINE_IN,
1900 			.gpio = default_analog,
1901 		}, {
1902 			.type = EM28XX_VMUX_SVIDEO,
1903 			.vmux = TVP5150_SVIDEO,
1904 			.amux = EM28XX_AMUX_LINE_IN,
1905 			.gpio = default_analog,
1906 		} },
1907 	},
1908 	[EM2881_BOARD_DNT_DA2_HYBRID] = {
1909 		.name         = "DNT DA2 Hybrid",
1910 		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1911 		.tuner_type   = TUNER_XC2028,
1912 		.tuner_gpio   = default_tuner_gpio,
1913 		.decoder      = EM28XX_TVP5150,
1914 		.input        = { {
1915 			.type     = EM28XX_VMUX_TELEVISION,
1916 			.vmux     = TVP5150_COMPOSITE0,
1917 			.amux     = EM28XX_AMUX_VIDEO,
1918 			.gpio     = default_analog,
1919 		}, {
1920 			.type     = EM28XX_VMUX_COMPOSITE,
1921 			.vmux     = TVP5150_COMPOSITE1,
1922 			.amux     = EM28XX_AMUX_LINE_IN,
1923 			.gpio     = default_analog,
1924 		}, {
1925 			.type     = EM28XX_VMUX_SVIDEO,
1926 			.vmux     = TVP5150_SVIDEO,
1927 			.amux     = EM28XX_AMUX_LINE_IN,
1928 			.gpio     = default_analog,
1929 		} },
1930 	},
1931 	[EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1932 		.name         = "Pinnacle Hybrid Pro",
1933 		.tuner_type   = TUNER_XC2028,
1934 		.tuner_gpio   = default_tuner_gpio,
1935 		.decoder      = EM28XX_TVP5150,
1936 		.has_dvb      = 1,
1937 		.dvb_gpio     = pinnacle_hybrid_pro_digital,
1938 		.input        = { {
1939 			.type     = EM28XX_VMUX_TELEVISION,
1940 			.vmux     = TVP5150_COMPOSITE0,
1941 			.amux     = EM28XX_AMUX_VIDEO,
1942 			.gpio     = pinnacle_hybrid_pro_analog,
1943 		}, {
1944 			.type     = EM28XX_VMUX_COMPOSITE,
1945 			.vmux     = TVP5150_COMPOSITE1,
1946 			.amux     = EM28XX_AMUX_LINE_IN,
1947 			.gpio     = pinnacle_hybrid_pro_analog,
1948 		}, {
1949 			.type     = EM28XX_VMUX_SVIDEO,
1950 			.vmux     = TVP5150_SVIDEO,
1951 			.amux     = EM28XX_AMUX_LINE_IN,
1952 			.gpio     = pinnacle_hybrid_pro_analog,
1953 		} },
1954 	},
1955 	[EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
1956 		.name         = "Pinnacle Hybrid Pro (330e)",
1957 		.tuner_type   = TUNER_XC2028,
1958 		.tuner_gpio   = default_tuner_gpio,
1959 		.mts_firmware = 1,
1960 		.has_dvb      = 1,
1961 		.dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1962 		.ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
1963 		.decoder      = EM28XX_TVP5150,
1964 		.input        = { {
1965 			.type     = EM28XX_VMUX_TELEVISION,
1966 			.vmux     = TVP5150_COMPOSITE0,
1967 			.amux     = EM28XX_AMUX_VIDEO,
1968 			.gpio     = hauppauge_wintv_hvr_900_analog,
1969 		}, {
1970 			.type     = EM28XX_VMUX_COMPOSITE,
1971 			.vmux     = TVP5150_COMPOSITE1,
1972 			.amux     = EM28XX_AMUX_LINE_IN,
1973 			.gpio     = hauppauge_wintv_hvr_900_analog,
1974 		}, {
1975 			.type     = EM28XX_VMUX_SVIDEO,
1976 			.vmux     = TVP5150_SVIDEO,
1977 			.amux     = EM28XX_AMUX_LINE_IN,
1978 			.gpio     = hauppauge_wintv_hvr_900_analog,
1979 		} },
1980 	},
1981 	[EM2882_BOARD_KWORLD_VS_DVBT] = {
1982 		.name         = "Kworld VS-DVB-T 323UR",
1983 		.tuner_type   = TUNER_XC2028,
1984 		.tuner_gpio   = default_tuner_gpio,
1985 		.decoder      = EM28XX_TVP5150,
1986 		.mts_firmware = 1,
1987 		.has_dvb      = 1,
1988 		.dvb_gpio     = kworld_330u_digital,
1989 		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1990 		.ir_codes     = RC_MAP_KWORLD_315U,
1991 		.input        = { {
1992 			.type     = EM28XX_VMUX_TELEVISION,
1993 			.vmux     = TVP5150_COMPOSITE0,
1994 			.amux     = EM28XX_AMUX_VIDEO,
1995 		}, {
1996 			.type     = EM28XX_VMUX_COMPOSITE,
1997 			.vmux     = TVP5150_COMPOSITE1,
1998 			.amux     = EM28XX_AMUX_LINE_IN,
1999 		}, {
2000 			.type     = EM28XX_VMUX_SVIDEO,
2001 			.vmux     = TVP5150_SVIDEO,
2002 			.amux     = EM28XX_AMUX_LINE_IN,
2003 		} },
2004 	},
2005 	[EM2882_BOARD_TERRATEC_HYBRID_XS] = {
2006 		.name         = "Terratec Cinergy Hybrid T USB XS (em2882)",
2007 		.tuner_type   = TUNER_XC2028,
2008 		.tuner_gpio   = default_tuner_gpio,
2009 		.mts_firmware = 1,
2010 		.decoder      = EM28XX_TVP5150,
2011 		.has_dvb      = 1,
2012 		.dvb_gpio     = hauppauge_wintv_hvr_900_digital,
2013 		.ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,
2014 		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
2015 		.input        = { {
2016 			.type     = EM28XX_VMUX_TELEVISION,
2017 			.vmux     = TVP5150_COMPOSITE0,
2018 			.amux     = EM28XX_AMUX_VIDEO,
2019 			.gpio     = hauppauge_wintv_hvr_900_analog,
2020 		}, {
2021 			.type     = EM28XX_VMUX_COMPOSITE,
2022 			.vmux     = TVP5150_COMPOSITE1,
2023 			.amux     = EM28XX_AMUX_LINE_IN,
2024 			.gpio     = hauppauge_wintv_hvr_900_analog,
2025 		}, {
2026 			.type     = EM28XX_VMUX_SVIDEO,
2027 			.vmux     = TVP5150_SVIDEO,
2028 			.amux     = EM28XX_AMUX_LINE_IN,
2029 			.gpio     = hauppauge_wintv_hvr_900_analog,
2030 		} },
2031 	},
2032 	[EM2882_BOARD_DIKOM_DK300] = {
2033 		.name         = "Dikom DK300",
2034 		.tuner_type   = TUNER_XC2028,
2035 		.tuner_gpio   = default_tuner_gpio,
2036 		.decoder      = EM28XX_TVP5150,
2037 		.mts_firmware = 1,
2038 		.has_dvb      = 1,
2039 		.dvb_gpio     = dikom_dk300_digital,
2040 		.input        = { {
2041 			.type     = EM28XX_VMUX_TELEVISION,
2042 			.vmux     = TVP5150_COMPOSITE0,
2043 			.amux     = EM28XX_AMUX_VIDEO,
2044 			.gpio     = default_analog,
2045 		} },
2046 	},
2047 	[EM2883_BOARD_KWORLD_HYBRID_330U] = {
2048 		.name         = "Kworld PlusTV HD Hybrid 330",
2049 		.tuner_type   = TUNER_XC2028,
2050 		.tuner_gpio   = default_tuner_gpio,
2051 		.decoder      = EM28XX_TVP5150,
2052 		.mts_firmware = 1,
2053 		.has_dvb      = 1,
2054 		.dvb_gpio     = kworld_330u_digital,
2055 		.xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
2056 		.i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
2057 				    EM28XX_I2C_EEPROM_ON_BOARD |
2058 				    EM28XX_I2C_EEPROM_KEY_VALID,
2059 		.input        = { {
2060 			.type     = EM28XX_VMUX_TELEVISION,
2061 			.vmux     = TVP5150_COMPOSITE0,
2062 			.amux     = EM28XX_AMUX_VIDEO,
2063 			.gpio     = kworld_330u_analog,
2064 			.aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
2065 		}, {
2066 			.type     = EM28XX_VMUX_COMPOSITE,
2067 			.vmux     = TVP5150_COMPOSITE1,
2068 			.amux     = EM28XX_AMUX_LINE_IN,
2069 			.gpio     = kworld_330u_analog,
2070 			.aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
2071 		}, {
2072 			.type     = EM28XX_VMUX_SVIDEO,
2073 			.vmux     = TVP5150_SVIDEO,
2074 			.amux     = EM28XX_AMUX_LINE_IN,
2075 			.gpio     = kworld_330u_analog,
2076 		} },
2077 	},
2078 	[EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
2079 		.name         = "Compro VideoMate ForYou/Stereo",
2080 		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
2081 		.tvaudio_addr = 0xb0,
2082 		.tda9887_conf = TDA9887_PRESENT,
2083 		.decoder      = EM28XX_TVP5150,
2084 		.adecoder     = EM28XX_TVAUDIO,
2085 		.mute_gpio    = compro_mute_gpio,
2086 		.input        = { {
2087 			.type     = EM28XX_VMUX_TELEVISION,
2088 			.vmux     = TVP5150_COMPOSITE0,
2089 			.amux     = EM28XX_AMUX_VIDEO,
2090 			.gpio     = compro_unmute_tv_gpio,
2091 		}, {
2092 			.type     = EM28XX_VMUX_SVIDEO,
2093 			.vmux     = TVP5150_SVIDEO,
2094 			.amux     = EM28XX_AMUX_LINE_IN,
2095 			.gpio     = compro_unmute_svid_gpio,
2096 		} },
2097 	},
2098 	[EM2860_BOARD_KAIOMY_TVNPC_U2] = {
2099 		.name	      = "Kaiomy TVnPC U2",
2100 		.vchannels    = 3,
2101 		.tuner_type   = TUNER_XC2028,
2102 		.tuner_addr   = 0x61,
2103 		.mts_firmware = 1,
2104 		.decoder      = EM28XX_TVP5150,
2105 		.tuner_gpio   = default_tuner_gpio,
2106 		.ir_codes     = RC_MAP_KAIOMY,
2107 		.input          = { {
2108 			.type     = EM28XX_VMUX_TELEVISION,
2109 			.vmux     = TVP5150_COMPOSITE0,
2110 			.amux     = EM28XX_AMUX_VIDEO,
2111 
2112 		}, {
2113 			.type     = EM28XX_VMUX_COMPOSITE,
2114 			.vmux     = TVP5150_COMPOSITE1,
2115 			.amux     = EM28XX_AMUX_LINE_IN,
2116 		}, {
2117 			.type     = EM28XX_VMUX_SVIDEO,
2118 			.vmux     = TVP5150_SVIDEO,
2119 			.amux     = EM28XX_AMUX_LINE_IN,
2120 		} },
2121 		.radio		= {
2122 			.type     = EM28XX_RADIO,
2123 			.amux     = EM28XX_AMUX_LINE_IN,
2124 		}
2125 	},
2126 	[EM2860_BOARD_EASYCAP] = {
2127 		.name         = "Easy Cap Capture DC-60",
2128 		.vchannels    = 2,
2129 		.tuner_type   = TUNER_ABSENT,
2130 		.decoder      = EM28XX_SAA711X,
2131 		.input           = { {
2132 			.type     = EM28XX_VMUX_COMPOSITE,
2133 			.vmux     = SAA7115_COMPOSITE0,
2134 			.amux     = EM28XX_AMUX_LINE_IN,
2135 		}, {
2136 			.type     = EM28XX_VMUX_SVIDEO,
2137 			.vmux     = SAA7115_SVIDEO3,
2138 			.amux     = EM28XX_AMUX_LINE_IN,
2139 		} },
2140 	},
2141 	[EM2820_BOARD_IODATA_GVMVP_SZ] = {
2142 		.name       = "IO-DATA GV-MVP/SZ",
2143 		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
2144 		.tuner_gpio   = default_tuner_gpio,
2145 		.tda9887_conf = TDA9887_PRESENT,
2146 		.decoder      = EM28XX_TVP5150,
2147 		.input        = { {
2148 			.type     = EM28XX_VMUX_TELEVISION,
2149 			.vmux     = TVP5150_COMPOSITE0,
2150 			.amux     = EM28XX_AMUX_VIDEO,
2151 		}, { /* Composite has not been tested yet */
2152 			.type     = EM28XX_VMUX_COMPOSITE,
2153 			.vmux     = TVP5150_COMPOSITE1,
2154 			.amux     = EM28XX_AMUX_VIDEO,
2155 		}, { /* S-video has not been tested yet */
2156 			.type     = EM28XX_VMUX_SVIDEO,
2157 			.vmux     = TVP5150_SVIDEO,
2158 			.amux     = EM28XX_AMUX_VIDEO,
2159 		} },
2160 	},
2161 	[EM2860_BOARD_TERRATEC_GRABBY] = {
2162 		.name            = "Terratec Grabby",
2163 		.vchannels       = 2,
2164 		.tuner_type      = TUNER_ABSENT,
2165 		.decoder         = EM28XX_SAA711X,
2166 		.xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
2167 		.input           = { {
2168 			.type     = EM28XX_VMUX_COMPOSITE,
2169 			.vmux     = SAA7115_COMPOSITE0,
2170 			.amux     = EM28XX_AMUX_LINE_IN,
2171 		}, {
2172 			.type     = EM28XX_VMUX_SVIDEO,
2173 			.vmux     = SAA7115_SVIDEO3,
2174 			.amux     = EM28XX_AMUX_LINE_IN,
2175 		} },
2176 		.buttons         = std_snapshot_button,
2177 		.leds            = terratec_grabby_leds,
2178 	},
2179 	[EM2860_BOARD_TERRATEC_AV350] = {
2180 		.name            = "Terratec AV350",
2181 		.vchannels       = 2,
2182 		.tuner_type      = TUNER_ABSENT,
2183 		.decoder         = EM28XX_TVP5150,
2184 		.xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
2185 		.mute_gpio       = terratec_av350_mute_gpio,
2186 		.input           = { {
2187 			.type     = EM28XX_VMUX_COMPOSITE,
2188 			.vmux     = TVP5150_COMPOSITE1,
2189 			.amux     = EM28XX_AMUX_LINE_IN,
2190 			.gpio     = terratec_av350_unmute_gpio,
2191 
2192 		}, {
2193 			.type     = EM28XX_VMUX_SVIDEO,
2194 			.vmux     = TVP5150_SVIDEO,
2195 			.amux     = EM28XX_AMUX_LINE_IN,
2196 			.gpio     = terratec_av350_unmute_gpio,
2197 		} },
2198 	},
2199 
2200 	[EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
2201 		.name         = "Elgato Video Capture",
2202 		.decoder      = EM28XX_SAA711X,
2203 		.tuner_type   = TUNER_ABSENT,   /* Capture only device */
2204 		.input        = { {
2205 			.type  = EM28XX_VMUX_COMPOSITE,
2206 			.vmux  = SAA7115_COMPOSITE0,
2207 			.amux  = EM28XX_AMUX_LINE_IN,
2208 		}, {
2209 			.type  = EM28XX_VMUX_SVIDEO,
2210 			.vmux  = SAA7115_SVIDEO3,
2211 			.amux  = EM28XX_AMUX_LINE_IN,
2212 		} },
2213 	},
2214 
2215 	[EM2882_BOARD_EVGA_INDTUBE] = {
2216 		.name         = "Evga inDtube",
2217 		.tuner_type   = TUNER_XC2028,
2218 		.tuner_gpio   = default_tuner_gpio,
2219 		.decoder      = EM28XX_TVP5150,
2220 		.xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
2221 		.mts_firmware = 1,
2222 		.has_dvb      = 1,
2223 		.dvb_gpio     = evga_indtube_digital,
2224 		.ir_codes     = RC_MAP_EVGA_INDTUBE,
2225 		.input        = { {
2226 			.type     = EM28XX_VMUX_TELEVISION,
2227 			.vmux     = TVP5150_COMPOSITE0,
2228 			.amux     = EM28XX_AMUX_VIDEO,
2229 			.gpio     = evga_indtube_analog,
2230 		}, {
2231 			.type     = EM28XX_VMUX_COMPOSITE,
2232 			.vmux     = TVP5150_COMPOSITE1,
2233 			.amux     = EM28XX_AMUX_LINE_IN,
2234 			.gpio     = evga_indtube_analog,
2235 		}, {
2236 			.type     = EM28XX_VMUX_SVIDEO,
2237 			.vmux     = TVP5150_SVIDEO,
2238 			.amux     = EM28XX_AMUX_LINE_IN,
2239 			.gpio     = evga_indtube_analog,
2240 		} },
2241 	},
2242 	/*
2243 	 * eb1a:2868 Empia EM2870 + Philips CU1216L NIM
2244 	 * (Philips TDA10023 + Infineon TUA6034)
2245 	 */
2246 	[EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
2247 		.name          = "Reddo DVB-C USB TV Box",
2248 		.tuner_type    = TUNER_ABSENT,
2249 		.tuner_gpio    = reddo_dvb_c_usb_box,
2250 		.has_dvb       = 1,
2251 	},
2252 	/*
2253 	 * 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
2254 	 * initially as the KWorld PlusTV 340U, then as the UB435-Q.
2255 	 * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2
2256 	 */
2257 	[EM2870_BOARD_KWORLD_A340] = {
2258 		.name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",
2259 		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */
2260 		.has_dvb    = 1,
2261 		.dvb_gpio   = kworld_a340_digital,
2262 		.tuner_gpio = default_tuner_gpio,
2263 	},
2264 	/*
2265 	 * 2013:024f PCTV nanoStick T2 290e.
2266 	 * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2
2267 	 */
2268 	[EM28174_BOARD_PCTV_290E] = {
2269 		.name          = "PCTV nanoStick T2 290e",
2270 		.def_i2c_bus   = 1,
2271 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2272 				 EM28XX_I2C_FREQ_100_KHZ,
2273 		.tuner_type    = TUNER_ABSENT,
2274 		.tuner_gpio    = pctv_290e,
2275 		.has_dvb       = 1,
2276 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2277 	},
2278 	/*
2279 	 * 2013:024f PCTV DVB-S2 Stick 460e
2280 	 * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293
2281 	 */
2282 	[EM28174_BOARD_PCTV_460E] = {
2283 		.def_i2c_bus   = 1,
2284 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2285 				 EM28XX_I2C_FREQ_400_KHZ,
2286 		.name          = "PCTV DVB-S2 Stick (460e)",
2287 		.tuner_type    = TUNER_ABSENT,
2288 		.tuner_gpio    = pctv_460e,
2289 		.has_dvb       = 1,
2290 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2291 	},
2292 	/*
2293 	 * eb1a:5006 Honestech VIDBOX NW03
2294 	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
2295 	 */
2296 	[EM2860_BOARD_HT_VIDBOX_NW03] = {
2297 		.name                = "Honestech Vidbox NW03",
2298 		.tuner_type          = TUNER_ABSENT,
2299 		.decoder             = EM28XX_SAA711X,
2300 		.input               = { {
2301 			.type     = EM28XX_VMUX_COMPOSITE,
2302 			.vmux     = SAA7115_COMPOSITE0,
2303 			.amux     = EM28XX_AMUX_LINE_IN,
2304 		}, {
2305 			.type     = EM28XX_VMUX_SVIDEO,
2306 			.vmux     = SAA7115_SVIDEO3,  /* S-VIDEO needs check */
2307 			.amux     = EM28XX_AMUX_LINE_IN,
2308 		} },
2309 	},
2310 	/*
2311 	 * 1b80:e425 MaxMedia UB425-TC
2312 	 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
2313 	 */
2314 	[EM2874_BOARD_MAXMEDIA_UB425_TC] = {
2315 		.name          = "MaxMedia UB425-TC",
2316 		.tuner_type    = TUNER_ABSENT,
2317 		.tuner_gpio    = maxmedia_ub425_tc,
2318 		.has_dvb       = 1,
2319 		.ir_codes      = RC_MAP_REDDO,
2320 		.def_i2c_bus   = 1,
2321 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2322 				EM28XX_I2C_FREQ_400_KHZ,
2323 	},
2324 	/*
2325 	 * 2304:0242 PCTV QuatroStick (510e)
2326 	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2
2327 	 */
2328 	[EM2884_BOARD_PCTV_510E] = {
2329 		.name          = "PCTV QuatroStick (510e)",
2330 		.tuner_type    = TUNER_ABSENT,
2331 		.tuner_gpio    = pctv_510e,
2332 		.has_dvb       = 1,
2333 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2334 		.def_i2c_bus   = 1,
2335 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2336 				EM28XX_I2C_FREQ_400_KHZ,
2337 	},
2338 	/*
2339 	 * 2013:0251 PCTV QuatroStick nano (520e)
2340 	 * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2
2341 	 */
2342 	[EM2884_BOARD_PCTV_520E] = {
2343 		.name          = "PCTV QuatroStick nano (520e)",
2344 		.tuner_type    = TUNER_ABSENT,
2345 		.tuner_gpio    = pctv_520e,
2346 		.has_dvb       = 1,
2347 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2348 		.def_i2c_bus   = 1,
2349 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2350 				EM28XX_I2C_FREQ_400_KHZ,
2351 	},
2352 	[EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
2353 		.name         = "Terratec Cinergy HTC USB XS",
2354 		.has_dvb      = 1,
2355 		.ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
2356 		.tuner_type   = TUNER_ABSENT,
2357 		.def_i2c_bus  = 1,
2358 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2359 				EM28XX_I2C_FREQ_400_KHZ,
2360 	},
2361 	/*
2362 	 * 1b80:e1cc Delock 61959
2363 	 * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
2364 	 * mostly the same as MaxMedia UB-425-TC but different remote
2365 	 */
2366 	[EM2874_BOARD_DELOCK_61959] = {
2367 		.name          = "Delock 61959",
2368 		.tuner_type    = TUNER_ABSENT,
2369 		.tuner_gpio    = maxmedia_ub425_tc,
2370 		.has_dvb       = 1,
2371 		.ir_codes      = RC_MAP_DELOCK_61959,
2372 		.def_i2c_bus   = 1,
2373 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2374 				EM28XX_I2C_FREQ_400_KHZ,
2375 	},
2376 	/*
2377 	 * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
2378 	 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2379 	 */
2380 	[EM2874_BOARD_KWORLD_UB435Q_V2] = {
2381 		.name		= "KWorld USB ATSC TV Stick UB435-Q V2",
2382 		.tuner_type	= TUNER_ABSENT,
2383 		.has_dvb	= 1,
2384 		.dvb_gpio	= kworld_a340_digital,
2385 		.tuner_gpio	= default_tuner_gpio,
2386 		.def_i2c_bus	= 1,
2387 	},
2388 	/*
2389 	 * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
2390 	 * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2391 	 */
2392 	[EM2874_BOARD_KWORLD_UB435Q_V3] = {
2393 		.name		= "KWorld USB ATSC TV Stick UB435-Q V3",
2394 		.tuner_type	= TUNER_ABSENT,
2395 		.has_dvb	= 1,
2396 		.tuner_gpio	= kworld_ub435q_v3_digital,
2397 		.def_i2c_bus	= 1,
2398 		.i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
2399 				  EM28XX_I2C_FREQ_100_KHZ,
2400 		.leds = kworld_ub435q_v3_leds,
2401 	},
2402 	[EM2874_BOARD_PCTV_HD_MINI_80E] = {
2403 		.name         = "Pinnacle PCTV HD Mini",
2404 		.tuner_type   = TUNER_ABSENT,
2405 		.has_dvb      = 1,
2406 		.dvb_gpio     = em2874_pctv_80e_digital,
2407 		.decoder      = EM28XX_NODECODER,
2408 		.ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
2409 		.leds         = pctv_80e_leds,
2410 	},
2411 	/*
2412 	 * 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
2413 	 * Empia EM2765 + OmniVision OV2640
2414 	 */
2415 	[EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
2416 		.name         = "SpeedLink Vicious And Devine Laplace webcam",
2417 		.xclk         = EM28XX_XCLK_FREQUENCY_24MHZ,
2418 		.i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2419 				EM28XX_I2C_FREQ_100_KHZ,
2420 		.def_i2c_bus  = 1,
2421 		.tuner_type   = TUNER_ABSENT,
2422 		.is_webcam    = 1,
2423 		.input        = { {
2424 			.type     = EM28XX_VMUX_COMPOSITE,
2425 			.amux     = EM28XX_AMUX_VIDEO,
2426 			.gpio     = speedlink_vad_laplace_reg_seq,
2427 		} },
2428 		.buttons = speedlink_vad_laplace_buttons,
2429 		.leds = speedlink_vad_laplace_leds,
2430 	},
2431 	/*
2432 	 * 2013:0258 PCTV DVB-S2 Stick (461e)
2433 	 * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293
2434 	 */
2435 	[EM28178_BOARD_PCTV_461E] = {
2436 		.def_i2c_bus   = 1,
2437 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2438 				 EM28XX_I2C_FREQ_400_KHZ,
2439 		.name          = "PCTV DVB-S2 Stick (461e)",
2440 		.tuner_type    = TUNER_ABSENT,
2441 		.tuner_gpio    = pctv_461e,
2442 		.has_dvb       = 1,
2443 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2444 	},
2445 	/*
2446 	 * 2013:0259 PCTV DVB-S2 Stick (461e_v2)
2447 	 * Empia EM28178, Montage M88DS3103b, Montage M88TS2022, Allegro A8293
2448 	 */
2449 	[EM28178_BOARD_PCTV_461E_V2] = {
2450 		.def_i2c_bus   = 1,
2451 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2452 				 EM28XX_I2C_FREQ_400_KHZ,
2453 		.name          = "PCTV DVB-S2 Stick (461e v2)",
2454 		.tuner_type    = TUNER_ABSENT,
2455 		.tuner_gpio    = pctv_461e,
2456 		.has_dvb       = 1,
2457 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2458 	},
2459 	/*
2460 	 * 2013:025f PCTV tripleStick (292e).
2461 	 * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157
2462 	 */
2463 	[EM28178_BOARD_PCTV_292E] = {
2464 		.name          = "PCTV tripleStick (292e)",
2465 		.def_i2c_bus   = 1,
2466 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2467 				 EM28XX_I2C_FREQ_400_KHZ,
2468 		.tuner_type    = TUNER_ABSENT,
2469 		.tuner_gpio    = pctv_292e,
2470 		.has_dvb       = 1,
2471 		.ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2472 	},
2473 	[EM2861_BOARD_LEADTEK_VC100] = {
2474 		.name          = "Leadtek VC100",
2475 		.tuner_type    = TUNER_ABSENT,	/* Capture only device */
2476 		.decoder       = EM28XX_TVP5150,
2477 		.input         = { {
2478 			.type     = EM28XX_VMUX_COMPOSITE,
2479 			.vmux     = TVP5150_COMPOSITE1,
2480 			.amux     = EM28XX_AMUX_LINE_IN,
2481 		}, {
2482 			.type     = EM28XX_VMUX_SVIDEO,
2483 			.vmux     = TVP5150_SVIDEO,
2484 			.amux     = EM28XX_AMUX_LINE_IN,
2485 		} },
2486 	},
2487 	/*
2488 	 * eb1a:8179 Terratec Cinergy T2 Stick HD.
2489 	 * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146
2490 	 */
2491 	[EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
2492 		.name          = "Terratec Cinergy T2 Stick HD",
2493 		.def_i2c_bus   = 1,
2494 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2495 				 EM28XX_I2C_FREQ_400_KHZ,
2496 		.tuner_type    = TUNER_ABSENT,
2497 		.tuner_gpio    = terratec_t2_stick_hd,
2498 		.has_dvb       = 1,
2499 		.ir_codes      = RC_MAP_TERRATEC_SLIM_2,
2500 	},
2501 
2502 	/*
2503 	 * 3275:0085 PLEX PX-BCUD.
2504 	 * Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C0042
2505 	 */
2506 	[EM28178_BOARD_PLEX_PX_BCUD] = {
2507 		.name          = "PLEX PX-BCUD",
2508 		.xclk          = EM28XX_XCLK_FREQUENCY_4_3MHZ,
2509 		.def_i2c_bus   = 1,
2510 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE,
2511 		.tuner_type    = TUNER_ABSENT,
2512 		.tuner_gpio    = plex_px_bcud,
2513 		.has_dvb       = 1,
2514 	},
2515 	/*
2516 	 * 2040:0265 Hauppauge WinTV-dualHD (DVB version) Isoc.
2517 	 * 2040:8265 Hauppauge WinTV-dualHD (DVB version) Bulk.
2518 	 * Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si2157
2519 	 */
2520 	[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {
2521 		.name          = "Hauppauge WinTV-dualHD DVB",
2522 		.def_i2c_bus   = 1,
2523 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2524 				 EM28XX_I2C_FREQ_400_KHZ,
2525 		.tuner_type    = TUNER_SI2157,
2526 		.tuner_gpio    = hauppauge_dualhd_dvb,
2527 		.has_dvb       = 1,
2528 		.has_dual_ts   = 1,
2529 		.ir_codes      = RC_MAP_HAUPPAUGE,
2530 		.leds          = hauppauge_dualhd_leds,
2531 		.input         = { {
2532 			.type     = EM28XX_VMUX_COMPOSITE,
2533 			.vmux     = TVP5150_COMPOSITE1,
2534 			.amux     = EM28XX_AMUX_LINE_IN,
2535 		} },
2536 	},
2537 	/*
2538 	 * 2040:026d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Isoc.
2539 	 * 2040:826d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Bulk.
2540 	 * Empia EM28274, 2x LG LGDT3306A, 2x Silicon Labs Si2157
2541 	 */
2542 	[EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595] = {
2543 		.name          = "Hauppauge WinTV-dualHD 01595 ATSC/QAM",
2544 		.def_i2c_bus   = 1,
2545 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2546 				 EM28XX_I2C_FREQ_400_KHZ,
2547 		.tuner_type    = TUNER_ABSENT,
2548 		.tuner_gpio    = hauppauge_dualhd_dvb,
2549 		.has_dvb       = 1,
2550 		.has_dual_ts   = 1,
2551 		.ir_codes      = RC_MAP_HAUPPAUGE,
2552 		.leds          = hauppauge_dualhd_leds,
2553 	},
2554 	/*
2555 	 * 1b80:e349 Magix USB Videowandler-2
2556 	 * (same chips as Honestech VIDBOX NW03)
2557 	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
2558 	 */
2559 	[EM2861_BOARD_MAGIX_VIDEOWANDLER2] = {
2560 		.name                = "Magix USB Videowandler-2",
2561 		.tuner_type          = TUNER_ABSENT,
2562 		.decoder             = EM28XX_SAA711X,
2563 		.input               = { {
2564 			.type     = EM28XX_VMUX_COMPOSITE,
2565 			.vmux     = SAA7115_COMPOSITE0,
2566 			.amux     = EM28XX_AMUX_LINE_IN,
2567 		}, {
2568 			.type     = EM28XX_VMUX_SVIDEO,
2569 			.amux     = EM28XX_AMUX_LINE_IN,
2570 		} },
2571 	},
2572 	/*
2573 	 * 1f4d:1abe MyGica iGrabber
2574 	 * (same as several other EM2860 devices)
2575 	 * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner
2576 	 */
2577 	[EM2860_BOARD_MYGICA_IGRABBER] = {
2578 		.name         = "MyGica iGrabber",
2579 		.vchannels    = 2,
2580 		.tuner_type   = TUNER_ABSENT,
2581 		.decoder      = EM28XX_SAA711X,
2582 		.input           = { {
2583 			.type     = EM28XX_VMUX_COMPOSITE,
2584 			.vmux     = SAA7115_COMPOSITE0,
2585 			.amux     = EM28XX_AMUX_LINE_IN,
2586 		}, {
2587 			.type     = EM28XX_VMUX_SVIDEO,
2588 			.vmux     = SAA7115_SVIDEO3,
2589 			.amux     = EM28XX_AMUX_LINE_IN,
2590 		} },
2591 	},
2592 	/* 2040:826d Hauppauge USB QuadHD
2593 	 * Empia 28274, Max Linear 692 ATSC combo demod/tuner
2594 	 */
2595 	[EM2874_BOARD_HAUPPAUGE_USB_QUADHD] = {
2596 		.name          = "Hauppauge USB QuadHD ATSC",
2597 		.def_i2c_bus   = 1,
2598 		.has_dual_ts   = 1,
2599 		.has_dvb       = 1,
2600 		.i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
2601 		.tuner_type    = TUNER_ABSENT,
2602 		.tuner_gpio    = hauppauge_usb_quadhd_atsc_reg_seq,
2603 		.leds          = hauppauge_usb_quadhd_leds,
2604 	},
2605 	/*
2606 	 * eb1a:2860 MyGica UTV3 Analog USB2.0 TV Box
2607 	 * Empia EM2860, Philips SAA7113, NXP TDA9801T demod,
2608 	 * Tena TNF931D-DFDR1 tuner (contains NXP TDA6509A),
2609 	 * ST HCF4052 demux (switches audio to line out),
2610 	 * no audio over USB
2611 	 */
2612 	[EM2860_BOARD_MYGICA_UTV3] = {
2613 		.name         = "MyGica UTV3 Analog USB2.0 TV Box",
2614 		.xclk         = EM28XX_XCLK_IR_RC5_MODE | EM28XX_XCLK_FREQUENCY_12MHZ,
2615 		.tuner_type   = TUNER_TENA_TNF_931D_DFDR1,
2616 		.ir_codes     = RC_MAP_MYGICA_UTV3,
2617 		.decoder      = EM28XX_SAA711X,
2618 		.suspend_gpio = mygica_utv3_suspend_gpio,
2619 		.input        = { {
2620 			.type     = EM28XX_VMUX_COMPOSITE,
2621 			.vmux     = SAA7115_COMPOSITE0,
2622 			.amux     = EM28XX_AMUX_VIDEO,
2623 			.gpio     = mygica_utv3_composite_audio_gpio,
2624 		}, {
2625 			.type     = EM28XX_VMUX_TELEVISION,
2626 			.vmux     = SAA7115_COMPOSITE2,
2627 			.amux     = EM28XX_AMUX_VIDEO,
2628 			.gpio     = mygica_utv3_tuner_audio_gpio,
2629 		} },
2630 	},
2631 };
2632 EXPORT_SYMBOL_GPL(em28xx_boards);
2633 
2634 static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
2635 
2636 /* table of devices that work with this driver */
2637 struct usb_device_id em28xx_id_table[] = {
2638 	{ USB_DEVICE(0xeb1a, 0x2750),
2639 			.driver_info = EM2750_BOARD_UNKNOWN },
2640 	{ USB_DEVICE(0xeb1a, 0x2751),
2641 			.driver_info = EM2750_BOARD_UNKNOWN },
2642 	{ USB_DEVICE(0xeb1a, 0x2800),
2643 			.driver_info = EM2800_BOARD_UNKNOWN },
2644 	{ USB_DEVICE(0xeb1a, 0x2710),
2645 			.driver_info = EM2820_BOARD_UNKNOWN },
2646 	{ USB_DEVICE(0xeb1a, 0x2820),
2647 			.driver_info = EM2820_BOARD_UNKNOWN },
2648 	{ USB_DEVICE(0xeb1a, 0x2821),
2649 			.driver_info = EM2820_BOARD_UNKNOWN },
2650 	{ USB_DEVICE(0xeb1a, 0x2860),
2651 			.driver_info = EM2820_BOARD_UNKNOWN },
2652 	{ USB_DEVICE(0xeb1a, 0x2861),
2653 			.driver_info = EM2820_BOARD_UNKNOWN },
2654 	{ USB_DEVICE(0xeb1a, 0x2862),
2655 			.driver_info = EM2820_BOARD_UNKNOWN },
2656 	{ USB_DEVICE(0xeb1a, 0x2863),
2657 			.driver_info = EM2820_BOARD_UNKNOWN },
2658 	{ USB_DEVICE(0xeb1a, 0x2870),
2659 			.driver_info = EM2820_BOARD_UNKNOWN },
2660 	{ USB_DEVICE(0xeb1a, 0x2881),
2661 			.driver_info = EM2820_BOARD_UNKNOWN },
2662 	{ USB_DEVICE(0xeb1a, 0x2883), /* used by :Zolid Hybrid Tv Stick */
2663 			.driver_info = EM2820_BOARD_UNKNOWN },
2664 	{ USB_DEVICE(0xeb1a, 0x2868),
2665 			.driver_info = EM2820_BOARD_UNKNOWN },
2666 	{ USB_DEVICE(0xeb1a, 0x2875),
2667 			.driver_info = EM2820_BOARD_UNKNOWN },
2668 	{ USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */
2669 			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2670 	{ USB_DEVICE(0xeb1a, 0xe300),
2671 			.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
2672 	{ USB_DEVICE(0xeb1a, 0xe303),
2673 			.driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
2674 	{ USB_DEVICE(0xeb1a, 0xe305),
2675 			.driver_info = EM2880_BOARD_KWORLD_DVB_305U },
2676 	{ USB_DEVICE(0xeb1a, 0xe310),
2677 			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
2678 	{ USB_DEVICE(0xeb1a, 0xa313),
2679 		.driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
2680 	{ USB_DEVICE(0xeb1a, 0xa316),
2681 			.driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
2682 	{ USB_DEVICE(0xeb1a, 0xe320),
2683 			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
2684 	{ USB_DEVICE(0xeb1a, 0xe323),
2685 			.driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
2686 	{ USB_DEVICE(0xeb1a, 0xe350),
2687 			.driver_info = EM2870_BOARD_KWORLD_350U },
2688 	{ USB_DEVICE(0xeb1a, 0xe355),
2689 			.driver_info = EM2870_BOARD_KWORLD_355U },
2690 	{ USB_DEVICE(0xeb1a, 0x2801),
2691 			.driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
2692 	{ USB_DEVICE(0xeb1a, 0xe357),
2693 			.driver_info = EM2870_BOARD_KWORLD_355U },
2694 	{ USB_DEVICE(0xeb1a, 0xe359),
2695 			.driver_info = EM2870_BOARD_KWORLD_355U },
2696 	{ USB_DEVICE(0x1b80, 0xe302), /* Kaiser Baas Video to DVD maker */
2697 			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2698 	{ USB_DEVICE(0x1b80, 0xe304), /* Kworld DVD Maker 2 */
2699 			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2700 	{ USB_DEVICE(0x0ccd, 0x0036),
2701 			.driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
2702 	{ USB_DEVICE(0x0ccd, 0x004c),
2703 			.driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
2704 	{ USB_DEVICE(0x0ccd, 0x004f),
2705 			.driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
2706 	{ USB_DEVICE(0x0ccd, 0x005e),
2707 			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2708 	{ USB_DEVICE(0x0ccd, 0x0042),
2709 			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2710 	{ USB_DEVICE(0x0ccd, 0x0043),
2711 			.driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },
2712 	{ USB_DEVICE(0x0ccd, 0x008e),	/* Cinergy HTC USB XS Rev. 1 */
2713 			.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2714 	{ USB_DEVICE(0x0ccd, 0x00ac),	/* Cinergy HTC USB XS Rev. 2 */
2715 			.driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2716 	{ USB_DEVICE(0x0ccd, 0x10a2),	/* H5 Rev. 1 */
2717 			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2718 	{ USB_DEVICE(0x0ccd, 0x10ad),	/* H5 Rev. 2 */
2719 			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2720 	{ USB_DEVICE(0x0ccd, 0x10b6),	/* H5 Rev. 3 */
2721 			.driver_info = EM2884_BOARD_TERRATEC_H5 },
2722 	{ USB_DEVICE(0x0ccd, 0x10b2),	/* H6 */
2723 			.driver_info = EM2884_BOARD_TERRATEC_H6 },
2724 	{ USB_DEVICE(0x0ccd, 0x0084),
2725 			.driver_info = EM2860_BOARD_TERRATEC_AV350 },
2726 	{ USB_DEVICE(0x0ccd, 0x0096),
2727 			.driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2728 	{ USB_DEVICE(0x0ccd, 0x10AF),
2729 			.driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2730 	{ USB_DEVICE(0x0ccd, 0x00b2),
2731 			.driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
2732 	{ USB_DEVICE(0x0fd9, 0x0018),
2733 			.driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },
2734 	{ USB_DEVICE(0x0fd9, 0x0033),
2735 			.driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },
2736 	{ USB_DEVICE(0x185b, 0x2870),
2737 			.driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
2738 	{ USB_DEVICE(0x185b, 0x2041),
2739 			.driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
2740 	{ USB_DEVICE(0x2040, 0x4200),
2741 			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2742 	{ USB_DEVICE(0x2040, 0x4201),
2743 			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2744 	{ USB_DEVICE(0x2040, 0x6500),
2745 			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
2746 	{ USB_DEVICE(0x2040, 0x6502),
2747 			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
2748 	{ USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
2749 			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2750 	{ USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
2751 			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2752 	{ USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
2753 			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2754 	{ USB_DEVICE(0x2040, 0x651f),
2755 			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
2756 	{ USB_DEVICE(0x2040, 0x0265),
2757 			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2758 	{ USB_DEVICE(0x2040, 0x8265),
2759 			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2760 	{ USB_DEVICE(0x2040, 0x026d),
2761 			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
2762 	{ USB_DEVICE(0x2040, 0x826d),
2763 			.driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
2764 	{ USB_DEVICE(0x2040, 0x846d),
2765 			.driver_info = EM2874_BOARD_HAUPPAUGE_USB_QUADHD },
2766 	{ USB_DEVICE(0x0438, 0xb002),
2767 			.driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
2768 	{ USB_DEVICE(0x2001, 0xf112),
2769 			.driver_info = EM2820_BOARD_DLINK_USB_TV },
2770 	{ USB_DEVICE(0x2304, 0x0207),
2771 			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2772 	{ USB_DEVICE(0x2304, 0x0208),
2773 			.driver_info = EM2820_BOARD_PINNACLE_USB_2 },
2774 	{ USB_DEVICE(0x2304, 0x021a),
2775 			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2776 	{ USB_DEVICE(0x2304, 0x0226),
2777 			.driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
2778 	{ USB_DEVICE(0x2304, 0x0227),
2779 			.driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
2780 	{ USB_DEVICE(0x2304, 0x023f),
2781 			.driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
2782 	{ USB_DEVICE(0x0413, 0x6023),
2783 			.driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
2784 	{ USB_DEVICE(0x093b, 0xa003),
2785 		       .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2786 	{ USB_DEVICE(0x093b, 0xa005),
2787 			.driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
2788 	{ USB_DEVICE(0x04bb, 0x0515),
2789 			.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
2790 	{ USB_DEVICE(0xeb1a, 0x50a6),
2791 			.driver_info = EM2860_BOARD_GADMEI_UTV330 },
2792 	{ USB_DEVICE(0x1b80, 0xa340),
2793 			.driver_info = EM2870_BOARD_KWORLD_A340 },
2794 	{ USB_DEVICE(0x1b80, 0xe346),
2795 			.driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
2796 	{ USB_DEVICE(0x1b80, 0xe34c),
2797 			.driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
2798 	{ USB_DEVICE(0x2013, 0x024f),
2799 			.driver_info = EM28174_BOARD_PCTV_290E },
2800 	{ USB_DEVICE(0x2013, 0x024c),
2801 			.driver_info = EM28174_BOARD_PCTV_460E },
2802 	{ USB_DEVICE(0x2040, 0x1605),
2803 			.driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
2804 	{ USB_DEVICE(0x1b80, 0xe755),
2805 			.driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
2806 	{ USB_DEVICE(0xeb1a, 0x5006),
2807 			.driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
2808 	{ USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
2809 			.driver_info = EM2860_BOARD_EASYCAP },
2810 	{ USB_DEVICE(0x1b80, 0xe425),
2811 			.driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
2812 	{ USB_DEVICE(0x1f4d, 0x1abe),
2813 			.driver_info = EM2860_BOARD_MYGICA_IGRABBER },
2814 	{ USB_DEVICE(0x2304, 0x0242),
2815 			.driver_info = EM2884_BOARD_PCTV_510E },
2816 	{ USB_DEVICE(0x2013, 0x0251),
2817 			.driver_info = EM2884_BOARD_PCTV_520E },
2818 	{ USB_DEVICE(0x1b80, 0xe1cc),
2819 			.driver_info = EM2874_BOARD_DELOCK_61959 },
2820 	{ USB_DEVICE(0x1ae7, 0x9003),
2821 			.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2822 	{ USB_DEVICE(0x1ae7, 0x9004),
2823 			.driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2824 	{ USB_DEVICE(0x2013, 0x0258),
2825 			.driver_info = EM28178_BOARD_PCTV_461E },
2826 	{ USB_DEVICE(0x2013, 0x8258), /* Bulk transport 461e */
2827 			.driver_info = EM28178_BOARD_PCTV_461E },
2828 	{ USB_DEVICE(0x2013, 0x0461),
2829 			.driver_info = EM28178_BOARD_PCTV_461E_V2 },
2830 	{ USB_DEVICE(0x2013, 0x8461), /* Bulk transport 461e v2 */
2831 			.driver_info = EM28178_BOARD_PCTV_461E_V2 },
2832 	{ USB_DEVICE(0x2013, 0x0259),
2833 			.driver_info = EM28178_BOARD_PCTV_461E_V2 },
2834 	{ USB_DEVICE(0x2013, 0x025f),
2835 			.driver_info = EM28178_BOARD_PCTV_292E },
2836 	{ USB_DEVICE(0x2013, 0x0264), /* Hauppauge WinTV-soloHD 292e SE */
2837 			.driver_info = EM28178_BOARD_PCTV_292E },
2838 	{ USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD Isoc */
2839 			.driver_info = EM28178_BOARD_PCTV_292E },
2840 	{ USB_DEVICE(0x2040, 0x8264), /* Hauppauge OEM Generic WinTV-soloHD Bulk */
2841 			.driver_info = EM28178_BOARD_PCTV_292E },
2842 	{ USB_DEVICE(0x2040, 0x8268), /* Hauppauge Retail WinTV-soloHD Bulk */
2843 			.driver_info = EM28178_BOARD_PCTV_292E },
2844 	{ USB_DEVICE(0x0413, 0x6f07),
2845 			.driver_info = EM2861_BOARD_LEADTEK_VC100 },
2846 	{ USB_DEVICE(0xeb1a, 0x8179),
2847 			.driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
2848 	{ USB_DEVICE(0x3275, 0x0085),
2849 			.driver_info = EM28178_BOARD_PLEX_PX_BCUD },
2850 	{ USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */
2851 			.driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN },
2852 	{ USB_DEVICE(0x1b80, 0xe349), /* Magix USB Videowandler-2 */
2853 		.driver_info = EM2861_BOARD_MAGIX_VIDEOWANDLER2 },
2854 	{ },
2855 };
2856 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
2857 
2858 /*
2859  * EEPROM hash table for devices with generic USB IDs
2860  */
2861 static const struct em28xx_hash_table em28xx_eeprom_hash[] = {
2862 	/* P/N: SA 60002070465 Tuner: TVF7533-MF */
2863 	{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
2864 	{0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
2865 	{0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
2866 	{0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
2867 	{0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
2868 	{0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
2869 	{0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
2870 	{0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
2871 	{0x85dd871e, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},
2872 	{0x8f597549, EM2860_BOARD_MYGICA_UTV3, TUNER_TENA_TNF_931D_DFDR1},
2873 };
2874 
2875 /* I2C devicelist hash table for devices with generic USB IDs */
2876 static const struct em28xx_hash_table em28xx_i2c_hash[] = {
2877 	{0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
2878 	{0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
2879 	{0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
2880 	{0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
2881 	{0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
2882 	{0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
2883 	{0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
2884 	{0x27e10080, EM2882_BOARD_ZOLID_HYBRID_TV_STICK, TUNER_XC2028},
2885 	{0x840d0484, EM2860_BOARD_MYGICA_UTV3, TUNER_TENA_TNF_931D_DFDR1},
2886 };
2887 
2888 /* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
2889 
2890 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
2891 {
2892 	struct em28xx_i2c_bus *i2c_bus = ptr;
2893 	struct em28xx *dev = i2c_bus->dev;
2894 	int rc = 0;
2895 
2896 	if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
2897 		return 0;
2898 
2899 	if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
2900 		return 0;
2901 
2902 	rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
2903 
2904 	return rc;
2905 }
2906 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
2907 
2908 static inline void em28xx_set_xclk_i2c_speed(struct em28xx *dev)
2909 {
2910 	const struct em28xx_board *board = &em28xx_boards[dev->model];
2911 	u8 xclk = board->xclk, i2c_speed = board->i2c_speed;
2912 
2913 	/*
2914 	 * Those are the default values for the majority of boards
2915 	 * Use those values if not specified otherwise at boards entry
2916 	 */
2917 	if (!xclk)
2918 		xclk = EM28XX_XCLK_IR_RC5_MODE |
2919 		       EM28XX_XCLK_FREQUENCY_12MHZ;
2920 
2921 	em28xx_write_reg(dev, EM28XX_R0F_XCLK, xclk);
2922 
2923 	if (!i2c_speed)
2924 		i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2925 			    EM28XX_I2C_FREQ_100_KHZ;
2926 
2927 	dev->i2c_speed = i2c_speed & 0x03;
2928 
2929 	if (!dev->board.is_em2800)
2930 		em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, i2c_speed);
2931 	msleep(50);
2932 }
2933 
2934 static inline void em28xx_set_model(struct em28xx *dev)
2935 {
2936 	dev->board = em28xx_boards[dev->model];
2937 	dev->has_msp34xx = dev->board.has_msp34xx;
2938 	dev->is_webcam = dev->board.is_webcam;
2939 
2940 	em28xx_set_xclk_i2c_speed(dev);
2941 
2942 	/* Should be initialized early, for I2C to work */
2943 	dev->def_i2c_bus = dev->board.def_i2c_bus;
2944 }
2945 
2946 /*
2947  * Wait until AC97_RESET reports the expected value reliably before proceeding.
2948  * We also check that two unrelated registers accesses don't return the same
2949  * value to avoid premature return.
2950  * This procedure helps ensuring AC97 register accesses are reliable.
2951  */
2952 static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,
2953 						  int expected_feat)
2954 {
2955 	unsigned long timeout = jiffies + msecs_to_jiffies(2000);
2956 	int feat, powerdown;
2957 
2958 	while (time_is_after_jiffies(timeout)) {
2959 		feat = em28xx_read_ac97(dev, AC97_RESET);
2960 		if (feat < 0)
2961 			return feat;
2962 
2963 		powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);
2964 		if (powerdown < 0)
2965 			return powerdown;
2966 
2967 		if (feat == expected_feat && feat != powerdown)
2968 			return 0;
2969 
2970 		msleep(50);
2971 	}
2972 
2973 	dev_warn(&dev->intf->dev, "AC97 registers access is not reliable !\n");
2974 	return -ETIMEDOUT;
2975 }
2976 
2977 /*
2978  * Since em28xx_pre_card_setup() requires a proper dev->model,
2979  * this won't work for boards with generic PCI IDs
2980  */
2981 static void em28xx_pre_card_setup(struct em28xx *dev)
2982 {
2983 	/*
2984 	 * Set the initial XCLK and I2C clock values based on the board
2985 	 * definition
2986 	 */
2987 	em28xx_set_xclk_i2c_speed(dev);
2988 
2989 	/* request some modules */
2990 	switch (dev->model) {
2991 	case EM2861_BOARD_PLEXTOR_PX_TV100U:
2992 		/* Sets the msp34xx I2S speed */
2993 		dev->i2s_speed = 2048000;
2994 		break;
2995 	case EM2861_BOARD_KWORLD_PVRTV_300U:
2996 	case EM2880_BOARD_KWORLD_DVB_305U:
2997 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
2998 		usleep_range(10000, 11000);
2999 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
3000 		usleep_range(10000, 11000);
3001 		break;
3002 	case EM2870_BOARD_COMPRO_VIDEOMATE:
3003 		/*
3004 		 * TODO: someone can do some cleanup here...
3005 		 *	 not everything's needed
3006 		 */
3007 		em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
3008 		usleep_range(10000, 11000);
3009 		em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
3010 		usleep_range(10000, 11000);
3011 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3012 		msleep(70);
3013 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
3014 		msleep(70);
3015 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
3016 		msleep(70);
3017 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
3018 		msleep(70);
3019 		break;
3020 	case EM2870_BOARD_TERRATEC_XS_MT2060:
3021 		/*
3022 		 * this device needs some gpio writes to get the DVB-T
3023 		 * demod work
3024 		 */
3025 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3026 		msleep(70);
3027 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
3028 		msleep(70);
3029 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3030 		msleep(70);
3031 		break;
3032 	case EM2870_BOARD_PINNACLE_PCTV_DVB:
3033 		/*
3034 		 * this device needs some gpio writes to get the
3035 		 * DVB-T demod work
3036 		 */
3037 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3038 		msleep(70);
3039 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
3040 		msleep(70);
3041 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3042 		msleep(70);
3043 		break;
3044 	case EM2820_BOARD_GADMEI_UTV310:
3045 	case EM2820_BOARD_MSI_VOX_USB_2:
3046 		/* enables audio for that devices */
3047 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3048 		break;
3049 
3050 	case EM2882_BOARD_KWORLD_ATSC_315U:
3051 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
3052 		usleep_range(10000, 11000);
3053 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3054 		usleep_range(10000, 11000);
3055 		em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
3056 		usleep_range(10000, 11000);
3057 		em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
3058 		usleep_range(10000, 11000);
3059 		break;
3060 
3061 	case EM2860_BOARD_KAIOMY_TVNPC_U2:
3062 		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
3063 		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
3064 		em28xx_write_regs(dev, 0x0d, "\x42", 1);
3065 		em28xx_write_regs(dev, 0x08, "\xfd", 1);
3066 		usleep_range(10000, 11000);
3067 		em28xx_write_regs(dev, 0x08, "\xff", 1);
3068 		usleep_range(10000, 11000);
3069 		em28xx_write_regs(dev, 0x08, "\x7f", 1);
3070 		usleep_range(10000, 11000);
3071 		em28xx_write_regs(dev, 0x08, "\x6b", 1);
3072 
3073 		break;
3074 	case EM2860_BOARD_EASYCAP:
3075 		em28xx_write_regs(dev, 0x08, "\xf8", 1);
3076 		break;
3077 
3078 	case EM2820_BOARD_IODATA_GVMVP_SZ:
3079 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
3080 		msleep(70);
3081 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
3082 		usleep_range(10000, 11000);
3083 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
3084 		msleep(70);
3085 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3086 		msleep(70);
3087 		break;
3088 
3089 	case EM2860_BOARD_TERRATEC_GRABBY:
3090 		/*
3091 		 * HACK?: Ensure AC97 register reading is reliable before
3092 		 * proceeding. In practice, this will wait about 1.6 seconds.
3093 		 */
3094 		em28xx_wait_until_ac97_features_equals(dev, 0x6a90);
3095 		break;
3096 	}
3097 
3098 	em28xx_gpio_set(dev, dev->board.tuner_gpio);
3099 	em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3100 
3101 	/* Unlock device */
3102 	em28xx_set_mode(dev, EM28XX_SUSPEND);
3103 }
3104 
3105 static int em28xx_hint_board(struct em28xx *dev)
3106 {
3107 	int i;
3108 
3109 	if (dev->is_webcam) {
3110 		if (dev->em28xx_sensor == EM28XX_MT9V011) {
3111 			dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
3112 		} else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
3113 			   dev->em28xx_sensor == EM28XX_MT9M111) {
3114 			dev->model = EM2750_BOARD_UNKNOWN;
3115 		}
3116 		/* FIXME: IMPROVE ! */
3117 
3118 		return 0;
3119 	}
3120 
3121 	/*
3122 	 * HINT method: EEPROM
3123 	 *
3124 	 * This method works only for boards with eeprom.
3125 	 * Uses a hash of all eeprom bytes. The hash should be
3126 	 * unique for a vendor/tuner pair.
3127 	 * There are a high chance that tuners for different
3128 	 * video standards produce different hashes.
3129 	 */
3130 	for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
3131 		if (dev->hash == em28xx_eeprom_hash[i].hash) {
3132 			dev->model = em28xx_eeprom_hash[i].model;
3133 			dev->tuner_type = em28xx_eeprom_hash[i].tuner;
3134 
3135 			dev_err(&dev->intf->dev,
3136 				"Your board has no unique USB ID.\n"
3137 				"A hint were successfully done, based on eeprom hash.\n"
3138 				"This method is not 100%% failproof.\n"
3139 				"If the board were misdetected, please email this log to:\n"
3140 				"\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
3141 				"Board detected as %s\n",
3142 			       em28xx_boards[dev->model].name);
3143 
3144 			return 0;
3145 		}
3146 	}
3147 
3148 	/*
3149 	 * HINT method: I2C attached devices
3150 	 *
3151 	 * This method works for all boards.
3152 	 * Uses a hash of i2c scanned devices.
3153 	 * Devices with the same i2c attached chips will
3154 	 * be considered equal.
3155 	 * This method is less precise than the eeprom one.
3156 	 */
3157 
3158 	/* user did not request i2c scanning => do it now */
3159 	if (!dev->i2c_hash)
3160 		em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
3161 
3162 	for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
3163 		if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
3164 			dev->model = em28xx_i2c_hash[i].model;
3165 			dev->tuner_type = em28xx_i2c_hash[i].tuner;
3166 			dev_err(&dev->intf->dev,
3167 				"Your board has no unique USB ID.\n"
3168 				"A hint were successfully done, based on i2c devicelist hash.\n"
3169 				"This method is not 100%% failproof.\n"
3170 				"If the board were misdetected, please email this log to:\n"
3171 				"\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
3172 				"Board detected as %s\n",
3173 				em28xx_boards[dev->model].name);
3174 
3175 			return 0;
3176 		}
3177 	}
3178 
3179 	dev_err(&dev->intf->dev,
3180 		"Your board has no unique USB ID and thus need a hint to be detected.\n"
3181 		"You may try to use card=<n> insmod option to workaround that.\n"
3182 		"Please send an email with this log to:\n"
3183 		"\tV4L Mailing List <linux-media@vger.kernel.org>\n"
3184 		"Board eeprom hash is 0x%08lx\n"
3185 		"Board i2c devicelist hash is 0x%08lx\n",
3186 		dev->hash, dev->i2c_hash);
3187 
3188 	dev_err(&dev->intf->dev,
3189 		"Here is a list of valid choices for the card=<n> insmod option:\n");
3190 	for (i = 0; i < em28xx_bcount; i++) {
3191 		dev_err(&dev->intf->dev,
3192 			"    card=%d -> %s\n", i, em28xx_boards[i].name);
3193 	}
3194 	return -1;
3195 }
3196 
3197 static void em28xx_card_setup(struct em28xx *dev)
3198 {
3199 	int i, j, idx;
3200 	bool duplicate_entry;
3201 
3202 	/*
3203 	 * If the device can be a webcam, seek for a sensor.
3204 	 * If sensor is not found, then it isn't a webcam.
3205 	 */
3206 	if (dev->is_webcam) {
3207 		em28xx_detect_sensor(dev);
3208 		if (dev->em28xx_sensor == EM28XX_NOSENSOR)
3209 			/* NOTE: error/unknown sensor/no sensor */
3210 			dev->is_webcam = 0;
3211 	}
3212 
3213 	switch (dev->model) {
3214 	case EM2750_BOARD_UNKNOWN:
3215 	case EM2820_BOARD_UNKNOWN:
3216 	case EM2800_BOARD_UNKNOWN:
3217 		/*
3218 		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
3219 		 *
3220 		 * This occurs because they share identical USB vendor and
3221 		 * product IDs.
3222 		 *
3223 		 * What we do here is look up the EEPROM hash of the K-WORLD
3224 		 * and if it is found then we decide that we do not have
3225 		 * a DIGIVOX and reset the device to the K-WORLD instead.
3226 		 *
3227 		 * This solution is only valid if they do not share eeprom
3228 		 * hash identities which has not been determined as yet.
3229 		 */
3230 		if (em28xx_hint_board(dev) < 0) {
3231 			dev_err(&dev->intf->dev, "Board not discovered\n");
3232 		} else {
3233 			em28xx_set_model(dev);
3234 			em28xx_pre_card_setup(dev);
3235 		}
3236 		break;
3237 	default:
3238 		em28xx_set_model(dev);
3239 	}
3240 
3241 	dev_info(&dev->intf->dev, "Identified as %s (card=%d)\n",
3242 		 dev->board.name, dev->model);
3243 
3244 	dev->tuner_type = em28xx_boards[dev->model].tuner_type;
3245 
3246 	/* request some modules */
3247 	switch (dev->model) {
3248 	case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
3249 	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
3250 	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
3251 	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
3252 	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
3253 	case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
3254 	case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:
3255 	case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595:
3256 	{
3257 		struct tveeprom tv;
3258 
3259 		if (!dev->eedata)
3260 			break;
3261 #if defined(CONFIG_MODULES) && defined(MODULE)
3262 		request_module("tveeprom");
3263 #endif
3264 		/* Call first TVeeprom */
3265 
3266 		tveeprom_hauppauge_analog(&tv, dev->eedata);
3267 
3268 		dev->tuner_type = tv.tuner_type;
3269 
3270 		if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
3271 			dev->i2s_speed = 2048000;
3272 			dev->has_msp34xx = 1;
3273 		}
3274 		break;
3275 	}
3276 	case EM2882_BOARD_KWORLD_ATSC_315U:
3277 		em28xx_write_reg(dev, 0x0d, 0x42);
3278 		usleep_range(10000, 11000);
3279 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3280 		usleep_range(10000, 11000);
3281 		break;
3282 	case EM2820_BOARD_KWORLD_PVRTV2800RF:
3283 		/* GPIO enables sound on KWORLD PVR TV 2800RF */
3284 		em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
3285 		break;
3286 	case EM2820_BOARD_UNKNOWN:
3287 	case EM2800_BOARD_UNKNOWN:
3288 		/*
3289 		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
3290 		 *
3291 		 * This occurs because they share identical USB vendor and
3292 		 * product IDs.
3293 		 *
3294 		 * What we do here is look up the EEPROM hash of the K-WORLD
3295 		 * and if it is found then we decide that we do not have
3296 		 * a DIGIVOX and reset the device to the K-WORLD instead.
3297 		 *
3298 		 * This solution is only valid if they do not share eeprom
3299 		 * hash identities which has not been determined as yet.
3300 		 */
3301 	case EM2880_BOARD_MSI_DIGIVOX_AD:
3302 		if (!em28xx_hint_board(dev))
3303 			em28xx_set_model(dev);
3304 
3305 		/*
3306 		 * In cases where we had to use a board hint, the call to
3307 		 * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
3308 		 * so make the call now so the analog GPIOs are set properly
3309 		 * before probing the i2c bus.
3310 		 */
3311 		em28xx_gpio_set(dev, dev->board.tuner_gpio);
3312 		em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3313 		break;
3314 
3315 		/*
3316 		 * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
3317 		 *
3318 		 * This occurs because they share identical USB vendor and
3319 		 * product IDs.
3320 		 *
3321 		 * What we do here is look up the EEPROM hash of the Dikom
3322 		 * and if it is found then we decide that we do not have
3323 		 * a Kworld and reset the device to the Dikom instead.
3324 		 *
3325 		 * This solution is only valid if they do not share eeprom
3326 		 * hash identities which has not been determined as yet.
3327 		 */
3328 	case EM2882_BOARD_KWORLD_VS_DVBT:
3329 		if (!em28xx_hint_board(dev))
3330 			em28xx_set_model(dev);
3331 
3332 		/*
3333 		 * In cases where we had to use a board hint, the call to
3334 		 * em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
3335 		 * so make the call now so the analog GPIOs are set properly
3336 		 * before probing the i2c bus.
3337 		 */
3338 		em28xx_gpio_set(dev, dev->board.tuner_gpio);
3339 		em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3340 		break;
3341 	}
3342 
3343 	if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
3344 		dev_err(&dev->intf->dev,
3345 			"\n\n"
3346 			"The support for this board weren't valid yet.\n"
3347 			"Please send a report of having this working\n"
3348 			"not to V4L mailing list (and/or to other addresses)\n\n");
3349 	}
3350 
3351 	/* Free eeprom data memory */
3352 	kfree(dev->eedata);
3353 	dev->eedata = NULL;
3354 
3355 	/* Allow override tuner type by a module parameter */
3356 	if (tuner >= 0)
3357 		dev->tuner_type = tuner;
3358 
3359 	/*
3360 	 * Dynamically generate a list of valid audio inputs for this
3361 	 * specific board, mapping them via enum em28xx_amux.
3362 	 */
3363 
3364 	idx = 0;
3365 	for (i = 0; i < MAX_EM28XX_INPUT; i++) {
3366 		if (!INPUT(i)->type)
3367 			continue;
3368 
3369 		/* Skip already mapped audio inputs */
3370 		duplicate_entry = false;
3371 		for (j = 0; j < idx; j++) {
3372 			if (INPUT(i)->amux == dev->amux_map[j]) {
3373 				duplicate_entry = true;
3374 				break;
3375 			}
3376 		}
3377 		if (duplicate_entry)
3378 			continue;
3379 
3380 		dev->amux_map[idx++] = INPUT(i)->amux;
3381 	}
3382 	for (; idx < MAX_EM28XX_INPUT; idx++)
3383 		dev->amux_map[idx] = EM28XX_AMUX_UNUSED;
3384 }
3385 
3386 void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
3387 {
3388 	memset(ctl, 0, sizeof(*ctl));
3389 
3390 	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
3391 	ctl->max_len = 64;
3392 	ctl->mts = em28xx_boards[dev->model].mts_firmware;
3393 
3394 	switch (dev->model) {
3395 	case EM2880_BOARD_EMPIRE_DUAL_TV:
3396 	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
3397 	case EM2882_BOARD_TERRATEC_HYBRID_XS:
3398 	case EM2880_BOARD_TERRATEC_HYBRID_XS:
3399 	case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
3400 	case EM2881_BOARD_PINNACLE_HYBRID_PRO:
3401 	case EM2882_BOARD_ZOLID_HYBRID_TV_STICK:
3402 		ctl->demod = XC3028_FE_ZARLINK456;
3403 		break;
3404 	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
3405 	case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
3406 		ctl->demod = XC3028_FE_DEFAULT;
3407 		break;
3408 	case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
3409 		ctl->demod = XC3028_FE_DEFAULT;
3410 		ctl->fname = XC3028L_DEFAULT_FIRMWARE;
3411 		break;
3412 	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
3413 	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
3414 	case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
3415 		/* FIXME: Better to specify the needed IF */
3416 		ctl->demod = XC3028_FE_DEFAULT;
3417 		break;
3418 	case EM2883_BOARD_KWORLD_HYBRID_330U:
3419 	case EM2882_BOARD_DIKOM_DK300:
3420 	case EM2882_BOARD_KWORLD_VS_DVBT:
3421 		ctl->demod = XC3028_FE_CHINA;
3422 		ctl->fname = XC2028_DEFAULT_FIRMWARE;
3423 		break;
3424 	case EM2882_BOARD_EVGA_INDTUBE:
3425 		ctl->demod = XC3028_FE_CHINA;
3426 		ctl->fname = XC3028L_DEFAULT_FIRMWARE;
3427 		break;
3428 	default:
3429 		ctl->demod = XC3028_FE_OREN538;
3430 	}
3431 }
3432 EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);
3433 
3434 static void request_module_async(struct work_struct *work)
3435 {
3436 	struct em28xx *dev = container_of(work,
3437 			     struct em28xx, request_module_wk);
3438 
3439 	/*
3440 	 * The em28xx extensions can be modules or builtin. If the
3441 	 * modules are already loaded or are built in, those extensions
3442 	 * can be initialised right now. Otherwise, the module init
3443 	 * code will do it.
3444 	 */
3445 
3446 	/*
3447 	 * Devices with an audio-only intf also have a V4L/DVB/RC
3448 	 * intf. Don't register extensions twice on those devices.
3449 	 */
3450 	if (dev->is_audio_only) {
3451 #if defined(CONFIG_MODULES) && defined(MODULE)
3452 		request_module("em28xx-alsa");
3453 #endif
3454 		return;
3455 	}
3456 
3457 	em28xx_init_extension(dev);
3458 
3459 #if defined(CONFIG_MODULES) && defined(MODULE)
3460 	if (dev->has_video)
3461 		request_module("em28xx-v4l");
3462 	if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
3463 		request_module("snd-usb-audio");
3464 	else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
3465 		request_module("em28xx-alsa");
3466 	if (dev->board.has_dvb)
3467 		request_module("em28xx-dvb");
3468 	if (dev->board.buttons ||
3469 	    ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
3470 		request_module("em28xx-rc");
3471 #endif /* CONFIG_MODULES */
3472 }
3473 
3474 static void request_modules(struct em28xx *dev)
3475 {
3476 	INIT_WORK(&dev->request_module_wk, request_module_async);
3477 	schedule_work(&dev->request_module_wk);
3478 }
3479 
3480 static void flush_request_modules(struct em28xx *dev)
3481 {
3482 	flush_work(&dev->request_module_wk);
3483 }
3484 
3485 static int em28xx_media_device_init(struct em28xx *dev,
3486 				    struct usb_device *udev)
3487 {
3488 #ifdef CONFIG_MEDIA_CONTROLLER
3489 	struct media_device *mdev;
3490 
3491 	mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
3492 	if (!mdev)
3493 		return -ENOMEM;
3494 
3495 	if (udev->product)
3496 		media_device_usb_init(mdev, udev, udev->product);
3497 	else if (udev->manufacturer)
3498 		media_device_usb_init(mdev, udev, udev->manufacturer);
3499 	else
3500 		media_device_usb_init(mdev, udev, dev_name(&dev->intf->dev));
3501 
3502 	dev->media_dev = mdev;
3503 #endif
3504 	return 0;
3505 }
3506 
3507 static void em28xx_unregister_media_device(struct em28xx *dev)
3508 {
3509 #ifdef CONFIG_MEDIA_CONTROLLER
3510 	if (dev->media_dev) {
3511 		media_device_unregister(dev->media_dev);
3512 		media_device_cleanup(dev->media_dev);
3513 		kfree(dev->media_dev);
3514 		dev->media_dev = NULL;
3515 	}
3516 #endif
3517 }
3518 
3519 /*
3520  * em28xx_release_resources()
3521  * unregisters the v4l2,i2c and usb devices
3522  * called when the device gets disconnected or at module unload
3523  */
3524 static void em28xx_release_resources(struct em28xx *dev)
3525 {
3526 	struct usb_device *udev = interface_to_usbdev(dev->intf);
3527 
3528 	/*FIXME: I2C IR should be disconnected */
3529 
3530 	mutex_lock(&dev->lock);
3531 
3532 	em28xx_unregister_media_device(dev);
3533 
3534 	if (dev->def_i2c_bus)
3535 		em28xx_i2c_unregister(dev, 1);
3536 	em28xx_i2c_unregister(dev, 0);
3537 
3538 	if (dev->ts == PRIMARY_TS)
3539 		usb_put_dev(udev);
3540 
3541 	/* Mark device as unused */
3542 	clear_bit(dev->devno, em28xx_devused);
3543 
3544 	mutex_unlock(&dev->lock);
3545 };
3546 
3547 /**
3548  * em28xx_free_device() - Free em28xx device
3549  *
3550  * @ref: struct kref for em28xx device
3551  *
3552  * This is called when all extensions and em28xx core unregisters a device
3553  */
3554 void em28xx_free_device(struct kref *ref)
3555 {
3556 	struct em28xx *dev = kref_to_dev(ref);
3557 
3558 	dev_info(&dev->intf->dev, "Freeing device\n");
3559 
3560 	if (!dev->disconnected)
3561 		em28xx_release_resources(dev);
3562 
3563 	if (dev->ts == PRIMARY_TS)
3564 		kfree(dev->alt_max_pkt_size_isoc);
3565 
3566 	kfree(dev);
3567 }
3568 EXPORT_SYMBOL_GPL(em28xx_free_device);
3569 
3570 /*
3571  * em28xx_init_dev()
3572  * allocates and inits the device structs, registers i2c bus and v4l device
3573  */
3574 static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
3575 			   struct usb_interface *intf,
3576 			   int minor)
3577 {
3578 	int retval;
3579 	const char *chip_name = NULL;
3580 
3581 	dev->intf = intf;
3582 	mutex_init(&dev->ctrl_urb_lock);
3583 	spin_lock_init(&dev->slock);
3584 
3585 	dev->em28xx_write_regs = em28xx_write_regs;
3586 	dev->em28xx_read_reg = em28xx_read_reg;
3587 	dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
3588 	dev->em28xx_write_regs_req = em28xx_write_regs_req;
3589 	dev->em28xx_read_reg_req = em28xx_read_reg_req;
3590 	dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
3591 
3592 	em28xx_set_model(dev);
3593 
3594 	dev->wait_after_write = 5;
3595 
3596 	/* Based on the Chip ID, set the device configuration */
3597 	retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
3598 	if (retval > 0) {
3599 		dev->chip_id = retval;
3600 
3601 		switch (dev->chip_id) {
3602 		case CHIP_ID_EM2800:
3603 			chip_name = "em2800";
3604 			break;
3605 		case CHIP_ID_EM2710:
3606 			chip_name = "em2710";
3607 			break;
3608 		case CHIP_ID_EM2750:
3609 			chip_name = "em2750";
3610 			break;
3611 		case CHIP_ID_EM2765:
3612 			chip_name = "em2765";
3613 			dev->wait_after_write = 0;
3614 			dev->is_em25xx = 1;
3615 			dev->eeprom_addrwidth_16bit = 1;
3616 			break;
3617 		case CHIP_ID_EM2820:
3618 			chip_name = "em2710/2820";
3619 			if (le16_to_cpu(udev->descriptor.idVendor) == 0xeb1a) {
3620 				__le16 idProd = udev->descriptor.idProduct;
3621 
3622 				if (le16_to_cpu(idProd) == 0x2710)
3623 					chip_name = "em2710";
3624 				else if (le16_to_cpu(idProd) == 0x2820)
3625 					chip_name = "em2820";
3626 			}
3627 			/* NOTE: the em2820 is used in webcams, too ! */
3628 			break;
3629 		case CHIP_ID_EM2840:
3630 			chip_name = "em2840";
3631 			break;
3632 		case CHIP_ID_EM2860:
3633 			chip_name = "em2860";
3634 			break;
3635 		case CHIP_ID_EM2870:
3636 			chip_name = "em2870";
3637 			dev->wait_after_write = 0;
3638 			break;
3639 		case CHIP_ID_EM2874:
3640 			chip_name = "em2874";
3641 			dev->wait_after_write = 0;
3642 			dev->eeprom_addrwidth_16bit = 1;
3643 			break;
3644 		case CHIP_ID_EM28174:
3645 			chip_name = "em28174";
3646 			dev->wait_after_write = 0;
3647 			dev->eeprom_addrwidth_16bit = 1;
3648 			break;
3649 		case CHIP_ID_EM28178:
3650 			chip_name = "em28178";
3651 			dev->wait_after_write = 0;
3652 			dev->eeprom_addrwidth_16bit = 1;
3653 			break;
3654 		case CHIP_ID_EM2883:
3655 			chip_name = "em2882/3";
3656 			dev->wait_after_write = 0;
3657 			break;
3658 		case CHIP_ID_EM2884:
3659 			chip_name = "em2884";
3660 			dev->wait_after_write = 0;
3661 			dev->eeprom_addrwidth_16bit = 1;
3662 			break;
3663 		}
3664 	}
3665 	if (!chip_name)
3666 		dev_info(&dev->intf->dev,
3667 			 "unknown em28xx chip ID (%d)\n", dev->chip_id);
3668 	else
3669 		dev_info(&dev->intf->dev, "chip ID is %s\n", chip_name);
3670 
3671 	em28xx_media_device_init(dev, udev);
3672 
3673 	if (dev->is_audio_only) {
3674 		retval = em28xx_audio_setup(dev);
3675 		if (retval) {
3676 			retval = -ENODEV;
3677 			goto err_deinit_media;
3678 		}
3679 		em28xx_init_extension(dev);
3680 
3681 		return 0;
3682 	}
3683 
3684 	em28xx_pre_card_setup(dev);
3685 
3686 	rt_mutex_init(&dev->i2c_bus_lock);
3687 
3688 	/* register i2c bus 0 */
3689 	if (dev->board.is_em2800)
3690 		retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
3691 	else
3692 		retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
3693 	if (retval < 0) {
3694 		dev_err(&dev->intf->dev,
3695 			"%s: em28xx_i2c_register bus 0 - error [%d]!\n",
3696 		       __func__, retval);
3697 		goto err_deinit_media;
3698 	}
3699 
3700 	/* register i2c bus 1 */
3701 	if (dev->def_i2c_bus) {
3702 		if (dev->is_em25xx)
3703 			retval = em28xx_i2c_register(dev, 1,
3704 						     EM28XX_I2C_ALGO_EM25XX_BUS_B);
3705 		else
3706 			retval = em28xx_i2c_register(dev, 1,
3707 						     EM28XX_I2C_ALGO_EM28XX);
3708 		if (retval < 0) {
3709 			dev_err(&dev->intf->dev,
3710 				"%s: em28xx_i2c_register bus 1 - error [%d]!\n",
3711 				__func__, retval);
3712 
3713 			goto err_unreg_i2c;
3714 		}
3715 	}
3716 
3717 	/* Do board specific init and eeprom reading */
3718 	em28xx_card_setup(dev);
3719 
3720 	return 0;
3721 
3722 err_unreg_i2c:
3723 	em28xx_i2c_unregister(dev, 0);
3724 err_deinit_media:
3725 	em28xx_unregister_media_device(dev);
3726 	return retval;
3727 }
3728 
3729 static int em28xx_duplicate_dev(struct em28xx *dev)
3730 {
3731 	int nr;
3732 	struct em28xx *sec_dev = kmemdup(dev, sizeof(*sec_dev), GFP_KERNEL);
3733 
3734 	if (!sec_dev) {
3735 		dev->dev_next = NULL;
3736 		return -ENOMEM;
3737 	}
3738 	/* Check to see next free device and mark as used */
3739 	do {
3740 		nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
3741 		if (nr >= EM28XX_MAXBOARDS) {
3742 			/* No free device slots */
3743 			dev_warn(&dev->intf->dev, ": Supports only %i em28xx boards.\n",
3744 				 EM28XX_MAXBOARDS);
3745 			kfree(sec_dev);
3746 			dev->dev_next = NULL;
3747 			return -ENOMEM;
3748 		}
3749 	} while (test_and_set_bit(nr, em28xx_devused));
3750 	sec_dev->devno = nr;
3751 	snprintf(sec_dev->name, 28, "em28xx #%d", nr);
3752 	sec_dev->dev_next = NULL;
3753 	dev->dev_next = sec_dev;
3754 	return 0;
3755 }
3756 
3757 /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
3758 #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3759 
3760 static void em28xx_check_usb_descriptor(struct em28xx *dev,
3761 					struct usb_device *udev,
3762 					struct usb_interface *intf,
3763 					int alt, int ep,
3764 					bool *has_vendor_audio,
3765 					bool *has_video,
3766 					bool *has_dvb)
3767 {
3768 	const struct usb_endpoint_descriptor *e;
3769 	int sizedescr, size;
3770 
3771 	/*
3772 	 * NOTE:
3773 	 *
3774 	 * Old logic with support for isoc transfers only was:
3775 	 *  0x82	isoc		=> analog
3776 	 *  0x83	isoc		=> audio
3777 	 *  0x84	isoc		=> digital
3778 	 *
3779 	 * New logic with support for bulk transfers
3780 	 *  0x82	isoc		=> analog
3781 	 *  0x82	bulk		=> analog
3782 	 *  0x83	isoc*		=> audio
3783 	 *  0x84	isoc		=> digital
3784 	 *  0x84	bulk		=> analog or digital**
3785 	 *  0x85	isoc		=> digital TS2
3786 	 *  0x85	bulk		=> digital TS2
3787 	 * (*: audio should always be isoc)
3788 	 * (**: analog, if ep 0x82 is isoc, otherwise digital)
3789 	 *
3790 	 * The new logic preserves backwards compatibility and
3791 	 * reflects the endpoint configurations we have seen
3792 	 * so far. But there might be devices for which this
3793 	 * logic is not sufficient...
3794 	 */
3795 
3796 	e = &intf->altsetting[alt].endpoint[ep].desc;
3797 
3798 	if (!usb_endpoint_dir_in(e))
3799 		return;
3800 
3801 	sizedescr = le16_to_cpu(e->wMaxPacketSize);
3802 	size = sizedescr & 0x7ff;
3803 
3804 	if (udev->speed == USB_SPEED_HIGH)
3805 		size = size * hb_mult(sizedescr);
3806 
3807 	/* Only inspect input endpoints */
3808 
3809 	switch (e->bEndpointAddress) {
3810 	case 0x82:
3811 		*has_video = true;
3812 		if (usb_endpoint_xfer_isoc(e)) {
3813 			dev->analog_ep_isoc = e->bEndpointAddress;
3814 			dev->alt_max_pkt_size_isoc[alt] = size;
3815 		} else if (usb_endpoint_xfer_bulk(e)) {
3816 			dev->analog_ep_bulk = e->bEndpointAddress;
3817 		}
3818 		return;
3819 	case 0x83:
3820 		if (usb_endpoint_xfer_isoc(e))
3821 			*has_vendor_audio = true;
3822 		else
3823 			dev_err(&intf->dev,
3824 				"error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
3825 		return;
3826 	case 0x84:
3827 		if (*has_video && (usb_endpoint_xfer_bulk(e))) {
3828 			dev->analog_ep_bulk = e->bEndpointAddress;
3829 		} else {
3830 			if (usb_endpoint_xfer_isoc(e)) {
3831 				if (size > dev->dvb_max_pkt_size_isoc) {
3832 					/*
3833 					 * 2) some manufacturers (e.g. Terratec)
3834 					 * disable endpoints by setting
3835 					 * wMaxPacketSize to 0 bytes for all
3836 					 * alt settings. So far, we've seen
3837 					 * this for DVB isoc endpoints only.
3838 					 */
3839 					*has_dvb = true;
3840 					dev->dvb_ep_isoc = e->bEndpointAddress;
3841 					dev->dvb_max_pkt_size_isoc = size;
3842 					dev->dvb_alt_isoc = alt;
3843 				}
3844 			} else {
3845 				*has_dvb = true;
3846 				dev->dvb_ep_bulk = e->bEndpointAddress;
3847 			}
3848 		}
3849 		return;
3850 	case 0x85:
3851 		if (usb_endpoint_xfer_isoc(e)) {
3852 			if (size > dev->dvb_max_pkt_size_isoc_ts2) {
3853 				dev->dvb_ep_isoc_ts2 = e->bEndpointAddress;
3854 				dev->dvb_max_pkt_size_isoc_ts2 = size;
3855 				dev->dvb_alt_isoc = alt;
3856 			}
3857 		} else {
3858 			dev->dvb_ep_bulk_ts2 = e->bEndpointAddress;
3859 		}
3860 		return;
3861 	}
3862 }
3863 
3864 /*
3865  * em28xx_usb_probe()
3866  * checks for supported devices
3867  */
3868 static int em28xx_usb_probe(struct usb_interface *intf,
3869 			    const struct usb_device_id *id)
3870 {
3871 	struct usb_device *udev;
3872 	struct em28xx *dev = NULL;
3873 	int retval;
3874 	bool has_vendor_audio = false, has_video = false, has_dvb = false;
3875 	int i, nr, try_bulk;
3876 	const int ifnum = intf->altsetting[0].desc.bInterfaceNumber;
3877 	char *speed;
3878 
3879 	udev = usb_get_dev(interface_to_usbdev(intf));
3880 
3881 	/* Check to see next free device and mark as used */
3882 	do {
3883 		nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
3884 		if (nr >= EM28XX_MAXBOARDS) {
3885 			/* No free device slots */
3886 			dev_err(&intf->dev,
3887 				"Driver supports up to %i em28xx boards.\n",
3888 			       EM28XX_MAXBOARDS);
3889 			retval = -ENOMEM;
3890 			goto err_no_slot;
3891 		}
3892 	} while (test_and_set_bit(nr, em28xx_devused));
3893 
3894 	/* Don't register audio interfaces */
3895 	if (intf->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3896 		dev_info(&intf->dev,
3897 			"audio device (%04x:%04x): interface %i, class %i\n",
3898 			le16_to_cpu(udev->descriptor.idVendor),
3899 			le16_to_cpu(udev->descriptor.idProduct),
3900 			ifnum,
3901 			intf->altsetting[0].desc.bInterfaceClass);
3902 
3903 		retval = -ENODEV;
3904 		goto err;
3905 	}
3906 
3907 	/* allocate memory for our device state and initialize it */
3908 	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
3909 	if (!dev) {
3910 		retval = -ENOMEM;
3911 		goto err;
3912 	}
3913 
3914 	/* compute alternate max packet sizes */
3915 	dev->alt_max_pkt_size_isoc = kcalloc(intf->num_altsetting,
3916 					     sizeof(dev->alt_max_pkt_size_isoc[0]),
3917 					     GFP_KERNEL);
3918 	if (!dev->alt_max_pkt_size_isoc) {
3919 		kfree(dev);
3920 		retval = -ENOMEM;
3921 		goto err;
3922 	}
3923 
3924 	/* Get endpoints */
3925 	for (i = 0; i < intf->num_altsetting; i++) {
3926 		int ep;
3927 
3928 		for (ep = 0;
3929 		     ep < intf->altsetting[i].desc.bNumEndpoints;
3930 		     ep++)
3931 			em28xx_check_usb_descriptor(dev, udev, intf,
3932 						    i, ep,
3933 						    &has_vendor_audio,
3934 						    &has_video,
3935 						    &has_dvb);
3936 	}
3937 
3938 	if (!(has_vendor_audio || has_video || has_dvb)) {
3939 		retval = -ENODEV;
3940 		goto err_free;
3941 	}
3942 
3943 	switch (udev->speed) {
3944 	case USB_SPEED_LOW:
3945 		speed = "1.5";
3946 		break;
3947 	case USB_SPEED_UNKNOWN:
3948 	case USB_SPEED_FULL:
3949 		speed = "12";
3950 		break;
3951 	case USB_SPEED_HIGH:
3952 		speed = "480";
3953 		break;
3954 	default:
3955 		speed = "unknown";
3956 	}
3957 
3958 	dev_info(&intf->dev,
3959 		"New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",
3960 		udev->manufacturer ? udev->manufacturer : "",
3961 		udev->product ? udev->product : "",
3962 		speed,
3963 		le16_to_cpu(udev->descriptor.idVendor),
3964 		le16_to_cpu(udev->descriptor.idProduct),
3965 		ifnum,
3966 		intf->altsetting->desc.bInterfaceNumber);
3967 
3968 	/*
3969 	 * Make sure we have 480 Mbps of bandwidth, otherwise things like
3970 	 * video stream wouldn't likely work, since 12 Mbps is generally
3971 	 * not enough even for most Digital TV streams.
3972 	 */
3973 	if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
3974 		dev_err(&intf->dev, "Device initialization failed.\n");
3975 		dev_err(&intf->dev,
3976 			"Device must be connected to a high-speed USB 2.0 port.\n");
3977 		retval = -ENODEV;
3978 		goto err_free;
3979 	}
3980 
3981 	kref_init(&dev->ref);
3982 
3983 	dev->devno = nr;
3984 	dev->model = id->driver_info;
3985 	dev->alt   = -1;
3986 	dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
3987 	dev->has_video = has_video;
3988 	dev->ifnum = ifnum;
3989 
3990 	dev->ts = PRIMARY_TS;
3991 	snprintf(dev->name, 28, "em28xx");
3992 	dev->dev_next = NULL;
3993 
3994 	if (has_vendor_audio) {
3995 		dev_info(&intf->dev,
3996 			"Audio interface %i found (Vendor Class)\n", ifnum);
3997 		dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
3998 	}
3999 	/* Checks if audio is provided by a USB Audio Class intf */
4000 	for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
4001 		struct usb_interface *uif = udev->config->interface[i];
4002 
4003 		if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
4004 			if (has_vendor_audio)
4005 				dev_err(&intf->dev,
4006 					"em28xx: device seems to have vendor AND usb audio class interfaces !\n"
4007 					"\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
4008 			dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
4009 			break;
4010 		}
4011 	}
4012 
4013 	if (has_video)
4014 		dev_info(&intf->dev, "Video interface %i found:%s%s\n",
4015 			ifnum,
4016 			dev->analog_ep_bulk ? " bulk" : "",
4017 			dev->analog_ep_isoc ? " isoc" : "");
4018 	if (has_dvb)
4019 		dev_info(&intf->dev, "DVB interface %i found:%s%s\n",
4020 			ifnum,
4021 			dev->dvb_ep_bulk ? " bulk" : "",
4022 			dev->dvb_ep_isoc ? " isoc" : "");
4023 
4024 	dev->num_alt = intf->num_altsetting;
4025 
4026 	if ((unsigned int)card[nr] < em28xx_bcount)
4027 		dev->model = card[nr];
4028 
4029 	/* save our data pointer in this intf device */
4030 	usb_set_intfdata(intf, dev);
4031 
4032 	/* allocate device struct and check if the device is a webcam */
4033 	mutex_init(&dev->lock);
4034 	retval = em28xx_init_dev(dev, udev, intf, nr);
4035 	if (retval)
4036 		goto err_free;
4037 
4038 	if (usb_xfer_mode < 0) {
4039 		if (dev->is_webcam)
4040 			try_bulk = 1;
4041 		else
4042 			try_bulk = 0;
4043 	} else {
4044 		try_bulk = usb_xfer_mode > 0;
4045 	}
4046 
4047 	/* Disable V4L2 if the device doesn't have a decoder or image sensor */
4048 	if (has_video &&
4049 	    dev->board.decoder == EM28XX_NODECODER &&
4050 	    dev->em28xx_sensor == EM28XX_NOSENSOR) {
4051 		dev_err(&intf->dev,
4052 			"Currently, V4L2 is not supported on this model\n");
4053 		has_video = false;
4054 		dev->has_video = false;
4055 	}
4056 
4057 	if (dev->board.has_dual_ts &&
4058 	    (dev->tuner_type != TUNER_ABSENT || INPUT(0)->type)) {
4059 		/*
4060 		 * The logic with sets alternate is not ready for dual-tuners
4061 		 * which analog modes.
4062 		 */
4063 		dev_err(&intf->dev,
4064 			"We currently don't support analog TV or stream capture on dual tuners.\n");
4065 		has_video = false;
4066 	}
4067 
4068 	/* Select USB transfer types to use */
4069 	if (has_video) {
4070 		if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
4071 			dev->analog_xfer_bulk = 1;
4072 		dev_info(&intf->dev, "analog set to %s mode.\n",
4073 			dev->analog_xfer_bulk ? "bulk" : "isoc");
4074 	}
4075 	if (has_dvb) {
4076 		if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
4077 			dev->dvb_xfer_bulk = 1;
4078 		dev_info(&intf->dev, "dvb set to %s mode.\n",
4079 			dev->dvb_xfer_bulk ? "bulk" : "isoc");
4080 	}
4081 
4082 	if (dev->board.has_dual_ts && em28xx_duplicate_dev(dev) == 0) {
4083 		kref_init(&dev->dev_next->ref);
4084 
4085 		dev->dev_next->ts = SECONDARY_TS;
4086 		dev->dev_next->alt   = -1;
4087 		dev->dev_next->is_audio_only = has_vendor_audio &&
4088 						!(has_video || has_dvb);
4089 		dev->dev_next->has_video = false;
4090 		dev->dev_next->ifnum = ifnum;
4091 		dev->dev_next->model = id->driver_info;
4092 
4093 		mutex_init(&dev->dev_next->lock);
4094 		retval = em28xx_init_dev(dev->dev_next, udev, intf,
4095 					 dev->dev_next->devno);
4096 		if (retval)
4097 			goto err_free;
4098 
4099 		dev->dev_next->board.ir_codes = NULL; /* No IR for 2nd tuner */
4100 		dev->dev_next->board.has_ir_i2c = 0; /* No IR for 2nd tuner */
4101 
4102 		if (usb_xfer_mode < 0) {
4103 			if (dev->dev_next->is_webcam)
4104 				try_bulk = 1;
4105 			else
4106 				try_bulk = 0;
4107 		} else {
4108 			try_bulk = usb_xfer_mode > 0;
4109 		}
4110 
4111 		/* Select USB transfer types to use */
4112 		if (has_dvb) {
4113 			if (!dev->dvb_ep_isoc_ts2 ||
4114 			    (try_bulk && dev->dvb_ep_bulk_ts2))
4115 				dev->dev_next->dvb_xfer_bulk = 1;
4116 			dev_info(&dev->intf->dev, "dvb ts2 set to %s mode.\n",
4117 				 dev->dev_next->dvb_xfer_bulk ? "bulk" : "isoc");
4118 		}
4119 
4120 		dev->dev_next->dvb_ep_isoc = dev->dvb_ep_isoc_ts2;
4121 		dev->dev_next->dvb_ep_bulk = dev->dvb_ep_bulk_ts2;
4122 		dev->dev_next->dvb_max_pkt_size_isoc = dev->dvb_max_pkt_size_isoc_ts2;
4123 		dev->dev_next->dvb_alt_isoc = dev->dvb_alt_isoc;
4124 
4125 		/* Configure hardware to support TS2*/
4126 		if (dev->dvb_xfer_bulk) {
4127 			/* The ep4 and ep5 are configured for BULK */
4128 			em28xx_write_reg(dev, 0x0b, 0x96);
4129 			mdelay(100);
4130 			em28xx_write_reg(dev, 0x0b, 0x80);
4131 			mdelay(100);
4132 		} else {
4133 			/* The ep4 and ep5 are configured for ISO */
4134 			em28xx_write_reg(dev, 0x0b, 0x96);
4135 			mdelay(100);
4136 			em28xx_write_reg(dev, 0x0b, 0x82);
4137 			mdelay(100);
4138 		}
4139 	}
4140 
4141 	request_modules(dev);
4142 
4143 	/*
4144 	 * Do it at the end, to reduce dynamic configuration changes during
4145 	 * the device init. Yet, as request_modules() can be async, the
4146 	 * topology will likely change after the load of the em28xx subdrivers.
4147 	 */
4148 #ifdef CONFIG_MEDIA_CONTROLLER
4149 	/*
4150 	 * No need to check the return value, the device will still be
4151 	 * usable without media controller API.
4152 	 */
4153 	retval = media_device_register(dev->media_dev);
4154 #endif
4155 
4156 	return 0;
4157 
4158 err_free:
4159 	kfree(dev->alt_max_pkt_size_isoc);
4160 	kfree(dev);
4161 
4162 err:
4163 	clear_bit(nr, em28xx_devused);
4164 
4165 err_no_slot:
4166 	usb_put_dev(udev);
4167 	return retval;
4168 }
4169 
4170 /*
4171  * em28xx_usb_disconnect()
4172  * called when the device gets disconnected
4173  * video device will be unregistered on v4l2_close in case it is still open
4174  */
4175 static void em28xx_usb_disconnect(struct usb_interface *intf)
4176 {
4177 	struct em28xx *dev;
4178 
4179 	dev = usb_get_intfdata(intf);
4180 	usb_set_intfdata(intf, NULL);
4181 
4182 	if (!dev)
4183 		return;
4184 
4185 	if (dev->dev_next) {
4186 		dev->dev_next->disconnected = 1;
4187 		dev_info(&dev->intf->dev, "Disconnecting %s\n",
4188 			 dev->dev_next->name);
4189 	}
4190 
4191 	dev->disconnected = 1;
4192 
4193 	dev_info(&dev->intf->dev, "Disconnecting %s\n", dev->name);
4194 
4195 	flush_request_modules(dev);
4196 
4197 	em28xx_close_extension(dev);
4198 
4199 	if (dev->dev_next)
4200 		em28xx_release_resources(dev->dev_next);
4201 	em28xx_release_resources(dev);
4202 
4203 	if (dev->dev_next) {
4204 		kref_put(&dev->dev_next->ref, em28xx_free_device);
4205 		dev->dev_next = NULL;
4206 	}
4207 	kref_put(&dev->ref, em28xx_free_device);
4208 }
4209 
4210 static int em28xx_usb_suspend(struct usb_interface *intf,
4211 			      pm_message_t message)
4212 {
4213 	struct em28xx *dev;
4214 
4215 	dev = usb_get_intfdata(intf);
4216 	if (!dev)
4217 		return 0;
4218 	em28xx_suspend_extension(dev);
4219 	return 0;
4220 }
4221 
4222 static int em28xx_usb_resume(struct usb_interface *intf)
4223 {
4224 	struct em28xx *dev;
4225 
4226 	dev = usb_get_intfdata(intf);
4227 	if (!dev)
4228 		return 0;
4229 	em28xx_resume_extension(dev);
4230 	return 0;
4231 }
4232 
4233 static struct usb_driver em28xx_usb_driver = {
4234 	.name = "em28xx",
4235 	.probe = em28xx_usb_probe,
4236 	.disconnect = em28xx_usb_disconnect,
4237 	.suspend = em28xx_usb_suspend,
4238 	.resume = em28xx_usb_resume,
4239 	.reset_resume = em28xx_usb_resume,
4240 	.id_table = em28xx_id_table,
4241 };
4242 
4243 module_usb_driver(em28xx_usb_driver);
4244