]>
Commit | Line | Data |
---|---|---|
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> | |
a6c2ba28 | 27 | #include <linux/delay.h> |
28 | #include <linux/i2c.h> | |
29 | #include <linux/usb.h> | |
30 | #include <media/tuner.h> | |
2474ed44 | 31 | #include <media/msp3400.h> |
c7c0b34c HV |
32 | #include <media/saa7115.h> |
33 | #include <media/tvp5150.h> | |
1f6173ed | 34 | #include <media/tveeprom.h> |
9bb13a6d | 35 | #include <media/v4l2-common.h> |
38f9d308 | 36 | #include <media/v4l2-chip-ident.h> |
a6c2ba28 | 37 | |
f7abcd38 | 38 | #include "em28xx.h" |
a6c2ba28 | 39 | |
03910cc3 MCC |
40 | static int tuner = -1; |
41 | module_param(tuner, int, 0444); | |
42 | MODULE_PARM_DESC(tuner, "tuner type"); | |
43 | ||
c8793b03 MCC |
44 | static unsigned int disable_ir; |
45 | module_param(disable_ir, int, 0444); | |
46 | MODULE_PARM_DESC(disable_ir, "disable infrared remote support"); | |
47 | ||
03910cc3 MCC |
48 | struct em28xx_hash_table { |
49 | unsigned long hash; | |
50 | unsigned int model; | |
51 | unsigned int tuner; | |
52 | }; | |
53 | ||
0ec202d1 MCC |
54 | /* |
55 | * Reset sequences for analog/digital modes | |
56 | */ | |
57 | ||
58 | /* Reset for the most [analog] boards */ | |
59 | static struct em28xx_reg_seq default_analog[] = { | |
60 | {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, | |
61 | { -1, -1, -1, -1}, | |
62 | }; | |
63 | ||
64 | /* Reset for the most [digital] boards */ | |
65 | static struct em28xx_reg_seq default_digital[] = { | |
66 | {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, | |
67 | { -1, -1, -1, -1}, | |
68 | }; | |
69 | ||
70 | /* Board Hauppauge WinTV HVR 900 analog */ | |
71 | static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = { | |
72 | {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10}, | |
73 | {0x05, 0xff, 0x10, 10}, | |
74 | { -1, -1, -1, -1}, | |
75 | }; | |
76 | ||
77 | /* Board Hauppauge WinTV HVR 900 digital */ | |
78 | static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = { | |
79 | {EM28XX_R08_GPIO, 0x2e, ~EM_GPIO_4, 10}, | |
80 | {EM2880_R04_GPO, 0x04, 0x0f, 10}, | |
81 | {EM2880_R04_GPO, 0x0c, 0x0f, 10}, | |
82 | { -1, -1, -1, -1}, | |
83 | }; | |
84 | ||
85 | /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ | |
86 | static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = { | |
87 | {EM28XX_R08_GPIO, 0x69, ~EM_GPIO_4, 10}, | |
88 | { -1, -1, -1, -1}, | |
89 | }; | |
90 | ||
91 | /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ | |
0ec202d1 MCC |
92 | |
93 | /* Board - EM2870 Kworld 355u | |
94 | Analog - No input analog */ | |
0ec202d1 MCC |
95 | |
96 | /* Callback for the most boards */ | |
97 | static struct em28xx_reg_seq default_callback[] = { | |
98 | {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, | |
99 | {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10}, | |
100 | {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, | |
101 | { -1, -1, -1, -1}, | |
102 | }; | |
103 | ||
104 | /* Pinnacle PCTV HD Mini (80e) GPIOs | |
105 | 0-5: not used | |
106 | 6: demod reset, active low | |
107 | 7: LED on, active high */ | |
108 | static struct em28xx_reg_seq em2874_pinnacle_80e_digital[] = { | |
109 | {EM28XX_R06_I2C_CLK, 0x45, 0xff, 10}, /*400 KHz*/ | |
110 | {EM2874_R80_GPIO, 0x80, 0xff, 100},/*Demod reset*/ | |
111 | {EM2874_R80_GPIO, 0xc0, 0xff, 10}, | |
112 | { -1, -1, -1, -1}, | |
113 | }; | |
114 | ||
115 | /* | |
116 | * Board definitions | |
117 | */ | |
3acf2809 | 118 | struct em28xx_board em28xx_boards[] = { |
95b86a9a DSL |
119 | [EM2750_BOARD_UNKNOWN] = { |
120 | .name = "Unknown EM2750/EM2751 webcam grabber", | |
a2070c66 | 121 | .xclk = EM28XX_XCLK_FREQUENCY_48MHZ, |
95b86a9a DSL |
122 | .input = { { |
123 | .type = EM28XX_VMUX_COMPOSITE1, | |
124 | .vmux = 0, | |
8a5caa6b | 125 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
126 | } }, |
127 | }, | |
596d92d5 MCC |
128 | [EM2800_BOARD_UNKNOWN] = { |
129 | .name = "Unknown EM2800 video grabber", | |
130 | .is_em2800 = 1, | |
596d92d5 | 131 | .tda9887_conf = TDA9887_PRESENT, |
ec5de990 | 132 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 133 | .input = { { |
3acf2809 | 134 | .type = EM28XX_VMUX_COMPOSITE1, |
c7c0b34c | 135 | .vmux = SAA7115_COMPOSITE0, |
8a5caa6b | 136 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 137 | }, { |
3acf2809 | 138 | .type = EM28XX_VMUX_SVIDEO, |
c7c0b34c | 139 | .vmux = SAA7115_SVIDEO3, |
8a5caa6b | 140 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 141 | } }, |
596d92d5 MCC |
142 | }, |
143 | [EM2820_BOARD_UNKNOWN] = { | |
a2070c66 MCC |
144 | .name = "Unknown EM2750/28xx video grabber", |
145 | .tuner_type = TUNER_ABSENT, | |
596d92d5 | 146 | }, |
95b86a9a DSL |
147 | [EM2750_BOARD_DLCW_130] = { |
148 | /* Beijing Huaqi Information Digital Technology Co., Ltd */ | |
149 | .name = "Huaqi DLCW-130", | |
150 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
a2070c66 | 151 | .xclk = EM28XX_XCLK_FREQUENCY_48MHZ, |
95b86a9a DSL |
152 | .input = { { |
153 | .type = EM28XX_VMUX_COMPOSITE1, | |
154 | .vmux = 0, | |
8a5caa6b | 155 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
156 | } }, |
157 | }, | |
4d17d083 | 158 | [EM2820_BOARD_KWORLD_PVRTV2800RF] = { |
33ccaa3f | 159 | .name = "Kworld PVR TV 2800 RF", |
ed086314 | 160 | .tuner_type = TUNER_TEMIC_PAL, |
4d17d083 | 161 | .tda9887_conf = TDA9887_PRESENT, |
ec5de990 | 162 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 163 | .input = { { |
4d17d083 | 164 | .type = EM28XX_VMUX_COMPOSITE1, |
c7c0b34c | 165 | .vmux = SAA7115_COMPOSITE0, |
8a5caa6b | 166 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 167 | }, { |
4d17d083 | 168 | .type = EM28XX_VMUX_SVIDEO, |
c7c0b34c | 169 | .vmux = SAA7115_SVIDEO3, |
8a5caa6b | 170 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 171 | } }, |
4d17d083 | 172 | }, |
a6c2ba28 | 173 | [EM2820_BOARD_TERRATEC_CINERGY_250] = { |
174 | .name = "Terratec Cinergy 250 USB", | |
a6c2ba28 | 175 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
176 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 177 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 178 | .input = { { |
3acf2809 | 179 | .type = EM28XX_VMUX_TELEVISION, |
c7c0b34c | 180 | .vmux = SAA7115_COMPOSITE2, |
8a5caa6b | 181 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 182 | }, { |
3acf2809 | 183 | .type = EM28XX_VMUX_COMPOSITE1, |
c7c0b34c | 184 | .vmux = SAA7115_COMPOSITE0, |
8a5caa6b | 185 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 186 | }, { |
3acf2809 | 187 | .type = EM28XX_VMUX_SVIDEO, |
c7c0b34c | 188 | .vmux = SAA7115_SVIDEO3, |
8a5caa6b | 189 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 190 | } }, |
a6c2ba28 | 191 | }, |
192 | [EM2820_BOARD_PINNACLE_USB_2] = { | |
193 | .name = "Pinnacle PCTV USB 2", | |
a6c2ba28 | 194 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
195 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 196 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 197 | .input = { { |
3acf2809 | 198 | .type = EM28XX_VMUX_TELEVISION, |
c7c0b34c | 199 | .vmux = SAA7115_COMPOSITE2, |
8a5caa6b | 200 | .amux = EM28XX_AMUX_VIDEO, |
c23f5949 | 201 | }, { |
3acf2809 | 202 | .type = EM28XX_VMUX_COMPOSITE1, |
c7c0b34c | 203 | .vmux = SAA7115_COMPOSITE0, |
8a5caa6b | 204 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 205 | }, { |
3acf2809 | 206 | .type = EM28XX_VMUX_SVIDEO, |
c7c0b34c | 207 | .vmux = SAA7115_SVIDEO3, |
8a5caa6b | 208 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 209 | } }, |
a6c2ba28 | 210 | }, |
211 | [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = { | |
212 | .name = "Hauppauge WinTV USB 2", | |
a6c2ba28 | 213 | .tuner_type = TUNER_PHILIPS_FM1236_MK3, |
c23f5949 MCC |
214 | .tda9887_conf = TDA9887_PRESENT | |
215 | TDA9887_PORT1_ACTIVE| | |
216 | TDA9887_PORT2_ACTIVE, | |
3acf2809 | 217 | .decoder = EM28XX_TVP5150, |
a6c2ba28 | 218 | .has_msp34xx = 1, |
d4d889e3 | 219 | .input = { { |
3acf2809 | 220 | .type = EM28XX_VMUX_TELEVISION, |
c7c0b34c | 221 | .vmux = TVP5150_COMPOSITE0, |
2474ed44 | 222 | .amux = MSP_INPUT_DEFAULT, |
c23f5949 | 223 | }, { |
3acf2809 | 224 | .type = EM28XX_VMUX_SVIDEO, |
c7c0b34c | 225 | .vmux = TVP5150_SVIDEO, |
07151724 HV |
226 | .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, |
227 | MSP_DSP_IN_SCART, MSP_DSP_IN_SCART), | |
c23f5949 | 228 | } }, |
a6c2ba28 | 229 | }, |
95b86a9a DSL |
230 | [EM2820_BOARD_DLINK_USB_TV] = { |
231 | .name = "D-Link DUB-T210 TV Tuner", | |
232 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
233 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
234 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 235 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 236 | .input = { { |
95b86a9a DSL |
237 | .type = EM28XX_VMUX_TELEVISION, |
238 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 239 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
240 | }, { |
241 | .type = EM28XX_VMUX_COMPOSITE1, | |
242 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 243 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
244 | }, { |
245 | .type = EM28XX_VMUX_SVIDEO, | |
246 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 247 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
248 | } }, |
249 | }, | |
250 | [EM2820_BOARD_HERCULES_SMART_TV_USB2] = { | |
251 | .name = "Hercules Smart TV USB 2.0", | |
252 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
253 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
254 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 255 | .decoder = EM28XX_SAA711X, |
95b86a9a DSL |
256 | .input = { { |
257 | .type = EM28XX_VMUX_TELEVISION, | |
258 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 259 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
260 | }, { |
261 | .type = EM28XX_VMUX_COMPOSITE1, | |
262 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 263 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
264 | }, { |
265 | .type = EM28XX_VMUX_SVIDEO, | |
266 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 267 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
268 | } }, |
269 | }, | |
270 | [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = { | |
271 | .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)", | |
272 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
273 | .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, |
274 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 275 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 276 | .input = { { |
95b86a9a DSL |
277 | .type = EM28XX_VMUX_TELEVISION, |
278 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 279 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
280 | }, { |
281 | .type = EM28XX_VMUX_COMPOSITE1, | |
282 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 283 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
284 | }, { |
285 | .type = EM28XX_VMUX_SVIDEO, | |
286 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 287 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
288 | } }, |
289 | }, | |
290 | [EM2820_BOARD_GADMEI_UTV310] = { | |
291 | .name = "Gadmei UTV310", | |
292 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
293 | .tuner_type = TUNER_TNF_5335MF, |
294 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 295 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 296 | .input = { { |
95b86a9a DSL |
297 | .type = EM28XX_VMUX_TELEVISION, |
298 | .vmux = SAA7115_COMPOSITE1, | |
8a5caa6b | 299 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
300 | }, { |
301 | .type = EM28XX_VMUX_COMPOSITE1, | |
302 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 303 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
304 | }, { |
305 | .type = EM28XX_VMUX_SVIDEO, | |
306 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 307 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
308 | } }, |
309 | }, | |
310 | [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = { | |
311 | .name = "Leadtek Winfast USB II Deluxe", | |
312 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
313 | .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, |
314 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 315 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 316 | .input = { { |
95b86a9a DSL |
317 | .type = EM28XX_VMUX_TELEVISION, |
318 | .vmux = 2, | |
8a5caa6b | 319 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
320 | }, { |
321 | .type = EM28XX_VMUX_COMPOSITE1, | |
322 | .vmux = 0, | |
8a5caa6b | 323 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
324 | }, { |
325 | .type = EM28XX_VMUX_SVIDEO, | |
326 | .vmux = 9, | |
8a5caa6b | 327 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
328 | } }, |
329 | }, | |
330 | [EM2820_BOARD_PINNACLE_DVC_100] = { | |
331 | .name = "Pinnacle Dazzle DVC 100", | |
332 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
ec5de990 | 333 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 334 | .input = { { |
95b86a9a DSL |
335 | .type = EM28XX_VMUX_COMPOSITE1, |
336 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 337 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
338 | }, { |
339 | .type = EM28XX_VMUX_SVIDEO, | |
340 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 341 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
342 | } }, |
343 | }, | |
344 | [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = { | |
d4d889e3 | 345 | .name = "Videology 20K14XUSB USB2.0", |
95b86a9a | 346 | .valid = EM28XX_BOARD_NOT_VALIDATED, |
d4d889e3 | 347 | .input = { { |
95b86a9a DSL |
348 | .type = EM28XX_VMUX_COMPOSITE1, |
349 | .vmux = 0, | |
8a5caa6b | 350 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
351 | } }, |
352 | }, | |
353 | [EM2821_BOARD_PROLINK_PLAYTV_USB2] = { | |
354 | .name = "SIIG AVTuner-PVR/Prolink PlayTV USB 2.0", | |
355 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
356 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, /* unknown? */ |
357 | .tda9887_conf = TDA9887_PRESENT, /* unknown? */ | |
ec5de990 | 358 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 359 | .input = { { |
95b86a9a DSL |
360 | .type = EM28XX_VMUX_TELEVISION, |
361 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 362 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
363 | }, { |
364 | .type = EM28XX_VMUX_COMPOSITE1, | |
365 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 366 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
367 | }, { |
368 | .type = EM28XX_VMUX_SVIDEO, | |
369 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 370 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
371 | } }, |
372 | }, | |
373 | [EM2821_BOARD_SUPERCOMP_USB_2] = { | |
374 | .name = "Supercomp USB 2.0 TV", | |
375 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
376 | .tuner_type = TUNER_PHILIPS_FM1236_MK3, |
377 | .tda9887_conf = TDA9887_PRESENT | | |
378 | TDA9887_PORT1_ACTIVE | | |
379 | TDA9887_PORT2_ACTIVE, | |
ec5de990 | 380 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 381 | .input = { { |
95b86a9a DSL |
382 | .type = EM28XX_VMUX_TELEVISION, |
383 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 384 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
385 | }, { |
386 | .type = EM28XX_VMUX_COMPOSITE1, | |
387 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 388 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
389 | }, { |
390 | .type = EM28XX_VMUX_SVIDEO, | |
391 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 392 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
393 | } }, |
394 | }, | |
395 | [EM2821_BOARD_USBGEAR_VD204] = { | |
d4d889e3 | 396 | .name = "Usbgear VD204v9", |
95b86a9a | 397 | .valid = EM28XX_BOARD_NOT_VALIDATED, |
ec5de990 | 398 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 399 | .input = { { |
95b86a9a DSL |
400 | .type = EM28XX_VMUX_COMPOSITE1, |
401 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 402 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
403 | }, { |
404 | .type = EM28XX_VMUX_SVIDEO, | |
405 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 406 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
407 | } }, |
408 | }, | |
409 | [EM2860_BOARD_NETGMBH_CAM] = { | |
410 | /* Beijing Huaqi Information Digital Technology Co., Ltd */ | |
d4d889e3 MCC |
411 | .name = "NetGMBH Cam", |
412 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
413 | .input = { { | |
95b86a9a DSL |
414 | .type = EM28XX_VMUX_COMPOSITE1, |
415 | .vmux = 0, | |
8a5caa6b | 416 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
417 | } }, |
418 | }, | |
419 | [EM2860_BOARD_TYPHOON_DVD_MAKER] = { | |
d4d889e3 | 420 | .name = "Typhoon DVD Maker", |
95b86a9a | 421 | .valid = EM28XX_BOARD_NOT_VALIDATED, |
ec5de990 | 422 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 423 | .input = { { |
95b86a9a DSL |
424 | .type = EM28XX_VMUX_COMPOSITE1, |
425 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 426 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
427 | }, { |
428 | .type = EM28XX_VMUX_SVIDEO, | |
429 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 430 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
431 | } }, |
432 | }, | |
433 | [EM2860_BOARD_GADMEI_UTV330] = { | |
434 | .name = "Gadmei UTV330", | |
435 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a | 436 | .tuner_type = TUNER_TNF_5335MF, |
122d1588 | 437 | .tda9887_conf = TDA9887_PRESENT, |
ec5de990 | 438 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 439 | .input = { { |
95b86a9a DSL |
440 | .type = EM28XX_VMUX_TELEVISION, |
441 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 442 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
443 | }, { |
444 | .type = EM28XX_VMUX_COMPOSITE1, | |
445 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 446 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
447 | }, { |
448 | .type = EM28XX_VMUX_SVIDEO, | |
449 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 450 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
451 | } }, |
452 | }, | |
453 | [EM2860_BOARD_TERRATEC_HYBRID_XS] = { | |
454 | .name = "Terratec Cinergy A Hybrid XS", | |
455 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
122d1588 | 456 | .tuner_type = TUNER_XC2028, |
122d1588 | 457 | .decoder = EM28XX_TVP5150, |
d4d889e3 | 458 | .input = { { |
122d1588 AT |
459 | .type = EM28XX_VMUX_TELEVISION, |
460 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 461 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 462 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 463 | }, { |
122d1588 AT |
464 | .type = EM28XX_VMUX_COMPOSITE1, |
465 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 466 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 467 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 468 | }, { |
122d1588 AT |
469 | .type = EM28XX_VMUX_SVIDEO, |
470 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 471 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 472 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 473 | } }, |
122d1588 | 474 | }, |
95b86a9a DSL |
475 | [EM2861_BOARD_KWORLD_PVRTV_300U] = { |
476 | .name = "KWorld PVRTV 300U", | |
477 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
17d9d558 | 478 | .tuner_type = TUNER_XC2028, |
17d9d558 | 479 | .decoder = EM28XX_TVP5150, |
d4d889e3 | 480 | .input = { { |
17d9d558 DH |
481 | .type = EM28XX_VMUX_TELEVISION, |
482 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 483 | .amux = EM28XX_AMUX_VIDEO, |
17d9d558 DH |
484 | }, { |
485 | .type = EM28XX_VMUX_COMPOSITE1, | |
486 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 487 | .amux = EM28XX_AMUX_LINE_IN, |
17d9d558 DH |
488 | }, { |
489 | .type = EM28XX_VMUX_SVIDEO, | |
490 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 491 | .amux = EM28XX_AMUX_LINE_IN, |
17d9d558 DH |
492 | } }, |
493 | }, | |
95b86a9a DSL |
494 | [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = { |
495 | .name = "Yakumo MovieMixer", | |
d4d889e3 | 496 | .valid = EM28XX_BOARD_NOT_VALIDATED, |
95b86a9a DSL |
497 | .decoder = EM28XX_TVP5150, |
498 | .input = { { | |
12466577 MCC |
499 | .type = EM28XX_VMUX_TELEVISION, |
500 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 501 | .amux = EM28XX_AMUX_VIDEO, |
c23f5949 | 502 | }, { |
7d070e26 MCC |
503 | .type = EM28XX_VMUX_COMPOSITE1, |
504 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 505 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 506 | }, { |
12466577 MCC |
507 | .type = EM28XX_VMUX_SVIDEO, |
508 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 509 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 510 | } }, |
12466577 | 511 | }, |
95b86a9a DSL |
512 | [EM2861_BOARD_PLEXTOR_PX_TV100U] = { |
513 | .name = "Plextor ConvertX PX-TV100U", | |
514 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
515 | .tuner_type = TUNER_TNF_5335MF, |
516 | .tda9887_conf = TDA9887_PRESENT, | |
517 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 518 | .input = { { |
4fd305b2 DH |
519 | .type = EM28XX_VMUX_TELEVISION, |
520 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 521 | .amux = EM28XX_AMUX_LINE_IN, |
4fd305b2 DH |
522 | }, { |
523 | .type = EM28XX_VMUX_COMPOSITE1, | |
524 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 525 | .amux = EM28XX_AMUX_LINE_IN, |
4fd305b2 DH |
526 | }, { |
527 | .type = EM28XX_VMUX_SVIDEO, | |
528 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 529 | .amux = EM28XX_AMUX_LINE_IN, |
4fd305b2 DH |
530 | } }, |
531 | }, | |
95b86a9a DSL |
532 | [EM2870_BOARD_TERRATEC_XS] = { |
533 | .name = "Terratec Cinergy T XS", | |
534 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
535 | .tuner_type = TUNER_XC2028, | |
536 | }, | |
537 | [EM2870_BOARD_TERRATEC_XS_MT2060] = { | |
538 | .name = "Terratec Cinergy T XS (MT2060)", | |
539 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
540 | .tuner_type = TUNER_ABSENT, /* MT2060 */ | |
541 | }, | |
542 | [EM2870_BOARD_KWORLD_350U] = { | |
543 | .name = "Kworld 350 U DVB-T", | |
544 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
545 | .tuner_type = TUNER_XC2028, | |
546 | }, | |
547 | [EM2870_BOARD_KWORLD_355U] = { | |
548 | .name = "Kworld 355 U DVB-T", | |
549 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
550 | }, | |
551 | [EM2870_BOARD_PINNACLE_PCTV_DVB] = { | |
552 | .name = "Pinnacle PCTV DVB-T", | |
553 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
554 | .tuner_type = TUNER_ABSENT, /* MT2060 */ | |
a2070c66 MCC |
555 | /* djh - I have serious doubts this is right... */ |
556 | .xclk = EM28XX_XCLK_IR_RC5_MODE | | |
557 | EM28XX_XCLK_FREQUENCY_10MHZ, | |
95b86a9a DSL |
558 | }, |
559 | [EM2870_BOARD_COMPRO_VIDEOMATE] = { | |
560 | .name = "Compro, VideoMate U3", | |
561 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
562 | .tuner_type = TUNER_ABSENT, /* MT2060 */ | |
563 | }, | |
564 | [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = { | |
565 | .name = "Terratec Hybrid XS Secam", | |
566 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
567 | .has_msp34xx = 1, |
568 | .tuner_type = TUNER_XC2028, | |
569 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 570 | .input = { { |
e14b3658 DH |
571 | .type = EM28XX_VMUX_TELEVISION, |
572 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 573 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 574 | .gpio = default_analog, |
e14b3658 DH |
575 | }, { |
576 | .type = EM28XX_VMUX_COMPOSITE1, | |
577 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 578 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 579 | .gpio = default_analog, |
e14b3658 DH |
580 | }, { |
581 | .type = EM28XX_VMUX_SVIDEO, | |
582 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 583 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 584 | .gpio = default_analog, |
e14b3658 DH |
585 | } }, |
586 | }, | |
95b86a9a DSL |
587 | [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = { |
588 | .name = "Hauppauge WinTV HVR 900", | |
95b86a9a DSL |
589 | .tda9887_conf = TDA9887_PRESENT, |
590 | .tuner_type = TUNER_XC2028, | |
591 | .mts_firmware = 1, | |
a2070c66 | 592 | .has_dvb = 1, |
122b77e5 | 593 | .dvb_gpio = hauppauge_wintv_hvr_900_digital, |
95b86a9a | 594 | .decoder = EM28XX_TVP5150, |
d4d889e3 | 595 | .input = { { |
95b86a9a DSL |
596 | .type = EM28XX_VMUX_TELEVISION, |
597 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 598 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 599 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
600 | }, { |
601 | .type = EM28XX_VMUX_COMPOSITE1, | |
602 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 603 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 604 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
605 | }, { |
606 | .type = EM28XX_VMUX_SVIDEO, | |
607 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 608 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 609 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
610 | } }, |
611 | }, | |
612 | [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = { | |
613 | .name = "Hauppauge WinTV HVR 900 (R2)", | |
95b86a9a DSL |
614 | .tda9887_conf = TDA9887_PRESENT, |
615 | .tuner_type = TUNER_XC2028, | |
616 | .mts_firmware = 1, | |
617 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 618 | .input = { { |
95b86a9a DSL |
619 | .type = EM28XX_VMUX_TELEVISION, |
620 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 621 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 622 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
623 | }, { |
624 | .type = EM28XX_VMUX_COMPOSITE1, | |
625 | .vmux = TVP5150_COMPOSITE1, | |
db98fb8b | 626 | .amux = 3, |
122b77e5 | 627 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
628 | }, { |
629 | .type = EM28XX_VMUX_SVIDEO, | |
630 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 631 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 632 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
633 | } }, |
634 | }, | |
10ac6603 | 635 | [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = { |
95b86a9a | 636 | .name = "Hauppauge WinTV HVR 950", |
95b86a9a DSL |
637 | .tuner_type = TUNER_XC2028, |
638 | .mts_firmware = 1, | |
95b86a9a | 639 | .has_dvb = 1, |
122b77e5 | 640 | .dvb_gpio = hauppauge_wintv_hvr_900_digital, |
4b92253a | 641 | .ir_codes = ir_codes_hauppauge_new, |
95b86a9a DSL |
642 | .decoder = EM28XX_TVP5150, |
643 | .input = { { | |
644 | .type = EM28XX_VMUX_TELEVISION, | |
645 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 646 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 647 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
648 | }, { |
649 | .type = EM28XX_VMUX_COMPOSITE1, | |
650 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 651 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 652 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
653 | }, { |
654 | .type = EM28XX_VMUX_SVIDEO, | |
655 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 656 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 657 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
658 | } }, |
659 | }, | |
660 | [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = { | |
661 | .name = "Pinnacle PCTV HD Pro Stick", | |
95b86a9a DSL |
662 | .tuner_type = TUNER_XC2028, |
663 | .mts_firmware = 1, | |
95b86a9a | 664 | .has_dvb = 1, |
122b77e5 | 665 | .dvb_gpio = hauppauge_wintv_hvr_900_digital, |
4b92253a | 666 | .ir_codes = ir_codes_pinnacle_pctv_hd, |
95b86a9a DSL |
667 | .decoder = EM28XX_TVP5150, |
668 | .input = { { | |
669 | .type = EM28XX_VMUX_TELEVISION, | |
670 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 671 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 672 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
673 | }, { |
674 | .type = EM28XX_VMUX_COMPOSITE1, | |
675 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 676 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 677 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
678 | }, { |
679 | .type = EM28XX_VMUX_SVIDEO, | |
680 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 681 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 682 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
683 | } }, |
684 | }, | |
685 | [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = { | |
686 | .name = "AMD ATI TV Wonder HD 600", | |
95b86a9a DSL |
687 | .tuner_type = TUNER_XC2028, |
688 | .mts_firmware = 1, | |
95b86a9a | 689 | .has_dvb = 1, |
122b77e5 | 690 | .dvb_gpio = hauppauge_wintv_hvr_900_digital, |
60245e85 | 691 | .ir_codes = ir_codes_ati_tv_wonder_hd_600, |
95b86a9a DSL |
692 | .decoder = EM28XX_TVP5150, |
693 | .input = { { | |
694 | .type = EM28XX_VMUX_TELEVISION, | |
695 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 696 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 697 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
698 | }, { |
699 | .type = EM28XX_VMUX_COMPOSITE1, | |
700 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 701 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 702 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
703 | }, { |
704 | .type = EM28XX_VMUX_SVIDEO, | |
705 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 706 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 707 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
708 | } }, |
709 | }, | |
710 | [EM2880_BOARD_TERRATEC_HYBRID_XS] = { | |
d4d889e3 MCC |
711 | .name = "Terratec Hybrid XS", |
712 | .tuner_type = TUNER_XC2028, | |
713 | .decoder = EM28XX_TVP5150, | |
95b86a9a | 714 | .has_dvb = 1, |
122b77e5 | 715 | .dvb_gpio = default_analog, |
95b86a9a DSL |
716 | .input = { { |
717 | .type = EM28XX_VMUX_TELEVISION, | |
718 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 719 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 720 | .gpio = default_analog, |
95b86a9a DSL |
721 | }, { |
722 | .type = EM28XX_VMUX_COMPOSITE1, | |
723 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 724 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 725 | .gpio = default_analog, |
95b86a9a DSL |
726 | }, { |
727 | .type = EM28XX_VMUX_SVIDEO, | |
728 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 729 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 730 | .gpio = default_analog, |
95b86a9a DSL |
731 | } }, |
732 | }, | |
733 | /* maybe there's a reason behind it why Terratec sells the Hybrid XS | |
734 | as Prodigy XS with a different PID, let's keep it separated for now | |
735 | maybe we'll need it lateron */ | |
736 | [EM2880_BOARD_TERRATEC_PRODIGY_XS] = { | |
737 | .name = "Terratec Prodigy XS", | |
95b86a9a DSL |
738 | .tuner_type = TUNER_XC2028, |
739 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 740 | .input = { { |
95b86a9a DSL |
741 | .type = EM28XX_VMUX_TELEVISION, |
742 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 743 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 744 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
745 | }, { |
746 | .type = EM28XX_VMUX_COMPOSITE1, | |
747 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 748 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 749 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
750 | }, { |
751 | .type = EM28XX_VMUX_SVIDEO, | |
752 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 753 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 754 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a DSL |
755 | } }, |
756 | }, | |
757 | [EM2820_BOARD_MSI_VOX_USB_2] = { | |
758 | .name = "MSI VOX USB 2.0", | |
95b86a9a DSL |
759 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
760 | .tda9887_conf = TDA9887_PRESENT | | |
761 | TDA9887_PORT1_ACTIVE | | |
762 | TDA9887_PORT2_ACTIVE, | |
763 | .max_range_640_480 = 1, | |
ec5de990 | 764 | .decoder = EM28XX_SAA711X, |
95b86a9a DSL |
765 | .input = { { |
766 | .type = EM28XX_VMUX_TELEVISION, | |
767 | .vmux = SAA7115_COMPOSITE4, | |
8a5caa6b | 768 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
769 | }, { |
770 | .type = EM28XX_VMUX_COMPOSITE1, | |
771 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 772 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
773 | }, { |
774 | .type = EM28XX_VMUX_SVIDEO, | |
775 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 776 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
777 | } }, |
778 | }, | |
779 | [EM2800_BOARD_TERRATEC_CINERGY_200] = { | |
780 | .name = "Terratec Cinergy 200 USB", | |
781 | .is_em2800 = 1, | |
95b86a9a DSL |
782 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
783 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 784 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 785 | .input = { { |
95b86a9a DSL |
786 | .type = EM28XX_VMUX_TELEVISION, |
787 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 788 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
789 | }, { |
790 | .type = EM28XX_VMUX_COMPOSITE1, | |
791 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 792 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
793 | }, { |
794 | .type = EM28XX_VMUX_SVIDEO, | |
795 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 796 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
797 | } }, |
798 | }, | |
799 | [EM2800_BOARD_GRABBEEX_USB2800] = { | |
800 | .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder", | |
801 | .is_em2800 = 1, | |
ec5de990 | 802 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 803 | .input = { { |
95b86a9a DSL |
804 | .type = EM28XX_VMUX_COMPOSITE1, |
805 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 806 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
807 | }, { |
808 | .type = EM28XX_VMUX_SVIDEO, | |
809 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 810 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
811 | } }, |
812 | }, | |
813 | [EM2800_BOARD_LEADTEK_WINFAST_USBII] = { | |
814 | .name = "Leadtek Winfast USB II", | |
815 | .is_em2800 = 1, | |
95b86a9a DSL |
816 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
817 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 818 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 819 | .input = { { |
95b86a9a DSL |
820 | .type = EM28XX_VMUX_TELEVISION, |
821 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 822 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
823 | }, { |
824 | .type = EM28XX_VMUX_COMPOSITE1, | |
825 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 826 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
827 | }, { |
828 | .type = EM28XX_VMUX_SVIDEO, | |
829 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 830 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
831 | } }, |
832 | }, | |
833 | [EM2800_BOARD_KWORLD_USB2800] = { | |
834 | .name = "Kworld USB2800", | |
835 | .is_em2800 = 1, | |
95b86a9a DSL |
836 | .tuner_type = TUNER_PHILIPS_FCV1236D, |
837 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 838 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 839 | .input = { { |
95b86a9a DSL |
840 | .type = EM28XX_VMUX_TELEVISION, |
841 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 842 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
843 | }, { |
844 | .type = EM28XX_VMUX_COMPOSITE1, | |
845 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 846 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
847 | }, { |
848 | .type = EM28XX_VMUX_SVIDEO, | |
849 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 850 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
851 | } }, |
852 | }, | |
853 | [EM2820_BOARD_PINNACLE_DVC_90] = { | |
854 | .name = "Pinnacle Dazzle DVC 90/DVC 100", | |
95b86a9a | 855 | .tuner_type = TUNER_ABSENT, |
ec5de990 | 856 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 857 | .input = { { |
95b86a9a DSL |
858 | .type = EM28XX_VMUX_COMPOSITE1, |
859 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 860 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
861 | }, { |
862 | .type = EM28XX_VMUX_SVIDEO, | |
863 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 864 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
865 | } }, |
866 | }, | |
867 | [EM2800_BOARD_VGEAR_POCKETTV] = { | |
868 | .name = "V-Gear PocketTV", | |
869 | .is_em2800 = 1, | |
95b86a9a DSL |
870 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
871 | .tda9887_conf = TDA9887_PRESENT, | |
ec5de990 | 872 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 873 | .input = { { |
95b86a9a DSL |
874 | .type = EM28XX_VMUX_TELEVISION, |
875 | .vmux = SAA7115_COMPOSITE2, | |
8a5caa6b | 876 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
877 | }, { |
878 | .type = EM28XX_VMUX_COMPOSITE1, | |
879 | .vmux = SAA7115_COMPOSITE0, | |
8a5caa6b | 880 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
881 | }, { |
882 | .type = EM28XX_VMUX_SVIDEO, | |
883 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 884 | .amux = EM28XX_AMUX_LINE_IN, |
95b86a9a DSL |
885 | } }, |
886 | }, | |
887 | [EM2820_BOARD_PROLINK_PLAYTV_USB2] = { | |
888 | .name = "Pixelview Prolink PlayTV USB 2.0", | |
95b86a9a DSL |
889 | .tda9887_conf = TDA9887_PRESENT, |
890 | .tuner_type = TUNER_YMEC_TVF_5533MF, | |
ec5de990 | 891 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 892 | .input = { { |
95b86a9a DSL |
893 | .type = EM28XX_VMUX_TELEVISION, |
894 | .vmux = SAA7115_COMPOSITE2, | |
30e4ac7c MCC |
895 | .amux = EM28XX_AMUX_VIDEO, |
896 | .aout = EM28XX_AOUT_MONO | /* I2S */ | |
897 | EM28XX_AOUT_MASTER, /* Line out pin */ | |
95b86a9a DSL |
898 | }, { |
899 | .type = EM28XX_VMUX_COMPOSITE1, | |
900 | .vmux = SAA7115_COMPOSITE0, | |
901 | .amux = EM28XX_AMUX_LINE_IN, | |
902 | }, { | |
903 | .type = EM28XX_VMUX_SVIDEO, | |
904 | .vmux = SAA7115_SVIDEO3, | |
905 | .amux = EM28XX_AMUX_LINE_IN, | |
906 | } }, | |
907 | }, | |
908 | [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = { | |
d4d889e3 | 909 | .name = "PointNix Intra-Oral Camera", |
95b86a9a | 910 | .has_snapshot_button = 1, |
d4d889e3 MCC |
911 | .tda9887_conf = TDA9887_PRESENT, |
912 | .tuner_type = TUNER_ABSENT, | |
ec5de990 | 913 | .decoder = EM28XX_SAA711X, |
d4d889e3 | 914 | .input = { { |
95b86a9a DSL |
915 | .type = EM28XX_VMUX_SVIDEO, |
916 | .vmux = SAA7115_SVIDEO3, | |
8a5caa6b | 917 | .amux = EM28XX_AMUX_VIDEO, |
95b86a9a DSL |
918 | } }, |
919 | }, | |
920 | [EM2880_BOARD_MSI_DIGIVOX_AD] = { | |
921 | .name = "MSI DigiVox A/D", | |
922 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
923 | .tuner_type = TUNER_XC2028, |
924 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 925 | .input = { { |
95b86a9a DSL |
926 | .type = EM28XX_VMUX_TELEVISION, |
927 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 928 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 929 | .gpio = em2880_msi_digivox_ad_analog, |
95b86a9a DSL |
930 | }, { |
931 | .type = EM28XX_VMUX_COMPOSITE1, | |
932 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 933 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 934 | .gpio = em2880_msi_digivox_ad_analog, |
95b86a9a DSL |
935 | }, { |
936 | .type = EM28XX_VMUX_SVIDEO, | |
937 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 938 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 939 | .gpio = em2880_msi_digivox_ad_analog, |
95b86a9a DSL |
940 | } }, |
941 | }, | |
942 | [EM2880_BOARD_MSI_DIGIVOX_AD_II] = { | |
943 | .name = "MSI DigiVox A/D II", | |
944 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
945 | .tuner_type = TUNER_XC2028, |
946 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 947 | .input = { { |
e14b3658 DH |
948 | .type = EM28XX_VMUX_TELEVISION, |
949 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 950 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 951 | .gpio = em2880_msi_digivox_ad_analog, |
e14b3658 DH |
952 | }, { |
953 | .type = EM28XX_VMUX_COMPOSITE1, | |
954 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 955 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 956 | .gpio = em2880_msi_digivox_ad_analog, |
e14b3658 DH |
957 | }, { |
958 | .type = EM28XX_VMUX_SVIDEO, | |
959 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 960 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 961 | .gpio = em2880_msi_digivox_ad_analog, |
e14b3658 DH |
962 | } }, |
963 | }, | |
95b86a9a DSL |
964 | [EM2880_BOARD_KWORLD_DVB_305U] = { |
965 | .name = "KWorld DVB-T 305U", | |
966 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
12466577 MCC |
967 | .tuner_type = TUNER_XC2028, |
968 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 969 | .input = { { |
12466577 MCC |
970 | .type = EM28XX_VMUX_TELEVISION, |
971 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 972 | .amux = EM28XX_AMUX_VIDEO, |
c23f5949 | 973 | }, { |
12466577 MCC |
974 | .type = EM28XX_VMUX_COMPOSITE1, |
975 | .vmux = TVP5150_COMPOSITE1, | |
8a5caa6b | 976 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 977 | }, { |
12466577 MCC |
978 | .type = EM28XX_VMUX_SVIDEO, |
979 | .vmux = TVP5150_SVIDEO, | |
8a5caa6b | 980 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 981 | } }, |
12466577 | 982 | }, |
95b86a9a DSL |
983 | [EM2880_BOARD_KWORLD_DVB_310U] = { |
984 | .name = "KWorld DVB-T 310U", | |
12466577 | 985 | .tuner_type = TUNER_XC2028, |
da3808e1 | 986 | .has_dvb = 1, |
122b77e5 | 987 | .dvb_gpio = default_digital, |
da3808e1 | 988 | .mts_firmware = 1, |
12466577 | 989 | .decoder = EM28XX_TVP5150, |
d4d889e3 | 990 | .input = { { |
12466577 MCC |
991 | .type = EM28XX_VMUX_TELEVISION, |
992 | .vmux = TVP5150_COMPOSITE0, | |
da3808e1 | 993 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 994 | .gpio = default_analog, |
c23f5949 | 995 | }, { |
12466577 MCC |
996 | .type = EM28XX_VMUX_COMPOSITE1, |
997 | .vmux = TVP5150_COMPOSITE1, | |
a42aa191 | 998 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 999 | .gpio = default_analog, |
da3808e1 | 1000 | }, { /* S-video has not been tested yet */ |
12466577 MCC |
1001 | .type = EM28XX_VMUX_SVIDEO, |
1002 | .vmux = TVP5150_SVIDEO, | |
a42aa191 | 1003 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1004 | .gpio = default_analog, |
c23f5949 | 1005 | } }, |
12466577 | 1006 | }, |
95b86a9a DSL |
1007 | [EM2881_BOARD_DNT_DA2_HYBRID] = { |
1008 | .name = "DNT DA2 Hybrid", | |
1009 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
1010 | .tuner_type = TUNER_XC2028, |
1011 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 1012 | .input = { { |
3acf2809 | 1013 | .type = EM28XX_VMUX_TELEVISION, |
95b86a9a | 1014 | .vmux = TVP5150_COMPOSITE0, |
8a5caa6b | 1015 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 1016 | .gpio = default_analog, |
c23f5949 | 1017 | }, { |
3acf2809 | 1018 | .type = EM28XX_VMUX_COMPOSITE1, |
95b86a9a | 1019 | .vmux = TVP5150_COMPOSITE1, |
8a5caa6b | 1020 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1021 | .gpio = default_analog, |
c23f5949 | 1022 | }, { |
3acf2809 | 1023 | .type = EM28XX_VMUX_SVIDEO, |
95b86a9a | 1024 | .vmux = TVP5150_SVIDEO, |
8a5caa6b | 1025 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1026 | .gpio = default_analog, |
c23f5949 | 1027 | } }, |
596d92d5 | 1028 | }, |
95b86a9a DSL |
1029 | [EM2881_BOARD_PINNACLE_HYBRID_PRO] = { |
1030 | .name = "Pinnacle Hybrid Pro", | |
1031 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
1032 | .tuner_type = TUNER_XC2028, |
1033 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 1034 | .input = { { |
95b86a9a DSL |
1035 | .type = EM28XX_VMUX_TELEVISION, |
1036 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 1037 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 1038 | .gpio = default_analog, |
95b86a9a | 1039 | }, { |
59d07f1b | 1040 | .type = EM28XX_VMUX_COMPOSITE1, |
95b86a9a | 1041 | .vmux = TVP5150_COMPOSITE1, |
8a5caa6b | 1042 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1043 | .gpio = default_analog, |
59d07f1b AS |
1044 | }, { |
1045 | .type = EM28XX_VMUX_SVIDEO, | |
95b86a9a | 1046 | .vmux = TVP5150_SVIDEO, |
8a5caa6b | 1047 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1048 | .gpio = default_analog, |
59d07f1b AS |
1049 | } }, |
1050 | }, | |
95b86a9a DSL |
1051 | [EM2882_BOARD_PINNACLE_HYBRID_PRO] = { |
1052 | .name = "Pinnacle Hybrid Pro (2)", | |
1053 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a | 1054 | .tuner_type = TUNER_XC2028, |
a674a3b4 | 1055 | .mts_firmware = 1, |
95b86a9a | 1056 | .decoder = EM28XX_TVP5150, |
d4d889e3 | 1057 | .input = { { |
3acf2809 | 1058 | .type = EM28XX_VMUX_TELEVISION, |
95b86a9a | 1059 | .vmux = TVP5150_COMPOSITE0, |
8a5caa6b | 1060 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 1061 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1062 | }, { |
3acf2809 | 1063 | .type = EM28XX_VMUX_COMPOSITE1, |
95b86a9a | 1064 | .vmux = TVP5150_COMPOSITE1, |
8a5caa6b | 1065 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1066 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1067 | }, { |
3acf2809 | 1068 | .type = EM28XX_VMUX_SVIDEO, |
95b86a9a | 1069 | .vmux = TVP5150_SVIDEO, |
8a5caa6b | 1070 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1071 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1072 | } }, |
596d92d5 | 1073 | }, |
95b86a9a DSL |
1074 | [EM2882_BOARD_KWORLD_VS_DVBT] = { |
1075 | .name = "Kworld VS-DVB-T 323UR", | |
1076 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
1077 | .tuner_type = TUNER_XC2028, |
1078 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 1079 | .input = { { |
3acf2809 | 1080 | .type = EM28XX_VMUX_TELEVISION, |
95b86a9a | 1081 | .vmux = TVP5150_COMPOSITE0, |
8a5caa6b | 1082 | .amux = EM28XX_AMUX_VIDEO, |
c23f5949 | 1083 | }, { |
3acf2809 | 1084 | .type = EM28XX_VMUX_COMPOSITE1, |
95b86a9a | 1085 | .vmux = TVP5150_COMPOSITE1, |
8a5caa6b | 1086 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 1087 | }, { |
3acf2809 | 1088 | .type = EM28XX_VMUX_SVIDEO, |
95b86a9a | 1089 | .vmux = TVP5150_SVIDEO, |
8a5caa6b | 1090 | .amux = EM28XX_AMUX_LINE_IN, |
c23f5949 | 1091 | } }, |
596d92d5 | 1092 | }, |
95b86a9a DSL |
1093 | [EM2882_BOARD_TERRATEC_HYBRID_XS] = { |
1094 | .name = "Terratec Hybrid XS (em2882)", | |
1095 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
1096 | .tuner_type = TUNER_XC2028, |
1097 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 1098 | .input = { { |
95b86a9a DSL |
1099 | .type = EM28XX_VMUX_TELEVISION, |
1100 | .vmux = TVP5150_COMPOSITE0, | |
8a5caa6b | 1101 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 1102 | .gpio = hauppauge_wintv_hvr_900_analog, |
95b86a9a | 1103 | }, { |
3acf2809 | 1104 | .type = EM28XX_VMUX_COMPOSITE1, |
95b86a9a | 1105 | .vmux = TVP5150_COMPOSITE1, |
8a5caa6b | 1106 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1107 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1108 | }, { |
3acf2809 | 1109 | .type = EM28XX_VMUX_SVIDEO, |
95b86a9a | 1110 | .vmux = TVP5150_SVIDEO, |
8a5caa6b | 1111 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1112 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1113 | } }, |
45632c4f | 1114 | }, |
95b86a9a DSL |
1115 | [EM2883_BOARD_KWORLD_HYBRID_A316] = { |
1116 | .name = "Kworld PlusTV HD Hybrid 330", | |
1117 | .valid = EM28XX_BOARD_NOT_VALIDATED, | |
95b86a9a DSL |
1118 | .tuner_type = TUNER_XC2028, |
1119 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 1120 | .input = { { |
ea4fd567 | 1121 | .type = EM28XX_VMUX_TELEVISION, |
95b86a9a | 1122 | .vmux = TVP5150_COMPOSITE0, |
8a5caa6b | 1123 | .amux = EM28XX_AMUX_VIDEO, |
122b77e5 | 1124 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1125 | }, { |
ea4fd567 | 1126 | .type = EM28XX_VMUX_COMPOSITE1, |
95b86a9a | 1127 | .vmux = TVP5150_COMPOSITE1, |
8a5caa6b | 1128 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1129 | .gpio = hauppauge_wintv_hvr_900_analog, |
c23f5949 | 1130 | }, { |
ea4fd567 | 1131 | .type = EM28XX_VMUX_SVIDEO, |
95b86a9a | 1132 | .vmux = TVP5150_SVIDEO, |
8a5caa6b | 1133 | .amux = EM28XX_AMUX_LINE_IN, |
122b77e5 | 1134 | .gpio = hauppauge_wintv_hvr_900_analog, |
a9fc52bc DH |
1135 | } }, |
1136 | }, | |
ee281b85 | 1137 | [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = { |
d3603341 | 1138 | .name = "Compro VideoMate ForYou/Stereo", |
d3603341 VW |
1139 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, |
1140 | .tda9887_conf = TDA9887_PRESENT, | |
1141 | .decoder = EM28XX_TVP5150, | |
d4d889e3 | 1142 | .input = { { |
d3603341 VW |
1143 | .type = EM28XX_VMUX_TELEVISION, |
1144 | .vmux = TVP5150_COMPOSITE0, | |
1145 | .amux = EM28XX_AMUX_LINE_IN, | |
1146 | }, { | |
1147 | .type = EM28XX_VMUX_SVIDEO, | |
1148 | .vmux = TVP5150_SVIDEO, | |
1149 | .amux = EM28XX_AMUX_LINE_IN, | |
1150 | } }, | |
1151 | }, | |
864ec0b7 DH |
1152 | [EM2874_BOARD_PINNACLE_PCTV_80E] = { |
1153 | .name = "Pinnacle PCTV HD Mini", | |
864ec0b7 | 1154 | .tuner_type = TUNER_ABSENT, |
a2070c66 | 1155 | .has_dvb = 1, |
122b77e5 | 1156 | .dvb_gpio = em2874_pinnacle_80e_digital, |
a2070c66 | 1157 | .ir_codes = ir_codes_pinnacle_pctv_hd, |
864ec0b7 | 1158 | .decoder = EM28XX_NODECODER, |
a2070c66 MCC |
1159 | .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | |
1160 | EM2874_I2C_SECONDARY_BUS_SELECT | | |
1161 | EM28XX_I2C_FREQ_400_KHZ, | |
864ec0b7 | 1162 | #ifdef DJH_DEBUG |
d4d889e3 | 1163 | .input = { { |
864ec0b7 DH |
1164 | .type = EM28XX_VMUX_TELEVISION, |
1165 | .vmux = TVP5150_COMPOSITE0, | |
1166 | .amux = EM28XX_AMUX_LINE_IN, | |
1167 | } }, | |
1168 | #endif | |
1169 | }, | |
a6c2ba28 | 1170 | }; |
3acf2809 | 1171 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
a6c2ba28 | 1172 | |
1173 | /* table of devices that work with this driver */ | |
3acf2809 | 1174 | struct usb_device_id em28xx_id_table [] = { |
c23f5949 | 1175 | { USB_DEVICE(0xeb1a, 0x2750), |
95b86a9a DSL |
1176 | .driver_info = EM2750_BOARD_UNKNOWN }, |
1177 | { USB_DEVICE(0xeb1a, 0x2751), | |
1178 | .driver_info = EM2750_BOARD_UNKNOWN }, | |
c23f5949 MCC |
1179 | { USB_DEVICE(0xeb1a, 0x2800), |
1180 | .driver_info = EM2800_BOARD_UNKNOWN }, | |
1181 | { USB_DEVICE(0xeb1a, 0x2820), | |
1182 | .driver_info = EM2820_BOARD_UNKNOWN }, | |
1183 | { USB_DEVICE(0xeb1a, 0x2821), | |
a50f4a44 | 1184 | .driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 }, |
c23f5949 MCC |
1185 | { USB_DEVICE(0xeb1a, 0x2860), |
1186 | .driver_info = EM2820_BOARD_UNKNOWN }, | |
1187 | { USB_DEVICE(0xeb1a, 0x2861), | |
1188 | .driver_info = EM2820_BOARD_UNKNOWN }, | |
1189 | { USB_DEVICE(0xeb1a, 0x2870), | |
1190 | .driver_info = EM2820_BOARD_UNKNOWN }, | |
1191 | { USB_DEVICE(0xeb1a, 0x2881), | |
1192 | .driver_info = EM2820_BOARD_UNKNOWN }, | |
1193 | { USB_DEVICE(0xeb1a, 0x2883), | |
1194 | .driver_info = EM2820_BOARD_UNKNOWN }, | |
95b86a9a DSL |
1195 | { USB_DEVICE(0xeb1a, 0xe300), |
1196 | .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U }, | |
1197 | { USB_DEVICE(0xeb1a, 0xe305), | |
1198 | .driver_info = EM2880_BOARD_KWORLD_DVB_305U }, | |
1199 | { USB_DEVICE(0xeb1a, 0xe310), | |
1200 | .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, | |
1201 | { USB_DEVICE(0xeb1a, 0xa316), | |
1202 | .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 }, | |
1203 | { USB_DEVICE(0xeb1a, 0xe320), | |
1204 | .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II }, | |
1205 | { USB_DEVICE(0xeb1a, 0xe323), | |
1206 | .driver_info = EM2882_BOARD_KWORLD_VS_DVBT }, | |
1207 | { USB_DEVICE(0xeb1a, 0xe350), | |
1208 | .driver_info = EM2870_BOARD_KWORLD_350U }, | |
1209 | { USB_DEVICE(0xeb1a, 0xe355), | |
1210 | .driver_info = EM2870_BOARD_KWORLD_355U }, | |
1211 | { USB_DEVICE(0xeb1a, 0x2801), | |
1212 | .driver_info = EM2800_BOARD_GRABBEEX_USB2800 }, | |
1213 | { USB_DEVICE(0xeb1a, 0xe357), | |
1214 | .driver_info = EM2870_BOARD_KWORLD_355U }, | |
c23f5949 MCC |
1215 | { USB_DEVICE(0x0ccd, 0x0036), |
1216 | .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 }, | |
95b86a9a DSL |
1217 | { USB_DEVICE(0x0ccd, 0x004c), |
1218 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR }, | |
1219 | { USB_DEVICE(0x0ccd, 0x004f), | |
1220 | .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS }, | |
1221 | { USB_DEVICE(0x0ccd, 0x005e), | |
1222 | .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, | |
1223 | { USB_DEVICE(0x0ccd, 0x0042), | |
1224 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS }, | |
1225 | { USB_DEVICE(0x0ccd, 0x0043), | |
1226 | .driver_info = EM2870_BOARD_TERRATEC_XS }, | |
1227 | { USB_DEVICE(0x0ccd, 0x0047), | |
1228 | .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, | |
1229 | { USB_DEVICE(0x185b, 0x2870), | |
1230 | .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, | |
d3603341 | 1231 | { USB_DEVICE(0x185b, 0x2041), |
ee281b85 | 1232 | .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU }, |
c23f5949 MCC |
1233 | { USB_DEVICE(0x2040, 0x4200), |
1234 | .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, | |
15b9becc MCC |
1235 | { USB_DEVICE(0x2040, 0x4201), |
1236 | .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, | |
c23f5949 MCC |
1237 | { USB_DEVICE(0x2040, 0x6500), |
1238 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, | |
427d20c4 | 1239 | { USB_DEVICE(0x2040, 0x6502), |
17d9d558 | 1240 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 }, |
74ee0510 | 1241 | { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */ |
10ac6603 | 1242 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
74ee0510 | 1243 | { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */ |
10ac6603 | 1244 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
74ee0510 | 1245 | { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */ |
10ac6603 | 1246 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
74ee0510 | 1247 | { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */ |
10ac6603 | 1248 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
e14b3658 DH |
1249 | { USB_DEVICE(0x0438, 0xb002), |
1250 | .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 }, | |
95b86a9a DSL |
1251 | { USB_DEVICE(0x2001, 0xf112), |
1252 | .driver_info = EM2820_BOARD_DLINK_USB_TV }, | |
1253 | { USB_DEVICE(0x2304, 0x0207), | |
1254 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | |
1255 | { USB_DEVICE(0x2304, 0x0208), | |
1256 | .driver_info = EM2820_BOARD_PINNACLE_USB_2 }, | |
1257 | { USB_DEVICE(0x2304, 0x021a), | |
1258 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | |
1259 | { USB_DEVICE(0x2304, 0x0226), | |
1260 | .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO }, | |
1261 | { USB_DEVICE(0x2304, 0x0227), | |
1262 | .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO }, | |
864ec0b7 DH |
1263 | { USB_DEVICE(0x2304, 0x023f), |
1264 | .driver_info = EM2874_BOARD_PINNACLE_PCTV_80E }, | |
95b86a9a DSL |
1265 | { USB_DEVICE(0x0413, 0x6023), |
1266 | .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII }, | |
1267 | { USB_DEVICE(0x093b, 0xa005), | |
1268 | .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U }, | |
a6c2ba28 | 1269 | { }, |
1270 | }; | |
c23f5949 | 1271 | MODULE_DEVICE_TABLE(usb, em28xx_id_table); |
03910cc3 | 1272 | |
102a0b08 MCC |
1273 | /* |
1274 | * EEPROM hash table for devices with generic USB IDs | |
1275 | */ | |
d2ba055d | 1276 | static struct em28xx_hash_table em28xx_eeprom_hash [] = { |
ea4fd567 | 1277 | /* P/N: SA 60002070465 Tuner: TVF7533-MF */ |
c23f5949 | 1278 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, |
da3808e1 | 1279 | {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, |
03910cc3 | 1280 | }; |
a6c2ba28 | 1281 | |
d2ba055d | 1282 | /* I2C devicelist hash table for devices with generic USB IDs */ |
fad7b958 | 1283 | static struct em28xx_hash_table em28xx_i2c_hash[] = { |
c23f5949 MCC |
1284 | {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, |
1285 | {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, | |
a9fc52bc | 1286 | {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT}, |
fad7b958 SS |
1287 | }; |
1288 | ||
d7cba043 | 1289 | int em28xx_tuner_callback(void *ptr, int component, int command, int arg) |
ee6e3a86 | 1290 | { |
102a0b08 | 1291 | int rc = 0; |
ee6e3a86 | 1292 | struct em28xx *dev = ptr; |
ee6e3a86 MCC |
1293 | |
1294 | if (dev->tuner_type != TUNER_XC2028) | |
1295 | return 0; | |
1296 | ||
1297 | if (command != XC2028_TUNER_RESET) | |
1298 | return 0; | |
1299 | ||
c8644057 | 1300 | rc = em28xx_gpio_set(dev, dev->tuner_gpio); |
ee6e3a86 | 1301 | |
ee6e3a86 MCC |
1302 | return rc; |
1303 | } | |
1304 | EXPORT_SYMBOL_GPL(em28xx_tuner_callback); | |
1305 | ||
505b6d0b | 1306 | static void inline em28xx_set_model(struct em28xx *dev) |
ee6e3a86 | 1307 | { |
505b6d0b | 1308 | memcpy(&dev->board, &em28xx_boards[dev->model], sizeof(dev->board)); |
ee6e3a86 MCC |
1309 | } |
1310 | ||
03910cc3 MCC |
1311 | /* Since em28xx_pre_card_setup() requires a proper dev->model, |
1312 | * this won't work for boards with generic PCI IDs | |
1313 | */ | |
a94e95b4 MR |
1314 | void em28xx_pre_card_setup(struct em28xx *dev) |
1315 | { | |
89b329ef MCC |
1316 | int rc; |
1317 | ||
1bee0184 MCC |
1318 | em28xx_set_model(dev); |
1319 | ||
1320 | em28xx_info("Found %s\n", dev->board.name); | |
1321 | ||
6a1acc3b DH |
1322 | /* Set the default GPO/GPIO for legacy devices */ |
1323 | dev->reg_gpo_num = EM2880_R04_GPO; | |
1324 | dev->reg_gpio_num = EM28XX_R08_GPIO; | |
c67ec53f | 1325 | |
89b329ef | 1326 | dev->wait_after_write = 5; |
6a1acc3b DH |
1327 | |
1328 | /* Based on the Chip ID, set the device configuration */ | |
41facaa4 | 1329 | rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); |
89b329ef | 1330 | if (rc > 0) { |
600bd7f0 | 1331 | dev->chip_id = rc; |
1bee0184 MCC |
1332 | |
1333 | switch (dev->chip_id) { | |
67c96f67 DH |
1334 | case CHIP_ID_EM2750: |
1335 | em28xx_info("chip ID is em2750\n"); | |
1336 | break; | |
f09fb530 MCC |
1337 | case CHIP_ID_EM2820: |
1338 | em28xx_info("chip ID is em2820\n"); | |
1339 | break; | |
1340 | case CHIP_ID_EM2840: | |
1341 | em28xx_info("chip ID is em2840\n"); | |
1342 | break; | |
a8a1f8cc DH |
1343 | case CHIP_ID_EM2860: |
1344 | em28xx_info("chip ID is em2860\n"); | |
1345 | break; | |
5caeba04 DH |
1346 | case CHIP_ID_EM2874: |
1347 | em28xx_info("chip ID is em2874\n"); | |
6a1acc3b | 1348 | dev->reg_gpio_num = EM2874_R80_GPIO; |
5caeba04 DH |
1349 | dev->wait_after_write = 0; |
1350 | break; | |
2ba890ec | 1351 | case CHIP_ID_EM2883: |
89b329ef MCC |
1352 | em28xx_info("chip ID is em2882/em2883\n"); |
1353 | dev->wait_after_write = 0; | |
1354 | break; | |
1355 | default: | |
1bee0184 | 1356 | em28xx_info("em28xx chip ID = %d\n", dev->chip_id); |
89b329ef MCC |
1357 | } |
1358 | } | |
6a1acc3b DH |
1359 | |
1360 | /* Prepopulate cached GPO register content */ | |
1361 | rc = em28xx_read_reg(dev, dev->reg_gpo_num); | |
1362 | if (rc >= 0) | |
1363 | dev->reg_gpo = rc; | |
1364 | ||
a2070c66 MCC |
1365 | /* Those are the default values for the majority of boards |
1366 | Use those values if not specified otherwise at boards entry | |
1367 | */ | |
505b6d0b MCC |
1368 | if (!dev->board.xclk) |
1369 | dev->board.xclk = EM28XX_XCLK_IR_RC5_MODE | | |
1370 | EM28XX_XCLK_FREQUENCY_12MHZ; | |
a2070c66 | 1371 | |
505b6d0b MCC |
1372 | if (!dev->board.i2c_speed) |
1373 | dev->board.i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | | |
1374 | EM28XX_I2C_FREQ_100_KHZ; | |
a2070c66 | 1375 | |
505b6d0b MCC |
1376 | em28xx_write_reg(dev, EM28XX_R0F_XCLK, dev->board.xclk & 0x7f); |
1377 | em28xx_write_reg(dev, EM28XX_R06_I2C_CLK, dev->board.i2c_speed); | |
a2070c66 MCC |
1378 | msleep(50); |
1379 | ||
a94e95b4 | 1380 | /* request some modules */ |
c23f5949 | 1381 | switch (dev->model) { |
95b86a9a | 1382 | case EM2861_BOARD_PLEXTOR_PX_TV100U: |
95b86a9a DSL |
1383 | /* FIXME guess */ |
1384 | /* Turn on analog audio output */ | |
6d676d8a | 1385 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); |
95b86a9a | 1386 | break; |
95b86a9a DSL |
1387 | case EM2861_BOARD_KWORLD_PVRTV_300U: |
1388 | case EM2880_BOARD_KWORLD_DVB_305U: | |
6d676d8a | 1389 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d); |
95b86a9a | 1390 | msleep(10); |
6d676d8a | 1391 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d); |
95b86a9a DSL |
1392 | msleep(10); |
1393 | break; | |
95b86a9a | 1394 | case EM2870_BOARD_COMPRO_VIDEOMATE: |
95b86a9a DSL |
1395 | /* TODO: someone can do some cleanup here... |
1396 | not everything's needed */ | |
6d676d8a | 1397 | em28xx_write_reg(dev, EM2880_R04_GPO, 0x00); |
95b86a9a | 1398 | msleep(10); |
6d676d8a | 1399 | em28xx_write_reg(dev, EM2880_R04_GPO, 0x01); |
95b86a9a | 1400 | msleep(10); |
6d676d8a | 1401 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); |
95b86a9a | 1402 | mdelay(70); |
6d676d8a | 1403 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc); |
95b86a9a | 1404 | mdelay(70); |
6d676d8a | 1405 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc); |
95b86a9a | 1406 | mdelay(70); |
6d676d8a | 1407 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc); |
95b86a9a DSL |
1408 | mdelay(70); |
1409 | break; | |
95b86a9a | 1410 | case EM2870_BOARD_TERRATEC_XS_MT2060: |
95b86a9a DSL |
1411 | /* this device needs some gpio writes to get the DVB-T |
1412 | demod work */ | |
6d676d8a | 1413 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); |
95b86a9a | 1414 | mdelay(70); |
6d676d8a | 1415 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde); |
95b86a9a | 1416 | mdelay(70); |
6d676d8a | 1417 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); |
95b86a9a DSL |
1418 | mdelay(70); |
1419 | break; | |
95b86a9a | 1420 | case EM2870_BOARD_PINNACLE_PCTV_DVB: |
95b86a9a DSL |
1421 | /* this device needs some gpio writes to get the |
1422 | DVB-T demod work */ | |
6d676d8a | 1423 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); |
95b86a9a | 1424 | mdelay(70); |
6d676d8a | 1425 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde); |
95b86a9a | 1426 | mdelay(70); |
6d676d8a | 1427 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe); |
95b86a9a | 1428 | mdelay(70); |
95b86a9a | 1429 | break; |
95b86a9a | 1430 | case EM2820_BOARD_GADMEI_UTV310: |
95b86a9a | 1431 | case EM2820_BOARD_MSI_VOX_USB_2: |
a2070c66 | 1432 | /* enables audio for that devices */ |
6d676d8a | 1433 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd); |
102a0b08 MCC |
1434 | break; |
1435 | } | |
c67ec53f | 1436 | |
c8644057 MCC |
1437 | /* Sets the default callback. Used only for certain tuners */ |
1438 | if (!dev->tuner_gpio) | |
1439 | dev->tuner_gpio = default_callback; | |
1440 | ||
1441 | em28xx_gpio_set(dev, dev->tuner_gpio); | |
c67ec53f MCC |
1442 | em28xx_set_mode(dev, EM28XX_ANALOG_MODE); |
1443 | ||
1444 | /* Unlock device */ | |
1445 | em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED); | |
a94e95b4 MR |
1446 | } |
1447 | ||
e54318e5 | 1448 | static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) |
3ca9c093 MCC |
1449 | { |
1450 | memset(ctl, 0, sizeof(*ctl)); | |
1451 | ||
1452 | ctl->fname = XC2028_DEFAULT_FIRMWARE; | |
1453 | ctl->max_len = 64; | |
1454 | ctl->mts = em28xx_boards[dev->model].mts_firmware; | |
1455 | ||
1456 | switch (dev->model) { | |
e77ebdaa MCC |
1457 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
1458 | ctl->demod = XC3028_FE_ZARLINK456; | |
1459 | break; | |
655b8408 | 1460 | case EM2880_BOARD_TERRATEC_HYBRID_XS: |
1461 | ctl->demod = XC3028_FE_ZARLINK456; | |
1462 | break; | |
17d9d558 DH |
1463 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: |
1464 | /* djh - Not sure which demod we need here */ | |
1465 | ctl->demod = XC3028_FE_DEFAULT; | |
1466 | break; | |
5ea7fe48 DH |
1467 | case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: |
1468 | ctl->demod = XC3028_FE_DEFAULT; | |
1469 | ctl->fname = XC3028L_DEFAULT_FIRMWARE; | |
1470 | break; | |
10ac6603 | 1471 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: |
4fd305b2 | 1472 | case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: |
e77ebdaa | 1473 | /* FIXME: Better to specify the needed IF */ |
bdfbf952 DH |
1474 | ctl->demod = XC3028_FE_DEFAULT; |
1475 | break; | |
3ca9c093 MCC |
1476 | default: |
1477 | ctl->demod = XC3028_FE_OREN538; | |
1478 | } | |
1479 | } | |
3ca9c093 | 1480 | |
c23f5949 | 1481 | static void em28xx_config_tuner(struct em28xx *dev) |
882876bf MCC |
1482 | { |
1483 | struct v4l2_priv_tun_config xc2028_cfg; | |
03910cc3 MCC |
1484 | struct tuner_setup tun_setup; |
1485 | struct v4l2_frequency f; | |
1486 | ||
ed086314 | 1487 | if (dev->tuner_type == TUNER_ABSENT) |
03910cc3 MCC |
1488 | return; |
1489 | ||
1490 | tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; | |
1491 | tun_setup.type = dev->tuner_type; | |
1492 | tun_setup.addr = dev->tuner_addr; | |
1493 | tun_setup.tuner_callback = em28xx_tuner_callback; | |
1494 | ||
1495 | em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup); | |
1496 | ||
1497 | if (dev->tuner_type == TUNER_XC2028) { | |
3ca9c093 | 1498 | struct xc2028_ctrl ctl; |
03910cc3 | 1499 | |
3ca9c093 | 1500 | em28xx_setup_xc3028(dev, &ctl); |
03910cc3 MCC |
1501 | |
1502 | xc2028_cfg.tuner = TUNER_XC2028; | |
1503 | xc2028_cfg.priv = &ctl; | |
882876bf | 1504 | |
03910cc3 MCC |
1505 | em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg); |
1506 | } | |
1507 | ||
1508 | /* configure tuner */ | |
1509 | f.tuner = 0; | |
1510 | f.type = V4L2_TUNER_ANALOG_TV; | |
1511 | f.frequency = 9076; /* just a magic number */ | |
1512 | dev->ctl_freq = f.frequency; | |
1513 | em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f); | |
1514 | } | |
1515 | ||
1516 | static int em28xx_hint_board(struct em28xx *dev) | |
1517 | { | |
1518 | int i; | |
882876bf | 1519 | |
d2ba055d MCC |
1520 | /* HINT method: EEPROM |
1521 | * | |
1522 | * This method works only for boards with eeprom. | |
1523 | * Uses a hash of all eeprom bytes. The hash should be | |
1524 | * unique for a vendor/tuner pair. | |
1525 | * There are a high chance that tuners for different | |
1526 | * video standards produce different hashes. | |
1527 | */ | |
1528 | for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) { | |
1529 | if (dev->hash == em28xx_eeprom_hash[i].hash) { | |
1530 | dev->model = em28xx_eeprom_hash[i].model; | |
1531 | dev->tuner_type = em28xx_eeprom_hash[i].tuner; | |
882876bf | 1532 | |
03910cc3 MCC |
1533 | em28xx_errdev("Your board has no unique USB ID.\n"); |
1534 | em28xx_errdev("A hint were successfully done, " | |
1535 | "based on eeprom hash.\n"); | |
1536 | em28xx_errdev("This method is not 100%% failproof.\n"); | |
1537 | em28xx_errdev("If the board were missdetected, " | |
1538 | "please email this log to:\n"); | |
1539 | em28xx_errdev("\tV4L Mailing List " | |
1540 | " <video4linux-list@redhat.com>\n"); | |
1541 | em28xx_errdev("Board detected as %s\n", | |
1542 | em28xx_boards[dev->model].name); | |
882876bf | 1543 | |
03910cc3 MCC |
1544 | return 0; |
1545 | } | |
1546 | } | |
fad7b958 | 1547 | |
d2ba055d MCC |
1548 | /* HINT method: I2C attached devices |
1549 | * | |
1550 | * This method works for all boards. | |
1551 | * Uses a hash of i2c scanned devices. | |
1552 | * Devices with the same i2c attached chips will | |
1553 | * be considered equal. | |
1554 | * This method is less precise than the eeprom one. | |
1555 | */ | |
1556 | ||
fad7b958 SS |
1557 | /* user did not request i2c scanning => do it now */ |
1558 | if (!dev->i2c_hash) | |
1559 | em28xx_do_i2c_scan(dev); | |
1560 | ||
1561 | for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) { | |
1562 | if (dev->i2c_hash == em28xx_i2c_hash[i].hash) { | |
1563 | dev->model = em28xx_i2c_hash[i].model; | |
1564 | dev->tuner_type = em28xx_i2c_hash[i].tuner; | |
1565 | em28xx_errdev("Your board has no unique USB ID.\n"); | |
1566 | em28xx_errdev("A hint were successfully done, " | |
1567 | "based on i2c devicelist hash.\n"); | |
1568 | em28xx_errdev("This method is not 100%% failproof.\n"); | |
1569 | em28xx_errdev("If the board were missdetected, " | |
1570 | "please email this log to:\n"); | |
1571 | em28xx_errdev("\tV4L Mailing List " | |
1572 | " <video4linux-list@redhat.com>\n"); | |
1573 | em28xx_errdev("Board detected as %s\n", | |
1574 | em28xx_boards[dev->model].name); | |
1575 | ||
1576 | return 0; | |
1577 | } | |
1578 | } | |
1579 | ||
03910cc3 MCC |
1580 | em28xx_errdev("Your board has no unique USB ID and thus need a " |
1581 | "hint to be detected.\n"); | |
1582 | em28xx_errdev("You may try to use card=<n> insmod option to " | |
1583 | "workaround that.\n"); | |
1584 | em28xx_errdev("Please send an email with this log to:\n"); | |
1585 | em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n"); | |
1586 | em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash); | |
fad7b958 | 1587 | em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash); |
03910cc3 MCC |
1588 | |
1589 | em28xx_errdev("Here is a list of valid choices for the card=<n>" | |
1590 | " insmod option:\n"); | |
1591 | for (i = 0; i < em28xx_bcount; i++) { | |
1592 | em28xx_errdev(" card=%d -> %s\n", | |
1593 | i, em28xx_boards[i].name); | |
1594 | } | |
1595 | return -1; | |
882876bf MCC |
1596 | } |
1597 | ||
c8793b03 MCC |
1598 | /* ----------------------------------------------------------------------- */ |
1599 | void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) | |
1600 | { | |
1601 | if (disable_ir) { | |
1602 | ir->get_key = NULL; | |
1603 | return ; | |
1604 | } | |
1605 | ||
1606 | /* detect & configure */ | |
1607 | switch (dev->model) { | |
1608 | case (EM2800_BOARD_UNKNOWN): | |
1609 | break; | |
1610 | case (EM2820_BOARD_UNKNOWN): | |
1611 | break; | |
1612 | case (EM2800_BOARD_TERRATEC_CINERGY_200): | |
1613 | case (EM2820_BOARD_TERRATEC_CINERGY_250): | |
1614 | ir->ir_codes = ir_codes_em_terratec; | |
1615 | ir->get_key = em28xx_get_key_terratec; | |
1616 | snprintf(ir->c.name, sizeof(ir->c.name), | |
1617 | "i2c IR (EM28XX Terratec)"); | |
1618 | break; | |
1619 | case (EM2820_BOARD_PINNACLE_USB_2): | |
1620 | ir->ir_codes = ir_codes_pinnacle_grey; | |
1621 | ir->get_key = em28xx_get_key_pinnacle_usb_grey; | |
1622 | snprintf(ir->c.name, sizeof(ir->c.name), | |
1623 | "i2c IR (EM28XX Pinnacle PCTV)"); | |
1624 | break; | |
1625 | case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): | |
1626 | ir->ir_codes = ir_codes_hauppauge_new; | |
1627 | ir->get_key = em28xx_get_key_em_haup; | |
1628 | snprintf(ir->c.name, sizeof(ir->c.name), | |
1629 | "i2c IR (EM2840 Hauppauge)"); | |
1630 | break; | |
1631 | case (EM2820_BOARD_MSI_VOX_USB_2): | |
1632 | break; | |
1633 | case (EM2800_BOARD_LEADTEK_WINFAST_USBII): | |
1634 | break; | |
1635 | case (EM2800_BOARD_KWORLD_USB2800): | |
1636 | break; | |
59d07f1b AS |
1637 | case (EM2800_BOARD_GRABBEEX_USB2800): |
1638 | break; | |
c8793b03 MCC |
1639 | } |
1640 | } | |
1641 | ||
3acf2809 | 1642 | void em28xx_card_setup(struct em28xx *dev) |
a6c2ba28 | 1643 | { |
f8b6030c MCC |
1644 | em28xx_set_model(dev); |
1645 | ||
1646 | dev->tuner_type = em28xx_boards[dev->model].tuner_type; | |
31e0530c MCC |
1647 | if (em28xx_boards[dev->model].tuner_addr) |
1648 | dev->tuner_addr = em28xx_boards[dev->model].tuner_addr; | |
f8b6030c | 1649 | |
a6c2ba28 | 1650 | /* request some modules */ |
03910cc3 MCC |
1651 | switch (dev->model) { |
1652 | case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: | |
98ae127c | 1653 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
17d9d558 | 1654 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: |
10ac6603 | 1655 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: |
03910cc3 MCC |
1656 | { |
1657 | struct tveeprom tv; | |
a6c2ba28 | 1658 | #ifdef CONFIG_MODULES |
03910cc3 | 1659 | request_module("tveeprom"); |
a6c2ba28 | 1660 | #endif |
03910cc3 MCC |
1661 | /* Call first TVeeprom */ |
1662 | ||
1663 | dev->i2c_client.addr = 0xa0 >> 1; | |
1664 | tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata); | |
4d17d083 | 1665 | |
03910cc3 | 1666 | dev->tuner_type = tv.tuner_type; |
ed086314 | 1667 | |
38f9d308 | 1668 | if (tv.audio_processor == V4L2_IDENT_MSPX4XX) { |
03910cc3 | 1669 | dev->i2s_speed = 2048000; |
505b6d0b | 1670 | dev->board.has_msp34xx = 1; |
03910cc3 | 1671 | } |
98ae127c MCC |
1672 | #ifdef CONFIG_MODULES |
1673 | if (tv.has_ir) | |
1674 | request_module("ir-kbd-i2c"); | |
1675 | #endif | |
03910cc3 | 1676 | break; |
a6c2ba28 | 1677 | } |
03910cc3 MCC |
1678 | case EM2820_BOARD_KWORLD_PVRTV2800RF: |
1679 | /* GPIO enables sound on KWORLD PVR TV 2800RF */ | |
6d676d8a | 1680 | em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9); |
03910cc3 MCC |
1681 | break; |
1682 | case EM2820_BOARD_UNKNOWN: | |
1683 | case EM2800_BOARD_UNKNOWN: | |
da3808e1 DB |
1684 | /* |
1685 | * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD. | |
1686 | * | |
1687 | * This occurs because they share identical USB vendor and | |
1688 | * product IDs. | |
1689 | * | |
1690 | * What we do here is look up the EEPROM hash of the K-WORLD | |
1691 | * and if it is found then we decide that we do not have | |
1692 | * a DIGIVOX and reset the device to the K-WORLD instead. | |
1693 | * | |
1694 | * This solution is only valid if they do not share eeprom | |
1695 | * hash identities which has not been determined as yet. | |
1696 | */ | |
1697 | case EM2880_BOARD_MSI_DIGIVOX_AD: | |
f8b6030c MCC |
1698 | if (!em28xx_hint_board(dev)) |
1699 | em28xx_set_model(dev); | |
95b86a9a | 1700 | break; |
03910cc3 MCC |
1701 | } |
1702 | ||
505b6d0b | 1703 | if (dev->board.has_snapshot_button) |
a9fc52bc DH |
1704 | em28xx_register_snapshot_button(dev); |
1705 | ||
505b6d0b | 1706 | if (dev->board.valid == EM28XX_BOARD_NOT_VALIDATED) { |
95b86a9a DSL |
1707 | em28xx_errdev("\n\n"); |
1708 | em28xx_errdev("The support for this board weren't " | |
1709 | "valid yet.\n"); | |
1710 | em28xx_errdev("Please send a report of having this working\n"); | |
1711 | em28xx_errdev("not to V4L mailing list (and/or to other " | |
1712 | "addresses)\n\n"); | |
1713 | } | |
1714 | ||
f8b6030c | 1715 | /* Allow override tuner type by a module parameter */ |
03910cc3 MCC |
1716 | if (tuner >= 0) |
1717 | dev->tuner_type = tuner; | |
1718 | ||
1719 | #ifdef CONFIG_MODULES | |
1720 | /* request some modules */ | |
505b6d0b | 1721 | if (dev->board.has_msp34xx) |
03910cc3 | 1722 | request_module("msp3400"); |
ec5de990 | 1723 | if (dev->board.decoder == EM28XX_SAA711X) |
03910cc3 | 1724 | request_module("saa7115"); |
505b6d0b | 1725 | if (dev->board.decoder == EM28XX_TVP5150) |
03910cc3 | 1726 | request_module("tvp5150"); |
505b6d0b | 1727 | if (dev->board.tuner_type != TUNER_ABSENT) |
03910cc3 MCC |
1728 | request_module("tuner"); |
1729 | #endif | |
1730 | ||
c23f5949 | 1731 | em28xx_config_tuner(dev); |
a924a499 MCC |
1732 | |
1733 | em28xx_ir_init(dev); | |
a6c2ba28 | 1734 | } |
c8644057 | 1735 |