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