diff options
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-cards.c')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 1049 |
1 files changed, 1020 insertions, 29 deletions
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 8cbda43727c3..d65d0572403b 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -32,8 +32,8 @@ | |||
32 | #include <media/saa7115.h> | 32 | #include <media/saa7115.h> |
33 | #include <media/tvp5150.h> | 33 | #include <media/tvp5150.h> |
34 | #include <media/tveeprom.h> | 34 | #include <media/tveeprom.h> |
35 | #include <media/audiochip.h> | ||
36 | #include <media/v4l2-common.h> | 35 | #include <media/v4l2-common.h> |
36 | #include <media/v4l2-chip-ident.h> | ||
37 | 37 | ||
38 | #include "em28xx.h" | 38 | #include "em28xx.h" |
39 | 39 | ||
@@ -52,6 +52,15 @@ struct em28xx_hash_table { | |||
52 | }; | 52 | }; |
53 | 53 | ||
54 | struct em28xx_board em28xx_boards[] = { | 54 | struct em28xx_board em28xx_boards[] = { |
55 | [EM2750_BOARD_UNKNOWN] = { | ||
56 | .name = "Unknown EM2750/EM2751 webcam grabber", | ||
57 | .vchannels = 1, | ||
58 | .input = { { | ||
59 | .type = EM28XX_VMUX_COMPOSITE1, | ||
60 | .vmux = 0, | ||
61 | .amux = 0, | ||
62 | } }, | ||
63 | }, | ||
55 | [EM2800_BOARD_UNKNOWN] = { | 64 | [EM2800_BOARD_UNKNOWN] = { |
56 | .name = "Unknown EM2800 video grabber", | 65 | .name = "Unknown EM2800 video grabber", |
57 | .is_em2800 = 1, | 66 | .is_em2800 = 1, |
@@ -73,6 +82,17 @@ struct em28xx_board em28xx_boards[] = { | |||
73 | .is_em2800 = 0, | 82 | .is_em2800 = 0, |
74 | .tuner_type = TUNER_ABSENT, | 83 | .tuner_type = TUNER_ABSENT, |
75 | }, | 84 | }, |
85 | [EM2750_BOARD_DLCW_130] = { | ||
86 | /* Beijing Huaqi Information Digital Technology Co., Ltd */ | ||
87 | .name = "Huaqi DLCW-130", | ||
88 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
89 | .vchannels = 1, | ||
90 | .input = { { | ||
91 | .type = EM28XX_VMUX_COMPOSITE1, | ||
92 | .vmux = 0, | ||
93 | .amux = 0, | ||
94 | } }, | ||
95 | }, | ||
76 | [EM2820_BOARD_KWORLD_PVRTV2800RF] = { | 96 | [EM2820_BOARD_KWORLD_PVRTV2800RF] = { |
77 | .name = "Kworld PVR TV 2800 RF", | 97 | .name = "Kworld PVR TV 2800 RF", |
78 | .is_em2800 = 0, | 98 | .is_em2800 = 0, |
@@ -151,6 +171,376 @@ struct em28xx_board em28xx_boards[] = { | |||
151 | MSP_DSP_IN_SCART, MSP_DSP_IN_SCART), | 171 | MSP_DSP_IN_SCART, MSP_DSP_IN_SCART), |
152 | } }, | 172 | } }, |
153 | }, | 173 | }, |
174 | [EM2820_BOARD_DLINK_USB_TV] = { | ||
175 | .name = "D-Link DUB-T210 TV Tuner", | ||
176 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
177 | .vchannels = 3, | ||
178 | .is_em2800 = 0, | ||
179 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | ||
180 | .tda9887_conf = TDA9887_PRESENT, | ||
181 | .decoder = EM28XX_SAA7113, | ||
182 | .input = { { | ||
183 | .type = EM28XX_VMUX_TELEVISION, | ||
184 | .vmux = SAA7115_COMPOSITE2, | ||
185 | .amux = 1, | ||
186 | }, { | ||
187 | .type = EM28XX_VMUX_COMPOSITE1, | ||
188 | .vmux = SAA7115_COMPOSITE0, | ||
189 | .amux = 1, | ||
190 | }, { | ||
191 | .type = EM28XX_VMUX_SVIDEO, | ||
192 | .vmux = SAA7115_SVIDEO3, | ||
193 | .amux = 1, | ||
194 | } }, | ||
195 | }, | ||
196 | [EM2820_BOARD_HERCULES_SMART_TV_USB2] = { | ||
197 | .name = "Hercules Smart TV USB 2.0", | ||
198 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
199 | .vchannels = 3, | ||
200 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | ||
201 | .tda9887_conf = TDA9887_PRESENT, | ||
202 | .decoder = EM28XX_SAA7113, | ||
203 | .input = { { | ||
204 | .type = EM28XX_VMUX_TELEVISION, | ||
205 | .vmux = SAA7115_COMPOSITE2, | ||
206 | .amux = 1, | ||
207 | }, { | ||
208 | .type = EM28XX_VMUX_COMPOSITE1, | ||
209 | .vmux = SAA7115_COMPOSITE0, | ||
210 | .amux = 1, | ||
211 | }, { | ||
212 | .type = EM28XX_VMUX_SVIDEO, | ||
213 | .vmux = SAA7115_SVIDEO3, | ||
214 | .amux = 1, | ||
215 | } }, | ||
216 | }, | ||
217 | [EM2820_BOARD_PINNACLE_USB_2_FM1216ME] = { | ||
218 | .name = "Pinnacle PCTV USB 2 (Philips FM1216ME)", | ||
219 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
220 | .vchannels = 3, | ||
221 | .is_em2800 = 0, | ||
222 | .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, | ||
223 | .tda9887_conf = TDA9887_PRESENT, | ||
224 | .decoder = EM28XX_SAA7113, | ||
225 | .input = { { | ||
226 | .type = EM28XX_VMUX_TELEVISION, | ||
227 | .vmux = SAA7115_COMPOSITE2, | ||
228 | .amux = 0, | ||
229 | }, { | ||
230 | .type = EM28XX_VMUX_COMPOSITE1, | ||
231 | .vmux = SAA7115_COMPOSITE0, | ||
232 | .amux = 1, | ||
233 | }, { | ||
234 | .type = EM28XX_VMUX_SVIDEO, | ||
235 | .vmux = SAA7115_SVIDEO3, | ||
236 | .amux = 1, | ||
237 | } }, | ||
238 | }, | ||
239 | [EM2820_BOARD_GADMEI_UTV310] = { | ||
240 | .name = "Gadmei UTV310", | ||
241 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
242 | .vchannels = 3, | ||
243 | .tuner_type = TUNER_TNF_5335MF, | ||
244 | .tda9887_conf = TDA9887_PRESENT, | ||
245 | .decoder = EM28XX_SAA7113, | ||
246 | .input = { { | ||
247 | .type = EM28XX_VMUX_TELEVISION, | ||
248 | .vmux = SAA7115_COMPOSITE1, | ||
249 | .amux = 1, | ||
250 | }, { | ||
251 | .type = EM28XX_VMUX_COMPOSITE1, | ||
252 | .vmux = SAA7115_COMPOSITE0, | ||
253 | .amux = 1, | ||
254 | }, { | ||
255 | .type = EM28XX_VMUX_SVIDEO, | ||
256 | .vmux = SAA7115_SVIDEO3, | ||
257 | .amux = 1, | ||
258 | } }, | ||
259 | }, | ||
260 | [EM2820_BOARD_LEADTEK_WINFAST_USBII_DELUXE] = { | ||
261 | .name = "Leadtek Winfast USB II Deluxe", | ||
262 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
263 | .vchannels = 3, | ||
264 | .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, | ||
265 | .tda9887_conf = TDA9887_PRESENT, | ||
266 | .decoder = EM28XX_SAA7114, | ||
267 | .input = { { | ||
268 | .type = EM28XX_VMUX_TELEVISION, | ||
269 | .vmux = 2, | ||
270 | .amux = 0, | ||
271 | }, { | ||
272 | .type = EM28XX_VMUX_COMPOSITE1, | ||
273 | .vmux = 0, | ||
274 | .amux = 1, | ||
275 | }, { | ||
276 | .type = EM28XX_VMUX_SVIDEO, | ||
277 | .vmux = 9, | ||
278 | .amux = 1, | ||
279 | } }, | ||
280 | }, | ||
281 | [EM2820_BOARD_PINNACLE_DVC_100] = { | ||
282 | .name = "Pinnacle Dazzle DVC 100", | ||
283 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
284 | .vchannels = 3, | ||
285 | .decoder = EM28XX_SAA7113, | ||
286 | .input = { { | ||
287 | .type = EM28XX_VMUX_COMPOSITE1, | ||
288 | .vmux = SAA7115_COMPOSITE0, | ||
289 | .amux = 1, | ||
290 | }, { | ||
291 | .type = EM28XX_VMUX_SVIDEO, | ||
292 | .vmux = SAA7115_SVIDEO3, | ||
293 | .amux = 1, | ||
294 | } }, | ||
295 | }, | ||
296 | [EM2820_BOARD_VIDEOLOGY_20K14XUSB] = { | ||
297 | .name = "Videology 20K14XUSB USB2.0", | ||
298 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
299 | .vchannels = 1, | ||
300 | .input = { { | ||
301 | .type = EM28XX_VMUX_COMPOSITE1, | ||
302 | .vmux = 0, | ||
303 | .amux = 0, | ||
304 | } }, | ||
305 | }, | ||
306 | [EM2821_BOARD_PROLINK_PLAYTV_USB2] = { | ||
307 | .name = "SIIG AVTuner-PVR/Prolink PlayTV USB 2.0", | ||
308 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
309 | .vchannels = 3, | ||
310 | .is_em2800 = 0, | ||
311 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, /* unknown? */ | ||
312 | .tda9887_conf = TDA9887_PRESENT, /* unknown? */ | ||
313 | .decoder = EM28XX_SAA7113, | ||
314 | .input = { { | ||
315 | .type = EM28XX_VMUX_TELEVISION, | ||
316 | .vmux = SAA7115_COMPOSITE2, | ||
317 | .amux = 1, | ||
318 | }, { | ||
319 | .type = EM28XX_VMUX_COMPOSITE1, | ||
320 | .vmux = SAA7115_COMPOSITE0, | ||
321 | .amux = 1, | ||
322 | }, { | ||
323 | .type = EM28XX_VMUX_SVIDEO, | ||
324 | .vmux = SAA7115_SVIDEO3, | ||
325 | .amux = 1, | ||
326 | } }, | ||
327 | }, | ||
328 | [EM2821_BOARD_SUPERCOMP_USB_2] = { | ||
329 | .name = "Supercomp USB 2.0 TV", | ||
330 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
331 | .vchannels = 3, | ||
332 | .is_em2800 = 0, | ||
333 | .tuner_type = TUNER_PHILIPS_FM1236_MK3, | ||
334 | .tda9887_conf = TDA9887_PRESENT | | ||
335 | TDA9887_PORT1_ACTIVE | | ||
336 | TDA9887_PORT2_ACTIVE, | ||
337 | .decoder = EM28XX_SAA7113, | ||
338 | .input = { { | ||
339 | .type = EM28XX_VMUX_TELEVISION, | ||
340 | .vmux = SAA7115_COMPOSITE2, | ||
341 | .amux = 1, | ||
342 | }, { | ||
343 | .type = EM28XX_VMUX_COMPOSITE1, | ||
344 | .vmux = SAA7115_COMPOSITE0, | ||
345 | .amux = 0, | ||
346 | }, { | ||
347 | .type = EM28XX_VMUX_SVIDEO, | ||
348 | .vmux = SAA7115_SVIDEO3, | ||
349 | .amux = 1, | ||
350 | } }, | ||
351 | }, | ||
352 | [EM2821_BOARD_USBGEAR_VD204] = { | ||
353 | .name = "Usbgear VD204v9", | ||
354 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
355 | .vchannels = 2, | ||
356 | .decoder = EM28XX_SAA7113, | ||
357 | .input = { { | ||
358 | .type = EM28XX_VMUX_COMPOSITE1, | ||
359 | .vmux = SAA7115_COMPOSITE0, | ||
360 | .amux = 1, | ||
361 | }, { | ||
362 | .type = EM28XX_VMUX_SVIDEO, | ||
363 | .vmux = SAA7115_SVIDEO3, | ||
364 | .amux = 1, | ||
365 | } }, | ||
366 | }, | ||
367 | [EM2860_BOARD_NETGMBH_CAM] = { | ||
368 | /* Beijing Huaqi Information Digital Technology Co., Ltd */ | ||
369 | .name = "NetGMBH Cam", | ||
370 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
371 | .vchannels = 1, | ||
372 | .input = { { | ||
373 | .type = EM28XX_VMUX_COMPOSITE1, | ||
374 | .vmux = 0, | ||
375 | .amux = 0, | ||
376 | } }, | ||
377 | }, | ||
378 | [EM2860_BOARD_TYPHOON_DVD_MAKER] = { | ||
379 | .name = "Typhoon DVD Maker", | ||
380 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
381 | .vchannels = 2, | ||
382 | .decoder = EM28XX_SAA7113, | ||
383 | .input = { { | ||
384 | .type = EM28XX_VMUX_COMPOSITE1, | ||
385 | .vmux = SAA7115_COMPOSITE0, | ||
386 | .amux = 1, | ||
387 | }, { | ||
388 | .type = EM28XX_VMUX_SVIDEO, | ||
389 | .vmux = SAA7115_SVIDEO3, | ||
390 | .amux = 1, | ||
391 | } }, | ||
392 | }, | ||
393 | [EM2860_BOARD_GADMEI_UTV330] = { | ||
394 | .name = "Gadmei UTV330", | ||
395 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
396 | .vchannels = 3, | ||
397 | .tuner_type = TUNER_TNF_5335MF, | ||
398 | .tda9887_conf = TDA9887_PRESENT, | ||
399 | .decoder = EM28XX_SAA7113, | ||
400 | .input = { { | ||
401 | .type = EM28XX_VMUX_TELEVISION, | ||
402 | .vmux = SAA7115_COMPOSITE2, | ||
403 | .amux = 0, | ||
404 | }, { | ||
405 | .type = EM28XX_VMUX_COMPOSITE1, | ||
406 | .vmux = SAA7115_COMPOSITE0, | ||
407 | .amux = 1, | ||
408 | }, { | ||
409 | .type = EM28XX_VMUX_SVIDEO, | ||
410 | .vmux = SAA7115_SVIDEO3, | ||
411 | .amux = 1, | ||
412 | } }, | ||
413 | }, | ||
414 | [EM2860_BOARD_TERRATEC_HYBRID_XS] = { | ||
415 | .name = "Terratec Cinergy A Hybrid XS", | ||
416 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
417 | .vchannels = 3, | ||
418 | .tuner_type = TUNER_XC2028, | ||
419 | .decoder = EM28XX_TVP5150, | ||
420 | .input = { { | ||
421 | .type = EM28XX_VMUX_TELEVISION, | ||
422 | .vmux = TVP5150_COMPOSITE0, | ||
423 | .amux = 0, | ||
424 | }, { | ||
425 | .type = EM28XX_VMUX_COMPOSITE1, | ||
426 | .vmux = TVP5150_COMPOSITE1, | ||
427 | .amux = 1, | ||
428 | }, { | ||
429 | .type = EM28XX_VMUX_SVIDEO, | ||
430 | .vmux = TVP5150_SVIDEO, | ||
431 | .amux = 1, | ||
432 | } }, | ||
433 | }, | ||
434 | [EM2861_BOARD_KWORLD_PVRTV_300U] = { | ||
435 | .name = "KWorld PVRTV 300U", | ||
436 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
437 | .vchannels = 3, | ||
438 | .tuner_type = TUNER_XC2028, | ||
439 | .decoder = EM28XX_TVP5150, | ||
440 | .input = { { | ||
441 | .type = EM28XX_VMUX_TELEVISION, | ||
442 | .vmux = TVP5150_COMPOSITE0, | ||
443 | .amux = 0, | ||
444 | }, { | ||
445 | .type = EM28XX_VMUX_COMPOSITE1, | ||
446 | .vmux = TVP5150_COMPOSITE1, | ||
447 | .amux = 1, | ||
448 | }, { | ||
449 | .type = EM28XX_VMUX_SVIDEO, | ||
450 | .vmux = TVP5150_SVIDEO, | ||
451 | .amux = 1, | ||
452 | } }, | ||
453 | }, | ||
454 | [EM2861_BOARD_YAKUMO_MOVIE_MIXER] = { | ||
455 | .name = "Yakumo MovieMixer", | ||
456 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
457 | .vchannels = 1, | ||
458 | .decoder = EM28XX_TVP5150, | ||
459 | .input = { { | ||
460 | .type = EM28XX_VMUX_TELEVISION, | ||
461 | .vmux = TVP5150_COMPOSITE0, | ||
462 | .amux = 0, | ||
463 | }, { | ||
464 | .type = EM28XX_VMUX_COMPOSITE1, | ||
465 | .vmux = TVP5150_COMPOSITE1, | ||
466 | .amux = 1, | ||
467 | }, { | ||
468 | .type = EM28XX_VMUX_SVIDEO, | ||
469 | .vmux = TVP5150_SVIDEO, | ||
470 | .amux = 1, | ||
471 | } }, | ||
472 | }, | ||
473 | [EM2861_BOARD_PLEXTOR_PX_TV100U] = { | ||
474 | .name = "Plextor ConvertX PX-TV100U", | ||
475 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
476 | .vchannels = 3, | ||
477 | .tuner_type = TUNER_TNF_5335MF, | ||
478 | .tda9887_conf = TDA9887_PRESENT, | ||
479 | .decoder = EM28XX_TVP5150, | ||
480 | .input = { { | ||
481 | .type = EM28XX_VMUX_TELEVISION, | ||
482 | .vmux = TVP5150_COMPOSITE0, | ||
483 | .amux = 1, | ||
484 | }, { | ||
485 | .type = EM28XX_VMUX_COMPOSITE1, | ||
486 | .vmux = TVP5150_COMPOSITE1, | ||
487 | .amux = 1, | ||
488 | }, { | ||
489 | .type = EM28XX_VMUX_SVIDEO, | ||
490 | .vmux = TVP5150_SVIDEO, | ||
491 | .amux = 1, | ||
492 | } }, | ||
493 | }, | ||
494 | [EM2870_BOARD_TERRATEC_XS] = { | ||
495 | .name = "Terratec Cinergy T XS", | ||
496 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
497 | .tuner_type = TUNER_XC2028, | ||
498 | }, | ||
499 | [EM2870_BOARD_TERRATEC_XS_MT2060] = { | ||
500 | .name = "Terratec Cinergy T XS (MT2060)", | ||
501 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
502 | .tuner_type = TUNER_ABSENT, /* MT2060 */ | ||
503 | }, | ||
504 | [EM2870_BOARD_KWORLD_350U] = { | ||
505 | .name = "Kworld 350 U DVB-T", | ||
506 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
507 | .tuner_type = TUNER_XC2028, | ||
508 | }, | ||
509 | [EM2870_BOARD_KWORLD_355U] = { | ||
510 | .name = "Kworld 355 U DVB-T", | ||
511 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
512 | }, | ||
513 | [EM2870_BOARD_PINNACLE_PCTV_DVB] = { | ||
514 | .name = "Pinnacle PCTV DVB-T", | ||
515 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
516 | .tuner_type = TUNER_ABSENT, /* MT2060 */ | ||
517 | }, | ||
518 | [EM2870_BOARD_COMPRO_VIDEOMATE] = { | ||
519 | .name = "Compro, VideoMate U3", | ||
520 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
521 | .tuner_type = TUNER_ABSENT, /* MT2060 */ | ||
522 | }, | ||
523 | [EM2880_BOARD_TERRATEC_HYBRID_XS_FR] = { | ||
524 | .name = "Terratec Hybrid XS Secam", | ||
525 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
526 | .vchannels = 3, | ||
527 | .has_msp34xx = 1, | ||
528 | .tuner_type = TUNER_XC2028, | ||
529 | .decoder = EM28XX_TVP5150, | ||
530 | .input = { { | ||
531 | .type = EM28XX_VMUX_TELEVISION, | ||
532 | .vmux = TVP5150_COMPOSITE0, | ||
533 | .amux = 0, | ||
534 | }, { | ||
535 | .type = EM28XX_VMUX_COMPOSITE1, | ||
536 | .vmux = TVP5150_COMPOSITE1, | ||
537 | .amux = 1, | ||
538 | }, { | ||
539 | .type = EM28XX_VMUX_SVIDEO, | ||
540 | .vmux = TVP5150_SVIDEO, | ||
541 | .amux = 1, | ||
542 | } }, | ||
543 | }, | ||
154 | [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = { | 544 | [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = { |
155 | .name = "Hauppauge WinTV HVR 900", | 545 | .name = "Hauppauge WinTV HVR 900", |
156 | .vchannels = 3, | 546 | .vchannels = 3, |
@@ -173,7 +563,28 @@ struct em28xx_board em28xx_boards[] = { | |||
173 | .amux = 1, | 563 | .amux = 1, |
174 | } }, | 564 | } }, |
175 | }, | 565 | }, |
176 | [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950] = { | 566 | [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2] = { |
567 | .name = "Hauppauge WinTV HVR 900 (R2)", | ||
568 | .vchannels = 3, | ||
569 | .tda9887_conf = TDA9887_PRESENT, | ||
570 | .tuner_type = TUNER_XC2028, | ||
571 | .mts_firmware = 1, | ||
572 | .decoder = EM28XX_TVP5150, | ||
573 | .input = { { | ||
574 | .type = EM28XX_VMUX_TELEVISION, | ||
575 | .vmux = TVP5150_COMPOSITE0, | ||
576 | .amux = 0, | ||
577 | }, { | ||
578 | .type = EM28XX_VMUX_COMPOSITE1, | ||
579 | .vmux = TVP5150_COMPOSITE1, | ||
580 | .amux = 3, | ||
581 | }, { | ||
582 | .type = EM28XX_VMUX_SVIDEO, | ||
583 | .vmux = TVP5150_SVIDEO, | ||
584 | .amux = 1, | ||
585 | } }, | ||
586 | }, | ||
587 | [EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950] = { | ||
177 | .name = "Hauppauge WinTV HVR 950", | 588 | .name = "Hauppauge WinTV HVR 950", |
178 | .vchannels = 3, | 589 | .vchannels = 3, |
179 | .tda9887_conf = TDA9887_PRESENT, | 590 | .tda9887_conf = TDA9887_PRESENT, |
@@ -196,12 +607,59 @@ struct em28xx_board em28xx_boards[] = { | |||
196 | .amux = 1, | 607 | .amux = 1, |
197 | } }, | 608 | } }, |
198 | }, | 609 | }, |
610 | [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = { | ||
611 | .name = "Pinnacle PCTV HD Pro Stick", | ||
612 | .vchannels = 3, | ||
613 | .tda9887_conf = TDA9887_PRESENT, | ||
614 | .tuner_type = TUNER_XC2028, | ||
615 | .mts_firmware = 1, | ||
616 | .has_12mhz_i2s = 1, | ||
617 | .has_dvb = 1, | ||
618 | .decoder = EM28XX_TVP5150, | ||
619 | .input = { { | ||
620 | .type = EM28XX_VMUX_TELEVISION, | ||
621 | .vmux = TVP5150_COMPOSITE0, | ||
622 | .amux = 0, | ||
623 | }, { | ||
624 | .type = EM28XX_VMUX_COMPOSITE1, | ||
625 | .vmux = TVP5150_COMPOSITE1, | ||
626 | .amux = 1, | ||
627 | }, { | ||
628 | .type = EM28XX_VMUX_SVIDEO, | ||
629 | .vmux = TVP5150_SVIDEO, | ||
630 | .amux = 1, | ||
631 | } }, | ||
632 | }, | ||
633 | [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = { | ||
634 | .name = "AMD ATI TV Wonder HD 600", | ||
635 | .vchannels = 3, | ||
636 | .tda9887_conf = TDA9887_PRESENT, | ||
637 | .tuner_type = TUNER_XC2028, | ||
638 | .mts_firmware = 1, | ||
639 | .has_12mhz_i2s = 1, | ||
640 | .has_dvb = 1, | ||
641 | .decoder = EM28XX_TVP5150, | ||
642 | .input = { { | ||
643 | .type = EM28XX_VMUX_TELEVISION, | ||
644 | .vmux = TVP5150_COMPOSITE0, | ||
645 | .amux = 0, | ||
646 | }, { | ||
647 | .type = EM28XX_VMUX_COMPOSITE1, | ||
648 | .vmux = TVP5150_COMPOSITE1, | ||
649 | .amux = 1, | ||
650 | }, { | ||
651 | .type = EM28XX_VMUX_SVIDEO, | ||
652 | .vmux = TVP5150_SVIDEO, | ||
653 | .amux = 1, | ||
654 | } }, | ||
655 | }, | ||
199 | [EM2880_BOARD_TERRATEC_HYBRID_XS] = { | 656 | [EM2880_BOARD_TERRATEC_HYBRID_XS] = { |
200 | .name = "Terratec Hybrid XS", | 657 | .name = "Terratec Hybrid XS", |
201 | .vchannels = 3, | 658 | .vchannels = 3, |
202 | .tda9887_conf = TDA9887_PRESENT, | 659 | .tda9887_conf = TDA9887_PRESENT, |
203 | .tuner_type = TUNER_XC2028, | 660 | .tuner_type = TUNER_XC2028, |
204 | .decoder = EM28XX_TVP5150, | 661 | .decoder = EM28XX_TVP5150, |
662 | .has_dvb = 1, | ||
205 | .input = { { | 663 | .input = { { |
206 | .type = EM28XX_VMUX_TELEVISION, | 664 | .type = EM28XX_VMUX_TELEVISION, |
207 | .vmux = TVP5150_COMPOSITE0, | 665 | .vmux = TVP5150_COMPOSITE0, |
@@ -284,6 +742,21 @@ struct em28xx_board em28xx_boards[] = { | |||
284 | .amux = 1, | 742 | .amux = 1, |
285 | } }, | 743 | } }, |
286 | }, | 744 | }, |
745 | [EM2800_BOARD_GRABBEEX_USB2800] = { | ||
746 | .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder", | ||
747 | .is_em2800 = 1, | ||
748 | .vchannels = 2, | ||
749 | .decoder = EM28XX_SAA7113, | ||
750 | .input = { { | ||
751 | .type = EM28XX_VMUX_COMPOSITE1, | ||
752 | .vmux = SAA7115_COMPOSITE0, | ||
753 | .amux = 1, | ||
754 | }, { | ||
755 | .type = EM28XX_VMUX_SVIDEO, | ||
756 | .vmux = SAA7115_SVIDEO3, | ||
757 | .amux = 1, | ||
758 | } }, | ||
759 | }, | ||
287 | [EM2800_BOARD_LEADTEK_WINFAST_USBII] = { | 760 | [EM2800_BOARD_LEADTEK_WINFAST_USBII] = { |
288 | .name = "Leadtek Winfast USB II", | 761 | .name = "Leadtek Winfast USB II", |
289 | .is_em2800 = 1, | 762 | .is_em2800 = 1, |
@@ -382,19 +855,253 @@ struct em28xx_board em28xx_boards[] = { | |||
382 | .amux = EM28XX_AMUX_LINE_IN, | 855 | .amux = EM28XX_AMUX_LINE_IN, |
383 | } }, | 856 | } }, |
384 | }, | 857 | }, |
858 | [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = { | ||
859 | .name = "PointNix Intra-Oral Camera", | ||
860 | .has_snapshot_button = 1, | ||
861 | .vchannels = 1, | ||
862 | .tda9887_conf = TDA9887_PRESENT, | ||
863 | .tuner_type = TUNER_ABSENT, | ||
864 | .decoder = EM28XX_SAA7113, | ||
865 | .input = { { | ||
866 | .type = EM28XX_VMUX_SVIDEO, | ||
867 | .vmux = SAA7115_SVIDEO3, | ||
868 | .amux = 0, | ||
869 | } }, | ||
870 | }, | ||
871 | [EM2880_BOARD_MSI_DIGIVOX_AD] = { | ||
872 | .name = "MSI DigiVox A/D", | ||
873 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
874 | .vchannels = 3, | ||
875 | .tuner_type = TUNER_XC2028, | ||
876 | .decoder = EM28XX_TVP5150, | ||
877 | .input = { { | ||
878 | .type = EM28XX_VMUX_TELEVISION, | ||
879 | .vmux = TVP5150_COMPOSITE0, | ||
880 | .amux = 0, | ||
881 | }, { | ||
882 | .type = EM28XX_VMUX_COMPOSITE1, | ||
883 | .vmux = TVP5150_COMPOSITE1, | ||
884 | .amux = 1, | ||
885 | }, { | ||
886 | .type = EM28XX_VMUX_SVIDEO, | ||
887 | .vmux = TVP5150_SVIDEO, | ||
888 | .amux = 1, | ||
889 | } }, | ||
890 | }, | ||
891 | [EM2880_BOARD_MSI_DIGIVOX_AD_II] = { | ||
892 | .name = "MSI DigiVox A/D II", | ||
893 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
894 | .vchannels = 3, | ||
895 | .tuner_type = TUNER_XC2028, | ||
896 | .decoder = EM28XX_TVP5150, | ||
897 | .input = { { | ||
898 | .type = EM28XX_VMUX_TELEVISION, | ||
899 | .vmux = TVP5150_COMPOSITE0, | ||
900 | .amux = 0, | ||
901 | }, { | ||
902 | .type = EM28XX_VMUX_COMPOSITE1, | ||
903 | .vmux = TVP5150_COMPOSITE1, | ||
904 | .amux = 1, | ||
905 | }, { | ||
906 | .type = EM28XX_VMUX_SVIDEO, | ||
907 | .vmux = TVP5150_SVIDEO, | ||
908 | .amux = 1, | ||
909 | } }, | ||
910 | }, | ||
911 | [EM2880_BOARD_KWORLD_DVB_305U] = { | ||
912 | .name = "KWorld DVB-T 305U", | ||
913 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
914 | .vchannels = 3, | ||
915 | .tuner_type = TUNER_XC2028, | ||
916 | .decoder = EM28XX_TVP5150, | ||
917 | .input = { { | ||
918 | .type = EM28XX_VMUX_TELEVISION, | ||
919 | .vmux = TVP5150_COMPOSITE0, | ||
920 | .amux = 0, | ||
921 | }, { | ||
922 | .type = EM28XX_VMUX_COMPOSITE1, | ||
923 | .vmux = TVP5150_COMPOSITE1, | ||
924 | .amux = 1, | ||
925 | }, { | ||
926 | .type = EM28XX_VMUX_SVIDEO, | ||
927 | .vmux = TVP5150_SVIDEO, | ||
928 | .amux = 1, | ||
929 | } }, | ||
930 | }, | ||
931 | [EM2880_BOARD_KWORLD_DVB_310U] = { | ||
932 | .name = "KWorld DVB-T 310U", | ||
933 | .vchannels = 3, | ||
934 | .tuner_type = TUNER_XC2028, | ||
935 | .has_dvb = 1, | ||
936 | .mts_firmware = 1, | ||
937 | .decoder = EM28XX_TVP5150, | ||
938 | .input = { { | ||
939 | .type = EM28XX_VMUX_TELEVISION, | ||
940 | .vmux = TVP5150_COMPOSITE0, | ||
941 | .amux = EM28XX_AMUX_VIDEO, | ||
942 | }, { | ||
943 | .type = EM28XX_VMUX_COMPOSITE1, | ||
944 | .vmux = TVP5150_COMPOSITE1, | ||
945 | .amux = EM28XX_AMUX_AC97_LINE_IN, | ||
946 | }, { /* S-video has not been tested yet */ | ||
947 | .type = EM28XX_VMUX_SVIDEO, | ||
948 | .vmux = TVP5150_SVIDEO, | ||
949 | .amux = EM28XX_AMUX_AC97_LINE_IN, | ||
950 | } }, | ||
951 | }, | ||
952 | [EM2881_BOARD_DNT_DA2_HYBRID] = { | ||
953 | .name = "DNT DA2 Hybrid", | ||
954 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
955 | .vchannels = 3, | ||
956 | .tuner_type = TUNER_XC2028, | ||
957 | .decoder = EM28XX_TVP5150, | ||
958 | .input = { { | ||
959 | .type = EM28XX_VMUX_TELEVISION, | ||
960 | .vmux = TVP5150_COMPOSITE0, | ||
961 | .amux = 0, | ||
962 | }, { | ||
963 | .type = EM28XX_VMUX_COMPOSITE1, | ||
964 | .vmux = TVP5150_COMPOSITE1, | ||
965 | .amux = 1, | ||
966 | }, { | ||
967 | .type = EM28XX_VMUX_SVIDEO, | ||
968 | .vmux = TVP5150_SVIDEO, | ||
969 | .amux = 1, | ||
970 | } }, | ||
971 | }, | ||
972 | [EM2881_BOARD_PINNACLE_HYBRID_PRO] = { | ||
973 | .name = "Pinnacle Hybrid Pro", | ||
974 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
975 | .vchannels = 3, | ||
976 | .tuner_type = TUNER_XC2028, | ||
977 | .decoder = EM28XX_TVP5150, | ||
978 | .input = { { | ||
979 | .type = EM28XX_VMUX_TELEVISION, | ||
980 | .vmux = TVP5150_COMPOSITE0, | ||
981 | .amux = 0, | ||
982 | }, { | ||
983 | .type = EM28XX_VMUX_COMPOSITE1, | ||
984 | .vmux = TVP5150_COMPOSITE1, | ||
985 | .amux = 1, | ||
986 | }, { | ||
987 | .type = EM28XX_VMUX_SVIDEO, | ||
988 | .vmux = TVP5150_SVIDEO, | ||
989 | .amux = 1, | ||
990 | } }, | ||
991 | }, | ||
992 | [EM2882_BOARD_PINNACLE_HYBRID_PRO] = { | ||
993 | .name = "Pinnacle Hybrid Pro (2)", | ||
994 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
995 | .vchannels = 3, | ||
996 | .tuner_type = TUNER_XC2028, | ||
997 | .mts_firmware = 1, | ||
998 | .decoder = EM28XX_TVP5150, | ||
999 | .input = { { | ||
1000 | .type = EM28XX_VMUX_TELEVISION, | ||
1001 | .vmux = TVP5150_COMPOSITE0, | ||
1002 | .amux = 0, | ||
1003 | }, { | ||
1004 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1005 | .vmux = TVP5150_COMPOSITE1, | ||
1006 | .amux = 1, | ||
1007 | }, { | ||
1008 | .type = EM28XX_VMUX_SVIDEO, | ||
1009 | .vmux = TVP5150_SVIDEO, | ||
1010 | .amux = 1, | ||
1011 | } }, | ||
1012 | }, | ||
1013 | [EM2882_BOARD_KWORLD_VS_DVBT] = { | ||
1014 | .name = "Kworld VS-DVB-T 323UR", | ||
1015 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
1016 | .vchannels = 3, | ||
1017 | .tuner_type = TUNER_XC2028, | ||
1018 | .decoder = EM28XX_TVP5150, | ||
1019 | .input = { { | ||
1020 | .type = EM28XX_VMUX_TELEVISION, | ||
1021 | .vmux = TVP5150_COMPOSITE0, | ||
1022 | .amux = 0, | ||
1023 | }, { | ||
1024 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1025 | .vmux = TVP5150_COMPOSITE1, | ||
1026 | .amux = 1, | ||
1027 | }, { | ||
1028 | .type = EM28XX_VMUX_SVIDEO, | ||
1029 | .vmux = TVP5150_SVIDEO, | ||
1030 | .amux = 1, | ||
1031 | } }, | ||
1032 | }, | ||
1033 | [EM2882_BOARD_TERRATEC_HYBRID_XS] = { | ||
1034 | .name = "Terratec Hybrid XS (em2882)", | ||
1035 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
1036 | .vchannels = 3, | ||
1037 | .tuner_type = TUNER_XC2028, | ||
1038 | .decoder = EM28XX_TVP5150, | ||
1039 | .input = { { | ||
1040 | .type = EM28XX_VMUX_TELEVISION, | ||
1041 | .vmux = TVP5150_COMPOSITE0, | ||
1042 | .amux = 0, | ||
1043 | }, { | ||
1044 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1045 | .vmux = TVP5150_COMPOSITE1, | ||
1046 | .amux = 1, | ||
1047 | }, { | ||
1048 | .type = EM28XX_VMUX_SVIDEO, | ||
1049 | .vmux = TVP5150_SVIDEO, | ||
1050 | .amux = 1, | ||
1051 | } }, | ||
1052 | }, | ||
1053 | [EM2883_BOARD_KWORLD_HYBRID_A316] = { | ||
1054 | .name = "Kworld PlusTV HD Hybrid 330", | ||
1055 | .valid = EM28XX_BOARD_NOT_VALIDATED, | ||
1056 | .vchannels = 3, | ||
1057 | .is_em2800 = 0, | ||
1058 | .tuner_type = TUNER_XC2028, | ||
1059 | .decoder = EM28XX_TVP5150, | ||
1060 | .input = { { | ||
1061 | .type = EM28XX_VMUX_TELEVISION, | ||
1062 | .vmux = TVP5150_COMPOSITE0, | ||
1063 | .amux = 0, | ||
1064 | }, { | ||
1065 | .type = EM28XX_VMUX_COMPOSITE1, | ||
1066 | .vmux = TVP5150_COMPOSITE1, | ||
1067 | .amux = 1, | ||
1068 | }, { | ||
1069 | .type = EM28XX_VMUX_SVIDEO, | ||
1070 | .vmux = TVP5150_SVIDEO, | ||
1071 | .amux = 1, | ||
1072 | } }, | ||
1073 | }, | ||
1074 | [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = { | ||
1075 | .name = "Compro VideoMate ForYou/Stereo", | ||
1076 | .vchannels = 2, | ||
1077 | .tuner_type = TUNER_LG_PAL_NEW_TAPC, | ||
1078 | .tda9887_conf = TDA9887_PRESENT, | ||
1079 | .decoder = EM28XX_TVP5150, | ||
1080 | .input = { { | ||
1081 | .type = EM28XX_VMUX_TELEVISION, | ||
1082 | .vmux = TVP5150_COMPOSITE0, | ||
1083 | .amux = EM28XX_AMUX_LINE_IN, | ||
1084 | }, { | ||
1085 | .type = EM28XX_VMUX_SVIDEO, | ||
1086 | .vmux = TVP5150_SVIDEO, | ||
1087 | .amux = EM28XX_AMUX_LINE_IN, | ||
1088 | } }, | ||
1089 | }, | ||
385 | }; | 1090 | }; |
386 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); | 1091 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
387 | 1092 | ||
388 | /* table of devices that work with this driver */ | 1093 | /* table of devices that work with this driver */ |
389 | struct usb_device_id em28xx_id_table [] = { | 1094 | struct usb_device_id em28xx_id_table [] = { |
390 | { USB_DEVICE(0xeb1a, 0x2750), | 1095 | { USB_DEVICE(0xeb1a, 0x2750), |
391 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1096 | .driver_info = EM2750_BOARD_UNKNOWN }, |
1097 | { USB_DEVICE(0xeb1a, 0x2751), | ||
1098 | .driver_info = EM2750_BOARD_UNKNOWN }, | ||
392 | { USB_DEVICE(0xeb1a, 0x2800), | 1099 | { USB_DEVICE(0xeb1a, 0x2800), |
393 | .driver_info = EM2800_BOARD_UNKNOWN }, | 1100 | .driver_info = EM2800_BOARD_UNKNOWN }, |
394 | { USB_DEVICE(0xeb1a, 0x2820), | 1101 | { USB_DEVICE(0xeb1a, 0x2820), |
395 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1102 | .driver_info = EM2820_BOARD_UNKNOWN }, |
396 | { USB_DEVICE(0xeb1a, 0x2821), | 1103 | { USB_DEVICE(0xeb1a, 0x2821), |
397 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1104 | .driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 }, |
398 | { USB_DEVICE(0xeb1a, 0x2860), | 1105 | { USB_DEVICE(0xeb1a, 0x2860), |
399 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1106 | .driver_info = EM2820_BOARD_UNKNOWN }, |
400 | { USB_DEVICE(0xeb1a, 0x2861), | 1107 | { USB_DEVICE(0xeb1a, 0x2861), |
@@ -405,34 +1112,78 @@ struct usb_device_id em28xx_id_table [] = { | |||
405 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1112 | .driver_info = EM2820_BOARD_UNKNOWN }, |
406 | { USB_DEVICE(0xeb1a, 0x2883), | 1113 | { USB_DEVICE(0xeb1a, 0x2883), |
407 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1114 | .driver_info = EM2820_BOARD_UNKNOWN }, |
1115 | { USB_DEVICE(0xeb1a, 0xe300), | ||
1116 | .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U }, | ||
1117 | { USB_DEVICE(0xeb1a, 0xe305), | ||
1118 | .driver_info = EM2880_BOARD_KWORLD_DVB_305U }, | ||
1119 | { USB_DEVICE(0xeb1a, 0xe310), | ||
1120 | .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, | ||
1121 | { USB_DEVICE(0xeb1a, 0xa316), | ||
1122 | .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 }, | ||
1123 | { USB_DEVICE(0xeb1a, 0xe320), | ||
1124 | .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II }, | ||
1125 | { USB_DEVICE(0xeb1a, 0xe323), | ||
1126 | .driver_info = EM2882_BOARD_KWORLD_VS_DVBT }, | ||
1127 | { USB_DEVICE(0xeb1a, 0xe350), | ||
1128 | .driver_info = EM2870_BOARD_KWORLD_350U }, | ||
1129 | { USB_DEVICE(0xeb1a, 0xe355), | ||
1130 | .driver_info = EM2870_BOARD_KWORLD_355U }, | ||
1131 | { USB_DEVICE(0xeb1a, 0x2801), | ||
1132 | .driver_info = EM2800_BOARD_GRABBEEX_USB2800 }, | ||
1133 | { USB_DEVICE(0xeb1a, 0xe357), | ||
1134 | .driver_info = EM2870_BOARD_KWORLD_355U }, | ||
408 | { USB_DEVICE(0x0ccd, 0x0036), | 1135 | { USB_DEVICE(0x0ccd, 0x0036), |
409 | .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 }, | 1136 | .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 }, |
410 | { USB_DEVICE(0x2304, 0x0208), | 1137 | { USB_DEVICE(0x0ccd, 0x004c), |
411 | .driver_info = EM2820_BOARD_PINNACLE_USB_2 }, | 1138 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR }, |
1139 | { USB_DEVICE(0x0ccd, 0x004f), | ||
1140 | .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS }, | ||
1141 | { USB_DEVICE(0x0ccd, 0x005e), | ||
1142 | .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, | ||
1143 | { USB_DEVICE(0x0ccd, 0x0042), | ||
1144 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS }, | ||
1145 | { USB_DEVICE(0x0ccd, 0x0043), | ||
1146 | .driver_info = EM2870_BOARD_TERRATEC_XS }, | ||
1147 | { USB_DEVICE(0x0ccd, 0x0047), | ||
1148 | .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, | ||
1149 | { USB_DEVICE(0x185b, 0x2870), | ||
1150 | .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, | ||
1151 | { USB_DEVICE(0x185b, 0x2041), | ||
1152 | .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU }, | ||
412 | { USB_DEVICE(0x2040, 0x4200), | 1153 | { USB_DEVICE(0x2040, 0x4200), |
413 | .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, | 1154 | .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, |
414 | { USB_DEVICE(0x2040, 0x4201), | 1155 | { USB_DEVICE(0x2040, 0x4201), |
415 | .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, | 1156 | .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, |
416 | { USB_DEVICE(0x2304, 0x0207), | ||
417 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | ||
418 | { USB_DEVICE(0x2304, 0x021a), | ||
419 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | ||
420 | { USB_DEVICE(0x2040, 0x6500), | 1157 | { USB_DEVICE(0x2040, 0x6500), |
421 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, | 1158 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, |
422 | { USB_DEVICE(0x2040, 0x6502), | 1159 | { USB_DEVICE(0x2040, 0x6502), |
423 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, | 1160 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 }, |
424 | { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */ | 1161 | { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */ |
425 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | 1162 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
426 | { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */ | 1163 | { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */ |
427 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | 1164 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
428 | { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */ | 1165 | { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */ |
429 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | 1166 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
430 | { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */ | 1167 | { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */ |
431 | .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950 }, | 1168 | .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, |
432 | { USB_DEVICE(0x0ccd, 0x0042), | 1169 | { USB_DEVICE(0x0438, 0xb002), |
433 | .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS }, | 1170 | .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 }, |
434 | { USB_DEVICE(0x0ccd, 0x0047), | 1171 | { USB_DEVICE(0x2001, 0xf112), |
435 | .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, | 1172 | .driver_info = EM2820_BOARD_DLINK_USB_TV }, |
1173 | { USB_DEVICE(0x2304, 0x0207), | ||
1174 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | ||
1175 | { USB_DEVICE(0x2304, 0x0208), | ||
1176 | .driver_info = EM2820_BOARD_PINNACLE_USB_2 }, | ||
1177 | { USB_DEVICE(0x2304, 0x021a), | ||
1178 | .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, | ||
1179 | { USB_DEVICE(0x2304, 0x0226), | ||
1180 | .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO }, | ||
1181 | { USB_DEVICE(0x2304, 0x0227), | ||
1182 | .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO }, | ||
1183 | { USB_DEVICE(0x0413, 0x6023), | ||
1184 | .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII }, | ||
1185 | { USB_DEVICE(0x093b, 0xa005), | ||
1186 | .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U }, | ||
436 | { }, | 1187 | { }, |
437 | }; | 1188 | }; |
438 | MODULE_DEVICE_TABLE(usb, em28xx_id_table); | 1189 | MODULE_DEVICE_TABLE(usb, em28xx_id_table); |
@@ -441,6 +1192,18 @@ MODULE_DEVICE_TABLE(usb, em28xx_id_table); | |||
441 | * Reset sequences for analog/digital modes | 1192 | * Reset sequences for analog/digital modes |
442 | */ | 1193 | */ |
443 | 1194 | ||
1195 | /* Reset for the most [analog] boards */ | ||
1196 | static struct em28xx_reg_seq default_analog[] = { | ||
1197 | {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, | ||
1198 | { -1, -1, -1, -1}, | ||
1199 | }; | ||
1200 | |||
1201 | /* Reset for the most [digital] boards */ | ||
1202 | static struct em28xx_reg_seq default_digital[] = { | ||
1203 | {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, | ||
1204 | { -1, -1, -1, -1}, | ||
1205 | }; | ||
1206 | |||
444 | /* Board Hauppauge WinTV HVR 900 analog */ | 1207 | /* Board Hauppauge WinTV HVR 900 analog */ |
445 | static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = { | 1208 | static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = { |
446 | {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10}, | 1209 | {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10}, |
@@ -456,29 +1219,59 @@ static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = { | |||
456 | { -1, -1, -1, -1}, | 1219 | { -1, -1, -1, -1}, |
457 | }; | 1220 | }; |
458 | 1221 | ||
459 | /* Board Hauppauge WinTV HVR 900 tuner_callback */ | 1222 | /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ |
460 | static struct em28xx_reg_seq hauppauge_wintv_hvr_900_tuner_callback[] = { | 1223 | static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = { |
1224 | {EM28XX_R08_GPIO, 0x69, ~EM_GPIO_4, 10}, | ||
1225 | { -1, -1, -1, -1}, | ||
1226 | }; | ||
1227 | |||
1228 | /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ | ||
1229 | static struct em28xx_reg_seq em2880_msi_digivox_ad_digital[] = { | ||
1230 | {EM28XX_R08_GPIO, 0x6a, ~EM_GPIO_4, 10}, | ||
1231 | { -1, -1, -1, -1}, | ||
1232 | }; | ||
1233 | |||
1234 | /* Board - EM2870 Kworld 355u | ||
1235 | Analog - No input analog */ | ||
1236 | static struct em28xx_reg_seq em2870_kworld_355u_digital[] = { | ||
1237 | {EM2880_R04_GPO, 0x01, 0xff, 10}, | ||
1238 | { -1, -1, -1, -1}, | ||
1239 | }; | ||
1240 | |||
1241 | /* Callback for the most boards */ | ||
1242 | static struct em28xx_reg_seq default_callback[] = { | ||
461 | {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, | 1243 | {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, |
462 | {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10}, | 1244 | {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10}, |
463 | {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, | 1245 | {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, |
464 | { -1, -1, -1, -1}, | 1246 | { -1, -1, -1, -1}, |
465 | }; | 1247 | }; |
466 | 1248 | ||
1249 | /* Callback for EM2882 TERRATEC HYBRID XS */ | ||
1250 | static struct em28xx_reg_seq em2882_terratec_hybrid_xs_digital[] = { | ||
1251 | {EM28XX_R08_GPIO, 0x2e, 0xff, 6}, | ||
1252 | {EM28XX_R08_GPIO, 0x3e, ~EM_GPIO_4, 6}, | ||
1253 | {EM2880_R04_GPO, 0x04, 0xff, 10}, | ||
1254 | {EM2880_R04_GPO, 0x0c, 0xff, 10}, | ||
1255 | { -1, -1, -1, -1}, | ||
1256 | }; | ||
1257 | |||
467 | /* | 1258 | /* |
468 | * EEPROM hash table for devices with generic USB IDs | 1259 | * EEPROM hash table for devices with generic USB IDs |
469 | */ | 1260 | */ |
470 | static struct em28xx_hash_table em28xx_eeprom_hash [] = { | 1261 | static struct em28xx_hash_table em28xx_eeprom_hash [] = { |
471 | /* P/N: SA 60002070465 Tuner: TVF7533-MF */ | 1262 | /* P/N: SA 60002070465 Tuner: TVF7533-MF */ |
472 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, | 1263 | {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, |
1264 | {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, | ||
473 | }; | 1265 | }; |
474 | 1266 | ||
475 | /* I2C devicelist hash table for devices with generic USB IDs */ | 1267 | /* I2C devicelist hash table for devices with generic USB IDs */ |
476 | static struct em28xx_hash_table em28xx_i2c_hash[] = { | 1268 | static struct em28xx_hash_table em28xx_i2c_hash[] = { |
477 | {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, | 1269 | {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, |
478 | {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, | 1270 | {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, |
1271 | {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT}, | ||
479 | }; | 1272 | }; |
480 | 1273 | ||
481 | int em28xx_tuner_callback(void *ptr, int command, int arg) | 1274 | int em28xx_tuner_callback(void *ptr, int component, int command, int arg) |
482 | { | 1275 | { |
483 | int rc = 0; | 1276 | int rc = 0; |
484 | struct em28xx *dev = ptr; | 1277 | struct em28xx *dev = ptr; |
@@ -508,6 +1301,8 @@ static void em28xx_set_model(struct em28xx *dev) | |||
508 | dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s; | 1301 | dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s; |
509 | dev->max_range_640_480 = em28xx_boards[dev->model].max_range_640_480; | 1302 | dev->max_range_640_480 = em28xx_boards[dev->model].max_range_640_480; |
510 | dev->has_dvb = em28xx_boards[dev->model].has_dvb; | 1303 | dev->has_dvb = em28xx_boards[dev->model].has_dvb; |
1304 | dev->has_snapshot_button = em28xx_boards[dev->model].has_snapshot_button; | ||
1305 | dev->valid = em28xx_boards[dev->model].valid; | ||
511 | } | 1306 | } |
512 | 1307 | ||
513 | /* Since em28xx_pre_card_setup() requires a proper dev->model, | 1308 | /* Since em28xx_pre_card_setup() requires a proper dev->model, |
@@ -542,18 +1337,172 @@ void em28xx_pre_card_setup(struct em28xx *dev) | |||
542 | switch (dev->model) { | 1337 | switch (dev->model) { |
543 | case EM2880_BOARD_TERRATEC_PRODIGY_XS: | 1338 | case EM2880_BOARD_TERRATEC_PRODIGY_XS: |
544 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 1339 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
545 | case EM2880_BOARD_TERRATEC_HYBRID_XS: | 1340 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: |
546 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950: | 1341 | case EM2860_BOARD_TERRATEC_HYBRID_XS: |
1342 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: | ||
1343 | case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: | ||
1344 | case EM2882_BOARD_PINNACLE_HYBRID_PRO: | ||
1345 | case EM2883_BOARD_KWORLD_HYBRID_A316: | ||
1346 | case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: | ||
1347 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1348 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1349 | msleep(50); | ||
1350 | |||
1351 | /* Sets GPO/GPIO sequences for this device */ | ||
1352 | dev->analog_gpio = hauppauge_wintv_hvr_900_analog; | ||
1353 | dev->digital_gpio = hauppauge_wintv_hvr_900_digital; | ||
1354 | dev->tun_analog_gpio = default_callback; | ||
1355 | dev->tun_digital_gpio = default_callback; | ||
1356 | break; | ||
1357 | |||
1358 | case EM2882_BOARD_TERRATEC_HYBRID_XS: | ||
547 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | 1359 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); |
548 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | 1360 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); |
549 | msleep(50); | 1361 | msleep(50); |
550 | 1362 | ||
1363 | /* should be added ir_codes here */ | ||
1364 | |||
551 | /* Sets GPO/GPIO sequences for this device */ | 1365 | /* Sets GPO/GPIO sequences for this device */ |
552 | dev->analog_gpio = hauppauge_wintv_hvr_900_analog; | 1366 | dev->analog_gpio = hauppauge_wintv_hvr_900_analog; |
553 | dev->digital_gpio = hauppauge_wintv_hvr_900_digital; | 1367 | dev->digital_gpio = hauppauge_wintv_hvr_900_digital; |
554 | dev->tun_analog_gpio = hauppauge_wintv_hvr_900_tuner_callback; | 1368 | dev->tun_analog_gpio = default_callback; |
555 | dev->tun_digital_gpio = hauppauge_wintv_hvr_900_tuner_callback; | 1369 | dev->tun_digital_gpio = em2882_terratec_hybrid_xs_digital; |
1370 | break; | ||
1371 | |||
1372 | case EM2880_BOARD_TERRATEC_HYBRID_XS_FR: | ||
1373 | case EM2880_BOARD_TERRATEC_HYBRID_XS: | ||
1374 | case EM2870_BOARD_TERRATEC_XS: | ||
1375 | case EM2881_BOARD_PINNACLE_HYBRID_PRO: | ||
1376 | case EM2880_BOARD_KWORLD_DVB_310U: | ||
1377 | case EM2870_BOARD_KWORLD_350U: | ||
1378 | case EM2881_BOARD_DNT_DA2_HYBRID: | ||
1379 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1380 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1381 | msleep(50); | ||
1382 | |||
1383 | /* NOTE: EM2881_DNT_DA2_HYBRID spend 140 msleep for digital | ||
1384 | and analog commands. If this commands doesn't work, | ||
1385 | add this timer. */ | ||
1386 | |||
1387 | /* Sets GPO/GPIO sequences for this device */ | ||
1388 | dev->analog_gpio = default_analog; | ||
1389 | dev->digital_gpio = default_digital; | ||
1390 | dev->tun_analog_gpio = default_callback; | ||
1391 | dev->tun_digital_gpio = default_callback; | ||
1392 | break; | ||
1393 | |||
1394 | case EM2880_BOARD_MSI_DIGIVOX_AD: | ||
1395 | case EM2880_BOARD_MSI_DIGIVOX_AD_II: | ||
1396 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1397 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1398 | msleep(50); | ||
556 | 1399 | ||
1400 | /* Sets GPO/GPIO sequences for this device */ | ||
1401 | dev->analog_gpio = em2880_msi_digivox_ad_analog; | ||
1402 | dev->digital_gpio = em2880_msi_digivox_ad_digital; | ||
1403 | dev->tun_analog_gpio = default_callback; | ||
1404 | dev->tun_digital_gpio = default_callback; | ||
1405 | break; | ||
1406 | |||
1407 | case EM2750_BOARD_UNKNOWN: | ||
1408 | case EM2750_BOARD_DLCW_130: | ||
1409 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x0a", 1); | ||
1410 | break; | ||
1411 | |||
1412 | case EM2861_BOARD_PLEXTOR_PX_TV100U: | ||
1413 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1414 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1415 | /* FIXME guess */ | ||
1416 | /* Turn on analog audio output */ | ||
1417 | em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1); | ||
1418 | break; | ||
1419 | |||
1420 | case EM2861_BOARD_KWORLD_PVRTV_300U: | ||
1421 | case EM2880_BOARD_KWORLD_DVB_305U: | ||
1422 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1423 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x4c", 1); | ||
1424 | msleep(10); | ||
1425 | em28xx_write_regs(dev, 0x08, "\x6d", 1); | ||
1426 | msleep(10); | ||
1427 | em28xx_write_regs(dev, 0x08, "\x7d", 1); | ||
1428 | msleep(10); | ||
1429 | break; | ||
1430 | |||
1431 | case EM2870_BOARD_KWORLD_355U: | ||
1432 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1433 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1434 | msleep(50); | ||
1435 | |||
1436 | /* Sets GPO/GPIO sequences for this device */ | ||
1437 | dev->digital_gpio = em2870_kworld_355u_digital; | ||
1438 | break; | ||
1439 | |||
1440 | case EM2870_BOARD_COMPRO_VIDEOMATE: | ||
1441 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1442 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1443 | /* TODO: someone can do some cleanup here... | ||
1444 | not everything's needed */ | ||
1445 | em28xx_write_regs(dev, 0x04, "\x00", 1); | ||
1446 | msleep(10); | ||
1447 | em28xx_write_regs(dev, 0x04, "\x01", 1); | ||
1448 | msleep(10); | ||
1449 | em28xx_write_regs(dev, 0x08, "\xfd", 1); | ||
1450 | mdelay(70); | ||
1451 | em28xx_write_regs(dev, 0x08, "\xfc", 1); | ||
1452 | mdelay(70); | ||
1453 | em28xx_write_regs(dev, 0x08, "\xdc", 1); | ||
1454 | mdelay(70); | ||
1455 | em28xx_write_regs(dev, 0x08, "\xfc", 1); | ||
1456 | mdelay(70); | ||
1457 | break; | ||
1458 | |||
1459 | case EM2870_BOARD_TERRATEC_XS_MT2060: | ||
1460 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1461 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1462 | /* this device needs some gpio writes to get the DVB-T | ||
1463 | demod work */ | ||
1464 | em28xx_write_regs(dev, 0x08, "\xfe", 1); | ||
1465 | mdelay(70); | ||
1466 | em28xx_write_regs(dev, 0x08, "\xde", 1); | ||
1467 | mdelay(70); | ||
1468 | dev->em28xx_write_regs(dev, 0x08, "\xfe", 1); | ||
1469 | mdelay(70); | ||
1470 | break; | ||
1471 | |||
1472 | case EM2870_BOARD_PINNACLE_PCTV_DVB: | ||
1473 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1474 | /* this device needs some gpio writes to get the | ||
1475 | DVB-T demod work */ | ||
1476 | em28xx_write_regs(dev, 0x08, "\xfe", 1); | ||
1477 | mdelay(70); | ||
1478 | em28xx_write_regs(dev, 0x08, "\xde", 1); | ||
1479 | mdelay(70); | ||
1480 | em28xx_write_regs(dev, 0x08, "\xfe", 1); | ||
1481 | mdelay(70); | ||
1482 | /* switch em2880 rc protocol */ | ||
1483 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x22", 1); | ||
1484 | /* should be added ir_codes here */ | ||
1485 | break; | ||
1486 | |||
1487 | case EM2820_BOARD_GADMEI_UTV310: | ||
1488 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1489 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1490 | /* Turn on analog audio output */ | ||
1491 | em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1); | ||
1492 | break; | ||
1493 | |||
1494 | case EM2860_BOARD_GADMEI_UTV330: | ||
1495 | /* Turn on IR */ | ||
1496 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1); | ||
1497 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1498 | /* should be added ir_codes here */ | ||
1499 | break; | ||
1500 | |||
1501 | case EM2820_BOARD_MSI_VOX_USB_2: | ||
1502 | em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); | ||
1503 | em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); | ||
1504 | /* enables audio for that device */ | ||
1505 | em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1); | ||
557 | break; | 1506 | break; |
558 | } | 1507 | } |
559 | 1508 | ||
@@ -576,7 +1525,19 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) | |||
576 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 1525 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
577 | ctl->demod = XC3028_FE_ZARLINK456; | 1526 | ctl->demod = XC3028_FE_ZARLINK456; |
578 | break; | 1527 | break; |
579 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950: | 1528 | case EM2880_BOARD_TERRATEC_HYBRID_XS: |
1529 | ctl->demod = XC3028_FE_ZARLINK456; | ||
1530 | break; | ||
1531 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: | ||
1532 | /* djh - Not sure which demod we need here */ | ||
1533 | ctl->demod = XC3028_FE_DEFAULT; | ||
1534 | break; | ||
1535 | case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: | ||
1536 | ctl->demod = XC3028_FE_DEFAULT; | ||
1537 | ctl->fname = XC3028L_DEFAULT_FIRMWARE; | ||
1538 | break; | ||
1539 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: | ||
1540 | case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: | ||
580 | /* FIXME: Better to specify the needed IF */ | 1541 | /* FIXME: Better to specify the needed IF */ |
581 | ctl->demod = XC3028_FE_DEFAULT; | 1542 | ctl->demod = XC3028_FE_DEFAULT; |
582 | break; | 1543 | break; |
@@ -741,6 +1702,8 @@ void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) | |||
741 | break; | 1702 | break; |
742 | case (EM2800_BOARD_KWORLD_USB2800): | 1703 | case (EM2800_BOARD_KWORLD_USB2800): |
743 | break; | 1704 | break; |
1705 | case (EM2800_BOARD_GRABBEEX_USB2800): | ||
1706 | break; | ||
744 | } | 1707 | } |
745 | } | 1708 | } |
746 | 1709 | ||
@@ -754,7 +1717,8 @@ void em28xx_card_setup(struct em28xx *dev) | |||
754 | switch (dev->model) { | 1717 | switch (dev->model) { |
755 | case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: | 1718 | case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: |
756 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: | 1719 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: |
757 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_950: | 1720 | case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: |
1721 | case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: | ||
758 | { | 1722 | { |
759 | struct tveeprom tv; | 1723 | struct tveeprom tv; |
760 | #ifdef CONFIG_MODULES | 1724 | #ifdef CONFIG_MODULES |
@@ -767,7 +1731,7 @@ void em28xx_card_setup(struct em28xx *dev) | |||
767 | 1731 | ||
768 | dev->tuner_type = tv.tuner_type; | 1732 | dev->tuner_type = tv.tuner_type; |
769 | 1733 | ||
770 | if (tv.audio_processor == AUDIO_CHIP_MSP34XX) { | 1734 | if (tv.audio_processor == V4L2_IDENT_MSPX4XX) { |
771 | dev->i2s_speed = 2048000; | 1735 | dev->i2s_speed = 2048000; |
772 | dev->has_msp34xx = 1; | 1736 | dev->has_msp34xx = 1; |
773 | } | 1737 | } |
@@ -783,8 +1747,35 @@ void em28xx_card_setup(struct em28xx *dev) | |||
783 | break; | 1747 | break; |
784 | case EM2820_BOARD_UNKNOWN: | 1748 | case EM2820_BOARD_UNKNOWN: |
785 | case EM2800_BOARD_UNKNOWN: | 1749 | case EM2800_BOARD_UNKNOWN: |
1750 | /* | ||
1751 | * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD. | ||
1752 | * | ||
1753 | * This occurs because they share identical USB vendor and | ||
1754 | * product IDs. | ||
1755 | * | ||
1756 | * What we do here is look up the EEPROM hash of the K-WORLD | ||
1757 | * and if it is found then we decide that we do not have | ||
1758 | * a DIGIVOX and reset the device to the K-WORLD instead. | ||
1759 | * | ||
1760 | * This solution is only valid if they do not share eeprom | ||
1761 | * hash identities which has not been determined as yet. | ||
1762 | */ | ||
1763 | case EM2880_BOARD_MSI_DIGIVOX_AD: | ||
786 | if (!em28xx_hint_board(dev)) | 1764 | if (!em28xx_hint_board(dev)) |
787 | em28xx_set_model(dev); | 1765 | em28xx_set_model(dev); |
1766 | break; | ||
1767 | } | ||
1768 | |||
1769 | if (dev->has_snapshot_button) | ||
1770 | em28xx_register_snapshot_button(dev); | ||
1771 | |||
1772 | if (dev->valid == EM28XX_BOARD_NOT_VALIDATED) { | ||
1773 | em28xx_errdev("\n\n"); | ||
1774 | em28xx_errdev("The support for this board weren't " | ||
1775 | "valid yet.\n"); | ||
1776 | em28xx_errdev("Please send a report of having this working\n"); | ||
1777 | em28xx_errdev("not to V4L mailing list (and/or to other " | ||
1778 | "addresses)\n\n"); | ||
788 | } | 1779 | } |
789 | 1780 | ||
790 | /* Allow override tuner type by a module parameter */ | 1781 | /* Allow override tuner type by a module parameter */ |