em28xx-cards.c revision f09fb53075646c35efe0f74d97b7c4bc7ec61e5a
1/* 2 em28xx-cards.c - driver for Empia EM2800/EM2820/2840 USB 3 video capture devices 4 5 Copyright (C) 2005 Ludovico Cavedon <cavedon@sssup.it> 6 Markus Rechberger <mrechberger@gmail.com> 7 Mauro Carvalho Chehab <mchehab@infradead.org> 8 Sascha Sommer <saschasommer@freenet.de> 9 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> 27#include <linux/delay.h> 28#include <linux/i2c.h> 29#include <linux/usb.h> 30#include <media/tuner.h> 31#include <media/msp3400.h> 32#include <media/saa7115.h> 33#include <media/tvp5150.h> 34#include <media/tveeprom.h> 35#include <media/v4l2-common.h> 36#include <media/v4l2-chip-ident.h> 37 38#include "em28xx.h" 39 40static int tuner = -1; 41module_param(tuner, int, 0444); 42MODULE_PARM_DESC(tuner, "tuner type"); 43 44static unsigned int disable_ir; 45module_param(disable_ir, int, 0444); 46MODULE_PARM_DESC(disable_ir, "disable infrared remote support"); 47 48struct em28xx_hash_table { 49 unsigned long hash; 50 unsigned int model; 51 unsigned int tuner; 52}; 53 54struct 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 }, 64 [EM2800_BOARD_UNKNOWN] = { 65 .name = "Unknown EM2800 video grabber", 66 .is_em2800 = 1, 67 .vchannels = 2, 68 .tda9887_conf = TDA9887_PRESENT, 69 .decoder = EM28XX_SAA7113, 70 .input = { { 71 .type = EM28XX_VMUX_COMPOSITE1, 72 .vmux = SAA7115_COMPOSITE0, 73 .amux = 1, 74 }, { 75 .type = EM28XX_VMUX_SVIDEO, 76 .vmux = SAA7115_SVIDEO3, 77 .amux = 1, 78 } }, 79 }, 80 [EM2820_BOARD_UNKNOWN] = { 81 .name = "Unknown EM2750/28xx video grabber", 82 .is_em2800 = 0, 83 .tuner_type = TUNER_ABSENT, 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 }, 96 [EM2820_BOARD_KWORLD_PVRTV2800RF] = { 97 .name = "Kworld PVR TV 2800 RF", 98 .is_em2800 = 0, 99 .vchannels = 2, 100 .tuner_type = TUNER_TEMIC_PAL, 101 .tda9887_conf = TDA9887_PRESENT, 102 .decoder = EM28XX_SAA7113, 103 .input = { { 104 .type = EM28XX_VMUX_COMPOSITE1, 105 .vmux = SAA7115_COMPOSITE0, 106 .amux = 1, 107 }, { 108 .type = EM28XX_VMUX_SVIDEO, 109 .vmux = SAA7115_SVIDEO3, 110 .amux = 1, 111 } }, 112 }, 113 [EM2820_BOARD_TERRATEC_CINERGY_250] = { 114 .name = "Terratec Cinergy 250 USB", 115 .vchannels = 3, 116 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 117 .tda9887_conf = TDA9887_PRESENT, 118 .decoder = EM28XX_SAA7113, 119 .input = { { 120 .type = EM28XX_VMUX_TELEVISION, 121 .vmux = SAA7115_COMPOSITE2, 122 .amux = 1, 123 }, { 124 .type = EM28XX_VMUX_COMPOSITE1, 125 .vmux = SAA7115_COMPOSITE0, 126 .amux = 1, 127 }, { 128 .type = EM28XX_VMUX_SVIDEO, 129 .vmux = SAA7115_SVIDEO3, 130 .amux = 1, 131 } }, 132 }, 133 [EM2820_BOARD_PINNACLE_USB_2] = { 134 .name = "Pinnacle PCTV USB 2", 135 .vchannels = 3, 136 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 137 .tda9887_conf = TDA9887_PRESENT, 138 .decoder = EM28XX_SAA7113, 139 .input = { { 140 .type = EM28XX_VMUX_TELEVISION, 141 .vmux = SAA7115_COMPOSITE2, 142 .amux = 0, 143 }, { 144 .type = EM28XX_VMUX_COMPOSITE1, 145 .vmux = SAA7115_COMPOSITE0, 146 .amux = 1, 147 }, { 148 .type = EM28XX_VMUX_SVIDEO, 149 .vmux = SAA7115_SVIDEO3, 150 .amux = 1, 151 } }, 152 }, 153 [EM2820_BOARD_HAUPPAUGE_WINTV_USB_2] = { 154 .name = "Hauppauge WinTV USB 2", 155 .vchannels = 3, 156 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 157 .tda9887_conf = TDA9887_PRESENT | 158 TDA9887_PORT1_ACTIVE| 159 TDA9887_PORT2_ACTIVE, 160 .decoder = EM28XX_TVP5150, 161 .has_msp34xx = 1, 162 /*FIXME: S-Video not tested */ 163 .input = { { 164 .type = EM28XX_VMUX_TELEVISION, 165 .vmux = TVP5150_COMPOSITE0, 166 .amux = MSP_INPUT_DEFAULT, 167 }, { 168 .type = EM28XX_VMUX_SVIDEO, 169 .vmux = TVP5150_SVIDEO, 170 .amux = MSP_INPUT(MSP_IN_SCART1, MSP_IN_TUNER1, 171 MSP_DSP_IN_SCART, MSP_DSP_IN_SCART), 172 } }, 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 }, 544 [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = { 545 .name = "Hauppauge WinTV HVR 900", 546 .vchannels = 3, 547 .tda9887_conf = TDA9887_PRESENT, 548 .tuner_type = TUNER_XC2028, 549 .mts_firmware = 1, 550 .has_dvb = 1, 551 .decoder = EM28XX_TVP5150, 552 .input = { { 553 .type = EM28XX_VMUX_TELEVISION, 554 .vmux = TVP5150_COMPOSITE0, 555 .amux = 0, 556 }, { 557 .type = EM28XX_VMUX_COMPOSITE1, 558 .vmux = TVP5150_COMPOSITE1, 559 .amux = 1, 560 }, { 561 .type = EM28XX_VMUX_SVIDEO, 562 .vmux = TVP5150_SVIDEO, 563 .amux = 1, 564 } }, 565 }, 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] = { 588 .name = "Hauppauge WinTV HVR 950", 589 .vchannels = 3, 590 .tda9887_conf = TDA9887_PRESENT, 591 .tuner_type = TUNER_XC2028, 592 .mts_firmware = 1, 593 .has_12mhz_i2s = 1, 594 .has_dvb = 1, 595 .ir_codes = ir_codes_hauppauge_new, 596 .decoder = EM28XX_TVP5150, 597 .input = { { 598 .type = EM28XX_VMUX_TELEVISION, 599 .vmux = TVP5150_COMPOSITE0, 600 .amux = 0, 601 }, { 602 .type = EM28XX_VMUX_COMPOSITE1, 603 .vmux = TVP5150_COMPOSITE1, 604 .amux = 1, 605 }, { 606 .type = EM28XX_VMUX_SVIDEO, 607 .vmux = TVP5150_SVIDEO, 608 .amux = 1, 609 } }, 610 }, 611 [EM2880_BOARD_PINNACLE_PCTV_HD_PRO] = { 612 .name = "Pinnacle PCTV HD Pro Stick", 613 .vchannels = 3, 614 .tda9887_conf = TDA9887_PRESENT, 615 .tuner_type = TUNER_XC2028, 616 .mts_firmware = 1, 617 .has_12mhz_i2s = 1, 618 .has_dvb = 1, 619 .ir_codes = ir_codes_pinnacle_pctv_hd, 620 .decoder = EM28XX_TVP5150, 621 .input = { { 622 .type = EM28XX_VMUX_TELEVISION, 623 .vmux = TVP5150_COMPOSITE0, 624 .amux = 0, 625 }, { 626 .type = EM28XX_VMUX_COMPOSITE1, 627 .vmux = TVP5150_COMPOSITE1, 628 .amux = 1, 629 }, { 630 .type = EM28XX_VMUX_SVIDEO, 631 .vmux = TVP5150_SVIDEO, 632 .amux = 1, 633 } }, 634 }, 635 [EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600] = { 636 .name = "AMD ATI TV Wonder HD 600", 637 .vchannels = 3, 638 .tda9887_conf = TDA9887_PRESENT, 639 .tuner_type = TUNER_XC2028, 640 .mts_firmware = 1, 641 .has_12mhz_i2s = 1, 642 .has_dvb = 1, 643 .ir_codes = ir_codes_ati_tv_wonder_hd_600, 644 .decoder = EM28XX_TVP5150, 645 .input = { { 646 .type = EM28XX_VMUX_TELEVISION, 647 .vmux = TVP5150_COMPOSITE0, 648 .amux = 0, 649 }, { 650 .type = EM28XX_VMUX_COMPOSITE1, 651 .vmux = TVP5150_COMPOSITE1, 652 .amux = 1, 653 }, { 654 .type = EM28XX_VMUX_SVIDEO, 655 .vmux = TVP5150_SVIDEO, 656 .amux = 1, 657 } }, 658 }, 659 [EM2880_BOARD_TERRATEC_HYBRID_XS] = { 660 .name = "Terratec Hybrid XS", 661 .vchannels = 3, 662 .tda9887_conf = TDA9887_PRESENT, 663 .tuner_type = TUNER_XC2028, 664 .decoder = EM28XX_TVP5150, 665 .has_dvb = 1, 666 .input = { { 667 .type = EM28XX_VMUX_TELEVISION, 668 .vmux = TVP5150_COMPOSITE0, 669 .amux = 0, 670 }, { 671 .type = EM28XX_VMUX_COMPOSITE1, 672 .vmux = TVP5150_COMPOSITE1, 673 .amux = 1, 674 }, { 675 .type = EM28XX_VMUX_SVIDEO, 676 .vmux = TVP5150_SVIDEO, 677 .amux = 1, 678 } }, 679 }, 680 /* maybe there's a reason behind it why Terratec sells the Hybrid XS 681 as Prodigy XS with a different PID, let's keep it separated for now 682 maybe we'll need it lateron */ 683 [EM2880_BOARD_TERRATEC_PRODIGY_XS] = { 684 .name = "Terratec Prodigy XS", 685 .vchannels = 3, 686 .tda9887_conf = TDA9887_PRESENT, 687 .tuner_type = TUNER_XC2028, 688 .decoder = EM28XX_TVP5150, 689 .input = { { 690 .type = EM28XX_VMUX_TELEVISION, 691 .vmux = TVP5150_COMPOSITE0, 692 .amux = 0, 693 }, { 694 .type = EM28XX_VMUX_COMPOSITE1, 695 .vmux = TVP5150_COMPOSITE1, 696 .amux = 1, 697 }, { 698 .type = EM28XX_VMUX_SVIDEO, 699 .vmux = TVP5150_SVIDEO, 700 .amux = 1, 701 } }, 702 }, 703 [EM2820_BOARD_MSI_VOX_USB_2] = { 704 .name = "MSI VOX USB 2.0", 705 .vchannels = 3, 706 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 707 .tda9887_conf = TDA9887_PRESENT | 708 TDA9887_PORT1_ACTIVE | 709 TDA9887_PORT2_ACTIVE, 710 .max_range_640_480 = 1, 711 712 .decoder = EM28XX_SAA7114, 713 .input = { { 714 .type = EM28XX_VMUX_TELEVISION, 715 .vmux = SAA7115_COMPOSITE4, 716 .amux = 0, 717 }, { 718 .type = EM28XX_VMUX_COMPOSITE1, 719 .vmux = SAA7115_COMPOSITE0, 720 .amux = 1, 721 }, { 722 .type = EM28XX_VMUX_SVIDEO, 723 .vmux = SAA7115_SVIDEO3, 724 .amux = 1, 725 } }, 726 }, 727 [EM2800_BOARD_TERRATEC_CINERGY_200] = { 728 .name = "Terratec Cinergy 200 USB", 729 .is_em2800 = 1, 730 .vchannels = 3, 731 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 732 .tda9887_conf = TDA9887_PRESENT, 733 .decoder = EM28XX_SAA7113, 734 .input = { { 735 .type = EM28XX_VMUX_TELEVISION, 736 .vmux = SAA7115_COMPOSITE2, 737 .amux = 0, 738 }, { 739 .type = EM28XX_VMUX_COMPOSITE1, 740 .vmux = SAA7115_COMPOSITE0, 741 .amux = 1, 742 }, { 743 .type = EM28XX_VMUX_SVIDEO, 744 .vmux = SAA7115_SVIDEO3, 745 .amux = 1, 746 } }, 747 }, 748 [EM2800_BOARD_GRABBEEX_USB2800] = { 749 .name = "eMPIA Technology, Inc. GrabBeeX+ Video Encoder", 750 .is_em2800 = 1, 751 .vchannels = 2, 752 .decoder = EM28XX_SAA7113, 753 .input = { { 754 .type = EM28XX_VMUX_COMPOSITE1, 755 .vmux = SAA7115_COMPOSITE0, 756 .amux = 1, 757 }, { 758 .type = EM28XX_VMUX_SVIDEO, 759 .vmux = SAA7115_SVIDEO3, 760 .amux = 1, 761 } }, 762 }, 763 [EM2800_BOARD_LEADTEK_WINFAST_USBII] = { 764 .name = "Leadtek Winfast USB II", 765 .is_em2800 = 1, 766 .vchannels = 3, 767 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 768 .tda9887_conf = TDA9887_PRESENT, 769 .decoder = EM28XX_SAA7113, 770 .input = { { 771 .type = EM28XX_VMUX_TELEVISION, 772 .vmux = SAA7115_COMPOSITE2, 773 .amux = 0, 774 }, { 775 .type = EM28XX_VMUX_COMPOSITE1, 776 .vmux = SAA7115_COMPOSITE0, 777 .amux = 1, 778 }, { 779 .type = EM28XX_VMUX_SVIDEO, 780 .vmux = SAA7115_SVIDEO3, 781 .amux = 1, 782 } }, 783 }, 784 [EM2800_BOARD_KWORLD_USB2800] = { 785 .name = "Kworld USB2800", 786 .is_em2800 = 1, 787 .vchannels = 3, 788 .tuner_type = TUNER_PHILIPS_FCV1236D, 789 .tda9887_conf = TDA9887_PRESENT, 790 .decoder = EM28XX_SAA7113, 791 .input = { { 792 .type = EM28XX_VMUX_TELEVISION, 793 .vmux = SAA7115_COMPOSITE2, 794 .amux = 0, 795 }, { 796 .type = EM28XX_VMUX_COMPOSITE1, 797 .vmux = SAA7115_COMPOSITE0, 798 .amux = 1, 799 }, { 800 .type = EM28XX_VMUX_SVIDEO, 801 .vmux = SAA7115_SVIDEO3, 802 .amux = 1, 803 } }, 804 }, 805 [EM2820_BOARD_PINNACLE_DVC_90] = { 806 .name = "Pinnacle Dazzle DVC 90/DVC 100", 807 .vchannels = 3, 808 .tuner_type = TUNER_ABSENT, 809 .decoder = EM28XX_SAA7113, 810 .input = { { 811 .type = EM28XX_VMUX_COMPOSITE1, 812 .vmux = SAA7115_COMPOSITE0, 813 .amux = 1, 814 }, { 815 .type = EM28XX_VMUX_SVIDEO, 816 .vmux = SAA7115_SVIDEO3, 817 .amux = 1, 818 } }, 819 }, 820 [EM2800_BOARD_VGEAR_POCKETTV] = { 821 .name = "V-Gear PocketTV", 822 .is_em2800 = 1, 823 .vchannels = 3, 824 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 825 .tda9887_conf = TDA9887_PRESENT, 826 .decoder = EM28XX_SAA7113, 827 .input = { { 828 .type = EM28XX_VMUX_TELEVISION, 829 .vmux = SAA7115_COMPOSITE2, 830 .amux = 0, 831 }, { 832 .type = EM28XX_VMUX_COMPOSITE1, 833 .vmux = SAA7115_COMPOSITE0, 834 .amux = 1, 835 }, { 836 .type = EM28XX_VMUX_SVIDEO, 837 .vmux = SAA7115_SVIDEO3, 838 .amux = 1, 839 } }, 840 }, 841 [EM2820_BOARD_PROLINK_PLAYTV_USB2] = { 842 .name = "Pixelview Prolink PlayTV USB 2.0", 843 .vchannels = 3, 844 .tda9887_conf = TDA9887_PRESENT, 845 .tuner_type = TUNER_YMEC_TVF_5533MF, 846 .decoder = EM28XX_SAA7113, 847 .input = { { 848 .type = EM28XX_VMUX_TELEVISION, 849 .vmux = SAA7115_COMPOSITE2, 850 .amux = EM28XX_AMUX_LINE_IN, 851 }, { 852 .type = EM28XX_VMUX_COMPOSITE1, 853 .vmux = SAA7115_COMPOSITE0, 854 .amux = EM28XX_AMUX_LINE_IN, 855 }, { 856 .type = EM28XX_VMUX_SVIDEO, 857 .vmux = SAA7115_SVIDEO3, 858 .amux = EM28XX_AMUX_LINE_IN, 859 } }, 860 }, 861 [EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA] = { 862 .name = "PointNix Intra-Oral Camera", 863 .has_snapshot_button = 1, 864 .vchannels = 1, 865 .tda9887_conf = TDA9887_PRESENT, 866 .tuner_type = TUNER_ABSENT, 867 .decoder = EM28XX_SAA7113, 868 .input = { { 869 .type = EM28XX_VMUX_SVIDEO, 870 .vmux = SAA7115_SVIDEO3, 871 .amux = 0, 872 } }, 873 }, 874 [EM2880_BOARD_MSI_DIGIVOX_AD] = { 875 .name = "MSI DigiVox A/D", 876 .valid = EM28XX_BOARD_NOT_VALIDATED, 877 .vchannels = 3, 878 .tuner_type = TUNER_XC2028, 879 .decoder = EM28XX_TVP5150, 880 .input = { { 881 .type = EM28XX_VMUX_TELEVISION, 882 .vmux = TVP5150_COMPOSITE0, 883 .amux = 0, 884 }, { 885 .type = EM28XX_VMUX_COMPOSITE1, 886 .vmux = TVP5150_COMPOSITE1, 887 .amux = 1, 888 }, { 889 .type = EM28XX_VMUX_SVIDEO, 890 .vmux = TVP5150_SVIDEO, 891 .amux = 1, 892 } }, 893 }, 894 [EM2880_BOARD_MSI_DIGIVOX_AD_II] = { 895 .name = "MSI DigiVox A/D II", 896 .valid = EM28XX_BOARD_NOT_VALIDATED, 897 .vchannels = 3, 898 .tuner_type = TUNER_XC2028, 899 .decoder = EM28XX_TVP5150, 900 .input = { { 901 .type = EM28XX_VMUX_TELEVISION, 902 .vmux = TVP5150_COMPOSITE0, 903 .amux = 0, 904 }, { 905 .type = EM28XX_VMUX_COMPOSITE1, 906 .vmux = TVP5150_COMPOSITE1, 907 .amux = 1, 908 }, { 909 .type = EM28XX_VMUX_SVIDEO, 910 .vmux = TVP5150_SVIDEO, 911 .amux = 1, 912 } }, 913 }, 914 [EM2880_BOARD_KWORLD_DVB_305U] = { 915 .name = "KWorld DVB-T 305U", 916 .valid = EM28XX_BOARD_NOT_VALIDATED, 917 .vchannels = 3, 918 .tuner_type = TUNER_XC2028, 919 .decoder = EM28XX_TVP5150, 920 .input = { { 921 .type = EM28XX_VMUX_TELEVISION, 922 .vmux = TVP5150_COMPOSITE0, 923 .amux = 0, 924 }, { 925 .type = EM28XX_VMUX_COMPOSITE1, 926 .vmux = TVP5150_COMPOSITE1, 927 .amux = 1, 928 }, { 929 .type = EM28XX_VMUX_SVIDEO, 930 .vmux = TVP5150_SVIDEO, 931 .amux = 1, 932 } }, 933 }, 934 [EM2880_BOARD_KWORLD_DVB_310U] = { 935 .name = "KWorld DVB-T 310U", 936 .vchannels = 3, 937 .tuner_type = TUNER_XC2028, 938 .has_dvb = 1, 939 .mts_firmware = 1, 940 .decoder = EM28XX_TVP5150, 941 .input = { { 942 .type = EM28XX_VMUX_TELEVISION, 943 .vmux = TVP5150_COMPOSITE0, 944 .amux = EM28XX_AMUX_VIDEO, 945 }, { 946 .type = EM28XX_VMUX_COMPOSITE1, 947 .vmux = TVP5150_COMPOSITE1, 948 .amux = EM28XX_AMUX_AC97_LINE_IN, 949 }, { /* S-video has not been tested yet */ 950 .type = EM28XX_VMUX_SVIDEO, 951 .vmux = TVP5150_SVIDEO, 952 .amux = EM28XX_AMUX_AC97_LINE_IN, 953 } }, 954 }, 955 [EM2881_BOARD_DNT_DA2_HYBRID] = { 956 .name = "DNT DA2 Hybrid", 957 .valid = EM28XX_BOARD_NOT_VALIDATED, 958 .vchannels = 3, 959 .tuner_type = TUNER_XC2028, 960 .decoder = EM28XX_TVP5150, 961 .input = { { 962 .type = EM28XX_VMUX_TELEVISION, 963 .vmux = TVP5150_COMPOSITE0, 964 .amux = 0, 965 }, { 966 .type = EM28XX_VMUX_COMPOSITE1, 967 .vmux = TVP5150_COMPOSITE1, 968 .amux = 1, 969 }, { 970 .type = EM28XX_VMUX_SVIDEO, 971 .vmux = TVP5150_SVIDEO, 972 .amux = 1, 973 } }, 974 }, 975 [EM2881_BOARD_PINNACLE_HYBRID_PRO] = { 976 .name = "Pinnacle Hybrid Pro", 977 .valid = EM28XX_BOARD_NOT_VALIDATED, 978 .vchannels = 3, 979 .tuner_type = TUNER_XC2028, 980 .decoder = EM28XX_TVP5150, 981 .input = { { 982 .type = EM28XX_VMUX_TELEVISION, 983 .vmux = TVP5150_COMPOSITE0, 984 .amux = 0, 985 }, { 986 .type = EM28XX_VMUX_COMPOSITE1, 987 .vmux = TVP5150_COMPOSITE1, 988 .amux = 1, 989 }, { 990 .type = EM28XX_VMUX_SVIDEO, 991 .vmux = TVP5150_SVIDEO, 992 .amux = 1, 993 } }, 994 }, 995 [EM2882_BOARD_PINNACLE_HYBRID_PRO] = { 996 .name = "Pinnacle Hybrid Pro (2)", 997 .valid = EM28XX_BOARD_NOT_VALIDATED, 998 .vchannels = 3, 999 .tuner_type = TUNER_XC2028, 1000 .mts_firmware = 1, 1001 .decoder = EM28XX_TVP5150, 1002 .input = { { 1003 .type = EM28XX_VMUX_TELEVISION, 1004 .vmux = TVP5150_COMPOSITE0, 1005 .amux = 0, 1006 }, { 1007 .type = EM28XX_VMUX_COMPOSITE1, 1008 .vmux = TVP5150_COMPOSITE1, 1009 .amux = 1, 1010 }, { 1011 .type = EM28XX_VMUX_SVIDEO, 1012 .vmux = TVP5150_SVIDEO, 1013 .amux = 1, 1014 } }, 1015 }, 1016 [EM2882_BOARD_KWORLD_VS_DVBT] = { 1017 .name = "Kworld VS-DVB-T 323UR", 1018 .valid = EM28XX_BOARD_NOT_VALIDATED, 1019 .vchannels = 3, 1020 .tuner_type = TUNER_XC2028, 1021 .decoder = EM28XX_TVP5150, 1022 .input = { { 1023 .type = EM28XX_VMUX_TELEVISION, 1024 .vmux = TVP5150_COMPOSITE0, 1025 .amux = 0, 1026 }, { 1027 .type = EM28XX_VMUX_COMPOSITE1, 1028 .vmux = TVP5150_COMPOSITE1, 1029 .amux = 1, 1030 }, { 1031 .type = EM28XX_VMUX_SVIDEO, 1032 .vmux = TVP5150_SVIDEO, 1033 .amux = 1, 1034 } }, 1035 }, 1036 [EM2882_BOARD_TERRATEC_HYBRID_XS] = { 1037 .name = "Terratec Hybrid XS (em2882)", 1038 .valid = EM28XX_BOARD_NOT_VALIDATED, 1039 .vchannels = 3, 1040 .tuner_type = TUNER_XC2028, 1041 .decoder = EM28XX_TVP5150, 1042 .input = { { 1043 .type = EM28XX_VMUX_TELEVISION, 1044 .vmux = TVP5150_COMPOSITE0, 1045 .amux = 0, 1046 }, { 1047 .type = EM28XX_VMUX_COMPOSITE1, 1048 .vmux = TVP5150_COMPOSITE1, 1049 .amux = 1, 1050 }, { 1051 .type = EM28XX_VMUX_SVIDEO, 1052 .vmux = TVP5150_SVIDEO, 1053 .amux = 1, 1054 } }, 1055 }, 1056 [EM2883_BOARD_KWORLD_HYBRID_A316] = { 1057 .name = "Kworld PlusTV HD Hybrid 330", 1058 .valid = EM28XX_BOARD_NOT_VALIDATED, 1059 .vchannels = 3, 1060 .is_em2800 = 0, 1061 .tuner_type = TUNER_XC2028, 1062 .decoder = EM28XX_TVP5150, 1063 .input = { { 1064 .type = EM28XX_VMUX_TELEVISION, 1065 .vmux = TVP5150_COMPOSITE0, 1066 .amux = 0, 1067 }, { 1068 .type = EM28XX_VMUX_COMPOSITE1, 1069 .vmux = TVP5150_COMPOSITE1, 1070 .amux = 1, 1071 }, { 1072 .type = EM28XX_VMUX_SVIDEO, 1073 .vmux = TVP5150_SVIDEO, 1074 .amux = 1, 1075 } }, 1076 }, 1077 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = { 1078 .name = "Compro VideoMate ForYou/Stereo", 1079 .vchannels = 2, 1080 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 1081 .tda9887_conf = TDA9887_PRESENT, 1082 .decoder = EM28XX_TVP5150, 1083 .input = { { 1084 .type = EM28XX_VMUX_TELEVISION, 1085 .vmux = TVP5150_COMPOSITE0, 1086 .amux = EM28XX_AMUX_LINE_IN, 1087 }, { 1088 .type = EM28XX_VMUX_SVIDEO, 1089 .vmux = TVP5150_SVIDEO, 1090 .amux = EM28XX_AMUX_LINE_IN, 1091 } }, 1092 }, 1093 [EM2874_BOARD_PINNACLE_PCTV_80E] = { 1094 .name = "Pinnacle PCTV HD Mini", 1095 .vchannels = 0, 1096 .tuner_type = TUNER_ABSENT, 1097 .has_dvb = 1, 1098 .ir_codes = ir_codes_pinnacle_pctv_hd, 1099 .decoder = EM28XX_NODECODER, 1100#ifdef DJH_DEBUG 1101 .input = { { 1102 .type = EM28XX_VMUX_TELEVISION, 1103 .vmux = TVP5150_COMPOSITE0, 1104 .amux = EM28XX_AMUX_LINE_IN, 1105 } }, 1106#endif 1107 }, 1108}; 1109const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); 1110 1111/* table of devices that work with this driver */ 1112struct usb_device_id em28xx_id_table [] = { 1113 { USB_DEVICE(0xeb1a, 0x2750), 1114 .driver_info = EM2750_BOARD_UNKNOWN }, 1115 { USB_DEVICE(0xeb1a, 0x2751), 1116 .driver_info = EM2750_BOARD_UNKNOWN }, 1117 { USB_DEVICE(0xeb1a, 0x2800), 1118 .driver_info = EM2800_BOARD_UNKNOWN }, 1119 { USB_DEVICE(0xeb1a, 0x2820), 1120 .driver_info = EM2820_BOARD_UNKNOWN }, 1121 { USB_DEVICE(0xeb1a, 0x2821), 1122 .driver_info = EM2820_BOARD_PROLINK_PLAYTV_USB2 }, 1123 { USB_DEVICE(0xeb1a, 0x2860), 1124 .driver_info = EM2820_BOARD_UNKNOWN }, 1125 { USB_DEVICE(0xeb1a, 0x2861), 1126 .driver_info = EM2820_BOARD_UNKNOWN }, 1127 { USB_DEVICE(0xeb1a, 0x2870), 1128 .driver_info = EM2820_BOARD_UNKNOWN }, 1129 { USB_DEVICE(0xeb1a, 0x2881), 1130 .driver_info = EM2820_BOARD_UNKNOWN }, 1131 { USB_DEVICE(0xeb1a, 0x2883), 1132 .driver_info = EM2820_BOARD_UNKNOWN }, 1133 { USB_DEVICE(0xeb1a, 0xe300), 1134 .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U }, 1135 { USB_DEVICE(0xeb1a, 0xe305), 1136 .driver_info = EM2880_BOARD_KWORLD_DVB_305U }, 1137 { USB_DEVICE(0xeb1a, 0xe310), 1138 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, 1139 { USB_DEVICE(0xeb1a, 0xa316), 1140 .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 }, 1141 { USB_DEVICE(0xeb1a, 0xe320), 1142 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II }, 1143 { USB_DEVICE(0xeb1a, 0xe323), 1144 .driver_info = EM2882_BOARD_KWORLD_VS_DVBT }, 1145 { USB_DEVICE(0xeb1a, 0xe350), 1146 .driver_info = EM2870_BOARD_KWORLD_350U }, 1147 { USB_DEVICE(0xeb1a, 0xe355), 1148 .driver_info = EM2870_BOARD_KWORLD_355U }, 1149 { USB_DEVICE(0xeb1a, 0x2801), 1150 .driver_info = EM2800_BOARD_GRABBEEX_USB2800 }, 1151 { USB_DEVICE(0xeb1a, 0xe357), 1152 .driver_info = EM2870_BOARD_KWORLD_355U }, 1153 { USB_DEVICE(0x0ccd, 0x0036), 1154 .driver_info = EM2820_BOARD_TERRATEC_CINERGY_250 }, 1155 { USB_DEVICE(0x0ccd, 0x004c), 1156 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS_FR }, 1157 { USB_DEVICE(0x0ccd, 0x004f), 1158 .driver_info = EM2860_BOARD_TERRATEC_HYBRID_XS }, 1159 { USB_DEVICE(0x0ccd, 0x005e), 1160 .driver_info = EM2882_BOARD_TERRATEC_HYBRID_XS }, 1161 { USB_DEVICE(0x0ccd, 0x0042), 1162 .driver_info = EM2880_BOARD_TERRATEC_HYBRID_XS }, 1163 { USB_DEVICE(0x0ccd, 0x0043), 1164 .driver_info = EM2870_BOARD_TERRATEC_XS }, 1165 { USB_DEVICE(0x0ccd, 0x0047), 1166 .driver_info = EM2880_BOARD_TERRATEC_PRODIGY_XS }, 1167 { USB_DEVICE(0x185b, 0x2870), 1168 .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, 1169 { USB_DEVICE(0x185b, 0x2041), 1170 .driver_info = EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU }, 1171 { USB_DEVICE(0x2040, 0x4200), 1172 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, 1173 { USB_DEVICE(0x2040, 0x4201), 1174 .driver_info = EM2820_BOARD_HAUPPAUGE_WINTV_USB_2 }, 1175 { USB_DEVICE(0x2040, 0x6500), 1176 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900 }, 1177 { USB_DEVICE(0x2040, 0x6502), 1178 .driver_info = EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2 }, 1179 { USB_DEVICE(0x2040, 0x6513), /* HCW HVR-980 */ 1180 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 1181 { USB_DEVICE(0x2040, 0x6517), /* HP HVR-950 */ 1182 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 1183 { USB_DEVICE(0x2040, 0x651b), /* RP HVR-950 */ 1184 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 1185 { USB_DEVICE(0x2040, 0x651f), /* HCW HVR-850 */ 1186 .driver_info = EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950 }, 1187 { USB_DEVICE(0x0438, 0xb002), 1188 .driver_info = EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600 }, 1189 { USB_DEVICE(0x2001, 0xf112), 1190 .driver_info = EM2820_BOARD_DLINK_USB_TV }, 1191 { USB_DEVICE(0x2304, 0x0207), 1192 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, 1193 { USB_DEVICE(0x2304, 0x0208), 1194 .driver_info = EM2820_BOARD_PINNACLE_USB_2 }, 1195 { USB_DEVICE(0x2304, 0x021a), 1196 .driver_info = EM2820_BOARD_PINNACLE_DVC_90 }, 1197 { USB_DEVICE(0x2304, 0x0226), 1198 .driver_info = EM2882_BOARD_PINNACLE_HYBRID_PRO }, 1199 { USB_DEVICE(0x2304, 0x0227), 1200 .driver_info = EM2880_BOARD_PINNACLE_PCTV_HD_PRO }, 1201 { USB_DEVICE(0x2304, 0x023f), 1202 .driver_info = EM2874_BOARD_PINNACLE_PCTV_80E }, 1203 { USB_DEVICE(0x0413, 0x6023), 1204 .driver_info = EM2800_BOARD_LEADTEK_WINFAST_USBII }, 1205 { USB_DEVICE(0x093b, 0xa005), 1206 .driver_info = EM2861_BOARD_PLEXTOR_PX_TV100U }, 1207 { }, 1208}; 1209MODULE_DEVICE_TABLE(usb, em28xx_id_table); 1210 1211/* 1212 * Reset sequences for analog/digital modes 1213 */ 1214 1215/* Reset for the most [analog] boards */ 1216static struct em28xx_reg_seq default_analog[] = { 1217 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, 1218 { -1, -1, -1, -1}, 1219}; 1220 1221/* Reset for the most [digital] boards */ 1222static struct em28xx_reg_seq default_digital[] = { 1223 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10}, 1224 { -1, -1, -1, -1}, 1225}; 1226 1227/* Board Hauppauge WinTV HVR 900 analog */ 1228static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = { 1229 {EM28XX_R08_GPIO, 0x2d, ~EM_GPIO_4, 10}, 1230 {0x05, 0xff, 0x10, 10}, 1231 { -1, -1, -1, -1}, 1232}; 1233 1234/* Board Hauppauge WinTV HVR 900 digital */ 1235static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = { 1236 {EM28XX_R08_GPIO, 0x2e, ~EM_GPIO_4, 10}, 1237 {EM2880_R04_GPO, 0x04, 0x0f, 10}, 1238 {EM2880_R04_GPO, 0x0c, 0x0f, 10}, 1239 { -1, -1, -1, -1}, 1240}; 1241 1242/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ 1243static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = { 1244 {EM28XX_R08_GPIO, 0x69, ~EM_GPIO_4, 10}, 1245 { -1, -1, -1, -1}, 1246}; 1247 1248/* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */ 1249static struct em28xx_reg_seq em2880_msi_digivox_ad_digital[] = { 1250 {EM28XX_R08_GPIO, 0x6a, ~EM_GPIO_4, 10}, 1251 { -1, -1, -1, -1}, 1252}; 1253 1254/* Board - EM2870 Kworld 355u 1255 Analog - No input analog */ 1256static struct em28xx_reg_seq em2870_kworld_355u_digital[] = { 1257 {EM2880_R04_GPO, 0x01, 0xff, 10}, 1258 { -1, -1, -1, -1}, 1259}; 1260 1261/* Callback for the most boards */ 1262static struct em28xx_reg_seq default_callback[] = { 1263 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, 1264 {EM28XX_R08_GPIO, 0, EM_GPIO_4, 10}, 1265 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, 1266 { -1, -1, -1, -1}, 1267}; 1268 1269/* Callback for EM2882 TERRATEC HYBRID XS */ 1270static struct em28xx_reg_seq em2882_terratec_hybrid_xs_digital[] = { 1271 {EM28XX_R08_GPIO, 0x2e, 0xff, 6}, 1272 {EM28XX_R08_GPIO, 0x3e, ~EM_GPIO_4, 6}, 1273 {EM2880_R04_GPO, 0x04, 0xff, 10}, 1274 {EM2880_R04_GPO, 0x0c, 0xff, 10}, 1275 { -1, -1, -1, -1}, 1276}; 1277 1278/* Pinnacle PCTV HD Mini (80e) GPIOs 1279 0-5: not used 1280 6: demod reset, active low 1281 7: LED on, active high */ 1282static struct em28xx_reg_seq em2874_pinnacle_80e_digital[] = { 1283 {EM28XX_R06_I2C_CLK, 0x45, 0xff, 10}, /*400 KHz*/ 1284 {EM2874_R80_GPIO, 0x80, 0xff, 100},/*Demod reset*/ 1285 {EM2874_R80_GPIO, 0xc0, 0xff, 10}, 1286 { -1, -1, -1, -1}, 1287}; 1288 1289/* 1290 * EEPROM hash table for devices with generic USB IDs 1291 */ 1292static struct em28xx_hash_table em28xx_eeprom_hash [] = { 1293 /* P/N: SA 60002070465 Tuner: TVF7533-MF */ 1294 {0x6ce05a8f, EM2820_BOARD_PROLINK_PLAYTV_USB2, TUNER_YMEC_TVF_5533MF}, 1295 {0x966a0441, EM2880_BOARD_KWORLD_DVB_310U, TUNER_XC2028}, 1296}; 1297 1298/* I2C devicelist hash table for devices with generic USB IDs */ 1299static struct em28xx_hash_table em28xx_i2c_hash[] = { 1300 {0xb06a32c3, EM2800_BOARD_TERRATEC_CINERGY_200, TUNER_LG_PAL_NEW_TAPC}, 1301 {0xf51200e3, EM2800_BOARD_VGEAR_POCKETTV, TUNER_LG_PAL_NEW_TAPC}, 1302 {0x1ba50080, EM2860_BOARD_POINTNIX_INTRAORAL_CAMERA, TUNER_ABSENT}, 1303}; 1304 1305int em28xx_tuner_callback(void *ptr, int component, int command, int arg) 1306{ 1307 int rc = 0; 1308 struct em28xx *dev = ptr; 1309 1310 if (dev->tuner_type != TUNER_XC2028) 1311 return 0; 1312 1313 if (command != XC2028_TUNER_RESET) 1314 return 0; 1315 1316 if (dev->mode == EM28XX_ANALOG_MODE) 1317 rc = em28xx_gpio_set(dev, dev->tun_analog_gpio); 1318 else 1319 rc = em28xx_gpio_set(dev, dev->tun_digital_gpio); 1320 1321 return rc; 1322} 1323EXPORT_SYMBOL_GPL(em28xx_tuner_callback); 1324 1325static void em28xx_set_model(struct em28xx *dev) 1326{ 1327 dev->is_em2800 = em28xx_boards[dev->model].is_em2800; 1328 dev->has_msp34xx = em28xx_boards[dev->model].has_msp34xx; 1329 dev->tda9887_conf = em28xx_boards[dev->model].tda9887_conf; 1330 dev->decoder = em28xx_boards[dev->model].decoder; 1331 dev->video_inputs = em28xx_boards[dev->model].vchannels; 1332 dev->has_12mhz_i2s = em28xx_boards[dev->model].has_12mhz_i2s; 1333 dev->max_range_640_480 = em28xx_boards[dev->model].max_range_640_480; 1334 dev->has_dvb = em28xx_boards[dev->model].has_dvb; 1335 dev->has_snapshot_button = em28xx_boards[dev->model].has_snapshot_button; 1336 dev->ir_codes = em28xx_boards[dev->model].ir_codes; 1337 dev->valid = em28xx_boards[dev->model].valid; 1338} 1339 1340/* Since em28xx_pre_card_setup() requires a proper dev->model, 1341 * this won't work for boards with generic PCI IDs 1342 */ 1343void em28xx_pre_card_setup(struct em28xx *dev) 1344{ 1345 int rc; 1346 1347 /* Set the default GPO/GPIO for legacy devices */ 1348 dev->reg_gpo_num = EM2880_R04_GPO; 1349 dev->reg_gpio_num = EM28XX_R08_GPIO; 1350 1351 dev->wait_after_write = 5; 1352 1353 /* Based on the Chip ID, set the device configuration */ 1354 rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); 1355 if (rc > 0) { 1356 dev->chip_id = rc; 1357 switch (rc) { 1358 case CHIP_ID_EM2820: 1359 em28xx_info("chip ID is em2820\n"); 1360 break; 1361 case CHIP_ID_EM2840: 1362 em28xx_info("chip ID is em2840\n"); 1363 break; 1364 case CHIP_ID_EM2860: 1365 em28xx_info("chip ID is em2860\n"); 1366 break; 1367 case CHIP_ID_EM2874: 1368 em28xx_info("chip ID is em2874\n"); 1369 dev->reg_gpio_num = EM2874_R80_GPIO; 1370 dev->wait_after_write = 0; 1371 break; 1372 case CHIP_ID_EM2883: 1373 em28xx_info("chip ID is em2882/em2883\n"); 1374 dev->wait_after_write = 0; 1375 break; 1376 default: 1377 em28xx_info("em28xx chip ID = %d\n", rc); 1378 } 1379 } 1380 1381 /* Prepopulate cached GPO register content */ 1382 rc = em28xx_read_reg(dev, dev->reg_gpo_num); 1383 if (rc >= 0) 1384 dev->reg_gpo = rc; 1385 1386 em28xx_set_model(dev); 1387 1388 /* request some modules */ 1389 switch (dev->model) { 1390 case EM2880_BOARD_TERRATEC_PRODIGY_XS: 1391 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: 1392 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: 1393 case EM2860_BOARD_TERRATEC_HYBRID_XS: 1394 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: 1395 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: 1396 case EM2882_BOARD_PINNACLE_HYBRID_PRO: 1397 case EM2883_BOARD_KWORLD_HYBRID_A316: 1398 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: 1399 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1400 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1401 msleep(50); 1402 1403 /* Sets GPO/GPIO sequences for this device */ 1404 dev->analog_gpio = hauppauge_wintv_hvr_900_analog; 1405 dev->digital_gpio = hauppauge_wintv_hvr_900_digital; 1406 dev->tun_analog_gpio = default_callback; 1407 dev->tun_digital_gpio = default_callback; 1408 break; 1409 1410 case EM2882_BOARD_TERRATEC_HYBRID_XS: 1411 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1412 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1413 msleep(50); 1414 1415 /* should be added ir_codes here */ 1416 1417 /* Sets GPO/GPIO sequences for this device */ 1418 dev->analog_gpio = hauppauge_wintv_hvr_900_analog; 1419 dev->digital_gpio = hauppauge_wintv_hvr_900_digital; 1420 dev->tun_analog_gpio = default_callback; 1421 dev->tun_digital_gpio = em2882_terratec_hybrid_xs_digital; 1422 break; 1423 1424 case EM2880_BOARD_TERRATEC_HYBRID_XS_FR: 1425 case EM2880_BOARD_TERRATEC_HYBRID_XS: 1426 case EM2870_BOARD_TERRATEC_XS: 1427 case EM2881_BOARD_PINNACLE_HYBRID_PRO: 1428 case EM2880_BOARD_KWORLD_DVB_310U: 1429 case EM2870_BOARD_KWORLD_350U: 1430 case EM2881_BOARD_DNT_DA2_HYBRID: 1431 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1432 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1433 msleep(50); 1434 1435 /* NOTE: EM2881_DNT_DA2_HYBRID spend 140 msleep for digital 1436 and analog commands. If this commands doesn't work, 1437 add this timer. */ 1438 1439 /* Sets GPO/GPIO sequences for this device */ 1440 dev->analog_gpio = default_analog; 1441 dev->digital_gpio = default_digital; 1442 dev->tun_analog_gpio = default_callback; 1443 dev->tun_digital_gpio = default_callback; 1444 break; 1445 1446 case EM2880_BOARD_MSI_DIGIVOX_AD: 1447 case EM2880_BOARD_MSI_DIGIVOX_AD_II: 1448 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1449 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1450 msleep(50); 1451 1452 /* Sets GPO/GPIO sequences for this device */ 1453 dev->analog_gpio = em2880_msi_digivox_ad_analog; 1454 dev->digital_gpio = em2880_msi_digivox_ad_digital; 1455 dev->tun_analog_gpio = default_callback; 1456 dev->tun_digital_gpio = default_callback; 1457 break; 1458 1459 case EM2750_BOARD_UNKNOWN: 1460 case EM2750_BOARD_DLCW_130: 1461 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x0a", 1); 1462 break; 1463 1464 case EM2861_BOARD_PLEXTOR_PX_TV100U: 1465 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1466 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1467 /* FIXME guess */ 1468 /* Turn on analog audio output */ 1469 em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1); 1470 break; 1471 1472 case EM2861_BOARD_KWORLD_PVRTV_300U: 1473 case EM2880_BOARD_KWORLD_DVB_305U: 1474 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1475 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x4c", 1); 1476 msleep(10); 1477 em28xx_write_regs(dev, 0x08, "\x6d", 1); 1478 msleep(10); 1479 em28xx_write_regs(dev, 0x08, "\x7d", 1); 1480 msleep(10); 1481 break; 1482 1483 case EM2870_BOARD_KWORLD_355U: 1484 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1485 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1486 msleep(50); 1487 1488 /* Sets GPO/GPIO sequences for this device */ 1489 dev->digital_gpio = em2870_kworld_355u_digital; 1490 break; 1491 1492 case EM2870_BOARD_COMPRO_VIDEOMATE: 1493 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1494 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1495 /* TODO: someone can do some cleanup here... 1496 not everything's needed */ 1497 em28xx_write_regs(dev, 0x04, "\x00", 1); 1498 msleep(10); 1499 em28xx_write_regs(dev, 0x04, "\x01", 1); 1500 msleep(10); 1501 em28xx_write_regs(dev, 0x08, "\xfd", 1); 1502 mdelay(70); 1503 em28xx_write_regs(dev, 0x08, "\xfc", 1); 1504 mdelay(70); 1505 em28xx_write_regs(dev, 0x08, "\xdc", 1); 1506 mdelay(70); 1507 em28xx_write_regs(dev, 0x08, "\xfc", 1); 1508 mdelay(70); 1509 break; 1510 1511 case EM2870_BOARD_TERRATEC_XS_MT2060: 1512 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1513 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1514 /* this device needs some gpio writes to get the DVB-T 1515 demod work */ 1516 em28xx_write_regs(dev, 0x08, "\xfe", 1); 1517 mdelay(70); 1518 em28xx_write_regs(dev, 0x08, "\xde", 1); 1519 mdelay(70); 1520 dev->em28xx_write_regs(dev, 0x08, "\xfe", 1); 1521 mdelay(70); 1522 break; 1523 1524 case EM2870_BOARD_PINNACLE_PCTV_DVB: 1525 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1526 /* this device needs some gpio writes to get the 1527 DVB-T demod work */ 1528 em28xx_write_regs(dev, 0x08, "\xfe", 1); 1529 mdelay(70); 1530 em28xx_write_regs(dev, 0x08, "\xde", 1); 1531 mdelay(70); 1532 em28xx_write_regs(dev, 0x08, "\xfe", 1); 1533 mdelay(70); 1534 /* switch em2880 rc protocol */ 1535 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x22", 1); 1536 /* should be added ir_codes here */ 1537 break; 1538 1539 case EM2820_BOARD_GADMEI_UTV310: 1540 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1541 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1542 /* Turn on analog audio output */ 1543 em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1); 1544 break; 1545 1546 case EM2860_BOARD_GADMEI_UTV330: 1547 /* Turn on IR */ 1548 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x07", 1); 1549 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1550 /* should be added ir_codes here */ 1551 break; 1552 1553 case EM2820_BOARD_MSI_VOX_USB_2: 1554 em28xx_write_regs(dev, EM28XX_R0F_XCLK, "\x27", 1); 1555 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x40", 1); 1556 /* enables audio for that device */ 1557 em28xx_write_regs_req(dev, 0x00, 0x08, "\xfd", 1); 1558 break; 1559 1560 case EM2874_BOARD_PINNACLE_PCTV_80E: 1561 /* Set 400 KHz clock */ 1562 em28xx_write_regs(dev, EM28XX_R06_I2C_CLK, "\x45", 1); 1563 1564 dev->digital_gpio = em2874_pinnacle_80e_digital; 1565 break; 1566 } 1567 1568 em28xx_gpio_set(dev, dev->tun_analog_gpio); 1569 em28xx_set_mode(dev, EM28XX_ANALOG_MODE); 1570 1571 /* Unlock device */ 1572 em28xx_set_mode(dev, EM28XX_MODE_UNDEFINED); 1573} 1574 1575static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl) 1576{ 1577 memset(ctl, 0, sizeof(*ctl)); 1578 1579 ctl->fname = XC2028_DEFAULT_FIRMWARE; 1580 ctl->max_len = 64; 1581 ctl->mts = em28xx_boards[dev->model].mts_firmware; 1582 1583 switch (dev->model) { 1584 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: 1585 ctl->demod = XC3028_FE_ZARLINK456; 1586 break; 1587 case EM2880_BOARD_TERRATEC_HYBRID_XS: 1588 ctl->demod = XC3028_FE_ZARLINK456; 1589 break; 1590 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: 1591 /* djh - Not sure which demod we need here */ 1592 ctl->demod = XC3028_FE_DEFAULT; 1593 break; 1594 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: 1595 ctl->demod = XC3028_FE_DEFAULT; 1596 ctl->fname = XC3028L_DEFAULT_FIRMWARE; 1597 break; 1598 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: 1599 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: 1600 /* FIXME: Better to specify the needed IF */ 1601 ctl->demod = XC3028_FE_DEFAULT; 1602 break; 1603 default: 1604 ctl->demod = XC3028_FE_OREN538; 1605 } 1606} 1607 1608static void em28xx_config_tuner(struct em28xx *dev) 1609{ 1610 struct v4l2_priv_tun_config xc2028_cfg; 1611 struct tuner_setup tun_setup; 1612 struct v4l2_frequency f; 1613 1614 if (dev->tuner_type == TUNER_ABSENT) 1615 return; 1616 1617 tun_setup.mode_mask = T_ANALOG_TV | T_RADIO; 1618 tun_setup.type = dev->tuner_type; 1619 tun_setup.addr = dev->tuner_addr; 1620 tun_setup.tuner_callback = em28xx_tuner_callback; 1621 1622 em28xx_i2c_call_clients(dev, TUNER_SET_TYPE_ADDR, &tun_setup); 1623 1624 if (dev->tuner_type == TUNER_XC2028) { 1625 struct xc2028_ctrl ctl; 1626 1627 em28xx_setup_xc3028(dev, &ctl); 1628 1629 xc2028_cfg.tuner = TUNER_XC2028; 1630 xc2028_cfg.priv = &ctl; 1631 1632 em28xx_i2c_call_clients(dev, TUNER_SET_CONFIG, &xc2028_cfg); 1633 } 1634 1635 /* configure tuner */ 1636 f.tuner = 0; 1637 f.type = V4L2_TUNER_ANALOG_TV; 1638 f.frequency = 9076; /* just a magic number */ 1639 dev->ctl_freq = f.frequency; 1640 em28xx_i2c_call_clients(dev, VIDIOC_S_FREQUENCY, &f); 1641} 1642 1643static int em28xx_hint_board(struct em28xx *dev) 1644{ 1645 int i; 1646 1647 /* HINT method: EEPROM 1648 * 1649 * This method works only for boards with eeprom. 1650 * Uses a hash of all eeprom bytes. The hash should be 1651 * unique for a vendor/tuner pair. 1652 * There are a high chance that tuners for different 1653 * video standards produce different hashes. 1654 */ 1655 for (i = 0; i < ARRAY_SIZE(em28xx_eeprom_hash); i++) { 1656 if (dev->hash == em28xx_eeprom_hash[i].hash) { 1657 dev->model = em28xx_eeprom_hash[i].model; 1658 dev->tuner_type = em28xx_eeprom_hash[i].tuner; 1659 1660 em28xx_errdev("Your board has no unique USB ID.\n"); 1661 em28xx_errdev("A hint were successfully done, " 1662 "based on eeprom hash.\n"); 1663 em28xx_errdev("This method is not 100%% failproof.\n"); 1664 em28xx_errdev("If the board were missdetected, " 1665 "please email this log to:\n"); 1666 em28xx_errdev("\tV4L Mailing List " 1667 " <video4linux-list@redhat.com>\n"); 1668 em28xx_errdev("Board detected as %s\n", 1669 em28xx_boards[dev->model].name); 1670 1671 return 0; 1672 } 1673 } 1674 1675 /* HINT method: I2C attached devices 1676 * 1677 * This method works for all boards. 1678 * Uses a hash of i2c scanned devices. 1679 * Devices with the same i2c attached chips will 1680 * be considered equal. 1681 * This method is less precise than the eeprom one. 1682 */ 1683 1684 /* user did not request i2c scanning => do it now */ 1685 if (!dev->i2c_hash) 1686 em28xx_do_i2c_scan(dev); 1687 1688 for (i = 0; i < ARRAY_SIZE(em28xx_i2c_hash); i++) { 1689 if (dev->i2c_hash == em28xx_i2c_hash[i].hash) { 1690 dev->model = em28xx_i2c_hash[i].model; 1691 dev->tuner_type = em28xx_i2c_hash[i].tuner; 1692 em28xx_errdev("Your board has no unique USB ID.\n"); 1693 em28xx_errdev("A hint were successfully done, " 1694 "based on i2c devicelist hash.\n"); 1695 em28xx_errdev("This method is not 100%% failproof.\n"); 1696 em28xx_errdev("If the board were missdetected, " 1697 "please email this log to:\n"); 1698 em28xx_errdev("\tV4L Mailing List " 1699 " <video4linux-list@redhat.com>\n"); 1700 em28xx_errdev("Board detected as %s\n", 1701 em28xx_boards[dev->model].name); 1702 1703 return 0; 1704 } 1705 } 1706 1707 em28xx_errdev("Your board has no unique USB ID and thus need a " 1708 "hint to be detected.\n"); 1709 em28xx_errdev("You may try to use card=<n> insmod option to " 1710 "workaround that.\n"); 1711 em28xx_errdev("Please send an email with this log to:\n"); 1712 em28xx_errdev("\tV4L Mailing List <video4linux-list@redhat.com>\n"); 1713 em28xx_errdev("Board eeprom hash is 0x%08lx\n", dev->hash); 1714 em28xx_errdev("Board i2c devicelist hash is 0x%08lx\n", dev->i2c_hash); 1715 1716 em28xx_errdev("Here is a list of valid choices for the card=<n>" 1717 " insmod option:\n"); 1718 for (i = 0; i < em28xx_bcount; i++) { 1719 em28xx_errdev(" card=%d -> %s\n", 1720 i, em28xx_boards[i].name); 1721 } 1722 return -1; 1723} 1724 1725/* ----------------------------------------------------------------------- */ 1726void em28xx_set_ir(struct em28xx *dev, struct IR_i2c *ir) 1727{ 1728 if (disable_ir) { 1729 ir->get_key = NULL; 1730 return ; 1731 } 1732 1733 /* detect & configure */ 1734 switch (dev->model) { 1735 case (EM2800_BOARD_UNKNOWN): 1736 break; 1737 case (EM2820_BOARD_UNKNOWN): 1738 break; 1739 case (EM2800_BOARD_TERRATEC_CINERGY_200): 1740 case (EM2820_BOARD_TERRATEC_CINERGY_250): 1741 ir->ir_codes = ir_codes_em_terratec; 1742 ir->get_key = em28xx_get_key_terratec; 1743 snprintf(ir->c.name, sizeof(ir->c.name), 1744 "i2c IR (EM28XX Terratec)"); 1745 break; 1746 case (EM2820_BOARD_PINNACLE_USB_2): 1747 ir->ir_codes = ir_codes_pinnacle_grey; 1748 ir->get_key = em28xx_get_key_pinnacle_usb_grey; 1749 snprintf(ir->c.name, sizeof(ir->c.name), 1750 "i2c IR (EM28XX Pinnacle PCTV)"); 1751 break; 1752 case (EM2820_BOARD_HAUPPAUGE_WINTV_USB_2): 1753 ir->ir_codes = ir_codes_hauppauge_new; 1754 ir->get_key = em28xx_get_key_em_haup; 1755 snprintf(ir->c.name, sizeof(ir->c.name), 1756 "i2c IR (EM2840 Hauppauge)"); 1757 break; 1758 case (EM2820_BOARD_MSI_VOX_USB_2): 1759 break; 1760 case (EM2800_BOARD_LEADTEK_WINFAST_USBII): 1761 break; 1762 case (EM2800_BOARD_KWORLD_USB2800): 1763 break; 1764 case (EM2800_BOARD_GRABBEEX_USB2800): 1765 break; 1766 } 1767} 1768 1769void em28xx_card_setup(struct em28xx *dev) 1770{ 1771 em28xx_set_model(dev); 1772 1773 dev->tuner_type = em28xx_boards[dev->model].tuner_type; 1774 dev->tuner_addr = em28xx_boards[dev->model].tuner_addr; 1775 1776 /* request some modules */ 1777 switch (dev->model) { 1778 case EM2820_BOARD_HAUPPAUGE_WINTV_USB_2: 1779 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900: 1780 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: 1781 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: 1782 { 1783 struct tveeprom tv; 1784#ifdef CONFIG_MODULES 1785 request_module("tveeprom"); 1786#endif 1787 /* Call first TVeeprom */ 1788 1789 dev->i2c_client.addr = 0xa0 >> 1; 1790 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, dev->eedata); 1791 1792 dev->tuner_type = tv.tuner_type; 1793 1794 if (tv.audio_processor == V4L2_IDENT_MSPX4XX) { 1795 dev->i2s_speed = 2048000; 1796 dev->has_msp34xx = 1; 1797 } 1798#ifdef CONFIG_MODULES 1799 if (tv.has_ir) 1800 request_module("ir-kbd-i2c"); 1801#endif 1802 break; 1803 } 1804 case EM2820_BOARD_KWORLD_PVRTV2800RF: 1805 /* GPIO enables sound on KWORLD PVR TV 2800RF */ 1806 em28xx_write_regs_req(dev, 0x00, 0x08, "\xf9", 1); 1807 break; 1808 case EM2820_BOARD_UNKNOWN: 1809 case EM2800_BOARD_UNKNOWN: 1810 /* 1811 * The K-WORLD DVB-T 310U is detected as an MSI Digivox AD. 1812 * 1813 * This occurs because they share identical USB vendor and 1814 * product IDs. 1815 * 1816 * What we do here is look up the EEPROM hash of the K-WORLD 1817 * and if it is found then we decide that we do not have 1818 * a DIGIVOX and reset the device to the K-WORLD instead. 1819 * 1820 * This solution is only valid if they do not share eeprom 1821 * hash identities which has not been determined as yet. 1822 */ 1823 case EM2880_BOARD_MSI_DIGIVOX_AD: 1824 if (!em28xx_hint_board(dev)) 1825 em28xx_set_model(dev); 1826 break; 1827 } 1828 1829 if (dev->has_snapshot_button) 1830 em28xx_register_snapshot_button(dev); 1831 1832 if (dev->valid == EM28XX_BOARD_NOT_VALIDATED) { 1833 em28xx_errdev("\n\n"); 1834 em28xx_errdev("The support for this board weren't " 1835 "valid yet.\n"); 1836 em28xx_errdev("Please send a report of having this working\n"); 1837 em28xx_errdev("not to V4L mailing list (and/or to other " 1838 "addresses)\n\n"); 1839 } 1840 1841 /* Allow override tuner type by a module parameter */ 1842 if (tuner >= 0) 1843 dev->tuner_type = tuner; 1844 1845#ifdef CONFIG_MODULES 1846 /* request some modules */ 1847 if (dev->has_msp34xx) 1848 request_module("msp3400"); 1849 if (dev->decoder == EM28XX_SAA7113 || dev->decoder == EM28XX_SAA7114) 1850 request_module("saa7115"); 1851 if (dev->decoder == EM28XX_TVP5150) 1852 request_module("tvp5150"); 1853 if (dev->tuner_type != TUNER_ABSENT) 1854 request_module("tuner"); 1855#endif 1856 1857 em28xx_config_tuner(dev); 1858 1859 em28xx_ir_init(dev); 1860} 1861