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