V4L/DVB (12260): em28xx: make support work for the Pinnacle Hybrid Pro (eb1a:2881)
[linux-2.6] / drivers / media / video / em28xx / em28xx-cards.c
1 /*
2    em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
3                     video capture devices
4
5    Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
6                       Markus Rechberger <mrechberger@gmail.com>
7                       Mauro Carvalho Chehab <mchehab@infradead.org>
8                       Sascha Sommer <saschasommer@freenet.de>
9
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  */
24
25 #include <linux/init.h>
26 #include <linux/module.h>
27 #include <linux/delay.h>
28 #include <linux/i2c.h>
29 #include <linux/usb.h>
30 #include <media/tuner.h>
31 #include <media/msp3400.h>
32 #include <media/saa7115.h>
33 #include <media/tvp5150.h>
34 #include <media/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,       0x6f,   ~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                 ctl->demod = XC3028_FE_ZARLINK456;
1994                 break;
1995         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
1996                 /* djh - Not sure which demod we need here */
1997                 ctl->demod = XC3028_FE_DEFAULT;
1998                 break;
1999         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
2000                 ctl->demod = XC3028_FE_DEFAULT;
2001                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
2002                 break;
2003         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2004         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2005         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
2006                 /* FIXME: Better to specify the needed IF */
2007                 ctl->demod = XC3028_FE_DEFAULT;
2008                 break;
2009         case EM2883_BOARD_KWORLD_HYBRID_330U:
2010                 ctl->demod = XC3028_FE_CHINA;
2011                 ctl->fname = XC2028_DEFAULT_FIRMWARE;
2012                 break;
2013         case EM2882_BOARD_EVGA_INDTUBE:
2014                 ctl->demod = XC3028_FE_CHINA;
2015                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
2016                 break;
2017         default:
2018                 ctl->demod = XC3028_FE_OREN538;
2019         }
2020 }
2021
2022 static void em28xx_tuner_setup(struct em28xx *dev)
2023 {
2024         struct tuner_setup           tun_setup;
2025         struct v4l2_frequency        f;
2026
2027         if (dev->tuner_type == TUNER_ABSENT)
2028                 return;
2029
2030         memset(&tun_setup, 0, sizeof(tun_setup));
2031
2032         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
2033         tun_setup.tuner_callback = em28xx_tuner_callback;
2034
2035         if (dev->board.radio.type) {
2036                 tun_setup.type = dev->board.radio.type;
2037                 tun_setup.addr = dev->board.radio_addr;
2038
2039                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
2040         }
2041
2042         if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) {
2043                 tun_setup.type   = dev->tuner_type;
2044                 tun_setup.addr   = dev->tuner_addr;
2045
2046                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
2047         }
2048
2049         if (dev->tda9887_conf) {
2050                 struct v4l2_priv_tun_config tda9887_cfg;
2051
2052                 tda9887_cfg.tuner = TUNER_TDA9887;
2053                 tda9887_cfg.priv = &dev->tda9887_conf;
2054
2055                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &tda9887_cfg);
2056         }
2057
2058         if (dev->tuner_type == TUNER_XC2028) {
2059                 struct v4l2_priv_tun_config  xc2028_cfg;
2060                 struct xc2028_ctrl           ctl;
2061
2062                 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
2063                 memset(&ctl, 0, sizeof(ctl));
2064
2065                 em28xx_setup_xc3028(dev, &ctl);
2066
2067                 xc2028_cfg.tuner = TUNER_XC2028;
2068                 xc2028_cfg.priv  = &ctl;
2069
2070                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &xc2028_cfg);
2071         }
2072
2073         /* configure tuner */
2074         f.tuner = 0;
2075         f.type = V4L2_TUNER_ANALOG_TV;
2076         f.frequency = 9076;     /* just a magic number */
2077         dev->ctl_freq = f.frequency;
2078         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
2079 }
2080
2081 static int em28xx_hint_board(struct em28xx *dev)
2082 {
2083         int i;
2084
2085         /* HINT method: EEPROM
2086          *
2087          * This method works only for boards with eeprom.
2088          * Uses a hash of all eeprom bytes. The hash should be
2089          * unique for a vendor/tuner pair.
2090          * There are a high chance that tuners for different
2091          * video standards produce different hashes.
2092          */
2093         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
2094                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
2095                         dev->model = em28xx_eeprom_hash[i].model;
2096                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
2097
2098                         em28xx_errdev("Your board has no unique USB ID.\n");
2099                         em28xx_errdev("A hint were successfully done, "
2100                                       "based on eeprom hash.\n");
2101                         em28xx_errdev("This method is not 100%% failproof.\n");
2102                         em28xx_errdev("If the board were missdetected, "
2103                                       "please email this log to:\n");
2104                         em28xx_errdev("\tV4L Mailing List "
2105                                       " <linux-media@vger.kernel.org>\n");
2106                         em28xx_errdev("Board detected as %s\n",
2107                                       em28xx_boards[dev->model].name);
2108
2109                         return 0;
2110                 }
2111         }
2112
2113         /* HINT method: I2C attached devices
2114          *
2115          * This method works for all boards.
2116          * Uses a hash of i2c scanned devices.
2117          * Devices with the same i2c attached chips will
2118          * be considered equal.
2119          * This method is less precise than the eeprom one.
2120          */
2121
2122         /* user did not request i2c scanning => do it now */
2123         if (!dev->i2c_hash)
2124                 em28xx_do_i2c_scan(dev);
2125
2126         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
2127                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
2128                         dev->model = em28xx_i2c_hash[i].model;
2129                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
2130                         em28xx_errdev("Your board has no unique USB ID.\n");
2131                         em28xx_errdev("A hint were successfully done, "
2132                                       "based on i2c devicelist hash.\n");
2133                         em28xx_errdev("This method is not 100%% failproof.\n");
2134                         em28xx_errdev("If the board were missdetected, "
2135                                       "please email this log to:\n");
2136                         em28xx_errdev("\tV4L Mailing List "
2137                                       " <linux-media@vger.kernel.org>\n");
2138                         em28xx_errdev("Board detected as %s\n",
2139                                       em28xx_boards[dev->model].name);
2140
2141                         return 0;
2142                 }
2143         }
2144
2145         em28xx_errdev("Your board has no unique USB ID and thus need a "
2146                       "hint to be detected.\n");
2147         em28xx_errdev("You may try to use card=<n> insmod option to "
2148                       "workaround that.\n");
2149         em28xx_errdev("Please send an email with this log to:\n");
2150         em28xx_errdev("\tV4L Mailing List <linux-media@vger.kernel.org>\n");
2151         em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
2152         em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
2153
2154         em28xx_errdev("Here is a list of valid choices for the card=<n>"
2155                       " insmod option:\n");
2156         for (i = 0; i < em28xx_bcount; i++) {
2157                 em28xx_errdev("    card=%d -> %s\n",
2158                                 i, em28xx_boards[i].name);
2159         }
2160         return -1;
2161 }
2162
2163 /* ----------------------------------------------------------------------- */
2164 void em28xx_register_i2c_ir(struct em28xx *dev)
2165 {
2166         struct i2c_board_info info;
2167         struct IR_i2c_init_data init_data;
2168         const unsigned short addr_list[] = {
2169                  0x30, 0x47, I2C_CLIENT_END
2170         };
2171
2172         if (disable_ir)
2173                 return;
2174
2175         memset(&info, 0, sizeof(struct i2c_board_info));
2176         memset(&init_data, 0, sizeof(struct IR_i2c_init_data));
2177         strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
2178
2179         /* detect & configure */
2180         switch (dev->model) {
2181         case (EM2800_BOARD_UNKNOWN):
2182                 break;
2183         case (EM2820_BOARD_UNKNOWN):
2184                 break;
2185         case (EM2800_BOARD_TERRATEC_CINERGY_200):
2186         case (EM2820_BOARD_TERRATEC_CINERGY_250):
2187                 init_data.ir_codes = ir_codes_em_terratec;
2188                 init_data.get_key = em28xx_get_key_terratec;
2189                 init_data.name = "i2c IR (EM28XX Terratec)";
2190                 break;
2191         case (EM2820_BOARD_PINNACLE_USB_2):
2192                 init_data.ir_codes = ir_codes_pinnacle_grey;
2193                 init_data.get_key = em28xx_get_key_pinnacle_usb_grey;
2194                 init_data.name = "i2c IR (EM28XX Pinnacle PCTV)";
2195                 break;
2196         case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2):
2197                 init_data.ir_codes = ir_codes_hauppauge_new;
2198                 init_data.get_key = em28xx_get_key_em_haup;
2199                 init_data.name = "i2c IR (EM2840 Hauppauge)";
2200                 break;
2201         case (EM2820_BOARD_MSI_VOX_USB_2):
2202                 break;
2203         case (EM2800_BOARD_LEADTEK_WINFAST_USBII):
2204                 break;
2205         case (EM2800_BOARD_KWORLD_USB2800):
2206                 break;
2207         case (EM2800_BOARD_GRABBEEX_USB2800):
2208                 break;
2209         }
2210
2211         if (init_data.name)
2212                 info.platform_data = &init_data;
2213         i2c_new_probed_device(&dev->i2c_adap, &info, addr_list);
2214 }
2215
2216 void em28xx_card_setup(struct em28xx *dev)
2217 {
2218         em28xx_set_model(dev);
2219
2220         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
2221         if (em28xx_boards[dev->model].tuner_addr)
2222                 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
2223
2224         if (em28xx_boards[dev->model].tda9887_conf)
2225                 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
2226
2227         /* request some modules */
2228         switch (dev->model) {
2229         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
2230         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
2231         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
2232         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2233         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2234         {
2235                 struct tveeprom tv;
2236 #ifdef CONFIG_MODULES
2237                 request_module("tveeprom");
2238 #endif
2239                 /* Call first TVeeprom */
2240
2241                 dev->i2c_client.addr = 0xa0 >> 1;
2242                 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
2243
2244                 dev->tuner_type = tv.tuner_type;
2245
2246                 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
2247                         dev->i2s_speed = 2048000;
2248                         dev->board.has_msp34xx = 1;
2249                 }
2250 #ifdef CONFIG_MODULES
2251                 if (tv.has_ir)
2252                         request_module("ir-kbd-i2c");
2253 #endif
2254                 break;
2255         }
2256         case EM2882_BOARD_KWORLD_ATSC_315U:
2257                 em28xx_write_reg(dev, 0x0d, 0x42);
2258                 msleep(10);
2259                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
2260                 msleep(10);
2261                 break;
2262         case EM2820_BOARD_KWORLD_PVRTV2800RF:
2263                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
2264                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
2265                 break;
2266         case EM2820_BOARD_UNKNOWN:
2267         case EM2800_BOARD_UNKNOWN:
2268                 /*
2269                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
2270                  *
2271                  * This occurs because they share identical USB vendor and
2272                  * product IDs.
2273                  *
2274                  * What we do here is look up the EEPROM hash of the K-WORLD
2275                  * and if it is found then we decide that we do not have
2276                  * a DIGIVOX and reset the device to the K-WORLD instead.
2277                  *
2278                  * This solution is only valid if they do not share eeprom
2279                  * hash identities which has not been determined as yet.
2280                  */
2281         case EM2880_BOARD_MSI_DIGIVOX_AD:
2282                 if (!em28xx_hint_board(dev))
2283                         em28xx_set_model(dev);
2284
2285                 /* In cases where we had to use a board hint, the call to
2286                    em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
2287                    so make the call now so the analog GPIOs are set properly
2288                    before probing the i2c bus. */
2289                 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2290                 break;
2291         case EM2820_BOARD_SILVERCREST_WEBCAM:
2292                 /* FIXME: need to document the registers bellow */
2293                 em28xx_write_reg(dev, 0x0d, 0x42);
2294                 em28xx_write_reg(dev, 0x13, 0x08);
2295         }
2296
2297         if (dev->board.has_snapshot_button)
2298                 em28xx_register_snapshot_button(dev);
2299
2300         if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
2301                 em28xx_errdev("\n\n");
2302                 em28xx_errdev("The support for this board weren't "
2303                               "valid yet.\n");
2304                 em28xx_errdev("Please send a report of having this working\n");
2305                 em28xx_errdev("not to V4L mailing list (and/or to other "
2306                                 "addresses)\n\n");
2307         }
2308
2309         /* Allow override tuner type by a module parameter */
2310         if (tuner >= 0)
2311                 dev->tuner_type = tuner;
2312
2313         /* request some modules */
2314         if (dev->board.has_msp34xx)
2315                 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2316                         "msp3400", "msp3400", msp3400_addrs);
2317
2318         if (dev->board.decoder == EM28XX_SAA711X)
2319                 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2320                         "saa7115", "saa7115_auto", saa711x_addrs);
2321
2322         if (dev->board.decoder == EM28XX_TVP5150)
2323                 v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2324                         "tvp5150", "tvp5150", tvp5150_addrs);
2325
2326         if (dev->em28xx_sensor == EM28XX_MT9V011) {
2327                 struct v4l2_subdev *sd;
2328
2329                 sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
2330                          &dev->i2c_adap, "mt9v011", "mt9v011", mt9v011_addrs);
2331                 v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal);
2332         }
2333
2334
2335         if (dev->board.adecoder == EM28XX_TVAUDIO)
2336                 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2337                         "tvaudio", "tvaudio", dev->board.tvaudio_addr);
2338
2339         if (dev->board.tuner_type != TUNER_ABSENT) {
2340                 int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
2341
2342                 if (dev->board.radio.type)
2343                         v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2344                                 "tuner", "tuner", dev->board.radio_addr);
2345
2346                 if (has_demod)
2347                         v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
2348                                 &dev->i2c_adap, "tuner", "tuner",
2349                                 v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
2350                 if (dev->tuner_addr == 0) {
2351                         enum v4l2_i2c_tuner_type type =
2352                                 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
2353                         struct v4l2_subdev *sd;
2354
2355                         sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev,
2356                                 &dev->i2c_adap, "tuner", "tuner",
2357                                 v4l2_i2c_tuner_addrs(type));
2358
2359                         if (sd)
2360                                 dev->tuner_addr = v4l2_i2c_subdev_addr(sd);
2361                 } else {
2362                         v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2363                                 "tuner", "tuner", dev->tuner_addr);
2364                 }
2365         }
2366
2367         em28xx_tuner_setup(dev);
2368         em28xx_ir_init(dev);
2369 }
2370
2371
2372 #if defined(CONFIG_MODULES) && defined(MODULE)
2373 static void request_module_async(struct work_struct *work)
2374 {
2375         struct em28xx *dev = container_of(work,
2376                              struct em28xx, request_module_wk);
2377
2378         if (dev->has_audio_class)
2379                 request_module("snd-usb-audio");
2380         else if (dev->has_alsa_audio)
2381                 request_module("em28xx-alsa");
2382
2383         if (dev->board.has_dvb)
2384                 request_module("em28xx-dvb");
2385 }
2386
2387 static void request_modules(struct em28xx *dev)
2388 {
2389         INIT_WORK(&dev->request_module_wk, request_module_async);
2390         schedule_work(&dev->request_module_wk);
2391 }
2392 #else
2393 #define request_modules(dev)
2394 #endif /* CONFIG_MODULES */
2395
2396 /*
2397  * em28xx_realease_resources()
2398  * unregisters the v4l2,i2c and usb devices
2399  * called when the device gets disconected or at module unload
2400 */
2401 void em28xx_release_resources(struct em28xx *dev)
2402 {
2403         if (dev->sbutton_input_dev)
2404                 em28xx_deregister_snapshot_button(dev);
2405
2406         if (dev->ir)
2407                 em28xx_ir_fini(dev);
2408
2409         /*FIXME: I2C IR should be disconnected */
2410
2411         em28xx_release_analog_resources(dev);
2412
2413         em28xx_remove_from_devlist(dev);
2414
2415         em28xx_i2c_unregister(dev);
2416
2417         v4l2_device_unregister(&dev->v4l2_dev);
2418
2419         usb_put_dev(dev->udev);
2420
2421         /* Mark device as unused */
2422         em28xx_devused &= ~(1 << dev->devno);
2423 };
2424
2425 /*
2426  * em28xx_init_dev()
2427  * allocates and inits the device structs, registers i2c bus and v4l device
2428  */
2429 static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev,
2430                            struct usb_interface *interface,
2431                            int minor)
2432 {
2433         struct em28xx *dev = *devhandle;
2434         int retval = -ENOMEM;
2435         int errCode;
2436
2437         dev->udev = udev;
2438         mutex_init(&dev->ctrl_urb_lock);
2439         spin_lock_init(&dev->slock);
2440         init_waitqueue_head(&dev->open);
2441         init_waitqueue_head(&dev->wait_frame);
2442         init_waitqueue_head(&dev->wait_stream);
2443
2444         dev->em28xx_write_regs = em28xx_write_regs;
2445         dev->em28xx_read_reg = em28xx_read_reg;
2446         dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
2447         dev->em28xx_write_regs_req = em28xx_write_regs_req;
2448         dev->em28xx_read_reg_req = em28xx_read_reg_req;
2449         dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
2450
2451         em28xx_pre_card_setup(dev);
2452
2453         if (!dev->board.is_em2800) {
2454                 /* Sets I2C speed to 100 KHz */
2455                 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, 0x40);
2456                 if (retval < 0) {
2457                         em28xx_errdev("%s: em28xx_write_regs_req failed!"
2458                                       " retval [%d]\n",
2459                                       __func__, retval);
2460                         return retval;
2461                 }
2462         }
2463
2464         retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
2465         if (retval < 0) {
2466                 em28xx_errdev("Call to v4l2_device_register() failed!\n");
2467                 return retval;
2468         }
2469
2470         /* register i2c bus */
2471         errCode = em28xx_i2c_register(dev);
2472         if (errCode < 0) {
2473                 v4l2_device_unregister(&dev->v4l2_dev);
2474                 em28xx_errdev("%s: em28xx_i2c_register - errCode [%d]!\n",
2475                         __func__, errCode);
2476                 return errCode;
2477         }
2478
2479         /*
2480          * Default format, used for tvp5150 or saa711x output formats
2481          */
2482         dev->vinmode = 0x10;
2483         dev->vinctl  = 0x11;
2484
2485         /*
2486          * If the device can be a webcam, seek for a sensor.
2487          * If sensor is not found, then it isn't a webcam.
2488          */
2489         if (dev->board.is_webcam)
2490                 if (em28xx_hint_sensor(dev) < 0)
2491                         dev->board.is_webcam = 0;
2492
2493         /* Do board specific init and eeprom reading */
2494         em28xx_card_setup(dev);
2495
2496         /* Configure audio */
2497         errCode = em28xx_audio_setup(dev);
2498         if (errCode < 0) {
2499                 v4l2_device_unregister(&dev->v4l2_dev);
2500                 em28xx_errdev("%s: Error while setting audio - errCode [%d]!\n",
2501                         __func__, errCode);
2502         }
2503
2504         /* wake i2c devices */
2505         em28xx_wake_i2c(dev);
2506
2507         /* init video dma queues */
2508         INIT_LIST_HEAD(&dev->vidq.active);
2509         INIT_LIST_HEAD(&dev->vidq.queued);
2510
2511
2512         if (dev->board.has_msp34xx) {
2513                 /* Send a reset to other chips via gpio */
2514                 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
2515                 if (errCode < 0) {
2516                         em28xx_errdev("%s: em28xx_write_regs_req - "
2517                                       "msp34xx(1) failed! errCode [%d]\n",
2518                                       __func__, errCode);
2519                         return errCode;
2520                 }
2521                 msleep(3);
2522
2523                 errCode = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
2524                 if (errCode < 0) {
2525                         em28xx_errdev("%s: em28xx_write_regs_req - "
2526                                       "msp34xx(2) failed! errCode [%d]\n",
2527                                       __func__, errCode);
2528                         return errCode;
2529                 }
2530                 msleep(3);
2531         }
2532
2533         em28xx_add_into_devlist(dev);
2534
2535         retval = em28xx_register_analog_devices(dev);
2536         if (retval < 0) {
2537                 em28xx_release_resources(dev);
2538                 goto fail_reg_devices;
2539         }
2540
2541         em28xx_init_extension(dev);
2542
2543         /* Save some power by putting tuner to sleep */
2544         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_standby);
2545
2546         return 0;
2547
2548 fail_reg_devices:
2549         return retval;
2550 }
2551
2552 /*
2553  * em28xx_usb_probe()
2554  * checks for supported devices
2555  */
2556 static int em28xx_usb_probe(struct usb_interface *interface,
2557                             const struct usb_device_id *id)
2558 {
2559         const struct usb_endpoint_descriptor *endpoint;
2560         struct usb_device *udev;
2561         struct usb_interface *uif;
2562         struct em28xx *dev = NULL;
2563         int retval;
2564         int i, nr, ifnum, isoc_pipe;
2565         char *speed;
2566         char descr[255] = "";
2567
2568         udev = usb_get_dev(interface_to_usbdev(interface));
2569         ifnum = interface->altsetting[0].desc.bInterfaceNumber;
2570
2571         /* Check to see next free device and mark as used */
2572         nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
2573         em28xx_devused |= 1<<nr;
2574
2575         /* Don't register audio interfaces */
2576         if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
2577                 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
2578                         "interface %i, class %i\n",
2579                         le16_to_cpu(udev->descriptor.idVendor),
2580                         le16_to_cpu(udev->descriptor.idProduct),
2581                         ifnum,
2582                         interface->altsetting[0].desc.bInterfaceClass);
2583
2584                 em28xx_devused &= ~(1<<nr);
2585                 retval = -ENODEV;
2586                 goto err;
2587         }
2588
2589         endpoint = &interface->cur_altsetting->endpoint[0].desc;
2590
2591         /* check if the device has the iso in endpoint at the correct place */
2592         if (usb_endpoint_xfer_isoc(endpoint)
2593             &&
2594             (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940)) {
2595                 /* It's a newer em2874/em2875 device */
2596                 isoc_pipe = 0;
2597         } else {
2598                 int check_interface = 1;
2599                 isoc_pipe = 1;
2600                 endpoint = &interface->cur_altsetting->endpoint[1].desc;
2601                 if (!usb_endpoint_xfer_isoc(endpoint))
2602                         check_interface = 0;
2603
2604                 if (usb_endpoint_dir_out(endpoint))
2605                         check_interface = 0;
2606
2607                 if (!check_interface) {
2608                         em28xx_err(DRIVER_NAME " video device (%04x:%04x): "
2609                                 "interface %i, class %i found.\n",
2610                                 le16_to_cpu(udev->descriptor.idVendor),
2611                                 le16_to_cpu(udev->descriptor.idProduct),
2612                                 ifnum,
2613                                 interface->altsetting[0].desc.bInterfaceClass);
2614
2615                         em28xx_err(DRIVER_NAME " This is an anciliary "
2616                                 "interface not used by the driver\n");
2617
2618                         em28xx_devused &= ~(1<<nr);
2619                         retval = -ENODEV;
2620                         goto err;
2621                 }
2622         }
2623
2624         switch (udev->speed) {
2625         case USB_SPEED_LOW:
2626                 speed = "1.5";
2627                 break;
2628         case USB_SPEED_UNKNOWN:
2629         case USB_SPEED_FULL:
2630                 speed = "12";
2631                 break;
2632         case USB_SPEED_HIGH:
2633                 speed = "480";
2634                 break;
2635         default:
2636                 speed = "unknown";
2637         }
2638
2639         if (udev->manufacturer)
2640                 strlcpy(descr, udev->manufacturer, sizeof(descr));
2641
2642         if (udev->product) {
2643                 if (*descr)
2644                         strlcat(descr, " ", sizeof(descr));
2645                 strlcat(descr, udev->product, sizeof(descr));
2646         }
2647         if (*descr)
2648                 strlcat(descr, " ", sizeof(descr));
2649
2650         printk(DRIVER_NAME ": New device %s@ %s Mbps "
2651                 "(%04x:%04x, interface %d, class %d)\n",
2652                 descr,
2653                 speed,
2654                 le16_to_cpu(udev->descriptor.idVendor),
2655                 le16_to_cpu(udev->descriptor.idProduct),
2656                 ifnum,
2657                 interface->altsetting->desc.bInterfaceNumber);
2658
2659         /*
2660          * Make sure we have 480 Mbps of bandwidth, otherwise things like
2661          * video stream wouldn't likely work, since 12 Mbps is generally
2662          * not enough even for most Digital TV streams.
2663          */
2664         if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
2665                 printk(DRIVER_NAME ": Device initialization failed.\n");
2666                 printk(DRIVER_NAME ": Device must be connected to a high-speed"
2667                        " USB 2.0 port.\n");
2668                 em28xx_devused &= ~(1<<nr);
2669                 retval = -ENODEV;
2670                 goto err;
2671         }
2672
2673         if (nr >= EM28XX_MAXBOARDS) {
2674                 printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
2675                                 EM28XX_MAXBOARDS);
2676                 em28xx_devused &= ~(1<<nr);
2677                 retval = -ENOMEM;
2678                 goto err;
2679         }
2680
2681         /* allocate memory for our device state and initialize it */
2682         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
2683         if (dev == NULL) {
2684                 em28xx_err(DRIVER_NAME ": out of memory!\n");
2685                 em28xx_devused &= ~(1<<nr);
2686                 retval = -ENOMEM;
2687                 goto err;
2688         }
2689
2690         snprintf(dev->name, 29, "em28xx #%d", nr);
2691         dev->devno = nr;
2692         dev->model = id->driver_info;
2693         dev->alt   = -1;
2694
2695         /* Checks if audio is provided by some interface */
2696         for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
2697                 uif = udev->config->interface[i];
2698                 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
2699                         dev->has_audio_class = 1;
2700                         break;
2701                 }
2702         }
2703
2704         /* compute alternate max packet sizes */
2705         uif = udev->actconfig->interface[0];
2706
2707         dev->num_alt = uif->num_altsetting;
2708         dev->alt_max_pkt_size = kmalloc(32 * dev->num_alt, GFP_KERNEL);
2709
2710         if (dev->alt_max_pkt_size == NULL) {
2711                 em28xx_errdev("out of memory!\n");
2712                 em28xx_devused &= ~(1<<nr);
2713                 kfree(dev);
2714                 retval = -ENOMEM;
2715                 goto err;
2716         }
2717
2718         for (i = 0; i < dev->num_alt ; i++) {
2719                 u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.wMaxPacketSize);
2720                 dev->alt_max_pkt_size[i] =
2721                     (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);
2722         }
2723
2724         if ((card[nr] >= 0) && (card[nr] < em28xx_bcount))
2725                 dev->model = card[nr];
2726
2727         /* allocate device struct */
2728         mutex_init(&dev->lock);
2729         mutex_lock(&dev->lock);
2730         retval = em28xx_init_dev(&dev, udev, interface, nr);
2731         if (retval) {
2732                 em28xx_devused &= ~(1<<dev->devno);
2733                 mutex_unlock(&dev->lock);
2734                 kfree(dev);
2735                 goto err;
2736         }
2737
2738         /* save our data pointer in this interface device */
2739         usb_set_intfdata(interface, dev);
2740
2741         request_modules(dev);
2742
2743         /* Should be the last thing to do, to avoid newer udev's to
2744            open the device before fully initializing it
2745          */
2746         mutex_unlock(&dev->lock);
2747
2748         return 0;
2749
2750 err:
2751         return retval;
2752 }
2753
2754 /*
2755  * em28xx_usb_disconnect()
2756  * called when the device gets diconencted
2757  * video device will be unregistered on v4l2_close in case it is still open
2758  */
2759 static void em28xx_usb_disconnect(struct usb_interface *interface)
2760 {
2761         struct em28xx *dev;
2762
2763         dev = usb_get_intfdata(interface);
2764         usb_set_intfdata(interface, NULL);
2765
2766         if (!dev)
2767                 return;
2768
2769         em28xx_info("disconnecting %s\n", dev->vdev->name);
2770
2771         /* wait until all current v4l2 io is finished then deallocate
2772            resources */
2773         mutex_lock(&dev->lock);
2774
2775         wake_up_interruptible_all(&dev->open);
2776
2777         v4l2_device_disconnect(&dev->v4l2_dev);
2778
2779         if (dev->users) {
2780                 em28xx_warn
2781                     ("device /dev/video%d is open! Deregistration and memory "
2782                      "deallocation are deferred on close.\n",
2783                                 dev->vdev->num);
2784
2785                 dev->state |= DEV_MISCONFIGURED;
2786                 em28xx_uninit_isoc(dev);
2787                 dev->state |= DEV_DISCONNECTED;
2788                 wake_up_interruptible(&dev->wait_frame);
2789                 wake_up_interruptible(&dev->wait_stream);
2790         } else {
2791                 dev->state |= DEV_DISCONNECTED;
2792                 em28xx_release_resources(dev);
2793         }
2794
2795         em28xx_close_extension(dev);
2796
2797         mutex_unlock(&dev->lock);
2798
2799         if (!dev->users) {
2800                 kfree(dev->alt_max_pkt_size);
2801                 kfree(dev);
2802         }
2803 }
2804
2805 static struct usb_driver em28xx_usb_driver = {
2806         .name = "em28xx",
2807         .probe = em28xx_usb_probe,
2808         .disconnect = em28xx_usb_disconnect,
2809         .id_table = em28xx_id_table,
2810 };
2811
2812 static int __init em28xx_module_init(void)
2813 {
2814         int result;
2815
2816         /* register this driver with the USB subsystem */
2817         result = usb_register(&em28xx_usb_driver);
2818         if (result)
2819                 em28xx_err(DRIVER_NAME
2820                            " usb_register failed. Error number %d.\n", result);
2821
2822         printk(KERN_INFO DRIVER_NAME " driver loaded\n");
2823
2824         return result;
2825 }
2826
2827 static void __exit em28xx_module_exit(void)
2828 {
2829         /* deregister this driver with the USB subsystem */
2830         usb_deregister(&em28xx_usb_driver);
2831 }
2832
2833 module_init(em28xx_module_init);
2834 module_exit(em28xx_module_exit);