GNU Linux-libre 4.14.290-gnu1
[releases.git] / drivers / media / usb / em28xx / em28xx-cards.c
1 /*
2    em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB
3                     video capture devices
4
5    Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it>
6                       Markus Rechberger <mrechberger@gmail.com>
7                       Mauro Carvalho Chehab <mchehab@infradead.org>
8                       Sascha Sommer <saschasommer@freenet.de>
9    Copyright (C) 2012 Frank Schäfer <fschaefer.oss@googlemail.com>
10
11    This program is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 2 of the License, or
14    (at your option) any later version.
15
16    This program is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software
23    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  */
25
26 #include "em28xx.h"
27
28 #include <linux/init.h>
29 #include <linux/module.h>
30 #include <linux/slab.h>
31 #include <linux/delay.h>
32 #include <linux/i2c.h>
33 #include <linux/usb.h>
34 #include <media/tuner.h>
35 #include <media/drv-intf/msp3400.h>
36 #include <media/i2c/saa7115.h>
37 #include <dt-bindings/media/tvp5150.h>
38 #include <media/i2c/tvaudio.h>
39 #include <media/i2c-addr.h>
40 #include <media/tveeprom.h>
41 #include <media/v4l2-common.h>
42 #include <sound/ac97_codec.h>
43
44
45 #define DRIVER_NAME         "em28xx"
46
47 static int tuner = -1;
48 module_param(tuner, int, 0444);
49 MODULE_PARM_DESC(tuner, "tuner type");
50
51 static unsigned int disable_ir;
52 module_param(disable_ir, int, 0444);
53 MODULE_PARM_DESC(disable_ir, "disable infrared remote support");
54
55 static unsigned int disable_usb_speed_check;
56 module_param(disable_usb_speed_check, int, 0444);
57 MODULE_PARM_DESC(disable_usb_speed_check,
58                  "override min bandwidth requirement of 480M bps");
59
60 static unsigned int card[]     = {[0 ... (EM28XX_MAXBOARDS - 1)] = -1U };
61 module_param_array(card,  int, NULL, 0444);
62 MODULE_PARM_DESC(card,     "card type");
63
64 static int usb_xfer_mode = -1;
65 module_param(usb_xfer_mode, int, 0444);
66 MODULE_PARM_DESC(usb_xfer_mode,
67                  "USB transfer mode for frame data (-1 = auto, 0 = prefer isoc, 1 = prefer bulk)");
68
69 /* Bitmask marking allocated devices from 0 to EM28XX_MAXBOARDS - 1 */
70 static DECLARE_BITMAP(em28xx_devused, EM28XX_MAXBOARDS);
71
72 struct em28xx_hash_table {
73         unsigned long hash;
74         unsigned int  model;
75         unsigned int  tuner;
76 };
77
78 static void em28xx_pre_card_setup(struct em28xx *dev);
79
80 /*
81  *  Reset sequences for analog/digital modes
82  */
83
84 /* Reset for the most [analog] boards */
85 static struct em28xx_reg_seq default_analog[] = {
86         {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
87         {       -1,             -1,     -1,             -1},
88 };
89
90 /* Reset for the most [digital] boards */
91 static struct em28xx_reg_seq default_digital[] = {
92         {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
93         {       -1,             -1,     -1,             -1},
94 };
95
96 /* Board Hauppauge WinTV HVR 900 analog */
97 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
98         {EM2820_R08_GPIO_CTRL,  0x2d,   ~EM_GPIO_4,     10},
99         {       0x05,           0xff,   0x10,           10},
100         {       -1,             -1,     -1,             -1},
101 };
102
103 /* Board Hauppauge WinTV HVR 900 digital */
104 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
105         {EM2820_R08_GPIO_CTRL,  0x2e,   ~EM_GPIO_4,     10},
106         {EM2880_R04_GPO,        0x04,   0x0f,           10},
107         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
108         {       -1,             -1,     -1,             -1},
109 };
110
111 /* Board Hauppauge WinTV HVR 900 (R2) digital */
112 static struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
113         {EM2820_R08_GPIO_CTRL,  0x2e,   ~EM_GPIO_4,     10},
114         {EM2880_R04_GPO,        0x0c,   0x0f,           10},
115         {       -1,             -1,     -1,             -1},
116 };
117
118 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
119 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
120         {EM2820_R08_GPIO_CTRL,  0x69,   ~EM_GPIO_4,     10},
121         {       -1,             -1,     -1,             -1},
122 };
123
124 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
125
126 /* Board  - EM2870 Kworld 355u
127    Analog - No input analog */
128
129 /* Board - EM2882 Kworld 315U digital */
130 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
131         {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
132         {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,           10},
133         {EM2880_R04_GPO,        0x04,   0xff,           10},
134         {EM2880_R04_GPO,        0x0c,   0xff,           10},
135         {EM2820_R08_GPIO_CTRL,  0x7e,   0xff,           10},
136         {       -1,             -1,     -1,             -1},
137 };
138
139 static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
140         {EM2880_R04_GPO,        0x08,   0xff,           10},
141         {EM2880_R04_GPO,        0x0c,   0xff,           10},
142         {EM2880_R04_GPO,        0x08,   0xff,           10},
143         {EM2880_R04_GPO,        0x0c,   0xff,           10},
144         {       -1,             -1,     -1,             -1},
145 };
146
147 static struct em28xx_reg_seq kworld_330u_analog[] = {
148         {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
149         {EM2880_R04_GPO,        0x00,   0xff,           10},
150         {       -1,             -1,     -1,             -1},
151 };
152
153 static struct em28xx_reg_seq kworld_330u_digital[] = {
154         {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
155         {EM2880_R04_GPO,        0x08,   0xff,           10},
156         {       -1,             -1,     -1,             -1},
157 };
158
159 /* Evga inDtube
160    GPIO0 - Enable digital power (s5h1409) - low to enable
161    GPIO1 - Enable analog power (tvp5150/emp202) - low to enable
162    GPIO4 - xc3028 reset
163    GOP3  - s5h1409 reset
164  */
165 static struct em28xx_reg_seq evga_indtube_analog[] = {
166         {EM2820_R08_GPIO_CTRL,  0x79,   0xff,           60},
167         {       -1,             -1,     -1,             -1},
168 };
169
170 static struct em28xx_reg_seq evga_indtube_digital[] = {
171         {EM2820_R08_GPIO_CTRL,  0x7a,   0xff,            1},
172         {EM2880_R04_GPO,        0x04,   0xff,           10},
173         {EM2880_R04_GPO,        0x0c,   0xff,            1},
174         {       -1,             -1,     -1,             -1},
175 };
176
177 /*
178  * KWorld PlusTV 340U, UB435-Q and UB435-Q V2 (ATSC) GPIOs map:
179  * EM_GPIO_0 - currently unknown
180  * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
181  * EM_GPIO_2 - currently unknown
182  * EM_GPIO_3 - currently unknown
183  * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
184  * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
185  * EM_GPIO_6 - currently unknown
186  * EM_GPIO_7 - currently unknown
187  */
188 static struct em28xx_reg_seq kworld_a340_digital[] = {
189         {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
190         {       -1,             -1,     -1,             -1},
191 };
192
193 static struct em28xx_reg_seq kworld_ub435q_v3_digital[] = {
194         {EM2874_R80_GPIO_P0_CTRL,       0xff,   0xff,   100},
195         {EM2874_R80_GPIO_P0_CTRL,       0xfe,   0xff,   100},
196         {EM2874_R80_GPIO_P0_CTRL,       0xbe,   0xff,   100},
197         {EM2874_R80_GPIO_P0_CTRL,       0xfe,   0xff,   100},
198         {       -1,                     -1,     -1,     -1},
199 };
200
201 /* Pinnacle Hybrid Pro eb1a:2881 */
202 static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
203         {EM2820_R08_GPIO_CTRL,  0xfd,   ~EM_GPIO_4,     10},
204         {       -1,             -1,     -1,             -1},
205 };
206
207 static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
208         {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
209         {EM2880_R04_GPO,        0x04,   0xff,          100},/* zl10353 reset */
210         {EM2880_R04_GPO,        0x0c,   0xff,            1},
211         {       -1,             -1,     -1,             -1},
212 };
213
214 static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
215         {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
216         {EM2880_R04_GPO,        0x00,   0xff,           10},
217         {       -1,             -1,     -1,             -1},
218 };
219
220 static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
221         {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
222         {EM2880_R04_GPO,        0x08,   0xff,           10},
223         {       -1,             -1,     -1,             -1},
224 };
225
226 /* PCTV HD Mini (80e) GPIOs
227    0-5: not used
228    6:   demod reset, active low
229    7:   LED on, active high */
230 static struct em28xx_reg_seq em2874_pctv_80e_digital[] = {
231         {EM28XX_R06_I2C_CLK,    0x45,   0xff,             10}, /*400 KHz*/
232         {EM2874_R80_GPIO_P0_CTRL, 0x00,   0xff,           100},/*Demod reset*/
233         {EM2874_R80_GPIO_P0_CTRL, 0x40,   0xff,           10},
234         {  -1,                  -1,     -1,               -1},
235 };
236
237 /* eb1a:2868 Reddo DVB-C USB TV Box
238    GPIO4 - CU1216L NIM
239    Other GPIOs seems to be don't care. */
240 static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
241         {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,           10},
242         {EM2820_R08_GPIO_CTRL,  0xde,   0xff,           10},
243         {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,           10},
244         {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
245         {EM2820_R08_GPIO_CTRL,  0x7f,   0xff,           10},
246         {EM2820_R08_GPIO_CTRL,  0x6f,   0xff,           10},
247         {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
248         {       -1,             -1,     -1,             -1},
249 };
250
251 /* Callback for the most boards */
252 static struct em28xx_reg_seq default_tuner_gpio[] = {
253         {EM2820_R08_GPIO_CTRL,  EM_GPIO_4,      EM_GPIO_4,      10},
254         {EM2820_R08_GPIO_CTRL,  0,              EM_GPIO_4,      10},
255         {EM2820_R08_GPIO_CTRL,  EM_GPIO_4,      EM_GPIO_4,      10},
256         {       -1,             -1,             -1,             -1},
257 };
258
259 /* Mute/unmute */
260 static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
261         {EM2820_R08_GPIO_CTRL,  5,      7,      10},
262         {       -1,             -1,     -1,     -1},
263 };
264
265 static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
266         {EM2820_R08_GPIO_CTRL,  4,      7,      10},
267         {       -1,             -1,     -1,     -1},
268 };
269
270 static struct em28xx_reg_seq compro_mute_gpio[] = {
271         {EM2820_R08_GPIO_CTRL,  6,      7,      10},
272         {       -1,             -1,     -1,     -1},
273 };
274
275 /* Terratec AV350 */
276 static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
277         {EM2820_R08_GPIO_CTRL,  0xff,   0x7f,           10},
278         {       -1,             -1,     -1,             -1},
279 };
280
281 static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
282         {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
283         {       -1,             -1,     -1,             -1},
284 };
285
286 static struct em28xx_reg_seq silvercrest_reg_seq[] = {
287         {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
288         {EM2820_R08_GPIO_CTRL,  0x01,   0xf7,           10},
289         {       -1,             -1,     -1,             -1},
290 };
291
292 static struct em28xx_reg_seq vc211a_enable[] = {
293         {EM2820_R08_GPIO_CTRL,  0xff,   0x07,           10},
294         {EM2820_R08_GPIO_CTRL,  0xff,   0x0f,           10},
295         {EM2820_R08_GPIO_CTRL,  0xff,   0x0b,           10},
296         {       -1,             -1,     -1,             -1},
297 };
298
299 static struct em28xx_reg_seq dikom_dk300_digital[] = {
300         {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
301         {EM2880_R04_GPO,        0x08,   0xff,           10},
302         {       -1,             -1,     -1,             -1},
303 };
304
305 /* Reset for the most [digital] boards */
306 static struct em28xx_reg_seq leadership_digital[] = {
307         {EM2874_R80_GPIO_P0_CTRL,       0x70,   0xff,   10},
308         {       -1,                     -1,     -1,     -1},
309 };
310
311 static struct em28xx_reg_seq leadership_reset[] = {
312         {EM2874_R80_GPIO_P0_CTRL,       0xf0,   0xff,   10},
313         {EM2874_R80_GPIO_P0_CTRL,       0xb0,   0xff,   10},
314         {EM2874_R80_GPIO_P0_CTRL,       0xf0,   0xff,   10},
315         {       -1,                     -1,     -1,     -1},
316 };
317
318 /* 2013:024f PCTV nanoStick T2 290e
319  * GPIO_6 - demod reset
320  * GPIO_7 - LED
321  */
322 static struct em28xx_reg_seq pctv_290e[] = {
323         {EM2874_R80_GPIO_P0_CTRL,       0x00,   0xff,   80},
324         {EM2874_R80_GPIO_P0_CTRL,       0x40,   0xff,   80}, /* GPIO_6 = 1 */
325         {EM2874_R80_GPIO_P0_CTRL,       0xc0,   0xff,   80}, /* GPIO_7 = 1 */
326         {       -1,                     -1,     -1,     -1},
327 };
328
329 #if 0
330 static struct em28xx_reg_seq terratec_h5_gpio[] = {
331         {EM2820_R08_GPIO_CTRL,          0xff,   0xff,   10},
332         {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   100},
333         {EM2874_R80_GPIO_P0_CTRL,       0xf2,   0xff,   50},
334         {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   50},
335         {       -1,                     -1,     -1,     -1},
336 };
337
338 static struct em28xx_reg_seq terratec_h5_digital[] = {
339         {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   10},
340         {EM2874_R80_GPIO_P0_CTRL,       0xe6,   0xff,   100},
341         {EM2874_R80_GPIO_P0_CTRL,       0xa6,   0xff,   10},
342         {       -1,                     -1,     -1,     -1},
343 };
344 #endif
345
346 /* 2013:024f PCTV DVB-S2 Stick 460e
347  * GPIO_0 - POWER_ON
348  * GPIO_1 - BOOST
349  * GPIO_2 - VUV_LNB (red LED)
350  * GPIO_3 - EXT_12V
351  * GPIO_4 - INT_DEM (DEMOD GPIO_0)
352  * GPIO_5 - INT_LNB
353  * GPIO_6 - RESET_DEM
354  * GPIO_7 - LED (green LED)
355  */
356 static struct em28xx_reg_seq pctv_460e[] = {
357         {EM2874_R80_GPIO_P0_CTRL,       0x01,   0xff,   50},
358         {       0x0d,                   0xff,   0xff,   50},
359         {EM2874_R80_GPIO_P0_CTRL,       0x41,   0xff,   50}, /* GPIO_6=1 */
360         {       0x0d,                   0x42,   0xff,   50},
361         {EM2874_R80_GPIO_P0_CTRL,       0x61,   0xff,   50}, /* GPIO_5=1 */
362         {       -1,                     -1,     -1,     -1},
363 };
364
365 static struct em28xx_reg_seq c3tech_digital_duo_digital[] = {
366         {EM2874_R80_GPIO_P0_CTRL,       0xff,   0xff,   10},
367         {EM2874_R80_GPIO_P0_CTRL,       0xfd,   0xff,   10}, /* xc5000 reset */
368         {EM2874_R80_GPIO_P0_CTRL,       0xf9,   0xff,   35},
369         {EM2874_R80_GPIO_P0_CTRL,       0xfd,   0xff,   10},
370         {EM2874_R80_GPIO_P0_CTRL,       0xff,   0xff,   10},
371         {EM2874_R80_GPIO_P0_CTRL,       0xfe,   0xff,   10},
372         {EM2874_R80_GPIO_P0_CTRL,       0xbe,   0xff,   10},
373         {EM2874_R80_GPIO_P0_CTRL,       0xfe,   0xff,   20},
374         {       -1,                     -1,     -1,     -1},
375 };
376
377 /*
378  * 2013:0258 PCTV DVB-S2 Stick (461e)
379  * GPIO 0 = POWER_ON
380  * GPIO 1 = BOOST
381  * GPIO 2 = VUV_LNB (red LED)
382  * GPIO 3 = #EXT_12V
383  * GPIO 4 = INT_DEM
384  * GPIO 5 = INT_LNB
385  * GPIO 6 = #RESET_DEM
386  * GPIO 7 = P07_LED (green LED)
387  */
388 static struct em28xx_reg_seq pctv_461e[] = {
389         {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,    0},
390         {0x0d,                 0xff, 0xff,    0},
391         {EM2874_R80_GPIO_P0_CTRL,      0x3f, 0xff,  100}, /* reset demod */
392         {EM2874_R80_GPIO_P0_CTRL,      0x7f, 0xff,  200}, /* reset demod */
393         {0x0d,                 0x42, 0xff,    0},
394         {EM2874_R80_GPIO_P0_CTRL,      0xeb, 0xff,    0},
395         {EM2874_R5F_TS_ENABLE, 0x84, 0x84,    0}, /* parallel? | null discard */
396         {                  -1,   -1,   -1,   -1},
397 };
398
399 #if 0
400 static struct em28xx_reg_seq hauppauge_930c_gpio[] = {
401         {EM2874_R80_GPIO_P0_CTRL,       0x6f,   0xff,   10},
402         {EM2874_R80_GPIO_P0_CTRL,       0x4f,   0xff,   10}, /* xc5000 reset */
403         {EM2874_R80_GPIO_P0_CTRL,       0x6f,   0xff,   10},
404         {EM2874_R80_GPIO_P0_CTRL,       0x4f,   0xff,   10},
405         {       -1,                     -1,     -1,     -1},
406 };
407
408 static struct em28xx_reg_seq hauppauge_930c_digital[] = {
409         {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   10},
410         {EM2874_R80_GPIO_P0_CTRL,       0xe6,   0xff,   100},
411         {EM2874_R80_GPIO_P0_CTRL,       0xa6,   0xff,   10},
412         {       -1,                     -1,     -1,     -1},
413 };
414 #endif
415
416 /* 1b80:e425 MaxMedia UB425-TC
417  * 1b80:e1cc Delock 61959
418  * GPIO_6 - demod reset, 0=active
419  * GPIO_7 - LED, 0=active
420  */
421 static struct em28xx_reg_seq maxmedia_ub425_tc[] = {
422         {EM2874_R80_GPIO_P0_CTRL,       0x83,   0xff,   100},
423         {EM2874_R80_GPIO_P0_CTRL,       0xc3,   0xff,   100}, /* GPIO_6 = 1 */
424         {EM2874_R80_GPIO_P0_CTRL,       0x43,   0xff,   000}, /* GPIO_7 = 0 */
425         {       -1,                     -1,     -1,     -1},
426 };
427
428 /* 2304:0242 PCTV QuatroStick (510e)
429  * GPIO_2: decoder reset, 0=active
430  * GPIO_4: decoder suspend, 0=active
431  * GPIO_6: demod reset, 0=active
432  * GPIO_7: LED, 1=active
433  */
434 static struct em28xx_reg_seq pctv_510e[] = {
435         {EM2874_R80_GPIO_P0_CTRL,       0x10,   0xff,   100},
436         {EM2874_R80_GPIO_P0_CTRL,       0x14,   0xff,   100}, /* GPIO_2 = 1 */
437         {EM2874_R80_GPIO_P0_CTRL,       0x54,   0xff,   050}, /* GPIO_6 = 1 */
438         {       -1,                     -1,     -1,     -1},
439 };
440
441 /* 2013:0251 PCTV QuatroStick nano (520e)
442  * GPIO_2: decoder reset, 0=active
443  * GPIO_4: decoder suspend, 0=active
444  * GPIO_6: demod reset, 0=active
445  * GPIO_7: LED, 1=active
446  */
447 static struct em28xx_reg_seq pctv_520e[] = {
448         {EM2874_R80_GPIO_P0_CTRL,       0x10,   0xff,   100},
449         {EM2874_R80_GPIO_P0_CTRL,       0x14,   0xff,   100}, /* GPIO_2 = 1 */
450         {EM2874_R80_GPIO_P0_CTRL,       0x54,   0xff,   050}, /* GPIO_6 = 1 */
451         {EM2874_R80_GPIO_P0_CTRL,       0xd4,   0xff,   000}, /* GPIO_7 = 1 */
452         {       -1,                     -1,     -1,     -1},
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 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 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 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 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 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 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 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 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         /* maybe there's a reason behind it why Terratec sells the Hybrid XS
1443            as Prodigy XS with a different PID, let's keep it separated for now
1444            maybe we'll need it lateron */
1445         [EM2880_BOARD_TERRATEC_PRODIGY_XS] = {
1446                 .name         = "Terratec Prodigy XS",
1447                 .tuner_type   = TUNER_XC2028,
1448                 .tuner_gpio   = default_tuner_gpio,
1449                 .decoder      = EM28XX_TVP5150,
1450                 .input        = { {
1451                         .type     = EM28XX_VMUX_TELEVISION,
1452                         .vmux     = TVP5150_COMPOSITE0,
1453                         .amux     = EM28XX_AMUX_VIDEO,
1454                         .gpio     = hauppauge_wintv_hvr_900_analog,
1455                 }, {
1456                         .type     = EM28XX_VMUX_COMPOSITE,
1457                         .vmux     = TVP5150_COMPOSITE1,
1458                         .amux     = EM28XX_AMUX_LINE_IN,
1459                         .gpio     = hauppauge_wintv_hvr_900_analog,
1460                 }, {
1461                         .type     = EM28XX_VMUX_SVIDEO,
1462                         .vmux     = TVP5150_SVIDEO,
1463                         .amux     = EM28XX_AMUX_LINE_IN,
1464                         .gpio     = hauppauge_wintv_hvr_900_analog,
1465                 } },
1466         },
1467         [EM2820_BOARD_MSI_VOX_USB_2] = {
1468                 .name              = "MSI VOX USB 2.0",
1469                 .tuner_type        = TUNER_LG_PAL_NEW_TAPC,
1470                 .tda9887_conf      = TDA9887_PRESENT      |
1471                                      TDA9887_PORT1_ACTIVE |
1472                                      TDA9887_PORT2_ACTIVE,
1473                 .max_range_640_480 = 1,
1474                 .decoder           = EM28XX_SAA711X,
1475                 .input             = { {
1476                         .type      = EM28XX_VMUX_TELEVISION,
1477                         .vmux      = SAA7115_COMPOSITE4,
1478                         .amux      = EM28XX_AMUX_VIDEO,
1479                 }, {
1480                         .type      = EM28XX_VMUX_COMPOSITE,
1481                         .vmux      = SAA7115_COMPOSITE0,
1482                         .amux      = EM28XX_AMUX_LINE_IN,
1483                 }, {
1484                         .type      = EM28XX_VMUX_SVIDEO,
1485                         .vmux      = SAA7115_SVIDEO3,
1486                         .amux      = EM28XX_AMUX_LINE_IN,
1487                 } },
1488         },
1489         [EM2800_BOARD_TERRATEC_CINERGY_200] = {
1490                 .name         = "Terratec Cinergy 200 USB",
1491                 .is_em2800    = 1,
1492                 .has_ir_i2c   = 1,
1493                 .tuner_type   = TUNER_LG_TALN,
1494                 .tda9887_conf = TDA9887_PRESENT,
1495                 .decoder      = EM28XX_SAA711X,
1496                 .input        = { {
1497                         .type     = EM28XX_VMUX_TELEVISION,
1498                         .vmux     = SAA7115_COMPOSITE2,
1499                         .amux     = EM28XX_AMUX_VIDEO,
1500                 }, {
1501                         .type     = EM28XX_VMUX_COMPOSITE,
1502                         .vmux     = SAA7115_COMPOSITE0,
1503                         .amux     = EM28XX_AMUX_LINE_IN,
1504                 }, {
1505                         .type     = EM28XX_VMUX_SVIDEO,
1506                         .vmux     = SAA7115_SVIDEO3,
1507                         .amux     = EM28XX_AMUX_LINE_IN,
1508                 } },
1509         },
1510         [EM2800_BOARD_GRABBEEX_USB2800] = {
1511                 .name       = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder",
1512                 .is_em2800  = 1,
1513                 .decoder    = EM28XX_SAA711X,
1514                 .tuner_type = TUNER_ABSENT, /* capture only board */
1515                 .input      = { {
1516                         .type     = EM28XX_VMUX_COMPOSITE,
1517                         .vmux     = SAA7115_COMPOSITE0,
1518                         .amux     = EM28XX_AMUX_LINE_IN,
1519                 }, {
1520                         .type     = EM28XX_VMUX_SVIDEO,
1521                         .vmux     = SAA7115_SVIDEO3,
1522                         .amux     = EM28XX_AMUX_LINE_IN,
1523                 } },
1524         },
1525         [EM2800_BOARD_VC211A] = {
1526                 .name         = "Actionmaster/LinXcel/Digitus VC211A",
1527                 .is_em2800    = 1,
1528                 .tuner_type   = TUNER_ABSENT,   /* Capture-only board */
1529                 .decoder      = EM28XX_SAA711X,
1530                 .input        = { {
1531                         .type     = EM28XX_VMUX_COMPOSITE,
1532                         .vmux     = SAA7115_COMPOSITE0,
1533                         .amux     = EM28XX_AMUX_LINE_IN,
1534                         .gpio     = vc211a_enable,
1535                 }, {
1536                         .type     = EM28XX_VMUX_SVIDEO,
1537                         .vmux     = SAA7115_SVIDEO3,
1538                         .amux     = EM28XX_AMUX_LINE_IN,
1539                         .gpio     = vc211a_enable,
1540                 } },
1541         },
1542         [EM2800_BOARD_LEADTEK_WINFAST_USBII] = {
1543                 .name         = "Leadtek Winfast USB II",
1544                 .is_em2800    = 1,
1545                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1546                 .tda9887_conf = TDA9887_PRESENT,
1547                 .decoder      = EM28XX_SAA711X,
1548                 .input        = { {
1549                         .type     = EM28XX_VMUX_TELEVISION,
1550                         .vmux     = SAA7115_COMPOSITE2,
1551                         .amux     = EM28XX_AMUX_VIDEO,
1552                 }, {
1553                         .type     = EM28XX_VMUX_COMPOSITE,
1554                         .vmux     = SAA7115_COMPOSITE0,
1555                         .amux     = EM28XX_AMUX_LINE_IN,
1556                 }, {
1557                         .type     = EM28XX_VMUX_SVIDEO,
1558                         .vmux     = SAA7115_SVIDEO3,
1559                         .amux     = EM28XX_AMUX_LINE_IN,
1560                 } },
1561         },
1562         [EM2800_BOARD_KWORLD_USB2800] = {
1563                 .name         = "Kworld USB2800",
1564                 .is_em2800    = 1,
1565                 .tuner_type   = TUNER_PHILIPS_FCV1236D,
1566                 .tda9887_conf = TDA9887_PRESENT,
1567                 .decoder      = EM28XX_SAA711X,
1568                 .input        = { {
1569                         .type     = EM28XX_VMUX_TELEVISION,
1570                         .vmux     = SAA7115_COMPOSITE2,
1571                         .amux     = EM28XX_AMUX_VIDEO,
1572                 }, {
1573                         .type     = EM28XX_VMUX_COMPOSITE,
1574                         .vmux     = SAA7115_COMPOSITE0,
1575                         .amux     = EM28XX_AMUX_LINE_IN,
1576                 }, {
1577                         .type     = EM28XX_VMUX_SVIDEO,
1578                         .vmux     = SAA7115_SVIDEO3,
1579                         .amux     = EM28XX_AMUX_LINE_IN,
1580                 } },
1581         },
1582         [EM2820_BOARD_PINNACLE_DVC_90] = {
1583                 .name         = "Pinnacle Dazzle DVC 90/100/101/107 / Kaiser Baas Video to DVD maker / Kworld DVD Maker 2 / Plextor ConvertX PX-AV100U",
1584                 .tuner_type   = TUNER_ABSENT, /* capture only board */
1585                 .decoder      = EM28XX_SAA711X,
1586                 .input        = { {
1587                         .type     = EM28XX_VMUX_COMPOSITE,
1588                         .vmux     = SAA7115_COMPOSITE0,
1589                         .amux     = EM28XX_AMUX_LINE_IN,
1590                 }, {
1591                         .type     = EM28XX_VMUX_SVIDEO,
1592                         .vmux     = SAA7115_SVIDEO3,
1593                         .amux     = EM28XX_AMUX_LINE_IN,
1594                 } },
1595         },
1596         [EM2800_BOARD_VGEAR_POCKETTV] = {
1597                 .name         = "V-Gear PocketTV",
1598                 .is_em2800    = 1,
1599                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
1600                 .tda9887_conf = TDA9887_PRESENT,
1601                 .decoder      = EM28XX_SAA711X,
1602                 .input        = { {
1603                         .type     = EM28XX_VMUX_TELEVISION,
1604                         .vmux     = SAA7115_COMPOSITE2,
1605                         .amux     = EM28XX_AMUX_VIDEO,
1606                 }, {
1607                         .type     = EM28XX_VMUX_COMPOSITE,
1608                         .vmux     = SAA7115_COMPOSITE0,
1609                         .amux     = EM28XX_AMUX_LINE_IN,
1610                 }, {
1611                         .type     = EM28XX_VMUX_SVIDEO,
1612                         .vmux     = SAA7115_SVIDEO3,
1613                         .amux     = EM28XX_AMUX_LINE_IN,
1614                 } },
1615         },
1616         [EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2] = {
1617                 .name         = "Pixelview PlayTV Box 4 USB 2.0",
1618                 .tda9887_conf = TDA9887_PRESENT,
1619                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
1620                 .decoder      = EM28XX_SAA711X,
1621                 .input        = { {
1622                         .type     = EM28XX_VMUX_TELEVISION,
1623                         .vmux     = SAA7115_COMPOSITE2,
1624                         .amux     = EM28XX_AMUX_VIDEO,
1625                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
1626                                     EM28XX_AOUT_MASTER, /* Line out pin */
1627                 }, {
1628                         .type     = EM28XX_VMUX_COMPOSITE,
1629                         .vmux     = SAA7115_COMPOSITE0,
1630                         .amux     = EM28XX_AMUX_LINE_IN,
1631                 }, {
1632                         .type     = EM28XX_VMUX_SVIDEO,
1633                         .vmux     = SAA7115_SVIDEO3,
1634                         .amux     = EM28XX_AMUX_LINE_IN,
1635                 } },
1636         },
1637         [EM2820_BOARD_PROLINK_PLAYTV_USB2] = {
1638                 .name         = "SIIG AVTuner-PVR / Pixelview Prolink PlayTV USB 2.0",
1639                 .buttons = std_snapshot_button,
1640                 .tda9887_conf = TDA9887_PRESENT,
1641                 .tuner_type   = TUNER_YMEC_TVF_5533MF,
1642                 .tuner_addr   = 0x60,
1643                 .decoder      = EM28XX_SAA711X,
1644                 .input        = { {
1645                         .type     = EM28XX_VMUX_TELEVISION,
1646                         .vmux     = SAA7115_COMPOSITE2,
1647                         .amux     = EM28XX_AMUX_VIDEO,
1648                         .aout     = EM28XX_AOUT_MONO |  /* I2S */
1649                                     EM28XX_AOUT_MASTER, /* Line out pin */
1650                 }, {
1651                         .type     = EM28XX_VMUX_COMPOSITE,
1652                         .vmux     = SAA7115_COMPOSITE0,
1653                         .amux     = EM28XX_AMUX_LINE_IN,
1654                 }, {
1655                         .type     = EM28XX_VMUX_SVIDEO,
1656                         .vmux     = SAA7115_SVIDEO3,
1657                         .amux     = EM28XX_AMUX_LINE_IN,
1658                 } },
1659         },
1660         [EM2860_BOARD_SAA711X_REFERENCE_DESIGN] = {
1661                 .name                = "EM2860/SAA711X Reference Design",
1662                 .buttons = std_snapshot_button,
1663                 .tuner_type          = TUNER_ABSENT,
1664                 .decoder             = EM28XX_SAA711X,
1665                 .input               = { {
1666                         .type     = EM28XX_VMUX_SVIDEO,
1667                         .vmux     = SAA7115_SVIDEO3,
1668                 }, {
1669                         .type     = EM28XX_VMUX_COMPOSITE,
1670                         .vmux     = SAA7115_COMPOSITE0,
1671                 } },
1672         },
1673
1674         [EM2874_BOARD_LEADERSHIP_ISDBT] = {
1675                 .def_i2c_bus    = 1,
1676                 .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
1677                                   EM28XX_I2C_FREQ_100_KHZ,
1678                 .xclk           = EM28XX_XCLK_FREQUENCY_10MHZ,
1679                 .name           = "EM2874 Leadership ISDBT",
1680                 .tuner_type     = TUNER_ABSENT,
1681                 .tuner_gpio     = leadership_reset,
1682                 .dvb_gpio       = leadership_digital,
1683                 .has_dvb        = 1,
1684         },
1685
1686         [EM2880_BOARD_MSI_DIGIVOX_AD] = {
1687                 .name         = "MSI DigiVox A/D",
1688                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1689                 .tuner_type   = TUNER_XC2028,
1690                 .tuner_gpio   = default_tuner_gpio,
1691                 .decoder      = EM28XX_TVP5150,
1692                 .input        = { {
1693                         .type     = EM28XX_VMUX_TELEVISION,
1694                         .vmux     = TVP5150_COMPOSITE0,
1695                         .amux     = EM28XX_AMUX_VIDEO,
1696                         .gpio     = em2880_msi_digivox_ad_analog,
1697                 }, {
1698                         .type     = EM28XX_VMUX_COMPOSITE,
1699                         .vmux     = TVP5150_COMPOSITE1,
1700                         .amux     = EM28XX_AMUX_LINE_IN,
1701                         .gpio     = em2880_msi_digivox_ad_analog,
1702                 }, {
1703                         .type     = EM28XX_VMUX_SVIDEO,
1704                         .vmux     = TVP5150_SVIDEO,
1705                         .amux     = EM28XX_AMUX_LINE_IN,
1706                         .gpio     = em2880_msi_digivox_ad_analog,
1707                 } },
1708         },
1709         [EM2880_BOARD_MSI_DIGIVOX_AD_II] = {
1710                 .name         = "MSI DigiVox A/D II",
1711                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1712                 .tuner_type   = TUNER_XC2028,
1713                 .tuner_gpio   = default_tuner_gpio,
1714                 .decoder      = EM28XX_TVP5150,
1715                 .input        = { {
1716                         .type     = EM28XX_VMUX_TELEVISION,
1717                         .vmux     = TVP5150_COMPOSITE0,
1718                         .amux     = EM28XX_AMUX_VIDEO,
1719                         .gpio     = em2880_msi_digivox_ad_analog,
1720                 }, {
1721                         .type     = EM28XX_VMUX_COMPOSITE,
1722                         .vmux     = TVP5150_COMPOSITE1,
1723                         .amux     = EM28XX_AMUX_LINE_IN,
1724                         .gpio     = em2880_msi_digivox_ad_analog,
1725                 }, {
1726                         .type     = EM28XX_VMUX_SVIDEO,
1727                         .vmux     = TVP5150_SVIDEO,
1728                         .amux     = EM28XX_AMUX_LINE_IN,
1729                         .gpio     = em2880_msi_digivox_ad_analog,
1730                 } },
1731         },
1732         [EM2880_BOARD_KWORLD_DVB_305U] = {
1733                 .name         = "KWorld DVB-T 305U",
1734                 .tuner_type   = TUNER_XC2028,
1735                 .tuner_gpio   = default_tuner_gpio,
1736                 .decoder      = EM28XX_TVP5150,
1737                 .input        = { {
1738                         .type     = EM28XX_VMUX_TELEVISION,
1739                         .vmux     = TVP5150_COMPOSITE0,
1740                         .amux     = EM28XX_AMUX_VIDEO,
1741                 }, {
1742                         .type     = EM28XX_VMUX_COMPOSITE,
1743                         .vmux     = TVP5150_COMPOSITE1,
1744                         .amux     = EM28XX_AMUX_LINE_IN,
1745                 }, {
1746                         .type     = EM28XX_VMUX_SVIDEO,
1747                         .vmux     = TVP5150_SVIDEO,
1748                         .amux     = EM28XX_AMUX_LINE_IN,
1749                 } },
1750         },
1751         [EM2880_BOARD_KWORLD_DVB_310U] = {
1752                 .name         = "KWorld DVB-T 310U",
1753                 .tuner_type   = TUNER_XC2028,
1754                 .tuner_gpio   = default_tuner_gpio,
1755                 .has_dvb      = 1,
1756                 .dvb_gpio     = default_digital,
1757                 .mts_firmware = 1,
1758                 .decoder      = EM28XX_TVP5150,
1759                 .input        = { {
1760                         .type     = EM28XX_VMUX_TELEVISION,
1761                         .vmux     = TVP5150_COMPOSITE0,
1762                         .amux     = EM28XX_AMUX_VIDEO,
1763                         .gpio     = default_analog,
1764                 }, {
1765                         .type     = EM28XX_VMUX_COMPOSITE,
1766                         .vmux     = TVP5150_COMPOSITE1,
1767                         .amux     = EM28XX_AMUX_LINE_IN,
1768                         .gpio     = default_analog,
1769                 }, {    /* S-video has not been tested yet */
1770                         .type     = EM28XX_VMUX_SVIDEO,
1771                         .vmux     = TVP5150_SVIDEO,
1772                         .amux     = EM28XX_AMUX_LINE_IN,
1773                         .gpio     = default_analog,
1774                 } },
1775         },
1776         [EM2882_BOARD_KWORLD_ATSC_315U] = {
1777                 .name           = "KWorld ATSC 315U HDTV TV Box",
1778                 .valid          = EM28XX_BOARD_NOT_VALIDATED,
1779                 .tuner_type     = TUNER_THOMSON_DTT761X,
1780                 .tuner_gpio     = em2882_kworld_315u_tuner_gpio,
1781                 .tda9887_conf   = TDA9887_PRESENT,
1782                 .decoder        = EM28XX_SAA711X,
1783                 .has_dvb        = 1,
1784                 .dvb_gpio       = em2882_kworld_315u_digital,
1785                 .ir_codes       = RC_MAP_KWORLD_315U,
1786                 .xclk           = EM28XX_XCLK_FREQUENCY_12MHZ,
1787                 .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE,
1788                 /* Analog mode - still not ready */
1789                 /*.input        = { {
1790                         .type = EM28XX_VMUX_TELEVISION,
1791                         .vmux = SAA7115_COMPOSITE2,
1792                         .amux = EM28XX_AMUX_VIDEO,
1793                         .gpio = em2882_kworld_315u_analog,
1794                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1795                 }, {
1796                         .type = EM28XX_VMUX_COMPOSITE,
1797                         .vmux = SAA7115_COMPOSITE0,
1798                         .amux = EM28XX_AMUX_LINE_IN,
1799                         .gpio = em2882_kworld_315u_analog1,
1800                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1801                 }, {
1802                         .type = EM28XX_VMUX_SVIDEO,
1803                         .vmux = SAA7115_SVIDEO3,
1804                         .amux = EM28XX_AMUX_LINE_IN,
1805                         .gpio = em2882_kworld_315u_analog1,
1806                         .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1807                 } }, */
1808         },
1809         [EM2880_BOARD_EMPIRE_DUAL_TV] = {
1810                 .name = "Empire dual TV",
1811                 .tuner_type = TUNER_XC2028,
1812                 .tuner_gpio = default_tuner_gpio,
1813                 .has_dvb = 1,
1814                 .dvb_gpio = default_digital,
1815                 .mts_firmware = 1,
1816                 .decoder = EM28XX_TVP5150,
1817                 .input = { {
1818                         .type = EM28XX_VMUX_TELEVISION,
1819                         .vmux = TVP5150_COMPOSITE0,
1820                         .amux = EM28XX_AMUX_VIDEO,
1821                         .gpio = default_analog,
1822                 }, {
1823                         .type = EM28XX_VMUX_COMPOSITE,
1824                         .vmux = TVP5150_COMPOSITE1,
1825                         .amux = EM28XX_AMUX_LINE_IN,
1826                         .gpio = default_analog,
1827                 }, {
1828                         .type = EM28XX_VMUX_SVIDEO,
1829                         .vmux = TVP5150_SVIDEO,
1830                         .amux = EM28XX_AMUX_LINE_IN,
1831                         .gpio = default_analog,
1832                 } },
1833         },
1834         [EM2881_BOARD_DNT_DA2_HYBRID] = {
1835                 .name         = "DNT DA2 Hybrid",
1836                 .valid        = EM28XX_BOARD_NOT_VALIDATED,
1837                 .tuner_type   = TUNER_XC2028,
1838                 .tuner_gpio   = default_tuner_gpio,
1839                 .decoder      = EM28XX_TVP5150,
1840                 .input        = { {
1841                         .type     = EM28XX_VMUX_TELEVISION,
1842                         .vmux     = TVP5150_COMPOSITE0,
1843                         .amux     = EM28XX_AMUX_VIDEO,
1844                         .gpio     = default_analog,
1845                 }, {
1846                         .type     = EM28XX_VMUX_COMPOSITE,
1847                         .vmux     = TVP5150_COMPOSITE1,
1848                         .amux     = EM28XX_AMUX_LINE_IN,
1849                         .gpio     = default_analog,
1850                 }, {
1851                         .type     = EM28XX_VMUX_SVIDEO,
1852                         .vmux     = TVP5150_SVIDEO,
1853                         .amux     = EM28XX_AMUX_LINE_IN,
1854                         .gpio     = default_analog,
1855                 } },
1856         },
1857         [EM2881_BOARD_PINNACLE_HYBRID_PRO] = {
1858                 .name         = "Pinnacle Hybrid Pro",
1859                 .tuner_type   = TUNER_XC2028,
1860                 .tuner_gpio   = default_tuner_gpio,
1861                 .decoder      = EM28XX_TVP5150,
1862                 .has_dvb      = 1,
1863                 .dvb_gpio     = pinnacle_hybrid_pro_digital,
1864                 .input        = { {
1865                         .type     = EM28XX_VMUX_TELEVISION,
1866                         .vmux     = TVP5150_COMPOSITE0,
1867                         .amux     = EM28XX_AMUX_VIDEO,
1868                         .gpio     = pinnacle_hybrid_pro_analog,
1869                 }, {
1870                         .type     = EM28XX_VMUX_COMPOSITE,
1871                         .vmux     = TVP5150_COMPOSITE1,
1872                         .amux     = EM28XX_AMUX_LINE_IN,
1873                         .gpio     = pinnacle_hybrid_pro_analog,
1874                 }, {
1875                         .type     = EM28XX_VMUX_SVIDEO,
1876                         .vmux     = TVP5150_SVIDEO,
1877                         .amux     = EM28XX_AMUX_LINE_IN,
1878                         .gpio     = pinnacle_hybrid_pro_analog,
1879                 } },
1880         },
1881         [EM2882_BOARD_PINNACLE_HYBRID_PRO_330E] = {
1882                 .name         = "Pinnacle Hybrid Pro (330e)",
1883                 .tuner_type   = TUNER_XC2028,
1884                 .tuner_gpio   = default_tuner_gpio,
1885                 .mts_firmware = 1,
1886                 .has_dvb      = 1,
1887                 .dvb_gpio     = hauppauge_wintv_hvr_900R2_digital,
1888                 .ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
1889                 .decoder      = EM28XX_TVP5150,
1890                 .input        = { {
1891                         .type     = EM28XX_VMUX_TELEVISION,
1892                         .vmux     = TVP5150_COMPOSITE0,
1893                         .amux     = EM28XX_AMUX_VIDEO,
1894                         .gpio     = hauppauge_wintv_hvr_900_analog,
1895                 }, {
1896                         .type     = EM28XX_VMUX_COMPOSITE,
1897                         .vmux     = TVP5150_COMPOSITE1,
1898                         .amux     = EM28XX_AMUX_LINE_IN,
1899                         .gpio     = hauppauge_wintv_hvr_900_analog,
1900                 }, {
1901                         .type     = EM28XX_VMUX_SVIDEO,
1902                         .vmux     = TVP5150_SVIDEO,
1903                         .amux     = EM28XX_AMUX_LINE_IN,
1904                         .gpio     = hauppauge_wintv_hvr_900_analog,
1905                 } },
1906         },
1907         [EM2882_BOARD_KWORLD_VS_DVBT] = {
1908                 .name         = "Kworld VS-DVB-T 323UR",
1909                 .tuner_type   = TUNER_XC2028,
1910                 .tuner_gpio   = default_tuner_gpio,
1911                 .decoder      = EM28XX_TVP5150,
1912                 .mts_firmware = 1,
1913                 .has_dvb      = 1,
1914                 .dvb_gpio     = kworld_330u_digital,
1915                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
1916                 .ir_codes     = RC_MAP_KWORLD_315U,
1917                 .input        = { {
1918                         .type     = EM28XX_VMUX_TELEVISION,
1919                         .vmux     = TVP5150_COMPOSITE0,
1920                         .amux     = EM28XX_AMUX_VIDEO,
1921                 }, {
1922                         .type     = EM28XX_VMUX_COMPOSITE,
1923                         .vmux     = TVP5150_COMPOSITE1,
1924                         .amux     = EM28XX_AMUX_LINE_IN,
1925                 }, {
1926                         .type     = EM28XX_VMUX_SVIDEO,
1927                         .vmux     = TVP5150_SVIDEO,
1928                         .amux     = EM28XX_AMUX_LINE_IN,
1929                 } },
1930         },
1931         [EM2882_BOARD_TERRATEC_HYBRID_XS] = {
1932                 .name         = "Terratec Cinnergy Hybrid T USB XS (em2882)",
1933                 .tuner_type   = TUNER_XC2028,
1934                 .tuner_gpio   = default_tuner_gpio,
1935                 .mts_firmware = 1,
1936                 .decoder      = EM28XX_TVP5150,
1937                 .has_dvb      = 1,
1938                 .dvb_gpio     = hauppauge_wintv_hvr_900_digital,
1939                 .ir_codes     = RC_MAP_TERRATEC_CINERGY_XS,
1940                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ,
1941                 .input        = { {
1942                         .type     = EM28XX_VMUX_TELEVISION,
1943                         .vmux     = TVP5150_COMPOSITE0,
1944                         .amux     = EM28XX_AMUX_VIDEO,
1945                         .gpio     = hauppauge_wintv_hvr_900_analog,
1946                 }, {
1947                         .type     = EM28XX_VMUX_COMPOSITE,
1948                         .vmux     = TVP5150_COMPOSITE1,
1949                         .amux     = EM28XX_AMUX_LINE_IN,
1950                         .gpio     = hauppauge_wintv_hvr_900_analog,
1951                 }, {
1952                         .type     = EM28XX_VMUX_SVIDEO,
1953                         .vmux     = TVP5150_SVIDEO,
1954                         .amux     = EM28XX_AMUX_LINE_IN,
1955                         .gpio     = hauppauge_wintv_hvr_900_analog,
1956                 } },
1957         },
1958         [EM2882_BOARD_DIKOM_DK300] = {
1959                 .name         = "Dikom DK300",
1960                 .tuner_type   = TUNER_XC2028,
1961                 .tuner_gpio   = default_tuner_gpio,
1962                 .decoder      = EM28XX_TVP5150,
1963                 .mts_firmware = 1,
1964                 .has_dvb      = 1,
1965                 .dvb_gpio     = dikom_dk300_digital,
1966                 .input        = { {
1967                         .type     = EM28XX_VMUX_TELEVISION,
1968                         .vmux     = TVP5150_COMPOSITE0,
1969                         .amux     = EM28XX_AMUX_VIDEO,
1970                         .gpio     = default_analog,
1971                 } },
1972         },
1973         [EM2883_BOARD_KWORLD_HYBRID_330U] = {
1974                 .name         = "Kworld PlusTV HD Hybrid 330",
1975                 .tuner_type   = TUNER_XC2028,
1976                 .tuner_gpio   = default_tuner_gpio,
1977                 .decoder      = EM28XX_TVP5150,
1978                 .mts_firmware = 1,
1979                 .has_dvb      = 1,
1980                 .dvb_gpio     = kworld_330u_digital,
1981                 .xclk             = EM28XX_XCLK_FREQUENCY_12MHZ,
1982                 .i2c_speed        = EM28XX_I2C_CLK_WAIT_ENABLE |
1983                                     EM28XX_I2C_EEPROM_ON_BOARD |
1984                                     EM28XX_I2C_EEPROM_KEY_VALID,
1985                 .input        = { {
1986                         .type     = EM28XX_VMUX_TELEVISION,
1987                         .vmux     = TVP5150_COMPOSITE0,
1988                         .amux     = EM28XX_AMUX_VIDEO,
1989                         .gpio     = kworld_330u_analog,
1990                         .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1991                 }, {
1992                         .type     = EM28XX_VMUX_COMPOSITE,
1993                         .vmux     = TVP5150_COMPOSITE1,
1994                         .amux     = EM28XX_AMUX_LINE_IN,
1995                         .gpio     = kworld_330u_analog,
1996                         .aout     = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1997                 }, {
1998                         .type     = EM28XX_VMUX_SVIDEO,
1999                         .vmux     = TVP5150_SVIDEO,
2000                         .amux     = EM28XX_AMUX_LINE_IN,
2001                         .gpio     = kworld_330u_analog,
2002                 } },
2003         },
2004         [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
2005                 .name         = "Compro VideoMate ForYou/Stereo",
2006                 .tuner_type   = TUNER_LG_PAL_NEW_TAPC,
2007                 .tvaudio_addr = 0xb0,
2008                 .tda9887_conf = TDA9887_PRESENT,
2009                 .decoder      = EM28XX_TVP5150,
2010                 .adecoder     = EM28XX_TVAUDIO,
2011                 .mute_gpio    = compro_mute_gpio,
2012                 .input        = { {
2013                         .type     = EM28XX_VMUX_TELEVISION,
2014                         .vmux     = TVP5150_COMPOSITE0,
2015                         .amux     = EM28XX_AMUX_VIDEO,
2016                         .gpio     = compro_unmute_tv_gpio,
2017                 }, {
2018                         .type     = EM28XX_VMUX_SVIDEO,
2019                         .vmux     = TVP5150_SVIDEO,
2020                         .amux     = EM28XX_AMUX_LINE_IN,
2021                         .gpio     = compro_unmute_svid_gpio,
2022                 } },
2023         },
2024         [EM2860_BOARD_KAIOMY_TVNPC_U2] = {
2025                 .name         = "Kaiomy TVnPC U2",
2026                 .vchannels    = 3,
2027                 .tuner_type   = TUNER_XC2028,
2028                 .tuner_addr   = 0x61,
2029                 .mts_firmware = 1,
2030                 .decoder      = EM28XX_TVP5150,
2031                 .tuner_gpio   = default_tuner_gpio,
2032                 .ir_codes     = RC_MAP_KAIOMY,
2033                 .input          = { {
2034                         .type     = EM28XX_VMUX_TELEVISION,
2035                         .vmux     = TVP5150_COMPOSITE0,
2036                         .amux     = EM28XX_AMUX_VIDEO,
2037
2038                 }, {
2039                         .type     = EM28XX_VMUX_COMPOSITE,
2040                         .vmux     = TVP5150_COMPOSITE1,
2041                         .amux     = EM28XX_AMUX_LINE_IN,
2042                 }, {
2043                         .type     = EM28XX_VMUX_SVIDEO,
2044                         .vmux     = TVP5150_SVIDEO,
2045                         .amux     = EM28XX_AMUX_LINE_IN,
2046                 } },
2047                 .radio          = {
2048                         .type     = EM28XX_RADIO,
2049                         .amux     = EM28XX_AMUX_LINE_IN,
2050                 }
2051         },
2052         [EM2860_BOARD_EASYCAP] = {
2053                 .name         = "Easy Cap Capture DC-60",
2054                 .vchannels    = 2,
2055                 .tuner_type   = TUNER_ABSENT,
2056                 .decoder      = EM28XX_SAA711X,
2057                 .input           = { {
2058                         .type     = EM28XX_VMUX_COMPOSITE,
2059                         .vmux     = SAA7115_COMPOSITE0,
2060                         .amux     = EM28XX_AMUX_LINE_IN,
2061                 }, {
2062                         .type     = EM28XX_VMUX_SVIDEO,
2063                         .vmux     = SAA7115_SVIDEO3,
2064                         .amux     = EM28XX_AMUX_LINE_IN,
2065                 } },
2066         },
2067         [EM2820_BOARD_IODATA_GVMVP_SZ] = {
2068                 .name       = "IO-DATA GV-MVP/SZ",
2069                 .tuner_type   = TUNER_PHILIPS_FM1236_MK3,
2070                 .tuner_gpio   = default_tuner_gpio,
2071                 .tda9887_conf = TDA9887_PRESENT,
2072                 .decoder      = EM28XX_TVP5150,
2073                 .input        = { {
2074                         .type     = EM28XX_VMUX_TELEVISION,
2075                         .vmux     = TVP5150_COMPOSITE0,
2076                         .amux     = EM28XX_AMUX_VIDEO,
2077                 }, { /* Composite has not been tested yet */
2078                         .type     = EM28XX_VMUX_COMPOSITE,
2079                         .vmux     = TVP5150_COMPOSITE1,
2080                         .amux     = EM28XX_AMUX_VIDEO,
2081                 }, { /* S-video has not been tested yet */
2082                         .type     = EM28XX_VMUX_SVIDEO,
2083                         .vmux     = TVP5150_SVIDEO,
2084                         .amux     = EM28XX_AMUX_VIDEO,
2085                 } },
2086         },
2087         [EM2860_BOARD_TERRATEC_GRABBY] = {
2088                 .name            = "Terratec Grabby",
2089                 .vchannels       = 2,
2090                 .tuner_type      = TUNER_ABSENT,
2091                 .decoder         = EM28XX_SAA711X,
2092                 .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
2093                 .input           = { {
2094                         .type     = EM28XX_VMUX_COMPOSITE,
2095                         .vmux     = SAA7115_COMPOSITE0,
2096                         .amux     = EM28XX_AMUX_LINE_IN,
2097                 }, {
2098                         .type     = EM28XX_VMUX_SVIDEO,
2099                         .vmux     = SAA7115_SVIDEO3,
2100                         .amux     = EM28XX_AMUX_LINE_IN,
2101                 } },
2102                 .buttons         = std_snapshot_button,
2103                 .leds            = terratec_grabby_leds,
2104         },
2105         [EM2860_BOARD_TERRATEC_AV350] = {
2106                 .name            = "Terratec AV350",
2107                 .vchannels       = 2,
2108                 .tuner_type      = TUNER_ABSENT,
2109                 .decoder         = EM28XX_TVP5150,
2110                 .xclk            = EM28XX_XCLK_FREQUENCY_12MHZ,
2111                 .mute_gpio       = terratec_av350_mute_gpio,
2112                 .input           = { {
2113                         .type     = EM28XX_VMUX_COMPOSITE,
2114                         .vmux     = TVP5150_COMPOSITE1,
2115                         .amux     = EM28XX_AMUX_LINE_IN,
2116                         .gpio     = terratec_av350_unmute_gpio,
2117
2118                 }, {
2119                         .type     = EM28XX_VMUX_SVIDEO,
2120                         .vmux     = TVP5150_SVIDEO,
2121                         .amux     = EM28XX_AMUX_LINE_IN,
2122                         .gpio     = terratec_av350_unmute_gpio,
2123                 } },
2124         },
2125
2126         [EM2860_BOARD_ELGATO_VIDEO_CAPTURE] = {
2127                 .name         = "Elgato Video Capture",
2128                 .decoder      = EM28XX_SAA711X,
2129                 .tuner_type   = TUNER_ABSENT,   /* Capture only device */
2130                 .input        = { {
2131                         .type  = EM28XX_VMUX_COMPOSITE,
2132                         .vmux  = SAA7115_COMPOSITE0,
2133                         .amux  = EM28XX_AMUX_LINE_IN,
2134                 }, {
2135                         .type  = EM28XX_VMUX_SVIDEO,
2136                         .vmux  = SAA7115_SVIDEO3,
2137                         .amux  = EM28XX_AMUX_LINE_IN,
2138                 } },
2139         },
2140
2141         [EM2882_BOARD_EVGA_INDTUBE] = {
2142                 .name         = "Evga inDtube",
2143                 .tuner_type   = TUNER_XC2028,
2144                 .tuner_gpio   = default_tuner_gpio,
2145                 .decoder      = EM28XX_TVP5150,
2146                 .xclk         = EM28XX_XCLK_FREQUENCY_12MHZ, /* NEC IR */
2147                 .mts_firmware = 1,
2148                 .has_dvb      = 1,
2149                 .dvb_gpio     = evga_indtube_digital,
2150                 .ir_codes     = RC_MAP_EVGA_INDTUBE,
2151                 .input        = { {
2152                         .type     = EM28XX_VMUX_TELEVISION,
2153                         .vmux     = TVP5150_COMPOSITE0,
2154                         .amux     = EM28XX_AMUX_VIDEO,
2155                         .gpio     = evga_indtube_analog,
2156                 }, {
2157                         .type     = EM28XX_VMUX_COMPOSITE,
2158                         .vmux     = TVP5150_COMPOSITE1,
2159                         .amux     = EM28XX_AMUX_LINE_IN,
2160                         .gpio     = evga_indtube_analog,
2161                 }, {
2162                         .type     = EM28XX_VMUX_SVIDEO,
2163                         .vmux     = TVP5150_SVIDEO,
2164                         .amux     = EM28XX_AMUX_LINE_IN,
2165                         .gpio     = evga_indtube_analog,
2166                 } },
2167         },
2168         /* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 +
2169            Infineon TUA6034) */
2170         [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = {
2171                 .name          = "Reddo DVB-C USB TV Box",
2172                 .tuner_type    = TUNER_ABSENT,
2173                 .tuner_gpio    = reddo_dvb_c_usb_box,
2174                 .has_dvb       = 1,
2175         },
2176         /* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
2177          * initially as the KWorld PlusTV 340U, then as the UB435-Q.
2178          * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
2179         [EM2870_BOARD_KWORLD_A340] = {
2180                 .name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",
2181                 .tuner_type = TUNER_ABSENT,     /* Digital-only TDA18271HD */
2182                 .has_dvb    = 1,
2183                 .dvb_gpio   = kworld_a340_digital,
2184                 .tuner_gpio = default_tuner_gpio,
2185         },
2186         /* 2013:024f PCTV nanoStick T2 290e.
2187          * Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */
2188         [EM28174_BOARD_PCTV_290E] = {
2189                 .name          = "PCTV nanoStick T2 290e",
2190                 .def_i2c_bus   = 1,
2191                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
2192                 .tuner_type    = TUNER_ABSENT,
2193                 .tuner_gpio    = pctv_290e,
2194                 .has_dvb       = 1,
2195                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2196         },
2197         /* 2013:024f PCTV DVB-S2 Stick 460e
2198          * Empia EM28174, NXP TDA10071, Conexant CX24118A and Allegro A8293 */
2199         [EM28174_BOARD_PCTV_460E] = {
2200                 .def_i2c_bus   = 1,
2201                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
2202                 .name          = "PCTV DVB-S2 Stick (460e)",
2203                 .tuner_type    = TUNER_ABSENT,
2204                 .tuner_gpio    = pctv_460e,
2205                 .has_dvb       = 1,
2206                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2207         },
2208         /* eb1a:5006 Honestech VIDBOX NW03
2209          * Empia EM2860, Philips SAA7113, Empia EMP202, No Tuner */
2210         [EM2860_BOARD_HT_VIDBOX_NW03] = {
2211                 .name                = "Honestech Vidbox NW03",
2212                 .tuner_type          = TUNER_ABSENT,
2213                 .decoder             = EM28XX_SAA711X,
2214                 .input               = { {
2215                         .type     = EM28XX_VMUX_COMPOSITE,
2216                         .vmux     = SAA7115_COMPOSITE0,
2217                         .amux     = EM28XX_AMUX_LINE_IN,
2218                 }, {
2219                         .type     = EM28XX_VMUX_SVIDEO,
2220                         .vmux     = SAA7115_SVIDEO3,  /* S-VIDEO needs confirming */
2221                         .amux     = EM28XX_AMUX_LINE_IN,
2222                 } },
2223         },
2224         /* 1b80:e425 MaxMedia UB425-TC
2225          * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2 */
2226         [EM2874_BOARD_MAXMEDIA_UB425_TC] = {
2227                 .name          = "MaxMedia UB425-TC",
2228                 .tuner_type    = TUNER_ABSENT,
2229                 .tuner_gpio    = maxmedia_ub425_tc,
2230                 .has_dvb       = 1,
2231                 .ir_codes      = RC_MAP_REDDO,
2232                 .def_i2c_bus   = 1,
2233                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2234                                 EM28XX_I2C_FREQ_400_KHZ,
2235         },
2236         /* 2304:0242 PCTV QuatroStick (510e)
2237          * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
2238         [EM2884_BOARD_PCTV_510E] = {
2239                 .name          = "PCTV QuatroStick (510e)",
2240                 .tuner_type    = TUNER_ABSENT,
2241                 .tuner_gpio    = pctv_510e,
2242                 .has_dvb       = 1,
2243                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2244                 .def_i2c_bus   = 1,
2245                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2246                                 EM28XX_I2C_FREQ_400_KHZ,
2247         },
2248         /* 2013:0251 PCTV QuatroStick nano (520e)
2249          * Empia EM2884 + Micronas DRX 3926K + NXP TDA18271HDC2 */
2250         [EM2884_BOARD_PCTV_520E] = {
2251                 .name          = "PCTV QuatroStick nano (520e)",
2252                 .tuner_type    = TUNER_ABSENT,
2253                 .tuner_gpio    = pctv_520e,
2254                 .has_dvb       = 1,
2255                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2256                 .def_i2c_bus   = 1,
2257                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2258                                 EM28XX_I2C_FREQ_400_KHZ,
2259         },
2260         [EM2884_BOARD_TERRATEC_HTC_USB_XS] = {
2261                 .name         = "Terratec Cinergy HTC USB XS",
2262                 .has_dvb      = 1,
2263                 .ir_codes     = RC_MAP_NEC_TERRATEC_CINERGY_XS,
2264                 .tuner_type   = TUNER_ABSENT,
2265                 .def_i2c_bus  = 1,
2266                 .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2267                                 EM28XX_I2C_FREQ_400_KHZ,
2268         },
2269         /* 1b80:e1cc Delock 61959
2270          * Empia EM2874B + Micronas DRX 3913KA2 + NXP TDA18271HDC2
2271          * mostly the same as MaxMedia UB-425-TC but different remote */
2272         [EM2874_BOARD_DELOCK_61959] = {
2273                 .name          = "Delock 61959",
2274                 .tuner_type    = TUNER_ABSENT,
2275                 .tuner_gpio    = maxmedia_ub425_tc,
2276                 .has_dvb       = 1,
2277                 .ir_codes      = RC_MAP_DELOCK_61959,
2278                 .def_i2c_bus   = 1,
2279                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2280                                 EM28XX_I2C_FREQ_400_KHZ,
2281         },
2282         /*
2283          * 1b80:e346 KWorld USB ATSC TV Stick UB435-Q V2
2284          * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2285          */
2286         [EM2874_BOARD_KWORLD_UB435Q_V2] = {
2287                 .name           = "KWorld USB ATSC TV Stick UB435-Q V2",
2288                 .tuner_type     = TUNER_ABSENT,
2289                 .has_dvb        = 1,
2290                 .dvb_gpio       = kworld_a340_digital,
2291                 .tuner_gpio     = default_tuner_gpio,
2292                 .def_i2c_bus    = 1,
2293         },
2294         /*
2295          * 1b80:e34c KWorld USB ATSC TV Stick UB435-Q V3
2296          * Empia EM2874B + LG DT3305 + NXP TDA18271HDC2
2297          */
2298         [EM2874_BOARD_KWORLD_UB435Q_V3] = {
2299                 .name           = "KWorld USB ATSC TV Stick UB435-Q V3",
2300                 .tuner_type     = TUNER_ABSENT,
2301                 .has_dvb        = 1,
2302                 .tuner_gpio     = kworld_ub435q_v3_digital,
2303                 .def_i2c_bus    = 1,
2304                 .i2c_speed      = EM28XX_I2C_CLK_WAIT_ENABLE |
2305                                   EM28XX_I2C_FREQ_100_KHZ,
2306                 .leds = kworld_ub435q_v3_leds,
2307         },
2308         [EM2874_BOARD_PCTV_HD_MINI_80E] = {
2309                 .name         = "Pinnacle PCTV HD Mini",
2310                 .tuner_type   = TUNER_ABSENT,
2311                 .has_dvb      = 1,
2312                 .dvb_gpio     = em2874_pctv_80e_digital,
2313                 .decoder      = EM28XX_NODECODER,
2314                 .ir_codes     = RC_MAP_PINNACLE_PCTV_HD,
2315                 .leds         = pctv_80e_leds,
2316         },
2317         /* 1ae7:9003/9004 SpeedLink Vicious And Devine Laplace webcam
2318          * Empia EM2765 + OmniVision OV2640 */
2319         [EM2765_BOARD_SPEEDLINK_VAD_LAPLACE] = {
2320                 .name         = "SpeedLink Vicious And Devine Laplace webcam",
2321                 .xclk         = EM28XX_XCLK_FREQUENCY_24MHZ,
2322                 .i2c_speed    = EM28XX_I2C_CLK_WAIT_ENABLE |
2323                                 EM28XX_I2C_FREQ_100_KHZ,
2324                 .def_i2c_bus  = 1,
2325                 .tuner_type   = TUNER_ABSENT,
2326                 .is_webcam    = 1,
2327                 .input        = { {
2328                         .type     = EM28XX_VMUX_COMPOSITE,
2329                         .amux     = EM28XX_AMUX_VIDEO,
2330                         .gpio     = speedlink_vad_laplace_reg_seq,
2331                 } },
2332                 .buttons = speedlink_vad_laplace_buttons,
2333                 .leds = speedlink_vad_laplace_leds,
2334         },
2335         /* 2013:0258 PCTV DVB-S2 Stick (461e)
2336          * Empia EM28178, Montage M88DS3103, Montage M88TS2022, Allegro A8293 */
2337         [EM28178_BOARD_PCTV_461E] = {
2338                 .def_i2c_bus   = 1,
2339                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
2340                 .name          = "PCTV DVB-S2 Stick (461e)",
2341                 .tuner_type    = TUNER_ABSENT,
2342                 .tuner_gpio    = pctv_461e,
2343                 .has_dvb       = 1,
2344                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2345         },
2346         /* 2013:025f PCTV tripleStick (292e).
2347          * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2157 */
2348         [EM28178_BOARD_PCTV_292E] = {
2349                 .name          = "PCTV tripleStick (292e)",
2350                 .def_i2c_bus   = 1,
2351                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
2352                 .tuner_type    = TUNER_ABSENT,
2353                 .tuner_gpio    = pctv_292e,
2354                 .has_dvb       = 1,
2355                 .ir_codes      = RC_MAP_PINNACLE_PCTV_HD,
2356         },
2357         [EM2861_BOARD_LEADTEK_VC100] = {
2358                 .name          = "Leadtek VC100",
2359                 .tuner_type    = TUNER_ABSENT,  /* Capture only device */
2360                 .decoder       = EM28XX_TVP5150,
2361                 .input         = { {
2362                         .type     = EM28XX_VMUX_COMPOSITE,
2363                         .vmux     = TVP5150_COMPOSITE1,
2364                         .amux     = EM28XX_AMUX_LINE_IN,
2365                 }, {
2366                         .type     = EM28XX_VMUX_SVIDEO,
2367                         .vmux     = TVP5150_SVIDEO,
2368                         .amux     = EM28XX_AMUX_LINE_IN,
2369                 } },
2370         },
2371         /* eb1a:8179 Terratec Cinergy T2 Stick HD.
2372          * Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146 */
2373         [EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
2374                 .name          = "Terratec Cinergy T2 Stick HD",
2375                 .def_i2c_bus   = 1,
2376                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ,
2377                 .tuner_type    = TUNER_ABSENT,
2378                 .tuner_gpio    = terratec_t2_stick_hd,
2379                 .has_dvb       = 1,
2380                 .ir_codes      = RC_MAP_TERRATEC_SLIM_2,
2381         },
2382
2383         /*
2384          * 3275:0085 PLEX PX-BCUD.
2385          * Empia EM28178, TOSHIBA TC90532XBG, Sharp QM1D1C0042
2386          */
2387         [EM28178_BOARD_PLEX_PX_BCUD] = {
2388                 .name          = "PLEX PX-BCUD",
2389                 .xclk          = EM28XX_XCLK_FREQUENCY_4_3MHZ,
2390                 .def_i2c_bus   = 1,
2391                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE,
2392                 .tuner_type    = TUNER_ABSENT,
2393                 .tuner_gpio    = plex_px_bcud,
2394                 .has_dvb       = 1,
2395         },
2396         /*
2397          * 2040:0265 Hauppauge WinTV-dualHD (DVB version) Isoc.
2398          * 2040:8265 Hauppauge WinTV-dualHD (DVB version) Bulk.
2399          * Empia EM28274, 2x Silicon Labs Si2168, 2x Silicon Labs Si2157
2400          */
2401         [EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB] = {
2402                 .name          = "Hauppauge WinTV-dualHD DVB",
2403                 .def_i2c_bus   = 1,
2404                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2405                                  EM28XX_I2C_FREQ_400_KHZ,
2406                 .tuner_type    = TUNER_ABSENT,
2407                 .tuner_gpio    = hauppauge_dualhd_dvb,
2408                 .has_dvb       = 1,
2409                 .ir_codes      = RC_MAP_HAUPPAUGE,
2410                 .leds          = hauppauge_dualhd_leds,
2411         },
2412         /*
2413          * 2040:026d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Isoc.
2414          * 2040:826d Hauppauge WinTV-dualHD (model 01595 - ATSC/QAM) Bulk.
2415          * Empia EM28274, 2x LG LGDT3306A, 2x Silicon Labs Si2157
2416          */
2417         [EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595] = {
2418                 .name          = "Hauppauge WinTV-dualHD 01595 ATSC/QAM",
2419                 .def_i2c_bus   = 1,
2420                 .i2c_speed     = EM28XX_I2C_CLK_WAIT_ENABLE |
2421                                  EM28XX_I2C_FREQ_400_KHZ,
2422                 .tuner_type    = TUNER_ABSENT,
2423                 .tuner_gpio    = hauppauge_dualhd_dvb,
2424                 .has_dvb       = 1,
2425                 .ir_codes      = RC_MAP_HAUPPAUGE,
2426                 .leds          = hauppauge_dualhd_leds,
2427         },
2428 };
2429 EXPORT_SYMBOL_GPL(em28xx_boards);
2430
2431 static const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
2432
2433 /* table of devices that work with this driver */
2434 struct usb_device_id em28xx_id_table[] = {
2435         { USB_DEVICE(0xeb1a, 0x2750),
2436                         .driver_info = EM2750_BOARD_UNKNOWN },
2437         { USB_DEVICE(0xeb1a, 0x2751),
2438                         .driver_info = EM2750_BOARD_UNKNOWN },
2439         { USB_DEVICE(0xeb1a, 0x2800),
2440                         .driver_info = EM2800_BOARD_UNKNOWN },
2441         { USB_DEVICE(0xeb1a, 0x2710),
2442                         .driver_info = EM2820_BOARD_UNKNOWN },
2443         { USB_DEVICE(0xeb1a, 0x2820),
2444                         .driver_info = EM2820_BOARD_UNKNOWN },
2445         { USB_DEVICE(0xeb1a, 0x2821),
2446                         .driver_info = EM2820_BOARD_UNKNOWN },
2447         { USB_DEVICE(0xeb1a, 0x2860),
2448                         .driver_info = EM2820_BOARD_UNKNOWN },
2449         { USB_DEVICE(0xeb1a, 0x2861),
2450                         .driver_info = EM2820_BOARD_UNKNOWN },
2451         { USB_DEVICE(0xeb1a, 0x2862),
2452                         .driver_info = EM2820_BOARD_UNKNOWN },
2453         { USB_DEVICE(0xeb1a, 0x2863),
2454                         .driver_info = EM2820_BOARD_UNKNOWN },
2455         { USB_DEVICE(0xeb1a, 0x2870),
2456                         .driver_info = EM2820_BOARD_UNKNOWN },
2457         { USB_DEVICE(0xeb1a, 0x2881),
2458                         .driver_info = EM2820_BOARD_UNKNOWN },
2459         { USB_DEVICE(0xeb1a, 0x2883),
2460                         .driver_info = EM2820_BOARD_UNKNOWN },
2461         { USB_DEVICE(0xeb1a, 0x2868),
2462                         .driver_info = EM2820_BOARD_UNKNOWN },
2463         { USB_DEVICE(0xeb1a, 0x2875),
2464                         .driver_info = EM2820_BOARD_UNKNOWN },
2465         { USB_DEVICE(0xeb1a, 0x2885), /* MSI Digivox Trio */
2466                         .driver_info = EM2884_BOARD_TERRATEC_H5 },
2467         { USB_DEVICE(0xeb1a, 0xe300),
2468                         .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U },
2469         { USB_DEVICE(0xeb1a, 0xe303),
2470                         .driver_info = EM2860_BOARD_KAIOMY_TVNPC_U2 },
2471         { USB_DEVICE(0xeb1a, 0xe305),
2472                         .driver_info = EM2880_BOARD_KWORLD_DVB_305U },
2473         { USB_DEVICE(0xeb1a, 0xe310),
2474                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
2475         { USB_DEVICE(0xeb1a, 0xa313),
2476                 .driver_info = EM2882_BOARD_KWORLD_ATSC_315U },
2477         { USB_DEVICE(0xeb1a, 0xa316),
2478                         .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
2479         { USB_DEVICE(0xeb1a, 0xe320),
2480                         .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
2481         { USB_DEVICE(0xeb1a, 0xe323),
2482                         .driver_info = EM2882_BOARD_KWORLD_VS_DVBT },
2483         { USB_DEVICE(0xeb1a, 0xe350),
2484                         .driver_info = EM2870_BOARD_KWORLD_350U },
2485         { USB_DEVICE(0xeb1a, 0xe355),
2486                         .driver_info = EM2870_BOARD_KWORLD_355U },
2487         { USB_DEVICE(0xeb1a, 0x2801),
2488                         .driver_info = EM2800_BOARD_GRABBEEX_USB2800 },
2489         { USB_DEVICE(0xeb1a, 0xe357),
2490                         .driver_info = EM2870_BOARD_KWORLD_355U },
2491         { USB_DEVICE(0xeb1a, 0xe359),
2492                         .driver_info = EM2870_BOARD_KWORLD_355U },
2493         { USB_DEVICE(0x1b80, 0xe302),
2494                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kaiser Baas Video to DVD maker */
2495         { USB_DEVICE(0x1b80, 0xe304),
2496                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, /* Kworld DVD Maker 2 */
2497         { USB_DEVICE(0x0ccd, 0x0036),
2498                         .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 },
2499         { USB_DEVICE(0x0ccd, 0x004c),
2500                         .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR },
2501         { USB_DEVICE(0x0ccd, 0x004f),
2502                         .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS },
2503         { USB_DEVICE(0x0ccd, 0x005e),
2504                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2505         { USB_DEVICE(0x0ccd, 0x0042),
2506                         .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS },
2507         { USB_DEVICE(0x0ccd, 0x0043),
2508                         .driver_info = EM2870_BOARD_TERRATEC_XS_MT2060 },
2509         { USB_DEVICE(0x0ccd, 0x008e),   /* Cinergy HTC USB XS Rev. 1 */
2510                         .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2511         { USB_DEVICE(0x0ccd, 0x00ac),   /* Cinergy HTC USB XS Rev. 2 */
2512                         .driver_info = EM2884_BOARD_TERRATEC_HTC_USB_XS },
2513         { USB_DEVICE(0x0ccd, 0x10a2),   /* H5 Rev. 1 */
2514                         .driver_info = EM2884_BOARD_TERRATEC_H5 },
2515         { USB_DEVICE(0x0ccd, 0x10ad),   /* H5 Rev. 2 */
2516                         .driver_info = EM2884_BOARD_TERRATEC_H5 },
2517         { USB_DEVICE(0x0ccd, 0x10b6),   /* H5 Rev. 3 */
2518                         .driver_info = EM2884_BOARD_TERRATEC_H5 },
2519         { USB_DEVICE(0x0ccd, 0x10b2),   /* H6 */
2520                         .driver_info = EM2884_BOARD_TERRATEC_H6 },
2521         { USB_DEVICE(0x0ccd, 0x0084),
2522                         .driver_info = EM2860_BOARD_TERRATEC_AV350 },
2523         { USB_DEVICE(0x0ccd, 0x0096),
2524                         .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2525         { USB_DEVICE(0x0ccd, 0x10AF),
2526                         .driver_info = EM2860_BOARD_TERRATEC_GRABBY },
2527         { USB_DEVICE(0x0ccd, 0x00b2),
2528                         .driver_info = EM2884_BOARD_CINERGY_HTC_STICK },
2529         { USB_DEVICE(0x0fd9, 0x0018),
2530                         .driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 },
2531         { USB_DEVICE(0x0fd9, 0x0033),
2532                         .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE },
2533         { USB_DEVICE(0x185b, 0x2870),
2534                         .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE },
2535         { USB_DEVICE(0x185b, 0x2041),
2536                         .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU },
2537         { USB_DEVICE(0x2040, 0x4200),
2538                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2539         { USB_DEVICE(0x2040, 0x4201),
2540                         .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 },
2541         { USB_DEVICE(0x2040, 0x6500),
2542                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 },
2543         { USB_DEVICE(0x2040, 0x6502),
2544                         .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 },
2545         { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */
2546                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2547         { USB_DEVICE(0x2040, 0x6517), /* HP  HVR-950 */
2548                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2549         { USB_DEVICE(0x2040, 0x651b), /* RP  HVR-950 */
2550                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 },
2551         { USB_DEVICE(0x2040, 0x651f),
2552                         .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 },
2553         { USB_DEVICE(0x2040, 0x0265),
2554                         .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2555         { USB_DEVICE(0x2040, 0x8265),
2556                         .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB },
2557         { USB_DEVICE(0x2040, 0x026d),
2558                         .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
2559         { USB_DEVICE(0x2040, 0x826d),
2560                         .driver_info = EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595 },
2561         { USB_DEVICE(0x0438, 0xb002),
2562                         .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 },
2563         { USB_DEVICE(0x2001, 0xf112),
2564                         .driver_info = EM2820_BOARD_DLINK_USB_TV },
2565         { USB_DEVICE(0x2304, 0x0207),
2566                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2567         { USB_DEVICE(0x2304, 0x0208),
2568                         .driver_info = EM2820_BOARD_PINNACLE_USB_2 },
2569         { USB_DEVICE(0x2304, 0x021a),
2570                         .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2571         { USB_DEVICE(0x2304, 0x0226),
2572                         .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO_330E },
2573         { USB_DEVICE(0x2304, 0x0227),
2574                         .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO },
2575         { USB_DEVICE(0x2304, 0x023f),
2576                         .driver_info = EM2874_BOARD_PCTV_HD_MINI_80E },
2577         { USB_DEVICE(0x0413, 0x6023),
2578                         .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII },
2579         { USB_DEVICE(0x093b, 0xa003),
2580                        .driver_info = EM2820_BOARD_PINNACLE_DVC_90 },
2581         { USB_DEVICE(0x093b, 0xa005),
2582                         .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U },
2583         { USB_DEVICE(0x04bb, 0x0515),
2584                         .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
2585         { USB_DEVICE(0xeb1a, 0x50a6),
2586                         .driver_info = EM2860_BOARD_GADMEI_UTV330 },
2587         { USB_DEVICE(0x1b80, 0xa340),
2588                         .driver_info = EM2870_BOARD_KWORLD_A340 },
2589         { USB_DEVICE(0x1b80, 0xe346),
2590                         .driver_info = EM2874_BOARD_KWORLD_UB435Q_V2 },
2591         { USB_DEVICE(0x1b80, 0xe34c),
2592                         .driver_info = EM2874_BOARD_KWORLD_UB435Q_V3 },
2593         { USB_DEVICE(0x2013, 0x024f),
2594                         .driver_info = EM28174_BOARD_PCTV_290E },
2595         { USB_DEVICE(0x2013, 0x024c),
2596                         .driver_info = EM28174_BOARD_PCTV_460E },
2597         { USB_DEVICE(0x2040, 0x1605),
2598                         .driver_info = EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C },
2599         { USB_DEVICE(0x1b80, 0xe755),
2600                         .driver_info = EM2884_BOARD_C3TECH_DIGITAL_DUO },
2601         { USB_DEVICE(0xeb1a, 0x5006),
2602                         .driver_info = EM2860_BOARD_HT_VIDBOX_NW03 },
2603         { USB_DEVICE(0x1b80, 0xe309), /* Sveon STV40 */
2604                         .driver_info = EM2860_BOARD_EASYCAP },
2605         { USB_DEVICE(0x1b80, 0xe425),
2606                         .driver_info = EM2874_BOARD_MAXMEDIA_UB425_TC },
2607         { USB_DEVICE(0x2304, 0x0242),
2608                         .driver_info = EM2884_BOARD_PCTV_510E },
2609         { USB_DEVICE(0x2013, 0x0251),
2610                         .driver_info = EM2884_BOARD_PCTV_520E },
2611         { USB_DEVICE(0x1b80, 0xe1cc),
2612                         .driver_info = EM2874_BOARD_DELOCK_61959 },
2613         { USB_DEVICE(0x1ae7, 0x9003),
2614                         .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2615         { USB_DEVICE(0x1ae7, 0x9004),
2616                         .driver_info = EM2765_BOARD_SPEEDLINK_VAD_LAPLACE },
2617         { USB_DEVICE(0x2013, 0x0258),
2618                         .driver_info = EM28178_BOARD_PCTV_461E },
2619         { USB_DEVICE(0x2013, 0x025f),
2620                         .driver_info = EM28178_BOARD_PCTV_292E },
2621         { USB_DEVICE(0x2040, 0x0264), /* Hauppauge WinTV-soloHD Isoc */
2622                         .driver_info = EM28178_BOARD_PCTV_292E },
2623         { USB_DEVICE(0x2040, 0x8264), /* Hauppauge OEM Generic WinTV-soloHD Bulk */
2624                         .driver_info = EM28178_BOARD_PCTV_292E },
2625         { USB_DEVICE(0x2040, 0x8268), /* Hauppauge Retail WinTV-soloHD Bulk */
2626                         .driver_info = EM28178_BOARD_PCTV_292E },
2627         { USB_DEVICE(0x0413, 0x6f07),
2628                         .driver_info = EM2861_BOARD_LEADTEK_VC100 },
2629         { USB_DEVICE(0xeb1a, 0x8179),
2630                         .driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
2631         { USB_DEVICE(0x3275, 0x0085),
2632                         .driver_info = EM28178_BOARD_PLEX_PX_BCUD },
2633         { USB_DEVICE(0xeb1a, 0x5051), /* Ion Video 2 PC MKII / Startech svid2usb23 / Raygo R12-41373 */
2634                         .driver_info = EM2860_BOARD_TVP5150_REFERENCE_DESIGN },
2635         { },
2636 };
2637 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
2638
2639 /*
2640  * EEPROM hash table for devices with generic USB IDs
2641  */
2642 static struct em28xx_hash_table em28xx_eeprom_hash[] = {
2643         /* P/N: SA 60002070465 Tuner: TVF7533-MF */
2644         {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF},
2645         {0x72cc5a8b, EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2, TUNER_YMEC_TVF_5533MF},
2646         {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028},
2647         {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028},
2648         {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028},
2649         {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028},
2650         {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT},
2651         {0x4e913442, EM2882_BOARD_DIKOM_DK300, TUNER_XC2028},
2652 };
2653
2654 /* I2C devicelist hash table for devices with generic USB IDs */
2655 static struct em28xx_hash_table em28xx_i2c_hash[] = {
2656         {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC},
2657         {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC},
2658         {0x1ba50080, EM2860_BOARD_SAA711X_REFERENCE_DESIGN, TUNER_ABSENT},
2659         {0x77800080, EM2860_BOARD_TVP5150_REFERENCE_DESIGN, TUNER_ABSENT},
2660         {0xc51200e3, EM2820_BOARD_GADMEI_TVR200, TUNER_LG_PAL_NEW_TAPC},
2661         {0x4ba50080, EM2861_BOARD_GADMEI_UTV330PLUS, TUNER_TNF_5335MF},
2662         {0x6b800080, EM2874_BOARD_LEADERSHIP_ISDBT, TUNER_ABSENT},
2663 };
2664
2665 /* NOTE: introduce a separate hash table for devices with 16 bit eeproms */
2666
2667 int em28xx_tuner_callback(void *ptr, int component, int command, int arg)
2668 {
2669         struct em28xx_i2c_bus *i2c_bus = ptr;
2670         struct em28xx *dev = i2c_bus->dev;
2671         int rc = 0;
2672
2673         if (dev->tuner_type != TUNER_XC2028 && dev->tuner_type != TUNER_XC5000)
2674                 return 0;
2675
2676         if (command != XC2028_TUNER_RESET && command != XC5000_TUNER_RESET)
2677                 return 0;
2678
2679         rc = em28xx_gpio_set(dev, dev->board.tuner_gpio);
2680
2681         return rc;
2682 }
2683 EXPORT_SYMBOL_GPL(em28xx_tuner_callback);
2684
2685 static inline void em28xx_set_model(struct em28xx *dev)
2686 {
2687         dev->board = em28xx_boards[dev->model];
2688
2689         /* Those are the default values for the majority of boards
2690            Use those values if not specified otherwise at boards entry
2691          */
2692         if (!dev->board.xclk)
2693                 dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE |
2694                                   EM28XX_XCLK_FREQUENCY_12MHZ;
2695
2696         if (!dev->board.i2c_speed)
2697                 dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE |
2698                                        EM28XX_I2C_FREQ_100_KHZ;
2699
2700         /* Should be initialized early, for I2C to work */
2701         dev->def_i2c_bus = dev->board.def_i2c_bus;
2702 }
2703
2704 /* Wait until AC97_RESET reports the expected value reliably before proceeding.
2705  * We also check that two unrelated registers accesses don't return the same
2706  * value to avoid premature return.
2707  * This procedure helps ensuring AC97 register accesses are reliable.
2708  */
2709 static int em28xx_wait_until_ac97_features_equals(struct em28xx *dev,
2710                                                   int expected_feat)
2711 {
2712         unsigned long timeout = jiffies + msecs_to_jiffies(2000);
2713         int feat, powerdown;
2714
2715         while (time_is_after_jiffies(timeout)) {
2716                 feat = em28xx_read_ac97(dev, AC97_RESET);
2717                 if (feat < 0)
2718                         return feat;
2719
2720                 powerdown = em28xx_read_ac97(dev, AC97_POWERDOWN);
2721                 if (powerdown < 0)
2722                         return powerdown;
2723
2724                 if (feat == expected_feat && feat != powerdown)
2725                         return 0;
2726
2727                 msleep(50);
2728         }
2729
2730         dev_warn(&dev->intf->dev, "AC97 registers access is not reliable !\n");
2731         return -ETIMEDOUT;
2732 }
2733
2734 /* Since em28xx_pre_card_setup() requires a proper dev->model,
2735  * this won't work for boards with generic PCI IDs
2736  */
2737 static void em28xx_pre_card_setup(struct em28xx *dev)
2738 {
2739         /* Set the initial XCLK and I2C clock values based on the board
2740            definition */
2741         em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f);
2742         if (!dev->board.is_em2800)
2743                 em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
2744         msleep(50);
2745
2746         /* request some modules */
2747         switch (dev->model) {
2748         case EM2861_BOARD_PLEXTOR_PX_TV100U:
2749                 /* Sets the msp34xx I2S speed */
2750                 dev->i2s_speed = 2048000;
2751                 break;
2752         case EM2861_BOARD_KWORLD_PVRTV_300U:
2753         case EM2880_BOARD_KWORLD_DVB_305U:
2754                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
2755                 msleep(10);
2756                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
2757                 msleep(10);
2758                 break;
2759         case EM2870_BOARD_COMPRO_VIDEOMATE:
2760                 /* TODO: someone can do some cleanup here...
2761                          not everything's needed */
2762                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2763                 msleep(10);
2764                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
2765                 msleep(10);
2766                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2767                 mdelay(70);
2768                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
2769                 mdelay(70);
2770                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
2771                 mdelay(70);
2772                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
2773                 mdelay(70);
2774                 break;
2775         case EM2870_BOARD_TERRATEC_XS_MT2060:
2776                 /* this device needs some gpio writes to get the DVB-T
2777                    demod work */
2778                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2779                 mdelay(70);
2780                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
2781                 mdelay(70);
2782                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2783                 mdelay(70);
2784                 break;
2785         case EM2870_BOARD_PINNACLE_PCTV_DVB:
2786                 /* this device needs some gpio writes to get the
2787                    DVB-T demod work */
2788                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2789                 mdelay(70);
2790                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
2791                 mdelay(70);
2792                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2793                 mdelay(70);
2794                 break;
2795         case EM2820_BOARD_GADMEI_UTV310:
2796         case EM2820_BOARD_MSI_VOX_USB_2:
2797                 /* enables audio for that devices */
2798                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2799                 break;
2800
2801         case EM2882_BOARD_KWORLD_ATSC_315U:
2802                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
2803                 msleep(10);
2804                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2805                 msleep(10);
2806                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
2807                 msleep(10);
2808                 em28xx_write_reg(dev, EM2880_R04_GPO, 0x08);
2809                 msleep(10);
2810                 break;
2811
2812         case EM2860_BOARD_KAIOMY_TVNPC_U2:
2813                 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1);
2814                 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1);
2815                 em28xx_write_regs(dev, 0x0d, "\x42", 1);
2816                 em28xx_write_regs(dev, 0x08, "\xfd", 1);
2817                 msleep(10);
2818                 em28xx_write_regs(dev, 0x08, "\xff", 1);
2819                 msleep(10);
2820                 em28xx_write_regs(dev, 0x08, "\x7f", 1);
2821                 msleep(10);
2822                 em28xx_write_regs(dev, 0x08, "\x6b", 1);
2823
2824                 break;
2825         case EM2860_BOARD_EASYCAP:
2826                 em28xx_write_regs(dev, 0x08, "\xf8", 1);
2827                 break;
2828
2829         case EM2820_BOARD_IODATA_GVMVP_SZ:
2830                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
2831                 msleep(70);
2832                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
2833                 msleep(10);
2834                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
2835                 msleep(70);
2836                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
2837                 msleep(70);
2838                 break;
2839
2840         case EM2860_BOARD_TERRATEC_GRABBY:
2841                 /* HACK?: Ensure AC97 register reading is reliable before
2842                  * proceeding. In practice, this will wait about 1.6 seconds.
2843                  */
2844                 em28xx_wait_until_ac97_features_equals(dev, 0x6a90);
2845                 break;
2846         }
2847
2848         em28xx_gpio_set(dev, dev->board.tuner_gpio);
2849         em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
2850
2851         /* Unlock device */
2852         em28xx_set_mode(dev, EM28XX_SUSPEND);
2853 }
2854
2855 static int em28xx_hint_board(struct em28xx *dev)
2856 {
2857         int i;
2858
2859         if (dev->board.is_webcam) {
2860                 if (dev->em28xx_sensor == EM28XX_MT9V011) {
2861                         dev->model = EM2820_BOARD_SILVERCREST_WEBCAM;
2862                 } else if (dev->em28xx_sensor == EM28XX_MT9M001 ||
2863                            dev->em28xx_sensor == EM28XX_MT9M111) {
2864                         dev->model = EM2750_BOARD_UNKNOWN;
2865                 }
2866                 /* FIXME: IMPROVE ! */
2867
2868                 return 0;
2869         }
2870
2871         /* HINT method: EEPROM
2872          *
2873          * This method works only for boards with eeprom.
2874          * Uses a hash of all eeprom bytes. The hash should be
2875          * unique for a vendor/tuner pair.
2876          * There are a high chance that tuners for different
2877          * video standards produce different hashes.
2878          */
2879         for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) {
2880                 if (dev->hash == em28xx_eeprom_hash[i].hash) {
2881                         dev->model = em28xx_eeprom_hash[i].model;
2882                         dev->tuner_type = em28xx_eeprom_hash[i].tuner;
2883
2884                         dev_err(&dev->intf->dev,
2885                                 "Your board has no unique USB ID.\n"
2886                                 "A hint were successfully done, based on eeprom hash.\n"
2887                                 "This method is not 100%% failproof.\n"
2888                                 "If the board were misdetected, please email this log to:\n"
2889                                 "\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
2890                                 "Board detected as %s\n",
2891                                em28xx_boards[dev->model].name);
2892
2893                         return 0;
2894                 }
2895         }
2896
2897         /* HINT method: I2C attached devices
2898          *
2899          * This method works for all boards.
2900          * Uses a hash of i2c scanned devices.
2901          * Devices with the same i2c attached chips will
2902          * be considered equal.
2903          * This method is less precise than the eeprom one.
2904          */
2905
2906         /* user did not request i2c scanning => do it now */
2907         if (!dev->i2c_hash)
2908                 em28xx_do_i2c_scan(dev, dev->def_i2c_bus);
2909
2910         for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) {
2911                 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) {
2912                         dev->model = em28xx_i2c_hash[i].model;
2913                         dev->tuner_type = em28xx_i2c_hash[i].tuner;
2914                         dev_err(&dev->intf->dev,
2915                                 "Your board has no unique USB ID.\n"
2916                                 "A hint were successfully done, based on i2c devicelist hash.\n"
2917                                 "This method is not 100%% failproof.\n"
2918                                 "If the board were misdetected, please email this log to:\n"
2919                                 "\tV4L Mailing List  <linux-media@vger.kernel.org>\n"
2920                                 "Board detected as %s\n",
2921                                 em28xx_boards[dev->model].name);
2922
2923                         return 0;
2924                 }
2925         }
2926
2927         dev_err(&dev->intf->dev,
2928                 "Your board has no unique USB ID and thus need a hint to be detected.\n"
2929                 "You may try to use card=<n> insmod option to workaround that.\n"
2930                 "Please send an email with this log to:\n"
2931                 "\tV4L Mailing List <linux-media@vger.kernel.org>\n"
2932                 "Board eeprom hash is 0x%08lx\n"
2933                 "Board i2c devicelist hash is 0x%08lx\n",
2934                 dev->hash, dev->i2c_hash);
2935
2936         dev_err(&dev->intf->dev,
2937                 "Here is a list of valid choices for the card=<n> insmod option:\n");
2938         for (i = 0; i < em28xx_bcount; i++) {
2939                 dev_err(&dev->intf->dev,
2940                         "    card=%d -> %s\n", i, em28xx_boards[i].name);
2941         }
2942         return -1;
2943 }
2944
2945 static void em28xx_card_setup(struct em28xx *dev)
2946 {
2947         /*
2948          * If the device can be a webcam, seek for a sensor.
2949          * If sensor is not found, then it isn't a webcam.
2950          */
2951         if (dev->board.is_webcam) {
2952                 em28xx_detect_sensor(dev);
2953                 if (dev->em28xx_sensor == EM28XX_NOSENSOR)
2954                         /* NOTE: error/unknown sensor/no sensor */
2955                         dev->board.is_webcam = 0;
2956         }
2957
2958         switch (dev->model) {
2959         case EM2750_BOARD_UNKNOWN:
2960         case EM2820_BOARD_UNKNOWN:
2961         case EM2800_BOARD_UNKNOWN:
2962                 /*
2963                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
2964                  *
2965                  * This occurs because they share identical USB vendor and
2966                  * product IDs.
2967                  *
2968                  * What we do here is look up the EEPROM hash of the K-WORLD
2969                  * and if it is found then we decide that we do not have
2970                  * a DIGIVOX and reset the device to the K-WORLD instead.
2971                  *
2972                  * This solution is only valid if they do not share eeprom
2973                  * hash identities which has not been determined as yet.
2974                  */
2975                 if (em28xx_hint_board(dev) < 0)
2976                         dev_err(&dev->intf->dev, "Board not discovered\n");
2977                 else {
2978                         em28xx_set_model(dev);
2979                         em28xx_pre_card_setup(dev);
2980                 }
2981                 break;
2982         default:
2983                 em28xx_set_model(dev);
2984         }
2985
2986         dev_info(&dev->intf->dev, "Identified as %s (card=%d)\n",
2987                 dev->board.name, dev->model);
2988
2989         dev->tuner_type = em28xx_boards[dev->model].tuner_type;
2990
2991         /* request some modules */
2992         switch (dev->model) {
2993         case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2:
2994         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
2995         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
2996         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
2997         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
2998         case EM2884_BOARD_HAUPPAUGE_WINTV_HVR_930C:
2999         case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_DVB:
3000         case EM28174_BOARD_HAUPPAUGE_WINTV_DUALHD_01595:
3001         {
3002                 struct tveeprom tv;
3003
3004                 if (dev->eedata == NULL)
3005                         break;
3006 #if defined(CONFIG_MODULES) && defined(MODULE)
3007                 request_module("tveeprom");
3008 #endif
3009                 /* Call first TVeeprom */
3010
3011                 tveeprom_hauppauge_analog(&tv, dev->eedata);
3012
3013                 dev->tuner_type = tv.tuner_type;
3014
3015                 if (tv.audio_processor == TVEEPROM_AUDPROC_MSP) {
3016                         dev->i2s_speed = 2048000;
3017                         dev->board.has_msp34xx = 1;
3018                 }
3019                 break;
3020         }
3021         case EM2882_BOARD_KWORLD_ATSC_315U:
3022                 em28xx_write_reg(dev, 0x0d, 0x42);
3023                 msleep(10);
3024                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
3025                 msleep(10);
3026                 break;
3027         case EM2820_BOARD_KWORLD_PVRTV2800RF:
3028                 /* GPIO enables sound on KWORLD PVR TV 2800RF */
3029                 em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
3030                 break;
3031         case EM2820_BOARD_UNKNOWN:
3032         case EM2800_BOARD_UNKNOWN:
3033                 /*
3034                  * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD.
3035                  *
3036                  * This occurs because they share identical USB vendor and
3037                  * product IDs.
3038                  *
3039                  * What we do here is look up the EEPROM hash of the K-WORLD
3040                  * and if it is found then we decide that we do not have
3041                  * a DIGIVOX and reset the device to the K-WORLD instead.
3042                  *
3043                  * This solution is only valid if they do not share eeprom
3044                  * hash identities which has not been determined as yet.
3045                  */
3046         case EM2880_BOARD_MSI_DIGIVOX_AD:
3047                 if (!em28xx_hint_board(dev))
3048                         em28xx_set_model(dev);
3049
3050                 /* In cases where we had to use a board hint, the call to
3051                    em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
3052                    so make the call now so the analog GPIOs are set properly
3053                    before probing the i2c bus. */
3054                 em28xx_gpio_set(dev, dev->board.tuner_gpio);
3055                 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3056                 break;
3057
3058                 /*
3059                  * The Dikom DK300 is detected as an Kworld VS-DVB-T 323UR.
3060                  *
3061                  * This occurs because they share identical USB vendor and
3062                  * product IDs.
3063                  *
3064                  * What we do here is look up the EEPROM hash of the Dikom
3065                  * and if it is found then we decide that we do not have
3066                  * a Kworld and reset the device to the Dikom instead.
3067                  *
3068                  * This solution is only valid if they do not share eeprom
3069                  * hash identities which has not been determined as yet.
3070                  */
3071         case EM2882_BOARD_KWORLD_VS_DVBT:
3072                 if (!em28xx_hint_board(dev))
3073                         em28xx_set_model(dev);
3074
3075                 /* In cases where we had to use a board hint, the call to
3076                    em28xx_set_mode() in em28xx_pre_card_setup() was a no-op,
3077                    so make the call now so the analog GPIOs are set properly
3078                    before probing the i2c bus. */
3079                 em28xx_gpio_set(dev, dev->board.tuner_gpio);
3080                 em28xx_set_mode(dev, EM28XX_ANALOG_MODE);
3081                 break;
3082         }
3083
3084         if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) {
3085                 dev_err(&dev->intf->dev,
3086                         "\n\n"
3087                         "The support for this board weren't valid yet.\n"
3088                         "Please send a report of having this working\n"
3089                         "not to V4L mailing list (and/or to other addresses)\n\n");
3090         }
3091
3092         /* Free eeprom data memory */
3093         kfree(dev->eedata);
3094         dev->eedata = NULL;
3095
3096         /* Allow override tuner type by a module parameter */
3097         if (tuner >= 0)
3098                 dev->tuner_type = tuner;
3099 }
3100
3101 void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
3102 {
3103         memset(ctl, 0, sizeof(*ctl));
3104
3105         ctl->fname   = "/*(DEBLOBBED)*/";
3106         ctl->max_len = 64;
3107         ctl->mts = em28xx_boards[dev->model].mts_firmware;
3108
3109         switch (dev->model) {
3110         case EM2880_BOARD_EMPIRE_DUAL_TV:
3111         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900:
3112         case EM2882_BOARD_TERRATEC_HYBRID_XS:
3113                 ctl->demod = XC3028_FE_ZARLINK456;
3114                 break;
3115         case EM2880_BOARD_TERRATEC_HYBRID_XS:
3116         case EM2880_BOARD_TERRATEC_HYBRID_XS_FR:
3117         case EM2881_BOARD_PINNACLE_HYBRID_PRO:
3118                 ctl->demod = XC3028_FE_ZARLINK456;
3119                 break;
3120         case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
3121         case EM2882_BOARD_PINNACLE_HYBRID_PRO_330E:
3122                 ctl->demod = XC3028_FE_DEFAULT;
3123                 break;
3124         case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
3125                 ctl->demod = XC3028_FE_DEFAULT;
3126                 ctl->fname = "/*(DEBLOBBED)*/";
3127                 break;
3128         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
3129         case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
3130         case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
3131                 /* FIXME: Better to specify the needed IF */
3132                 ctl->demod = XC3028_FE_DEFAULT;
3133                 break;
3134         case EM2883_BOARD_KWORLD_HYBRID_330U:
3135         case EM2882_BOARD_DIKOM_DK300:
3136         case EM2882_BOARD_KWORLD_VS_DVBT:
3137                 ctl->demod = XC3028_FE_CHINA;
3138                 ctl->fname = "/*(DEBLOBBED)*/";
3139                 break;
3140         case EM2882_BOARD_EVGA_INDTUBE:
3141                 ctl->demod = XC3028_FE_CHINA;
3142                 ctl->fname = "/*(DEBLOBBED)*/";
3143                 break;
3144         default:
3145                 ctl->demod = XC3028_FE_OREN538;
3146         }
3147 }
3148 EXPORT_SYMBOL_GPL(em28xx_setup_xc3028);
3149
3150 static void request_module_async(struct work_struct *work)
3151 {
3152         struct em28xx *dev = container_of(work,
3153                              struct em28xx, request_module_wk);
3154
3155         /*
3156          * The em28xx extensions can be modules or builtin. If the
3157          * modules are already loaded or are built in, those extensions
3158          * can be initialised right now. Otherwise, the module init
3159          * code will do it.
3160          */
3161
3162         /*
3163          * Devicdes with an audio-only interface also have a V4L/DVB/RC
3164          * interface. Don't register extensions twice on those devices.
3165          */
3166         if (dev->is_audio_only) {
3167 #if defined(CONFIG_MODULES) && defined(MODULE)
3168                 request_module("em28xx-alsa");
3169 #endif
3170                 return;
3171         }
3172
3173         em28xx_init_extension(dev);
3174
3175 #if defined(CONFIG_MODULES) && defined(MODULE)
3176         if (dev->has_video)
3177                 request_module("em28xx-v4l");
3178         if (dev->usb_audio_type == EM28XX_USB_AUDIO_CLASS)
3179                 request_module("snd-usb-audio");
3180         else if (dev->usb_audio_type == EM28XX_USB_AUDIO_VENDOR)
3181                 request_module("em28xx-alsa");
3182         if (dev->board.has_dvb)
3183                 request_module("em28xx-dvb");
3184         if (dev->board.buttons ||
3185             ((dev->board.ir_codes || dev->board.has_ir_i2c) && !disable_ir))
3186                 request_module("em28xx-rc");
3187 #endif /* CONFIG_MODULES */
3188 }
3189
3190 static void request_modules(struct em28xx *dev)
3191 {
3192         INIT_WORK(&dev->request_module_wk, request_module_async);
3193         schedule_work(&dev->request_module_wk);
3194 }
3195
3196 static void flush_request_modules(struct em28xx *dev)
3197 {
3198         flush_work(&dev->request_module_wk);
3199 }
3200
3201 static int em28xx_media_device_init(struct em28xx *dev,
3202                                     struct usb_device *udev)
3203 {
3204 #ifdef CONFIG_MEDIA_CONTROLLER
3205         struct media_device *mdev;
3206
3207         mdev = kzalloc(sizeof(*mdev), GFP_KERNEL);
3208         if (!mdev)
3209                 return -ENOMEM;
3210
3211         if (udev->product)
3212                 media_device_usb_init(mdev, udev, udev->product);
3213         else if (udev->manufacturer)
3214                 media_device_usb_init(mdev, udev, udev->manufacturer);
3215         else
3216                 media_device_usb_init(mdev, udev, dev_name(&dev->intf->dev));
3217
3218         dev->media_dev = mdev;
3219 #endif
3220         return 0;
3221 }
3222
3223 static void em28xx_unregister_media_device(struct em28xx *dev)
3224 {
3225
3226 #ifdef CONFIG_MEDIA_CONTROLLER
3227         if (dev->media_dev) {
3228                 media_device_unregister(dev->media_dev);
3229                 media_device_cleanup(dev->media_dev);
3230                 kfree(dev->media_dev);
3231                 dev->media_dev = NULL;
3232         }
3233 #endif
3234 }
3235
3236 /*
3237  * em28xx_release_resources()
3238  * unregisters the v4l2,i2c and usb devices
3239  * called when the device gets disconnected or at module unload
3240 */
3241 static void em28xx_release_resources(struct em28xx *dev)
3242 {
3243         struct usb_device *udev = interface_to_usbdev(dev->intf);
3244
3245         /*FIXME: I2C IR should be disconnected */
3246
3247         mutex_lock(&dev->lock);
3248
3249         em28xx_unregister_media_device(dev);
3250
3251         if (dev->def_i2c_bus)
3252                 em28xx_i2c_unregister(dev, 1);
3253         em28xx_i2c_unregister(dev, 0);
3254
3255         usb_put_dev(udev);
3256
3257         /* Mark device as unused */
3258         clear_bit(dev->devno, em28xx_devused);
3259
3260         mutex_unlock(&dev->lock);
3261 };
3262
3263 /**
3264  * em28xx_free_device() - Free em28xx device
3265  *
3266  * @ref: struct kref for em28xx device
3267  *
3268  * This is called when all extensions and em28xx core unregisters a device
3269  */
3270 void em28xx_free_device(struct kref *ref)
3271 {
3272         struct em28xx *dev = kref_to_dev(ref);
3273
3274         dev_info(&dev->intf->dev, "Freeing device\n");
3275
3276         if (!dev->disconnected)
3277                 em28xx_release_resources(dev);
3278
3279         kfree(dev->alt_max_pkt_size_isoc);
3280         kfree(dev);
3281 }
3282 EXPORT_SYMBOL_GPL(em28xx_free_device);
3283
3284 /*
3285  * em28xx_init_dev()
3286  * allocates and inits the device structs, registers i2c bus and v4l device
3287  */
3288 static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
3289                            struct usb_interface *interface,
3290                            int minor)
3291 {
3292         int retval;
3293         const char *chip_name = NULL;
3294
3295         dev->intf = interface;
3296         mutex_init(&dev->ctrl_urb_lock);
3297         spin_lock_init(&dev->slock);
3298
3299         dev->em28xx_write_regs = em28xx_write_regs;
3300         dev->em28xx_read_reg = em28xx_read_reg;
3301         dev->em28xx_read_reg_req_len = em28xx_read_reg_req_len;
3302         dev->em28xx_write_regs_req = em28xx_write_regs_req;
3303         dev->em28xx_read_reg_req = em28xx_read_reg_req;
3304         dev->board.is_em2800 = em28xx_boards[dev->model].is_em2800;
3305
3306         em28xx_set_model(dev);
3307
3308         dev->wait_after_write = 5;
3309
3310         /* Based on the Chip ID, set the device configuration */
3311         retval = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
3312         if (retval > 0) {
3313                 dev->chip_id = retval;
3314
3315                 switch (dev->chip_id) {
3316                 case CHIP_ID_EM2800:
3317                         chip_name = "em2800";
3318                         break;
3319                 case CHIP_ID_EM2710:
3320                         chip_name = "em2710";
3321                         break;
3322                 case CHIP_ID_EM2750:
3323                         chip_name = "em2750";
3324                         break;
3325                 case CHIP_ID_EM2765:
3326                         chip_name = "em2765";
3327                         dev->wait_after_write = 0;
3328                         dev->is_em25xx = 1;
3329                         dev->eeprom_addrwidth_16bit = 1;
3330                         break;
3331                 case CHIP_ID_EM2820:
3332                         chip_name = "em2710/2820";
3333                         if (le16_to_cpu(udev->descriptor.idVendor) == 0xeb1a) {
3334                                 __le16 idProd = udev->descriptor.idProduct;
3335
3336                                 if (le16_to_cpu(idProd) == 0x2710)
3337                                         chip_name = "em2710";
3338                                 else if (le16_to_cpu(idProd) == 0x2820)
3339                                         chip_name = "em2820";
3340                         }
3341                         /* NOTE: the em2820 is used in webcams, too ! */
3342                         break;
3343                 case CHIP_ID_EM2840:
3344                         chip_name = "em2840";
3345                         break;
3346                 case CHIP_ID_EM2860:
3347                         chip_name = "em2860";
3348                         break;
3349                 case CHIP_ID_EM2870:
3350                         chip_name = "em2870";
3351                         dev->wait_after_write = 0;
3352                         break;
3353                 case CHIP_ID_EM2874:
3354                         chip_name = "em2874";
3355                         dev->wait_after_write = 0;
3356                         dev->eeprom_addrwidth_16bit = 1;
3357                         break;
3358                 case CHIP_ID_EM28174:
3359                         chip_name = "em28174";
3360                         dev->wait_after_write = 0;
3361                         dev->eeprom_addrwidth_16bit = 1;
3362                         break;
3363                 case CHIP_ID_EM28178:
3364                         chip_name = "em28178";
3365                         dev->wait_after_write = 0;
3366                         dev->eeprom_addrwidth_16bit = 1;
3367                         break;
3368                 case CHIP_ID_EM2883:
3369                         chip_name = "em2882/3";
3370                         dev->wait_after_write = 0;
3371                         break;
3372                 case CHIP_ID_EM2884:
3373                         chip_name = "em2884";
3374                         dev->wait_after_write = 0;
3375                         dev->eeprom_addrwidth_16bit = 1;
3376                         break;
3377                 }
3378         }
3379         if (!chip_name)
3380                 dev_info(&dev->intf->dev,
3381                          "unknown em28xx chip ID (%d)\n", dev->chip_id);
3382         else
3383                 dev_info(&dev->intf->dev, "chip ID is %s\n", chip_name);
3384
3385         em28xx_media_device_init(dev, udev);
3386
3387         if (dev->is_audio_only) {
3388                 retval = em28xx_audio_setup(dev);
3389                 if (retval) {
3390                         retval = -ENODEV;
3391                         goto err_deinit_media;
3392                 }
3393                 em28xx_init_extension(dev);
3394
3395                 return 0;
3396         }
3397
3398         em28xx_pre_card_setup(dev);
3399
3400         if (!dev->board.is_em2800) {
3401                 /* Resets I2C speed */
3402                 retval = em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed);
3403                 if (retval < 0) {
3404                         dev_err(&dev->intf->dev,
3405                                "%s: em28xx_write_reg failed! retval [%d]\n",
3406                                __func__, retval);
3407                         return retval;
3408                 }
3409         }
3410
3411         rt_mutex_init(&dev->i2c_bus_lock);
3412
3413         /* register i2c bus 0 */
3414         if (dev->board.is_em2800)
3415                 retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM2800);
3416         else
3417                 retval = em28xx_i2c_register(dev, 0, EM28XX_I2C_ALGO_EM28XX);
3418         if (retval < 0) {
3419                 dev_err(&dev->intf->dev,
3420                         "%s: em28xx_i2c_register bus 0 - error [%d]!\n",
3421                        __func__, retval);
3422                 goto err_deinit_media;
3423         }
3424
3425         /* register i2c bus 1 */
3426         if (dev->def_i2c_bus) {
3427                 if (dev->is_em25xx)
3428                         retval = em28xx_i2c_register(dev, 1,
3429                                                      EM28XX_I2C_ALGO_EM25XX_BUS_B);
3430                 else
3431                         retval = em28xx_i2c_register(dev, 1,
3432                                                      EM28XX_I2C_ALGO_EM28XX);
3433                 if (retval < 0) {
3434                         dev_err(&dev->intf->dev,
3435                                "%s: em28xx_i2c_register bus 1 - error [%d]!\n",
3436                                __func__, retval);
3437
3438                         goto err_unreg_i2c;
3439                 }
3440         }
3441
3442         /* Do board specific init and eeprom reading */
3443         em28xx_card_setup(dev);
3444
3445         return 0;
3446
3447 err_unreg_i2c:
3448         em28xx_i2c_unregister(dev, 0);
3449 err_deinit_media:
3450         em28xx_unregister_media_device(dev);
3451         return retval;
3452 }
3453
3454 /* high bandwidth multiplier, as encoded in highspeed endpoint descriptors */
3455 #define hb_mult(wMaxPacketSize) (1 + (((wMaxPacketSize) >> 11) & 0x03))
3456
3457 /*
3458  * em28xx_usb_probe()
3459  * checks for supported devices
3460  */
3461 static int em28xx_usb_probe(struct usb_interface *interface,
3462                             const struct usb_device_id *id)
3463 {
3464         struct usb_device *udev;
3465         struct em28xx *dev = NULL;
3466         int retval;
3467         bool has_vendor_audio = false, has_video = false, has_dvb = false;
3468         int i, nr, try_bulk;
3469         const int ifnum = interface->altsetting[0].desc.bInterfaceNumber;
3470         char *speed;
3471
3472         udev = usb_get_dev(interface_to_usbdev(interface));
3473
3474         /* Check to see next free device and mark as used */
3475         do {
3476                 nr = find_first_zero_bit(em28xx_devused, EM28XX_MAXBOARDS);
3477                 if (nr >= EM28XX_MAXBOARDS) {
3478                         /* No free device slots */
3479                         dev_err(&interface->dev,
3480                                 "Driver supports up to %i em28xx boards.\n",
3481                                EM28XX_MAXBOARDS);
3482                         retval = -ENOMEM;
3483                         goto err_no_slot;
3484                 }
3485         } while (test_and_set_bit(nr, em28xx_devused));
3486
3487         /* Don't register audio interfaces */
3488         if (interface->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3489                 dev_err(&interface->dev,
3490                         "audio device (%04x:%04x): interface %i, class %i\n",
3491                         le16_to_cpu(udev->descriptor.idVendor),
3492                         le16_to_cpu(udev->descriptor.idProduct),
3493                         ifnum,
3494                         interface->altsetting[0].desc.bInterfaceClass);
3495
3496                 retval = -ENODEV;
3497                 goto err;
3498         }
3499
3500         /* allocate memory for our device state and initialize it */
3501         dev = kzalloc(sizeof(*dev), GFP_KERNEL);
3502         if (dev == NULL) {
3503                 retval = -ENOMEM;
3504                 goto err;
3505         }
3506
3507         /* compute alternate max packet sizes */
3508         dev->alt_max_pkt_size_isoc =
3509                                 kmalloc(sizeof(dev->alt_max_pkt_size_isoc[0]) *
3510                                         interface->num_altsetting, GFP_KERNEL);
3511         if (dev->alt_max_pkt_size_isoc == NULL) {
3512                 kfree(dev);
3513                 retval = -ENOMEM;
3514                 goto err;
3515         }
3516
3517         /* Get endpoints */
3518         for (i = 0; i < interface->num_altsetting; i++) {
3519                 int ep;
3520
3521                 for (ep = 0; ep < interface->altsetting[i].desc.bNumEndpoints; ep++) {
3522                         const struct usb_endpoint_descriptor *e;
3523                         int sizedescr, size;
3524
3525                         e = &interface->altsetting[i].endpoint[ep].desc;
3526
3527                         sizedescr = le16_to_cpu(e->wMaxPacketSize);
3528                         size = sizedescr & 0x7ff;
3529
3530                         if (udev->speed == USB_SPEED_HIGH)
3531                                 size = size * hb_mult(sizedescr);
3532
3533                         if (usb_endpoint_dir_in(e)) {
3534                                 switch (e->bEndpointAddress) {
3535                                 case 0x82:
3536                                         has_video = true;
3537                                         if (usb_endpoint_xfer_isoc(e)) {
3538                                                 dev->analog_ep_isoc =
3539                                                             e->bEndpointAddress;
3540                                                 dev->alt_max_pkt_size_isoc[i] = size;
3541                                         } else if (usb_endpoint_xfer_bulk(e)) {
3542                                                 dev->analog_ep_bulk =
3543                                                             e->bEndpointAddress;
3544                                         }
3545                                         break;
3546                                 case 0x83:
3547                                         if (usb_endpoint_xfer_isoc(e)) {
3548                                                 has_vendor_audio = true;
3549                                         } else {
3550                                                 dev_err(&interface->dev,
3551                                                         "error: skipping audio endpoint 0x83, because it uses bulk transfers !\n");
3552                                         }
3553                                         break;
3554                                 case 0x84:
3555                                         if (has_video &&
3556                                             (usb_endpoint_xfer_bulk(e))) {
3557                                                 dev->analog_ep_bulk =
3558                                                             e->bEndpointAddress;
3559                                         } else {
3560                                                 if (usb_endpoint_xfer_isoc(e)) {
3561                                                         if (size > dev->dvb_max_pkt_size_isoc) {
3562                                                                 has_dvb = true; /* see NOTE (~) */
3563                                                                 dev->dvb_ep_isoc = e->bEndpointAddress;
3564                                                                 dev->dvb_max_pkt_size_isoc = size;
3565                                                                 dev->dvb_alt_isoc = i;
3566                                                         }
3567                                                 } else {
3568                                                         has_dvb = true;
3569                                                         dev->dvb_ep_bulk = e->bEndpointAddress;
3570                                                 }
3571                                         }
3572                                         break;
3573                                 }
3574                         }
3575                         /* NOTE:
3576                          * Old logic with support for isoc transfers only was:
3577                          *  0x82        isoc            => analog
3578                          *  0x83        isoc            => audio
3579                          *  0x84        isoc            => digital
3580                          *
3581                          * New logic with support for bulk transfers
3582                          *  0x82        isoc            => analog
3583                          *  0x82        bulk            => analog
3584                          *  0x83        isoc*           => audio
3585                          *  0x84        isoc            => digital
3586                          *  0x84        bulk            => analog or digital**
3587                          * (*: audio should always be isoc)
3588                          * (**: analog, if ep 0x82 is isoc, otherwise digital)
3589                          *
3590                          * The new logic preserves backwards compatibility and
3591                          * reflects the endpoint configurations we have seen
3592                          * so far. But there might be devices for which this
3593                          * logic is not sufficient...
3594                          */
3595                         /*
3596                          * NOTE (~): some manufacturers (e.g. Terratec) disable
3597                          * endpoints by setting wMaxPacketSize to 0 bytes for
3598                          * all alt settings. So far, we've seen this for
3599                          * DVB isoc endpoints only.
3600                          */
3601                 }
3602         }
3603
3604         if (!(has_vendor_audio || has_video || has_dvb)) {
3605                 retval = -ENODEV;
3606                 goto err_free;
3607         }
3608
3609         switch (udev->speed) {
3610         case USB_SPEED_LOW:
3611                 speed = "1.5";
3612                 break;
3613         case USB_SPEED_UNKNOWN:
3614         case USB_SPEED_FULL:
3615                 speed = "12";
3616                 break;
3617         case USB_SPEED_HIGH:
3618                 speed = "480";
3619                 break;
3620         default:
3621                 speed = "unknown";
3622         }
3623
3624         dev_err(&interface->dev,
3625                 "New device %s %s @ %s Mbps (%04x:%04x, interface %d, class %d)\n",
3626                 udev->manufacturer ? udev->manufacturer : "",
3627                 udev->product ? udev->product : "",
3628                 speed,
3629                 le16_to_cpu(udev->descriptor.idVendor),
3630                 le16_to_cpu(udev->descriptor.idProduct),
3631                 ifnum,
3632                 interface->altsetting->desc.bInterfaceNumber);
3633
3634         /*
3635          * Make sure we have 480 Mbps of bandwidth, otherwise things like
3636          * video stream wouldn't likely work, since 12 Mbps is generally
3637          * not enough even for most Digital TV streams.
3638          */
3639         if (udev->speed != USB_SPEED_HIGH && disable_usb_speed_check == 0) {
3640                 dev_err(&interface->dev, "Device initialization failed.\n");
3641                 dev_err(&interface->dev,
3642                         "Device must be connected to a high-speed USB 2.0 port.\n");
3643                 retval = -ENODEV;
3644                 goto err_free;
3645         }
3646
3647         dev->devno = nr;
3648         dev->model = id->driver_info;
3649         dev->alt   = -1;
3650         dev->is_audio_only = has_vendor_audio && !(has_video || has_dvb);
3651         dev->has_video = has_video;
3652         dev->ifnum = ifnum;
3653
3654         if (has_vendor_audio) {
3655                 dev_err(&interface->dev,
3656                         "Audio interface %i found (Vendor Class)\n", ifnum);
3657                 dev->usb_audio_type = EM28XX_USB_AUDIO_VENDOR;
3658         }
3659         /* Checks if audio is provided by a USB Audio Class interface */
3660         for (i = 0; i < udev->config->desc.bNumInterfaces; i++) {
3661                 struct usb_interface *uif = udev->config->interface[i];
3662
3663                 if (uif->altsetting[0].desc.bInterfaceClass == USB_CLASS_AUDIO) {
3664                         if (has_vendor_audio)
3665                                 dev_err(&interface->dev,
3666                                         "em28xx: device seems to have vendor AND usb audio class interfaces !\n"
3667                                        "\t\tThe vendor interface will be ignored. Please contact the developers <linux-media@vger.kernel.org>\n");
3668                         dev->usb_audio_type = EM28XX_USB_AUDIO_CLASS;
3669                         break;
3670                 }
3671         }
3672
3673         if (has_video)
3674                 dev_err(&interface->dev, "Video interface %i found:%s%s\n",
3675                         ifnum,
3676                         dev->analog_ep_bulk ? " bulk" : "",
3677                         dev->analog_ep_isoc ? " isoc" : "");
3678         if (has_dvb)
3679                 dev_err(&interface->dev, "DVB interface %i found:%s%s\n",
3680                         ifnum,
3681                         dev->dvb_ep_bulk ? " bulk" : "",
3682                         dev->dvb_ep_isoc ? " isoc" : "");
3683
3684         dev->num_alt = interface->num_altsetting;
3685
3686         if ((unsigned)card[nr] < em28xx_bcount)
3687                 dev->model = card[nr];
3688
3689         /* save our data pointer in this interface device */
3690         usb_set_intfdata(interface, dev);
3691
3692         /* allocate device struct and check if the device is a webcam */
3693         mutex_init(&dev->lock);
3694         retval = em28xx_init_dev(dev, udev, interface, nr);
3695         if (retval) {
3696                 goto err_free;
3697         }
3698
3699         if (usb_xfer_mode < 0) {
3700                 if (dev->board.is_webcam)
3701                         try_bulk = 1;
3702                 else
3703                         try_bulk = 0;
3704         } else {
3705                 try_bulk = usb_xfer_mode > 0;
3706         }
3707
3708         /* Disable V4L2 if the device doesn't have a decoder or image sensor */
3709         if (has_video &&
3710             dev->board.decoder == EM28XX_NODECODER &&
3711             dev->em28xx_sensor == EM28XX_NOSENSOR) {
3712
3713                 dev_err(&interface->dev,
3714                         "Currently, V4L2 is not supported on this model\n");
3715                 has_video = false;
3716                 dev->has_video = false;
3717         }
3718
3719         /* Select USB transfer types to use */
3720         if (has_video) {
3721                 if (!dev->analog_ep_isoc || (try_bulk && dev->analog_ep_bulk))
3722                         dev->analog_xfer_bulk = 1;
3723                 dev_err(&interface->dev, "analog set to %s mode.\n",
3724                         dev->analog_xfer_bulk ? "bulk" : "isoc");
3725         }
3726         if (has_dvb) {
3727                 if (!dev->dvb_ep_isoc || (try_bulk && dev->dvb_ep_bulk))
3728                         dev->dvb_xfer_bulk = 1;
3729                 dev_err(&interface->dev, "dvb set to %s mode.\n",
3730                         dev->dvb_xfer_bulk ? "bulk" : "isoc");
3731         }
3732
3733         kref_init(&dev->ref);
3734
3735         request_modules(dev);
3736
3737         /*
3738          * Do it at the end, to reduce dynamic configuration changes during
3739          * the device init. Yet, as request_modules() can be async, the
3740          * topology will likely change after the load of the em28xx subdrivers.
3741          */
3742 #ifdef CONFIG_MEDIA_CONTROLLER
3743         retval = media_device_register(dev->media_dev);
3744 #endif
3745
3746         return 0;
3747
3748 err_free:
3749         kfree(dev->alt_max_pkt_size_isoc);
3750         kfree(dev);
3751
3752 err:
3753         clear_bit(nr, em28xx_devused);
3754
3755 err_no_slot:
3756         usb_put_dev(udev);
3757         return retval;
3758 }
3759
3760 /*
3761  * em28xx_usb_disconnect()
3762  * called when the device gets disconnected
3763  * video device will be unregistered on v4l2_close in case it is still open
3764  */
3765 static void em28xx_usb_disconnect(struct usb_interface *interface)
3766 {
3767         struct em28xx *dev;
3768
3769         dev = usb_get_intfdata(interface);
3770         usb_set_intfdata(interface, NULL);
3771
3772         if (!dev)
3773                 return;
3774
3775         dev->disconnected = 1;
3776
3777         dev_err(&dev->intf->dev, "Disconnecting\n");
3778
3779         flush_request_modules(dev);
3780
3781         em28xx_close_extension(dev);
3782
3783         em28xx_release_resources(dev);
3784         kref_put(&dev->ref, em28xx_free_device);
3785 }
3786
3787 static int em28xx_usb_suspend(struct usb_interface *interface,
3788                               pm_message_t message)
3789 {
3790         struct em28xx *dev;
3791
3792         dev = usb_get_intfdata(interface);
3793         if (!dev)
3794                 return 0;
3795         em28xx_suspend_extension(dev);
3796         return 0;
3797 }
3798
3799 static int em28xx_usb_resume(struct usb_interface *interface)
3800 {
3801         struct em28xx *dev;
3802
3803         dev = usb_get_intfdata(interface);
3804         if (!dev)
3805                 return 0;
3806         em28xx_resume_extension(dev);
3807         return 0;
3808 }
3809
3810 static struct usb_driver em28xx_usb_driver = {
3811         .name = "em28xx",
3812         .probe = em28xx_usb_probe,
3813         .disconnect = em28xx_usb_disconnect,
3814         .suspend = em28xx_usb_suspend,
3815         .resume = em28xx_usb_resume,
3816         .reset_resume = em28xx_usb_resume,
3817         .id_table = em28xx_id_table,
3818 };
3819
3820 module_usb_driver(em28xx_usb_driver);