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