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