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