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