9a2cb6136728f5c312785cd1d4c1c23e03d8f32c
[linux-2.6-block.git] / drivers / media / usb / 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    Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
10
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 2 of the License, or
14    (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software
23    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  */
25
26 #include <linux/init.h>
27 #include <linux/module.h>
28 #include <linux/slab.h>
29 #include <linux/delay.h>
30 #include <linux/i2c.h>
31 #include <linux/usb.h>
32 #include <media/tuner.h>
33 #include <media/msp3400.h>
34 #include <media/saa7115.h>
35 #include <media/tvp5150.h>
36 #include <media/tvaudio.h>
37 #include <media/mt9v011.h>
38 #include <media/i2c-addr.h>
39 #include <media/tveeprom.h>
40 #include <media/v4l2-common.h>
41 #include <media/v4l2-chip-ident.h>
42
43 #include "em28xx.h"
44
45 #define DRIVER_NAME         "em28xx"
46
47 static int tuner = -1;
48 module_param(tuner, int, 0444);
49 MODULE_PARM_DESC(tuner, "tuner type");
50
51 static unsigned int disable_ir;
52 module_param(disable_ir, int, 0444);
53 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
54
55 static unsigned int disable_usb_speed_check;
56 module_param(disable_usb_speed_check, int, 0444);
57 MODULE_PARM_DESC(disable_usb_speed_check,
58                  "override min bandwidth requirement of 480M bps");
59
60 static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = UNSET };
61 module_param_array(card,  int, NULL, 0444);
62 MODULE_PARM_DESC(card,     "card type");
63
64 static unsigned int prefer_bulk;
65 module_param(prefer_bulk, int, 0444);
66 MODULE_PARM_DESC(prefer_bulk, "prefer USB bulk transfers");
67
68
69 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
70 static unsigned long em28xx_devused;
71
72 struct em28xx_hash_table {
73         unsigned long hash;
74         unsigned int  model;
75         unsigned int  tuner;
76 };
77
78 static void em28xx_pre_card_setup(struct em28xx *dev);
79
80 /*
81  *  Reset sequences for analog/digital modes
82  */
83
84 /* Reset for the most [analog] boards */
85 static struct em28xx_reg_seq default_analog[] = {
86         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
87         {       -1,             -1,     -1,             -1},
88 };
89
90 /* Reset for the most [digital] boards */
91 static struct em28xx_reg_seq default_digital[] = {
92         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
93         {       -1,             -1,     -1,             -1},
94 };
95
96 /* Board Hauppauge WinTV HVR 900 analog */
97 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
98         {EM28XX_R08_GPIO,       0x2d,   ~EM_GPIO_4,     10},
99         {0x05,                  0xff,   0x10,           10},
100         {  -1,                  -1,     -1,             -1},
101 };
102
103 /* Board Hauppauge WinTV HVR 900 digital */
104 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
105         {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
106         {EM2880_R04_GPO,        0x04,   0x0f,           10},
107         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
108         { -1,                   -1,     -1,             -1},
109 };
110
111 /* Board Hauppauge WinTV HVR 900 (R2) digital */
112 static struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
113         {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
114         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
115         { -1,                   -1,     -1,             -1},
116 };
117
118 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
119 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
120         {EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,      10},
121         {       -1,             -1,     -1,              -1},
122 };
123
124 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
125
126 /* Board  - EM2870 Kworld 355u
127    Analog - No input analog */
128
129 /* Board - EM2882 Kworld 315U digital */
130 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
131         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
132         {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
133         {EM2880_R04_GPO,        0x04,   0xff,           10},
134         {EM2880_R04_GPO,        0x0c,   0xff,           10},
135         {EM28XX_R08_GPIO,       0x7e,   0xff,           10},
136         {  -1,                  -1,     -1,             -1},
137 };
138
139 static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
140         {EM2880_R04_GPO,        0x08,   0xff,           10},
141         {EM2880_R04_GPO,        0x0c,   0xff,           10},
142         {EM2880_R04_GPO,        0x08,   0xff,           10},
143         {EM2880_R04_GPO,        0x0c,   0xff,           10},
144         {  -1,                  -1,     -1,             -1},
145 };
146
147 static struct em28xx_reg_seq kworld_330u_analog[] = {
148         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
149         {EM2880_R04_GPO,        0x00,   0xff,           10},
150         { -1,                   -1,     -1,             -1},
151 };
152
153 static struct em28xx_reg_seq kworld_330u_digital[] = {
154         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
155         {EM2880_R04_GPO,        0x08,   0xff,           10},
156         { -1,                   -1,     -1,             -1},
157 };
158
159 /* Evga inDtube
160    GPIO0 - Enable digital power (s5h1409) - low to enable
161    GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
162    GPIO4 - xc3028 reset
163    GOP3  - s5h1409 reset
164  */
165 static struct em28xx_reg_seq evga_indtube_analog[] = {
166         {EM28XX_R08_GPIO,       0x79,   0xff,           60},
167         {       -1,             -1,     -1,             -1},
168 };
169
170 static struct em28xx_reg_seq evga_indtube_digital[] = {
171         {EM28XX_R08_GPIO,       0x7a,   0xff,            1},
172         {EM2880_R04_GPO,        0x04,   0xff,           10},
173         {EM2880_R04_GPO,        0x0c,   0xff,            1},
174         { -1,                   -1,     -1,             -1},
175 };
176
177 /*
178  * KWorld PlusTV 340U and UB435-Q (ATSC) GPIOs map:
179  * EM_GPIO_0 - currently unknown
180  * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
181  * EM_GPIO_2 - currently unknown
182  * EM_GPIO_3 - currently unknown
183  * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
184  * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
185  * EM_GPIO_6 - currently unknown
186  * EM_GPIO_7 - currently unknown
187  */
188 static struct em28xx_reg_seq kworld_a340_digital[] = {
189         {EM28XX_R08_GPIO,       0x6d,           ~EM_GPIO_4,     10},
190         { -1,                   -1,             -1,             -1},
191 };
192
193 /* Pinnacle Hybrid Pro eb1a:2881 */
194 static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
195         {EM28XX_R08_GPIO,       0xfd,   ~EM_GPIO_4,     10},
196         {       -1,             -1,     -1,             -1},
197 };
198
199 static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
200         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
201         {EM2880_R04_GPO,        0x04,   0xff,          100},/* zl10353 reset */
202         {EM2880_R04_GPO,        0x0c,   0xff,            1},
203         {       -1,             -1,     -1,             -1},
204 };
205
206 static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
207         {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
208         {EM2880_R04_GPO,        0x00,   0xff,           10},
209         { -1,                   -1,     -1,             -1},
210 };
211
212 static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
213         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
214         {EM2880_R04_GPO,        0x08,   0xff,           10},
215         { -1,                   -1,     -1,             -1},
216 };
217
218 /* eb1a:2868 Reddo DVB-C USB TV Box
219    GPIO4 - CU1216L NIM
220    Other GPIOs seems to be don't care. */
221 static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
222         {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
223         {EM28XX_R08_GPIO,       0xde,   0xff,           10},
224         {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
225         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
226         {EM28XX_R08_GPIO,       0x7f,   0xff,           10},
227         {EM28XX_R08_GPIO,       0x6f,   0xff,           10},
228         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
229         {-1,                    -1,     -1,             -1},
230 };
231
232 /* Callback for the most boards */
233 static struct em28xx_reg_seq default_tuner_gpio[] = {
234         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
235         {EM28XX_R08_GPIO,       0,              EM_GPIO_4,      10},
236         {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
237         {  -1,                  -1,             -1,             -1},
238 };
239
240 /* Mute/unmute */
241 static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
242         {EM28XX_R08_GPIO,       5,              7,              10},
243         {  -1,                  -1,             -1,             -1},
244 };
245
246 static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
247         {EM28XX_R08_GPIO,       4,              7,              10},
248         {  -1,                  -1,             -1,             -1},
249 };
250
251 static struct em28xx_reg_seq compro_mute_gpio[] = {
252         {EM28XX_R08_GPIO,       6,              7,              10},
253         {  -1,                  -1,             -1,             -1},
254 };
255
256 /* Terratec AV350 */
257 static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
258         {EM28XX_R08_GPIO,       0xff,   0x7f,           10},
259         {       -1,             -1,     -1,             -1},
260 };
261
262 static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
263         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
264         {       -1,             -1,     -1,             -1},
265 };
266
267 static struct em28xx_reg_seq silvercrest_reg_seq[] = {
268         {EM28XX_R08_GPIO,       0xff,   0xff,           10},
269         {EM28XX_R08_GPIO,       0x01,   0xf7,           10},
270         {       -1,             -1,     -1,             -1},
271 };
272
273 static struct em28xx_reg_seq vc211a_enable[] = {
274         {EM28XX_R08_GPIO,       0xff,   0x07,           10},
275         {EM28XX_R08_GPIO,       0xff,   0x0f,           10},
276         {EM28XX_R08_GPIO,       0xff,   0x0b,           10},
277         {       -1,             -1,     -1,             -1},
278 };
279
280 static struct em28xx_reg_seq dikom_dk300_digital[] = {
281         {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
282         {EM2880_R04_GPO,        0x08,   0xff,           10},
283         { -1,                   -1,     -1,             -1},
284 };
285
286
287 /* Reset for the most [digital] boards */
288 static struct em28xx_reg_seq leadership_digital[] = {
289         {EM2874_R80_GPIO,       0x70,   0xff,   10},
290         {       -1,             -1,     -1,     -1},
291 };
292
293 static struct em28xx_reg_seq leadership_reset[] = {
294         {EM2874_R80_GPIO,       0xf0,   0xff,   10},
295         {EM2874_R80_GPIO,       0xb0,   0xff,   10},
296         {EM2874_R80_GPIO,       0xf0,   0xff,   10},
297         {       -1,             -1,     -1,     -1},
298 };
299
300 /* 2013:024f PCTV nanoStick T2 290e
301  * GPIO_6 - demod reset
302  * GPIO_7 - LED
303  */
304 static struct em28xx_reg_seq pctv_290e[] = {
305         {EM2874_R80_GPIO,       0x00,   0xff,           80},
306         {EM2874_R80_GPIO,       0x40,   0xff,           80}, /* GPIO_6 = 1 */
307         {EM2874_R80_GPIO,       0xc0,   0xff,           80}, /* GPIO_7 = 1 */
308         {-1,                    -1,     -1,             -1},
309 };
310
311 #if 0
312 static struct em28xx_reg_seq terratec_h5_gpio[] = {
313         {EM28XX_R08_GPIO,       0xff,   0xff,   10},
314         {EM2874_R80_GPIO,       0xf6,   0xff,   100},
315         {EM2874_R80_GPIO,       0xf2,   0xff,   50},
316         {EM2874_R80_GPIO,       0xf6,   0xff,   50},
317         { -1,                   -1,     -1,     -1},
318 };
319
320 static struct em28xx_reg_seq terratec_h5_digital[] = {
321         {EM2874_R80_GPIO,       0xf6,   0xff,   10},
322         {EM2874_R80_GPIO,       0xe6,   0xff,   100},
323         {EM2874_R80_GPIO,       0xa6,   0xff,   10},
324         { -1,                   -1,     -1,     -1},
325 };
326 #endif
327
328 /* 2013:024f PCTV DVB-S2 Stick 460e
329  * GPIO_0 - POWER_ON
330  * GPIO_1 - BOOST
331  * GPIO_2 - VUV_LNB (red LED)
332  * GPIO_3 - EXT_12V
333  * GPIO_4 - INT_DEM (DEMOD GPIO_0)
334  * GPIO_5 - INT_LNB
335  * GPIO_6 - RESET_DEM
336  * GPIO_7 - LED (green LED)
337  */
338 static struct em28xx_reg_seq pctv_460e[] = {
339         {EM2874_R80_GPIO, 0x01, 0xff,  50},
340         {0x0d,            0xff, 0xff,  50},
341         {EM2874_R80_GPIO, 0x41, 0xff,  50}, /* GPIO_6=1 */
342         {0x0d,            0x42, 0xff,  50},
343         {EM2874_R80_GPIO, 0x61, 0xff,  50}, /* GPIO_5=1 */
344         {             -1,   -1,   -1,  -1},
345 };
346
347 #if 0
348 static struct em28xx_reg_seq hauppauge_930c_gpio[] = {
349         {EM2874_R80_GPIO,       0x6f,   0xff,   10},
350         {EM2874_R80_GPIO,       0x4f,   0xff,   10}, /* xc5000 reset */
351         {EM2874_R80_GPIO,       0x6f,   0xff,   10},
352         {EM2874_R80_GPIO,       0x4f,   0xff,   10},
353         { -1,                   -1,     -1,     -1},
354 };
355
356 static struct em28xx_reg_seq hauppauge_930c_digital[] = {
357         {EM2874_R80_GPIO,       0xf6,   0xff,   10},
358         {EM2874_R80_GPIO,       0xe6,   0xff,   100},
359         {EM2874_R80_GPIO,       0xa6,   0xff,   10},
360         { -1,                   -1,     -1,     -1},
361 };
362 #endif
363
364 /* 1b80:e425 MaxMedia UB425-TC
365  * GPIO_6 - demod reset, 0=active
366  * GPIO_7 - LED, 0=active
367  */
368 static struct em28xx_reg_seq maxmedia_ub425_tc[] = {
369         {EM2874_R80_GPIO,  0x83,  0xff,  100},
370         {EM2874_R80_GPIO,  0xc3,  0xff,  100}, /* GPIO_6 = 1 */
371         {EM2874_R80_GPIO,  0x43,  0xff,  000}, /* GPIO_7 = 0 */
372         {-1,                 -1,    -1,   -1},
373 };
374
375 /* 2304:0242 PCTV QuatroStick (510e)
376  * GPIO_2: decoder reset, 0=active
377  * GPIO_4: decoder suspend, 0=active
378  * GPIO_6: demod reset, 0=active
379  * GPIO_7: LED, 1=active
380  */
381 static struct em28xx_reg_seq pctv_510e[] = {
382         {EM2874_R80_GPIO, 0x10, 0xff, 100},
383         {EM2874_R80_GPIO, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
384         {EM2874_R80_GPIO, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
385         {             -1,   -1,   -1,  -1},
386 };
387
388 /* 2013:0251 PCTV QuatroStick nano (520e)
389  * GPIO_2: decoder reset, 0=active
390  * GPIO_4: decoder suspend, 0=active
391  * GPIO_6: demod reset, 0=active
392  * GPIO_7: LED, 1=active
393  */
394 static struct em28xx_reg_seq pctv_520e[] = {
395         {EM2874_R80_GPIO, 0x10, 0xff, 100},
396         {EM2874_R80_GPIO, 0x14, 0xff, 100}, /* GPIO_2 = 1 */
397         {EM2874_R80_GPIO, 0x54, 0xff, 050}, /* GPIO_6 = 1 */
398         {EM2874_R80_GPIO, 0xd4, 0xff, 000}, /* GPIO_7 = 1 */
399         {             -1,   -1,   -1,  -1},
400 };
401
402 /*
403  *  Board definitions
404  */
405 struct em28xx_board em28xx_boards[] = {
406         [EM2750_BOARD_UNKNOWN] = {
407                 .name          = "EM2710/EM2750/EM2751 webcam grabber",
408                 .xclk          = EM28XX_XCLK_FREQUENCY_20MHZ,
409                 .tuner_type    = TUNER_ABSENT,
410                 .is_webcam     = 1,
411                 .input         = { {
412                         .type     = EM28XX_VMUX_COMPOSITE1,
413                         .vmux     = 0,
414                         .amux     = EM28XX_AMUX_VIDEO,
415                         .gpio     = silvercrest_reg_seq,
416                 } },
417         },
418         [EM2800_BOARD_UNKNOWN] = {
419                 .name         = "Unknown EM2800 video grabber",
420                 .is_em2800    = 1,
421                 .tda9887_conf = TDA9887_PRESENT,
422                 .decoder      = EM28XX_SAA711X,
423                 .tuner_type   = TUNER_ABSENT,
424                 .input        = { {
425                         .type     = EM28XX_VMUX_COMPOSITE1,
426                         .vmux     = SAA7115_COMPOSITE0,
427                         .amux     = EM28XX_AMUX_LINE_IN,
428                 }, {
429                         .type     = EM28XX_VMUX_SVIDEO,
430                         .vmux     = SAA7115_SVIDEO3,
431                         .amux     = EM28XX_AMUX_LINE_IN,
432                 } },
433         },
434         [EM2820_BOARD_UNKNOWN] = {
435                 .name          = "Unknown EM2750/28xx video grabber",
436                 .tuner_type    = TUNER_ABSENT,
437                 .is_webcam     = 1,     /* To enable sensor probe */
438         },
439         [EM2750_BOARD_DLCW_130] = {
440                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
441                 .name          = "Huaqi DLCW-130",
442                 .valid         = EM28XX_BOARD_NOT_VALIDATED,
443                 .xclk          = EM28XX_XCLK_FREQUENCY_48MHZ,
444                 .tuner_type    = TUNER_ABSENT,
445                 .is_webcam     = 1,
446                 .input         = { {
447                         .type     = EM28XX_VMUX_COMPOSITE1,
448                         .vmux     = 0,
449                         .amux     = EM28XX_AMUX_VIDEO,
450                 } },
451         },
452         [EM2820_BOARD_KWORLD_PVRTV2800RF] = {
453                 .name         = "Kworld PVR TV 2800 RF",
454                 .tuner_type   = TUNER_TEMIC_PAL,
455                 .tda9887_conf = TDA9887_PRESENT,
456                 .decoder      = EM28XX_SAA711X,
457                 .input        = { {
458                         .type     = EM28XX_VMUX_COMPOSITE1,
459                         .vmux     = SAA7115_COMPOSITE0,
460                         .amux     = EM28XX_AMUX_LINE_IN,
461                 }, {
462                         .type     = EM28XX_VMUX_SVIDEO,
463                         .vmux     = SAA7115_SVIDEO3,
464                         .amux     = EM28XX_AMUX_LINE_IN,
465                 } },
466         },
467         [EM2820_BOARD_GADMEI_TVR200] = {
468                 .name         = "Gadmei TVR200",
469                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
470                 .tda9887_conf = TDA9887_PRESENT,
471                 .decoder      = EM28XX_SAA711X,
472                 .input        = { {
473                         .type     = EM28XX_VMUX_TELEVISION,
474                         .vmux     = SAA7115_COMPOSITE2,
475                         .amux     = EM28XX_AMUX_LINE_IN,
476                 }, {
477                         .type     = EM28XX_VMUX_COMPOSITE1,
478                         .vmux     = SAA7115_COMPOSITE0,
479                         .amux     = EM28XX_AMUX_LINE_IN,
480                 }, {
481                         .type     = EM28XX_VMUX_SVIDEO,
482                         .vmux     = SAA7115_SVIDEO3,
483                         .amux     = EM28XX_AMUX_LINE_IN,
484                 } },
485         },
486         [EM2820_BOARD_TERRATEC_CINERGY_250] = {
487                 .name         = "Terratec Cinergy 250 USB",
488                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
489                 .has_ir_i2c   = 1,
490                 .tda9887_conf = TDA9887_PRESENT,
491                 .decoder      = EM28XX_SAA711X,
492                 .input        = { {
493                         .type     = EM28XX_VMUX_TELEVISION,
494                         .vmux     = SAA7115_COMPOSITE2,
495                         .amux     = EM28XX_AMUX_LINE_IN,
496                 }, {
497                         .type     = EM28XX_VMUX_COMPOSITE1,
498                         .vmux     = SAA7115_COMPOSITE0,
499                         .amux     = EM28XX_AMUX_LINE_IN,
500                 }, {
501                         .type     = EM28XX_VMUX_SVIDEO,
502                         .vmux     = SAA7115_SVIDEO3,
503                         .amux     = EM28XX_AMUX_LINE_IN,
504                 } },
505         },
506         [EM2820_BOARD_PINNACLE_USB_2] = {
507                 .name         = "Pinnacle PCTV USB 2",
508                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
509                 .has_ir_i2c   = 1,
510                 .tda9887_conf = TDA9887_PRESENT,
511                 .decoder      = EM28XX_SAA711X,
512                 .input        = { {
513                         .type     = EM28XX_VMUX_TELEVISION,
514                         .vmux     = SAA7115_COMPOSITE2,
515                         .amux     = EM28XX_AMUX_VIDEO,
516                 }, {
517                         .type     = EM28XX_VMUX_COMPOSITE1,
518                         .vmux     = SAA7115_COMPOSITE0,
519                         .amux     = EM28XX_AMUX_LINE_IN,
520                 }, {
521                         .type     = EM28XX_VMUX_SVIDEO,
522                         .vmux     = SAA7115_SVIDEO3,
523                         .amux     = EM28XX_AMUX_LINE_IN,
524                 } },
525         },
526         [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = {
527                 .name         = "Hauppauge WinTV USB 2",
528                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
529                 .tda9887_conf = TDA9887_PRESENT |
530                                 TDA9887_PORT1_ACTIVE |
531                                 TDA9887_PORT2_ACTIVE,
532                 .decoder      = EM28XX_TVP5150,
533                 .has_msp34xx  = 1,
534                 .has_ir_i2c   = 1,
535                 .input        = { {
536                         .type     = EM28XX_VMUX_TELEVISION,
537                         .vmux     = TVP5150_COMPOSITE0,
538                         .amux     = MSP_INPUT_DEFAULT,
539                 }, {
540                         .type     = EM28XX_VMUX_SVIDEO,
541                         .vmux     = TVP5150_SVIDEO,
542                         .amux     = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1,
543                                         MSP_DSP_IN_SCART, MSP_DSP_IN_SCART),
544                 } },
545         },
546         [EM2820_BOARD_DLINK_USB_TV] = {
547                 .name         = "D-Link DUB-T210 TV Tuner",
548                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
549                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
550                 .tda9887_conf = TDA9887_PRESENT,
551                 .decoder      = EM28XX_SAA711X,
552                 .input        = { {
553                         .type     = EM28XX_VMUX_TELEVISION,
554                         .vmux     = SAA7115_COMPOSITE2,
555                         .amux     = EM28XX_AMUX_LINE_IN,
556                 }, {
557                         .type     = EM28XX_VMUX_COMPOSITE1,
558                         .vmux     = SAA7115_COMPOSITE0,
559                         .amux     = EM28XX_AMUX_LINE_IN,
560                 }, {
561                         .type     = EM28XX_VMUX_SVIDEO,
562                         .vmux     = SAA7115_SVIDEO3,
563                         .amux     = EM28XX_AMUX_LINE_IN,
564                 } },
565         },
566         [EM2820_BOARD_HERCULES_SMART_TV_USB2] = {
567                 .name         = "Hercules Smart TV USB 2.0",
568                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
569                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
570                 .tda9887_conf = TDA9887_PRESENT,
571                 .decoder      = EM28XX_SAA711X,
572                 .input        = { {
573                         .type     = EM28XX_VMUX_TELEVISION,
574                         .vmux     = SAA7115_COMPOSITE2,
575                         .amux     = EM28XX_AMUX_LINE_IN,
576                 }, {
577                         .type     = EM28XX_VMUX_COMPOSITE1,
578                         .vmux     = SAA7115_COMPOSITE0,
579                         .amux     = EM28XX_AMUX_LINE_IN,
580                 }, {
581                         .type     = EM28XX_VMUX_SVIDEO,
582                         .vmux     = SAA7115_SVIDEO3,
583                         .amux     = EM28XX_AMUX_LINE_IN,
584                 } },
585         },
586         [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = {
587                 .name         = "Pinnacle PCTV USB 2 (Philips FM1216ME)",
588                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
589                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
590                 .tda9887_conf = TDA9887_PRESENT,
591                 .decoder      = EM28XX_SAA711X,
592                 .input        = { {
593                         .type     = EM28XX_VMUX_TELEVISION,
594                         .vmux     = SAA7115_COMPOSITE2,
595                         .amux     = EM28XX_AMUX_VIDEO,
596                 }, {
597                         .type     = EM28XX_VMUX_COMPOSITE1,
598                         .vmux     = SAA7115_COMPOSITE0,
599                         .amux     = EM28XX_AMUX_LINE_IN,
600                 }, {
601                         .type     = EM28XX_VMUX_SVIDEO,
602                         .vmux     = SAA7115_SVIDEO3,
603                         .amux     = EM28XX_AMUX_LINE_IN,
604                 } },
605         },
606         [EM2820_BOARD_GADMEI_UTV310] = {
607                 .name         = "Gadmei UTV310",
608                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
609                 .tuner_type   = TUNER_TNF_5335MF,
610                 .tda9887_conf = TDA9887_PRESENT,
611                 .decoder      = EM28XX_SAA711X,
612                 .input        = { {
613                         .type     = EM28XX_VMUX_TELEVISION,
614                         .vmux     = SAA7115_COMPOSITE1,
615                         .amux     = EM28XX_AMUX_LINE_IN,
616                 }, {
617                         .type     = EM28XX_VMUX_COMPOSITE1,
618                         .vmux     = SAA7115_COMPOSITE0,
619                         .amux     = EM28XX_AMUX_LINE_IN,
620                 }, {
621                         .type     = EM28XX_VMUX_SVIDEO,
622                         .vmux     = SAA7115_SVIDEO3,
623                         .amux     = EM28XX_AMUX_LINE_IN,
624                 } },
625         },
626         [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = {
627                 .name         = "Leadtek Winfast USB II Deluxe",
628                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
629                 .tuner_type   = TUNER_PHILIPS_FM1216ME_MK3,
630                 .has_ir_i2c   = 1,
631                 .tvaudio_addr = 0x58,
632                 .tda9887_conf = TDA9887_PRESENT |
633                                 TDA9887_PORT2_ACTIVE |
634                                 TDA9887_QSS,
635                 .decoder      = EM28XX_SAA711X,
636                 .adecoder     = EM28XX_TVAUDIO,
637                 .input        = { {
638                         .type     = EM28XX_VMUX_TELEVISION,
639                         .vmux     = SAA7115_COMPOSITE4,
640                         .amux     = EM28XX_AMUX_AUX,
641                 }, {
642                         .type     = EM28XX_VMUX_COMPOSITE1,
643                         .vmux     = SAA7115_COMPOSITE5,
644                         .amux     = EM28XX_AMUX_LINE_IN,
645                 }, {
646                         .type     = EM28XX_VMUX_SVIDEO,
647                         .vmux     = SAA7115_SVIDEO3,
648                         .amux     = EM28XX_AMUX_LINE_IN,
649                 } },
650                         .radio    = {
651                         .type     = EM28XX_RADIO,
652                         .amux     = EM28XX_AMUX_AUX,
653                         }
654         },
655         [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = {
656                 .name         = "Videology 20K14XUSB USB2.0",
657                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
658                 .tuner_type   = TUNER_ABSENT,
659                 .is_webcam    = 1,
660                 .input        = { {
661                         .type     = EM28XX_VMUX_COMPOSITE1,
662                         .vmux     = 0,
663                         .amux     = EM28XX_AMUX_VIDEO,
664                 } },
665         },
666         [EM2820_BOARD_SILVERCREST_WEBCAM] = {
667                 .name         = "Silvercrest Webcam 1.3mpix",
668                 .tuner_type   = TUNER_ABSENT,
669                 .is_webcam    = 1,
670                 .input        = { {
671                         .type     = EM28XX_VMUX_COMPOSITE1,
672                         .vmux     = 0,
673                         .amux     = EM28XX_AMUX_VIDEO,
674                         .gpio     = silvercrest_reg_seq,
675                 } },
676         },
677         [EM2821_BOARD_SUPERCOMP_USB_2] = {
678                 .name         = "Supercomp USB 2.0 TV",
679                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
680                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
681                 .tda9887_conf = TDA9887_PRESENT |
682                                 TDA9887_PORT1_ACTIVE |
683                                 TDA9887_PORT2_ACTIVE,
684                 .decoder      = EM28XX_SAA711X,
685                 .input        = { {
686                         .type     = EM28XX_VMUX_TELEVISION,
687                         .vmux     = SAA7115_COMPOSITE2,
688                         .amux     = EM28XX_AMUX_LINE_IN,
689                 }, {
690                         .type     = EM28XX_VMUX_COMPOSITE1,
691                         .vmux     = SAA7115_COMPOSITE0,
692                         .amux     = EM28XX_AMUX_VIDEO,
693                 }, {
694                         .type     = EM28XX_VMUX_SVIDEO,
695                         .vmux     = SAA7115_SVIDEO3,
696                         .amux     = EM28XX_AMUX_LINE_IN,
697                 } },
698         },
699         [EM2821_BOARD_USBGEAR_VD204] = {
700                 .name         = "Usbgear VD204v9",
701                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
702                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
703                 .decoder      = EM28XX_SAA711X,
704                 .input        = { {
705                         .type  = EM28XX_VMUX_COMPOSITE1,
706                         .vmux  = SAA7115_COMPOSITE0,
707                         .amux  = EM28XX_AMUX_LINE_IN,
708                 }, {
709                         .type  = EM28XX_VMUX_SVIDEO,
710                         .vmux  = SAA7115_SVIDEO3,
711                         .amux  = EM28XX_AMUX_LINE_IN,
712                 } },
713         },
714         [EM2860_BOARD_NETGMBH_CAM] = {
715                 /* Beijing Huaqi Information Digital Technology Co., Ltd */
716                 .name         = "NetGMBH Cam",
717                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
718                 .tuner_type   = TUNER_ABSENT,
719                 .is_webcam    = 1,
720                 .input        = { {
721                         .type     = EM28XX_VMUX_COMPOSITE1,
722                         .vmux     = 0,
723                         .amux     = EM28XX_AMUX_VIDEO,
724                 } },
725         },
726         [EM2860_BOARD_TYPHOON_DVD_MAKER] = {
727                 .name         = "Typhoon DVD Maker",
728                 .decoder      = EM28XX_SAA711X,
729                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
730                 .input        = { {
731                         .type  = EM28XX_VMUX_COMPOSITE1,
732                         .vmux  = SAA7115_COMPOSITE0,
733                         .amux  = EM28XX_AMUX_LINE_IN,
734                 }, {
735                         .type  = EM28XX_VMUX_SVIDEO,
736                         .vmux  = SAA7115_SVIDEO3,
737                         .amux  = EM28XX_AMUX_LINE_IN,
738                 } },
739         },
740         [EM2860_BOARD_GADMEI_UTV330] = {
741                 .name         = "Gadmei UTV330",
742                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
743                 .tuner_type   = TUNER_TNF_5335MF,
744                 .tda9887_conf = TDA9887_PRESENT,
745                 .decoder      = EM28XX_SAA711X,
746                 .input        = { {
747                         .type     = EM28XX_VMUX_TELEVISION,
748                         .vmux     = SAA7115_COMPOSITE2,
749                         .amux     = EM28XX_AMUX_VIDEO,
750                 }, {
751                         .type     = EM28XX_VMUX_COMPOSITE1,
752                         .vmux     = SAA7115_COMPOSITE0,
753                         .amux     = EM28XX_AMUX_LINE_IN,
754                 }, {
755                         .type     = EM28XX_VMUX_SVIDEO,
756                         .vmux     = SAA7115_SVIDEO3,
757                         .amux     = EM28XX_AMUX_LINE_IN,
758                 } },
759         },
760         [EM2861_BOARD_GADMEI_UTV330PLUS] = {
761                 .name         = "Gadmei UTV330+",
762                 .tuner_type   = TUNER_TNF_5335MF,
763                 .tda9887_conf = TDA9887_PRESENT,
764                 .ir_codes     = RC_MAP_GADMEI_RM008Z,
765                 .decoder      = EM28XX_SAA711X,
766                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
767                 .input        = { {
768                         .type     = EM28XX_VMUX_TELEVISION,
769                         .vmux     = SAA7115_COMPOSITE2,
770                         .amux     = EM28XX_AMUX_VIDEO,
771                 }, {
772                         .type     = EM28XX_VMUX_COMPOSITE1,
773                         .vmux     = SAA7115_COMPOSITE0,
774                         .amux     = EM28XX_AMUX_LINE_IN,
775                 }, {
776                         .type     = EM28XX_VMUX_SVIDEO,
777                         .vmux     = SAA7115_SVIDEO3,
778                         .amux     = EM28XX_AMUX_LINE_IN,
779                 } },
780         },
781         [EM2860_BOARD_TERRATEC_HYBRID_XS] = {
782                 .name         = "Terratec Cinergy A Hybrid XS",
783                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
784                 .tuner_type   = TUNER_XC2028,
785                 .tuner_gpio   = default_tuner_gpio,
786                 .decoder      = EM28XX_TVP5150,
787
788                 .input        = { {
789                         .type     = EM28XX_VMUX_TELEVISION,
790                         .vmux     = TVP5150_COMPOSITE0,
791                         .amux     = EM28XX_AMUX_VIDEO,
792                         .gpio     = hauppauge_wintv_hvr_900_analog,
793                 }, {
794                         .type     = EM28XX_VMUX_COMPOSITE1,
795                         .vmux     = TVP5150_COMPOSITE1,
796                         .amux     = EM28XX_AMUX_LINE_IN,
797                         .gpio     = hauppauge_wintv_hvr_900_analog,
798                 }, {
799                         .type     = EM28XX_VMUX_SVIDEO,
800                         .vmux     = TVP5150_SVIDEO,
801                         .amux     = EM28XX_AMUX_LINE_IN,
802                         .gpio     = hauppauge_wintv_hvr_900_analog,
803                 } },
804         },
805         [EM2861_BOARD_KWORLD_PVRTV_300U] = {
806                 .name         = "KWorld PVRTV 300U",
807                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
808                 .tuner_type   = TUNER_XC2028,
809                 .tuner_gpio   = default_tuner_gpio,
810                 .decoder      = EM28XX_TVP5150,
811                 .input        = { {
812                         .type     = EM28XX_VMUX_TELEVISION,
813                         .vmux     = TVP5150_COMPOSITE0,
814                         .amux     = EM28XX_AMUX_VIDEO,
815                 }, {
816                         .type     = EM28XX_VMUX_COMPOSITE1,
817                         .vmux     = TVP5150_COMPOSITE1,
818                         .amux     = EM28XX_AMUX_LINE_IN,
819                 }, {
820                         .type     = EM28XX_VMUX_SVIDEO,
821                         .vmux     = TVP5150_SVIDEO,
822                         .amux     = EM28XX_AMUX_LINE_IN,
823                 } },
824         },
825         [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = {
826                 .name          = "Yakumo MovieMixer",
827                 .tuner_type    = TUNER_ABSENT,  /* Capture only device */
828                 .decoder       = EM28XX_TVP5150,
829                 .input         = { {
830                         .type     = EM28XX_VMUX_TELEVISION,
831                         .vmux     = TVP5150_COMPOSITE0,
832                         .amux     = EM28XX_AMUX_VIDEO,
833                 }, {
834                         .type     = EM28XX_VMUX_COMPOSITE1,
835                         .vmux     = TVP5150_COMPOSITE1,
836                         .amux     = EM28XX_AMUX_LINE_IN,
837                 }, {
838                         .type     = EM28XX_VMUX_SVIDEO,
839                         .vmux     = TVP5150_SVIDEO,
840                         .amux     = EM28XX_AMUX_LINE_IN,
841                 } },
842         },
843         [EM2860_BOARD_TVP5150_REFERENCE_DESIGN] = {
844                 .name          = "EM2860/TVP5150 Reference Design",
845                 .tuner_type    = TUNER_ABSENT,  /* Capture only device */
846                 .decoder       = EM28XX_TVP5150,
847                 .input         = { {
848                         .type     = EM28XX_VMUX_COMPOSITE1,
849                         .vmux     = TVP5150_COMPOSITE1,
850                         .amux     = EM28XX_AMUX_LINE_IN,
851                 }, {
852                         .type     = EM28XX_VMUX_SVIDEO,
853                         .vmux     = TVP5150_SVIDEO,
854                         .amux     = EM28XX_AMUX_LINE_IN,
855                 } },
856         },
857         [EM2861_BOARD_PLEXTOR_PX_TV100U] = {
858                 .name         = "Plextor ConvertX PX-TV100U",
859                 .tuner_type   = TUNER_TNF_5335MF,
860                 .xclk         = EM28XX_XCLK_I2S_MSB_TIMING |
861                                 EM28XX_XCLK_FREQUENCY_12MHZ,
862                 .tda9887_conf = TDA9887_PRESENT,
863                 .decoder      = EM28XX_TVP5150,
864                 .has_msp34xx  = 1,
865                 .input        = { {
866                         .type     = EM28XX_VMUX_TELEVISION,
867                         .vmux     = TVP5150_COMPOSITE0,
868                         .amux     = EM28XX_AMUX_LINE_IN,
869                         .gpio     = pinnacle_hybrid_pro_analog,
870                 }, {
871                         .type     = EM28XX_VMUX_COMPOSITE1,
872                         .vmux     = TVP5150_COMPOSITE1,
873                         .amux     = EM28XX_AMUX_LINE_IN,
874                         .gpio     = pinnacle_hybrid_pro_analog,
875                 }, {
876                         .type     = EM28XX_VMUX_SVIDEO,
877                         .vmux     = TVP5150_SVIDEO,
878                         .amux     = EM28XX_AMUX_LINE_IN,
879                         .gpio     = pinnacle_hybrid_pro_analog,
880                 } },
881         },
882
883         /* Those boards with em2870 are DVB Only*/
884
885         [EM2870_BOARD_TERRATEC_XS] = {
886                 .name         = "Terratec Cinergy T XS",
887                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
888                 .tuner_type   = TUNER_XC2028,
889                 .tuner_gpio   = default_tuner_gpio,
890         },
891         [EM2870_BOARD_TERRATEC_XS_MT2060] = {
892                 .name         = "Terratec Cinergy T XS (MT2060)",
893                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
894                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
895         },
896         [EM2870_BOARD_KWORLD_350U] = {
897                 .name         = "Kworld 350 U DVB-T",
898                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
899                 .tuner_type   = TUNER_XC2028,
900                 .tuner_gpio   = default_tuner_gpio,
901         },
902         [EM2870_BOARD_KWORLD_355U] = {
903                 .name         = "Kworld 355 U DVB-T",
904                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
905                 .tuner_type   = TUNER_ABSENT,
906                 .tuner_gpio   = default_tuner_gpio,
907                 .has_dvb      = 1,
908                 .dvb_gpio     = default_digital,
909         },
910         [EM2870_BOARD_PINNACLE_PCTV_DVB] = {
911                 .name         = "Pinnacle PCTV DVB-T",
912                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
913                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
914                 /* djh - I have serious doubts this is right... */
915                 .xclk         = EM28XX_XCLK_IR_RC5_MODE |
916                                 EM28XX_XCLK_FREQUENCY_10MHZ,
917         },
918         [EM2870_BOARD_COMPRO_VIDEOMATE] = {
919                 .name         = "Compro, VideoMate U3",
920                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
921                 .tuner_type   = TUNER_ABSENT, /* MT2060 */
922         },
923
924         [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = {
925                 .name         = "Terratec Hybrid XS Secam",
926                 .has_msp34xx  = 1,
927                 .tuner_type   = TUNER_XC2028,
928                 .tuner_gpio   = default_tuner_gpio,
929                 .decoder      = EM28XX_TVP5150,
930                 .has_dvb      = 1,
931                 .dvb_gpio     = terratec_cinergy_USB_XS_FR_digital,
932                 .input        = { {
933                         .type     = EM28XX_VMUX_TELEVISION,
934                         .vmux     = TVP5150_COMPOSITE0,
935                         .amux     = EM28XX_AMUX_VIDEO,
936                         .gpio     = terratec_cinergy_USB_XS_FR_analog,
937                 }, {
938                         .type     = EM28XX_VMUX_COMPOSITE1,
939                         .vmux     = TVP5150_COMPOSITE1,
940                         .amux     = EM28XX_AMUX_LINE_IN,
941                         .gpio     = terratec_cinergy_USB_XS_FR_analog,
942                 }, {
943                         .type     = EM28XX_VMUX_SVIDEO,
944                         .vmux     = TVP5150_SVIDEO,
945                         .amux     = EM28XX_AMUX_LINE_IN,
946                         .gpio     = terratec_cinergy_USB_XS_FR_analog,
947                 } },
948         },
949         [EM2884_BOARD_TERRATEC_H5] = {
950                 .name         = "Terratec Cinergy H5",
951                 .has_dvb      = 1,
952 #if 0
953                 .tuner_type   = TUNER_PHILIPS_TDA8290,
954                 .tuner_addr   = 0x41,
955                 .dvb_gpio     = terratec_h5_digital, /* FIXME: probably wrong */
956                 .tuner_gpio   = terratec_h5_gpio,
957 #else
958                 .tuner_type   = TUNER_ABSENT,
959 #endif
960                 .i2c_speed    = EM2874_I2C_SECONDARY_BUS_SELECT |
961                                 EM28XX_I2C_CLK_WAIT_ENABLE |
962                                 EM28XX_I2C_FREQ_400_KHZ,
963         },
964         [EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C] = {
965                 .name         = "Hauppauge WinTV HVR 930C",
966                 .has_dvb      = 1,
967 #if 0 /* FIXME: Add analog support */
968                 .tuner_type   = TUNER_XC5000,
969                 .tuner_addr   = 0x41,
970                 .dvb_gpio     = hauppauge_930c_digital,
971                 .tuner_gpio   = hauppauge_930c_gpio,
972 #else
973                 .tuner_type   = TUNER_ABSENT,
974 #endif
975                 .ir_codes     = RC_MAP_HAUPPAUGE,
976                 .i2c_speed    = EM2874_I2C_SECONDARY_BUS_SELECT |
977                                 EM28XX_I2C_CLK_WAIT_ENABLE |
978                                 EM28XX_I2C_FREQ_400_KHZ,
979         },
980         [EM2884_BOARD_CINERGY_HTC_STICK] = {
981                 .name         = "Terratec Cinergy HTC Stick",
982                 .has_dvb      = 1,
983                 .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
984                 .tuner_type   = TUNER_ABSENT,
985                 .i2c_speed    = EM2874_I2C_SECONDARY_BUS_SELECT |
986                                 EM28XX_I2C_CLK_WAIT_ENABLE |
987                                 EM28XX_I2C_FREQ_400_KHZ,
988         },
989         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = {
990                 .name         = "Hauppauge WinTV HVR 900",
991                 .tda9887_conf = TDA9887_PRESENT,
992                 .tuner_type   = TUNER_XC2028,
993                 .tuner_gpio   = default_tuner_gpio,
994                 .mts_firmware = 1,
995                 .has_dvb      = 1,
996                 .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
997                 .ir_codes     = RC_MAP_HAUPPAUGE,
998                 .decoder      = EM28XX_TVP5150,
999                 .input        = { {
1000                         .type     = EM28XX_VMUX_TELEVISION,
1001                         .vmux     = TVP5150_COMPOSITE0,
1002                         .amux     = EM28XX_AMUX_VIDEO,
1003                         .gpio     = hauppauge_wintv_hvr_900_analog,
1004                 }, {
1005                         .type     = EM28XX_VMUX_COMPOSITE1,
1006                         .vmux     = TVP5150_COMPOSITE1,
1007                         .amux     = EM28XX_AMUX_LINE_IN,
1008                         .gpio     = hauppauge_wintv_hvr_900_analog,
1009                 }, {
1010                         .type     = EM28XX_VMUX_SVIDEO,
1011                         .vmux     = TVP5150_SVIDEO,
1012                         .amux     = EM28XX_AMUX_LINE_IN,
1013                         .gpio     = hauppauge_wintv_hvr_900_analog,
1014                 } },
1015         },
1016         [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = {
1017                 .name         = "Hauppauge WinTV HVR 900 (R2)",
1018                 .tda9887_conf = TDA9887_PRESENT,
1019                 .tuner_type   = TUNER_XC2028,
1020                 .tuner_gpio   = default_tuner_gpio,
1021                 .mts_firmware = 1,
1022                 .has_dvb      = 1,
1023                 .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1024                 .ir_codes     = RC_MAP_HAUPPAUGE,
1025                 .decoder      = EM28XX_TVP5150,
1026                 .input        = { {
1027                         .type     = EM28XX_VMUX_TELEVISION,
1028                         .vmux     = TVP5150_COMPOSITE0,
1029                         .amux     = EM28XX_AMUX_VIDEO,
1030                         .gpio     = hauppauge_wintv_hvr_900_analog,
1031                 }, {
1032                         .type     = EM28XX_VMUX_COMPOSITE1,
1033                         .vmux     = TVP5150_COMPOSITE1,
1034                         .amux     = EM28XX_AMUX_LINE_IN,
1035                         .gpio     = hauppauge_wintv_hvr_900_analog,
1036                 }, {
1037                         .type     = EM28XX_VMUX_SVIDEO,
1038                         .vmux     = TVP5150_SVIDEO,
1039                         .amux     = EM28XX_AMUX_LINE_IN,
1040                         .gpio     = hauppauge_wintv_hvr_900_analog,
1041                 } },
1042         },
1043         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850] = {
1044                 .name           = "Hauppauge WinTV HVR 850",
1045                 .tuner_type     = TUNER_XC2028,
1046                 .tuner_gpio     = default_tuner_gpio,
1047                 .mts_firmware   = 1,
1048                 .has_dvb        = 1,
1049                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1050                 .ir_codes       = RC_MAP_HAUPPAUGE,
1051                 .decoder        = EM28XX_TVP5150,
1052                 .input          = { {
1053                         .type     = EM28XX_VMUX_TELEVISION,
1054                         .vmux     = TVP5150_COMPOSITE0,
1055                         .amux     = EM28XX_AMUX_VIDEO,
1056                         .gpio     = hauppauge_wintv_hvr_900_analog,
1057                 }, {
1058                         .type     = EM28XX_VMUX_COMPOSITE1,
1059                         .vmux     = TVP5150_COMPOSITE1,
1060                         .amux     = EM28XX_AMUX_LINE_IN,
1061                         .gpio     = hauppauge_wintv_hvr_900_analog,
1062                 }, {
1063                         .type     = EM28XX_VMUX_SVIDEO,
1064                         .vmux     = TVP5150_SVIDEO,
1065                         .amux     = EM28XX_AMUX_LINE_IN,
1066                         .gpio     = hauppauge_wintv_hvr_900_analog,
1067                 } },
1068         },
1069         [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = {
1070                 .name           = "Hauppauge WinTV HVR 950",
1071                 .tuner_type     = TUNER_XC2028,
1072                 .tuner_gpio     = default_tuner_gpio,
1073                 .mts_firmware   = 1,
1074                 .has_dvb        = 1,
1075                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1076                 .ir_codes       = RC_MAP_HAUPPAUGE,
1077                 .decoder        = EM28XX_TVP5150,
1078                 .input          = { {
1079                         .type     = EM28XX_VMUX_TELEVISION,
1080                         .vmux     = TVP5150_COMPOSITE0,
1081                         .amux     = EM28XX_AMUX_VIDEO,
1082                         .gpio     = hauppauge_wintv_hvr_900_analog,
1083                 }, {
1084                         .type     = EM28XX_VMUX_COMPOSITE1,
1085                         .vmux     = TVP5150_COMPOSITE1,
1086                         .amux     = EM28XX_AMUX_LINE_IN,
1087                         .gpio     = hauppauge_wintv_hvr_900_analog,
1088                 }, {
1089                         .type     = EM28XX_VMUX_SVIDEO,
1090                         .vmux     = TVP5150_SVIDEO,
1091                         .amux     = EM28XX_AMUX_LINE_IN,
1092                         .gpio     = hauppauge_wintv_hvr_900_analog,
1093                 } },
1094         },
1095         [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = {
1096                 .name           = "Pinnacle PCTV HD Pro Stick",
1097                 .tuner_type     = TUNER_XC2028,
1098                 .tuner_gpio   = default_tuner_gpio,
1099                 .mts_firmware   = 1,
1100                 .has_dvb        = 1,
1101                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1102                 .ir_codes       = RC_MAP_PINNACLE_PCTV_HD,
1103                 .decoder        = EM28XX_TVP5150,
1104                 .input          = { {
1105                         .type     = EM28XX_VMUX_TELEVISION,
1106                         .vmux     = TVP5150_COMPOSITE0,
1107                         .amux     = EM28XX_AMUX_VIDEO,
1108                         .gpio     = hauppauge_wintv_hvr_900_analog,
1109                 }, {
1110                         .type     = EM28XX_VMUX_COMPOSITE1,
1111                         .vmux     = TVP5150_COMPOSITE1,
1112                         .amux     = EM28XX_AMUX_LINE_IN,
1113                         .gpio     = hauppauge_wintv_hvr_900_analog,
1114                 }, {
1115                         .type     = EM28XX_VMUX_SVIDEO,
1116                         .vmux     = TVP5150_SVIDEO,
1117                         .amux     = EM28XX_AMUX_LINE_IN,
1118                         .gpio     = hauppauge_wintv_hvr_900_analog,
1119                 } },
1120         },
1121         [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = {
1122                 .name           = "AMD ATI TV Wonder HD 600",
1123                 .tuner_type     = TUNER_XC2028,
1124                 .tuner_gpio     = default_tuner_gpio,
1125                 .mts_firmware   = 1,
1126                 .has_dvb        = 1,
1127                 .dvb_gpio       = hauppauge_wintv_hvr_900_digital,
1128                 .ir_codes       = RC_MAP_ATI_TV_WONDER_HD_600,
1129                 .decoder        = EM28XX_TVP5150,
1130                 .input          = { {
1131                         .type     = EM28XX_VMUX_TELEVISION,
1132                         .vmux     = TVP5150_COMPOSITE0,
1133                         .amux     = EM28XX_AMUX_VIDEO,
1134                         .gpio     = hauppauge_wintv_hvr_900_analog,
1135                 }, {
1136                         .type     = EM28XX_VMUX_COMPOSITE1,
1137                         .vmux     = TVP5150_COMPOSITE1,
1138                         .amux     = EM28XX_AMUX_LINE_IN,
1139                         .gpio     = hauppauge_wintv_hvr_900_analog,
1140                 }, {
1141                         .type     = EM28XX_VMUX_SVIDEO,
1142                         .vmux     = TVP5150_SVIDEO,
1143                         .amux     = EM28XX_AMUX_LINE_IN,
1144                         .gpio     = hauppauge_wintv_hvr_900_analog,
1145                 } },
1146         },
1147         [EM2880_BOARD_TERRATEC_HYBRID_XS] = {
1148                 .name           = "Terratec Hybrid XS",
1149                 .tuner_type     = TUNER_XC2028,
1150                 .tuner_gpio     = default_tuner_gpio,
1151                 .decoder        = EM28XX_TVP5150,
1152                 .has_dvb        = 1,
1153                 .dvb_gpio       = default_digital,
1154                 .ir_codes       = RC_MAP_TERRATEC_CINERGY_XS,
1155                 .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1156                 .input          = { {
1157                         .type     = EM28XX_VMUX_TELEVISION,
1158                         .vmux     = TVP5150_COMPOSITE0,
1159                         .amux     = EM28XX_AMUX_VIDEO,
1160                         .gpio     = default_analog,
1161                 }, {
1162                         .type     = EM28XX_VMUX_COMPOSITE1,
1163                         .vmux     = TVP5150_COMPOSITE1,
1164                         .amux     = EM28XX_AMUX_LINE_IN,
1165                         .gpio     = default_analog,
1166                 }, {
1167                         .type     = EM28XX_VMUX_SVIDEO,
1168                         .vmux     = TVP5150_SVIDEO,
1169                         .amux     = EM28XX_AMUX_LINE_IN,
1170                         .gpio     = default_analog,
1171                 } },
1172         },
1173         /* maybe there's a reason behind it why Terratec sells the Hybrid XS
1174            as Prodigy XS with a different PID, let's keep it separated for now
1175            maybe we'll need it lateron */
1176         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
1177                 .name         = "Terratec Prodigy XS",
1178                 .tuner_type   = TUNER_XC2028,
1179                 .tuner_gpio   = default_tuner_gpio,
1180                 .decoder      = EM28XX_TVP5150,
1181                 .input        = { {
1182                         .type     = EM28XX_VMUX_TELEVISION,
1183                         .vmux     = TVP5150_COMPOSITE0,
1184                         .amux     = EM28XX_AMUX_VIDEO,
1185                         .gpio     = hauppauge_wintv_hvr_900_analog,
1186                 }, {
1187                         .type     = EM28XX_VMUX_COMPOSITE1,
1188                         .vmux     = TVP5150_COMPOSITE1,
1189                         .amux     = EM28XX_AMUX_LINE_IN,
1190                         .gpio     = hauppauge_wintv_hvr_900_analog,
1191                 }, {
1192                         .type     = EM28XX_VMUX_SVIDEO,
1193                         .vmux     = TVP5150_SVIDEO,
1194                         .amux     = EM28XX_AMUX_LINE_IN,
1195                         .gpio     = hauppauge_wintv_hvr_900_analog,
1196                 } },
1197         },
1198         [EM2820_BOARD_MSI_VOX_USB_2] = {
1199                 .name              = "MSI VOX USB 2.0",
1200                 .tuner_type        = TUNER_LG_PAL_NEW_TAPC,
1201                 .tda9887_conf      = TDA9887_PRESENT      |
1202                                      TDA9887_PORT1_ACTIVE |
1203                                      TDA9887_PORT2_ACTIVE,
1204                 .max_range_640_480 = 1,
1205                 .decoder           = EM28XX_SAA711X,
1206                 .input             = { {
1207                         .type      = EM28XX_VMUX_TELEVISION,
1208                         .vmux      = SAA7115_COMPOSITE4,
1209                         .amux      = EM28XX_AMUX_VIDEO,
1210                 }, {
1211                         .type      = EM28XX_VMUX_COMPOSITE1,
1212                         .vmux      = SAA7115_COMPOSITE0,
1213                         .amux      = EM28XX_AMUX_LINE_IN,
1214                 }, {
1215                         .type      = EM28XX_VMUX_SVIDEO,
1216                         .vmux      = SAA7115_SVIDEO3,
1217                         .amux      = EM28XX_AMUX_LINE_IN,
1218                 } },
1219         },
1220         [EM2800_BOARD_TERRATEC_CINERGY_200] = {
1221                 .name         = "Terratec Cinergy 200 USB",
1222                 .is_em2800    = 1,
1223                 .has_ir_i2c   = 1,
1224                 .tuner_type   = TUNER_LG_TALN,
1225                 .tda9887_conf = TDA9887_PRESENT,
1226                 .decoder      = EM28XX_SAA711X,
1227                 .input        = { {
1228                         .type     = EM28XX_VMUX_TELEVISION,
1229                         .vmux     = SAA7115_COMPOSITE2,
1230                         .amux     = EM28XX_AMUX_VIDEO,
1231                 }, {
1232                         .type     = EM28XX_VMUX_COMPOSITE1,
1233                         .vmux     = SAA7115_COMPOSITE0,
1234                         .amux     = EM28XX_AMUX_LINE_IN,
1235                 }, {
1236                         .type     = EM28XX_VMUX_SVIDEO,
1237                         .vmux     = SAA7115_SVIDEO3,
1238                         .amux     = EM28XX_AMUX_LINE_IN,
1239                 } },
1240         },
1241         [EM2800_BOARD_GRABBEEX_USB2800] = {
1242                 .name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
1243                 .is_em2800  = 1,
1244                 .decoder    = EM28XX_SAA711X,
1245                 .tuner_type = TUNER_ABSENT, /* capture only board */
1246                 .input      = { {
1247                         .type     = EM28XX_VMUX_COMPOSITE1,
1248                         .vmux     = SAA7115_COMPOSITE0,
1249                         .amux     = EM28XX_AMUX_LINE_IN,
1250                 }, {
1251                         .type     = EM28XX_VMUX_SVIDEO,
1252                         .vmux     = SAA7115_SVIDEO3,
1253                         .amux     = EM28XX_AMUX_LINE_IN,
1254                 } },
1255         },
1256         [EM2800_BOARD_VC211A] = {
1257                 .name         = "Actionmaster/LinXcel/Digitus VC211A",
1258                 .is_em2800    = 1,
1259                 .tuner_type   = TUNER_ABSENT,   /* Capture-only board */
1260                 .decoder      = EM28XX_SAA711X,
1261                 .input        = { {
1262                         .type     = EM28XX_VMUX_COMPOSITE1,
1263                         .vmux     = SAA7115_COMPOSITE0,
1264                         .amux     = EM28XX_AMUX_LINE_IN,
1265                         .gpio     = vc211a_enable,
1266                 }, {
1267                         .type     = EM28XX_VMUX_SVIDEO,
1268                         .vmux     = SAA7115_SVIDEO3,
1269                         .amux     = EM28XX_AMUX_LINE_IN,
1270                         .gpio     = vc211a_enable,
1271                 } },
1272         },
1273         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
1274                 .name         = "Leadtek Winfast USB II",
1275                 .is_em2800    = 1,
1276                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1277                 .tda9887_conf = TDA9887_PRESENT,
1278                 .decoder      = EM28XX_SAA711X,
1279                 .input        = { {
1280                         .type     = EM28XX_VMUX_TELEVISION,
1281                         .vmux     = SAA7115_COMPOSITE2,
1282                         .amux     = EM28XX_AMUX_VIDEO,
1283                 }, {
1284                         .type     = EM28XX_VMUX_COMPOSITE1,
1285                         .vmux     = SAA7115_COMPOSITE0,
1286                         .amux     = EM28XX_AMUX_LINE_IN,
1287                 }, {
1288                         .type     = EM28XX_VMUX_SVIDEO,
1289                         .vmux     = SAA7115_SVIDEO3,
1290                         .amux     = EM28XX_AMUX_LINE_IN,
1291                 } },
1292         },
1293         [EM2800_BOARD_KWORLD_USB2800] = {
1294                 .name         = "Kworld USB2800",
1295                 .is_em2800    = 1,
1296                 .tuner_type   = TUNER_PHILIPS_FCV1236D,
1297                 .tda9887_conf = TDA9887_PRESENT,
1298                 .decoder      = EM28XX_SAA711X,
1299                 .input        = { {
1300                         .type     = EM28XX_VMUX_TELEVISION,
1301                         .vmux     = SAA7115_COMPOSITE2,
1302                         .amux     = EM28XX_AMUX_VIDEO,
1303                 }, {
1304                         .type     = EM28XX_VMUX_COMPOSITE1,
1305                         .vmux     = SAA7115_COMPOSITE0,
1306                         .amux     = EM28XX_AMUX_LINE_IN,
1307                 }, {
1308                         .type     = EM28XX_VMUX_SVIDEO,
1309                         .vmux     = SAA7115_SVIDEO3,
1310                         .amux     = EM28XX_AMUX_LINE_IN,
1311                 } },
1312         },
1313         [EM2820_BOARD_PINNACLE_DVC_90] = {
1314                 .name         = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker "
1315                                "/ Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
1316                 .tuner_type   = TUNER_ABSENT, /* capture only board */
1317                 .decoder      = EM28XX_SAA711X,
1318                 .input        = { {
1319                         .type     = EM28XX_VMUX_COMPOSITE1,
1320                         .vmux     = SAA7115_COMPOSITE0,
1321                         .amux     = EM28XX_AMUX_LINE_IN,
1322                 }, {
1323                         .type     = EM28XX_VMUX_SVIDEO,
1324                         .vmux     = SAA7115_SVIDEO3,
1325                         .amux     = EM28XX_AMUX_LINE_IN,
1326                 } },
1327         },
1328         [EM2800_BOARD_VGEAR_POCKETTV] = {
1329                 .name         = "V-Gear PocketTV",
1330                 .is_em2800    = 1,
1331                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1332                 .tda9887_conf = TDA9887_PRESENT,
1333                 .decoder      = EM28XX_SAA711X,
1334                 .input        = { {
1335                         .type     = EM28XX_VMUX_TELEVISION,
1336                         .vmux     = SAA7115_COMPOSITE2,
1337                         .amux     = EM28XX_AMUX_VIDEO,
1338                 }, {
1339                         .type     = EM28XX_VMUX_COMPOSITE1,
1340                         .vmux     = SAA7115_COMPOSITE0,
1341                         .amux     = EM28XX_AMUX_LINE_IN,
1342                 }, {
1343                         .type     = EM28XX_VMUX_SVIDEO,
1344                         .vmux     = SAA7115_SVIDEO3,
1345                         .amux     = EM28XX_AMUX_LINE_IN,
1346                 } },
1347         },
1348         [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
1349                 .name         = "Pixelview PlayTV Box 4 USB 2.0",
1350                 .tda9887_conf = TDA9887_PRESENT,
1351                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
1352                 .decoder      = EM28XX_SAA711X,
1353                 .input        = { {
1354                         .type     = EM28XX_VMUX_TELEVISION,
1355                         .vmux     = SAA7115_COMPOSITE2,
1356                         .amux     = EM28XX_AMUX_VIDEO,
1357                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
1358                                     EM28XX_AOUT_MASTER, /* Line out pin */
1359                 }, {
1360                         .type     = EM28XX_VMUX_COMPOSITE1,
1361                         .vmux     = SAA7115_COMPOSITE0,
1362                         .amux     = EM28XX_AMUX_LINE_IN,
1363                 }, {
1364                         .type     = EM28XX_VMUX_SVIDEO,
1365                         .vmux     = SAA7115_SVIDEO3,
1366                         .amux     = EM28XX_AMUX_LINE_IN,
1367                 } },
1368         },
1369         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
1370                 .name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
1371                 .has_snapshot_button = 1,
1372                 .tda9887_conf = TDA9887_PRESENT,
1373                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
1374                 .decoder      = EM28XX_SAA711X,
1375                 .input        = { {
1376                         .type     = EM28XX_VMUX_TELEVISION,
1377                         .vmux     = SAA7115_COMPOSITE2,
1378                         .amux     = EM28XX_AMUX_VIDEO,
1379                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
1380                                     EM28XX_AOUT_MASTER, /* Line out pin */
1381                 }, {
1382                         .type     = EM28XX_VMUX_COMPOSITE1,
1383                         .vmux     = SAA7115_COMPOSITE0,
1384                         .amux     = EM28XX_AMUX_LINE_IN,
1385                 }, {
1386                         .type     = EM28XX_VMUX_SVIDEO,
1387                         .vmux     = SAA7115_SVIDEO3,
1388                         .amux     = EM28XX_AMUX_LINE_IN,
1389                 } },
1390         },
1391         [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
1392                 .name                = "EM2860/SAA711X Reference Design",
1393                 .has_snapshot_button = 1,
1394                 .tuner_type          = TUNER_ABSENT,
1395                 .decoder             = EM28XX_SAA711X,
1396                 .input               = { {
1397                         .type     = EM28XX_VMUX_SVIDEO,
1398                         .vmux     = SAA7115_SVIDEO3,
1399                 }, {
1400                         .type     = EM28XX_VMUX_COMPOSITE1,
1401                         .vmux     = SAA7115_COMPOSITE0,
1402                 } },
1403         },
1404
1405         [EM2874_BOARD_LEADERSHIP_ISDBT] = {
1406                 .i2c_speed      = EM2874_I2C_SECONDARY_BUS_SELECT |
1407                                   EM28XX_I2C_CLK_WAIT_ENABLE |
1408                                   EM28XX_I2C_FREQ_100_KHZ,
1409                 .xclk           = EM28XX_XCLK_FREQUENCY_10MHZ,
1410                 .name           = "EM2874 Leadership ISDBT",
1411                 .tuner_type     = TUNER_ABSENT,
1412                 .tuner_gpio     = leadership_reset,
1413                 .dvb_gpio       = leadership_digital,
1414                 .has_dvb        = 1,
1415         },
1416
1417         [EM2880_BOARD_MSI_DIGIVOX_AD] = {
1418                 .name         = "MSI DigiVox A/D",
1419                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1420                 .tuner_type   = TUNER_XC2028,
1421                 .tuner_gpio   = default_tuner_gpio,
1422                 .decoder      = EM28XX_TVP5150,
1423                 .input        = { {
1424                         .type     = EM28XX_VMUX_TELEVISION,
1425                         .vmux     = TVP5150_COMPOSITE0,
1426                         .amux     = EM28XX_AMUX_VIDEO,
1427                         .gpio     = em2880_msi_digivox_ad_analog,
1428                 }, {
1429                         .type     = EM28XX_VMUX_COMPOSITE1,
1430                         .vmux     = TVP5150_COMPOSITE1,
1431                         .amux     = EM28XX_AMUX_LINE_IN,
1432                         .gpio     = em2880_msi_digivox_ad_analog,
1433                 }, {
1434                         .type     = EM28XX_VMUX_SVIDEO,
1435                         .vmux     = TVP5150_SVIDEO,
1436                         .amux     = EM28XX_AMUX_LINE_IN,
1437                         .gpio     = em2880_msi_digivox_ad_analog,
1438                 } },
1439         },
1440         [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1441                 .name         = "MSI DigiVox A/D II",
1442                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1443                 .tuner_type   = TUNER_XC2028,
1444                 .tuner_gpio   = default_tuner_gpio,
1445                 .decoder      = EM28XX_TVP5150,
1446                 .input        = { {
1447                         .type     = EM28XX_VMUX_TELEVISION,
1448                         .vmux     = TVP5150_COMPOSITE0,
1449                         .amux     = EM28XX_AMUX_VIDEO,
1450                         .gpio     = em2880_msi_digivox_ad_analog,
1451                 }, {
1452                         .type     = EM28XX_VMUX_COMPOSITE1,
1453                         .vmux     = TVP5150_COMPOSITE1,
1454                         .amux     = EM28XX_AMUX_LINE_IN,
1455                         .gpio     = em2880_msi_digivox_ad_analog,
1456                 }, {
1457                         .type     = EM28XX_VMUX_SVIDEO,
1458                         .vmux     = TVP5150_SVIDEO,
1459                         .amux     = EM28XX_AMUX_LINE_IN,
1460                         .gpio     = em2880_msi_digivox_ad_analog,
1461                 } },
1462         },
1463         [EM2880_BOARD_KWORLD_DVB_305U] = {
1464                 .name         = "KWorld DVB-T 305U",
1465                 .tuner_type   = TUNER_XC2028,
1466                 .tuner_gpio   = default_tuner_gpio,
1467                 .decoder      = EM28XX_TVP5150,
1468                 .input        = { {
1469                         .type     = EM28XX_VMUX_TELEVISION,
1470                         .vmux     = TVP5150_COMPOSITE0,
1471                         .amux     = EM28XX_AMUX_VIDEO,
1472                 }, {
1473                         .type     = EM28XX_VMUX_COMPOSITE1,
1474                         .vmux     = TVP5150_COMPOSITE1,
1475                         .amux     = EM28XX_AMUX_LINE_IN,
1476                 }, {
1477                         .type     = EM28XX_VMUX_SVIDEO,
1478                         .vmux     = TVP5150_SVIDEO,
1479                         .amux     = EM28XX_AMUX_LINE_IN,
1480                 } },
1481         },
1482         [EM2880_BOARD_KWORLD_DVB_310U] = {
1483                 .name         = "KWorld DVB-T 310U",
1484                 .tuner_type   = TUNER_XC2028,
1485                 .tuner_gpio   = default_tuner_gpio,
1486                 .has_dvb      = 1,
1487                 .dvb_gpio     = default_digital,
1488                 .mts_firmware = 1,
1489                 .decoder      = EM28XX_TVP5150,
1490                 .input        = { {
1491                         .type     = EM28XX_VMUX_TELEVISION,
1492                         .vmux     = TVP5150_COMPOSITE0,
1493                         .amux     = EM28XX_AMUX_VIDEO,
1494                         .gpio     = default_analog,
1495                 }, {
1496                         .type     = EM28XX_VMUX_COMPOSITE1,
1497                         .vmux     = TVP5150_COMPOSITE1,
1498                         .amux     = EM28XX_AMUX_LINE_IN,
1499                         .gpio     = default_analog,
1500                 }, {    /* S-video has not been tested yet */
1501                         .type     = EM28XX_VMUX_SVIDEO,
1502                         .vmux     = TVP5150_SVIDEO,
1503                         .amux     = EM28XX_AMUX_LINE_IN,
1504                         .gpio     = default_analog,
1505                 } },
1506         },
1507         [EM2882_BOARD_KWORLD_ATSC_315U] = {
1508                 .name           = "KWorld ATSC 315U HDTV TV Box",
1509                 .valid          = EM28XX_BOARD_NOT_VALIDATED,
1510                 .tuner_type     = TUNER_THOMSON_DTT761X,
1511                 .tuner_gpio     = em2882_kworld_315u_tuner_gpio,
1512                 .tda9887_conf   = TDA9887_PRESENT,
1513                 .decoder        = EM28XX_SAA711X,
1514                 .has_dvb        = 1,
1515                 .dvb_gpio       = em2882_kworld_315u_digital,
1516                 .ir_codes       = RC_MAP_KWORLD_315U,
1517                 .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ,
1518                 .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE,
1519                 /* Analog mode - still not ready */
1520                 /*.input        = { {
1521                         .type = EM28XX_VMUX_TELEVISION,
1522                         .vmux = SAA7115_COMPOSITE2,
1523                         .amux = EM28XX_AMUX_VIDEO,
1524                         .gpio = em2882_kworld_315u_analog,
1525                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1526                 }, {
1527                         .type = EM28XX_VMUX_COMPOSITE1,
1528                         .vmux = SAA7115_COMPOSITE0,
1529                         .amux = EM28XX_AMUX_LINE_IN,
1530                         .gpio = em2882_kworld_315u_analog1,
1531                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1532                 }, {
1533                         .type = EM28XX_VMUX_SVIDEO,
1534                         .vmux = SAA7115_SVIDEO3,
1535                         .amux = EM28XX_AMUX_LINE_IN,
1536                         .gpio = em2882_kworld_315u_analog1,
1537                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1538                 } }, */
1539         },
1540         [EM2880_BOARD_EMPIRE_DUAL_TV] = {
1541                 .name = "Empire dual TV",
1542                 .tuner_type = TUNER_XC2028,
1543                 .tuner_gpio = default_tuner_gpio,
1544                 .has_dvb = 1,
1545                 .dvb_gpio = default_digital,
1546                 .mts_firmware = 1,
1547                 .decoder = EM28XX_TVP5150,
1548                 .input = { {
1549                         .type = EM28XX_VMUX_TELEVISION,
1550                         .vmux = TVP5150_COMPOSITE0,
1551                         .amux = EM28XX_AMUX_VIDEO,
1552                         .gpio = default_analog,
1553                 }, {
1554                         .type = EM28XX_VMUX_COMPOSITE1,
1555                         .vmux = TVP5150_COMPOSITE1,
1556                         .amux = EM28XX_AMUX_LINE_IN,
1557                         .gpio = default_analog,
1558                 }, {
1559                         .type = EM28XX_VMUX_SVIDEO,
1560                         .vmux = TVP5150_SVIDEO,
1561                         .amux = EM28XX_AMUX_LINE_IN,
1562                         .gpio = default_analog,
1563                 } },
1564         },
1565         [EM2881_BOARD_DNT_DA2_HYBRID] = {
1566                 .name         = "DNT DA2 Hybrid",
1567                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1568                 .tuner_type   = TUNER_XC2028,
1569                 .tuner_gpio   = default_tuner_gpio,
1570                 .decoder      = EM28XX_TVP5150,
1571                 .input        = { {
1572                         .type     = EM28XX_VMUX_TELEVISION,
1573                         .vmux     = TVP5150_COMPOSITE0,
1574                         .amux     = EM28XX_AMUX_VIDEO,
1575                         .gpio     = default_analog,
1576                 }, {
1577                         .type     = EM28XX_VMUX_COMPOSITE1,
1578                         .vmux     = TVP5150_COMPOSITE1,
1579                         .amux     = EM28XX_AMUX_LINE_IN,
1580                         .gpio     = default_analog,
1581                 }, {
1582                         .type     = EM28XX_VMUX_SVIDEO,
1583                         .vmux     = TVP5150_SVIDEO,
1584                         .amux     = EM28XX_AMUX_LINE_IN,
1585                         .gpio     = default_analog,
1586                 } },
1587         },
1588         [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1589                 .name         = "Pinnacle Hybrid Pro",
1590                 .tuner_type   = TUNER_XC2028,
1591                 .tuner_gpio   = default_tuner_gpio,
1592                 .decoder      = EM28XX_TVP5150,
1593                 .has_dvb      = 1,
1594                 .dvb_gpio     = pinnacle_hybrid_pro_digital,
1595                 .input        = { {
1596                         .type     = EM28XX_VMUX_TELEVISION,
1597                         .vmux     = TVP5150_COMPOSITE0,
1598                         .amux     = EM28XX_AMUX_VIDEO,
1599                         .gpio     = pinnacle_hybrid_pro_analog,
1600                 }, {
1601                         .type     = EM28XX_VMUX_COMPOSITE1,
1602                         .vmux     = TVP5150_COMPOSITE1,
1603                         .amux     = EM28XX_AMUX_LINE_IN,
1604                         .gpio     = pinnacle_hybrid_pro_analog,
1605                 }, {
1606                         .type     = EM28XX_VMUX_SVIDEO,
1607                         .vmux     = TVP5150_SVIDEO,
1608                         .amux     = EM28XX_AMUX_LINE_IN,
1609                         .gpio     = pinnacle_hybrid_pro_analog,
1610                 } },
1611         },
1612         [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
1613                 .name         = "Pinnacle Hybrid Pro (330e)",
1614                 .tuner_type   = TUNER_XC2028,
1615                 .tuner_gpio   = default_tuner_gpio,
1616                 .mts_firmware = 1,
1617                 .has_dvb      = 1,
1618                 .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1619                 .ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
1620                 .decoder      = EM28XX_TVP5150,
1621                 .input        = { {
1622                         .type     = EM28XX_VMUX_TELEVISION,
1623                         .vmux     = TVP5150_COMPOSITE0,
1624                         .amux     = EM28XX_AMUX_VIDEO,
1625                         .gpio     = hauppauge_wintv_hvr_900_analog,
1626                 }, {
1627                         .type     = EM28XX_VMUX_COMPOSITE1,
1628                         .vmux     = TVP5150_COMPOSITE1,
1629                         .amux     = EM28XX_AMUX_LINE_IN,
1630                         .gpio     = hauppauge_wintv_hvr_900_analog,
1631                 }, {
1632                         .type     = EM28XX_VMUX_SVIDEO,
1633                         .vmux     = TVP5150_SVIDEO,
1634                         .amux     = EM28XX_AMUX_LINE_IN,
1635                         .gpio     = hauppauge_wintv_hvr_900_analog,
1636                 } },
1637         },
1638         [EM2882_BOARD_KWORLD_VS_DVBT] = {
1639                 .name         = "Kworld VS-DVB-T 323UR",
1640                 .tuner_type   = TUNER_XC2028,
1641                 .tuner_gpio   = default_tuner_gpio,
1642                 .decoder      = EM28XX_TVP5150,
1643                 .mts_firmware = 1,
1644                 .has_dvb      = 1,
1645                 .dvb_gpio     = kworld_330u_digital,
1646                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1647                 .ir_codes     = RC_MAP_KWORLD_315U,
1648                 .input        = { {
1649                         .type     = EM28XX_VMUX_TELEVISION,
1650                         .vmux     = TVP5150_COMPOSITE0,
1651                         .amux     = EM28XX_AMUX_VIDEO,
1652                 }, {
1653                         .type     = EM28XX_VMUX_COMPOSITE1,
1654                         .vmux     = TVP5150_COMPOSITE1,
1655                         .amux     = EM28XX_AMUX_LINE_IN,
1656                 }, {
1657                         .type     = EM28XX_VMUX_SVIDEO,
1658                         .vmux     = TVP5150_SVIDEO,
1659                         .amux     = EM28XX_AMUX_LINE_IN,
1660                 } },
1661         },
1662         [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1663                 .name         = "Terratec Cinnergy Hybrid T USB XS (em2882)",
1664                 .tuner_type   = TUNER_XC2028,
1665                 .tuner_gpio   = default_tuner_gpio,
1666                 .mts_firmware = 1,
1667                 .decoder      = EM28XX_TVP5150,
1668                 .has_dvb      = 1,
1669                 .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1670                 .ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,
1671                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
1672                 .input        = { {
1673                         .type     = EM28XX_VMUX_TELEVISION,
1674                         .vmux     = TVP5150_COMPOSITE0,
1675                         .amux     = EM28XX_AMUX_VIDEO,
1676                         .gpio     = hauppauge_wintv_hvr_900_analog,
1677                 }, {
1678                         .type     = EM28XX_VMUX_COMPOSITE1,
1679                         .vmux     = TVP5150_COMPOSITE1,
1680                         .amux     = EM28XX_AMUX_LINE_IN,
1681                         .gpio     = hauppauge_wintv_hvr_900_analog,
1682                 }, {
1683                         .type     = EM28XX_VMUX_SVIDEO,
1684                         .vmux     = TVP5150_SVIDEO,
1685                         .amux     = EM28XX_AMUX_LINE_IN,
1686                         .gpio     = hauppauge_wintv_hvr_900_analog,
1687                 } },
1688         },
1689         [EM2882_BOARD_DIKOM_DK300] = {
1690                 .name         = "Dikom DK300",
1691                 .tuner_type   = TUNER_XC2028,
1692                 .tuner_gpio   = default_tuner_gpio,
1693                 .decoder      = EM28XX_TVP5150,
1694                 .mts_firmware = 1,
1695                 .has_dvb      = 1,
1696                 .dvb_gpio     = dikom_dk300_digital,
1697                 .input        = { {
1698                         .type     = EM28XX_VMUX_TELEVISION,
1699                         .vmux     = TVP5150_COMPOSITE0,
1700                         .amux     = EM28XX_AMUX_VIDEO,
1701                         .gpio     = default_analog,
1702                 } },
1703         },
1704         [EM2883_BOARD_KWORLD_HYBRID_330U] = {
1705                 .name         = "Kworld PlusTV HD Hybrid 330",
1706                 .tuner_type   = TUNER_XC2028,
1707                 .tuner_gpio   = default_tuner_gpio,
1708                 .decoder      = EM28XX_TVP5150,
1709                 .mts_firmware = 1,
1710                 .has_dvb      = 1,
1711                 .dvb_gpio     = kworld_330u_digital,
1712                 .xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
1713                 .i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
1714                                     EM28XX_I2C_EEPROM_ON_BOARD |
1715                                     EM28XX_I2C_EEPROM_KEY_VALID,
1716                 .input        = { {
1717                         .type     = EM28XX_VMUX_TELEVISION,
1718                         .vmux     = TVP5150_COMPOSITE0,
1719                         .amux     = EM28XX_AMUX_VIDEO,
1720                         .gpio     = kworld_330u_analog,
1721                         .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1722                 }, {
1723                         .type     = EM28XX_VMUX_COMPOSITE1,
1724                         .vmux     = TVP5150_COMPOSITE1,
1725                         .amux     = EM28XX_AMUX_LINE_IN,
1726                         .gpio     = kworld_330u_analog,
1727                         .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1728                 }, {
1729                         .type     = EM28XX_VMUX_SVIDEO,
1730                         .vmux     = TVP5150_SVIDEO,
1731                         .amux     = EM28XX_AMUX_LINE_IN,
1732                         .gpio     = kworld_330u_analog,
1733                 } },
1734         },
1735         [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
1736                 .name         = "Compro VideoMate ForYou/Stereo",
1737                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1738                 .tvaudio_addr = 0xb0,
1739                 .tda9887_conf = TDA9887_PRESENT,
1740                 .decoder      = EM28XX_TVP5150,
1741                 .adecoder     = EM28XX_TVAUDIO,
1742                 .mute_gpio    = compro_mute_gpio,
1743                 .input        = { {
1744                         .type     = EM28XX_VMUX_TELEVISION,
1745                         .vmux     = TVP5150_COMPOSITE0,
1746                         .amux     = EM28XX_AMUX_VIDEO,
1747                         .gpio     = compro_unmute_tv_gpio,
1748                 }, {
1749                         .type     = EM28XX_VMUX_SVIDEO,
1750                         .vmux     = TVP5150_SVIDEO,
1751                         .amux     = EM28XX_AMUX_LINE_IN,
1752                         .gpio     = compro_unmute_svid_gpio,
1753                 } },
1754         },
1755         [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
1756                 .name         = "Kaiomy TVnPC U2",
1757                 .vchannels    = 3,
1758                 .tuner_type   = TUNER_XC2028,
1759                 .tuner_addr   = 0x61,
1760                 .mts_firmware = 1,
1761                 .decoder      = EM28XX_TVP5150,
1762                 .tuner_gpio   = default_tuner_gpio,
1763                 .ir_codes     = RC_MAP_KAIOMY,
1764                 .input          = { {
1765                         .type     = EM28XX_VMUX_TELEVISION,
1766                         .vmux     = TVP5150_COMPOSITE0,
1767                         .amux     = EM28XX_AMUX_VIDEO,
1768
1769                 }, {
1770                         .type     = EM28XX_VMUX_COMPOSITE1,
1771                         .vmux     = TVP5150_COMPOSITE1,
1772                         .amux     = EM28XX_AMUX_LINE_IN,
1773                 }, {
1774                         .type     = EM28XX_VMUX_SVIDEO,
1775                         .vmux     = TVP5150_SVIDEO,
1776                         .amux     = EM28XX_AMUX_LINE_IN,
1777                 } },
1778                 .radio          = {
1779                         .type     = EM28XX_RADIO,
1780                         .amux     = EM28XX_AMUX_LINE_IN,
1781                 }
1782         },
1783         [EM2860_BOARD_EASYCAP] = {
1784                 .name         = "Easy Cap Capture DC-60",
1785                 .vchannels    = 2,
1786                 .tuner_type   = TUNER_ABSENT,
1787                 .decoder      = EM28XX_SAA711X,
1788                 .input           = { {
1789                         .type     = EM28XX_VMUX_COMPOSITE1,
1790                         .vmux     = SAA7115_COMPOSITE0,
1791                         .amux     = EM28XX_AMUX_LINE_IN,
1792                 }, {
1793                         .type     = EM28XX_VMUX_SVIDEO,
1794                         .vmux     = SAA7115_SVIDEO3,
1795                         .amux     = EM28XX_AMUX_LINE_IN,
1796                 } },
1797         },
1798         [EM2820_BOARD_IODATA_GVMVP_SZ] = {
1799                 .name       = "IO-DATA GV-MVP/SZ",
1800                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
1801                 .tuner_gpio   = default_tuner_gpio,
1802                 .tda9887_conf = TDA9887_PRESENT,
1803                 .decoder      = EM28XX_TVP5150,
1804                 .input        = { {
1805                         .type     = EM28XX_VMUX_TELEVISION,
1806                         .vmux     = TVP5150_COMPOSITE0,
1807                         .amux     = EM28XX_AMUX_VIDEO,
1808                 }, { /* Composite has not been tested yet */
1809                         .type     = EM28XX_VMUX_COMPOSITE1,
1810                         .vmux     = TVP5150_COMPOSITE1,
1811                         .amux     = EM28XX_AMUX_VIDEO,
1812                 }, { /* S-video has not been tested yet */
1813                         .type     = EM28XX_VMUX_SVIDEO,
1814                         .vmux     = TVP5150_SVIDEO,
1815                         .amux     = EM28XX_AMUX_VIDEO,
1816                 } },
1817         },
1818         [EM2860_BOARD_TERRATEC_GRABBY] = {
1819                 .name            = "Terratec Grabby",
1820                 .vchannels       = 2,
1821                 .tuner_type      = TUNER_ABSENT,
1822                 .decoder         = EM28XX_SAA711X,
1823                 .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
1824                 .input           = { {
1825                         .type     = EM28XX_VMUX_COMPOSITE1,
1826                         .vmux     = SAA7115_COMPOSITE0,
1827                         .amux     = EM28XX_AMUX_LINE_IN,
1828                 }, {
1829                         .type     = EM28XX_VMUX_SVIDEO,
1830                         .vmux     = SAA7115_SVIDEO3,
1831                         .amux     = EM28XX_AMUX_LINE_IN,
1832                 } },
1833         },
1834         [EM2860_BOARD_TERRATEC_AV350] = {
1835                 .name            = "Terratec AV350",
1836                 .vchannels       = 2,
1837                 .tuner_type      = TUNER_ABSENT,
1838                 .decoder         = EM28XX_TVP5150,
1839                 .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
1840                 .mute_gpio       = terratec_av350_mute_gpio,
1841                 .input           = { {
1842                         .type     = EM28XX_VMUX_COMPOSITE1,
1843                         .vmux     = TVP5150_COMPOSITE1,
1844                         .amux     = EM28XX_AUDIO_SRC_LINE,
1845                         .gpio     = terratec_av350_unmute_gpio,
1846
1847                 }, {
1848                         .type     = EM28XX_VMUX_SVIDEO,
1849                         .vmux     = TVP5150_SVIDEO,
1850                         .amux     = EM28XX_AUDIO_SRC_LINE,
1851                         .gpio     = terratec_av350_unmute_gpio,
1852                 } },
1853         },
1854
1855         [EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
1856                 .name         = "Elgato Video Capture",
1857                 .decoder      = EM28XX_SAA711X,
1858                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
1859                 .input        = { {
1860                         .type  = EM28XX_VMUX_COMPOSITE1,
1861                         .vmux  = SAA7115_COMPOSITE0,
1862                         .amux  = EM28XX_AMUX_LINE_IN,
1863                 }, {
1864                         .type  = EM28XX_VMUX_SVIDEO,
1865                         .vmux  = SAA7115_SVIDEO3,
1866                         .amux  = EM28XX_AMUX_LINE_IN,
1867                 } },
1868         },
1869
1870         [EM2882_BOARD_EVGA_INDTUBE] = {
1871                 .name         = "Evga inDtube",
1872                 .tuner_type   = TUNER_XC2028,
1873                 .tuner_gpio   = default_tuner_gpio,
1874                 .decoder      = EM28XX_TVP5150,
1875                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1876                 .mts_firmware = 1,
1877                 .has_dvb      = 1,
1878                 .dvb_gpio     = evga_indtube_digital,
1879                 .ir_codes     = RC_MAP_EVGA_INDTUBE,
1880                 .input        = { {
1881                         .type     = EM28XX_VMUX_TELEVISION,
1882                         .vmux     = TVP5150_COMPOSITE0,
1883                         .amux     = EM28XX_AMUX_VIDEO,
1884                         .gpio     = evga_indtube_analog,
1885                 }, {
1886                         .type     = EM28XX_VMUX_COMPOSITE1,
1887                         .vmux     = TVP5150_COMPOSITE1,
1888                         .amux     = EM28XX_AMUX_LINE_IN,
1889                         .gpio     = evga_indtube_analog,
1890                 }, {
1891                         .type     = EM28XX_VMUX_SVIDEO,
1892                         .vmux     = TVP5150_SVIDEO,
1893                         .amux     = EM28XX_AMUX_LINE_IN,
1894                         .gpio     = evga_indtube_analog,
1895                 } },
1896         },
1897         /* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 +
1898            Infineon TUA6034) */
1899         [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
1900                 .name          = "Reddo DVB-C USB TV Box",
1901                 .tuner_type    = TUNER_ABSENT,
1902                 .tuner_gpio    = reddo_dvb_c_usb_box,
1903                 .has_dvb       = 1,
1904         },
1905         /* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
1906          * initially as the KWorld PlusTV 340U, then as the UB435-Q.
1907          * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
1908         [EM2870_BOARD_KWORLD_A340] = {
1909                 .name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",
1910                 .tuner_type = TUNER_ABSENT,     /* Digital-only TDA18271HD */
1911                 .has_dvb    = 1,
1912                 .dvb_gpio   = kworld_a340_digital,
1913                 .tuner_gpio = default_tuner_gpio,
1914         },
1915         /* 2013:024f PCTV nanoStick T2 290e.
1916          * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */
1917         [EM28174_BOARD_PCTV_290E] = {
1918                 .name          = "PCTV nanoStick T2 290e",
1919                 .i2c_speed      = EM2874_I2C_SECONDARY_BUS_SELECT |
1920                         EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
1921                 .tuner_type    = TUNER_ABSENT,
1922                 .tuner_gpio    = pctv_290e,
1923                 .has_dvb       = 1,
1924                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
1925         },
1926         /* 2013:024f PCTV DVB-S2 Stick 460e
1927          * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293 */
1928         [EM28174_BOARD_PCTV_460E] = {
1929                 .i2c_speed     = EM2874_I2C_SECONDARY_BUS_SELECT |
1930                         EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
1931                 .name          = "PCTV DVB-S2 Stick (460e)",
1932                 .tuner_type    = TUNER_ABSENT,
1933                 .tuner_gpio    = pctv_460e,
1934                 .has_dvb       = 1,
1935                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
1936         },
1937         /* eb1a:5006 Honestech VIDBOX NW03
1938          * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */
1939         [EM2860_BOARD_HT_VIDBOX_NW03] = {
1940                 .name                = "Honestech Vidbox NW03",
1941                 .tuner_type          = TUNER_ABSENT,
1942                 .decoder             = EM28XX_SAA711X,
1943                 .input               = { {
1944                         .type     = EM28XX_VMUX_COMPOSITE1,
1945                         .vmux     = SAA7115_COMPOSITE0,
1946                         .amux     = EM28XX_AMUX_LINE_IN,
1947                 }, {
1948                         .type     = EM28XX_VMUX_SVIDEO,
1949                         .vmux     = SAA7115_SVIDEO3,  /* S-VIDEO needs confirming */
1950                         .amux     = EM28XX_AMUX_LINE_IN,
1951                 } },
1952         },
1953         /* 1b80:e425 MaxMedia UB425-TC
1954          * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2 */
1955         [EM2874_BOARD_MAXMEDIA_UB425_TC] = {
1956                 .name          = "MaxMedia UB425-TC",
1957                 .tuner_type    = TUNER_ABSENT,
1958                 .tuner_gpio    = maxmedia_ub425_tc,
1959                 .has_dvb       = 1,
1960                 .i2c_speed     = EM2874_I2C_SECONDARY_BUS_SELECT |
1961                                 EM28XX_I2C_CLK_WAIT_ENABLE |
1962                                 EM28XX_I2C_FREQ_400_KHZ,
1963         },
1964         /* 2304:0242 PCTV QuatroStick (510e)
1965          * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
1966         [EM2884_BOARD_PCTV_510E] = {
1967                 .name          = "PCTV QuatroStick (510e)",
1968                 .tuner_type    = TUNER_ABSENT,
1969                 .tuner_gpio    = pctv_510e,
1970                 .has_dvb       = 1,
1971                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
1972                 .i2c_speed     = EM2874_I2C_SECONDARY_BUS_SELECT |
1973                                 EM28XX_I2C_CLK_WAIT_ENABLE |
1974                                 EM28XX_I2C_FREQ_400_KHZ,
1975         },
1976         /* 2013:0251 PCTV QuatroStick nano (520e)
1977          * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
1978         [EM2884_BOARD_PCTV_520E] = {
1979                 .name          = "PCTV QuatroStick nano (520e)",
1980                 .tuner_type    = TUNER_ABSENT,
1981                 .tuner_gpio    = pctv_520e,
1982                 .has_dvb       = 1,
1983                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
1984                 .i2c_speed     = EM2874_I2C_SECONDARY_BUS_SELECT |
1985                                 EM28XX_I2C_CLK_WAIT_ENABLE |
1986                                 EM28XX_I2C_FREQ_400_KHZ,
1987         },
1988         [EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
1989                 .name         = "Terratec Cinergy HTC USB XS",
1990                 .has_dvb      = 1,
1991                 .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
1992                 .tuner_type   = TUNER_ABSENT,
1993                 .i2c_speed    = EM2874_I2C_SECONDARY_BUS_SELECT |
1994                                 EM28XX_I2C_CLK_WAIT_ENABLE |
1995                                 EM28XX_I2C_FREQ_400_KHZ,
1996         },
1997 };
1998 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
1999
2000 /* table of devices that work with this driver */
2001 struct usb_device_id em28xx_id_table[] = {
2002         { USB_DEVICE(0xeb1a, 0x2750),
2003                         .driver_info = EM2750_BOARD_UNKNOWN },
2004         { USB_DEVICE(0xeb1a, 0x2751),
2005                         .driver_info = EM2750_BOARD_UNKNOWN },
2006         { USB_DEVICE(0xeb1a, 0x2800),
2007                         .driver_info = EM2800_BOARD_UNKNOWN },
2008         { USB_DEVICE(0xeb1a, 0x2710),
2009                         .driver_info = EM2820_BOARD_UNKNOWN },
2010         { USB_DEVICE(0xeb1a, 0x2820),
2011                         .driver_info = EM2820_BOARD_UNKNOWN },
2012         { USB_DEVICE(0xeb1a, 0x2821),
2013                         .driver_info = EM2820_BOARD_UNKNOWN },
2014         { USB_DEVICE(0xeb1a, 0x2860),
2015                         .driver_info = EM2820_BOARD_UNKNOWN },
2016         { USB_DEVICE(0xeb1a, 0x2861),
2017                         .driver_info = EM2820_BOARD_UNKNOWN },
2018         { USB_DEVICE(0xeb1a, 0x2862),
2019                         .driver_info = EM2820_BOARD_UNKNOWN },
2020         { USB_DEVICE(0xeb1a, 0x2863),
2021                         .driver_info = EM2820_BOARD_UNKNOWN },
2022         { USB_DEVICE(0xeb1a, 0x2870),
2023                         .driver_info = EM2820_BOARD_UNKNOWN },
2024         { USB_DEVICE(0xeb1a, 0x2881),
2025                         .driver_info = EM2820_BOARD_UNKNOWN },
2026         { USB_DEVICE(0xeb1a, 0x2883),
2027                         .driver_info = EM2820_BOARD_UNKNOWN },
2028         { USB_DEVICE(0xeb1a, 0x2868),
2029                         .driver_info = EM2820_BOARD_UNKNOWN },
2030         { USB_DEVICE(0xeb1a, 0x2875),
2031                         .driver_info = EM2820_BOARD_UNKNOWN },
2032         { USB_DEVICE(0xeb1a, 0xe300),
2033                         .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
2034         { USB_DEVICE(0xeb1a, 0xe303),
2035                         .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
2036         { USB_DEVICE(0xeb1a, 0xe305),
2037                         .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
2038         { USB_DEVICE(0xeb1a, 0xe310),
2039                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
2040         { USB_DEVICE(0xeb1a, 0xa313),
2041                 .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
2042         { USB_DEVICE(0xeb1a, 0xa316),
2043                         .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
2044         { USB_DEVICE(0xeb1a, 0xe320),
2045                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
2046         { USB_DEVICE(0xeb1a, 0xe323),
2047                         .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
2048         { USB_DEVICE(0xeb1a, 0xe350),
2049                         .driver_info = EM2870_BOARD_KWORLD_350U },
2050         { USB_DEVICE(0xeb1a, 0xe355),
2051                         .driver_info = EM2870_BOARD_KWORLD_355U },
2052         { USB_DEVICE(0xeb1a, 0x2801),
2053                         .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
2054         { USB_DEVICE(0xeb1a, 0xe357),
2055                         .driver_info = EM2870_BOARD_KWORLD_355U },
2056         { USB_DEVICE(0xeb1a, 0xe359),
2057                         .driver_info = EM2870_BOARD_KWORLD_355U },
2058         { USB_DEVICE(0x1b80, 0xe302),
2059                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
2060         { USB_DEVICE(0x1b80, 0xe304),
2061                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kworld DVD Maker 2 */
2062         { USB_DEVICE(0x0ccd, 0x0036),
2063                         .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
2064         { USB_DEVICE(0x0ccd, 0x004c),
2065                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
2066         { USB_DEVICE(0x0ccd, 0x004f),
2067                         .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
2068         { USB_DEVICE(0x0ccd, 0x005e),
2069                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2070         { USB_DEVICE(0x0ccd, 0x0042),
2071                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2072         { USB_DEVICE(0x0ccd, 0x0043),
2073                         .driver_info = EM2870_BOARD_TERRATEC_XS },
2074         { USB_DEVICE(0x0ccd, 0x008e),   /* Cinergy HTC USB XS Rev. 1 */
2075                         .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2076         { USB_DEVICE(0x0ccd, 0x00ac),   /* Cinergy HTC USB XS Rev. 2 */
2077                         .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2078         { USB_DEVICE(0x0ccd, 0x10a2),   /* H5 Rev. 1 */
2079                         .driver_info = EM2884_BOARD_TERRATEC_H5 },
2080         { USB_DEVICE(0x0ccd, 0x10ad),   /* H5 Rev. 2 */
2081                         .driver_info = EM2884_BOARD_TERRATEC_H5 },
2082         { USB_DEVICE(0x0ccd, 0x0084),
2083                         .driver_info = EM2860_BOARD_TERRATEC_AV350 },
2084         { USB_DEVICE(0x0ccd, 0x0096),
2085                         .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2086         { USB_DEVICE(0x0ccd, 0x10AF),
2087                         .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2088         { USB_DEVICE(0x0ccd, 0x00b2),
2089                         .driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
2090         { USB_DEVICE(0x0fd9, 0x0033),
2091                         .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE},
2092         { USB_DEVICE(0x185b, 0x2870),
2093                         .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
2094         { USB_DEVICE(0x185b, 0x2041),
2095                         .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
2096         { USB_DEVICE(0x2040, 0x4200),
2097                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2098         { USB_DEVICE(0x2040, 0x4201),
2099                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2100         { USB_DEVICE(0x2040, 0x6500),
2101                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
2102         { USB_DEVICE(0x2040, 0x6502),
2103                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
2104         { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
2105                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2106         { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
2107                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2108         { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
2109                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2110         { USB_DEVICE(0x2040, 0x651f),
2111                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
2112         { USB_DEVICE(0x0438, 0xb002),
2113                         .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
2114         { USB_DEVICE(0x2001, 0xf112),
2115                         .driver_info = EM2820_BOARD_DLINK_USB_TV },
2116         { USB_DEVICE(0x2304, 0x0207),
2117                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2118         { USB_DEVICE(0x2304, 0x0208),
2119                         .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
2120         { USB_DEVICE(0x2304, 0x021a),
2121                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2122         { USB_DEVICE(0x2304, 0x0226),
2123                         .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
2124         { USB_DEVICE(0x2304, 0x0227),
2125                         .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
2126         { USB_DEVICE(0x0413, 0x6023),
2127                         .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
2128         { USB_DEVICE(0x093b, 0xa003),
2129                        .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2130         { USB_DEVICE(0x093b, 0xa005),
2131                         .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
2132         { USB_DEVICE(0x04bb, 0x0515),
2133                         .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
2134         { USB_DEVICE(0xeb1a, 0x50a6),
2135                         .driver_info = EM2860_BOARD_GADMEI_UTV330 },
2136         { USB_DEVICE(0x1b80, 0xa340),
2137                         .driver_info = EM2870_BOARD_KWORLD_A340 },
2138         { USB_DEVICE(0x2013, 0x024f),
2139                         .driver_info = EM28174_BOARD_PCTV_290E },
2140         { USB_DEVICE(0x2013, 0x024c),
2141                         .driver_info = EM28174_BOARD_PCTV_460E },
2142         { USB_DEVICE(0x2040, 0x1605),
2143                         .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
2144         { USB_DEVICE(0xeb1a, 0x5006),
2145                         .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
2146         { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
2147                         .driver_info = EM2860_BOARD_EASYCAP },
2148         { USB_DEVICE(0x1b80, 0xe425),
2149                         .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
2150         { USB_DEVICE(0x2304, 0x0242),
2151                         .driver_info = EM2884_BOARD_PCTV_510E },
2152         { USB_DEVICE(0x2013, 0x0251),
2153                         .driver_info = EM2884_BOARD_PCTV_520E },
2154         { },
2155 };
2156 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
2157
2158 /*
2159  * EEPROM hash table for devices with generic USB IDs
2160  */
2161 static struct em28xx_hash_table em28xx_eeprom_hash[] = {
2162         /* P/N: SA 60002070465 Tuner: TVF7533-MF */
2163         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
2164         {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
2165         {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
2166         {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
2167         {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
2168         {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
2169         {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
2170         {0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
2171 };
2172
2173 /* I2C devicelist hash table for devices with generic USB IDs */
2174 static struct em28xx_hash_table em28xx_i2c_hash[] = {
2175         {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
2176         {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
2177         {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
2178         {0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
2179         {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
2180         {0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
2181         {0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
2182 };
2183
2184 /* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */
2185 static unsigned short saa711x_addrs[] = {
2186         0x4a >> 1, 0x48 >> 1,   /* SAA7111, SAA7111A and SAA7113 */
2187         0x42 >> 1, 0x40 >> 1,   /* SAA7114, SAA7115 and SAA7118 */
2188         I2C_CLIENT_END };
2189
2190 static unsigned short tvp5150_addrs[] = {
2191         0xb8 >> 1,
2192         0xba >> 1,
2193         I2C_CLIENT_END
2194 };
2195
2196 static unsigned short msp3400_addrs[] = {
2197         0x80 >> 1,
2198         0x88 >> 1,
2199         I2C_CLIENT_END
2200 };
2201
2202 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
2203 {
2204         int rc = 0;
2205         struct em28xx *dev = ptr;
2206
2207         if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
2208                 return 0;
2209
2210         if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
2211                 return 0;
2212
2213         rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
2214
2215         return rc;
2216 }
2217 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
2218
2219 static inline void em28xx_set_model(struct em28xx *dev)
2220 {
2221         dev->board = em28xx_boards[dev->model];
2222
2223         /* Those are the default values for the majority of boards
2224            Use those values if not specified otherwise at boards entry
2225          */
2226         if (!dev->board.xclk)
2227                 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
2228                                   EM28XX_XCLK_FREQUENCY_12MHZ;
2229
2230         if (!dev->board.i2c_speed)
2231                 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2232                                        EM28XX_I2C_FREQ_100_KHZ;
2233 }
2234
2235
2236 /* FIXME: Should be replaced by a proper mt9m111 driver */
2237 static int em28xx_initialize_mt9m111(struct em28xx *dev)
2238 {
2239         int i;
2240         unsigned char regs[][3] = {
2241                 { 0x0d, 0x00, 0x01, },  /* reset and use defaults */
2242                 { 0x0d, 0x00, 0x00, },
2243                 { 0x0a, 0x00, 0x21, },
2244                 { 0x21, 0x04, 0x00, },  /* full readout speed, no row/col skipping */
2245         };
2246
2247         for (i = 0; i < ARRAY_SIZE(regs); i++)
2248                 i2c_master_send(&dev->i2c_client, &regs[i][0], 3);
2249
2250         return 0;
2251 }
2252
2253
2254 /* FIXME: Should be replaced by a proper mt9m001 driver */
2255 static int em28xx_initialize_mt9m001(struct em28xx *dev)
2256 {
2257         int i;
2258         unsigned char regs[][3] = {
2259                 { 0x0d, 0x00, 0x01, },
2260                 { 0x0d, 0x00, 0x00, },
2261                 { 0x04, 0x05, 0x00, },  /* hres = 1280 */
2262                 { 0x03, 0x04, 0x00, },  /* vres = 1024 */
2263                 { 0x20, 0x11, 0x00, },
2264                 { 0x06, 0x00, 0x10, },
2265                 { 0x2b, 0x00, 0x24, },
2266                 { 0x2e, 0x00, 0x24, },
2267                 { 0x35, 0x00, 0x24, },
2268                 { 0x2d, 0x00, 0x20, },
2269                 { 0x2c, 0x00, 0x20, },
2270                 { 0x09, 0x0a, 0xd4, },
2271                 { 0x35, 0x00, 0x57, },
2272         };
2273
2274         for (i = 0; i < ARRAY_SIZE(regs); i++)
2275                 i2c_master_send(&dev->i2c_client, &regs[i][0], 3);
2276
2277         return 0;
2278 }
2279
2280 /* HINT method: webcam I2C chips
2281  *
2282  * This method works for webcams with Micron sensors
2283  */
2284 static int em28xx_hint_sensor(struct em28xx *dev)
2285 {
2286         int rc;
2287         char *sensor_name;
2288         unsigned char cmd;
2289         __be16 version_be;
2290         u16 version;
2291
2292         /* Micron sensor detection */
2293         dev->i2c_client.addr = 0xba >> 1;
2294         cmd = 0;
2295         i2c_master_send(&dev->i2c_client, &cmd, 1);
2296         rc = i2c_master_recv(&dev->i2c_client, (char *)&version_be, 2);
2297         if (rc != 2)
2298                 return -EINVAL;
2299
2300         version = be16_to_cpu(version_be);
2301         switch (version) {
2302         case 0x8232:            /* mt9v011 640x480 1.3 Mpix sensor */
2303         case 0x8243:            /* mt9v011 rev B 640x480 1.3 Mpix sensor */
2304                 dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
2305                 em28xx_set_model(dev);
2306
2307                 sensor_name = "mt9v011";
2308                 dev->em28xx_sensor = EM28XX_MT9V011;
2309                 dev->sensor_xres = 640;
2310                 dev->sensor_yres = 480;
2311                 /*
2312                  * FIXME: mt9v011 uses I2S speed as xtal clk - at least with
2313                  * the Silvercrest cam I have here for testing - for higher
2314                  * resolutions, a high clock cause horizontal artifacts, so we
2315                  * need to use a lower xclk frequency.
2316                  * Yet, it would be possible to adjust xclk depending on the
2317                  * desired resolution, since this affects directly the
2318                  * frame rate.
2319                  */
2320                 dev->board.xclk = EM28XX_XCLK_FREQUENCY_4_3MHZ;
2321                 dev->sensor_xtal = 4300000;
2322
2323                 /* probably means GRGB 16 bit bayer */
2324                 dev->vinmode = 0x0d;
2325                 dev->vinctl = 0x00;
2326
2327                 break;
2328
2329         case 0x143a:    /* MT9M111 as found in the ECS G200 */
2330                 dev->model = EM2750_BOARD_UNKNOWN;
2331                 em28xx_set_model(dev);
2332
2333                 sensor_name = "mt9m111";
2334                 dev->board.xclk = EM28XX_XCLK_FREQUENCY_48MHZ;
2335                 dev->em28xx_sensor = EM28XX_MT9M111;
2336                 em28xx_initialize_mt9m111(dev);
2337                 dev->sensor_xres = 640;
2338                 dev->sensor_yres = 512;
2339
2340                 dev->vinmode = 0x0a;
2341                 dev->vinctl = 0x00;
2342
2343                 break;
2344
2345         case 0x8431:
2346                 dev->model = EM2750_BOARD_UNKNOWN;
2347                 em28xx_set_model(dev);
2348
2349                 sensor_name = "mt9m001";
2350                 dev->em28xx_sensor = EM28XX_MT9M001;
2351                 em28xx_initialize_mt9m001(dev);
2352                 dev->sensor_xres = 1280;
2353                 dev->sensor_yres = 1024;
2354
2355                 /* probably means BGGR 16 bit bayer */
2356                 dev->vinmode = 0x0c;
2357                 dev->vinctl = 0x00;
2358
2359                 break;
2360         default:
2361                 printk("Unknown Micron Sensor 0x%04x\n", version);
2362                 return -EINVAL;
2363         }
2364
2365         /* Setup webcam defaults */
2366         em28xx_pre_card_setup(dev);
2367
2368         em28xx_errdev("Sensor is %s, using model %s entry.\n",
2369                       sensor_name, em28xx_boards[dev->model].name);
2370
2371         return 0;
2372 }
2373
2374 /* Since em28xx_pre_card_setup() requires a proper dev->model,
2375  * this won't work for boards with generic PCI IDs
2376  */
2377 static void em28xx_pre_card_setup(struct em28xx *dev)
2378 {
2379         /* Set the initial XCLK and I2C clock values based on the board
2380            definition */
2381         em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
2382         if (!dev->board.is_em2800)
2383                 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
2384         msleep(50);
2385
2386         /* request some modules */
2387         switch (dev->model) {
2388         case EM2861_BOARD_PLEXTOR_PX_TV100U:
2389                 /* Sets the msp34xx I2S speed */
2390                 dev->i2s_speed = 2048000;
2391                 break;
2392         case EM2861_BOARD_KWORLD_PVRTV_300U:
2393         case EM2880_BOARD_KWORLD_DVB_305U:
2394                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
2395                 msleep(10);
2396                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
2397                 msleep(10);
2398                 break;
2399         case EM2870_BOARD_COMPRO_VIDEOMATE:
2400                 /* TODO: someone can do some cleanup here...
2401                          not everything's needed */
2402                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2403                 msleep(10);
2404                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
2405                 msleep(10);
2406                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
2407                 mdelay(70);
2408                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
2409                 mdelay(70);
2410                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
2411                 mdelay(70);
2412                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
2413                 mdelay(70);
2414                 break;
2415         case EM2870_BOARD_TERRATEC_XS_MT2060:
2416                 /* this device needs some gpio writes to get the DVB-T
2417                    demod work */
2418                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
2419                 mdelay(70);
2420                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
2421                 mdelay(70);
2422                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
2423                 mdelay(70);
2424                 break;
2425         case EM2870_BOARD_PINNACLE_PCTV_DVB:
2426                 /* this device needs some gpio writes to get the
2427                    DVB-T demod work */
2428                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
2429                 mdelay(70);
2430                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
2431                 mdelay(70);
2432                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
2433                 mdelay(70);
2434                 break;
2435         case EM2820_BOARD_GADMEI_UTV310:
2436         case EM2820_BOARD_MSI_VOX_USB_2:
2437                 /* enables audio for that devices */
2438                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
2439                 break;
2440
2441         case EM2882_BOARD_KWORLD_ATSC_315U:
2442                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
2443                 msleep(10);
2444                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
2445                 msleep(10);
2446                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2447                 msleep(10);
2448                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
2449                 msleep(10);
2450                 break;
2451
2452         case EM2860_BOARD_KAIOMY_TVNPC_U2:
2453                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
2454                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
2455                 em28xx_write_regs(dev, 0x0d, "\x42", 1);
2456                 em28xx_write_regs(dev, 0x08, "\xfd", 1);
2457                 msleep(10);
2458                 em28xx_write_regs(dev, 0x08, "\xff", 1);
2459                 msleep(10);
2460                 em28xx_write_regs(dev, 0x08, "\x7f", 1);
2461                 msleep(10);
2462                 em28xx_write_regs(dev, 0x08, "\x6b", 1);
2463
2464                 break;
2465         case EM2860_BOARD_EASYCAP:
2466                 em28xx_write_regs(dev, 0x08, "\xf8", 1);
2467                 break;
2468
2469         case EM2820_BOARD_IODATA_GVMVP_SZ:
2470                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
2471                 msleep(70);
2472                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
2473                 msleep(10);
2474                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
2475                 msleep(70);
2476                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
2477                 msleep(70);
2478                 break;
2479         }
2480
2481         em28xx_gpio_set(dev, dev->board.tuner_gpio);
2482         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2483
2484         /* Unlock device */
2485         em28xx_set_mode(dev, EM28XX_SUSPEND);
2486 }
2487
2488 static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
2489 {
2490         memset(ctl, 0, sizeof(*ctl));
2491
2492         ctl->fname   = XC2028_DEFAULT_FIRMWARE;
2493         ctl->max_len = 64;
2494         ctl->mts = em28xx_boards[dev->model].mts_firmware;
2495
2496         switch (dev->model) {
2497         case EM2880_BOARD_EMPIRE_DUAL_TV:
2498         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
2499         case EM2882_BOARD_TERRATEC_HYBRID_XS:
2500                 ctl->demod = XC3028_FE_ZARLINK456;
2501                 break;
2502         case EM2880_BOARD_TERRATEC_HYBRID_XS:
2503         case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
2504         case EM2881_BOARD_PINNACLE_HYBRID_PRO:
2505                 ctl->demod = XC3028_FE_ZARLINK456;
2506                 break;
2507         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
2508         case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
2509                 ctl->demod = XC3028_FE_DEFAULT;
2510                 break;
2511         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
2512                 ctl->demod = XC3028_FE_DEFAULT;
2513                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
2514                 break;
2515         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2516         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2517         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
2518                 /* FIXME: Better to specify the needed IF */
2519                 ctl->demod = XC3028_FE_DEFAULT;
2520                 break;
2521         case EM2883_BOARD_KWORLD_HYBRID_330U:
2522         case EM2882_BOARD_DIKOM_DK300:
2523         case EM2882_BOARD_KWORLD_VS_DVBT:
2524                 ctl->demod = XC3028_FE_CHINA;
2525                 ctl->fname = XC2028_DEFAULT_FIRMWARE;
2526                 break;
2527         case EM2882_BOARD_EVGA_INDTUBE:
2528                 ctl->demod = XC3028_FE_CHINA;
2529                 ctl->fname = XC3028L_DEFAULT_FIRMWARE;
2530                 break;
2531         default:
2532                 ctl->demod = XC3028_FE_OREN538;
2533         }
2534 }
2535
2536 static void em28xx_tuner_setup(struct em28xx *dev)
2537 {
2538         struct tuner_setup           tun_setup;
2539         struct v4l2_frequency        f;
2540
2541         if (dev->tuner_type == TUNER_ABSENT)
2542                 return;
2543
2544         memset(&tun_setup, 0, sizeof(tun_setup));
2545
2546         tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
2547         tun_setup.tuner_callback = em28xx_tuner_callback;
2548
2549         if (dev->board.radio.type) {
2550                 tun_setup.type = dev->board.radio.type;
2551                 tun_setup.addr = dev->board.radio_addr;
2552
2553                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
2554         }
2555
2556         if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type)) {
2557                 tun_setup.type   = dev->tuner_type;
2558                 tun_setup.addr   = dev->tuner_addr;
2559
2560                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_type_addr, &tun_setup);
2561         }
2562
2563         if (dev->tda9887_conf) {
2564                 struct v4l2_priv_tun_config tda9887_cfg;
2565
2566                 tda9887_cfg.tuner = TUNER_TDA9887;
2567                 tda9887_cfg.priv = &dev->tda9887_conf;
2568
2569                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &tda9887_cfg);
2570         }
2571
2572         if (dev->tuner_type == TUNER_XC2028) {
2573                 struct v4l2_priv_tun_config  xc2028_cfg;
2574                 struct xc2028_ctrl           ctl;
2575
2576                 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
2577                 memset(&ctl, 0, sizeof(ctl));
2578
2579                 em28xx_setup_xc3028(dev, &ctl);
2580
2581                 xc2028_cfg.tuner = TUNER_XC2028;
2582                 xc2028_cfg.priv  = &ctl;
2583
2584                 v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_config, &xc2028_cfg);
2585         }
2586
2587         /* configure tuner */
2588         f.tuner = 0;
2589         f.type = V4L2_TUNER_ANALOG_TV;
2590         f.frequency = 9076;     /* just a magic number */
2591         dev->ctl_freq = f.frequency;
2592         v4l2_device_call_all(&dev->v4l2_dev, 0, tuner, s_frequency, &f);
2593 }
2594
2595 static int em28xx_hint_board(struct em28xx *dev)
2596 {
2597         int i;
2598
2599         /* HINT method: EEPROM
2600          *
2601          * This method works only for boards with eeprom.
2602          * Uses a hash of all eeprom bytes. The hash should be
2603          * unique for a vendor/tuner pair.
2604          * There are a high chance that tuners for different
2605          * video standards produce different hashes.
2606          */
2607         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
2608                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
2609                         dev->model = em28xx_eeprom_hash[i].model;
2610                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
2611
2612                         em28xx_errdev("Your board has no unique USB ID.\n");
2613                         em28xx_errdev("A hint were successfully done, "
2614                                       "based on eeprom hash.\n");
2615                         em28xx_errdev("This method is not 100%% failproof.\n");
2616                         em28xx_errdev("If the board were missdetected, "
2617                                       "please email this log to:\n");
2618                         em28xx_errdev("\tV4L Mailing List "
2619                                       " <linux-media@vger.kernel.org>\n");
2620                         em28xx_errdev("Board detected as %s\n",
2621                                       em28xx_boards[dev->model].name);
2622
2623                         return 0;
2624                 }
2625         }
2626
2627         /* HINT method: I2C attached devices
2628          *
2629          * This method works for all boards.
2630          * Uses a hash of i2c scanned devices.
2631          * Devices with the same i2c attached chips will
2632          * be considered equal.
2633          * This method is less precise than the eeprom one.
2634          */
2635
2636         /* user did not request i2c scanning => do it now */
2637         if (!dev->i2c_hash)
2638                 em28xx_do_i2c_scan(dev);
2639
2640         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
2641                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
2642                         dev->model = em28xx_i2c_hash[i].model;
2643                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
2644                         em28xx_errdev("Your board has no unique USB ID.\n");
2645                         em28xx_errdev("A hint were successfully done, "
2646                                       "based on i2c devicelist hash.\n");
2647                         em28xx_errdev("This method is not 100%% failproof.\n");
2648                         em28xx_errdev("If the board were missdetected, "
2649                                       "please email this log to:\n");
2650                         em28xx_errdev("\tV4L Mailing List "
2651                                       " <linux-media@vger.kernel.org>\n");
2652                         em28xx_errdev("Board detected as %s\n",
2653                                       em28xx_boards[dev->model].name);
2654
2655                         return 0;
2656                 }
2657         }
2658
2659         em28xx_errdev("Your board has no unique USB ID and thus need a "
2660                       "hint to be detected.\n");
2661         em28xx_errdev("You may try to use card=<n> insmod option to "
2662                       "workaround that.\n");
2663         em28xx_errdev("Please send an email with this log to:\n");
2664         em28xx_errdev("\tV4L Mailing List <linux-media@vger.kernel.org>\n");
2665         em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash);
2666         em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash);
2667
2668         em28xx_errdev("Here is a list of valid choices for the card=<n>"
2669                       " insmod option:\n");
2670         for (i = 0; i < em28xx_bcount; i++) {
2671                 em28xx_errdev("    card=%d -> %s\n",
2672                                 i, em28xx_boards[i].name);
2673         }
2674         return -1;
2675 }
2676
2677 static void em28xx_card_setup(struct em28xx *dev)
2678 {
2679         /*
2680          * If the device can be a webcam, seek for a sensor.
2681          * If sensor is not found, then it isn't a webcam.
2682          */
2683         if (dev->board.is_webcam) {
2684                 if (em28xx_hint_sensor(dev) < 0)
2685                         dev->board.is_webcam = 0;
2686                 else
2687                         dev->progressive = 1;
2688         }
2689
2690         if (!dev->board.is_webcam) {
2691                 switch (dev->model) {
2692                 case EM2820_BOARD_UNKNOWN:
2693                 case EM2800_BOARD_UNKNOWN:
2694                 /*
2695                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
2696                  *
2697                  * This occurs because they share identical USB vendor and
2698                  * product IDs.
2699                  *
2700                  * What we do here is look up the EEPROM hash of the K-WORLD
2701                  * and if it is found then we decide that we do not have
2702                  * a DIGIVOX and reset the device to the K-WORLD instead.
2703                  *
2704                  * This solution is only valid if they do not share eeprom
2705                  * hash identities which has not been determined as yet.
2706                  */
2707                 if (em28xx_hint_board(dev) < 0)
2708                         em28xx_errdev("Board not discovered\n");
2709                 else {
2710                         em28xx_set_model(dev);
2711                         em28xx_pre_card_setup(dev);
2712                 }
2713                 break;
2714                 default:
2715                         em28xx_set_model(dev);
2716                 }
2717         }
2718
2719         em28xx_info("Identified as %s (card=%d)\n",
2720                     dev->board.name, dev->model);
2721
2722         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
2723         if (em28xx_boards[dev->model].tuner_addr)
2724                 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr;
2725
2726         if (em28xx_boards[dev->model].tda9887_conf)
2727                 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf;
2728
2729         /* request some modules */
2730         switch (dev->model) {
2731         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
2732         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
2733         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
2734         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2735         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2736         {
2737                 struct tveeprom tv;
2738 #if defined(CONFIG_MODULES) && defined(MODULE)
2739                 request_module("tveeprom");
2740 #endif
2741                 /* Call first TVeeprom */
2742
2743                 dev->i2c_client.addr = 0xa0 >> 1;
2744                 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata);
2745
2746                 dev->tuner_type = tv.tuner_type;
2747
2748                 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) {
2749                         dev->i2s_speed = 2048000;
2750                         dev->board.has_msp34xx = 1;
2751                 }
2752                 break;
2753         }
2754         case EM2882_BOARD_KWORLD_ATSC_315U:
2755                 em28xx_write_reg(dev, 0x0d, 0x42);
2756                 msleep(10);
2757                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
2758                 msleep(10);
2759                 break;
2760         case EM2820_BOARD_KWORLD_PVRTV2800RF:
2761                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
2762                 em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
2763                 break;
2764         case EM2820_BOARD_UNKNOWN:
2765         case EM2800_BOARD_UNKNOWN:
2766                 /*
2767                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
2768                  *
2769                  * This occurs because they share identical USB vendor and
2770                  * product IDs.
2771                  *
2772                  * What we do here is look up the EEPROM hash of the K-WORLD
2773                  * and if it is found then we decide that we do not have
2774                  * a DIGIVOX and reset the device to the K-WORLD instead.
2775                  *
2776                  * This solution is only valid if they do not share eeprom
2777                  * hash identities which has not been determined as yet.
2778                  */
2779         case EM2880_BOARD_MSI_DIGIVOX_AD:
2780                 if (!em28xx_hint_board(dev))
2781                         em28xx_set_model(dev);
2782
2783                 /* In cases where we had to use a board hint, the call to
2784                    em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
2785                    so make the call now so the analog GPIOs are set properly
2786                    before probing the i2c bus. */
2787                 em28xx_gpio_set(dev, dev->board.tuner_gpio);
2788                 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2789                 break;
2790
2791 /*
2792                  * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
2793                  *
2794                  * This occurs because they share identical USB vendor and
2795                  * product IDs.
2796                  *
2797                  * What we do here is look up the EEPROM hash of the Dikom
2798                  * and if it is found then we decide that we do not have
2799                  * a Kworld and reset the device to the Dikom instead.
2800                  *
2801                  * This solution is only valid if they do not share eeprom
2802                  * hash identities which has not been determined as yet.
2803                  */
2804         case EM2882_BOARD_KWORLD_VS_DVBT:
2805                 if (!em28xx_hint_board(dev))
2806                         em28xx_set_model(dev);
2807
2808                 /* In cases where we had to use a board hint, the call to
2809                    em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
2810                    so make the call now so the analog GPIOs are set properly
2811                    before probing the i2c bus. */
2812                 em28xx_gpio_set(dev, dev->board.tuner_gpio);
2813                 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2814                 break;
2815         }
2816
2817         if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
2818                 em28xx_errdev("\n\n");
2819                 em28xx_errdev("The support for this board weren't "
2820                               "valid yet.\n");
2821                 em28xx_errdev("Please send a report of having this working\n");
2822                 em28xx_errdev("not to V4L mailing list (and/or to other "
2823                                 "addresses)\n\n");
2824         }
2825
2826         /* Allow override tuner type by a module parameter */
2827         if (tuner >= 0)
2828                 dev->tuner_type = tuner;
2829
2830         /* request some modules */
2831         if (dev->board.has_msp34xx)
2832                 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2833                         "msp3400", 0, msp3400_addrs);
2834
2835         if (dev->board.decoder == EM28XX_SAA711X)
2836                 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2837                         "saa7115_auto", 0, saa711x_addrs);
2838
2839         if (dev->board.decoder == EM28XX_TVP5150)
2840                 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2841                         "tvp5150", 0, tvp5150_addrs);
2842
2843         if (dev->em28xx_sensor == EM28XX_MT9V011) {
2844                 struct mt9v011_platform_data pdata;
2845                 struct i2c_board_info mt9v011_info = {
2846                         .type = "mt9v011",
2847                         .addr = 0xba >> 1,
2848                         .platform_data = &pdata,
2849                 };
2850
2851                 pdata.xtal = dev->sensor_xtal;
2852                 v4l2_i2c_new_subdev_board(&dev->v4l2_dev, &dev->i2c_adap,
2853                                 &mt9v011_info, NULL);
2854         }
2855
2856
2857         if (dev->board.adecoder == EM28XX_TVAUDIO)
2858                 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2859                         "tvaudio", dev->board.tvaudio_addr, NULL);
2860
2861         if (dev->board.tuner_type != TUNER_ABSENT) {
2862                 int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
2863
2864                 if (dev->board.radio.type)
2865                         v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2866                                 "tuner", dev->board.radio_addr, NULL);
2867
2868                 if (has_demod)
2869                         v4l2_i2c_new_subdev(&dev->v4l2_dev,
2870                                 &dev->i2c_adap, "tuner",
2871                                 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
2872                 if (dev->tuner_addr == 0) {
2873                         enum v4l2_i2c_tuner_type type =
2874                                 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
2875                         struct v4l2_subdev *sd;
2876
2877                         sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
2878                                 &dev->i2c_adap, "tuner",
2879                                 0, v4l2_i2c_tuner_addrs(type));
2880
2881                         if (sd)
2882                                 dev->tuner_addr = v4l2_i2c_subdev_addr(sd);
2883                 } else {
2884                         v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
2885                                 "tuner", dev->tuner_addr, NULL);
2886                 }
2887         }
2888
2889         em28xx_tuner_setup(dev);
2890 }
2891
2892
2893 static void request_module_async(struct work_struct *work)
2894 {
2895         struct em28xx *dev = container_of(work,
2896                              struct em28xx, request_module_wk);
2897
2898         /*
2899          * The em28xx extensions can be modules or builtin. If the
2900          * modules are already loaded or are built in, those extensions
2901          * can be initialised right now. Otherwise, the module init
2902          * code will do it.
2903          */
2904         em28xx_init_extension(dev);
2905
2906 #if defined(CONFIG_MODULES) && defined(MODULE)
2907         if (dev->has_audio_class)
2908                 request_module("snd-usb-audio");
2909         else if (dev->has_alsa_audio)
2910                 request_module("em28xx-alsa");
2911
2912         if (dev->board.has_dvb)
2913                 request_module("em28xx-dvb");
2914         if (dev->board.ir_codes && !disable_ir)
2915                 request_module("em28xx-rc");
2916 #endif /* CONFIG_MODULES */
2917 }
2918
2919 static void request_modules(struct em28xx *dev)
2920 {
2921         INIT_WORK(&dev->request_module_wk, request_module_async);
2922         schedule_work(&dev->request_module_wk);
2923 }
2924
2925 static void flush_request_modules(struct em28xx *dev)
2926 {
2927         flush_work(&dev->request_module_wk);
2928 }
2929
2930 /*
2931  * em28xx_release_resources()
2932  * unregisters the v4l2,i2c and usb devices
2933  * called when the device gets disconnected or at module unload
2934 */
2935 void em28xx_release_resources(struct em28xx *dev)
2936 {
2937         /*FIXME: I2C IR should be disconnected */
2938
2939         em28xx_release_analog_resources(dev);
2940
2941         em28xx_i2c_unregister(dev);
2942
2943         v4l2_device_unregister(&dev->v4l2_dev);
2944
2945         usb_put_dev(dev->udev);
2946
2947         /* Mark device as unused */
2948         clear_bit(dev->devno, &em28xx_devused);
2949 };
2950
2951 /*
2952  * em28xx_init_dev()
2953  * allocates and inits the device structs, registers i2c bus and v4l device
2954  */
2955 static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
2956                            struct usb_interface *interface,
2957                            int minor)
2958 {
2959         int retval;
2960
2961         dev->udev = udev;
2962         mutex_init(&dev->ctrl_urb_lock);
2963         spin_lock_init(&dev->slock);
2964
2965         dev->em28xx_write_regs = em28xx_write_regs;
2966         dev->em28xx_read_reg = em28xx_read_reg;
2967         dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
2968         dev->em28xx_write_regs_req = em28xx_write_regs_req;
2969         dev->em28xx_read_reg_req = em28xx_read_reg_req;
2970         dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
2971
2972         em28xx_set_model(dev);
2973
2974         /* Set the default GPO/GPIO for legacy devices */
2975         dev->reg_gpo_num = EM2880_R04_GPO;
2976         dev->reg_gpio_num = EM28XX_R08_GPIO;
2977
2978         dev->wait_after_write = 5;
2979
2980         /* Based on the Chip ID, set the device configuration */
2981         retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
2982         if (retval > 0) {
2983                 dev->chip_id = retval;
2984
2985                 switch (dev->chip_id) {
2986                 case CHIP_ID_EM2800:
2987                         em28xx_info("chip ID is em2800\n");
2988                         break;
2989                 case CHIP_ID_EM2710:
2990                         em28xx_info("chip ID is em2710\n");
2991                         break;
2992                 case CHIP_ID_EM2750:
2993                         em28xx_info("chip ID is em2750\n");
2994                         break;
2995                 case CHIP_ID_EM2820:
2996                         em28xx_info("chip ID is em2820 (or em2710)\n");
2997                         break;
2998                 case CHIP_ID_EM2840:
2999                         em28xx_info("chip ID is em2840\n");
3000                         break;
3001                 case CHIP_ID_EM2860:
3002                         em28xx_info("chip ID is em2860\n");
3003                         break;
3004                 case CHIP_ID_EM2870:
3005                         em28xx_info("chip ID is em2870\n");
3006                         dev->wait_after_write = 0;
3007                         break;
3008                 case CHIP_ID_EM2874:
3009                         em28xx_info("chip ID is em2874\n");
3010                         dev->reg_gpio_num = EM2874_R80_GPIO;
3011                         dev->wait_after_write = 0;
3012                         break;
3013                 case CHIP_ID_EM28174:
3014                         em28xx_info("chip ID is em28174\n");
3015                         dev->reg_gpio_num = EM2874_R80_GPIO;
3016                         dev->wait_after_write = 0;
3017                         break;
3018                 case CHIP_ID_EM2883:
3019                         em28xx_info("chip ID is em2882/em2883\n");
3020                         dev->wait_after_write = 0;
3021                         break;
3022                 case CHIP_ID_EM2884:
3023                         em28xx_info("chip ID is em2884\n");
3024                         dev->reg_gpio_num = EM2874_R80_GPIO;
3025                         dev->wait_after_write = 0;
3026                         break;
3027                 default:
3028                         em28xx_info("em28xx chip ID = %d\n", dev->chip_id);
3029                 }
3030         }
3031
3032         if (dev->is_audio_only) {
3033                 retval = em28xx_audio_setup(dev);
3034                 if (retval)
3035                         return -ENODEV;
3036                 em28xx_init_extension(dev);
3037
3038                 return 0;
3039         }
3040
3041         /* Prepopulate cached GPO register content */
3042         retval = em28xx_read_reg(dev, dev->reg_gpo_num);
3043         if (retval >= 0)
3044                 dev->reg_gpo = retval;
3045
3046         em28xx_pre_card_setup(dev);
3047
3048         if (!dev->board.is_em2800) {
3049                 /* Resets I2C speed */
3050                 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
3051                 if (retval < 0) {
3052                         em28xx_errdev("%s: em28xx_write_reg failed!"
3053                                       " retval [%d]\n",
3054                                       __func__, retval);
3055                         return retval;
3056                 }
3057         }
3058
3059         retval = v4l2_device_register(&interface->dev, &dev->v4l2_dev);
3060         if (retval < 0) {
3061                 em28xx_errdev("Call to v4l2_device_register() failed!\n");
3062                 return retval;
3063         }
3064
3065         /* register i2c bus */
3066         retval = em28xx_i2c_register(dev);
3067         if (retval < 0) {
3068                 em28xx_errdev("%s: em28xx_i2c_register - error [%d]!\n",
3069                         __func__, retval);
3070                 goto unregister_dev;
3071         }
3072
3073         /*
3074          * Default format, used for tvp5150 or saa711x output formats
3075          */
3076         dev->vinmode = 0x10;
3077         dev->vinctl  = EM28XX_VINCTRL_INTERLACED |
3078                        EM28XX_VINCTRL_CCIR656_ENABLE;
3079
3080         /* Do board specific init and eeprom reading */
3081         em28xx_card_setup(dev);
3082
3083         /* Configure audio */
3084         retval = em28xx_audio_setup(dev);
3085         if (retval < 0) {
3086                 em28xx_errdev("%s: Error while setting audio - error [%d]!\n",
3087                         __func__, retval);
3088                 goto fail;
3089         }
3090
3091         /* wake i2c devices */
3092         em28xx_wake_i2c(dev);
3093
3094         /* init video dma queues */
3095         INIT_LIST_HEAD(&dev->vidq.active);
3096         INIT_LIST_HEAD(&dev->vbiq.active);
3097
3098         if (dev->board.has_msp34xx) {
3099                 /* Send a reset to other chips via gpio */
3100                 retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
3101                 if (retval < 0) {
3102                         em28xx_errdev("%s: em28xx_write_reg - "
3103                                       "msp34xx(1) failed! error [%d]\n",
3104                                       __func__, retval);
3105                         goto fail;
3106                 }
3107                 msleep(3);
3108
3109                 retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
3110                 if (retval < 0) {
3111                         em28xx_errdev("%s: em28xx_write_reg - "
3112                                       "msp34xx(2) failed! error [%d]\n",
3113                                       __func__, retval);
3114                         goto fail;
3115                 }
3116                 msleep(3);
3117         }
3118
3119         retval = em28xx_register_analog_devices(dev);
3120         if (retval < 0) {
3121                 goto fail;
3122         }
3123
3124         /* Save some power by putting tuner to sleep */
3125         v4l2_device_call_all(&dev->v4l2_dev, 0, core, s_power, 0);
3126
3127         return 0;
3128
3129 fail:
3130         em28xx_i2c_unregister(dev);
3131
3132 unregister_dev:
3133         v4l2_device_unregister(&dev->v4l2_dev);
3134
3135         return retval;
3136 }
3137
3138 /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
3139 #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3140
3141 /*
3142  * em28xx_usb_probe()
3143  * checks for supported devices
3144  */
3145 static int em28xx_usb_probe(struct usb_interface *interface,
3146                             const struct usb_device_id *id)
3147 {
3148         struct usb_device *udev;
3149         struct em28xx *dev = NULL;
3150         int retval;
3151         bool has_audio = false, has_video = false, has_dvb = false;
3152         int i, nr;
3153         const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
3154         char *speed;
3155
3156         udev = usb_get_dev(interface_to_usbdev(interface));
3157
3158         /* Check to see next free device and mark as used */
3159         do {
3160                 nr = find_first_zero_bit(&em28xx_devused, EM28XX_MAXBOARDS);
3161                 if (nr >= EM28XX_MAXBOARDS) {
3162                         /* No free device slots */
3163                         printk(DRIVER_NAME ": Supports only %i em28xx boards.\n",
3164                                         EM28XX_MAXBOARDS);
3165                         retval = -ENOMEM;
3166                         goto err_no_slot;
3167                 }
3168         } while (test_and_set_bit(nr, &em28xx_devused));
3169
3170         /* Don't register audio interfaces */
3171         if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3172                 em28xx_err(DRIVER_NAME " audio device (%04x:%04x): "
3173                         "interface %i, class %i\n",
3174                         le16_to_cpu(udev->descriptor.idVendor),
3175                         le16_to_cpu(udev->descriptor.idProduct),
3176                         ifnum,
3177                         interface->altsetting[0].desc.bInterfaceClass);
3178
3179                 retval = -ENODEV;
3180                 goto err;
3181         }
3182
3183         /* allocate memory for our device state and initialize it */
3184         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
3185         if (dev == NULL) {
3186                 em28xx_err(DRIVER_NAME ": out of memory!\n");
3187                 retval = -ENOMEM;
3188                 goto err;
3189         }
3190
3191         /* compute alternate max packet sizes */
3192         dev->alt_max_pkt_size_isoc =
3193                                 kmalloc(sizeof(dev->alt_max_pkt_size_isoc[0]) *
3194                                         interface->num_altsetting, GFP_KERNEL);
3195         if (dev->alt_max_pkt_size_isoc == NULL) {
3196                 em28xx_errdev("out of memory!\n");
3197                 kfree(dev);
3198                 retval = -ENOMEM;
3199                 goto err;
3200         }
3201
3202         /* Get endpoints */
3203         for (i = 0; i < interface->num_altsetting; i++) {
3204                 int ep;
3205
3206                 for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) {
3207                         const struct usb_endpoint_descriptor *e;
3208                         int sizedescr, size;
3209
3210                         e = &interface->altsetting[i].endpoint[ep].desc;
3211
3212                         sizedescr = le16_to_cpu(e->wMaxPacketSize);
3213                         size = sizedescr & 0x7ff;
3214
3215                         if (udev->speed == USB_SPEED_HIGH)
3216                                 size = size * hb_mult(sizedescr);
3217
3218                         if (usb_endpoint_dir_in(e)) {
3219                                 switch (e->bEndpointAddress) {
3220                                 case 0x82:
3221                                         has_video = true;
3222                                         if (usb_endpoint_xfer_isoc(e)) {
3223                                                 dev->analog_ep_isoc =
3224                                                             e->bEndpointAddress;
3225                                                 dev->alt_max_pkt_size_isoc[i] = size;
3226                                         } else if (usb_endpoint_xfer_bulk(e)) {
3227                                                 dev->analog_ep_bulk =
3228                                                             e->bEndpointAddress;
3229                                         }
3230                                         break;
3231                                 case 0x83:
3232                                         if (usb_endpoint_xfer_isoc(e)) {
3233                                                 has_audio = true;
3234                                         } else {
3235                                                 printk(KERN_INFO DRIVER_NAME
3236                                                 ": error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
3237                                         }
3238                                         break;
3239                                 case 0x84:
3240                                         if (has_video &&
3241                                             (usb_endpoint_xfer_bulk(e))) {
3242                                                 dev->analog_ep_bulk =
3243                                                             e->bEndpointAddress;
3244                                         } else {
3245                                                 has_dvb = true;
3246                                                 if (usb_endpoint_xfer_isoc(e)) {
3247                                                         dev->dvb_ep_isoc = e->bEndpointAddress;
3248                                                         if (size > dev->dvb_max_pkt_size_isoc) {
3249                                                                 dev->dvb_max_pkt_size_isoc = size;
3250                                                                 dev->dvb_alt_isoc = i;
3251                                                         }
3252                                                 } else {
3253                                                         dev->dvb_ep_bulk = e->bEndpointAddress;
3254                                                 }
3255                                         }
3256                                         break;
3257                                 }
3258                         }
3259                         /* NOTE:
3260                          * Old logic with support for isoc transfers only was:
3261                          *  0x82        isoc            => analog
3262                          *  0x83        isoc            => audio
3263                          *  0x84        isoc            => digital
3264                          *
3265                          * New logic with support for bulk transfers
3266                          *  0x82        isoc            => analog
3267                          *  0x82        bulk            => analog
3268                          *  0x83        isoc*           => audio
3269                          *  0x84        isoc            => digital
3270                          *  0x84        bulk            => analog or digital**
3271                          * (*: audio should always be isoc)
3272                          * (**: analog, if ep 0x82 is isoc, otherwise digital)
3273                          *
3274                          * The new logic preserves backwards compatibility and
3275                          * reflects the endpoint configurations we have seen
3276                          * so far. But there might be devices for which this
3277                          * logic is not sufficient...
3278                          */
3279                 }
3280         }
3281
3282         if (!(has_audio || has_video || has_dvb)) {
3283                 retval = -ENODEV;
3284                 goto err_free;
3285         }
3286
3287         switch (udev->speed) {
3288         case USB_SPEED_LOW:
3289                 speed = "1.5";
3290                 break;
3291         case USB_SPEED_UNKNOWN:
3292         case USB_SPEED_FULL:
3293                 speed = "12";
3294                 break;
3295         case USB_SPEED_HIGH:
3296                 speed = "480";
3297                 break;
3298         default:
3299                 speed = "unknown";
3300         }
3301
3302         printk(KERN_INFO DRIVER_NAME
3303                 ": New device %s %s @ %s Mbps "
3304                 "(%04x:%04x, interface %d, class %d)\n",
3305                 udev->manufacturer ? udev->manufacturer : "",
3306                 udev->product ? udev->product : "",
3307                 speed,
3308                 le16_to_cpu(udev->descriptor.idVendor),
3309                 le16_to_cpu(udev->descriptor.idProduct),
3310                 ifnum,
3311                 interface->altsetting->desc.bInterfaceNumber);
3312
3313         /*
3314          * Make sure we have 480 Mbps of bandwidth, otherwise things like
3315          * video stream wouldn't likely work, since 12 Mbps is generally
3316          * not enough even for most Digital TV streams.
3317          */
3318         if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
3319                 printk(DRIVER_NAME ": Device initialization failed.\n");
3320                 printk(DRIVER_NAME ": Device must be connected to a high-speed"
3321                        " USB 2.0 port.\n");
3322                 retval = -ENODEV;
3323                 goto err_free;
3324         }
3325
3326         /* Select USB transfer types to use */
3327         if (has_video &&
3328             (!dev->analog_ep_isoc || (prefer_bulk && dev->analog_ep_bulk)))
3329                 dev->analog_xfer_bulk = 1;
3330         if (has_dvb &&
3331             (!dev->dvb_ep_isoc || (prefer_bulk && dev->dvb_ep_bulk)))
3332                 dev->dvb_xfer_bulk = 1;
3333
3334         snprintf(dev->name, sizeof(dev->name), "em28xx #%d", nr);
3335         dev->devno = nr;
3336         dev->model = id->driver_info;
3337         dev->alt   = -1;
3338         dev->is_audio_only = has_audio && !(has_video || has_dvb);
3339         dev->has_alsa_audio = has_audio;
3340         dev->audio_ifnum = ifnum;
3341
3342         /* Checks if audio is provided by some interface */
3343         for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
3344                 struct usb_interface *uif = udev->config->interface[i];
3345                 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3346                         dev->has_audio_class = 1;
3347                         break;
3348                 }
3349         }
3350
3351         if (has_audio)
3352                 printk(KERN_INFO DRIVER_NAME
3353                        ": Audio interface %i found %s\n",
3354                        ifnum,
3355                        dev->has_audio_class ? "(USB Audio Class)" : "(Vendor Class)");
3356         if (has_video)
3357                 printk(KERN_INFO DRIVER_NAME
3358                        ": Video interface %i found:%s%s\n",
3359                        ifnum,
3360                        dev->analog_ep_bulk ? " bulk" : "",
3361                        dev->analog_ep_isoc ? " isoc" : "");
3362         if (has_dvb)
3363                 printk(KERN_INFO DRIVER_NAME
3364                        ": DVB interface %i found:%s%s\n",
3365                        ifnum,
3366                        dev->dvb_ep_bulk ? " bulk" : "",
3367                        dev->dvb_ep_isoc ? " isoc" : "");
3368
3369         dev->num_alt = interface->num_altsetting;
3370
3371         if ((unsigned)card[nr] < em28xx_bcount)
3372                 dev->model = card[nr];
3373
3374         /* save our data pointer in this interface device */
3375         usb_set_intfdata(interface, dev);
3376
3377         /* allocate device struct */
3378         mutex_init(&dev->lock);
3379         mutex_lock(&dev->lock);
3380         retval = em28xx_init_dev(dev, udev, interface, nr);
3381         if (retval) {
3382                 goto unlock_and_free;
3383         }
3384
3385         if (has_dvb) {
3386                 /* pre-allocate DVB usb transfer buffers */
3387                 if (dev->dvb_xfer_bulk) {
3388                         retval = em28xx_alloc_urbs(dev, EM28XX_DIGITAL_MODE,
3389                                             dev->dvb_xfer_bulk,
3390                                             EM28XX_DVB_NUM_BUFS,
3391                                             512,
3392                                             EM28XX_DVB_BULK_PACKET_MULTIPLIER);
3393                 } else {
3394                         retval = em28xx_alloc_urbs(dev, EM28XX_DIGITAL_MODE,
3395                                             dev->dvb_xfer_bulk,
3396                                             EM28XX_DVB_NUM_BUFS,
3397                                             dev->dvb_max_pkt_size_isoc,
3398                                             EM28XX_DVB_NUM_ISOC_PACKETS);
3399                 }
3400                 if (retval) {
3401                         printk(DRIVER_NAME
3402                                ": Failed to pre-allocate USB transfer buffers for DVB.\n");
3403                         goto unlock_and_free;
3404                 }
3405         }
3406
3407         request_modules(dev);
3408
3409         /* Should be the last thing to do, to avoid newer udev's to
3410            open the device before fully initializing it
3411          */
3412         mutex_unlock(&dev->lock);
3413
3414         return 0;
3415
3416 unlock_and_free:
3417         mutex_unlock(&dev->lock);
3418
3419 err_free:
3420         kfree(dev->alt_max_pkt_size_isoc);
3421         kfree(dev);
3422
3423 err:
3424         clear_bit(nr, &em28xx_devused);
3425
3426 err_no_slot:
3427         usb_put_dev(udev);
3428         return retval;
3429 }
3430
3431 /*
3432  * em28xx_usb_disconnect()
3433  * called when the device gets disconnected
3434  * video device will be unregistered on v4l2_close in case it is still open
3435  */
3436 static void em28xx_usb_disconnect(struct usb_interface *interface)
3437 {
3438         struct em28xx *dev;
3439
3440         dev = usb_get_intfdata(interface);
3441         usb_set_intfdata(interface, NULL);
3442
3443         if (!dev)
3444                 return;
3445
3446         if (dev->is_audio_only) {
3447                 mutex_lock(&dev->lock);
3448                 em28xx_close_extension(dev);
3449                 mutex_unlock(&dev->lock);
3450                 return;
3451         }
3452
3453         em28xx_info("disconnecting %s\n", dev->vdev->name);
3454
3455         flush_request_modules(dev);
3456
3457         /* wait until all current v4l2 io is finished then deallocate
3458            resources */
3459         mutex_lock(&dev->lock);
3460
3461         v4l2_device_disconnect(&dev->v4l2_dev);
3462
3463         if (dev->users) {
3464                 em28xx_warn
3465                     ("device %s is open! Deregistration and memory "
3466                      "deallocation are deferred on close.\n",
3467                      video_device_node_name(dev->vdev));
3468
3469                 dev->state |= DEV_MISCONFIGURED;
3470                 em28xx_uninit_usb_xfer(dev, dev->mode);
3471                 dev->state |= DEV_DISCONNECTED;
3472         } else {
3473                 dev->state |= DEV_DISCONNECTED;
3474                 em28xx_release_resources(dev);
3475         }
3476
3477         /* free DVB isoc buffers */
3478         em28xx_uninit_usb_xfer(dev, EM28XX_DIGITAL_MODE);
3479
3480         mutex_unlock(&dev->lock);
3481
3482         em28xx_close_extension(dev);
3483
3484         if (!dev->users) {
3485                 kfree(dev->alt_max_pkt_size_isoc);
3486                 kfree(dev);
3487         }
3488 }
3489
3490 static struct usb_driver em28xx_usb_driver = {
3491         .name = "em28xx",
3492         .probe = em28xx_usb_probe,
3493         .disconnect = em28xx_usb_disconnect,
3494         .id_table = em28xx_id_table,
3495 };
3496
3497 module_usb_driver(em28xx_usb_driver);