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