em28xx-cards.c revision f09fb53075646c35efe0f74d97b7c4bc7ec61e5a
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/tveeprom.h>
35#include <media/v4l2-common.h>
36#include <media/v4l2-chip-ident.h>
37
38#include "em28xx.h"
39
40static int tuner = -1;
41module_param(tuner, int, 0444);
42MODULE_PARM_DESC(tuner, "tuner type");
43
44static unsigned int disable_ir;
45module_param(disable_ir, int, 0444);
46MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
47
48struct em28xx_hash_table {
49	unsigned long hash;
50	unsigned int  model;
51	unsigned int  tuner;
52};
53
54struct em28xx_board em28xx_boards[] = {
55	[EM2750_BOARD_UNKNOWN] = {
56		.name          = "Unknown EM2750/EM2751 webcam grabber",
57		.vchannels     = 1,
58		.input         = { {
59			.type     = EM28XX_VMUX_COMPOSITE1,
60			.vmux     = 0,
61			.amux     = 0,
62		} },
63	},
64	[EM2800_BOARD_UNKNOWN] = {
65		.name         = "Unknown EM2800 video grabber",
66		.is_em2800    = 1,
67		.vchannels    = 2,
68		.tda9887_conf = TDA9887_PRESENT,
69		.decoder      = EM28XX_SAA7113,
70		.input           = { {
71			.type     = EM28XX_VMUX_COMPOSITE1,
72			.vmux     = SAA7115_COMPOSITE0,
73			.amux     = 1,
74		}, {
75			.type     = EM28XX_VMUX_SVIDEO,
76			.vmux     = SAA7115_SVIDEO3,
77			.amux     = 1,
78		} },
79	},
80	[EM2820_BOARD_UNKNOWN] = {
81		.name         = "Unknown EM2750/28xx video grabber",
82		.is_em2800    = 0,
83		.tuner_type   = TUNER_ABSENT,
84	},
85	[EM2750_BOARD_DLCW_130] = {
86		/* Beijing Huaqi Information Digital Technology Co., Ltd */
87		.name          = "Huaqi DLCW-130",
88		.valid         = EM28XX_BOARD_NOT_VALIDATED,
89		.vchannels     = 1,
90		.input         = { {
91			.type     = EM28XX_VMUX_COMPOSITE1,
92			.vmux     = 0,
93			.amux     = 0,
94		} },
95	},
96	[EM2820_BOARD_KWORLD_PVRTV2800RF] = {
97		.name         = "Kworld PVR TV 2800 RF",
98		.is_em2800    = 0,
99		.vchannels    = 2,
100		.tuner_type   = TUNER_TEMIC_PAL,
101		.tda9887_conf = TDA9887_PRESENT,
102		.decoder      = EM28XX_SAA7113,
103		.input           = { {
104			.type     = EM28XX_VMUX_COMPOSITE1,
105			.vmux     = SAA7115_COMPOSITE0,
106			.amux     = 1,
107		}, {
108			.type     = EM28XX_VMUX_SVIDEO,
109			.vmux     = SAA7115_SVIDEO3,
110			.amux     = 1,
111		} },
112	},
113	[EM2820_BOARD_TERRATEC_CINERGY_250] = {
114		.name         = "Terratec Cinergy 250 USB",
115		.vchannels    = 3,
116		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
117		.tda9887_conf = TDA9887_PRESENT,
118		.decoder      = EM28XX_SAA7113,
119		.input          = { {
120			.type     = EM28XX_VMUX_TELEVISION,
121			.vmux     = SAA7115_COMPOSITE2,
122			.amux     = 1,
123		}, {
124			.type     = EM28XX_VMUX_COMPOSITE1,
125			.vmux     = SAA7115_COMPOSITE0,
126			.amux     = 1,
127		}, {
128			.type     = EM28XX_VMUX_SVIDEO,
129			.vmux     = SAA7115_SVIDEO3,
130			.amux     = 1,
131		} },
132	},
133	[EM2820_BOARD_PINNACLE_USB_2] = {
134		.name         = "Pinnacle PCTV USB 2",
135		.vchannels    = 3,
136		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
137		.tda9887_conf = TDA9887_PRESENT,
138		.decoder      = EM28XX_SAA7113,
139		.input          = { {
140			.type     = EM28XX_VMUX_TELEVISION,
141			.vmux     = SAA7115_COMPOSITE2,
142			.amux     = 0,
143		}, {
144			.type     = EM28XX_VMUX_COMPOSITE1,
145			.vmux     = SAA7115_COMPOSITE0,
146			.amux     = 1,
147		}, {
148			.type     = EM28XX_VMUX_SVIDEO,
149			.vmux     = SAA7115_SVIDEO3,
150			.amux     = 1,
151		} },
152	},
153	[EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
154		.name         = "Hauppauge WinTV USB 2",
155		.vchannels    = 3,
156		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
157		.tda9887_conf = TDA9887_PRESENT |
158				TDA9887_PORT1_ACTIVE|
159				TDA9887_PORT2_ACTIVE,
160		.decoder      = EM28XX_TVP5150,
161		.has_msp34xx  = 1,
162		/*FIXME: S-Video not tested */
163		.input          = { {
164			.type     = EM28XX_VMUX_TELEVISION,
165			.vmux     = TVP5150_COMPOSITE0,
166			.amux     = MSP_INPUT_DEFAULT,
167		}, {
168			.type     = EM28XX_VMUX_SVIDEO,
169			.vmux     = TVP5150_SVIDEO,
170			.amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
171					MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
172		} },
173	},
174	[EM2820_BOARD_DLINK_USB_TV] = {
175		.name         = "D-Link DUB-T210 TV Tuner",
176		.valid        = EM28XX_BOARD_NOT_VALIDATED,
177		.vchannels    = 3,
178		.is_em2800    = 0,
179		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
180		.tda9887_conf = TDA9887_PRESENT,
181		.decoder      = EM28XX_SAA7113,
182		.input          = { {
183			.type     = EM28XX_VMUX_TELEVISION,
184			.vmux     = SAA7115_COMPOSITE2,
185			.amux     = 1,
186		}, {
187			.type     = EM28XX_VMUX_COMPOSITE1,
188			.vmux     = SAA7115_COMPOSITE0,
189			.amux     = 1,
190		}, {
191			.type     = EM28XX_VMUX_SVIDEO,
192			.vmux     = SAA7115_SVIDEO3,
193			.amux     = 1,
194		} },
195	},
196	[EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
197		.name         = "Hercules Smart TV USB 2.0",
198		.valid        = EM28XX_BOARD_NOT_VALIDATED,
199		.vchannels    = 3,
200		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
201		.tda9887_conf = TDA9887_PRESENT,
202		.decoder      = EM28XX_SAA7113,
203		.input        = { {
204			.type     = EM28XX_VMUX_TELEVISION,
205			.vmux     = SAA7115_COMPOSITE2,
206			.amux     = 1,
207		}, {
208			.type     = EM28XX_VMUX_COMPOSITE1,
209			.vmux     = SAA7115_COMPOSITE0,
210			.amux     = 1,
211		}, {
212			.type     = EM28XX_VMUX_SVIDEO,
213			.vmux     = SAA7115_SVIDEO3,
214			.amux     = 1,
215		} },
216	},
217	[EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
218		.name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
219		.valid        = EM28XX_BOARD_NOT_VALIDATED,
220		.vchannels    = 3,
221		.is_em2800    = 0,
222		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
223		.tda9887_conf = TDA9887_PRESENT,
224		.decoder      = EM28XX_SAA7113,
225		.input          = { {
226			.type     = EM28XX_VMUX_TELEVISION,
227			.vmux     = SAA7115_COMPOSITE2,
228			.amux     = 0,
229		}, {
230			.type     = EM28XX_VMUX_COMPOSITE1,
231			.vmux     = SAA7115_COMPOSITE0,
232			.amux     = 1,
233		}, {
234			.type     = EM28XX_VMUX_SVIDEO,
235			.vmux     = SAA7115_SVIDEO3,
236			.amux     = 1,
237		} },
238	},
239	[EM2820_BOARD_GADMEI_UTV310] = {
240		.name         = "Gadmei UTV310",
241		.valid        = EM28XX_BOARD_NOT_VALIDATED,
242		.vchannels    = 3,
243		.tuner_type   = TUNER_TNF_5335MF,
244		.tda9887_conf = TDA9887_PRESENT,
245		.decoder      = EM28XX_SAA7113,
246		.input          = { {
247			.type     = EM28XX_VMUX_TELEVISION,
248			.vmux     = SAA7115_COMPOSITE1,
249			.amux     = 1,
250		}, {
251			.type     = EM28XX_VMUX_COMPOSITE1,
252			.vmux     = SAA7115_COMPOSITE0,
253			.amux     = 1,
254		}, {
255			.type     = EM28XX_VMUX_SVIDEO,
256			.vmux     = SAA7115_SVIDEO3,
257			.amux     = 1,
258		} },
259	},
260	[EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
261		.name         = "Leadtek Winfast USB II Deluxe",
262		.valid        = EM28XX_BOARD_NOT_VALIDATED,
263		.vchannels    = 3,
264		.tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
265		.tda9887_conf = TDA9887_PRESENT,
266		.decoder      = EM28XX_SAA7114,
267		.input          = { {
268			.type     = EM28XX_VMUX_TELEVISION,
269			.vmux     = 2,
270			.amux     = 0,
271		}, {
272			.type     = EM28XX_VMUX_COMPOSITE1,
273			.vmux     = 0,
274			.amux     = 1,
275		}, {
276			.type     = EM28XX_VMUX_SVIDEO,
277			.vmux     = 9,
278			.amux     = 1,
279		} },
280	},
281	[EM2820_BOARD_PINNACLE_DVC_100] = {
282		.name         = "Pinnacle Dazzle DVC 100",
283		.valid        = EM28XX_BOARD_NOT_VALIDATED,
284		.vchannels    = 3,
285		.decoder      = EM28XX_SAA7113,
286		.input          = { {
287			.type     = EM28XX_VMUX_COMPOSITE1,
288			.vmux     = SAA7115_COMPOSITE0,
289			.amux     = 1,
290		}, {
291			.type     = EM28XX_VMUX_SVIDEO,
292			.vmux     = SAA7115_SVIDEO3,
293			.amux     = 1,
294		} },
295	},
296	[EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
297		.name          = "Videology 20K14XUSB USB2.0",
298		.valid        = EM28XX_BOARD_NOT_VALIDATED,
299		.vchannels     = 1,
300		.input         = { {
301			.type     = EM28XX_VMUX_COMPOSITE1,
302			.vmux     = 0,
303			.amux     = 0,
304		} },
305	},
306	[EM2821_BOARD_PROLINK_PLAYTV_USB2] = {
307		.name         = "SIIG AVTuner-PVR/Prolink PlayTV USB 2.0",
308		.valid        = EM28XX_BOARD_NOT_VALIDATED,
309		.vchannels    = 3,
310		.is_em2800    = 0,
311		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,	/* unknown? */
312		.tda9887_conf = TDA9887_PRESENT,	/* unknown? */
313		.decoder      = EM28XX_SAA7113,
314		.input          = { {
315			.type     = EM28XX_VMUX_TELEVISION,
316			.vmux     = SAA7115_COMPOSITE2,
317			.amux     = 1,
318		}, {
319			.type     = EM28XX_VMUX_COMPOSITE1,
320			.vmux     = SAA7115_COMPOSITE0,
321			.amux     = 1,
322		}, {
323			.type     = EM28XX_VMUX_SVIDEO,
324			.vmux     = SAA7115_SVIDEO3,
325			.amux     = 1,
326		} },
327	},
328	[EM2821_BOARD_SUPERCOMP_USB_2] = {
329		.name         = "Supercomp USB 2.0 TV",
330		.valid        = EM28XX_BOARD_NOT_VALIDATED,
331		.vchannels    = 3,
332		.is_em2800    = 0,
333		.tuner_type   = TUNER_PHILIPS_FM1236_MK3,
334		.tda9887_conf = TDA9887_PRESENT |
335				TDA9887_PORT1_ACTIVE |
336				TDA9887_PORT2_ACTIVE,
337		.decoder      = EM28XX_SAA7113,
338		.input          = { {
339			.type     = EM28XX_VMUX_TELEVISION,
340			.vmux     = SAA7115_COMPOSITE2,
341			.amux     = 1,
342		}, {
343			.type     = EM28XX_VMUX_COMPOSITE1,
344			.vmux     = SAA7115_COMPOSITE0,
345			.amux     = 0,
346		}, {
347			.type     = EM28XX_VMUX_SVIDEO,
348			.vmux     = SAA7115_SVIDEO3,
349			.amux     = 1,
350		} },
351	},
352	[EM2821_BOARD_USBGEAR_VD204] = {
353		.name          = "Usbgear VD204v9",
354		.valid        = EM28XX_BOARD_NOT_VALIDATED,
355		.vchannels     = 2,
356		.decoder       = EM28XX_SAA7113,
357		.input          = { {
358			.type  = EM28XX_VMUX_COMPOSITE1,
359			.vmux  = SAA7115_COMPOSITE0,
360			.amux  = 1,
361		}, {
362			.type  = EM28XX_VMUX_SVIDEO,
363			.vmux  = SAA7115_SVIDEO3,
364			.amux  = 1,
365		} },
366	},
367	[EM2860_BOARD_NETGMBH_CAM] = {
368		/* Beijing Huaqi Information Digital Technology Co., Ltd */
369		.name          = "NetGMBH Cam",
370		.valid       = EM28XX_BOARD_NOT_VALIDATED,
371		.vchannels     = 1,
372		.input         = { {
373			.type     = EM28XX_VMUX_COMPOSITE1,
374			.vmux     = 0,
375			.amux     = 0,
376		} },
377	},
378	[EM2860_BOARD_TYPHOON_DVD_MAKER] = {
379		.name          = "Typhoon DVD Maker",
380		.valid        = EM28XX_BOARD_NOT_VALIDATED,
381		.vchannels     = 2,
382		.decoder       = EM28XX_SAA7113,
383		.input          = { {
384			.type  = EM28XX_VMUX_COMPOSITE1,
385			.vmux  = SAA7115_COMPOSITE0,
386			.amux  = 1,
387		}, {
388			.type  = EM28XX_VMUX_SVIDEO,
389			.vmux  = SAA7115_SVIDEO3,
390			.amux  = 1,
391		} },
392	},
393	[EM2860_BOARD_GADMEI_UTV330] = {
394		.name         = "Gadmei UTV330",
395		.valid        = EM28XX_BOARD_NOT_VALIDATED,
396		.vchannels    = 3,
397		.tuner_type   = TUNER_TNF_5335MF,
398		.tda9887_conf = TDA9887_PRESENT,
399		.decoder      = EM28XX_SAA7113,
400		.input          = { {
401			.type     = EM28XX_VMUX_TELEVISION,
402			.vmux     = SAA7115_COMPOSITE2,
403			.amux     = 0,
404		}, {
405			.type     = EM28XX_VMUX_COMPOSITE1,
406			.vmux     = SAA7115_COMPOSITE0,
407			.amux     = 1,
408		}, {
409			.type     = EM28XX_VMUX_SVIDEO,
410			.vmux     = SAA7115_SVIDEO3,
411			.amux     = 1,
412		} },
413	},
414	[EM2860_BOARD_TERRATEC_HYBRID_XS] = {
415		.name         = "Terratec Cinergy A Hybrid XS",
416		.valid        = EM28XX_BOARD_NOT_VALIDATED,
417		.vchannels    = 3,
418		.tuner_type   = TUNER_XC2028,
419		.decoder      = EM28XX_TVP5150,
420		.input          = { {
421			.type     = EM28XX_VMUX_TELEVISION,
422			.vmux     = TVP5150_COMPOSITE0,
423			.amux     = 0,
424		}, {
425			.type     = EM28XX_VMUX_COMPOSITE1,
426			.vmux     = TVP5150_COMPOSITE1,
427			.amux     = 1,
428		}, {
429			.type     = EM28XX_VMUX_SVIDEO,
430			.vmux     = TVP5150_SVIDEO,
431			.amux     = 1,
432		} },
433	},
434	[EM2861_BOARD_KWORLD_PVRTV_300U] = {
435		.name	      = "KWorld PVRTV 300U",
436		.valid        = EM28XX_BOARD_NOT_VALIDATED,
437		.vchannels    = 3,
438		.tuner_type   = TUNER_XC2028,
439		.decoder      = EM28XX_TVP5150,
440		.input          = { {
441			.type     = EM28XX_VMUX_TELEVISION,
442			.vmux     = TVP5150_COMPOSITE0,
443			.amux     = 0,
444		}, {
445			.type     = EM28XX_VMUX_COMPOSITE1,
446			.vmux     = TVP5150_COMPOSITE1,
447			.amux     = 1,
448		}, {
449			.type     = EM28XX_VMUX_SVIDEO,
450			.vmux     = TVP5150_SVIDEO,
451			.amux     = 1,
452		} },
453	},
454	[EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
455		.name          = "Yakumo MovieMixer",
456		.valid       = EM28XX_BOARD_NOT_VALIDATED,
457		.vchannels     = 1,
458		.decoder       = EM28XX_TVP5150,
459		.input         = { {
460			.type     = EM28XX_VMUX_TELEVISION,
461			.vmux     = TVP5150_COMPOSITE0,
462			.amux     = 0,
463		}, {
464			.type     = EM28XX_VMUX_COMPOSITE1,
465			.vmux     = TVP5150_COMPOSITE1,
466			.amux     = 1,
467		}, {
468			.type     = EM28XX_VMUX_SVIDEO,
469			.vmux     = TVP5150_SVIDEO,
470			.amux     = 1,
471		} },
472	},
473	[EM2861_BOARD_PLEXTOR_PX_TV100U] = {
474		.name         = "Plextor ConvertX PX-TV100U",
475		.valid        = EM28XX_BOARD_NOT_VALIDATED,
476		.vchannels    = 3,
477		.tuner_type   = TUNER_TNF_5335MF,
478		.tda9887_conf = TDA9887_PRESENT,
479		.decoder      = EM28XX_TVP5150,
480		.input          = { {
481			.type     = EM28XX_VMUX_TELEVISION,
482			.vmux     = TVP5150_COMPOSITE0,
483			.amux     = 1,
484		}, {
485			.type     = EM28XX_VMUX_COMPOSITE1,
486			.vmux     = TVP5150_COMPOSITE1,
487			.amux     = 1,
488		}, {
489			.type     = EM28XX_VMUX_SVIDEO,
490			.vmux     = TVP5150_SVIDEO,
491			.amux     = 1,
492		} },
493	},
494	[EM2870_BOARD_TERRATEC_XS] = {
495		.name         = "Terratec Cinergy T XS",
496		.valid        = EM28XX_BOARD_NOT_VALIDATED,
497		.tuner_type   = TUNER_XC2028,
498	},
499	[EM2870_BOARD_TERRATEC_XS_MT2060] = {
500		.name         = "Terratec Cinergy T XS (MT2060)",
501		.valid        = EM28XX_BOARD_NOT_VALIDATED,
502		.tuner_type   = TUNER_ABSENT, /* MT2060 */
503	},
504	[EM2870_BOARD_KWORLD_350U] = {
505		.name         = "Kworld 350 U DVB-T",
506		.valid        = EM28XX_BOARD_NOT_VALIDATED,
507		.tuner_type   = TUNER_XC2028,
508	},
509	[EM2870_BOARD_KWORLD_355U] = {
510		.name         = "Kworld 355 U DVB-T",
511		.valid        = EM28XX_BOARD_NOT_VALIDATED,
512	},
513	[EM2870_BOARD_PINNACLE_PCTV_DVB] = {
514		.name         = "Pinnacle PCTV DVB-T",
515		.valid        = EM28XX_BOARD_NOT_VALIDATED,
516		.tuner_type   = TUNER_ABSENT, /* MT2060 */
517	},
518	[EM2870_BOARD_COMPRO_VIDEOMATE] = {
519		.name         = "Compro, VideoMate U3",
520		.valid        = EM28XX_BOARD_NOT_VALIDATED,
521		.tuner_type   = TUNER_ABSENT, /* MT2060 */
522	},
523	[EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
524		.name         = "Terratec Hybrid XS Secam",
525		.valid        = EM28XX_BOARD_NOT_VALIDATED,
526		.vchannels    = 3,
527		.has_msp34xx  = 1,
528		.tuner_type   = TUNER_XC2028,
529		.decoder      = EM28XX_TVP5150,
530		.input          = { {
531			.type     = EM28XX_VMUX_TELEVISION,
532			.vmux     = TVP5150_COMPOSITE0,
533			.amux     = 0,
534		}, {
535			.type     = EM28XX_VMUX_COMPOSITE1,
536			.vmux     = TVP5150_COMPOSITE1,
537			.amux     = 1,
538		}, {
539			.type     = EM28XX_VMUX_SVIDEO,
540			.vmux     = TVP5150_SVIDEO,
541			.amux     = 1,
542		} },
543	},
544	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
545		.name         = "Hauppauge WinTV HVR 900",
546		.vchannels    = 3,
547		.tda9887_conf = TDA9887_PRESENT,
548		.tuner_type   = TUNER_XC2028,
549		.mts_firmware = 1,
550		.has_dvb        = 1,
551		.decoder      = EM28XX_TVP5150,
552		.input          = { {
553			.type     = EM28XX_VMUX_TELEVISION,
554			.vmux     = TVP5150_COMPOSITE0,
555			.amux     = 0,
556		}, {
557			.type     = EM28XX_VMUX_COMPOSITE1,
558			.vmux     = TVP5150_COMPOSITE1,
559			.amux     = 1,
560		}, {
561			.type     = EM28XX_VMUX_SVIDEO,
562			.vmux     = TVP5150_SVIDEO,
563			.amux     = 1,
564		} },
565	},
566	[EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
567		.name         = "Hauppauge WinTV HVR 900 (R2)",
568		.vchannels    = 3,
569		.tda9887_conf = TDA9887_PRESENT,
570		.tuner_type   = TUNER_XC2028,
571		.mts_firmware = 1,
572		.decoder      = EM28XX_TVP5150,
573		.input          = { {
574			.type     = EM28XX_VMUX_TELEVISION,
575			.vmux     = TVP5150_COMPOSITE0,
576			.amux     = 0,
577		}, {
578			.type     = EM28XX_VMUX_COMPOSITE1,
579			.vmux     = TVP5150_COMPOSITE1,
580			.amux     = 3,
581		}, {
582			.type     = EM28XX_VMUX_SVIDEO,
583			.vmux     = TVP5150_SVIDEO,
584			.amux     = 1,
585		} },
586	},
587	[EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
588		.name           = "Hauppauge WinTV HVR 950",
589		.vchannels      = 3,
590		.tda9887_conf   = TDA9887_PRESENT,
591		.tuner_type     = TUNER_XC2028,
592		.mts_firmware   = 1,
593		.has_12mhz_i2s  = 1,
594		.has_dvb        = 1,
595		.ir_codes       = ir_codes_hauppauge_new,
596		.decoder        = EM28XX_TVP5150,
597		.input          = { {
598			.type     = EM28XX_VMUX_TELEVISION,
599			.vmux     = TVP5150_COMPOSITE0,
600			.amux     = 0,
601		}, {
602			.type     = EM28XX_VMUX_COMPOSITE1,
603			.vmux     = TVP5150_COMPOSITE1,
604			.amux     = 1,
605		}, {
606			.type     = EM28XX_VMUX_SVIDEO,
607			.vmux     = TVP5150_SVIDEO,
608			.amux     = 1,
609		} },
610	},
611	[EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
612		.name           = "Pinnacle PCTV HD Pro Stick",
613		.vchannels      = 3,
614		.tda9887_conf   = TDA9887_PRESENT,
615		.tuner_type     = TUNER_XC2028,
616		.mts_firmware   = 1,
617		.has_12mhz_i2s  = 1,
618		.has_dvb        = 1,
619		.ir_codes       = ir_codes_pinnacle_pctv_hd,
620		.decoder        = EM28XX_TVP5150,
621		.input          = { {
622			.type     = EM28XX_VMUX_TELEVISION,
623			.vmux     = TVP5150_COMPOSITE0,
624			.amux     = 0,
625		}, {
626			.type     = EM28XX_VMUX_COMPOSITE1,
627			.vmux     = TVP5150_COMPOSITE1,
628			.amux     = 1,
629		}, {
630			.type     = EM28XX_VMUX_SVIDEO,
631			.vmux     = TVP5150_SVIDEO,
632			.amux     = 1,
633		} },
634	},
635	[EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
636		.name           = "AMD ATI TV Wonder HD 600",
637		.vchannels      = 3,
638		.tda9887_conf   = TDA9887_PRESENT,
639		.tuner_type     = TUNER_XC2028,
640		.mts_firmware   = 1,
641		.has_12mhz_i2s  = 1,
642		.has_dvb        = 1,
643		.ir_codes       = ir_codes_ati_tv_wonder_hd_600,
644		.decoder        = EM28XX_TVP5150,
645		.input          = { {
646			.type     = EM28XX_VMUX_TELEVISION,
647			.vmux     = TVP5150_COMPOSITE0,
648			.amux     = 0,
649		}, {
650			.type     = EM28XX_VMUX_COMPOSITE1,
651			.vmux     = TVP5150_COMPOSITE1,
652			.amux     = 1,
653		}, {
654			.type     = EM28XX_VMUX_SVIDEO,
655			.vmux     = TVP5150_SVIDEO,
656			.amux     = 1,
657		} },
658	},
659	[EM2880_BOARD_TERRATEC_HYBRID_XS] = {
660		.name         = "Terratec Hybrid XS",
661		.vchannels    = 3,
662		.tda9887_conf = TDA9887_PRESENT,
663		.tuner_type   = TUNER_XC2028,
664		.decoder      = EM28XX_TVP5150,
665		.has_dvb        = 1,
666		.input          = { {
667			.type     = EM28XX_VMUX_TELEVISION,
668			.vmux     = TVP5150_COMPOSITE0,
669			.amux     = 0,
670		}, {
671			.type     = EM28XX_VMUX_COMPOSITE1,
672			.vmux     = TVP5150_COMPOSITE1,
673			.amux     = 1,
674		}, {
675			.type     = EM28XX_VMUX_SVIDEO,
676			.vmux     = TVP5150_SVIDEO,
677			.amux     = 1,
678		} },
679	},
680	/* maybe there's a reason behind it why Terratec sells the Hybrid XS
681	   as Prodigy XS with a different PID, let's keep it separated for now
682	   maybe we'll need it lateron */
683	[EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
684		.name         = "Terratec Prodigy XS",
685		.vchannels    = 3,
686		.tda9887_conf = TDA9887_PRESENT,
687		.tuner_type   = TUNER_XC2028,
688		.decoder      = EM28XX_TVP5150,
689		.input          = { {
690			.type     = EM28XX_VMUX_TELEVISION,
691			.vmux     = TVP5150_COMPOSITE0,
692			.amux     = 0,
693		}, {
694			.type     = EM28XX_VMUX_COMPOSITE1,
695			.vmux     = TVP5150_COMPOSITE1,
696			.amux     = 1,
697		}, {
698			.type     = EM28XX_VMUX_SVIDEO,
699			.vmux     = TVP5150_SVIDEO,
700			.amux     = 1,
701		} },
702	},
703	[EM2820_BOARD_MSI_VOX_USB_2] = {
704		.name		   = "MSI VOX USB 2.0",
705		.vchannels	   = 3,
706		.tuner_type	   = TUNER_LG_PAL_NEW_TAPC,
707		.tda9887_conf	   = TDA9887_PRESENT      |
708				     TDA9887_PORT1_ACTIVE |
709				     TDA9887_PORT2_ACTIVE,
710		.max_range_640_480 = 1,
711
712		.decoder           = EM28XX_SAA7114,
713		.input             = { {
714			.type      = EM28XX_VMUX_TELEVISION,
715			.vmux      = SAA7115_COMPOSITE4,
716			.amux      = 0,
717		}, {
718			.type      = EM28XX_VMUX_COMPOSITE1,
719			.vmux      = SAA7115_COMPOSITE0,
720			.amux      = 1,
721		}, {
722			.type      = EM28XX_VMUX_SVIDEO,
723			.vmux      = SAA7115_SVIDEO3,
724			.amux      = 1,
725		} },
726	},
727	[EM2800_BOARD_TERRATEC_CINERGY_200] = {
728		.name         = "Terratec Cinergy 200 USB",
729		.is_em2800    = 1,
730		.vchannels    = 3,
731		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
732		.tda9887_conf = TDA9887_PRESENT,
733		.decoder      = EM28XX_SAA7113,
734		.input          = { {
735			.type     = EM28XX_VMUX_TELEVISION,
736			.vmux     = SAA7115_COMPOSITE2,
737			.amux     = 0,
738		}, {
739			.type     = EM28XX_VMUX_COMPOSITE1,
740			.vmux     = SAA7115_COMPOSITE0,
741			.amux     = 1,
742		}, {
743			.type     = EM28XX_VMUX_SVIDEO,
744			.vmux     = SAA7115_SVIDEO3,
745			.amux     = 1,
746		} },
747	},
748	[EM2800_BOARD_GRABBEEX_USB2800] = {
749		.name         = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
750		.is_em2800    = 1,
751		.vchannels    = 2,
752		.decoder      = EM28XX_SAA7113,
753		.input          = { {
754			.type     = EM28XX_VMUX_COMPOSITE1,
755			.vmux     = SAA7115_COMPOSITE0,
756			.amux     = 1,
757		}, {
758			.type     = EM28XX_VMUX_SVIDEO,
759			.vmux     = SAA7115_SVIDEO3,
760			.amux     = 1,
761		} },
762	},
763	[EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
764		.name         = "Leadtek Winfast USB II",
765		.is_em2800    = 1,
766		.vchannels    = 3,
767		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
768		.tda9887_conf = TDA9887_PRESENT,
769		.decoder      = EM28XX_SAA7113,
770		.input          = { {
771			.type     = EM28XX_VMUX_TELEVISION,
772			.vmux     = SAA7115_COMPOSITE2,
773			.amux     = 0,
774		}, {
775			.type     = EM28XX_VMUX_COMPOSITE1,
776			.vmux     = SAA7115_COMPOSITE0,
777			.amux     = 1,
778		}, {
779			.type     = EM28XX_VMUX_SVIDEO,
780			.vmux     = SAA7115_SVIDEO3,
781			.amux     = 1,
782		} },
783	},
784	[EM2800_BOARD_KWORLD_USB2800] = {
785		.name         = "Kworld USB2800",
786		.is_em2800    = 1,
787		.vchannels    = 3,
788		.tuner_type   = TUNER_PHILIPS_FCV1236D,
789		.tda9887_conf = TDA9887_PRESENT,
790		.decoder      = EM28XX_SAA7113,
791		.input          = { {
792			.type     = EM28XX_VMUX_TELEVISION,
793			.vmux     = SAA7115_COMPOSITE2,
794			.amux     = 0,
795		}, {
796			.type     = EM28XX_VMUX_COMPOSITE1,
797			.vmux     = SAA7115_COMPOSITE0,
798			.amux     = 1,
799		}, {
800			.type     = EM28XX_VMUX_SVIDEO,
801			.vmux     = SAA7115_SVIDEO3,
802			.amux     = 1,
803		} },
804	},
805	[EM2820_BOARD_PINNACLE_DVC_90] = {
806		.name         = "Pinnacle Dazzle DVC 90/DVC 100",
807		.vchannels    = 3,
808		.tuner_type   = TUNER_ABSENT,
809		.decoder      = EM28XX_SAA7113,
810		.input          = { {
811			.type     = EM28XX_VMUX_COMPOSITE1,
812			.vmux     = SAA7115_COMPOSITE0,
813			.amux     = 1,
814		}, {
815			.type     = EM28XX_VMUX_SVIDEO,
816			.vmux     = SAA7115_SVIDEO3,
817			.amux     = 1,
818		} },
819	},
820	[EM2800_BOARD_VGEAR_POCKETTV] = {
821		.name         = "V-Gear PocketTV",
822		.is_em2800    = 1,
823		.vchannels    = 3,
824		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
825		.tda9887_conf = TDA9887_PRESENT,
826		.decoder      = EM28XX_SAA7113,
827		.input          = { {
828			.type     = EM28XX_VMUX_TELEVISION,
829			.vmux     = SAA7115_COMPOSITE2,
830			.amux     = 0,
831		}, {
832			.type     = EM28XX_VMUX_COMPOSITE1,
833			.vmux     = SAA7115_COMPOSITE0,
834			.amux     = 1,
835		}, {
836			.type     = EM28XX_VMUX_SVIDEO,
837			.vmux     = SAA7115_SVIDEO3,
838			.amux     = 1,
839		} },
840	},
841	[EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
842		.name         = "Pixelview Prolink PlayTV USB 2.0",
843		.vchannels    = 3,
844		.tda9887_conf = TDA9887_PRESENT,
845		.tuner_type   = TUNER_YMEC_TVF_5533MF,
846		.decoder      = EM28XX_SAA7113,
847		.input          = { {
848			.type     = EM28XX_VMUX_TELEVISION,
849			.vmux     = SAA7115_COMPOSITE2,
850			.amux     = EM28XX_AMUX_LINE_IN,
851		}, {
852			.type     = EM28XX_VMUX_COMPOSITE1,
853			.vmux     = SAA7115_COMPOSITE0,
854			.amux     = EM28XX_AMUX_LINE_IN,
855		}, {
856			.type     = EM28XX_VMUX_SVIDEO,
857			.vmux     = SAA7115_SVIDEO3,
858			.amux     = EM28XX_AMUX_LINE_IN,
859		} },
860	},
861	[EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = {
862		.name         = "PointNix Intra-Oral Camera",
863		.has_snapshot_button = 1,
864		.vchannels    = 1,
865		.tda9887_conf = TDA9887_PRESENT,
866		.tuner_type   = TUNER_ABSENT,
867		.decoder      = EM28XX_SAA7113,
868		.input          = { {
869			.type     = EM28XX_VMUX_SVIDEO,
870			.vmux     = SAA7115_SVIDEO3,
871			.amux     = 0,
872		} },
873	},
874	[EM2880_BOARD_MSI_DIGIVOX_AD] = {
875		.name         = "MSI DigiVox A/D",
876		.valid        = EM28XX_BOARD_NOT_VALIDATED,
877		.vchannels    = 3,
878		.tuner_type   = TUNER_XC2028,
879		.decoder      = EM28XX_TVP5150,
880		.input          = { {
881			.type     = EM28XX_VMUX_TELEVISION,
882			.vmux     = TVP5150_COMPOSITE0,
883			.amux     = 0,
884		}, {
885			.type     = EM28XX_VMUX_COMPOSITE1,
886			.vmux     = TVP5150_COMPOSITE1,
887			.amux     = 1,
888		}, {
889			.type     = EM28XX_VMUX_SVIDEO,
890			.vmux     = TVP5150_SVIDEO,
891			.amux     = 1,
892		} },
893	},
894	[EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
895		.name         = "MSI DigiVox A/D II",
896		.valid        = EM28XX_BOARD_NOT_VALIDATED,
897		.vchannels    = 3,
898		.tuner_type   = TUNER_XC2028,
899		.decoder      = EM28XX_TVP5150,
900		.input          = { {
901			.type     = EM28XX_VMUX_TELEVISION,
902			.vmux     = TVP5150_COMPOSITE0,
903			.amux     = 0,
904		}, {
905			.type     = EM28XX_VMUX_COMPOSITE1,
906			.vmux     = TVP5150_COMPOSITE1,
907			.amux     = 1,
908		}, {
909			.type     = EM28XX_VMUX_SVIDEO,
910			.vmux     = TVP5150_SVIDEO,
911			.amux     = 1,
912		} },
913	},
914	[EM2880_BOARD_KWORLD_DVB_305U] = {
915		.name	      = "KWorld DVB-T 305U",
916		.valid        = EM28XX_BOARD_NOT_VALIDATED,
917		.vchannels    = 3,
918		.tuner_type   = TUNER_XC2028,
919		.decoder      = EM28XX_TVP5150,
920		.input          = { {
921			.type     = EM28XX_VMUX_TELEVISION,
922			.vmux     = TVP5150_COMPOSITE0,
923			.amux     = 0,
924		}, {
925			.type     = EM28XX_VMUX_COMPOSITE1,
926			.vmux     = TVP5150_COMPOSITE1,
927			.amux     = 1,
928		}, {
929			.type     = EM28XX_VMUX_SVIDEO,
930			.vmux     = TVP5150_SVIDEO,
931			.amux     = 1,
932		} },
933	},
934	[EM2880_BOARD_KWORLD_DVB_310U] = {
935		.name	      = "KWorld DVB-T 310U",
936		.vchannels    = 3,
937		.tuner_type   = TUNER_XC2028,
938		.has_dvb      = 1,
939		.mts_firmware = 1,
940		.decoder      = EM28XX_TVP5150,
941		.input          = { {
942			.type     = EM28XX_VMUX_TELEVISION,
943			.vmux     = TVP5150_COMPOSITE0,
944			.amux     = EM28XX_AMUX_VIDEO,
945		}, {
946			.type     = EM28XX_VMUX_COMPOSITE1,
947			.vmux     = TVP5150_COMPOSITE1,
948			.amux     = EM28XX_AMUX_AC97_LINE_IN,
949		}, {	/* S-video has not been tested yet */
950			.type     = EM28XX_VMUX_SVIDEO,
951			.vmux     = TVP5150_SVIDEO,
952			.amux     = EM28XX_AMUX_AC97_LINE_IN,
953		} },
954	},
955	[EM2881_BOARD_DNT_DA2_HYBRID] = {
956		.name         = "DNT DA2 Hybrid",
957		.valid        = EM28XX_BOARD_NOT_VALIDATED,
958		.vchannels    = 3,
959		.tuner_type   = TUNER_XC2028,
960		.decoder      = EM28XX_TVP5150,
961		.input          = { {
962			.type     = EM28XX_VMUX_TELEVISION,
963			.vmux     = TVP5150_COMPOSITE0,
964			.amux     = 0,
965		}, {
966			.type     = EM28XX_VMUX_COMPOSITE1,
967			.vmux     = TVP5150_COMPOSITE1,
968			.amux     = 1,
969		}, {
970			.type     = EM28XX_VMUX_SVIDEO,
971			.vmux     = TVP5150_SVIDEO,
972			.amux     = 1,
973		} },
974	},
975	[EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
976		.name         = "Pinnacle Hybrid Pro",
977		.valid        = EM28XX_BOARD_NOT_VALIDATED,
978		.vchannels    = 3,
979		.tuner_type   = TUNER_XC2028,
980		.decoder      = EM28XX_TVP5150,
981		.input          = { {
982			.type     = EM28XX_VMUX_TELEVISION,
983			.vmux     = TVP5150_COMPOSITE0,
984			.amux     = 0,
985		}, {
986			.type     = EM28XX_VMUX_COMPOSITE1,
987			.vmux     = TVP5150_COMPOSITE1,
988			.amux     = 1,
989		}, {
990			.type     = EM28XX_VMUX_SVIDEO,
991			.vmux     = TVP5150_SVIDEO,
992			.amux     = 1,
993		} },
994	},
995	[EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
996		.name         = "Pinnacle Hybrid Pro (2)",
997		.valid        = EM28XX_BOARD_NOT_VALIDATED,
998		.vchannels    = 3,
999		.tuner_type   = TUNER_XC2028,
1000		.mts_firmware = 1,
1001		.decoder      = EM28XX_TVP5150,
1002		.input          = { {
1003			.type     = EM28XX_VMUX_TELEVISION,
1004			.vmux     = TVP5150_COMPOSITE0,
1005			.amux     = 0,
1006		}, {
1007			.type     = EM28XX_VMUX_COMPOSITE1,
1008			.vmux     = TVP5150_COMPOSITE1,
1009			.amux     = 1,
1010		}, {
1011			.type     = EM28XX_VMUX_SVIDEO,
1012			.vmux     = TVP5150_SVIDEO,
1013			.amux     = 1,
1014		} },
1015	},
1016	[EM2882_BOARD_KWORLD_VS_DVBT] = {
1017		.name         = "Kworld VS-DVB-T 323UR",
1018		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1019		.vchannels    = 3,
1020		.tuner_type   = TUNER_XC2028,
1021		.decoder      = EM28XX_TVP5150,
1022		.input          = { {
1023			.type     = EM28XX_VMUX_TELEVISION,
1024			.vmux     = TVP5150_COMPOSITE0,
1025			.amux     = 0,
1026		}, {
1027			.type     = EM28XX_VMUX_COMPOSITE1,
1028			.vmux     = TVP5150_COMPOSITE1,
1029			.amux     = 1,
1030		}, {
1031			.type     = EM28XX_VMUX_SVIDEO,
1032			.vmux     = TVP5150_SVIDEO,
1033			.amux     = 1,
1034		} },
1035	},
1036	[EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1037		.name         = "Terratec Hybrid XS (em2882)",
1038		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1039		.vchannels    = 3,
1040		.tuner_type   = TUNER_XC2028,
1041		.decoder      = EM28XX_TVP5150,
1042		.input          = { {
1043			.type     = EM28XX_VMUX_TELEVISION,
1044			.vmux     = TVP5150_COMPOSITE0,
1045			.amux     = 0,
1046		}, {
1047			.type     = EM28XX_VMUX_COMPOSITE1,
1048			.vmux     = TVP5150_COMPOSITE1,
1049			.amux     = 1,
1050		}, {
1051			.type     = EM28XX_VMUX_SVIDEO,
1052			.vmux     = TVP5150_SVIDEO,
1053			.amux     = 1,
1054		} },
1055	},
1056	[EM2883_BOARD_KWORLD_HYBRID_A316] = {
1057		.name         = "Kworld PlusTV HD Hybrid 330",
1058		.valid        = EM28XX_BOARD_NOT_VALIDATED,
1059		.vchannels    = 3,
1060		.is_em2800    = 0,
1061		.tuner_type   = TUNER_XC2028,
1062		.decoder      = EM28XX_TVP5150,
1063		.input          = { {
1064			.type     = EM28XX_VMUX_TELEVISION,
1065			.vmux     = TVP5150_COMPOSITE0,
1066			.amux     = 0,
1067		}, {
1068			.type     = EM28XX_VMUX_COMPOSITE1,
1069			.vmux     = TVP5150_COMPOSITE1,
1070			.amux     = 1,
1071		}, {
1072			.type     = EM28XX_VMUX_SVIDEO,
1073			.vmux     = TVP5150_SVIDEO,
1074			.amux     = 1,
1075		} },
1076	},
1077	[EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
1078		.name         = "Compro VideoMate ForYou/Stereo",
1079		.vchannels    = 2,
1080		.tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1081		.tda9887_conf = TDA9887_PRESENT,
1082		.decoder      = EM28XX_TVP5150,
1083		.input          = { {
1084			.type     = EM28XX_VMUX_TELEVISION,
1085			.vmux     = TVP5150_COMPOSITE0,
1086			.amux     = EM28XX_AMUX_LINE_IN,
1087		}, {
1088			.type     = EM28XX_VMUX_SVIDEO,
1089			.vmux     = TVP5150_SVIDEO,
1090			.amux     = EM28XX_AMUX_LINE_IN,
1091		} },
1092	},
1093	[EM2874_BOARD_PINNACLE_PCTV_80E] = {
1094		.name         = "Pinnacle PCTV HD Mini",
1095		.vchannels    = 0,
1096		.tuner_type   = TUNER_ABSENT,
1097		.has_dvb        = 1,
1098		.ir_codes       = ir_codes_pinnacle_pctv_hd,
1099		.decoder      = EM28XX_NODECODER,
1100#ifdef DJH_DEBUG
1101		.input          = { {
1102			.type     = EM28XX_VMUX_TELEVISION,
1103			.vmux     = TVP5150_COMPOSITE0,
1104			.amux     = EM28XX_AMUX_LINE_IN,
1105		} },
1106#endif
1107	},
1108};
1109const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
1110
1111/* table of devices that work with this driver */
1112struct usb_device_id em28xx_id_table [] = {
1113	{ USB_DEVICE(0xeb1a, 0x2750),
1114			.driver_info = EM2750_BOARD_UNKNOWN },
1115	{ USB_DEVICE(0xeb1a, 0x2751),
1116			.driver_info = EM2750_BOARD_UNKNOWN },
1117	{ USB_DEVICE(0xeb1a, 0x2800),
1118			.driver_info = EM2800_BOARD_UNKNOWN },
1119	{ USB_DEVICE(0xeb1a, 0x2820),
1120			.driver_info = EM2820_BOARD_UNKNOWN },
1121	{ USB_DEVICE(0xeb1a, 0x2821),
1122			.driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 },
1123	{ USB_DEVICE(0xeb1a, 0x2860),
1124			.driver_info = EM2820_BOARD_UNKNOWN },
1125	{ USB_DEVICE(0xeb1a, 0x2861),
1126			.driver_info = EM2820_BOARD_UNKNOWN },
1127	{ USB_DEVICE(0xeb1a, 0x2870),
1128			.driver_info = EM2820_BOARD_UNKNOWN },
1129	{ USB_DEVICE(0xeb1a, 0x2881),
1130			.driver_info = EM2820_BOARD_UNKNOWN },
1131	{ USB_DEVICE(0xeb1a, 0x2883),
1132			.driver_info = EM2820_BOARD_UNKNOWN },
1133	{ USB_DEVICE(0xeb1a, 0xe300),
1134			.driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
1135	{ USB_DEVICE(0xeb1a, 0xe305),
1136			.driver_info = EM2880_BOARD_KWORLD_DVB_305U },
1137	{ USB_DEVICE(0xeb1a, 0xe310),
1138			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
1139	{ USB_DEVICE(0xeb1a, 0xa316),
1140			.driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 },
1141	{ USB_DEVICE(0xeb1a, 0xe320),
1142			.driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
1143	{ USB_DEVICE(0xeb1a, 0xe323),
1144			.driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
1145	{ USB_DEVICE(0xeb1a, 0xe350),
1146			.driver_info = EM2870_BOARD_KWORLD_350U },
1147	{ USB_DEVICE(0xeb1a, 0xe355),
1148			.driver_info = EM2870_BOARD_KWORLD_355U },
1149	{ USB_DEVICE(0xeb1a, 0x2801),
1150			.driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
1151	{ USB_DEVICE(0xeb1a, 0xe357),
1152			.driver_info = EM2870_BOARD_KWORLD_355U },
1153	{ USB_DEVICE(0x0ccd, 0x0036),
1154			.driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
1155	{ USB_DEVICE(0x0ccd, 0x004c),
1156			.driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
1157	{ USB_DEVICE(0x0ccd, 0x004f),
1158			.driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
1159	{ USB_DEVICE(0x0ccd, 0x005e),
1160			.driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
1161	{ USB_DEVICE(0x0ccd, 0x0042),
1162			.driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
1163	{ USB_DEVICE(0x0ccd, 0x0043),
1164			.driver_info = EM2870_BOARD_TERRATEC_XS },
1165	{ USB_DEVICE(0x0ccd, 0x0047),
1166			.driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
1167	{ USB_DEVICE(0x185b, 0x2870),
1168			.driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
1169	{ USB_DEVICE(0x185b, 0x2041),
1170			.driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
1171	{ USB_DEVICE(0x2040, 0x4200),
1172			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1173	{ USB_DEVICE(0x2040, 0x4201),
1174			.driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1175	{ USB_DEVICE(0x2040, 0x6500),
1176			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
1177	{ USB_DEVICE(0x2040, 0x6502),
1178			.driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
1179	{ USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
1180			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1181	{ USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
1182			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1183	{ USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
1184			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1185	{ USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */
1186			.driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1187	{ USB_DEVICE(0x0438, 0xb002),
1188			.driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
1189	{ USB_DEVICE(0x2001, 0xf112),
1190			.driver_info = EM2820_BOARD_DLINK_USB_TV },
1191	{ USB_DEVICE(0x2304, 0x0207),
1192			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1193	{ USB_DEVICE(0x2304, 0x0208),
1194			.driver_info = EM2820_BOARD_PINNACLE_USB_2 },
1195	{ USB_DEVICE(0x2304, 0x021a),
1196			.driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1197	{ USB_DEVICE(0x2304, 0x0226),
1198			.driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
1199	{ USB_DEVICE(0x2304, 0x0227),
1200			.driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
1201	{ USB_DEVICE(0x2304, 0x023f),
1202			.driver_info = EM2874_BOARD_PINNACLE_PCTV_80E },
1203	{ USB_DEVICE(0x0413, 0x6023),
1204			.driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
1205	{ USB_DEVICE(0x093b, 0xa005),
1206			.driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
1207	{ },
1208};
1209MODULE_DEVICE_TABLE(usb, em28xx_id_table);
1210
1211/*
1212 *  Reset sequences for analog/digital modes
1213 */
1214
1215/* Reset for the most [analog] boards */
1216static struct em28xx_reg_seq default_analog[] = {
1217	{EM28XX_R08_GPIO,	0x6d,   ~EM_GPIO_4,	10},
1218	{	-1,		-1,	-1,		-1},
1219};
1220
1221/* Reset for the most [digital] boards */
1222static struct em28xx_reg_seq default_digital[] = {
1223	{EM28XX_R08_GPIO,	0x6e,	~EM_GPIO_4,	10},
1224	{	-1,		-1,	-1,		-1},
1225};
1226
1227/* Board Hauppauge WinTV HVR 900 analog */
1228static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
1229	{EM28XX_R08_GPIO,	0x2d,	~EM_GPIO_4,	10},
1230	{0x05,			0xff,	0x10,		10},
1231	{  -1,			-1,	-1,		-1},
1232};
1233
1234/* Board Hauppauge WinTV HVR 900 digital */
1235static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
1236	{EM28XX_R08_GPIO,	0x2e,	~EM_GPIO_4,	10},
1237	{EM2880_R04_GPO,	0x04,	0x0f,		10},
1238	{EM2880_R04_GPO,	0x0c,	0x0f,		10},
1239	{ -1,			-1,	-1,		-1},
1240};
1241
1242/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
1243static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
1244	{EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,	 10},
1245	{	-1,		-1,	-1,		 -1},
1246};
1247
1248/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
1249static struct em28xx_reg_seq em2880_msi_digivox_ad_digital[] = {
1250	{EM28XX_R08_GPIO,	0x6a,	~EM_GPIO_4,	10},
1251	{	-1,		-1,	-1,		-1},
1252};
1253
1254/* Board  - EM2870 Kworld 355u
1255   Analog - No input analog */
1256static struct em28xx_reg_seq em2870_kworld_355u_digital[] = {
1257	{EM2880_R04_GPO,	0x01,	0xff,		10},
1258	{  -1,			-1,	-1,		-1},
1259};
1260
1261/* Callback for the most boards */
1262static struct em28xx_reg_seq default_callback[] = {
1263	{EM28XX_R08_GPIO,	EM_GPIO_4,	EM_GPIO_4,	10},
1264	{EM28XX_R08_GPIO,	0,		EM_GPIO_4,	10},
1265	{EM28XX_R08_GPIO,	EM_GPIO_4,	EM_GPIO_4,	10},
1266	{  -1,			-1,		-1,		-1},
1267};
1268
1269/* Callback for EM2882 TERRATEC HYBRID XS */
1270static struct em28xx_reg_seq em2882_terratec_hybrid_xs_digital[] = {
1271	{EM28XX_R08_GPIO,       0x2e,   0xff,		   6},
1272	{EM28XX_R08_GPIO,       0x3e,   ~EM_GPIO_4,	   6},
1273	{EM2880_R04_GPO,        0x04,   0xff,		  10},
1274	{EM2880_R04_GPO,        0x0c,   0xff,		  10},
1275	{  -1,			-1,	-1,		  -1},
1276};
1277
1278/* Pinnacle PCTV HD Mini (80e) GPIOs
1279   0-5: not used
1280   6:   demod reset, active low
1281   7:   LED on, active high */
1282static struct em28xx_reg_seq em2874_pinnacle_80e_digital[] = {
1283	{EM28XX_R06_I2C_CLK,    0x45,   0xff,		  10}, /*400 KHz*/
1284	{EM2874_R80_GPIO,       0x80,   0xff,		  100},/*Demod reset*/
1285	{EM2874_R80_GPIO,       0xc0,   0xff,		  10},
1286	{  -1,			-1,	-1,		  -1},
1287};
1288
1289/*
1290 * EEPROM hash table for devices with generic USB IDs
1291 */
1292static struct em28xx_hash_table em28xx_eeprom_hash [] = {
1293	/* P/N: SA 60002070465 Tuner: TVF7533-MF */
1294	{0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
1295	{0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
1296};
1297
1298/* I2C devicelist hash table for devices with generic USB IDs */
1299static struct em28xx_hash_table em28xx_i2c_hash[] = {
1300	{0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
1301	{0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
1302	{0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
1303};
1304
1305int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
1306{
1307	int rc = 0;
1308	struct em28xx *dev = ptr;
1309
1310	if (dev->tuner_type != TUNER_XC2028)
1311		return 0;
1312
1313	if (command != XC2028_TUNER_RESET)
1314		return 0;
1315
1316	if (dev->mode == EM28XX_ANALOG_MODE)
1317		rc = em28xx_gpio_set(dev, dev->tun_analog_gpio);
1318	else
1319		rc = em28xx_gpio_set(dev, dev->tun_digital_gpio);
1320
1321	return rc;
1322}
1323EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
1324
1325static void em28xx_set_model(struct em28xx *dev)
1326{
1327	dev->is_em2800 = em28xx_boards[dev->model].is_em2800;
1328	dev->has_msp34xx = em28xx_boards[dev->model].has_msp34xx;
1329	dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
1330	dev->decoder = em28xx_boards[dev->model].decoder;
1331	dev->video_inputs = em28xx_boards[dev->model].vchannels;
1332	dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s;
1333	dev->max_range_640_480 = em28xx_boards[dev->model].max_range_640_480;
1334	dev->has_dvb = em28xx_boards[dev->model].has_dvb;
1335	dev->has_snapshot_button = em28xx_boards[dev->model].has_snapshot_button;
1336	dev->ir_codes = em28xx_boards[dev->model].ir_codes;
1337	dev->valid = em28xx_boards[dev->model].valid;
1338}
1339
1340/* Since em28xx_pre_card_setup() requires a proper dev->model,
1341 * this won't work for boards with generic PCI IDs
1342 */
1343void em28xx_pre_card_setup(struct em28xx *dev)
1344{
1345	int rc;
1346
1347	/* Set the default GPO/GPIO for legacy devices */
1348	dev->reg_gpo_num = EM2880_R04_GPO;
1349	dev->reg_gpio_num = EM28XX_R08_GPIO;
1350
1351	dev->wait_after_write = 5;
1352
1353	/* Based on the Chip ID, set the device configuration */
1354	rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
1355	if (rc > 0) {
1356		dev->chip_id = rc;
1357		switch (rc) {
1358		case CHIP_ID_EM2820:
1359			em28xx_info("chip ID is em2820\n");
1360			break;
1361		case CHIP_ID_EM2840:
1362			em28xx_info("chip ID is em2840\n");
1363			break;
1364		case CHIP_ID_EM2860:
1365			em28xx_info("chip ID is em2860\n");
1366			break;
1367		case CHIP_ID_EM2874:
1368			em28xx_info("chip ID is em2874\n");
1369			dev->reg_gpio_num = EM2874_R80_GPIO;
1370			dev->wait_after_write = 0;
1371			break;
1372		case CHIP_ID_EM2883:
1373			em28xx_info("chip ID is em2882/em2883\n");
1374			dev->wait_after_write = 0;
1375			break;
1376		default:
1377			em28xx_info("em28xx chip ID = %d\n", rc);
1378		}
1379	}
1380
1381	/* Prepopulate cached GPO register content */
1382	rc = em28xx_read_reg(dev, dev->reg_gpo_num);
1383	if (rc >= 0)
1384		dev->reg_gpo = rc;
1385
1386	em28xx_set_model(dev);
1387
1388	/* request some modules */
1389	switch (dev->model) {
1390	case EM2880_BOARD_TERRATEC_PRODIGY_XS:
1391	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1392	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1393	case EM2860_BOARD_TERRATEC_HYBRID_XS:
1394	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1395	case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
1396	case EM2882_BOARD_PINNACLE_HYBRID_PRO:
1397	case EM2883_BOARD_KWORLD_HYBRID_A316:
1398	case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1399		em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1400		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1401		msleep(50);
1402
1403		/* Sets GPO/GPIO sequences for this device */
1404		dev->analog_gpio      = hauppauge_wintv_hvr_900_analog;
1405		dev->digital_gpio     = hauppauge_wintv_hvr_900_digital;
1406		dev->tun_analog_gpio  = default_callback;
1407		dev->tun_digital_gpio = default_callback;
1408		break;
1409
1410	case EM2882_BOARD_TERRATEC_HYBRID_XS:
1411		em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1412		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1413		msleep(50);
1414
1415		/* should be added ir_codes here */
1416
1417		/* Sets GPO/GPIO sequences for this device */
1418		dev->analog_gpio      = hauppauge_wintv_hvr_900_analog;
1419		dev->digital_gpio     = hauppauge_wintv_hvr_900_digital;
1420		dev->tun_analog_gpio  = default_callback;
1421		dev->tun_digital_gpio = em2882_terratec_hybrid_xs_digital;
1422		break;
1423
1424	case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
1425	case EM2880_BOARD_TERRATEC_HYBRID_XS:
1426	case EM2870_BOARD_TERRATEC_XS:
1427	case EM2881_BOARD_PINNACLE_HYBRID_PRO:
1428	case EM2880_BOARD_KWORLD_DVB_310U:
1429	case EM2870_BOARD_KWORLD_350U:
1430	case EM2881_BOARD_DNT_DA2_HYBRID:
1431		em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1432		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1433		msleep(50);
1434
1435		/* NOTE: EM2881_DNT_DA2_HYBRID spend 140 msleep for digital
1436			 and analog commands. If this commands doesn't work,
1437			 add this timer. */
1438
1439		/* Sets GPO/GPIO sequences for this device */
1440		dev->analog_gpio      = default_analog;
1441		dev->digital_gpio     = default_digital;
1442		dev->tun_analog_gpio  = default_callback;
1443		dev->tun_digital_gpio = default_callback;
1444		break;
1445
1446	case EM2880_BOARD_MSI_DIGIVOX_AD:
1447	case EM2880_BOARD_MSI_DIGIVOX_AD_II:
1448		em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1449		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1450		msleep(50);
1451
1452		/* Sets GPO/GPIO sequences for this device */
1453		dev->analog_gpio      = em2880_msi_digivox_ad_analog;
1454		dev->digital_gpio     = em2880_msi_digivox_ad_digital;
1455		dev->tun_analog_gpio  = default_callback;
1456		dev->tun_digital_gpio = default_callback;
1457		break;
1458
1459	case EM2750_BOARD_UNKNOWN:
1460	case EM2750_BOARD_DLCW_130:
1461		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x0a", 1);
1462		break;
1463
1464	case EM2861_BOARD_PLEXTOR_PX_TV100U:
1465		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1466		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1467		/* FIXME guess */
1468		/* Turn on analog audio output */
1469		em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1);
1470		break;
1471
1472	case EM2861_BOARD_KWORLD_PVRTV_300U:
1473	case EM2880_BOARD_KWORLD_DVB_305U:
1474		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1475		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x4c", 1);
1476		msleep(10);
1477		em28xx_write_regs(dev, 0x08, "\x6d", 1);
1478		msleep(10);
1479		em28xx_write_regs(dev, 0x08, "\x7d", 1);
1480		msleep(10);
1481		break;
1482
1483	case EM2870_BOARD_KWORLD_355U:
1484		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1485		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1486		msleep(50);
1487
1488		/* Sets GPO/GPIO sequences for this device */
1489		dev->digital_gpio     = em2870_kworld_355u_digital;
1490		break;
1491
1492	case EM2870_BOARD_COMPRO_VIDEOMATE:
1493		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1494		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1495		/* TODO: someone can do some cleanup here...
1496			 not everything's needed */
1497		em28xx_write_regs(dev, 0x04, "\x00", 1);
1498		msleep(10);
1499		em28xx_write_regs(dev, 0x04, "\x01", 1);
1500		msleep(10);
1501		em28xx_write_regs(dev, 0x08, "\xfd", 1);
1502		mdelay(70);
1503		em28xx_write_regs(dev, 0x08, "\xfc", 1);
1504		mdelay(70);
1505		em28xx_write_regs(dev, 0x08, "\xdc", 1);
1506		mdelay(70);
1507		em28xx_write_regs(dev, 0x08, "\xfc", 1);
1508		mdelay(70);
1509		break;
1510
1511	case EM2870_BOARD_TERRATEC_XS_MT2060:
1512		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1513		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1514		/* this device needs some gpio writes to get the DVB-T
1515		   demod work */
1516		em28xx_write_regs(dev, 0x08, "\xfe", 1);
1517		mdelay(70);
1518		em28xx_write_regs(dev, 0x08, "\xde", 1);
1519		mdelay(70);
1520		dev->em28xx_write_regs(dev, 0x08, "\xfe", 1);
1521		mdelay(70);
1522		break;
1523
1524	case EM2870_BOARD_PINNACLE_PCTV_DVB:
1525		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1526		/* this device needs some gpio writes to get the
1527		   DVB-T demod work */
1528		em28xx_write_regs(dev, 0x08, "\xfe", 1);
1529		mdelay(70);
1530		em28xx_write_regs(dev, 0x08, "\xde", 1);
1531		mdelay(70);
1532		em28xx_write_regs(dev, 0x08, "\xfe", 1);
1533		mdelay(70);
1534		/* switch em2880 rc protocol */
1535		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x22", 1);
1536		/* should be added ir_codes here */
1537		break;
1538
1539	case EM2820_BOARD_GADMEI_UTV310:
1540		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1541		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1542		/* Turn on analog audio output */
1543		em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1);
1544		break;
1545
1546	case EM2860_BOARD_GADMEI_UTV330:
1547		/* Turn on IR */
1548		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
1549		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1550		/* should be added ir_codes here */
1551		break;
1552
1553	case EM2820_BOARD_MSI_VOX_USB_2:
1554		em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1555		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1556		/* enables audio for that device */
1557		em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1);
1558		break;
1559
1560	case EM2874_BOARD_PINNACLE_PCTV_80E:
1561		/* Set 400 KHz clock */
1562		em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x45", 1);
1563
1564		dev->digital_gpio = em2874_pinnacle_80e_digital;
1565		break;
1566	}
1567
1568	em28xx_gpio_set(dev, dev->tun_analog_gpio);
1569	em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
1570
1571	/* Unlock device */
1572	em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
1573}
1574
1575static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
1576{
1577	memset(ctl, 0, sizeof(*ctl));
1578
1579	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
1580	ctl->max_len = 64;
1581	ctl->mts = em28xx_boards[dev->model].mts_firmware;
1582
1583	switch (dev->model) {
1584	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1585		ctl->demod = XC3028_FE_ZARLINK456;
1586		break;
1587	case EM2880_BOARD_TERRATEC_HYBRID_XS:
1588		ctl->demod = XC3028_FE_ZARLINK456;
1589		break;
1590	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1591		/* djh - Not sure which demod we need here */
1592		ctl->demod = XC3028_FE_DEFAULT;
1593		break;
1594	case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1595		ctl->demod = XC3028_FE_DEFAULT;
1596		ctl->fname = XC3028L_DEFAULT_FIRMWARE;
1597		break;
1598	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1599	case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
1600		/* FIXME: Better to specify the needed IF */
1601		ctl->demod = XC3028_FE_DEFAULT;
1602		break;
1603	default:
1604		ctl->demod = XC3028_FE_OREN538;
1605	}
1606}
1607
1608static void em28xx_config_tuner(struct em28xx *dev)
1609{
1610	struct v4l2_priv_tun_config  xc2028_cfg;
1611	struct tuner_setup           tun_setup;
1612	struct v4l2_frequency        f;
1613
1614	if (dev->tuner_type == TUNER_ABSENT)
1615		return;
1616
1617	tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1618	tun_setup.type = dev->tuner_type;
1619	tun_setup.addr = dev->tuner_addr;
1620	tun_setup.tuner_callback = em28xx_tuner_callback;
1621
1622	em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
1623
1624	if (dev->tuner_type == TUNER_XC2028) {
1625		struct xc2028_ctrl           ctl;
1626
1627		em28xx_setup_xc3028(dev, &ctl);
1628
1629		xc2028_cfg.tuner = TUNER_XC2028;
1630		xc2028_cfg.priv  = &ctl;
1631
1632		em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
1633	}
1634
1635	/* configure tuner */
1636	f.tuner = 0;
1637	f.type = V4L2_TUNER_ANALOG_TV;
1638	f.frequency = 9076;     /* just a magic number */
1639	dev->ctl_freq = f.frequency;
1640	em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
1641}
1642
1643static int em28xx_hint_board(struct em28xx *dev)
1644{
1645	int i;
1646
1647	/* HINT method: EEPROM
1648	 *
1649	 * This method works only for boards with eeprom.
1650	 * Uses a hash of all eeprom bytes. The hash should be
1651	 * unique for a vendor/tuner pair.
1652	 * There are a high chance that tuners for different
1653	 * video standards produce different hashes.
1654	 */
1655	for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
1656		if (dev->hash == em28xx_eeprom_hash[i].hash) {
1657			dev->model = em28xx_eeprom_hash[i].model;
1658			dev->tuner_type = em28xx_eeprom_hash[i].tuner;
1659
1660			em28xx_errdev("Your board has no unique USB ID.\n");
1661			em28xx_errdev("A hint were successfully done, "
1662				      "based on eeprom hash.\n");
1663			em28xx_errdev("This method is not 100%% failproof.\n");
1664			em28xx_errdev("If the board were missdetected, "
1665				      "please email this log to:\n");
1666			em28xx_errdev("\tV4L Mailing List "
1667				      " <video4linux-list@redhat.com>\n");
1668			em28xx_errdev("Board detected as %s\n",
1669				      em28xx_boards[dev->model].name);
1670
1671			return 0;
1672		}
1673	}
1674
1675	/* HINT method: I2C attached devices
1676	 *
1677	 * This method works for all boards.
1678	 * Uses a hash of i2c scanned devices.
1679	 * Devices with the same i2c attached chips will
1680	 * be considered equal.
1681	 * This method is less precise than the eeprom one.
1682	 */
1683
1684	/* user did not request i2c scanning => do it now */
1685	if (!dev->i2c_hash)
1686		em28xx_do_i2c_scan(dev);
1687
1688	for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
1689		if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
1690			dev->model = em28xx_i2c_hash[i].model;
1691			dev->tuner_type = em28xx_i2c_hash[i].tuner;
1692			em28xx_errdev("Your board has no unique USB ID.\n");
1693			em28xx_errdev("A hint were successfully done, "
1694				      "based on i2c devicelist hash.\n");
1695			em28xx_errdev("This method is not 100%% failproof.\n");
1696			em28xx_errdev("If the board were missdetected, "
1697				      "please email this log to:\n");
1698			em28xx_errdev("\tV4L Mailing List "
1699				      " <video4linux-list@redhat.com>\n");
1700			em28xx_errdev("Board detected as %s\n",
1701				      em28xx_boards[dev->model].name);
1702
1703			return 0;
1704		}
1705	}
1706
1707	em28xx_errdev("Your board has no unique USB ID and thus need a "
1708		      "hint to be detected.\n");
1709	em28xx_errdev("You may try to use card=<n> insmod option to "
1710		      "workaround that.\n");
1711	em28xx_errdev("Please send an email with this log to:\n");
1712	em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
1713	em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
1714	em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
1715
1716	em28xx_errdev("Here is a list of valid choices for the card=<n>"
1717		      " insmod option:\n");
1718	for (i = 0; i < em28xx_bcount; i++) {
1719		em28xx_errdev("    card=%d -> %s\n",
1720				i, em28xx_boards[i].name);
1721	}
1722	return -1;
1723}
1724
1725/* ----------------------------------------------------------------------- */
1726void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir)
1727{
1728	if (disable_ir) {
1729		ir->get_key = NULL;
1730		return ;
1731	}
1732
1733	/* detect & configure */
1734	switch (dev->model) {
1735	case (EM2800_BOARD_UNKNOWN):
1736		break;
1737	case (EM2820_BOARD_UNKNOWN):
1738		break;
1739	case (EM2800_BOARD_TERRATEC_CINERGY_200):
1740	case (EM2820_BOARD_TERRATEC_CINERGY_250):
1741		ir->ir_codes = ir_codes_em_terratec;
1742		ir->get_key = em28xx_get_key_terratec;
1743		snprintf(ir->c.name, sizeof(ir->c.name),
1744			 "i2c IR (EM28XX Terratec)");
1745		break;
1746	case (EM2820_BOARD_PINNACLE_USB_2):
1747		ir->ir_codes = ir_codes_pinnacle_grey;
1748		ir->get_key = em28xx_get_key_pinnacle_usb_grey;
1749		snprintf(ir->c.name, sizeof(ir->c.name),
1750			 "i2c IR (EM28XX Pinnacle PCTV)");
1751		break;
1752	case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
1753		ir->ir_codes = ir_codes_hauppauge_new;
1754		ir->get_key = em28xx_get_key_em_haup;
1755		snprintf(ir->c.name, sizeof(ir->c.name),
1756			 "i2c IR (EM2840 Hauppauge)");
1757		break;
1758	case (EM2820_BOARD_MSI_VOX_USB_2):
1759		break;
1760	case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
1761		break;
1762	case (EM2800_BOARD_KWORLD_USB2800):
1763		break;
1764	case (EM2800_BOARD_GRABBEEX_USB2800):
1765		break;
1766	}
1767}
1768
1769void em28xx_card_setup(struct em28xx *dev)
1770{
1771	em28xx_set_model(dev);
1772
1773	dev->tuner_type = em28xx_boards[dev->model].tuner_type;
1774	dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
1775
1776	/* request some modules */
1777	switch (dev->model) {
1778	case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
1779	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1780	case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1781	case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1782	{
1783		struct tveeprom tv;
1784#ifdef CONFIG_MODULES
1785		request_module("tveeprom");
1786#endif
1787		/* Call first TVeeprom */
1788
1789		dev->i2c_client.addr = 0xa0 >> 1;
1790		tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
1791
1792		dev->tuner_type = tv.tuner_type;
1793
1794		if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
1795			dev->i2s_speed = 2048000;
1796			dev->has_msp34xx = 1;
1797		}
1798#ifdef CONFIG_MODULES
1799		if (tv.has_ir)
1800			request_module("ir-kbd-i2c");
1801#endif
1802		break;
1803	}
1804	case EM2820_BOARD_KWORLD_PVRTV2800RF:
1805		/* GPIO enables sound on KWORLD PVR TV 2800RF */
1806		em28xx_write_regs_req(dev, 0x00, 0x08, "\xf9", 1);
1807		break;
1808	case EM2820_BOARD_UNKNOWN:
1809	case EM2800_BOARD_UNKNOWN:
1810		/*
1811		 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
1812		 *
1813		 * This occurs because they share identical USB vendor and
1814		 * product IDs.
1815		 *
1816		 * What we do here is look up the EEPROM hash of the K-WORLD
1817		 * and if it is found then we decide that we do not have
1818		 * a DIGIVOX and reset the device to the K-WORLD instead.
1819		 *
1820		 * This solution is only valid if they do not share eeprom
1821		 * hash identities which has not been determined as yet.
1822		 */
1823	case EM2880_BOARD_MSI_DIGIVOX_AD:
1824		if (!em28xx_hint_board(dev))
1825			em28xx_set_model(dev);
1826		break;
1827	}
1828
1829	if (dev->has_snapshot_button)
1830		em28xx_register_snapshot_button(dev);
1831
1832	if (dev->valid == EM28XX_BOARD_NOT_VALIDATED) {
1833		em28xx_errdev("\n\n");
1834		em28xx_errdev("The support for this board weren't "
1835			      "valid yet.\n");
1836		em28xx_errdev("Please send a report of having this working\n");
1837		em28xx_errdev("not to V4L mailing list (and/or to other "
1838				"addresses)\n\n");
1839	}
1840
1841	/* Allow override tuner type by a module parameter */
1842	if (tuner >= 0)
1843		dev->tuner_type = tuner;
1844
1845#ifdef CONFIG_MODULES
1846	/* request some modules */
1847	if (dev->has_msp34xx)
1848		request_module("msp3400");
1849	if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114)
1850		request_module("saa7115");
1851	if (dev->decoder == EM28XX_TVP5150)
1852		request_module("tvp5150");
1853	if (dev->tuner_type != TUNER_ABSENT)
1854		request_module("tuner");
1855#endif
1856
1857	em28xx_config_tuner(dev);
1858
1859	em28xx_ir_init(dev);
1860}
1861