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