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