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