3b585486f7fe4d704554b5b11e8c78a9c0bd5abe
[safe/jmp/linux-2.6] / drivers / media / video / em28xx / em28xx-cards.c
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
40 static int tuner = -1;
41 module_param(tuner, int, 0444);
42 MODULE_PARM_DESC(tuner, "tuner type");
43
44 static unsigned int disable_ir;
45 module_param(disable_ir, int, 0444);
46 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
47
48 struct em28xx_hash_table {
49         unsigned long hash;
50         unsigned int  model;
51         unsigned int  tuner;
52 };
53
54 struct 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                 .decoder        = EM28XX_TVP5150,
644                 .input          = { {
645                         .type     = EM28XX_VMUX_TELEVISION,
646                         .vmux     = TVP5150_COMPOSITE0,
647                         .amux     = 0,
648                 }, {
649                         .type     = EM28XX_VMUX_COMPOSITE1,
650                         .vmux     = TVP5150_COMPOSITE1,
651                         .amux     = 1,
652                 }, {
653                         .type     = EM28XX_VMUX_SVIDEO,
654                         .vmux     = TVP5150_SVIDEO,
655                         .amux     = 1,
656                 } },
657         },
658         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
659                 .name         = "Terratec Hybrid XS",
660                 .vchannels    = 3,
661                 .tda9887_conf = TDA9887_PRESENT,
662                 .tuner_type   = TUNER_XC2028,
663                 .decoder      = EM28XX_TVP5150,
664                 .has_dvb        = 1,
665                 .input          = { {
666                         .type     = EM28XX_VMUX_TELEVISION,
667                         .vmux     = TVP5150_COMPOSITE0,
668                         .amux     = 0,
669                 }, {
670                         .type     = EM28XX_VMUX_COMPOSITE1,
671                         .vmux     = TVP5150_COMPOSITE1,
672                         .amux     = 1,
673                 }, {
674                         .type     = EM28XX_VMUX_SVIDEO,
675                         .vmux     = TVP5150_SVIDEO,
676                         .amux     = 1,
677                 } },
678         },
679         /* maybe there's a reason behind it why Terratec sells the Hybrid XS
680            as Prodigy XS with a different PID, let's keep it separated for now
681            maybe we'll need it lateron */
682         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
683                 .name         = "Terratec Prodigy XS",
684                 .vchannels    = 3,
685                 .tda9887_conf = TDA9887_PRESENT,
686                 .tuner_type   = TUNER_XC2028,
687                 .decoder      = EM28XX_TVP5150,
688                 .input          = { {
689                         .type     = EM28XX_VMUX_TELEVISION,
690                         .vmux     = TVP5150_COMPOSITE0,
691                         .amux     = 0,
692                 }, {
693                         .type     = EM28XX_VMUX_COMPOSITE1,
694                         .vmux     = TVP5150_COMPOSITE1,
695                         .amux     = 1,
696                 }, {
697                         .type     = EM28XX_VMUX_SVIDEO,
698                         .vmux     = TVP5150_SVIDEO,
699                         .amux     = 1,
700                 } },
701         },
702         [EM2820_BOARD_MSI_VOX_USB_2] = {
703                 .name              = "MSI VOX USB 2.0",
704                 .vchannels         = 3,
705                 .tuner_type        = TUNER_LG_PAL_NEW_TAPC,
706                 .tda9887_conf      = TDA9887_PRESENT      |
707                                      TDA9887_PORT1_ACTIVE |
708                                      TDA9887_PORT2_ACTIVE,
709                 .max_range_640_480 = 1,
710
711                 .decoder           = EM28XX_SAA7114,
712                 .input             = { {
713                         .type      = EM28XX_VMUX_TELEVISION,
714                         .vmux      = SAA7115_COMPOSITE4,
715                         .amux      = 0,
716                 }, {
717                         .type      = EM28XX_VMUX_COMPOSITE1,
718                         .vmux      = SAA7115_COMPOSITE0,
719                         .amux      = 1,
720                 }, {
721                         .type      = EM28XX_VMUX_SVIDEO,
722                         .vmux      = SAA7115_SVIDEO3,
723                         .amux      = 1,
724                 } },
725         },
726         [EM2800_BOARD_TERRATEC_CINERGY_200] = {
727                 .name         = "Terratec Cinergy 200 USB",
728                 .is_em2800    = 1,
729                 .vchannels    = 3,
730                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
731                 .tda9887_conf = TDA9887_PRESENT,
732                 .decoder      = EM28XX_SAA7113,
733                 .input          = { {
734                         .type     = EM28XX_VMUX_TELEVISION,
735                         .vmux     = SAA7115_COMPOSITE2,
736                         .amux     = 0,
737                 }, {
738                         .type     = EM28XX_VMUX_COMPOSITE1,
739                         .vmux     = SAA7115_COMPOSITE0,
740                         .amux     = 1,
741                 }, {
742                         .type     = EM28XX_VMUX_SVIDEO,
743                         .vmux     = SAA7115_SVIDEO3,
744                         .amux     = 1,
745                 } },
746         },
747         [EM2800_BOARD_GRABBEEX_USB2800] = {
748                 .name         = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
749                 .is_em2800    = 1,
750                 .vchannels    = 2,
751                 .decoder      = EM28XX_SAA7113,
752                 .input          = { {
753                         .type     = EM28XX_VMUX_COMPOSITE1,
754                         .vmux     = SAA7115_COMPOSITE0,
755                         .amux     = 1,
756                 }, {
757                         .type     = EM28XX_VMUX_SVIDEO,
758                         .vmux     = SAA7115_SVIDEO3,
759                         .amux     = 1,
760                 } },
761         },
762         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
763                 .name         = "Leadtek Winfast USB II",
764                 .is_em2800    = 1,
765                 .vchannels    = 3,
766                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
767                 .tda9887_conf = TDA9887_PRESENT,
768                 .decoder      = EM28XX_SAA7113,
769                 .input          = { {
770                         .type     = EM28XX_VMUX_TELEVISION,
771                         .vmux     = SAA7115_COMPOSITE2,
772                         .amux     = 0,
773                 }, {
774                         .type     = EM28XX_VMUX_COMPOSITE1,
775                         .vmux     = SAA7115_COMPOSITE0,
776                         .amux     = 1,
777                 }, {
778                         .type     = EM28XX_VMUX_SVIDEO,
779                         .vmux     = SAA7115_SVIDEO3,
780                         .amux     = 1,
781                 } },
782         },
783         [EM2800_BOARD_KWORLD_USB2800] = {
784                 .name         = "Kworld USB2800",
785                 .is_em2800    = 1,
786                 .vchannels    = 3,
787                 .tuner_type   = TUNER_PHILIPS_FCV1236D,
788                 .tda9887_conf = TDA9887_PRESENT,
789                 .decoder      = EM28XX_SAA7113,
790                 .input          = { {
791                         .type     = EM28XX_VMUX_TELEVISION,
792                         .vmux     = SAA7115_COMPOSITE2,
793                         .amux     = 0,
794                 }, {
795                         .type     = EM28XX_VMUX_COMPOSITE1,
796                         .vmux     = SAA7115_COMPOSITE0,
797                         .amux     = 1,
798                 }, {
799                         .type     = EM28XX_VMUX_SVIDEO,
800                         .vmux     = SAA7115_SVIDEO3,
801                         .amux     = 1,
802                 } },
803         },
804         [EM2820_BOARD_PINNACLE_DVC_90] = {
805                 .name         = "Pinnacle Dazzle DVC 90/DVC 100",
806                 .vchannels    = 3,
807                 .tuner_type   = TUNER_ABSENT,
808                 .decoder      = EM28XX_SAA7113,
809                 .input          = { {
810                         .type     = EM28XX_VMUX_COMPOSITE1,
811                         .vmux     = SAA7115_COMPOSITE0,
812                         .amux     = 1,
813                 }, {
814                         .type     = EM28XX_VMUX_SVIDEO,
815                         .vmux     = SAA7115_SVIDEO3,
816                         .amux     = 1,
817                 } },
818         },
819         [EM2800_BOARD_VGEAR_POCKETTV] = {
820                 .name         = "V-Gear PocketTV",
821                 .is_em2800    = 1,
822                 .vchannels    = 3,
823                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
824                 .tda9887_conf = TDA9887_PRESENT,
825                 .decoder      = EM28XX_SAA7113,
826                 .input          = { {
827                         .type     = EM28XX_VMUX_TELEVISION,
828                         .vmux     = SAA7115_COMPOSITE2,
829                         .amux     = 0,
830                 }, {
831                         .type     = EM28XX_VMUX_COMPOSITE1,
832                         .vmux     = SAA7115_COMPOSITE0,
833                         .amux     = 1,
834                 }, {
835                         .type     = EM28XX_VMUX_SVIDEO,
836                         .vmux     = SAA7115_SVIDEO3,
837                         .amux     = 1,
838                 } },
839         },
840         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
841                 .name         = "Pixelview Prolink PlayTV USB 2.0",
842                 .vchannels    = 3,
843                 .tda9887_conf = TDA9887_PRESENT,
844                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
845                 .decoder      = EM28XX_SAA7113,
846                 .input          = { {
847                         .type     = EM28XX_VMUX_TELEVISION,
848                         .vmux     = SAA7115_COMPOSITE2,
849                         .amux     = EM28XX_AMUX_LINE_IN,
850                 }, {
851                         .type     = EM28XX_VMUX_COMPOSITE1,
852                         .vmux     = SAA7115_COMPOSITE0,
853                         .amux     = EM28XX_AMUX_LINE_IN,
854                 }, {
855                         .type     = EM28XX_VMUX_SVIDEO,
856                         .vmux     = SAA7115_SVIDEO3,
857                         .amux     = EM28XX_AMUX_LINE_IN,
858                 } },
859         },
860         [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = {
861                 .name         = "PointNix Intra-Oral Camera",
862                 .has_snapshot_button = 1,
863                 .vchannels    = 1,
864                 .tda9887_conf = TDA9887_PRESENT,
865                 .tuner_type   = TUNER_ABSENT,
866                 .decoder      = EM28XX_SAA7113,
867                 .input          = { {
868                         .type     = EM28XX_VMUX_SVIDEO,
869                         .vmux     = SAA7115_SVIDEO3,
870                         .amux     = 0,
871                 } },
872         },
873         [EM2880_BOARD_MSI_DIGIVOX_AD] = {
874                 .name         = "MSI DigiVox A/D",
875                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
876                 .vchannels    = 3,
877                 .tuner_type   = TUNER_XC2028,
878                 .decoder      = EM28XX_TVP5150,
879                 .input          = { {
880                         .type     = EM28XX_VMUX_TELEVISION,
881                         .vmux     = TVP5150_COMPOSITE0,
882                         .amux     = 0,
883                 }, {
884                         .type     = EM28XX_VMUX_COMPOSITE1,
885                         .vmux     = TVP5150_COMPOSITE1,
886                         .amux     = 1,
887                 }, {
888                         .type     = EM28XX_VMUX_SVIDEO,
889                         .vmux     = TVP5150_SVIDEO,
890                         .amux     = 1,
891                 } },
892         },
893         [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
894                 .name         = "MSI DigiVox A/D II",
895                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
896                 .vchannels    = 3,
897                 .tuner_type   = TUNER_XC2028,
898                 .decoder      = EM28XX_TVP5150,
899                 .input          = { {
900                         .type     = EM28XX_VMUX_TELEVISION,
901                         .vmux     = TVP5150_COMPOSITE0,
902                         .amux     = 0,
903                 }, {
904                         .type     = EM28XX_VMUX_COMPOSITE1,
905                         .vmux     = TVP5150_COMPOSITE1,
906                         .amux     = 1,
907                 }, {
908                         .type     = EM28XX_VMUX_SVIDEO,
909                         .vmux     = TVP5150_SVIDEO,
910                         .amux     = 1,
911                 } },
912         },
913         [EM2880_BOARD_KWORLD_DVB_305U] = {
914                 .name         = "KWorld DVB-T 305U",
915                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
916                 .vchannels    = 3,
917                 .tuner_type   = TUNER_XC2028,
918                 .decoder      = EM28XX_TVP5150,
919                 .input          = { {
920                         .type     = EM28XX_VMUX_TELEVISION,
921                         .vmux     = TVP5150_COMPOSITE0,
922                         .amux     = 0,
923                 }, {
924                         .type     = EM28XX_VMUX_COMPOSITE1,
925                         .vmux     = TVP5150_COMPOSITE1,
926                         .amux     = 1,
927                 }, {
928                         .type     = EM28XX_VMUX_SVIDEO,
929                         .vmux     = TVP5150_SVIDEO,
930                         .amux     = 1,
931                 } },
932         },
933         [EM2880_BOARD_KWORLD_DVB_310U] = {
934                 .name         = "KWorld DVB-T 310U",
935                 .vchannels    = 3,
936                 .tuner_type   = TUNER_XC2028,
937                 .has_dvb      = 1,
938                 .mts_firmware = 1,
939                 .decoder      = EM28XX_TVP5150,
940                 .input          = { {
941                         .type     = EM28XX_VMUX_TELEVISION,
942                         .vmux     = TVP5150_COMPOSITE0,
943                         .amux     = EM28XX_AMUX_VIDEO,
944                 }, {
945                         .type     = EM28XX_VMUX_COMPOSITE1,
946                         .vmux     = TVP5150_COMPOSITE1,
947                         .amux     = EM28XX_AMUX_AC97_LINE_IN,
948                 }, {    /* S-video has not been tested yet */
949                         .type     = EM28XX_VMUX_SVIDEO,
950                         .vmux     = TVP5150_SVIDEO,
951                         .amux     = EM28XX_AMUX_AC97_LINE_IN,
952                 } },
953         },
954         [EM2881_BOARD_DNT_DA2_HYBRID] = {
955                 .name         = "DNT DA2 Hybrid",
956                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
957                 .vchannels    = 3,
958                 .tuner_type   = TUNER_XC2028,
959                 .decoder      = EM28XX_TVP5150,
960                 .input          = { {
961                         .type     = EM28XX_VMUX_TELEVISION,
962                         .vmux     = TVP5150_COMPOSITE0,
963                         .amux     = 0,
964                 }, {
965                         .type     = EM28XX_VMUX_COMPOSITE1,
966                         .vmux     = TVP5150_COMPOSITE1,
967                         .amux     = 1,
968                 }, {
969                         .type     = EM28XX_VMUX_SVIDEO,
970                         .vmux     = TVP5150_SVIDEO,
971                         .amux     = 1,
972                 } },
973         },
974         [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
975                 .name         = "Pinnacle Hybrid Pro",
976                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
977                 .vchannels    = 3,
978                 .tuner_type   = TUNER_XC2028,
979                 .decoder      = EM28XX_TVP5150,
980                 .input          = { {
981                         .type     = EM28XX_VMUX_TELEVISION,
982                         .vmux     = TVP5150_COMPOSITE0,
983                         .amux     = 0,
984                 }, {
985                         .type     = EM28XX_VMUX_COMPOSITE1,
986                         .vmux     = TVP5150_COMPOSITE1,
987                         .amux     = 1,
988                 }, {
989                         .type     = EM28XX_VMUX_SVIDEO,
990                         .vmux     = TVP5150_SVIDEO,
991                         .amux     = 1,
992                 } },
993         },
994         [EM2882_BOARD_PINNACLE_HYBRID_PRO] = {
995                 .name         = "Pinnacle Hybrid Pro (2)",
996                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
997                 .vchannels    = 3,
998                 .tuner_type   = TUNER_XC2028,
999                 .mts_firmware = 1,
1000                 .decoder      = EM28XX_TVP5150,
1001                 .input          = { {
1002                         .type     = EM28XX_VMUX_TELEVISION,
1003                         .vmux     = TVP5150_COMPOSITE0,
1004                         .amux     = 0,
1005                 }, {
1006                         .type     = EM28XX_VMUX_COMPOSITE1,
1007                         .vmux     = TVP5150_COMPOSITE1,
1008                         .amux     = 1,
1009                 }, {
1010                         .type     = EM28XX_VMUX_SVIDEO,
1011                         .vmux     = TVP5150_SVIDEO,
1012                         .amux     = 1,
1013                 } },
1014         },
1015         [EM2882_BOARD_KWORLD_VS_DVBT] = {
1016                 .name         = "Kworld VS-DVB-T 323UR",
1017                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1018                 .vchannels    = 3,
1019                 .tuner_type   = TUNER_XC2028,
1020                 .decoder      = EM28XX_TVP5150,
1021                 .input          = { {
1022                         .type     = EM28XX_VMUX_TELEVISION,
1023                         .vmux     = TVP5150_COMPOSITE0,
1024                         .amux     = 0,
1025                 }, {
1026                         .type     = EM28XX_VMUX_COMPOSITE1,
1027                         .vmux     = TVP5150_COMPOSITE1,
1028                         .amux     = 1,
1029                 }, {
1030                         .type     = EM28XX_VMUX_SVIDEO,
1031                         .vmux     = TVP5150_SVIDEO,
1032                         .amux     = 1,
1033                 } },
1034         },
1035         [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1036                 .name         = "Terratec Hybrid XS (em2882)",
1037                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1038                 .vchannels    = 3,
1039                 .tuner_type   = TUNER_XC2028,
1040                 .decoder      = EM28XX_TVP5150,
1041                 .input          = { {
1042                         .type     = EM28XX_VMUX_TELEVISION,
1043                         .vmux     = TVP5150_COMPOSITE0,
1044                         .amux     = 0,
1045                 }, {
1046                         .type     = EM28XX_VMUX_COMPOSITE1,
1047                         .vmux     = TVP5150_COMPOSITE1,
1048                         .amux     = 1,
1049                 }, {
1050                         .type     = EM28XX_VMUX_SVIDEO,
1051                         .vmux     = TVP5150_SVIDEO,
1052                         .amux     = 1,
1053                 } },
1054         },
1055         [EM2883_BOARD_KWORLD_HYBRID_A316] = {
1056                 .name         = "Kworld PlusTV HD Hybrid 330",
1057                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1058                 .vchannels    = 3,
1059                 .is_em2800    = 0,
1060                 .tuner_type   = TUNER_XC2028,
1061                 .decoder      = EM28XX_TVP5150,
1062                 .input          = { {
1063                         .type     = EM28XX_VMUX_TELEVISION,
1064                         .vmux     = TVP5150_COMPOSITE0,
1065                         .amux     = 0,
1066                 }, {
1067                         .type     = EM28XX_VMUX_COMPOSITE1,
1068                         .vmux     = TVP5150_COMPOSITE1,
1069                         .amux     = 1,
1070                 }, {
1071                         .type     = EM28XX_VMUX_SVIDEO,
1072                         .vmux     = TVP5150_SVIDEO,
1073                         .amux     = 1,
1074                 } },
1075         },
1076         [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
1077                 .name         = "Compro VideoMate ForYou/Stereo",
1078                 .vchannels    = 2,
1079                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1080                 .tda9887_conf = TDA9887_PRESENT,
1081                 .decoder      = EM28XX_TVP5150,
1082                 .input          = { {
1083                         .type     = EM28XX_VMUX_TELEVISION,
1084                         .vmux     = TVP5150_COMPOSITE0,
1085                         .amux     = EM28XX_AMUX_LINE_IN,
1086                 }, {
1087                         .type     = EM28XX_VMUX_SVIDEO,
1088                         .vmux     = TVP5150_SVIDEO,
1089                         .amux     = EM28XX_AMUX_LINE_IN,
1090                 } },
1091         },
1092         [EM2874_BOARD_PINNACLE_PCTV_80E] = {
1093                 .name         = "Pinnacle PCTV HD Mini",
1094                 .vchannels    = 0,
1095                 .tuner_type   = TUNER_ABSENT,
1096                 .has_dvb        = 1,
1097                 .ir_codes       = ir_codes_pinnacle_pctv_hd,
1098                 .decoder      = EM28XX_NODECODER,
1099 #ifdef DJH_DEBUG
1100                 .input          = { {
1101                         .type     = EM28XX_VMUX_TELEVISION,
1102                         .vmux     = TVP5150_COMPOSITE0,
1103                         .amux     = EM28XX_AMUX_LINE_IN,
1104                 } },
1105 #endif
1106         },
1107 };
1108 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
1109
1110 /* table of devices that work with this driver */
1111 struct usb_device_id em28xx_id_table [] = {
1112         { USB_DEVICE(0xeb1a, 0x2750),
1113                         .driver_info = EM2750_BOARD_UNKNOWN },
1114         { USB_DEVICE(0xeb1a, 0x2751),
1115                         .driver_info = EM2750_BOARD_UNKNOWN },
1116         { USB_DEVICE(0xeb1a, 0x2800),
1117                         .driver_info = EM2800_BOARD_UNKNOWN },
1118         { USB_DEVICE(0xeb1a, 0x2820),
1119                         .driver_info = EM2820_BOARD_UNKNOWN },
1120         { USB_DEVICE(0xeb1a, 0x2821),
1121                         .driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 },
1122         { USB_DEVICE(0xeb1a, 0x2860),
1123                         .driver_info = EM2820_BOARD_UNKNOWN },
1124         { USB_DEVICE(0xeb1a, 0x2861),
1125                         .driver_info = EM2820_BOARD_UNKNOWN },
1126         { USB_DEVICE(0xeb1a, 0x2870),
1127                         .driver_info = EM2820_BOARD_UNKNOWN },
1128         { USB_DEVICE(0xeb1a, 0x2881),
1129                         .driver_info = EM2820_BOARD_UNKNOWN },
1130         { USB_DEVICE(0xeb1a, 0x2883),
1131                         .driver_info = EM2820_BOARD_UNKNOWN },
1132         { USB_DEVICE(0xeb1a, 0xe300),
1133                         .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
1134         { USB_DEVICE(0xeb1a, 0xe305),
1135                         .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
1136         { USB_DEVICE(0xeb1a, 0xe310),
1137                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
1138         { USB_DEVICE(0xeb1a, 0xa316),
1139                         .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 },
1140         { USB_DEVICE(0xeb1a, 0xe320),
1141                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
1142         { USB_DEVICE(0xeb1a, 0xe323),
1143                         .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
1144         { USB_DEVICE(0xeb1a, 0xe350),
1145                         .driver_info = EM2870_BOARD_KWORLD_350U },
1146         { USB_DEVICE(0xeb1a, 0xe355),
1147                         .driver_info = EM2870_BOARD_KWORLD_355U },
1148         { USB_DEVICE(0xeb1a, 0x2801),
1149                         .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
1150         { USB_DEVICE(0xeb1a, 0xe357),
1151                         .driver_info = EM2870_BOARD_KWORLD_355U },
1152         { USB_DEVICE(0x0ccd, 0x0036),
1153                         .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
1154         { USB_DEVICE(0x0ccd, 0x004c),
1155                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
1156         { USB_DEVICE(0x0ccd, 0x004f),
1157                         .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
1158         { USB_DEVICE(0x0ccd, 0x005e),
1159                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
1160         { USB_DEVICE(0x0ccd, 0x0042),
1161                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS },
1162         { USB_DEVICE(0x0ccd, 0x0043),
1163                         .driver_info = EM2870_BOARD_TERRATEC_XS },
1164         { USB_DEVICE(0x0ccd, 0x0047),
1165                         .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS },
1166         { USB_DEVICE(0x185b, 0x2870),
1167                         .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
1168         { USB_DEVICE(0x185b, 0x2041),
1169                         .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
1170         { USB_DEVICE(0x2040, 0x4200),
1171                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1172         { USB_DEVICE(0x2040, 0x4201),
1173                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
1174         { USB_DEVICE(0x2040, 0x6500),
1175                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
1176         { USB_DEVICE(0x2040, 0x6502),
1177                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
1178         { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
1179                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1180         { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
1181                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1182         { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
1183                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1184         { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */
1185                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
1186         { USB_DEVICE(0x0438, 0xb002),
1187                         .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
1188         { USB_DEVICE(0x2001, 0xf112),
1189                         .driver_info = EM2820_BOARD_DLINK_USB_TV },
1190         { USB_DEVICE(0x2304, 0x0207),
1191                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1192         { USB_DEVICE(0x2304, 0x0208),
1193                         .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
1194         { USB_DEVICE(0x2304, 0x021a),
1195                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
1196         { USB_DEVICE(0x2304, 0x0226),
1197                         .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO },
1198         { USB_DEVICE(0x2304, 0x0227),
1199                         .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
1200         { USB_DEVICE(0x2304, 0x023f),
1201                         .driver_info = EM2874_BOARD_PINNACLE_PCTV_80E },
1202         { USB_DEVICE(0x0413, 0x6023),
1203                         .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
1204         { USB_DEVICE(0x093b, 0xa005),
1205                         .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
1206         { },
1207 };
1208 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
1209
1210 /*
1211  *  Reset sequences for analog/digital modes
1212  */
1213
1214 /* Reset for the most [analog] boards */
1215 static struct em28xx_reg_seq default_analog[] = {
1216         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
1217         {       -1,             -1,     -1,             -1},
1218 };
1219
1220 /* Reset for the most [digital] boards */
1221 static struct em28xx_reg_seq default_digital[] = {
1222         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
1223         {       -1,             -1,     -1,             -1},
1224 };
1225
1226 /* Board Hauppauge WinTV HVR 900 analog */
1227 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
1228         {EM28XX_R08_GPIO,       0x2d,   ~EM_GPIO_4,     10},
1229         {0x05,                  0xff,   0x10,           10},
1230         {  -1,                  -1,     -1,             -1},
1231 };
1232
1233 /* Board Hauppauge WinTV HVR 900 digital */
1234 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
1235         {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
1236         {EM2880_R04_GPO,        0x04,   0x0f,           10},
1237         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
1238         { -1,                   -1,     -1,             -1},
1239 };
1240
1241 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
1242 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
1243         {EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,      10},
1244         {       -1,             -1,     -1,              -1},
1245 };
1246
1247 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
1248 static struct em28xx_reg_seq em2880_msi_digivox_ad_digital[] = {
1249         {EM28XX_R08_GPIO,       0x6a,   ~EM_GPIO_4,     10},
1250         {       -1,             -1,     -1,             -1},
1251 };
1252
1253 /* Board  - EM2870 Kworld 355u
1254    Analog - No input analog */
1255 static struct em28xx_reg_seq em2870_kworld_355u_digital[] = {
1256         {EM2880_R04_GPO,        0x01,   0xff,           10},
1257         {  -1,                  -1,     -1,             -1},
1258 };
1259
1260 /* Callback for the most boards */
1261 static struct em28xx_reg_seq default_callback[] = {
1262         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
1263         {EM28XX_R08_GPIO,       0,              EM_GPIO_4,      10},
1264         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
1265         {  -1,                  -1,             -1,             -1},
1266 };
1267
1268 /* Callback for EM2882 TERRATEC HYBRID XS */
1269 static struct em28xx_reg_seq em2882_terratec_hybrid_xs_digital[] = {
1270         {EM28XX_R08_GPIO,       0x2e,   0xff,              6},
1271         {EM28XX_R08_GPIO,       0x3e,   ~EM_GPIO_4,        6},
1272         {EM2880_R04_GPO,        0x04,   0xff,             10},
1273         {EM2880_R04_GPO,        0x0c,   0xff,             10},
1274         {  -1,                  -1,     -1,               -1},
1275 };
1276
1277 /* Pinnacle PCTV HD Mini (80e) GPIOs
1278    0-5: not used
1279    6:   demod reset, active low
1280    7:   LED on, active high */
1281 static struct em28xx_reg_seq em2874_pinnacle_80e_digital[] = {
1282         {EM28XX_R06_I2C_CLK,    0x45,   0xff,             10}, /*400 KHz*/
1283         {EM2874_R80_GPIO,       0x80,   0xff,             100},/*Demod reset*/
1284         {EM2874_R80_GPIO,       0xc0,   0xff,             10},
1285         {  -1,                  -1,     -1,               -1},
1286 };
1287
1288 /*
1289  * EEPROM hash table for devices with generic USB IDs
1290  */
1291 static struct em28xx_hash_table em28xx_eeprom_hash [] = {
1292         /* P/N: SA 60002070465 Tuner: TVF7533-MF */
1293         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
1294         {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
1295 };
1296
1297 /* I2C devicelist hash table for devices with generic USB IDs */
1298 static struct em28xx_hash_table em28xx_i2c_hash[] = {
1299         {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
1300         {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
1301         {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT},
1302 };
1303
1304 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
1305 {
1306         int rc = 0;
1307         struct em28xx *dev = ptr;
1308
1309         if (dev->tuner_type != TUNER_XC2028)
1310                 return 0;
1311
1312         if (command != XC2028_TUNER_RESET)
1313                 return 0;
1314
1315         if (dev->mode == EM28XX_ANALOG_MODE)
1316                 rc = em28xx_gpio_set(dev, dev->tun_analog_gpio);
1317         else
1318                 rc = em28xx_gpio_set(dev, dev->tun_digital_gpio);
1319
1320         return rc;
1321 }
1322 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
1323
1324 static void em28xx_set_model(struct em28xx *dev)
1325 {
1326         dev->is_em2800 = em28xx_boards[dev->model].is_em2800;
1327         dev->has_msp34xx = em28xx_boards[dev->model].has_msp34xx;
1328         dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
1329         dev->decoder = em28xx_boards[dev->model].decoder;
1330         dev->video_inputs = em28xx_boards[dev->model].vchannels;
1331         dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s;
1332         dev->max_range_640_480 = em28xx_boards[dev->model].max_range_640_480;
1333         dev->has_dvb = em28xx_boards[dev->model].has_dvb;
1334         dev->has_snapshot_button = em28xx_boards[dev->model].has_snapshot_button;
1335         dev->ir_codes = em28xx_boards[dev->model].ir_codes;
1336         dev->valid = em28xx_boards[dev->model].valid;
1337 }
1338
1339 /* Since em28xx_pre_card_setup() requires a proper dev->model,
1340  * this won't work for boards with generic PCI IDs
1341  */
1342 void em28xx_pre_card_setup(struct em28xx *dev)
1343 {
1344         int rc;
1345
1346         /* Set the default GPO/GPIO for legacy devices */
1347         dev->reg_gpo_num = EM2880_R04_GPO;
1348         dev->reg_gpio_num = EM28XX_R08_GPIO;
1349
1350         dev->wait_after_write = 5;
1351
1352         /* Based on the Chip ID, set the device configuration */
1353         rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
1354         if (rc > 0) {
1355                 dev->chip_id = rc;
1356                 switch (rc) {
1357                 case CHIP_ID_EM2860:
1358                         em28xx_info("chip ID is em2860\n");
1359                         break;
1360                 case CHIP_ID_EM2874:
1361                         em28xx_info("chip ID is em2874\n");
1362                         dev->reg_gpio_num = EM2874_R80_GPIO;
1363                         dev->wait_after_write = 0;
1364                         break;
1365                 case CHIP_ID_EM2883:
1366                         em28xx_info("chip ID is em2882/em2883\n");
1367                         dev->wait_after_write = 0;
1368                         break;
1369                 default:
1370                         em28xx_info("em28xx chip ID = %d\n", rc);
1371                 }
1372         }
1373
1374         /* Prepopulate cached GPO register content */
1375         rc = em28xx_read_reg(dev, dev->reg_gpo_num);
1376         if (rc >= 0)
1377                 dev->reg_gpo = rc;
1378
1379         em28xx_set_model(dev);
1380
1381         /* request some modules */
1382         switch (dev->model) {
1383         case EM2880_BOARD_TERRATEC_PRODIGY_XS:
1384         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1385         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1386         case EM2860_BOARD_TERRATEC_HYBRID_XS:
1387         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1388         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
1389         case EM2882_BOARD_PINNACLE_HYBRID_PRO:
1390         case EM2883_BOARD_KWORLD_HYBRID_A316:
1391         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1392                 em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1393                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1394                 msleep(50);
1395
1396                 /* Sets GPO/GPIO sequences for this device */
1397                 dev->analog_gpio      = hauppauge_wintv_hvr_900_analog;
1398                 dev->digital_gpio     = hauppauge_wintv_hvr_900_digital;
1399                 dev->tun_analog_gpio  = default_callback;
1400                 dev->tun_digital_gpio = default_callback;
1401                 break;
1402
1403         case EM2882_BOARD_TERRATEC_HYBRID_XS:
1404                 em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1405                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1406                 msleep(50);
1407
1408                 /* should be added ir_codes here */
1409
1410                 /* Sets GPO/GPIO sequences for this device */
1411                 dev->analog_gpio      = hauppauge_wintv_hvr_900_analog;
1412                 dev->digital_gpio     = hauppauge_wintv_hvr_900_digital;
1413                 dev->tun_analog_gpio  = default_callback;
1414                 dev->tun_digital_gpio = em2882_terratec_hybrid_xs_digital;
1415                 break;
1416
1417         case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
1418         case EM2880_BOARD_TERRATEC_HYBRID_XS:
1419         case EM2870_BOARD_TERRATEC_XS:
1420         case EM2881_BOARD_PINNACLE_HYBRID_PRO:
1421         case EM2880_BOARD_KWORLD_DVB_310U:
1422         case EM2870_BOARD_KWORLD_350U:
1423         case EM2881_BOARD_DNT_DA2_HYBRID:
1424                 em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1425                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1426                 msleep(50);
1427
1428                 /* NOTE: EM2881_DNT_DA2_HYBRID spend 140 msleep for digital
1429                          and analog commands. If this commands doesn't work,
1430                          add this timer. */
1431
1432                 /* Sets GPO/GPIO sequences for this device */
1433                 dev->analog_gpio      = default_analog;
1434                 dev->digital_gpio     = default_digital;
1435                 dev->tun_analog_gpio  = default_callback;
1436                 dev->tun_digital_gpio = default_callback;
1437                 break;
1438
1439         case EM2880_BOARD_MSI_DIGIVOX_AD:
1440         case EM2880_BOARD_MSI_DIGIVOX_AD_II:
1441                 em28xx_write_regs(dev, EM28XX_R0F_XCLK,    "\x27", 1);
1442                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1443                 msleep(50);
1444
1445                 /* Sets GPO/GPIO sequences for this device */
1446                 dev->analog_gpio      = em2880_msi_digivox_ad_analog;
1447                 dev->digital_gpio     = em2880_msi_digivox_ad_digital;
1448                 dev->tun_analog_gpio  = default_callback;
1449                 dev->tun_digital_gpio = default_callback;
1450                 break;
1451
1452         case EM2750_BOARD_UNKNOWN:
1453         case EM2750_BOARD_DLCW_130:
1454                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x0a", 1);
1455                 break;
1456
1457         case EM2861_BOARD_PLEXTOR_PX_TV100U:
1458                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1459                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1460                 /* FIXME guess */
1461                 /* Turn on analog audio output */
1462                 em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1);
1463                 break;
1464
1465         case EM2861_BOARD_KWORLD_PVRTV_300U:
1466         case EM2880_BOARD_KWORLD_DVB_305U:
1467                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1468                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x4c", 1);
1469                 msleep(10);
1470                 em28xx_write_regs(dev, 0x08, "\x6d", 1);
1471                 msleep(10);
1472                 em28xx_write_regs(dev, 0x08, "\x7d", 1);
1473                 msleep(10);
1474                 break;
1475
1476         case EM2870_BOARD_KWORLD_355U:
1477                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1478                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1479                 msleep(50);
1480
1481                 /* Sets GPO/GPIO sequences for this device */
1482                 dev->digital_gpio     = em2870_kworld_355u_digital;
1483                 break;
1484
1485         case EM2870_BOARD_COMPRO_VIDEOMATE:
1486                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1487                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1488                 /* TODO: someone can do some cleanup here...
1489                          not everything's needed */
1490                 em28xx_write_regs(dev, 0x04, "\x00", 1);
1491                 msleep(10);
1492                 em28xx_write_regs(dev, 0x04, "\x01", 1);
1493                 msleep(10);
1494                 em28xx_write_regs(dev, 0x08, "\xfd", 1);
1495                 mdelay(70);
1496                 em28xx_write_regs(dev, 0x08, "\xfc", 1);
1497                 mdelay(70);
1498                 em28xx_write_regs(dev, 0x08, "\xdc", 1);
1499                 mdelay(70);
1500                 em28xx_write_regs(dev, 0x08, "\xfc", 1);
1501                 mdelay(70);
1502                 break;
1503
1504         case EM2870_BOARD_TERRATEC_XS_MT2060:
1505                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1506                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1507                 /* this device needs some gpio writes to get the DVB-T
1508                    demod work */
1509                 em28xx_write_regs(dev, 0x08, "\xfe", 1);
1510                 mdelay(70);
1511                 em28xx_write_regs(dev, 0x08, "\xde", 1);
1512                 mdelay(70);
1513                 dev->em28xx_write_regs(dev, 0x08, "\xfe", 1);
1514                 mdelay(70);
1515                 break;
1516
1517         case EM2870_BOARD_PINNACLE_PCTV_DVB:
1518                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1519                 /* this device needs some gpio writes to get the
1520                    DVB-T demod work */
1521                 em28xx_write_regs(dev, 0x08, "\xfe", 1);
1522                 mdelay(70);
1523                 em28xx_write_regs(dev, 0x08, "\xde", 1);
1524                 mdelay(70);
1525                 em28xx_write_regs(dev, 0x08, "\xfe", 1);
1526                 mdelay(70);
1527                 /* switch em2880 rc protocol */
1528                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x22", 1);
1529                 /* should be added ir_codes here */
1530                 break;
1531
1532         case EM2820_BOARD_GADMEI_UTV310:
1533                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1534                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1535                 /* Turn on analog audio output */
1536                 em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1);
1537                 break;
1538
1539         case EM2860_BOARD_GADMEI_UTV330:
1540                 /* Turn on IR */
1541                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
1542                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1543                 /* should be added ir_codes here */
1544                 break;
1545
1546         case EM2820_BOARD_MSI_VOX_USB_2:
1547                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1);
1548                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
1549                 /* enables audio for that device */
1550                 em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1);
1551                 break;
1552
1553         case EM2874_BOARD_PINNACLE_PCTV_80E:
1554                 /* Set 400 KHz clock */
1555                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x45", 1);
1556
1557                 dev->digital_gpio = em2874_pinnacle_80e_digital;
1558                 break;
1559         }
1560
1561         em28xx_gpio_set(dev, dev->tun_analog_gpio);
1562         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
1563
1564         /* Unlock device */
1565         em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED);
1566 }
1567
1568 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
1569 {
1570         memset(ctl, 0, sizeof(*ctl));
1571
1572         ctl->fname   = XC2028_DEFAULT_FIRMWARE;
1573         ctl->max_len = 64;
1574         ctl->mts = em28xx_boards[dev->model].mts_firmware;
1575
1576         switch (dev->model) {
1577         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1578                 ctl->demod = XC3028_FE_ZARLINK456;
1579                 break;
1580         case EM2880_BOARD_TERRATEC_HYBRID_XS:
1581                 ctl->demod = XC3028_FE_ZARLINK456;
1582                 break;
1583         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1584                 /* djh - Not sure which demod we need here */
1585                 ctl->demod = XC3028_FE_DEFAULT;
1586                 break;
1587         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
1588                 ctl->demod = XC3028_FE_DEFAULT;
1589                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
1590                 break;
1591         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1592         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
1593                 /* FIXME: Better to specify the needed IF */
1594                 ctl->demod = XC3028_FE_DEFAULT;
1595                 break;
1596         default:
1597                 ctl->demod = XC3028_FE_OREN538;
1598         }
1599 }
1600
1601 static void em28xx_config_tuner(struct em28xx *dev)
1602 {
1603         struct v4l2_priv_tun_config  xc2028_cfg;
1604         struct tuner_setup           tun_setup;
1605         struct v4l2_frequency        f;
1606
1607         if (dev->tuner_type == TUNER_ABSENT)
1608                 return;
1609
1610         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
1611         tun_setup.type = dev->tuner_type;
1612         tun_setup.addr = dev->tuner_addr;
1613         tun_setup.tuner_callback = em28xx_tuner_callback;
1614
1615         em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup);
1616
1617         if (dev->tuner_type == TUNER_XC2028) {
1618                 struct xc2028_ctrl           ctl;
1619
1620                 em28xx_setup_xc3028(dev, &ctl);
1621
1622                 xc2028_cfg.tuner = TUNER_XC2028;
1623                 xc2028_cfg.priv  = &ctl;
1624
1625                 em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg);
1626         }
1627
1628         /* configure tuner */
1629         f.tuner = 0;
1630         f.type = V4L2_TUNER_ANALOG_TV;
1631         f.frequency = 9076;     /* just a magic number */
1632         dev->ctl_freq = f.frequency;
1633         em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f);
1634 }
1635
1636 static int em28xx_hint_board(struct em28xx *dev)
1637 {
1638         int i;
1639
1640         /* HINT method: EEPROM
1641          *
1642          * This method works only for boards with eeprom.
1643          * Uses a hash of all eeprom bytes. The hash should be
1644          * unique for a vendor/tuner pair.
1645          * There are a high chance that tuners for different
1646          * video standards produce different hashes.
1647          */
1648         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
1649                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
1650                         dev->model = em28xx_eeprom_hash[i].model;
1651                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
1652
1653                         em28xx_errdev("Your board has no unique USB ID.\n");
1654                         em28xx_errdev("A hint were successfully done, "
1655                                       "based on eeprom hash.\n");
1656                         em28xx_errdev("This method is not 100%% failproof.\n");
1657                         em28xx_errdev("If the board were missdetected, "
1658                                       "please email this log to:\n");
1659                         em28xx_errdev("\tV4L Mailing List "
1660                                       " <video4linux-list@redhat.com>\n");
1661                         em28xx_errdev("Board detected as %s\n",
1662                                       em28xx_boards[dev->model].name);
1663
1664                         return 0;
1665                 }
1666         }
1667
1668         /* HINT method: I2C attached devices
1669          *
1670          * This method works for all boards.
1671          * Uses a hash of i2c scanned devices.
1672          * Devices with the same i2c attached chips will
1673          * be considered equal.
1674          * This method is less precise than the eeprom one.
1675          */
1676
1677         /* user did not request i2c scanning => do it now */
1678         if (!dev->i2c_hash)
1679                 em28xx_do_i2c_scan(dev);
1680
1681         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
1682                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
1683                         dev->model = em28xx_i2c_hash[i].model;
1684                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
1685                         em28xx_errdev("Your board has no unique USB ID.\n");
1686                         em28xx_errdev("A hint were successfully done, "
1687                                       "based on i2c devicelist hash.\n");
1688                         em28xx_errdev("This method is not 100%% failproof.\n");
1689                         em28xx_errdev("If the board were missdetected, "
1690                                       "please email this log to:\n");
1691                         em28xx_errdev("\tV4L Mailing List "
1692                                       " <video4linux-list@redhat.com>\n");
1693                         em28xx_errdev("Board detected as %s\n",
1694                                       em28xx_boards[dev->model].name);
1695
1696                         return 0;
1697                 }
1698         }
1699
1700         em28xx_errdev("Your board has no unique USB ID and thus need a "
1701                       "hint to be detected.\n");
1702         em28xx_errdev("You may try to use card=<n> insmod option to "
1703                       "workaround that.\n");
1704         em28xx_errdev("Please send an email with this log to:\n");
1705         em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n");
1706         em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
1707         em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
1708
1709         em28xx_errdev("Here is a list of valid choices for the card=<n>"
1710                       " insmod option:\n");
1711         for (i = 0; i < em28xx_bcount; i++) {
1712                 em28xx_errdev("    card=%d -> %s\n",
1713                                 i, em28xx_boards[i].name);
1714         }
1715         return -1;
1716 }
1717
1718 /* ----------------------------------------------------------------------- */
1719 void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir)
1720 {
1721         if (disable_ir) {
1722                 ir->get_key = NULL;
1723                 return ;
1724         }
1725
1726         /* detect & configure */
1727         switch (dev->model) {
1728         case (EM2800_BOARD_UNKNOWN):
1729                 break;
1730         case (EM2820_BOARD_UNKNOWN):
1731                 break;
1732         case (EM2800_BOARD_TERRATEC_CINERGY_200):
1733         case (EM2820_BOARD_TERRATEC_CINERGY_250):
1734                 ir->ir_codes = ir_codes_em_terratec;
1735                 ir->get_key = em28xx_get_key_terratec;
1736                 snprintf(ir->c.name, sizeof(ir->c.name),
1737                          "i2c IR (EM28XX Terratec)");
1738                 break;
1739         case (EM2820_BOARD_PINNACLE_USB_2):
1740                 ir->ir_codes = ir_codes_pinnacle_grey;
1741                 ir->get_key = em28xx_get_key_pinnacle_usb_grey;
1742                 snprintf(ir->c.name, sizeof(ir->c.name),
1743                          "i2c IR (EM28XX Pinnacle PCTV)");
1744                 break;
1745         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
1746                 ir->ir_codes = ir_codes_hauppauge_new;
1747                 ir->get_key = em28xx_get_key_em_haup;
1748                 snprintf(ir->c.name, sizeof(ir->c.name),
1749                          "i2c IR (EM2840 Hauppauge)");
1750                 break;
1751         case (EM2820_BOARD_MSI_VOX_USB_2):
1752                 break;
1753         case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
1754                 break;
1755         case (EM2800_BOARD_KWORLD_USB2800):
1756                 break;
1757         case (EM2800_BOARD_GRABBEEX_USB2800):
1758                 break;
1759         }
1760 }
1761
1762 void em28xx_card_setup(struct em28xx *dev)
1763 {
1764         em28xx_set_model(dev);
1765
1766         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
1767
1768         /* request some modules */
1769         switch (dev->model) {
1770         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
1771         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
1772         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1773         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
1774         {
1775                 struct tveeprom tv;
1776 #ifdef CONFIG_MODULES
1777                 request_module("tveeprom");
1778 #endif
1779                 /* Call first TVeeprom */
1780
1781                 dev->i2c_client.addr = 0xa0 >> 1;
1782                 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
1783
1784                 dev->tuner_type = tv.tuner_type;
1785
1786                 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
1787                         dev->i2s_speed = 2048000;
1788                         dev->has_msp34xx = 1;
1789                 }
1790 #ifdef CONFIG_MODULES
1791                 if (tv.has_ir)
1792                         request_module("ir-kbd-i2c");
1793 #endif
1794                 break;
1795         }
1796         case EM2820_BOARD_KWORLD_PVRTV2800RF:
1797                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
1798                 em28xx_write_regs_req(dev, 0x00, 0x08, "\xf9", 1);
1799                 break;
1800         case EM2820_BOARD_UNKNOWN:
1801         case EM2800_BOARD_UNKNOWN:
1802                 /*
1803                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
1804                  *
1805                  * This occurs because they share identical USB vendor and
1806                  * product IDs.
1807                  *
1808                  * What we do here is look up the EEPROM hash of the K-WORLD
1809                  * and if it is found then we decide that we do not have
1810                  * a DIGIVOX and reset the device to the K-WORLD instead.
1811                  *
1812                  * This solution is only valid if they do not share eeprom
1813                  * hash identities which has not been determined as yet.
1814                  */
1815         case EM2880_BOARD_MSI_DIGIVOX_AD:
1816                 if (!em28xx_hint_board(dev))
1817                         em28xx_set_model(dev);
1818                 break;
1819         }
1820
1821         if (dev->has_snapshot_button)
1822                 em28xx_register_snapshot_button(dev);
1823
1824         if (dev->valid == EM28XX_BOARD_NOT_VALIDATED) {
1825                 em28xx_errdev("\n\n");
1826                 em28xx_errdev("The support for this board weren't "
1827                               "valid yet.\n");
1828                 em28xx_errdev("Please send a report of having this working\n");
1829                 em28xx_errdev("not to V4L mailing list (and/or to other "
1830                                 "addresses)\n\n");
1831         }
1832
1833         /* Allow override tuner type by a module parameter */
1834         if (tuner >= 0)
1835                 dev->tuner_type = tuner;
1836
1837 #ifdef CONFIG_MODULES
1838         /* request some modules */
1839         if (dev->has_msp34xx)
1840                 request_module("msp3400");
1841         if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114)
1842                 request_module("saa7115");
1843         if (dev->decoder == EM28XX_TVP5150)
1844                 request_module("tvp5150");
1845         if (dev->tuner_type != TUNER_ABSENT)
1846                 request_module("tuner");
1847 #endif
1848
1849         em28xx_config_tuner(dev);
1850
1851         em28xx_ir_init(dev);
1852 }