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