cx88-cards.c (99243B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * device driver for Conexant 2388x based TV cards 4 * card-specific stuff. 5 * 6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] 7 */ 8 9#include "cx88.h" 10#include "tea5767.h" 11#include "xc4000.h" 12 13#include <linux/init.h> 14#include <linux/module.h> 15#include <linux/pci.h> 16#include <linux/delay.h> 17#include <linux/slab.h> 18 19static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; 20static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; 21static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; 22 23module_param_array(tuner, int, NULL, 0444); 24module_param_array(radio, int, NULL, 0444); 25module_param_array(card, int, NULL, 0444); 26 27MODULE_PARM_DESC(tuner, "tuner type"); 28MODULE_PARM_DESC(radio, "radio tuner type"); 29MODULE_PARM_DESC(card, "card type"); 30 31static unsigned int latency = UNSET; 32module_param(latency, int, 0444); 33MODULE_PARM_DESC(latency, "pci latency timer"); 34 35static int disable_ir; 36module_param(disable_ir, int, 0444); 37MODULE_PARM_DESC(disable_ir, "Disable IR support"); 38 39#define dprintk(level, fmt, arg...) do { \ 40 if (cx88_core_debug >= level) \ 41 printk(KERN_DEBUG pr_fmt("%s: core:" fmt), \ 42 __func__, ##arg); \ 43} while (0) 44 45/* ------------------------------------------------------------------ */ 46/* board config info */ 47 48/* If radio_type !=UNSET, radio_addr should be specified 49 */ 50 51static const struct cx88_board cx88_boards[] = { 52 [CX88_BOARD_UNKNOWN] = { 53 .name = "UNKNOWN/GENERIC", 54 .tuner_type = UNSET, 55 .radio_type = UNSET, 56 .tuner_addr = ADDR_UNSET, 57 .radio_addr = ADDR_UNSET, 58 .input = { { 59 .type = CX88_VMUX_COMPOSITE1, 60 .vmux = 0, 61 }, { 62 .type = CX88_VMUX_COMPOSITE2, 63 .vmux = 1, 64 }, { 65 .type = CX88_VMUX_COMPOSITE3, 66 .vmux = 2, 67 }, { 68 .type = CX88_VMUX_COMPOSITE4, 69 .vmux = 3, 70 } }, 71 }, 72 [CX88_BOARD_HAUPPAUGE] = { 73 .name = "Hauppauge WinTV 34xxx models", 74 .tuner_type = UNSET, 75 .radio_type = UNSET, 76 .tuner_addr = ADDR_UNSET, 77 .radio_addr = ADDR_UNSET, 78 .tda9887_conf = TDA9887_PRESENT, 79 .input = { { 80 .type = CX88_VMUX_TELEVISION, 81 .vmux = 0, 82 .gpio0 = 0xff00, // internal decoder 83 }, { 84 .type = CX88_VMUX_DEBUG, 85 .vmux = 0, 86 .gpio0 = 0xff01, // mono from tuner chip 87 }, { 88 .type = CX88_VMUX_COMPOSITE1, 89 .vmux = 1, 90 .gpio0 = 0xff02, 91 }, { 92 .type = CX88_VMUX_SVIDEO, 93 .vmux = 2, 94 .gpio0 = 0xff02, 95 } }, 96 .radio = { 97 .type = CX88_RADIO, 98 .gpio0 = 0xff01, 99 }, 100 }, 101 [CX88_BOARD_GDI] = { 102 .name = "GDI Black Gold", 103 .tuner_type = UNSET, 104 .radio_type = UNSET, 105 .tuner_addr = ADDR_UNSET, 106 .radio_addr = ADDR_UNSET, 107 .input = { { 108 .type = CX88_VMUX_TELEVISION, 109 .vmux = 0, 110 }, { 111 .type = CX88_VMUX_SVIDEO, 112 .vmux = 2, 113 } }, 114 }, 115 [CX88_BOARD_PIXELVIEW] = { 116 .name = "PixelView", 117 .tuner_type = TUNER_PHILIPS_PAL, 118 .radio_type = UNSET, 119 .tuner_addr = ADDR_UNSET, 120 .radio_addr = ADDR_UNSET, 121 .input = { { 122 .type = CX88_VMUX_TELEVISION, 123 .vmux = 0, 124 .gpio0 = 0xff00, // internal decoder 125 }, { 126 .type = CX88_VMUX_COMPOSITE1, 127 .vmux = 1, 128 }, { 129 .type = CX88_VMUX_SVIDEO, 130 .vmux = 2, 131 } }, 132 .radio = { 133 .type = CX88_RADIO, 134 .gpio0 = 0xff10, 135 }, 136 }, 137 [CX88_BOARD_ATI_WONDER_PRO] = { 138 .name = "ATI TV Wonder Pro", 139 .tuner_type = TUNER_PHILIPS_4IN1, 140 .radio_type = UNSET, 141 .tuner_addr = ADDR_UNSET, 142 .radio_addr = ADDR_UNSET, 143 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER, 144 .input = { { 145 .type = CX88_VMUX_TELEVISION, 146 .vmux = 0, 147 .gpio0 = 0x03ff, 148 }, { 149 .type = CX88_VMUX_COMPOSITE1, 150 .vmux = 1, 151 .gpio0 = 0x03fe, 152 }, { 153 .type = CX88_VMUX_SVIDEO, 154 .vmux = 2, 155 .gpio0 = 0x03fe, 156 } }, 157 }, 158 [CX88_BOARD_WINFAST2000XP_EXPERT] = { 159 .name = "Leadtek Winfast 2000XP Expert", 160 .tuner_type = TUNER_PHILIPS_4IN1, 161 .radio_type = UNSET, 162 .tuner_addr = ADDR_UNSET, 163 .radio_addr = ADDR_UNSET, 164 .tda9887_conf = TDA9887_PRESENT, 165 .input = { { 166 .type = CX88_VMUX_TELEVISION, 167 .vmux = 0, 168 .gpio0 = 0x00F5e700, 169 .gpio1 = 0x00003004, 170 .gpio2 = 0x00F5e700, 171 .gpio3 = 0x02000000, 172 }, { 173 .type = CX88_VMUX_COMPOSITE1, 174 .vmux = 1, 175 .gpio0 = 0x00F5c700, 176 .gpio1 = 0x00003004, 177 .gpio2 = 0x00F5c700, 178 .gpio3 = 0x02000000, 179 }, { 180 .type = CX88_VMUX_SVIDEO, 181 .vmux = 2, 182 .gpio0 = 0x00F5c700, 183 .gpio1 = 0x00003004, 184 .gpio2 = 0x00F5c700, 185 .gpio3 = 0x02000000, 186 } }, 187 .radio = { 188 .type = CX88_RADIO, 189 .gpio0 = 0x00F5d700, 190 .gpio1 = 0x00003004, 191 .gpio2 = 0x00F5d700, 192 .gpio3 = 0x02000000, 193 }, 194 }, 195 [CX88_BOARD_AVERTV_STUDIO_303] = { 196 .name = "AverTV Studio 303 (M126)", 197 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 198 .radio_type = UNSET, 199 .tuner_addr = ADDR_UNSET, 200 .radio_addr = ADDR_UNSET, 201 .tda9887_conf = TDA9887_PRESENT, 202 .input = { { 203 .type = CX88_VMUX_TELEVISION, 204 .vmux = 0, 205 .gpio1 = 0xe09f, 206 }, { 207 .type = CX88_VMUX_COMPOSITE1, 208 .vmux = 1, 209 .gpio1 = 0xe05f, 210 }, { 211 .type = CX88_VMUX_SVIDEO, 212 .vmux = 2, 213 .gpio1 = 0xe05f, 214 } }, 215 .radio = { 216 .gpio1 = 0xe0df, 217 .type = CX88_RADIO, 218 }, 219 }, 220 [CX88_BOARD_MSI_TVANYWHERE_MASTER] = { 221 // added gpio values thanks to Michal 222 // values for PAL from DScaler 223 .name = "MSI TV-@nywhere Master", 224 .tuner_type = TUNER_MT2032, 225 .radio_type = UNSET, 226 .tuner_addr = ADDR_UNSET, 227 .radio_addr = ADDR_UNSET, 228 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC, 229 .input = { { 230 .type = CX88_VMUX_TELEVISION, 231 .vmux = 0, 232 .gpio0 = 0x000040bf, 233 .gpio1 = 0x000080c0, 234 .gpio2 = 0x0000ff40, 235 }, { 236 .type = CX88_VMUX_COMPOSITE1, 237 .vmux = 1, 238 .gpio0 = 0x000040bf, 239 .gpio1 = 0x000080c0, 240 .gpio2 = 0x0000ff40, 241 }, { 242 .type = CX88_VMUX_SVIDEO, 243 .vmux = 2, 244 .gpio0 = 0x000040bf, 245 .gpio1 = 0x000080c0, 246 .gpio2 = 0x0000ff40, 247 } }, 248 .radio = { 249 .type = CX88_RADIO, 250 .vmux = 3, 251 .gpio0 = 0x000040bf, 252 .gpio1 = 0x000080c0, 253 .gpio2 = 0x0000ff20, 254 }, 255 }, 256 [CX88_BOARD_WINFAST_DV2000] = { 257 .name = "Leadtek Winfast DV2000", 258 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 259 .radio_type = UNSET, 260 .tuner_addr = ADDR_UNSET, 261 .radio_addr = ADDR_UNSET, 262 .tda9887_conf = TDA9887_PRESENT, 263 .input = { { 264 .type = CX88_VMUX_TELEVISION, 265 .vmux = 0, 266 .gpio0 = 0x0035e700, 267 .gpio1 = 0x00003004, 268 .gpio2 = 0x0035e700, 269 .gpio3 = 0x02000000, 270 }, { 271 .type = CX88_VMUX_COMPOSITE1, 272 .vmux = 1, 273 .gpio0 = 0x0035c700, 274 .gpio1 = 0x00003004, 275 .gpio2 = 0x0035c700, 276 .gpio3 = 0x02000000, 277 }, { 278 .type = CX88_VMUX_SVIDEO, 279 .vmux = 2, 280 .gpio0 = 0x0035c700, 281 .gpio1 = 0x0035c700, 282 .gpio2 = 0x02000000, 283 .gpio3 = 0x02000000, 284 } }, 285 .radio = { 286 .type = CX88_RADIO, 287 .gpio0 = 0x0035d700, 288 .gpio1 = 0x00007004, 289 .gpio2 = 0x0035d700, 290 .gpio3 = 0x02000000, 291 }, 292 }, 293 [CX88_BOARD_LEADTEK_PVR2000] = { 294 // gpio values for PAL version from regspy by DScaler 295 .name = "Leadtek PVR 2000", 296 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 297 .radio_type = UNSET, 298 .tuner_addr = ADDR_UNSET, 299 .radio_addr = ADDR_UNSET, 300 .tda9887_conf = TDA9887_PRESENT, 301 .input = { { 302 .type = CX88_VMUX_TELEVISION, 303 .vmux = 0, 304 .gpio0 = 0x0000bde2, 305 .audioroute = 1, 306 }, { 307 .type = CX88_VMUX_COMPOSITE1, 308 .vmux = 1, 309 .gpio0 = 0x0000bde6, 310 .audioroute = 1, 311 }, { 312 .type = CX88_VMUX_SVIDEO, 313 .vmux = 2, 314 .gpio0 = 0x0000bde6, 315 .audioroute = 1, 316 } }, 317 .radio = { 318 .type = CX88_RADIO, 319 .gpio0 = 0x0000bd62, 320 .audioroute = 1, 321 }, 322 .mpeg = CX88_MPEG_BLACKBIRD, 323 }, 324 [CX88_BOARD_IODATA_GVVCP3PCI] = { 325 .name = "IODATA GV-VCP3/PCI", 326 .tuner_type = UNSET, 327 .radio_type = UNSET, 328 .tuner_addr = ADDR_UNSET, 329 .radio_addr = ADDR_UNSET, 330 .input = { { 331 .type = CX88_VMUX_COMPOSITE1, 332 .vmux = 0, 333 }, { 334 .type = CX88_VMUX_COMPOSITE2, 335 .vmux = 1, 336 }, { 337 .type = CX88_VMUX_SVIDEO, 338 .vmux = 2, 339 } }, 340 }, 341 [CX88_BOARD_PROLINK_PLAYTVPVR] = { 342 .name = "Prolink PlayTV PVR", 343 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 344 .radio_type = UNSET, 345 .tuner_addr = ADDR_UNSET, 346 .radio_addr = ADDR_UNSET, 347 .tda9887_conf = TDA9887_PRESENT, 348 .input = { { 349 .type = CX88_VMUX_TELEVISION, 350 .vmux = 0, 351 .gpio0 = 0xbff0, 352 }, { 353 .type = CX88_VMUX_COMPOSITE1, 354 .vmux = 1, 355 .gpio0 = 0xbff3, 356 }, { 357 .type = CX88_VMUX_SVIDEO, 358 .vmux = 2, 359 .gpio0 = 0xbff3, 360 } }, 361 .radio = { 362 .type = CX88_RADIO, 363 .gpio0 = 0xbff0, 364 }, 365 }, 366 [CX88_BOARD_ASUS_PVR_416] = { 367 .name = "ASUS PVR-416", 368 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 369 .radio_type = UNSET, 370 .tuner_addr = ADDR_UNSET, 371 .radio_addr = ADDR_UNSET, 372 .tda9887_conf = TDA9887_PRESENT, 373 .input = { { 374 .type = CX88_VMUX_TELEVISION, 375 .vmux = 0, 376 .gpio0 = 0x0000fde6, 377 }, { 378 .type = CX88_VMUX_SVIDEO, 379 .vmux = 2, 380 .gpio0 = 0x0000fde6, // 0x0000fda6 L,R RCA audio in? 381 .audioroute = 1, 382 } }, 383 .radio = { 384 .type = CX88_RADIO, 385 .gpio0 = 0x0000fde2, 386 }, 387 .mpeg = CX88_MPEG_BLACKBIRD, 388 }, 389 [CX88_BOARD_MSI_TVANYWHERE] = { 390 .name = "MSI TV-@nywhere", 391 .tuner_type = TUNER_MT2032, 392 .radio_type = UNSET, 393 .tuner_addr = ADDR_UNSET, 394 .radio_addr = ADDR_UNSET, 395 .tda9887_conf = TDA9887_PRESENT, 396 .input = { { 397 .type = CX88_VMUX_TELEVISION, 398 .vmux = 0, 399 .gpio0 = 0x00000fbf, 400 .gpio2 = 0x0000fc08, 401 }, { 402 .type = CX88_VMUX_COMPOSITE1, 403 .vmux = 1, 404 .gpio0 = 0x00000fbf, 405 .gpio2 = 0x0000fc68, 406 }, { 407 .type = CX88_VMUX_SVIDEO, 408 .vmux = 2, 409 .gpio0 = 0x00000fbf, 410 .gpio2 = 0x0000fc68, 411 } }, 412 }, 413 [CX88_BOARD_KWORLD_DVB_T] = { 414 .name = "KWorld/VStream XPert DVB-T", 415 .tuner_type = UNSET, 416 .radio_type = UNSET, 417 .tuner_addr = ADDR_UNSET, 418 .radio_addr = ADDR_UNSET, 419 .input = { { 420 .type = CX88_VMUX_COMPOSITE1, 421 .vmux = 1, 422 .gpio0 = 0x0700, 423 .gpio2 = 0x0101, 424 }, { 425 .type = CX88_VMUX_SVIDEO, 426 .vmux = 2, 427 .gpio0 = 0x0700, 428 .gpio2 = 0x0101, 429 } }, 430 .mpeg = CX88_MPEG_DVB, 431 }, 432 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = { 433 .name = "DViCO FusionHDTV DVB-T1", 434 .tuner_type = UNSET, /* No analog tuner */ 435 .radio_type = UNSET, 436 .tuner_addr = ADDR_UNSET, 437 .radio_addr = ADDR_UNSET, 438 .input = { { 439 .type = CX88_VMUX_COMPOSITE1, 440 .vmux = 1, 441 .gpio0 = 0x000027df, 442 }, { 443 .type = CX88_VMUX_SVIDEO, 444 .vmux = 2, 445 .gpio0 = 0x000027df, 446 } }, 447 .mpeg = CX88_MPEG_DVB, 448 }, 449 [CX88_BOARD_KWORLD_LTV883] = { 450 .name = "KWorld LTV883RF", 451 .tuner_type = TUNER_TNF_8831BGFF, 452 .radio_type = UNSET, 453 .tuner_addr = ADDR_UNSET, 454 .radio_addr = ADDR_UNSET, 455 .input = { { 456 .type = CX88_VMUX_TELEVISION, 457 .vmux = 0, 458 .gpio0 = 0x07f8, 459 }, { 460 .type = CX88_VMUX_DEBUG, 461 .vmux = 0, 462 .gpio0 = 0x07f9, // mono from tuner chip 463 }, { 464 .type = CX88_VMUX_COMPOSITE1, 465 .vmux = 1, 466 .gpio0 = 0x000007fa, 467 }, { 468 .type = CX88_VMUX_SVIDEO, 469 .vmux = 2, 470 .gpio0 = 0x000007fa, 471 } }, 472 .radio = { 473 .type = CX88_RADIO, 474 .gpio0 = 0x000007f8, 475 }, 476 }, 477 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = { 478 .name = "DViCO FusionHDTV 3 Gold-Q", 479 .tuner_type = TUNER_MICROTUNE_4042FI5, 480 .radio_type = UNSET, 481 .tuner_addr = ADDR_UNSET, 482 .radio_addr = ADDR_UNSET, 483 /* 484 * GPIO[0] resets DT3302 DTV receiver 485 * 0 - reset asserted 486 * 1 - normal operation 487 * GPIO[1] mutes analog audio output connector 488 * 0 - enable selected source 489 * 1 - mute 490 * GPIO[2] selects source for analog audio output connector 491 * 0 - analog audio input connector on tab 492 * 1 - analog DAC output from CX23881 chip 493 * GPIO[3] selects RF input connector on tuner module 494 * 0 - RF connector labeled CABLE 495 * 1 - RF connector labeled ANT 496 * GPIO[4] selects high RF for QAM256 mode 497 * 0 - normal RF 498 * 1 - high RF 499 */ 500 .input = { { 501 .type = CX88_VMUX_TELEVISION, 502 .vmux = 0, 503 .gpio0 = 0x0f0d, 504 }, { 505 .type = CX88_VMUX_CABLE, 506 .vmux = 0, 507 .gpio0 = 0x0f05, 508 }, { 509 .type = CX88_VMUX_COMPOSITE1, 510 .vmux = 1, 511 .gpio0 = 0x0f00, 512 }, { 513 .type = CX88_VMUX_SVIDEO, 514 .vmux = 2, 515 .gpio0 = 0x0f00, 516 } }, 517 .mpeg = CX88_MPEG_DVB, 518 }, 519 [CX88_BOARD_HAUPPAUGE_DVB_T1] = { 520 .name = "Hauppauge Nova-T DVB-T", 521 .tuner_type = UNSET, 522 .radio_type = UNSET, 523 .tuner_addr = ADDR_UNSET, 524 .radio_addr = ADDR_UNSET, 525 .input = { { 526 .type = CX88_VMUX_DVB, 527 .vmux = 0, 528 } }, 529 .mpeg = CX88_MPEG_DVB, 530 }, 531 [CX88_BOARD_CONEXANT_DVB_T1] = { 532 .name = "Conexant DVB-T reference design", 533 .tuner_type = UNSET, 534 .radio_type = UNSET, 535 .tuner_addr = ADDR_UNSET, 536 .radio_addr = ADDR_UNSET, 537 .input = { { 538 .type = CX88_VMUX_DVB, 539 .vmux = 0, 540 } }, 541 .mpeg = CX88_MPEG_DVB, 542 }, 543 [CX88_BOARD_PROVIDEO_PV259] = { 544 .name = "Provideo PV259", 545 .tuner_type = TUNER_PHILIPS_FQ1216ME, 546 .radio_type = UNSET, 547 .tuner_addr = ADDR_UNSET, 548 .radio_addr = ADDR_UNSET, 549 .input = { { 550 .type = CX88_VMUX_TELEVISION, 551 .vmux = 0, 552 .audioroute = 1, 553 } }, 554 .mpeg = CX88_MPEG_BLACKBIRD, 555 }, 556 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = { 557 .name = "DViCO FusionHDTV DVB-T Plus", 558 .tuner_type = UNSET, /* No analog tuner */ 559 .radio_type = UNSET, 560 .tuner_addr = ADDR_UNSET, 561 .radio_addr = ADDR_UNSET, 562 .input = { { 563 .type = CX88_VMUX_COMPOSITE1, 564 .vmux = 1, 565 .gpio0 = 0x000027df, 566 }, { 567 .type = CX88_VMUX_SVIDEO, 568 .vmux = 2, 569 .gpio0 = 0x000027df, 570 } }, 571 .mpeg = CX88_MPEG_DVB, 572 }, 573 [CX88_BOARD_DNTV_LIVE_DVB_T] = { 574 .name = "digitalnow DNTV Live! DVB-T", 575 .tuner_type = UNSET, 576 .radio_type = UNSET, 577 .tuner_addr = ADDR_UNSET, 578 .radio_addr = ADDR_UNSET, 579 .input = { { 580 .type = CX88_VMUX_COMPOSITE1, 581 .vmux = 1, 582 .gpio0 = 0x00000700, 583 .gpio2 = 0x00000101, 584 }, { 585 .type = CX88_VMUX_SVIDEO, 586 .vmux = 2, 587 .gpio0 = 0x00000700, 588 .gpio2 = 0x00000101, 589 } }, 590 .mpeg = CX88_MPEG_DVB, 591 }, 592 [CX88_BOARD_PCHDTV_HD3000] = { 593 .name = "pcHDTV HD3000 HDTV", 594 .tuner_type = TUNER_THOMSON_DTT761X, 595 .radio_type = UNSET, 596 .tuner_addr = ADDR_UNSET, 597 .radio_addr = ADDR_UNSET, 598 .tda9887_conf = TDA9887_PRESENT, 599 /* GPIO[2] = audio source for analog audio out connector 600 * 0 = analog audio input connector 601 * 1 = CX88 audio DACs 602 * 603 * GPIO[7] = input to CX88's audio/chroma ADC 604 * 0 = FM 10.7 MHz IF 605 * 1 = Sound 4.5 MHz IF 606 * 607 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively 608 * 609 * GPIO[16] = Remote control input 610 */ 611 .input = { { 612 .type = CX88_VMUX_TELEVISION, 613 .vmux = 0, 614 .gpio0 = 0x00008484, 615 }, { 616 .type = CX88_VMUX_COMPOSITE1, 617 .vmux = 1, 618 .gpio0 = 0x00008400, 619 }, { 620 .type = CX88_VMUX_SVIDEO, 621 .vmux = 2, 622 .gpio0 = 0x00008400, 623 } }, 624 .radio = { 625 .type = CX88_RADIO, 626 .gpio0 = 0x00008404, 627 }, 628 .mpeg = CX88_MPEG_DVB, 629 }, 630 [CX88_BOARD_HAUPPAUGE_ROSLYN] = { 631 // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu> 632 // GPIO values obtained from regspy, courtesy Sean Covel 633 .name = "Hauppauge WinTV 28xxx (Roslyn) models", 634 .tuner_type = UNSET, 635 .radio_type = UNSET, 636 .tuner_addr = ADDR_UNSET, 637 .radio_addr = ADDR_UNSET, 638 .input = { { 639 .type = CX88_VMUX_TELEVISION, 640 .vmux = 0, 641 .gpio0 = 0xed1a, 642 .gpio2 = 0x00ff, 643 }, { 644 .type = CX88_VMUX_DEBUG, 645 .vmux = 0, 646 .gpio0 = 0xff01, 647 }, { 648 .type = CX88_VMUX_COMPOSITE1, 649 .vmux = 1, 650 .gpio0 = 0xff02, 651 }, { 652 .type = CX88_VMUX_SVIDEO, 653 .vmux = 2, 654 .gpio0 = 0xed92, 655 .gpio2 = 0x00ff, 656 } }, 657 .radio = { 658 .type = CX88_RADIO, 659 .gpio0 = 0xed96, 660 .gpio2 = 0x00ff, 661 }, 662 .mpeg = CX88_MPEG_BLACKBIRD, 663 }, 664 [CX88_BOARD_DIGITALLOGIC_MEC] = { 665 .name = "Digital-Logic MICROSPACE Entertainment Center (MEC)", 666 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 667 .radio_type = UNSET, 668 .tuner_addr = ADDR_UNSET, 669 .radio_addr = ADDR_UNSET, 670 .tda9887_conf = TDA9887_PRESENT, 671 .input = { { 672 .type = CX88_VMUX_TELEVISION, 673 .vmux = 0, 674 .gpio0 = 0x00009d80, 675 .audioroute = 1, 676 }, { 677 .type = CX88_VMUX_COMPOSITE1, 678 .vmux = 1, 679 .gpio0 = 0x00009d76, 680 .audioroute = 1, 681 }, { 682 .type = CX88_VMUX_SVIDEO, 683 .vmux = 2, 684 .gpio0 = 0x00009d76, 685 .audioroute = 1, 686 } }, 687 .radio = { 688 .type = CX88_RADIO, 689 .gpio0 = 0x00009d00, 690 .audioroute = 1, 691 }, 692 .mpeg = CX88_MPEG_BLACKBIRD, 693 }, 694 [CX88_BOARD_IODATA_GVBCTV7E] = { 695 .name = "IODATA GV/BCTV7E", 696 .tuner_type = TUNER_PHILIPS_FQ1286, 697 .radio_type = UNSET, 698 .tuner_addr = ADDR_UNSET, 699 .radio_addr = ADDR_UNSET, 700 .tda9887_conf = TDA9887_PRESENT, 701 .input = { { 702 .type = CX88_VMUX_TELEVISION, 703 .vmux = 1, 704 .gpio1 = 0x0000e03f, 705 }, { 706 .type = CX88_VMUX_COMPOSITE1, 707 .vmux = 2, 708 .gpio1 = 0x0000e07f, 709 }, { 710 .type = CX88_VMUX_SVIDEO, 711 .vmux = 3, 712 .gpio1 = 0x0000e07f, 713 } } 714 }, 715 [CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = { 716 .name = "PixelView PlayTV Ultra Pro (Stereo)", 717 /* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */ 718 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 719 .radio_type = UNSET, 720 .tuner_addr = ADDR_UNSET, 721 .radio_addr = ADDR_UNSET, 722 /* 723 * Some variants use a tda9874 and so need the 724 * tvaudio module. 725 */ 726 .audio_chip = CX88_AUDIO_TVAUDIO, 727 .input = { { 728 .type = CX88_VMUX_TELEVISION, 729 .vmux = 0, 730 .gpio0 = 0xbf61, /* internal decoder */ 731 }, { 732 .type = CX88_VMUX_COMPOSITE1, 733 .vmux = 1, 734 .gpio0 = 0xbf63, 735 }, { 736 .type = CX88_VMUX_SVIDEO, 737 .vmux = 2, 738 .gpio0 = 0xbf63, 739 } }, 740 .radio = { 741 .type = CX88_RADIO, 742 .gpio0 = 0xbf60, 743 }, 744 }, 745 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = { 746 .name = "DViCO FusionHDTV 3 Gold-T", 747 .tuner_type = TUNER_THOMSON_DTT761X, 748 .radio_type = UNSET, 749 .tuner_addr = ADDR_UNSET, 750 .radio_addr = ADDR_UNSET, 751 .tda9887_conf = TDA9887_PRESENT, 752 .input = { { 753 .type = CX88_VMUX_TELEVISION, 754 .vmux = 0, 755 .gpio0 = 0x97ed, 756 }, { 757 .type = CX88_VMUX_COMPOSITE1, 758 .vmux = 1, 759 .gpio0 = 0x97e9, 760 }, { 761 .type = CX88_VMUX_SVIDEO, 762 .vmux = 2, 763 .gpio0 = 0x97e9, 764 } }, 765 .mpeg = CX88_MPEG_DVB, 766 }, 767 [CX88_BOARD_ADSTECH_DVB_T_PCI] = { 768 .name = "ADS Tech Instant TV DVB-T PCI", 769 .tuner_type = UNSET, 770 .radio_type = UNSET, 771 .tuner_addr = ADDR_UNSET, 772 .radio_addr = ADDR_UNSET, 773 .input = { { 774 .type = CX88_VMUX_COMPOSITE1, 775 .vmux = 1, 776 .gpio0 = 0x0700, 777 .gpio2 = 0x0101, 778 }, { 779 .type = CX88_VMUX_SVIDEO, 780 .vmux = 2, 781 .gpio0 = 0x0700, 782 .gpio2 = 0x0101, 783 } }, 784 .mpeg = CX88_MPEG_DVB, 785 }, 786 [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = { 787 .name = "TerraTec Cinergy 1400 DVB-T", 788 .tuner_type = UNSET, 789 .input = { { 790 .type = CX88_VMUX_DVB, 791 .vmux = 0, 792 }, { 793 .type = CX88_VMUX_COMPOSITE1, 794 .vmux = 2, 795 }, { 796 .type = CX88_VMUX_SVIDEO, 797 .vmux = 2, 798 } }, 799 .mpeg = CX88_MPEG_DVB, 800 }, 801 [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = { 802 .name = "DViCO FusionHDTV 5 Gold", 803 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */ 804 .radio_type = UNSET, 805 .tuner_addr = ADDR_UNSET, 806 .radio_addr = ADDR_UNSET, 807 .tda9887_conf = TDA9887_PRESENT, 808 .input = { { 809 .type = CX88_VMUX_TELEVISION, 810 .vmux = 0, 811 .gpio0 = 0x87fd, 812 }, { 813 .type = CX88_VMUX_COMPOSITE1, 814 .vmux = 1, 815 .gpio0 = 0x87f9, 816 }, { 817 .type = CX88_VMUX_SVIDEO, 818 .vmux = 2, 819 .gpio0 = 0x87f9, 820 } }, 821 .mpeg = CX88_MPEG_DVB, 822 }, 823 [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = { 824 .name = "AverMedia UltraTV Media Center PCI 550", 825 .tuner_type = TUNER_PHILIPS_FM1236_MK3, 826 .radio_type = UNSET, 827 .tuner_addr = ADDR_UNSET, 828 .radio_addr = ADDR_UNSET, 829 .tda9887_conf = TDA9887_PRESENT, 830 .input = { { 831 .type = CX88_VMUX_COMPOSITE1, 832 .vmux = 0, 833 .gpio0 = 0x0000cd73, 834 .audioroute = 1, 835 }, { 836 .type = CX88_VMUX_SVIDEO, 837 .vmux = 1, 838 .gpio0 = 0x0000cd73, 839 .audioroute = 1, 840 }, { 841 .type = CX88_VMUX_TELEVISION, 842 .vmux = 3, 843 .gpio0 = 0x0000cdb3, 844 .audioroute = 1, 845 } }, 846 .radio = { 847 .type = CX88_RADIO, 848 .vmux = 2, 849 .gpio0 = 0x0000cdf3, 850 .audioroute = 1, 851 }, 852 .mpeg = CX88_MPEG_BLACKBIRD, 853 }, 854 [CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = { 855 /* Alexander Wold <awold@bigfoot.com> */ 856 .name = "Kworld V-Stream Xpert DVD", 857 .tuner_type = UNSET, 858 .input = { { 859 .type = CX88_VMUX_COMPOSITE1, 860 .vmux = 1, 861 .gpio0 = 0x03000000, 862 .gpio1 = 0x01000000, 863 .gpio2 = 0x02000000, 864 .gpio3 = 0x00100000, 865 }, { 866 .type = CX88_VMUX_SVIDEO, 867 .vmux = 2, 868 .gpio0 = 0x03000000, 869 .gpio1 = 0x01000000, 870 .gpio2 = 0x02000000, 871 .gpio3 = 0x00100000, 872 } }, 873 }, 874 [CX88_BOARD_ATI_HDTVWONDER] = { 875 .name = "ATI HDTV Wonder", 876 .tuner_type = TUNER_PHILIPS_TUV1236D, 877 .radio_type = UNSET, 878 .tuner_addr = ADDR_UNSET, 879 .radio_addr = ADDR_UNSET, 880 .input = { { 881 .type = CX88_VMUX_TELEVISION, 882 .vmux = 0, 883 .gpio0 = 0x00000ff7, 884 .gpio1 = 0x000000ff, 885 .gpio2 = 0x00000001, 886 .gpio3 = 0x00000000, 887 }, { 888 .type = CX88_VMUX_COMPOSITE1, 889 .vmux = 1, 890 .gpio0 = 0x00000ffe, 891 .gpio1 = 0x000000ff, 892 .gpio2 = 0x00000001, 893 .gpio3 = 0x00000000, 894 }, { 895 .type = CX88_VMUX_SVIDEO, 896 .vmux = 2, 897 .gpio0 = 0x00000ffe, 898 .gpio1 = 0x000000ff, 899 .gpio2 = 0x00000001, 900 .gpio3 = 0x00000000, 901 } }, 902 .mpeg = CX88_MPEG_DVB, 903 }, 904 [CX88_BOARD_WINFAST_DTV1000] = { 905 .name = "WinFast DTV1000-T", 906 .tuner_type = UNSET, 907 .radio_type = UNSET, 908 .tuner_addr = ADDR_UNSET, 909 .radio_addr = ADDR_UNSET, 910 .input = { { 911 .type = CX88_VMUX_DVB, 912 .vmux = 0, 913 }, { 914 .type = CX88_VMUX_COMPOSITE1, 915 .vmux = 1, 916 }, { 917 .type = CX88_VMUX_SVIDEO, 918 .vmux = 2, 919 } }, 920 .mpeg = CX88_MPEG_DVB, 921 }, 922 [CX88_BOARD_AVERTV_303] = { 923 .name = "AVerTV 303 (M126)", 924 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 925 .radio_type = UNSET, 926 .tuner_addr = ADDR_UNSET, 927 .radio_addr = ADDR_UNSET, 928 .tda9887_conf = TDA9887_PRESENT, 929 .input = { { 930 .type = CX88_VMUX_TELEVISION, 931 .vmux = 0, 932 .gpio0 = 0x00ff, 933 .gpio1 = 0xe09f, 934 .gpio2 = 0x0010, 935 .gpio3 = 0x0000, 936 }, { 937 .type = CX88_VMUX_COMPOSITE1, 938 .vmux = 1, 939 .gpio0 = 0x00ff, 940 .gpio1 = 0xe05f, 941 .gpio2 = 0x0010, 942 .gpio3 = 0x0000, 943 }, { 944 .type = CX88_VMUX_SVIDEO, 945 .vmux = 2, 946 .gpio0 = 0x00ff, 947 .gpio1 = 0xe05f, 948 .gpio2 = 0x0010, 949 .gpio3 = 0x0000, 950 } }, 951 }, 952 [CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = { 953 .name = "Hauppauge Nova-S-Plus DVB-S", 954 .tuner_type = UNSET, 955 .radio_type = UNSET, 956 .tuner_addr = ADDR_UNSET, 957 .radio_addr = ADDR_UNSET, 958 .audio_chip = CX88_AUDIO_WM8775, 959 .i2sinputcntl = 2, 960 .input = { { 961 .type = CX88_VMUX_DVB, 962 .vmux = 0, 963 /* 2: Line-In */ 964 .audioroute = 2, 965 }, { 966 .type = CX88_VMUX_COMPOSITE1, 967 .vmux = 1, 968 /* 2: Line-In */ 969 .audioroute = 2, 970 }, { 971 .type = CX88_VMUX_SVIDEO, 972 .vmux = 2, 973 /* 2: Line-In */ 974 .audioroute = 2, 975 } }, 976 .mpeg = CX88_MPEG_DVB, 977 }, 978 [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = { 979 .name = "Hauppauge Nova-SE2 DVB-S", 980 .tuner_type = UNSET, 981 .radio_type = UNSET, 982 .tuner_addr = ADDR_UNSET, 983 .radio_addr = ADDR_UNSET, 984 .input = { { 985 .type = CX88_VMUX_DVB, 986 .vmux = 0, 987 } }, 988 .mpeg = CX88_MPEG_DVB, 989 }, 990 [CX88_BOARD_KWORLD_DVBS_100] = { 991 .name = "KWorld DVB-S 100", 992 .tuner_type = UNSET, 993 .radio_type = UNSET, 994 .tuner_addr = ADDR_UNSET, 995 .radio_addr = ADDR_UNSET, 996 .audio_chip = CX88_AUDIO_WM8775, 997 .input = { { 998 .type = CX88_VMUX_DVB, 999 .vmux = 0, 1000 /* 2: Line-In */ 1001 .audioroute = 2, 1002 }, { 1003 .type = CX88_VMUX_COMPOSITE1, 1004 .vmux = 1, 1005 /* 2: Line-In */ 1006 .audioroute = 2, 1007 }, { 1008 .type = CX88_VMUX_SVIDEO, 1009 .vmux = 2, 1010 /* 2: Line-In */ 1011 .audioroute = 2, 1012 } }, 1013 .mpeg = CX88_MPEG_DVB, 1014 }, 1015 [CX88_BOARD_HAUPPAUGE_HVR1100] = { 1016 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid", 1017 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1018 .radio_type = UNSET, 1019 .tuner_addr = ADDR_UNSET, 1020 .radio_addr = ADDR_UNSET, 1021 .tda9887_conf = TDA9887_PRESENT, 1022 .input = { { 1023 .type = CX88_VMUX_TELEVISION, 1024 .vmux = 0, 1025 }, { 1026 .type = CX88_VMUX_COMPOSITE1, 1027 .vmux = 1, 1028 }, { 1029 .type = CX88_VMUX_SVIDEO, 1030 .vmux = 2, 1031 } }, 1032 /* fixme: Add radio support */ 1033 .mpeg = CX88_MPEG_DVB, 1034 }, 1035 [CX88_BOARD_HAUPPAUGE_HVR1100LP] = { 1036 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)", 1037 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1038 .radio_type = UNSET, 1039 .tuner_addr = ADDR_UNSET, 1040 .radio_addr = ADDR_UNSET, 1041 .tda9887_conf = TDA9887_PRESENT, 1042 .input = { { 1043 .type = CX88_VMUX_TELEVISION, 1044 .vmux = 0, 1045 }, { 1046 .type = CX88_VMUX_COMPOSITE1, 1047 .vmux = 1, 1048 } }, 1049 /* fixme: Add radio support */ 1050 .mpeg = CX88_MPEG_DVB, 1051 }, 1052 [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = { 1053 .name = "digitalnow DNTV Live! DVB-T Pro", 1054 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1055 .radio_type = UNSET, 1056 .tuner_addr = ADDR_UNSET, 1057 .radio_addr = ADDR_UNSET, 1058 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE | 1059 TDA9887_PORT2_ACTIVE, 1060 .input = { { 1061 .type = CX88_VMUX_TELEVISION, 1062 .vmux = 0, 1063 .gpio0 = 0xf80808, 1064 }, { 1065 .type = CX88_VMUX_COMPOSITE1, 1066 .vmux = 1, 1067 .gpio0 = 0xf80808, 1068 }, { 1069 .type = CX88_VMUX_SVIDEO, 1070 .vmux = 2, 1071 .gpio0 = 0xf80808, 1072 } }, 1073 .radio = { 1074 .type = CX88_RADIO, 1075 .gpio0 = 0xf80808, 1076 }, 1077 .mpeg = CX88_MPEG_DVB, 1078 }, 1079 [CX88_BOARD_KWORLD_DVB_T_CX22702] = { 1080 /* Kworld V-stream Xpert DVB-T with Thomson tuner */ 1081 /* DTT 7579 Conexant CX22702-19 Conexant CX2388x */ 1082 /* Manenti Marco <marco_manenti@colman.it> */ 1083 .name = "KWorld/VStream XPert DVB-T with cx22702", 1084 .tuner_type = UNSET, 1085 .radio_type = UNSET, 1086 .tuner_addr = ADDR_UNSET, 1087 .radio_addr = ADDR_UNSET, 1088 .input = { { 1089 .type = CX88_VMUX_COMPOSITE1, 1090 .vmux = 1, 1091 .gpio0 = 0x0700, 1092 .gpio2 = 0x0101, 1093 }, { 1094 .type = CX88_VMUX_SVIDEO, 1095 .vmux = 2, 1096 .gpio0 = 0x0700, 1097 .gpio2 = 0x0101, 1098 } }, 1099 .mpeg = CX88_MPEG_DVB, 1100 }, 1101 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = { 1102 .name = "DViCO FusionHDTV DVB-T Dual Digital", 1103 .tuner_type = UNSET, /* No analog tuner */ 1104 .radio_type = UNSET, 1105 .tuner_addr = ADDR_UNSET, 1106 .radio_addr = ADDR_UNSET, 1107 .input = { { 1108 .type = CX88_VMUX_COMPOSITE1, 1109 .vmux = 1, 1110 .gpio0 = 0x000067df, 1111 }, { 1112 .type = CX88_VMUX_SVIDEO, 1113 .vmux = 2, 1114 .gpio0 = 0x000067df, 1115 } }, 1116 .mpeg = CX88_MPEG_DVB, 1117 }, 1118 [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = { 1119 .name = "KWorld HardwareMpegTV XPert", 1120 .tuner_type = TUNER_PHILIPS_TDA8290, 1121 .radio_type = UNSET, 1122 .tuner_addr = ADDR_UNSET, 1123 .radio_addr = ADDR_UNSET, 1124 .input = { { 1125 .type = CX88_VMUX_TELEVISION, 1126 .vmux = 0, 1127 .gpio0 = 0x3de2, 1128 .gpio2 = 0x00ff, 1129 }, { 1130 .type = CX88_VMUX_COMPOSITE1, 1131 .vmux = 1, 1132 .gpio0 = 0x3de6, 1133 .audioroute = 1, 1134 }, { 1135 .type = CX88_VMUX_SVIDEO, 1136 .vmux = 2, 1137 .gpio0 = 0x3de6, 1138 .audioroute = 1, 1139 } }, 1140 .radio = { 1141 .type = CX88_RADIO, 1142 .gpio0 = 0x3de6, 1143 .gpio2 = 0x00ff, 1144 }, 1145 .mpeg = CX88_MPEG_BLACKBIRD, 1146 }, 1147 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = { 1148 .name = "DViCO FusionHDTV DVB-T Hybrid", 1149 .tuner_type = TUNER_THOMSON_FE6600, 1150 .radio_type = UNSET, 1151 .tuner_addr = ADDR_UNSET, 1152 .radio_addr = ADDR_UNSET, 1153 .input = { { 1154 .type = CX88_VMUX_TELEVISION, 1155 .vmux = 0, 1156 .gpio0 = 0x0000a75f, 1157 }, { 1158 .type = CX88_VMUX_COMPOSITE1, 1159 .vmux = 1, 1160 .gpio0 = 0x0000a75b, 1161 }, { 1162 .type = CX88_VMUX_SVIDEO, 1163 .vmux = 2, 1164 .gpio0 = 0x0000a75b, 1165 } }, 1166 .mpeg = CX88_MPEG_DVB, 1167 }, 1168 [CX88_BOARD_PCHDTV_HD5500] = { 1169 .name = "pcHDTV HD5500 HDTV", 1170 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */ 1171 .radio_type = UNSET, 1172 .tuner_addr = ADDR_UNSET, 1173 .radio_addr = ADDR_UNSET, 1174 .tda9887_conf = TDA9887_PRESENT, 1175 .input = { { 1176 .type = CX88_VMUX_TELEVISION, 1177 .vmux = 0, 1178 .gpio0 = 0x87fd, 1179 }, { 1180 .type = CX88_VMUX_COMPOSITE1, 1181 .vmux = 1, 1182 .gpio0 = 0x87f9, 1183 }, { 1184 .type = CX88_VMUX_SVIDEO, 1185 .vmux = 2, 1186 .gpio0 = 0x87f9, 1187 } }, 1188 .mpeg = CX88_MPEG_DVB, 1189 }, 1190 [CX88_BOARD_KWORLD_MCE200_DELUXE] = { 1191 /* 1192 * FIXME: tested TV input only, disabled composite, 1193 * svideo and radio until they can be tested also. 1194 */ 1195 .name = "Kworld MCE 200 Deluxe", 1196 .tuner_type = TUNER_TENA_9533_DI, 1197 .radio_type = UNSET, 1198 .tda9887_conf = TDA9887_PRESENT, 1199 .tuner_addr = ADDR_UNSET, 1200 .radio_addr = ADDR_UNSET, 1201 .input = { { 1202 .type = CX88_VMUX_TELEVISION, 1203 .vmux = 0, 1204 .gpio0 = 0x0000BDE6 1205 } }, 1206 .mpeg = CX88_MPEG_BLACKBIRD, 1207 }, 1208 [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = { 1209 /* FIXME: SVideo, Composite and FM inputs are untested */ 1210 .name = "PixelView PlayTV P7000", 1211 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 1212 .radio_type = UNSET, 1213 .tuner_addr = ADDR_UNSET, 1214 .radio_addr = ADDR_UNSET, 1215 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE | 1216 TDA9887_PORT2_ACTIVE, 1217 .input = { { 1218 .type = CX88_VMUX_TELEVISION, 1219 .vmux = 0, 1220 .gpio0 = 0x5da6, 1221 } }, 1222 .mpeg = CX88_MPEG_BLACKBIRD, 1223 }, 1224 [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = { 1225 .name = "NPG Tech Real TV FM Top 10", 1226 .tuner_type = TUNER_TNF_5335MF, /* Actually a TNF9535 */ 1227 .radio_type = UNSET, 1228 .tuner_addr = ADDR_UNSET, 1229 .radio_addr = ADDR_UNSET, 1230 .input = { { 1231 .type = CX88_VMUX_TELEVISION, 1232 .vmux = 0, 1233 .gpio0 = 0x0788, 1234 }, { 1235 .type = CX88_VMUX_COMPOSITE1, 1236 .vmux = 1, 1237 .gpio0 = 0x078b, 1238 }, { 1239 .type = CX88_VMUX_SVIDEO, 1240 .vmux = 2, 1241 .gpio0 = 0x078b, 1242 } }, 1243 .radio = { 1244 .type = CX88_RADIO, 1245 .gpio0 = 0x074a, 1246 }, 1247 }, 1248 [CX88_BOARD_WINFAST_DTV2000H] = { 1249 .name = "WinFast DTV2000 H", 1250 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1251 .radio_type = UNSET, 1252 .tuner_addr = ADDR_UNSET, 1253 .radio_addr = ADDR_UNSET, 1254 .tda9887_conf = TDA9887_PRESENT, 1255 .input = { { 1256 .type = CX88_VMUX_TELEVISION, 1257 .vmux = 0, 1258 .gpio0 = 0x00017304, 1259 .gpio1 = 0x00008203, 1260 .gpio2 = 0x00017304, 1261 .gpio3 = 0x02000000, 1262 }, { 1263 .type = CX88_VMUX_COMPOSITE1, 1264 .vmux = 1, 1265 .gpio0 = 0x0001d701, 1266 .gpio1 = 0x0000b207, 1267 .gpio2 = 0x0001d701, 1268 .gpio3 = 0x02000000, 1269 }, { 1270 .type = CX88_VMUX_COMPOSITE2, 1271 .vmux = 2, 1272 .gpio0 = 0x0001d503, 1273 .gpio1 = 0x0000b207, 1274 .gpio2 = 0x0001d503, 1275 .gpio3 = 0x02000000, 1276 }, { 1277 .type = CX88_VMUX_SVIDEO, 1278 .vmux = 3, 1279 .gpio0 = 0x0001d701, 1280 .gpio1 = 0x0000b207, 1281 .gpio2 = 0x0001d701, 1282 .gpio3 = 0x02000000, 1283 } }, 1284 .radio = { 1285 .type = CX88_RADIO, 1286 .gpio0 = 0x00015702, 1287 .gpio1 = 0x0000f207, 1288 .gpio2 = 0x00015702, 1289 .gpio3 = 0x02000000, 1290 }, 1291 .mpeg = CX88_MPEG_DVB, 1292 }, 1293 [CX88_BOARD_WINFAST_DTV2000H_J] = { 1294 .name = "WinFast DTV2000 H rev. J", 1295 .tuner_type = TUNER_PHILIPS_FMD1216MEX_MK3, 1296 .radio_type = UNSET, 1297 .tuner_addr = ADDR_UNSET, 1298 .radio_addr = ADDR_UNSET, 1299 .tda9887_conf = TDA9887_PRESENT, 1300 .input = { { 1301 .type = CX88_VMUX_TELEVISION, 1302 .vmux = 0, 1303 .gpio0 = 0x00017300, 1304 .gpio1 = 0x00008207, 1305 .gpio2 = 0x00000000, 1306 .gpio3 = 0x02000000, 1307 }, { 1308 .type = CX88_VMUX_TELEVISION, 1309 .vmux = 0, 1310 .gpio0 = 0x00018300, 1311 .gpio1 = 0x0000f207, 1312 .gpio2 = 0x00017304, 1313 .gpio3 = 0x02000000, 1314 }, { 1315 .type = CX88_VMUX_COMPOSITE1, 1316 .vmux = 1, 1317 .gpio0 = 0x00018301, 1318 .gpio1 = 0x0000f207, 1319 .gpio2 = 0x00017304, 1320 .gpio3 = 0x02000000, 1321 }, { 1322 .type = CX88_VMUX_SVIDEO, 1323 .vmux = 2, 1324 .gpio0 = 0x00018301, 1325 .gpio1 = 0x0000f207, 1326 .gpio2 = 0x00017304, 1327 .gpio3 = 0x02000000, 1328 } }, 1329 .radio = { 1330 .type = CX88_RADIO, 1331 .gpio0 = 0x00015702, 1332 .gpio1 = 0x0000f207, 1333 .gpio2 = 0x00015702, 1334 .gpio3 = 0x02000000, 1335 }, 1336 .mpeg = CX88_MPEG_DVB, 1337 }, 1338 [CX88_BOARD_GENIATECH_DVBS] = { 1339 .name = "Geniatech DVB-S", 1340 .tuner_type = UNSET, 1341 .radio_type = UNSET, 1342 .tuner_addr = ADDR_UNSET, 1343 .radio_addr = ADDR_UNSET, 1344 .input = { { 1345 .type = CX88_VMUX_DVB, 1346 .vmux = 0, 1347 }, { 1348 .type = CX88_VMUX_COMPOSITE1, 1349 .vmux = 1, 1350 } }, 1351 .mpeg = CX88_MPEG_DVB, 1352 }, 1353 [CX88_BOARD_HAUPPAUGE_HVR3000] = { 1354 .name = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T", 1355 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1356 .radio_type = UNSET, 1357 .tuner_addr = ADDR_UNSET, 1358 .radio_addr = ADDR_UNSET, 1359 .tda9887_conf = TDA9887_PRESENT, 1360 .audio_chip = CX88_AUDIO_WM8775, 1361 .input = { { 1362 .type = CX88_VMUX_TELEVISION, 1363 .vmux = 0, 1364 .gpio0 = 0x84bf, 1365 /* 1: TV Audio / FM Mono */ 1366 .audioroute = 1, 1367 }, { 1368 .type = CX88_VMUX_COMPOSITE1, 1369 .vmux = 1, 1370 .gpio0 = 0x84bf, 1371 /* 2: Line-In */ 1372 .audioroute = 2, 1373 }, { 1374 .type = CX88_VMUX_SVIDEO, 1375 .vmux = 2, 1376 .gpio0 = 0x84bf, 1377 /* 2: Line-In */ 1378 .audioroute = 2, 1379 } }, 1380 .radio = { 1381 .type = CX88_RADIO, 1382 .gpio0 = 0x84bf, 1383 /* 4: FM Stereo (untested) */ 1384 .audioroute = 8, 1385 }, 1386 .mpeg = CX88_MPEG_DVB, 1387 .num_frontends = 2, 1388 }, 1389 [CX88_BOARD_NORWOOD_MICRO] = { 1390 .name = "Norwood Micro TV Tuner", 1391 .tuner_type = TUNER_TNF_5335MF, 1392 .radio_type = UNSET, 1393 .tuner_addr = ADDR_UNSET, 1394 .radio_addr = ADDR_UNSET, 1395 .input = { { 1396 .type = CX88_VMUX_TELEVISION, 1397 .vmux = 0, 1398 .gpio0 = 0x0709, 1399 }, { 1400 .type = CX88_VMUX_COMPOSITE1, 1401 .vmux = 1, 1402 .gpio0 = 0x070b, 1403 }, { 1404 .type = CX88_VMUX_SVIDEO, 1405 .vmux = 2, 1406 .gpio0 = 0x070b, 1407 } }, 1408 }, 1409 [CX88_BOARD_TE_DTV_250_OEM_SWANN] = { 1410 .name = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM", 1411 .tuner_type = TUNER_LG_PAL_NEW_TAPC, 1412 .radio_type = UNSET, 1413 .tuner_addr = ADDR_UNSET, 1414 .radio_addr = ADDR_UNSET, 1415 .input = { { 1416 .type = CX88_VMUX_TELEVISION, 1417 .vmux = 0, 1418 .gpio0 = 0x003fffff, 1419 .gpio1 = 0x00e00000, 1420 .gpio2 = 0x003fffff, 1421 .gpio3 = 0x02000000, 1422 }, { 1423 .type = CX88_VMUX_COMPOSITE1, 1424 .vmux = 1, 1425 .gpio0 = 0x003fffff, 1426 .gpio1 = 0x00e00000, 1427 .gpio2 = 0x003fffff, 1428 .gpio3 = 0x02000000, 1429 }, { 1430 .type = CX88_VMUX_SVIDEO, 1431 .vmux = 2, 1432 .gpio0 = 0x003fffff, 1433 .gpio1 = 0x00e00000, 1434 .gpio2 = 0x003fffff, 1435 .gpio3 = 0x02000000, 1436 } }, 1437 }, 1438 [CX88_BOARD_HAUPPAUGE_HVR1300] = { 1439 .name = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder", 1440 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1441 .radio_type = UNSET, 1442 .tuner_addr = ADDR_UNSET, 1443 .radio_addr = ADDR_UNSET, 1444 .tda9887_conf = TDA9887_PRESENT, 1445 .audio_chip = CX88_AUDIO_WM8775, 1446 /* 1447 * gpio0 as reported by Mike Crash <mike AT mikecrash.com> 1448 */ 1449 .input = { { 1450 .type = CX88_VMUX_TELEVISION, 1451 .vmux = 0, 1452 .gpio0 = 0xef88, 1453 /* 1: TV Audio / FM Mono */ 1454 .audioroute = 1, 1455 }, { 1456 .type = CX88_VMUX_COMPOSITE1, 1457 .vmux = 1, 1458 .gpio0 = 0xef88, 1459 /* 2: Line-In */ 1460 .audioroute = 2, 1461 }, { 1462 .type = CX88_VMUX_SVIDEO, 1463 .vmux = 2, 1464 .gpio0 = 0xef88, 1465 /* 2: Line-In */ 1466 .audioroute = 2, 1467 } }, 1468 .mpeg = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD, 1469 .radio = { 1470 .type = CX88_RADIO, 1471 .gpio0 = 0xef88, 1472 /* 4: FM Stereo (untested) */ 1473 .audioroute = 8, 1474 }, 1475 }, 1476 [CX88_BOARD_SAMSUNG_SMT_7020] = { 1477 .name = "Samsung SMT 7020 DVB-S", 1478 .tuner_type = UNSET, 1479 .radio_type = UNSET, 1480 .tuner_addr = ADDR_UNSET, 1481 .radio_addr = ADDR_UNSET, 1482 .input = { { 1483 .type = CX88_VMUX_DVB, 1484 .vmux = 0, 1485 } }, 1486 .mpeg = CX88_MPEG_DVB, 1487 }, 1488 [CX88_BOARD_ADSTECH_PTV_390] = { 1489 .name = "ADS Tech Instant Video PCI", 1490 .tuner_type = UNSET, 1491 .radio_type = UNSET, 1492 .tuner_addr = ADDR_UNSET, 1493 .radio_addr = ADDR_UNSET, 1494 .input = { { 1495 .type = CX88_VMUX_DEBUG, 1496 .vmux = 3, 1497 .gpio0 = 0x04ff, 1498 }, { 1499 .type = CX88_VMUX_COMPOSITE1, 1500 .vmux = 1, 1501 .gpio0 = 0x07fa, 1502 }, { 1503 .type = CX88_VMUX_SVIDEO, 1504 .vmux = 2, 1505 .gpio0 = 0x07fa, 1506 } }, 1507 }, 1508 [CX88_BOARD_PINNACLE_PCTV_HD_800i] = { 1509 .name = "Pinnacle PCTV HD 800i", 1510 .tuner_type = TUNER_XC5000, 1511 .radio_type = UNSET, 1512 .tuner_addr = ADDR_UNSET, 1513 .radio_addr = ADDR_UNSET, 1514 .input = { { 1515 .type = CX88_VMUX_TELEVISION, 1516 .vmux = 0, 1517 .gpio0 = 0x04fb, 1518 .gpio1 = 0x10ff, 1519 }, { 1520 .type = CX88_VMUX_COMPOSITE1, 1521 .vmux = 1, 1522 .gpio0 = 0x04fb, 1523 .gpio1 = 0x10ef, 1524 .audioroute = 1, 1525 }, { 1526 .type = CX88_VMUX_SVIDEO, 1527 .vmux = 2, 1528 .gpio0 = 0x04fb, 1529 .gpio1 = 0x10ef, 1530 .audioroute = 1, 1531 } }, 1532 .mpeg = CX88_MPEG_DVB, 1533 }, 1534 [CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = { 1535 .name = "DViCO FusionHDTV 5 PCI nano", 1536 /* xc3008 tuner, digital only for now */ 1537 .tuner_type = UNSET, 1538 .radio_type = UNSET, 1539 .tuner_addr = ADDR_UNSET, 1540 .radio_addr = ADDR_UNSET, 1541 .input = { { 1542 .type = CX88_VMUX_TELEVISION, 1543 .vmux = 0, 1544 .gpio0 = 0x000027df, /* Unconfirmed */ 1545 }, { 1546 .type = CX88_VMUX_COMPOSITE1, 1547 .vmux = 1, 1548 .gpio0 = 0x000027df, /* Unconfirmed */ 1549 .audioroute = 1, 1550 }, { 1551 .type = CX88_VMUX_SVIDEO, 1552 .vmux = 2, 1553 .gpio0 = 0x000027df, /* Unconfirmed */ 1554 .audioroute = 1, 1555 } }, 1556 .mpeg = CX88_MPEG_DVB, 1557 }, 1558 [CX88_BOARD_PINNACLE_HYBRID_PCTV] = { 1559 .name = "Pinnacle Hybrid PCTV", 1560 .tuner_type = TUNER_XC2028, 1561 .tuner_addr = 0x61, 1562 .radio_type = UNSET, 1563 .radio_addr = ADDR_UNSET, 1564 .input = { { 1565 .type = CX88_VMUX_TELEVISION, 1566 .vmux = 0, 1567 .gpio0 = 0x004ff, 1568 .gpio1 = 0x010ff, 1569 .gpio2 = 0x00001, 1570 }, { 1571 .type = CX88_VMUX_COMPOSITE1, 1572 .vmux = 1, 1573 .gpio0 = 0x004fb, 1574 .gpio1 = 0x010ef, 1575 .audioroute = 1, 1576 }, { 1577 .type = CX88_VMUX_SVIDEO, 1578 .vmux = 2, 1579 .gpio0 = 0x004fb, 1580 .gpio1 = 0x010ef, 1581 .audioroute = 1, 1582 } }, 1583 .radio = { 1584 .type = CX88_RADIO, 1585 .gpio0 = 0x004ff, 1586 .gpio1 = 0x010ff, 1587 .gpio2 = 0x0ff, 1588 }, 1589 .mpeg = CX88_MPEG_DVB, 1590 }, 1591 /* Terry Wu <terrywu2009@gmail.com> */ 1592 /* TV Audio : set GPIO 2, 18, 19 value to 0, 1, 0 */ 1593 /* FM Audio : set GPIO 2, 18, 19 value to 0, 0, 0 */ 1594 /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */ 1595 /* Mute Audio : set GPIO 2 value to 1 */ 1596 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = { 1597 .name = "Leadtek TV2000 XP Global", 1598 .tuner_type = TUNER_XC2028, 1599 .tuner_addr = 0x61, 1600 .radio_type = UNSET, 1601 .radio_addr = ADDR_UNSET, 1602 .input = { { 1603 .type = CX88_VMUX_TELEVISION, 1604 .vmux = 0, 1605 .gpio0 = 0x0400, /* pin 2 = 0 */ 1606 .gpio1 = 0x0000, 1607 .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */ 1608 .gpio3 = 0x0000, 1609 }, { 1610 .type = CX88_VMUX_COMPOSITE1, 1611 .vmux = 1, 1612 .gpio0 = 0x0400, /* pin 2 = 0 */ 1613 .gpio1 = 0x0000, 1614 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 1615 .gpio3 = 0x0000, 1616 }, { 1617 .type = CX88_VMUX_SVIDEO, 1618 .vmux = 2, 1619 .gpio0 = 0x0400, /* pin 2 = 0 */ 1620 .gpio1 = 0x0000, 1621 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 1622 .gpio3 = 0x0000, 1623 } }, 1624 .radio = { 1625 .type = CX88_RADIO, 1626 .gpio0 = 0x0400, /* pin 2 = 0 */ 1627 .gpio1 = 0x0000, 1628 .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */ 1629 .gpio3 = 0x0000, 1630 }, 1631 }, 1632 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = { 1633 .name = "Leadtek TV2000 XP Global (SC4100)", 1634 .tuner_type = TUNER_XC4000, 1635 .tuner_addr = 0x61, 1636 .radio_type = UNSET, 1637 .radio_addr = ADDR_UNSET, 1638 .input = { { 1639 .type = CX88_VMUX_TELEVISION, 1640 .vmux = 0, 1641 .gpio0 = 0x0400, /* pin 2 = 0 */ 1642 .gpio1 = 0x0000, 1643 .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */ 1644 .gpio3 = 0x0000, 1645 }, { 1646 .type = CX88_VMUX_COMPOSITE1, 1647 .vmux = 1, 1648 .gpio0 = 0x0400, /* pin 2 = 0 */ 1649 .gpio1 = 0x0000, 1650 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 1651 .gpio3 = 0x0000, 1652 }, { 1653 .type = CX88_VMUX_SVIDEO, 1654 .vmux = 2, 1655 .gpio0 = 0x0400, /* pin 2 = 0 */ 1656 .gpio1 = 0x0000, 1657 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 1658 .gpio3 = 0x0000, 1659 } }, 1660 .radio = { 1661 .type = CX88_RADIO, 1662 .gpio0 = 0x0400, /* pin 2 = 0 */ 1663 .gpio1 = 0x0000, 1664 .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */ 1665 .gpio3 = 0x0000, 1666 }, 1667 }, 1668 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = { 1669 .name = "Leadtek TV2000 XP Global (XC4100)", 1670 .tuner_type = TUNER_XC4000, 1671 .tuner_addr = 0x61, 1672 .radio_type = UNSET, 1673 .radio_addr = ADDR_UNSET, 1674 .input = { { 1675 .type = CX88_VMUX_TELEVISION, 1676 .vmux = 0, 1677 .gpio0 = 0x0400, /* pin 2 = 0 */ 1678 .gpio1 = 0x6040, /* pin 14 = 1, pin 13 = 0 */ 1679 .gpio2 = 0x0000, 1680 .gpio3 = 0x0000, 1681 }, { 1682 .type = CX88_VMUX_COMPOSITE1, 1683 .vmux = 1, 1684 .gpio0 = 0x0400, /* pin 2 = 0 */ 1685 .gpio1 = 0x6060, /* pin 14 = 1, pin 13 = 1 */ 1686 .gpio2 = 0x0000, 1687 .gpio3 = 0x0000, 1688 }, { 1689 .type = CX88_VMUX_SVIDEO, 1690 .vmux = 2, 1691 .gpio0 = 0x0400, /* pin 2 = 0 */ 1692 .gpio1 = 0x6060, /* pin 14 = 1, pin 13 = 1 */ 1693 .gpio2 = 0x0000, 1694 .gpio3 = 0x0000, 1695 } }, 1696 .radio = { 1697 .type = CX88_RADIO, 1698 .gpio0 = 0x0400, /* pin 2 = 0 */ 1699 .gpio1 = 0x6000, /* pin 14 = 1, pin 13 = 0 */ 1700 .gpio2 = 0x0000, 1701 .gpio3 = 0x0000, 1702 }, 1703 }, 1704 [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { 1705 /* Long names may confuse LIRC. */ 1706 .name = "PowerColor RA330", 1707 .tuner_type = TUNER_XC2028, 1708 .tuner_addr = 0x61, 1709 .input = { { 1710 /* 1711 * Due to the way the cx88 driver is written, 1712 * there is no way to deactivate audio pass- 1713 * through without this entry. Furthermore, if 1714 * the TV mux entry is first, you get audio 1715 * from the tuner on boot for a little while. 1716 */ 1717 .type = CX88_VMUX_DEBUG, 1718 .vmux = 3, 1719 .gpio0 = 0x00ff, 1720 .gpio1 = 0xf39d, 1721 .gpio3 = 0x0000, 1722 }, { 1723 .type = CX88_VMUX_TELEVISION, 1724 .vmux = 0, 1725 .gpio0 = 0x00ff, 1726 .gpio1 = 0xf35d, 1727 .gpio3 = 0x0000, 1728 }, { 1729 .type = CX88_VMUX_COMPOSITE1, 1730 .vmux = 1, 1731 .gpio0 = 0x00ff, 1732 .gpio1 = 0xf37d, 1733 .gpio3 = 0x0000, 1734 }, { 1735 .type = CX88_VMUX_SVIDEO, 1736 .vmux = 2, 1737 .gpio0 = 0x000ff, 1738 .gpio1 = 0x0f37d, 1739 .gpio3 = 0x00000, 1740 } }, 1741 .radio = { 1742 .type = CX88_RADIO, 1743 .gpio0 = 0x000ff, 1744 .gpio1 = 0x0f35d, 1745 .gpio3 = 0x00000, 1746 }, 1747 }, 1748 [CX88_BOARD_GENIATECH_X8000_MT] = { 1749 /* Also PowerColor Real Angel 330 and Geniatech X800 OEM */ 1750 .name = "Geniatech X8000-MT DVBT", 1751 .tuner_type = TUNER_XC2028, 1752 .tuner_addr = 0x61, 1753 .input = { { 1754 .type = CX88_VMUX_TELEVISION, 1755 .vmux = 0, 1756 .gpio0 = 0x00000000, 1757 .gpio1 = 0x00e3e341, 1758 .gpio2 = 0x00000000, 1759 .gpio3 = 0x00000000, 1760 }, { 1761 .type = CX88_VMUX_COMPOSITE1, 1762 .vmux = 1, 1763 .gpio0 = 0x00000000, 1764 .gpio1 = 0x00e3e361, 1765 .gpio2 = 0x00000000, 1766 .gpio3 = 0x00000000, 1767 }, { 1768 .type = CX88_VMUX_SVIDEO, 1769 .vmux = 2, 1770 .gpio0 = 0x00000000, 1771 .gpio1 = 0x00e3e361, 1772 .gpio2 = 0x00000000, 1773 .gpio3 = 0x00000000, 1774 } }, 1775 .radio = { 1776 .type = CX88_RADIO, 1777 .gpio0 = 0x00000000, 1778 .gpio1 = 0x00e3e341, 1779 .gpio2 = 0x00000000, 1780 .gpio3 = 0x00000000, 1781 }, 1782 .mpeg = CX88_MPEG_DVB, 1783 }, 1784 [CX88_BOARD_NOTONLYTV_LV3H] = { 1785 .name = "NotOnlyTV LV3H", 1786 .tuner_type = TUNER_XC2028, 1787 .radio_type = UNSET, 1788 .tuner_addr = 0x61, 1789 .radio_addr = ADDR_UNSET, 1790 /* if gpio1:bit9 is enabled, DVB-T won't work */ 1791 1792 .input = { { 1793 .type = CX88_VMUX_TELEVISION, 1794 .vmux = 0, 1795 .gpio0 = 0x0000, 1796 .gpio1 = 0xa141, 1797 .gpio2 = 0x0000, 1798 }, { 1799 .type = CX88_VMUX_COMPOSITE1, 1800 .vmux = 1, 1801 .gpio0 = 0x0000, 1802 .gpio1 = 0xa161, 1803 .gpio2 = 0x0000, 1804 }, { 1805 .type = CX88_VMUX_SVIDEO, 1806 .vmux = 2, 1807 .gpio0 = 0x0000, 1808 .gpio1 = 0xa161, 1809 .gpio2 = 0x0000, 1810 } }, 1811 .radio = { 1812 .type = CX88_RADIO, 1813 .gpio0 = 0x0000, 1814 .gpio1 = 0xa141, 1815 .gpio2 = 0x0000, 1816 }, 1817 .mpeg = CX88_MPEG_DVB, 1818 }, 1819 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = { 1820 .name = "DViCO FusionHDTV DVB-T PRO", 1821 .tuner_type = TUNER_XC2028, 1822 .tuner_addr = 0x61, 1823 .radio_type = UNSET, 1824 .radio_addr = ADDR_UNSET, 1825 .input = { { 1826 .type = CX88_VMUX_COMPOSITE1, 1827 .vmux = 1, 1828 .gpio0 = 0x000067df, 1829 }, { 1830 .type = CX88_VMUX_SVIDEO, 1831 .vmux = 2, 1832 .gpio0 = 0x000067df, 1833 } }, 1834 .mpeg = CX88_MPEG_DVB, 1835 }, 1836 [CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = { 1837 .name = "DViCO FusionHDTV 7 Gold", 1838 .tuner_type = TUNER_XC5000, 1839 .radio_type = UNSET, 1840 .tuner_addr = ADDR_UNSET, 1841 .radio_addr = ADDR_UNSET, 1842 .input = { { 1843 .type = CX88_VMUX_TELEVISION, 1844 .vmux = 0, 1845 .gpio0 = 0x10df, 1846 }, { 1847 .type = CX88_VMUX_COMPOSITE1, 1848 .vmux = 1, 1849 .gpio0 = 0x16d9, 1850 }, { 1851 .type = CX88_VMUX_SVIDEO, 1852 .vmux = 2, 1853 .gpio0 = 0x16d9, 1854 } }, 1855 .mpeg = CX88_MPEG_DVB, 1856 }, 1857 [CX88_BOARD_PROLINK_PV_8000GT] = { 1858 .name = "Prolink Pixelview MPEG 8000GT", 1859 .tuner_type = TUNER_XC2028, 1860 .tuner_addr = 0x61, 1861 .input = { { 1862 .type = CX88_VMUX_TELEVISION, 1863 .vmux = 0, 1864 .gpio0 = 0x0ff, 1865 .gpio2 = 0x0cfb, 1866 }, { 1867 .type = CX88_VMUX_COMPOSITE1, 1868 .vmux = 1, 1869 .gpio2 = 0x0cfb, 1870 }, { 1871 .type = CX88_VMUX_SVIDEO, 1872 .vmux = 2, 1873 .gpio2 = 0x0cfb, 1874 } }, 1875 .radio = { 1876 .type = CX88_RADIO, 1877 .gpio2 = 0x0cfb, 1878 }, 1879 }, 1880 [CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = { 1881 .name = "Prolink Pixelview Global Extreme", 1882 .tuner_type = TUNER_XC2028, 1883 .tuner_addr = 0x61, 1884 .input = { { 1885 .type = CX88_VMUX_TELEVISION, 1886 .vmux = 0, 1887 .gpio0 = 0x04fb, 1888 .gpio1 = 0x04080, 1889 .gpio2 = 0x0cf7, 1890 }, { 1891 .type = CX88_VMUX_COMPOSITE1, 1892 .vmux = 1, 1893 .gpio0 = 0x04fb, 1894 .gpio1 = 0x04080, 1895 .gpio2 = 0x0cfb, 1896 }, { 1897 .type = CX88_VMUX_SVIDEO, 1898 .vmux = 2, 1899 .gpio0 = 0x04fb, 1900 .gpio1 = 0x04080, 1901 .gpio2 = 0x0cfb, 1902 } }, 1903 .radio = { 1904 .type = CX88_RADIO, 1905 .gpio0 = 0x04ff, 1906 .gpio1 = 0x04080, 1907 .gpio2 = 0x0cf7, 1908 }, 1909 }, 1910 /* 1911 * Both radio, analog and ATSC work with this board. 1912 * However, for analog to work, s5h1409 gate should be open, 1913 * otherwise, tuner-xc3028 won't be detected. 1914 * A proper fix require using the newer i2c methods to add 1915 * tuner-xc3028 without doing an i2c probe. 1916 */ 1917 [CX88_BOARD_KWORLD_ATSC_120] = { 1918 .name = "Kworld PlusTV HD PCI 120 (ATSC 120)", 1919 .tuner_type = TUNER_XC2028, 1920 .radio_type = UNSET, 1921 .tuner_addr = ADDR_UNSET, 1922 .radio_addr = ADDR_UNSET, 1923 .input = { { 1924 .type = CX88_VMUX_TELEVISION, 1925 .vmux = 0, 1926 .gpio0 = 0x000000ff, 1927 .gpio1 = 0x0000f35d, 1928 .gpio2 = 0x00000000, 1929 }, { 1930 .type = CX88_VMUX_COMPOSITE1, 1931 .vmux = 1, 1932 .gpio0 = 0x000000ff, 1933 .gpio1 = 0x0000f37e, 1934 .gpio2 = 0x00000000, 1935 }, { 1936 .type = CX88_VMUX_SVIDEO, 1937 .vmux = 2, 1938 .gpio0 = 0x000000ff, 1939 .gpio1 = 0x0000f37e, 1940 .gpio2 = 0x00000000, 1941 } }, 1942 .radio = { 1943 .type = CX88_RADIO, 1944 .gpio0 = 0x000000ff, 1945 .gpio1 = 0x0000f35d, 1946 .gpio2 = 0x00000000, 1947 }, 1948 .mpeg = CX88_MPEG_DVB, 1949 }, 1950 [CX88_BOARD_HAUPPAUGE_HVR4000] = { 1951 .name = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid", 1952 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 1953 .radio_type = UNSET, 1954 .tuner_addr = ADDR_UNSET, 1955 .radio_addr = ADDR_UNSET, 1956 .tda9887_conf = TDA9887_PRESENT, 1957 .audio_chip = CX88_AUDIO_WM8775, 1958 /* 1959 * GPIO0 (WINTV2000) 1960 * 1961 * Analogue SAT DVB-T 1962 * Antenna 0xc4bf 0xc4bb 1963 * Composite 0xc4bf 0xc4bb 1964 * S-Video 0xc4bf 0xc4bb 1965 * Composite1 0xc4ff 0xc4fb 1966 * S-Video1 0xc4ff 0xc4fb 1967 * 1968 * BIT VALUE FUNCTION GP{x}_IO 1969 * 0 1 I:? 1970 * 1 1 I:? 1971 * 2 1 O:MPEG PORT 0=DVB-T 1=DVB-S 1972 * 3 1 I:? 1973 * 4 1 I:? 1974 * 5 1 I:? 1975 * 6 0 O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION 1976 * 7 1 O:DVB-T DEMOD RESET LOW 1977 * 1978 * BIT VALUE FUNCTION GP{x}_OE 1979 * 8 0 I 1980 * 9 0 I 1981 * a 1 O 1982 * b 0 I 1983 * c 0 I 1984 * d 0 I 1985 * e 1 O 1986 * f 1 O 1987 * 1988 * WM8775 ADC 1989 * 1990 * 1: TV Audio / FM Mono 1991 * 2: Line-In 1992 * 3: Line-In Expansion 1993 * 4: FM Stereo 1994 */ 1995 .input = { { 1996 .type = CX88_VMUX_TELEVISION, 1997 .vmux = 0, 1998 .gpio0 = 0xc4bf, 1999 /* 1: TV Audio / FM Mono */ 2000 .audioroute = 1, 2001 }, { 2002 .type = CX88_VMUX_COMPOSITE1, 2003 .vmux = 1, 2004 .gpio0 = 0xc4bf, 2005 /* 2: Line-In */ 2006 .audioroute = 2, 2007 }, { 2008 .type = CX88_VMUX_SVIDEO, 2009 .vmux = 2, 2010 .gpio0 = 0xc4bf, 2011 /* 2: Line-In */ 2012 .audioroute = 2, 2013 } }, 2014 .radio = { 2015 .type = CX88_RADIO, 2016 .gpio0 = 0xc4bf, 2017 /* 4: FM Stereo */ 2018 .audioroute = 8, 2019 }, 2020 .mpeg = CX88_MPEG_DVB, 2021 .num_frontends = 2, 2022 }, 2023 [CX88_BOARD_HAUPPAUGE_HVR4000LITE] = { 2024 .name = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2", 2025 .tuner_type = UNSET, 2026 .radio_type = UNSET, 2027 .tuner_addr = ADDR_UNSET, 2028 .radio_addr = ADDR_UNSET, 2029 .input = { { 2030 .type = CX88_VMUX_DVB, 2031 .vmux = 0, 2032 } }, 2033 .mpeg = CX88_MPEG_DVB, 2034 }, 2035 [CX88_BOARD_TEVII_S420] = { 2036 .name = "TeVii S420 DVB-S", 2037 .tuner_type = UNSET, 2038 .radio_type = UNSET, 2039 .tuner_addr = ADDR_UNSET, 2040 .radio_addr = ADDR_UNSET, 2041 .input = { { 2042 .type = CX88_VMUX_DVB, 2043 .vmux = 0, 2044 } }, 2045 .mpeg = CX88_MPEG_DVB, 2046 }, 2047 [CX88_BOARD_TEVII_S460] = { 2048 .name = "TeVii S460 DVB-S/S2", 2049 .tuner_type = UNSET, 2050 .radio_type = UNSET, 2051 .tuner_addr = ADDR_UNSET, 2052 .radio_addr = ADDR_UNSET, 2053 .input = { { 2054 .type = CX88_VMUX_DVB, 2055 .vmux = 0, 2056 } }, 2057 .mpeg = CX88_MPEG_DVB, 2058 }, 2059 [CX88_BOARD_TEVII_S464] = { 2060 .name = "TeVii S464 DVB-S/S2", 2061 .tuner_type = UNSET, 2062 .radio_type = UNSET, 2063 .tuner_addr = ADDR_UNSET, 2064 .radio_addr = ADDR_UNSET, 2065 .input = { { 2066 .type = CX88_VMUX_DVB, 2067 .vmux = 0, 2068 } }, 2069 .mpeg = CX88_MPEG_DVB, 2070 }, 2071 [CX88_BOARD_OMICOM_SS4_PCI] = { 2072 .name = "Omicom SS4 DVB-S/S2 PCI", 2073 .tuner_type = UNSET, 2074 .radio_type = UNSET, 2075 .tuner_addr = ADDR_UNSET, 2076 .radio_addr = ADDR_UNSET, 2077 .input = { { 2078 .type = CX88_VMUX_DVB, 2079 .vmux = 0, 2080 } }, 2081 .mpeg = CX88_MPEG_DVB, 2082 }, 2083 [CX88_BOARD_TBS_8910] = { 2084 .name = "TBS 8910 DVB-S", 2085 .tuner_type = UNSET, 2086 .radio_type = UNSET, 2087 .tuner_addr = ADDR_UNSET, 2088 .radio_addr = ADDR_UNSET, 2089 .input = { { 2090 .type = CX88_VMUX_DVB, 2091 .vmux = 0, 2092 } }, 2093 .mpeg = CX88_MPEG_DVB, 2094 }, 2095 [CX88_BOARD_TBS_8920] = { 2096 .name = "TBS 8920 DVB-S/S2", 2097 .tuner_type = UNSET, 2098 .radio_type = UNSET, 2099 .tuner_addr = ADDR_UNSET, 2100 .radio_addr = ADDR_UNSET, 2101 .input = { { 2102 .type = CX88_VMUX_DVB, 2103 .vmux = 0, 2104 .gpio0 = 0x8080, 2105 } }, 2106 .mpeg = CX88_MPEG_DVB, 2107 }, 2108 [CX88_BOARD_PROF_6200] = { 2109 .name = "Prof 6200 DVB-S", 2110 .tuner_type = UNSET, 2111 .radio_type = UNSET, 2112 .tuner_addr = ADDR_UNSET, 2113 .radio_addr = ADDR_UNSET, 2114 .input = { { 2115 .type = CX88_VMUX_DVB, 2116 .vmux = 0, 2117 } }, 2118 .mpeg = CX88_MPEG_DVB, 2119 }, 2120 [CX88_BOARD_PROF_7300] = { 2121 .name = "PROF 7300 DVB-S/S2", 2122 .tuner_type = UNSET, 2123 .radio_type = UNSET, 2124 .tuner_addr = ADDR_UNSET, 2125 .radio_addr = ADDR_UNSET, 2126 .input = { { 2127 .type = CX88_VMUX_DVB, 2128 .vmux = 0, 2129 } }, 2130 .mpeg = CX88_MPEG_DVB, 2131 }, 2132 [CX88_BOARD_SATTRADE_ST4200] = { 2133 .name = "SATTRADE ST4200 DVB-S/S2", 2134 .tuner_type = UNSET, 2135 .radio_type = UNSET, 2136 .tuner_addr = ADDR_UNSET, 2137 .radio_addr = ADDR_UNSET, 2138 .input = { { 2139 .type = CX88_VMUX_DVB, 2140 .vmux = 0, 2141 } }, 2142 .mpeg = CX88_MPEG_DVB, 2143 }, 2144 [CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = { 2145 .name = "Terratec Cinergy HT PCI MKII", 2146 .tuner_type = TUNER_XC2028, 2147 .tuner_addr = 0x61, 2148 .radio_type = UNSET, 2149 .radio_addr = ADDR_UNSET, 2150 .input = { { 2151 .type = CX88_VMUX_TELEVISION, 2152 .vmux = 0, 2153 .gpio0 = 0x004ff, 2154 .gpio1 = 0x010ff, 2155 .gpio2 = 0x00001, 2156 }, { 2157 .type = CX88_VMUX_COMPOSITE1, 2158 .vmux = 1, 2159 .gpio0 = 0x004fb, 2160 .gpio1 = 0x010ef, 2161 .audioroute = 1, 2162 }, { 2163 .type = CX88_VMUX_SVIDEO, 2164 .vmux = 2, 2165 .gpio0 = 0x004fb, 2166 .gpio1 = 0x010ef, 2167 .audioroute = 1, 2168 } }, 2169 .radio = { 2170 .type = CX88_RADIO, 2171 .gpio0 = 0x004ff, 2172 .gpio1 = 0x010ff, 2173 .gpio2 = 0x0ff, 2174 }, 2175 .mpeg = CX88_MPEG_DVB, 2176 }, 2177 [CX88_BOARD_HAUPPAUGE_IRONLY] = { 2178 .name = "Hauppauge WinTV-IR Only", 2179 .tuner_type = UNSET, 2180 .radio_type = UNSET, 2181 .tuner_addr = ADDR_UNSET, 2182 .radio_addr = ADDR_UNSET, 2183 }, 2184 [CX88_BOARD_WINFAST_DTV1800H] = { 2185 .name = "Leadtek WinFast DTV1800 Hybrid", 2186 .tuner_type = TUNER_XC2028, 2187 .radio_type = UNSET, 2188 .tuner_addr = 0x61, 2189 .radio_addr = ADDR_UNSET, 2190 /* 2191 * GPIO setting 2192 * 2193 * 2: mute (0=off,1=on) 2194 * 12: tuner reset pin 2195 * 13: audio source (0=tuner audio,1=line in) 2196 * 14: FM (0=on,1=off ???) 2197 */ 2198 .input = { { 2199 .type = CX88_VMUX_TELEVISION, 2200 .vmux = 0, 2201 .gpio0 = 0x0400, /* pin 2 = 0 */ 2202 .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */ 2203 .gpio2 = 0x0000, 2204 }, { 2205 .type = CX88_VMUX_COMPOSITE1, 2206 .vmux = 1, 2207 .gpio0 = 0x0400, /* pin 2 = 0 */ 2208 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 2209 .gpio2 = 0x0000, 2210 }, { 2211 .type = CX88_VMUX_SVIDEO, 2212 .vmux = 2, 2213 .gpio0 = 0x0400, /* pin 2 = 0 */ 2214 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 2215 .gpio2 = 0x0000, 2216 } }, 2217 .radio = { 2218 .type = CX88_RADIO, 2219 .gpio0 = 0x0400, /* pin 2 = 0 */ 2220 .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */ 2221 .gpio2 = 0x0000, 2222 }, 2223 .mpeg = CX88_MPEG_DVB, 2224 }, 2225 [CX88_BOARD_WINFAST_DTV1800H_XC4000] = { 2226 .name = "Leadtek WinFast DTV1800 H (XC4000)", 2227 .tuner_type = TUNER_XC4000, 2228 .radio_type = UNSET, 2229 .tuner_addr = 0x61, 2230 .radio_addr = ADDR_UNSET, 2231 /* 2232 * GPIO setting 2233 * 2234 * 2: mute (0=off,1=on) 2235 * 12: tuner reset pin 2236 * 13: audio source (0=tuner audio,1=line in) 2237 * 14: FM (0=on,1=off ???) 2238 */ 2239 .input = { { 2240 .type = CX88_VMUX_TELEVISION, 2241 .vmux = 0, 2242 .gpio0 = 0x0400, /* pin 2 = 0 */ 2243 .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */ 2244 .gpio2 = 0x0000, 2245 }, { 2246 .type = CX88_VMUX_COMPOSITE1, 2247 .vmux = 1, 2248 .gpio0 = 0x0400, /* pin 2 = 0 */ 2249 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 2250 .gpio2 = 0x0000, 2251 }, { 2252 .type = CX88_VMUX_SVIDEO, 2253 .vmux = 2, 2254 .gpio0 = 0x0400, /* pin 2 = 0 */ 2255 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 2256 .gpio2 = 0x0000, 2257 } }, 2258 .radio = { 2259 .type = CX88_RADIO, 2260 .gpio0 = 0x0400, /* pin 2 = 0 */ 2261 .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */ 2262 .gpio2 = 0x0000, 2263 }, 2264 .mpeg = CX88_MPEG_DVB, 2265 }, 2266 [CX88_BOARD_WINFAST_DTV2000H_PLUS] = { 2267 .name = "Leadtek WinFast DTV2000 H PLUS", 2268 .tuner_type = TUNER_XC4000, 2269 .radio_type = UNSET, 2270 .tuner_addr = 0x61, 2271 .radio_addr = ADDR_UNSET, 2272 /* 2273 * GPIO 2274 * 2: 1: mute audio 2275 * 12: 0: reset XC4000 2276 * 13: 1: audio input is line in (0: tuner) 2277 * 14: 0: FM radio 2278 * 16: 0: RF input is cable 2279 */ 2280 .input = { { 2281 .type = CX88_VMUX_TELEVISION, 2282 .vmux = 0, 2283 .gpio0 = 0x0403, 2284 .gpio1 = 0xF0D7, 2285 .gpio2 = 0x0101, 2286 .gpio3 = 0x0000, 2287 }, { 2288 .type = CX88_VMUX_CABLE, 2289 .vmux = 0, 2290 .gpio0 = 0x0403, 2291 .gpio1 = 0xF0D7, 2292 .gpio2 = 0x0100, 2293 .gpio3 = 0x0000, 2294 }, { 2295 .type = CX88_VMUX_COMPOSITE1, 2296 .vmux = 1, 2297 .gpio0 = 0x0403, /* was 0x0407 */ 2298 .gpio1 = 0xF0F7, 2299 .gpio2 = 0x0101, 2300 .gpio3 = 0x0000, 2301 }, { 2302 .type = CX88_VMUX_SVIDEO, 2303 .vmux = 2, 2304 .gpio0 = 0x0403, /* was 0x0407 */ 2305 .gpio1 = 0xF0F7, 2306 .gpio2 = 0x0101, 2307 .gpio3 = 0x0000, 2308 } }, 2309 .radio = { 2310 .type = CX88_RADIO, 2311 .gpio0 = 0x0403, 2312 .gpio1 = 0xF097, 2313 .gpio2 = 0x0100, 2314 .gpio3 = 0x0000, 2315 }, 2316 .mpeg = CX88_MPEG_DVB, 2317 }, 2318 [CX88_BOARD_PROF_7301] = { 2319 .name = "Prof 7301 DVB-S/S2", 2320 .tuner_type = UNSET, 2321 .radio_type = UNSET, 2322 .tuner_addr = ADDR_UNSET, 2323 .radio_addr = ADDR_UNSET, 2324 .input = { { 2325 .type = CX88_VMUX_DVB, 2326 .vmux = 0, 2327 } }, 2328 .mpeg = CX88_MPEG_DVB, 2329 }, 2330 [CX88_BOARD_TWINHAN_VP1027_DVBS] = { 2331 .name = "Twinhan VP-1027 DVB-S", 2332 .tuner_type = UNSET, 2333 .radio_type = UNSET, 2334 .tuner_addr = ADDR_UNSET, 2335 .radio_addr = ADDR_UNSET, 2336 .input = { { 2337 .type = CX88_VMUX_DVB, 2338 .vmux = 0, 2339 } }, 2340 .mpeg = CX88_MPEG_DVB, 2341 }, 2342}; 2343 2344/* ------------------------------------------------------------------ */ 2345/* PCI subsystem IDs */ 2346 2347static const struct cx88_subid cx88_subids[] = { 2348 { 2349 .subvendor = 0x0070, 2350 .subdevice = 0x3400, 2351 .card = CX88_BOARD_HAUPPAUGE, 2352 }, { 2353 .subvendor = 0x0070, 2354 .subdevice = 0x3401, 2355 .card = CX88_BOARD_HAUPPAUGE, 2356 }, { 2357 .subvendor = 0x14c7, 2358 .subdevice = 0x0106, 2359 .card = CX88_BOARD_GDI, 2360 }, { 2361 .subvendor = 0x14c7, 2362 .subdevice = 0x0107, /* with mpeg encoder */ 2363 .card = CX88_BOARD_GDI, 2364 }, { 2365 .subvendor = PCI_VENDOR_ID_ATI, 2366 .subdevice = 0x00f8, 2367 .card = CX88_BOARD_ATI_WONDER_PRO, 2368 }, { 2369 .subvendor = PCI_VENDOR_ID_ATI, 2370 .subdevice = 0x00f9, 2371 .card = CX88_BOARD_ATI_WONDER_PRO, 2372 }, { 2373 .subvendor = 0x107d, 2374 .subdevice = 0x6611, 2375 .card = CX88_BOARD_WINFAST2000XP_EXPERT, 2376 }, { 2377 .subvendor = 0x107d, 2378 .subdevice = 0x6613, /* NTSC */ 2379 .card = CX88_BOARD_WINFAST2000XP_EXPERT, 2380 }, { 2381 .subvendor = 0x107d, 2382 .subdevice = 0x6620, 2383 .card = CX88_BOARD_WINFAST_DV2000, 2384 }, { 2385 .subvendor = 0x107d, 2386 .subdevice = 0x663b, 2387 .card = CX88_BOARD_LEADTEK_PVR2000, 2388 }, { 2389 .subvendor = 0x107d, 2390 .subdevice = 0x663c, 2391 .card = CX88_BOARD_LEADTEK_PVR2000, 2392 }, { 2393 .subvendor = 0x1461, 2394 .subdevice = 0x000b, 2395 .card = CX88_BOARD_AVERTV_STUDIO_303, 2396 }, { 2397 .subvendor = 0x1462, 2398 .subdevice = 0x8606, 2399 .card = CX88_BOARD_MSI_TVANYWHERE_MASTER, 2400 }, { 2401 .subvendor = 0x10fc, 2402 .subdevice = 0xd003, 2403 .card = CX88_BOARD_IODATA_GVVCP3PCI, 2404 }, { 2405 .subvendor = 0x1043, 2406 .subdevice = 0x4823, /* with mpeg encoder */ 2407 .card = CX88_BOARD_ASUS_PVR_416, 2408 }, { 2409 .subvendor = 0x17de, 2410 .subdevice = 0x08a6, 2411 .card = CX88_BOARD_KWORLD_DVB_T, 2412 }, { 2413 .subvendor = 0x18ac, 2414 .subdevice = 0xd810, 2415 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q, 2416 }, { 2417 .subvendor = 0x18ac, 2418 .subdevice = 0xd820, 2419 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T, 2420 }, { 2421 .subvendor = 0x18ac, 2422 .subdevice = 0xdb00, 2423 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1, 2424 }, { 2425 .subvendor = 0x0070, 2426 .subdevice = 0x9002, 2427 .card = CX88_BOARD_HAUPPAUGE_DVB_T1, 2428 }, { 2429 .subvendor = 0x14f1, 2430 .subdevice = 0x0187, 2431 .card = CX88_BOARD_CONEXANT_DVB_T1, 2432 }, { 2433 .subvendor = 0x1540, 2434 .subdevice = 0x2580, 2435 .card = CX88_BOARD_PROVIDEO_PV259, 2436 }, { 2437 .subvendor = 0x18ac, 2438 .subdevice = 0xdb10, 2439 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS, 2440 }, { 2441 .subvendor = 0x1554, 2442 .subdevice = 0x4811, 2443 .card = CX88_BOARD_PIXELVIEW, 2444 }, { 2445 .subvendor = 0x7063, 2446 .subdevice = 0x3000, /* HD-3000 card */ 2447 .card = CX88_BOARD_PCHDTV_HD3000, 2448 }, { 2449 .subvendor = 0x17de, 2450 .subdevice = 0xa8a6, 2451 .card = CX88_BOARD_DNTV_LIVE_DVB_T, 2452 }, { 2453 .subvendor = 0x0070, 2454 .subdevice = 0x2801, 2455 .card = CX88_BOARD_HAUPPAUGE_ROSLYN, 2456 }, { 2457 .subvendor = 0x14f1, 2458 .subdevice = 0x0342, 2459 .card = CX88_BOARD_DIGITALLOGIC_MEC, 2460 }, { 2461 .subvendor = 0x10fc, 2462 .subdevice = 0xd035, 2463 .card = CX88_BOARD_IODATA_GVBCTV7E, 2464 }, { 2465 .subvendor = 0x1421, 2466 .subdevice = 0x0334, 2467 .card = CX88_BOARD_ADSTECH_DVB_T_PCI, 2468 }, { 2469 .subvendor = 0x153b, 2470 .subdevice = 0x1166, 2471 .card = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1, 2472 }, { 2473 .subvendor = 0x18ac, 2474 .subdevice = 0xd500, 2475 .card = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD, 2476 }, { 2477 .subvendor = 0x1461, 2478 .subdevice = 0x8011, 2479 .card = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550, 2480 }, { 2481 .subvendor = PCI_VENDOR_ID_ATI, 2482 .subdevice = 0xa101, 2483 .card = CX88_BOARD_ATI_HDTVWONDER, 2484 }, { 2485 .subvendor = 0x107d, 2486 .subdevice = 0x665f, 2487 .card = CX88_BOARD_WINFAST_DTV1000, 2488 }, { 2489 .subvendor = 0x1461, 2490 .subdevice = 0x000a, 2491 .card = CX88_BOARD_AVERTV_303, 2492 }, { 2493 .subvendor = 0x0070, 2494 .subdevice = 0x9200, 2495 .card = CX88_BOARD_HAUPPAUGE_NOVASE2_S1, 2496 }, { 2497 .subvendor = 0x0070, 2498 .subdevice = 0x9201, 2499 .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1, 2500 }, { 2501 .subvendor = 0x0070, 2502 .subdevice = 0x9202, 2503 .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1, 2504 }, { 2505 .subvendor = 0x17de, 2506 .subdevice = 0x08b2, 2507 .card = CX88_BOARD_KWORLD_DVBS_100, 2508 }, { 2509 .subvendor = 0x0070, 2510 .subdevice = 0x9400, 2511 .card = CX88_BOARD_HAUPPAUGE_HVR1100, 2512 }, { 2513 .subvendor = 0x0070, 2514 .subdevice = 0x9402, 2515 .card = CX88_BOARD_HAUPPAUGE_HVR1100, 2516 }, { 2517 .subvendor = 0x0070, 2518 .subdevice = 0x9800, 2519 .card = CX88_BOARD_HAUPPAUGE_HVR1100LP, 2520 }, { 2521 .subvendor = 0x0070, 2522 .subdevice = 0x9802, 2523 .card = CX88_BOARD_HAUPPAUGE_HVR1100LP, 2524 }, { 2525 .subvendor = 0x0070, 2526 .subdevice = 0x9001, 2527 .card = CX88_BOARD_HAUPPAUGE_DVB_T1, 2528 }, { 2529 .subvendor = 0x1822, 2530 .subdevice = 0x0025, 2531 .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO, 2532 }, { 2533 .subvendor = 0x17de, 2534 .subdevice = 0x08a1, 2535 .card = CX88_BOARD_KWORLD_DVB_T_CX22702, 2536 }, { 2537 .subvendor = 0x18ac, 2538 .subdevice = 0xdb50, 2539 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL, 2540 }, { 2541 .subvendor = 0x18ac, 2542 .subdevice = 0xdb54, 2543 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL, 2544 /* Re-branded DViCO: DigitalNow DVB-T Dual */ 2545 }, { 2546 .subvendor = 0x18ac, 2547 .subdevice = 0xdb11, 2548 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS, 2549 /* Re-branded DViCO: UltraView DVB-T Plus */ 2550 }, { 2551 .subvendor = 0x18ac, 2552 .subdevice = 0xdb30, 2553 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO, 2554 }, { 2555 .subvendor = 0x17de, 2556 .subdevice = 0x0840, 2557 .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT, 2558 }, { 2559 .subvendor = 0x1421, 2560 .subdevice = 0x0305, 2561 .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT, 2562 }, { 2563 .subvendor = 0x18ac, 2564 .subdevice = 0xdb40, 2565 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID, 2566 }, { 2567 .subvendor = 0x18ac, 2568 .subdevice = 0xdb44, 2569 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID, 2570 }, { 2571 .subvendor = 0x7063, 2572 .subdevice = 0x5500, 2573 .card = CX88_BOARD_PCHDTV_HD5500, 2574 }, { 2575 .subvendor = 0x17de, 2576 .subdevice = 0x0841, 2577 .card = CX88_BOARD_KWORLD_MCE200_DELUXE, 2578 }, { 2579 .subvendor = 0x1822, 2580 .subdevice = 0x0019, 2581 .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO, 2582 }, { 2583 .subvendor = 0x1554, 2584 .subdevice = 0x4813, 2585 .card = CX88_BOARD_PIXELVIEW_PLAYTV_P7000, 2586 }, { 2587 .subvendor = 0x14f1, 2588 .subdevice = 0x0842, 2589 .card = CX88_BOARD_NPGTECH_REALTV_TOP10FM, 2590 }, { 2591 .subvendor = 0x107d, 2592 .subdevice = 0x665e, 2593 .card = CX88_BOARD_WINFAST_DTV2000H, 2594 }, { 2595 .subvendor = 0x107d, 2596 .subdevice = 0x6f2b, 2597 .card = CX88_BOARD_WINFAST_DTV2000H_J, 2598 }, { 2599 .subvendor = 0x18ac, 2600 .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */ 2601 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q, 2602 }, { 2603 .subvendor = 0x14f1, 2604 .subdevice = 0x0084, 2605 .card = CX88_BOARD_GENIATECH_DVBS, 2606 }, { 2607 .subvendor = 0x0070, 2608 .subdevice = 0x1404, 2609 .card = CX88_BOARD_HAUPPAUGE_HVR3000, 2610 }, { 2611 .subvendor = 0x18ac, 2612 .subdevice = 0xdc00, 2613 .card = CX88_BOARD_SAMSUNG_SMT_7020, 2614 }, { 2615 .subvendor = 0x18ac, 2616 .subdevice = 0xdccd, 2617 .card = CX88_BOARD_SAMSUNG_SMT_7020, 2618 }, { 2619 .subvendor = 0x1461, 2620 .subdevice = 0xc111, /* AverMedia M150-D */ 2621 /* This board is known to work with the ASUS PVR416 config */ 2622 .card = CX88_BOARD_ASUS_PVR_416, 2623 }, { 2624 .subvendor = 0xc180, 2625 .subdevice = 0xc980, 2626 .card = CX88_BOARD_TE_DTV_250_OEM_SWANN, 2627 }, { 2628 .subvendor = 0x0070, 2629 .subdevice = 0x9600, 2630 .card = CX88_BOARD_HAUPPAUGE_HVR1300, 2631 }, { 2632 .subvendor = 0x0070, 2633 .subdevice = 0x9601, 2634 .card = CX88_BOARD_HAUPPAUGE_HVR1300, 2635 }, { 2636 .subvendor = 0x0070, 2637 .subdevice = 0x9602, 2638 .card = CX88_BOARD_HAUPPAUGE_HVR1300, 2639 }, { 2640 .subvendor = 0x107d, 2641 .subdevice = 0x6632, 2642 .card = CX88_BOARD_LEADTEK_PVR2000, 2643 }, { 2644 .subvendor = 0x12ab, 2645 .subdevice = 0x2300, /* Club3D Zap TV2100 */ 2646 .card = CX88_BOARD_KWORLD_DVB_T_CX22702, 2647 }, { 2648 .subvendor = 0x0070, 2649 .subdevice = 0x9000, 2650 .card = CX88_BOARD_HAUPPAUGE_DVB_T1, 2651 }, { 2652 .subvendor = 0x0070, 2653 .subdevice = 0x1400, 2654 .card = CX88_BOARD_HAUPPAUGE_HVR3000, 2655 }, { 2656 .subvendor = 0x0070, 2657 .subdevice = 0x1401, 2658 .card = CX88_BOARD_HAUPPAUGE_HVR3000, 2659 }, { 2660 .subvendor = 0x0070, 2661 .subdevice = 0x1402, 2662 .card = CX88_BOARD_HAUPPAUGE_HVR3000, 2663 }, { 2664 .subvendor = 0x1421, 2665 .subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */ 2666 .card = CX88_BOARD_KWORLD_DVBS_100, 2667 }, { 2668 .subvendor = 0x1421, 2669 .subdevice = 0x0390, 2670 .card = CX88_BOARD_ADSTECH_PTV_390, 2671 }, { 2672 .subvendor = 0x11bd, 2673 .subdevice = 0x0051, 2674 .card = CX88_BOARD_PINNACLE_PCTV_HD_800i, 2675 }, { 2676 .subvendor = 0x18ac, 2677 .subdevice = 0xd530, 2678 .card = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO, 2679 }, { 2680 .subvendor = 0x12ab, 2681 .subdevice = 0x1788, 2682 .card = CX88_BOARD_PINNACLE_HYBRID_PCTV, 2683 }, { 2684 .subvendor = 0x14f1, 2685 .subdevice = 0xea3d, 2686 .card = CX88_BOARD_POWERCOLOR_REAL_ANGEL, 2687 }, { 2688 .subvendor = 0x107d, 2689 .subdevice = 0x6f18, 2690 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 2691 }, { 2692 /* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */ 2693 .subvendor = 0x14f1, 2694 .subdevice = 0x8852, 2695 .card = CX88_BOARD_GENIATECH_X8000_MT, 2696 }, { 2697 .subvendor = 0x18ac, 2698 .subdevice = 0xd610, 2699 .card = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD, 2700 }, { 2701 .subvendor = 0x1554, 2702 .subdevice = 0x4935, 2703 .card = CX88_BOARD_PROLINK_PV_8000GT, 2704 }, { 2705 .subvendor = 0x1554, 2706 .subdevice = 0x4976, 2707 .card = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME, 2708 }, { 2709 .subvendor = 0x17de, 2710 .subdevice = 0x08c1, 2711 .card = CX88_BOARD_KWORLD_ATSC_120, 2712 }, { 2713 .subvendor = 0x0070, 2714 .subdevice = 0x6900, 2715 .card = CX88_BOARD_HAUPPAUGE_HVR4000, 2716 }, { 2717 .subvendor = 0x0070, 2718 .subdevice = 0x6904, 2719 .card = CX88_BOARD_HAUPPAUGE_HVR4000, 2720 }, { 2721 .subvendor = 0x0070, 2722 .subdevice = 0x6902, 2723 .card = CX88_BOARD_HAUPPAUGE_HVR4000, 2724 }, { 2725 .subvendor = 0x0070, 2726 .subdevice = 0x6905, 2727 .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE, 2728 }, { 2729 .subvendor = 0x0070, 2730 .subdevice = 0x6906, 2731 .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE, 2732 }, { 2733 .subvendor = 0xd420, 2734 .subdevice = 0x9022, 2735 .card = CX88_BOARD_TEVII_S420, 2736 }, { 2737 .subvendor = 0xd460, 2738 .subdevice = 0x9022, 2739 .card = CX88_BOARD_TEVII_S460, 2740 }, { 2741 .subvendor = 0xd464, 2742 .subdevice = 0x9022, 2743 .card = CX88_BOARD_TEVII_S464, 2744 }, { 2745 .subvendor = 0xA044, 2746 .subdevice = 0x2011, 2747 .card = CX88_BOARD_OMICOM_SS4_PCI, 2748 }, { 2749 .subvendor = 0x8910, 2750 .subdevice = 0x8888, 2751 .card = CX88_BOARD_TBS_8910, 2752 }, { 2753 .subvendor = 0x8920, 2754 .subdevice = 0x8888, 2755 .card = CX88_BOARD_TBS_8920, 2756 }, { 2757 .subvendor = 0xb022, 2758 .subdevice = 0x3022, 2759 .card = CX88_BOARD_PROF_6200, 2760 }, { 2761 .subvendor = 0xB033, 2762 .subdevice = 0x3033, 2763 .card = CX88_BOARD_PROF_7300, 2764 }, { 2765 .subvendor = 0xb200, 2766 .subdevice = 0x4200, 2767 .card = CX88_BOARD_SATTRADE_ST4200, 2768 }, { 2769 .subvendor = 0x153b, 2770 .subdevice = 0x1177, 2771 .card = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII, 2772 }, { 2773 .subvendor = 0x0070, 2774 .subdevice = 0x9290, 2775 .card = CX88_BOARD_HAUPPAUGE_IRONLY, 2776 }, { 2777 .subvendor = 0x107d, 2778 .subdevice = 0x6654, 2779 .card = CX88_BOARD_WINFAST_DTV1800H, 2780 }, { 2781 /* WinFast DTV1800 H with XC4000 tuner */ 2782 .subvendor = 0x107d, 2783 .subdevice = 0x6f38, 2784 .card = CX88_BOARD_WINFAST_DTV1800H_XC4000, 2785 }, { 2786 .subvendor = 0x107d, 2787 .subdevice = 0x6f42, 2788 .card = CX88_BOARD_WINFAST_DTV2000H_PLUS, 2789 }, { 2790 /* PVR2000 PAL Model [107d:6630] */ 2791 .subvendor = 0x107d, 2792 .subdevice = 0x6630, 2793 .card = CX88_BOARD_LEADTEK_PVR2000, 2794 }, { 2795 /* PVR2000 PAL Model [107d:6638] */ 2796 .subvendor = 0x107d, 2797 .subdevice = 0x6638, 2798 .card = CX88_BOARD_LEADTEK_PVR2000, 2799 }, { 2800 /* PVR2000 NTSC Model [107d:6631] */ 2801 .subvendor = 0x107d, 2802 .subdevice = 0x6631, 2803 .card = CX88_BOARD_LEADTEK_PVR2000, 2804 }, { 2805 /* PVR2000 NTSC Model [107d:6637] */ 2806 .subvendor = 0x107d, 2807 .subdevice = 0x6637, 2808 .card = CX88_BOARD_LEADTEK_PVR2000, 2809 }, { 2810 /* PVR2000 NTSC Model [107d:663d] */ 2811 .subvendor = 0x107d, 2812 .subdevice = 0x663d, 2813 .card = CX88_BOARD_LEADTEK_PVR2000, 2814 }, { 2815 /* DV2000 NTSC Model [107d:6621] */ 2816 .subvendor = 0x107d, 2817 .subdevice = 0x6621, 2818 .card = CX88_BOARD_WINFAST_DV2000, 2819 }, { 2820 /* TV2000 XP Global [107d:6618] */ 2821 .subvendor = 0x107d, 2822 .subdevice = 0x6618, 2823 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 2824 }, { 2825 /* TV2000 XP Global [107d:6618] */ 2826 .subvendor = 0x107d, 2827 .subdevice = 0x6619, 2828 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 2829 }, { 2830 /* WinFast TV2000 XP Global with XC4000 tuner */ 2831 .subvendor = 0x107d, 2832 .subdevice = 0x6f36, 2833 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36, 2834 }, { 2835 /* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */ 2836 .subvendor = 0x107d, 2837 .subdevice = 0x6f43, 2838 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43, 2839 }, { 2840 .subvendor = 0xb034, 2841 .subdevice = 0x3034, 2842 .card = CX88_BOARD_PROF_7301, 2843 }, { 2844 .subvendor = 0x1822, 2845 .subdevice = 0x0023, 2846 .card = CX88_BOARD_TWINHAN_VP1027_DVBS, 2847 }, 2848}; 2849 2850/* 2851 * some leadtek specific stuff 2852 */ 2853static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) 2854{ 2855 if (eeprom_data[4] != 0x7d || 2856 eeprom_data[5] != 0x10 || 2857 eeprom_data[7] != 0x66) { 2858 pr_warn("Leadtek eeprom invalid.\n"); 2859 return; 2860 } 2861 2862 /* Terry Wu <terrywu2009@gmail.com> */ 2863 switch (eeprom_data[6]) { 2864 case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */ 2865 case 0x21: /* SSID 6621 for DV2000 NTSC Model */ 2866 case 0x31: /* SSID 6631 for PVR2000 NTSC Model */ 2867 case 0x37: /* SSID 6637 for PVR2000 NTSC Model */ 2868 case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */ 2869 core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3; 2870 break; 2871 default: 2872 core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3; 2873 break; 2874 } 2875 2876 pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n", 2877 core->board.tuner_type, eeprom_data[0]); 2878} 2879 2880static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data) 2881{ 2882 struct tveeprom tv; 2883 2884 tveeprom_hauppauge_analog(&tv, eeprom_data); 2885 core->board.tuner_type = tv.tuner_type; 2886 core->tuner_formats = tv.tuner_formats; 2887 core->board.radio.type = tv.has_radio ? CX88_RADIO : 0; 2888 core->model = tv.model; 2889 2890 /* Make sure we support the board model */ 2891 switch (tv.model) { 2892 case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */ 2893 case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */ 2894 case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */ 2895 case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */ 2896 case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */ 2897 case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */ 2898 case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */ 2899 case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */ 2900 case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */ 2901 case 28552: /* WinTV-PVR 'Roslyn' (No IR) */ 2902 case 34519: /* WinTV-PCI-FM */ 2903 case 69009: 2904 /* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */ 2905 case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */ 2906 case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */ 2907 case 69559: 2908 /* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */ 2909 case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */ 2910 case 90002: /* Nova-T-PCI (9002) */ 2911 case 92001: /* Nova-S-Plus (Video and IR) */ 2912 case 92002: /* Nova-S-Plus (Video and IR) */ 2913 case 90003: /* Nova-T-PCI (9002 No RF out) */ 2914 case 90500: /* Nova-T-PCI (oem) */ 2915 case 90501: /* Nova-T-PCI (oem/IR) */ 2916 case 92000: /* Nova-SE2 (OEM, No Video or IR) */ 2917 case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */ 2918 case 94009: /* WinTV-HVR1100 (Video and IR Retail) */ 2919 case 94501: /* WinTV-HVR1100 (Video and IR OEM) */ 2920 case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */ 2921 case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */ 2922 case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */ 2923 case 96569: /* WinTV-HVR1300 () */ 2924 case 96659: /* WinTV-HVR1300 () */ 2925 case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */ 2926 /* known */ 2927 break; 2928 case CX88_BOARD_SAMSUNG_SMT_7020: 2929 cx_set(MO_GP0_IO, 0x008989FF); 2930 break; 2931 default: 2932 pr_warn("warning: unknown hauppauge model #%d\n", tv.model); 2933 break; 2934 } 2935 2936 pr_info("hauppauge eeprom: model=%d\n", tv.model); 2937} 2938 2939/* 2940 * some GDI (was: Modular Technology) specific stuff 2941 */ 2942 2943static const struct { 2944 int id; 2945 int fm; 2946 const char *name; 2947} gdi_tuner[] = { 2948 [0x01] = { .id = UNSET, 2949 .name = "NTSC_M" }, 2950 [0x02] = { .id = UNSET, 2951 .name = "PAL_B" }, 2952 [0x03] = { .id = UNSET, 2953 .name = "PAL_I" }, 2954 [0x04] = { .id = UNSET, 2955 .name = "PAL_D" }, 2956 [0x05] = { .id = UNSET, 2957 .name = "SECAM" }, 2958 2959 [0x10] = { .id = UNSET, 2960 .fm = 1, 2961 .name = "TEMIC_4049" }, 2962 [0x11] = { .id = TUNER_TEMIC_4136FY5, 2963 .name = "TEMIC_4136" }, 2964 [0x12] = { .id = UNSET, 2965 .name = "TEMIC_4146" }, 2966 2967 [0x20] = { .id = TUNER_PHILIPS_FQ1216ME, 2968 .fm = 1, 2969 .name = "PHILIPS_FQ1216_MK3" }, 2970 [0x21] = { .id = UNSET, .fm = 1, 2971 .name = "PHILIPS_FQ1236_MK3" }, 2972 [0x22] = { .id = UNSET, 2973 .name = "PHILIPS_FI1236_MK3" }, 2974 [0x23] = { .id = UNSET, 2975 .name = "PHILIPS_FI1216_MK3" }, 2976}; 2977 2978static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data) 2979{ 2980 const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner)) 2981 ? gdi_tuner[eeprom_data[0x0d]].name : NULL; 2982 2983 pr_info("GDI: tuner=%s\n", name ? name : "unknown"); 2984 if (!name) 2985 return; 2986 core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id; 2987 core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ? 2988 CX88_RADIO : 0; 2989} 2990 2991/* 2992 * some Divco specific stuff 2993 */ 2994static int cx88_dvico_xc2028_callback(struct cx88_core *core, 2995 int command, int arg) 2996{ 2997 switch (command) { 2998 case XC2028_TUNER_RESET: 2999 switch (core->boardnr) { 3000 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: 3001 /* GPIO-4 xc3028 tuner */ 3002 3003 cx_set(MO_GP0_IO, 0x00001000); 3004 cx_clear(MO_GP0_IO, 0x00000010); 3005 msleep(100); 3006 cx_set(MO_GP0_IO, 0x00000010); 3007 msleep(100); 3008 break; 3009 default: 3010 cx_write(MO_GP0_IO, 0x101000); 3011 mdelay(5); 3012 cx_set(MO_GP0_IO, 0x101010); 3013 } 3014 break; 3015 default: 3016 return -EINVAL; 3017 } 3018 3019 return 0; 3020} 3021 3022/* 3023 * some Geniatech specific stuff 3024 */ 3025 3026static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core, 3027 int command, int mode) 3028{ 3029 switch (command) { 3030 case XC2028_TUNER_RESET: 3031 switch (INPUT(core->input).type) { 3032 case CX88_RADIO: 3033 break; 3034 case CX88_VMUX_DVB: 3035 cx_write(MO_GP1_IO, 0x030302); 3036 mdelay(50); 3037 break; 3038 default: 3039 cx_write(MO_GP1_IO, 0x030301); 3040 mdelay(50); 3041 } 3042 cx_write(MO_GP1_IO, 0x101010); 3043 mdelay(50); 3044 cx_write(MO_GP1_IO, 0x101000); 3045 mdelay(50); 3046 cx_write(MO_GP1_IO, 0x101010); 3047 mdelay(50); 3048 return 0; 3049 } 3050 return -EINVAL; 3051} 3052 3053static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core, 3054 int command, int arg) 3055{ 3056 switch (command) { 3057 case XC2028_TUNER_RESET: 3058 /* GPIO 12 (xc3028 tuner reset) */ 3059 cx_set(MO_GP1_IO, 0x1010); 3060 mdelay(50); 3061 cx_clear(MO_GP1_IO, 0x10); 3062 mdelay(75); 3063 cx_set(MO_GP1_IO, 0x10); 3064 mdelay(75); 3065 return 0; 3066 } 3067 return -EINVAL; 3068} 3069 3070static int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core, 3071 int command, int arg) 3072{ 3073 switch (command) { 3074 case XC4000_TUNER_RESET: 3075 /* GPIO 12 (xc4000 tuner reset) */ 3076 cx_set(MO_GP1_IO, 0x1010); 3077 mdelay(50); 3078 cx_clear(MO_GP1_IO, 0x10); 3079 mdelay(75); 3080 cx_set(MO_GP1_IO, 0x10); 3081 mdelay(75); 3082 return 0; 3083 } 3084 return -EINVAL; 3085} 3086 3087/* 3088 * some Divco specific stuff 3089 */ 3090static int cx88_pv_8000gt_callback(struct cx88_core *core, 3091 int command, int arg) 3092{ 3093 switch (command) { 3094 case XC2028_TUNER_RESET: 3095 cx_write(MO_GP2_IO, 0xcf7); 3096 mdelay(50); 3097 cx_write(MO_GP2_IO, 0xef5); 3098 mdelay(50); 3099 cx_write(MO_GP2_IO, 0xcf7); 3100 break; 3101 default: 3102 return -EINVAL; 3103 } 3104 3105 return 0; 3106} 3107 3108/* 3109 * some DViCO specific stuff 3110 */ 3111 3112static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core) 3113{ 3114 struct i2c_msg msg = { .addr = 0x45, .flags = 0 }; 3115 int i, err; 3116 static u8 init_bufs[13][5] = { 3117 { 0x10, 0x00, 0x20, 0x01, 0x03 }, 3118 { 0x10, 0x10, 0x01, 0x00, 0x21 }, 3119 { 0x10, 0x10, 0x10, 0x00, 0xCA }, 3120 { 0x10, 0x10, 0x12, 0x00, 0x08 }, 3121 { 0x10, 0x10, 0x13, 0x00, 0x0A }, 3122 { 0x10, 0x10, 0x16, 0x01, 0xC0 }, 3123 { 0x10, 0x10, 0x22, 0x01, 0x3D }, 3124 { 0x10, 0x10, 0x73, 0x01, 0x2E }, 3125 { 0x10, 0x10, 0x72, 0x00, 0xC5 }, 3126 { 0x10, 0x10, 0x71, 0x01, 0x97 }, 3127 { 0x10, 0x10, 0x70, 0x00, 0x0F }, 3128 { 0x10, 0x10, 0xB0, 0x00, 0x01 }, 3129 { 0x03, 0x0C }, 3130 }; 3131 3132 for (i = 0; i < ARRAY_SIZE(init_bufs); i++) { 3133 msg.buf = init_bufs[i]; 3134 msg.len = (i != 12 ? 5 : 2); 3135 err = i2c_transfer(&core->i2c_adap, &msg, 1); 3136 if (err != 1) { 3137 pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n", 3138 i, err); 3139 return; 3140 } 3141 } 3142} 3143 3144static int cx88_xc2028_tuner_callback(struct cx88_core *core, 3145 int command, int arg) 3146{ 3147 /* Board-specific callbacks */ 3148 switch (core->boardnr) { 3149 case CX88_BOARD_POWERCOLOR_REAL_ANGEL: 3150 case CX88_BOARD_GENIATECH_X8000_MT: 3151 case CX88_BOARD_KWORLD_ATSC_120: 3152 return cx88_xc3028_geniatech_tuner_callback(core, 3153 command, arg); 3154 case CX88_BOARD_PROLINK_PV_8000GT: 3155 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 3156 return cx88_pv_8000gt_callback(core, command, arg); 3157 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 3158 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: 3159 return cx88_dvico_xc2028_callback(core, command, arg); 3160 case CX88_BOARD_NOTONLYTV_LV3H: 3161 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 3162 case CX88_BOARD_WINFAST_DTV1800H: 3163 return cx88_xc3028_winfast1800h_callback(core, command, arg); 3164 } 3165 3166 switch (command) { 3167 case XC2028_TUNER_RESET: 3168 switch (INPUT(core->input).type) { 3169 case CX88_RADIO: 3170 dprintk(1, "setting GPIO to radio!\n"); 3171 cx_write(MO_GP0_IO, 0x4ff); 3172 mdelay(250); 3173 cx_write(MO_GP2_IO, 0xff); 3174 mdelay(250); 3175 break; 3176 case CX88_VMUX_DVB: /* Digital TV*/ 3177 default: /* Analog TV */ 3178 dprintk(1, "setting GPIO to TV!\n"); 3179 break; 3180 } 3181 cx_write(MO_GP1_IO, 0x101010); 3182 mdelay(250); 3183 cx_write(MO_GP1_IO, 0x101000); 3184 mdelay(250); 3185 cx_write(MO_GP1_IO, 0x101010); 3186 mdelay(250); 3187 return 0; 3188 } 3189 return -EINVAL; 3190} 3191 3192static int cx88_xc4000_tuner_callback(struct cx88_core *core, 3193 int command, int arg) 3194{ 3195 /* Board-specific callbacks */ 3196 switch (core->boardnr) { 3197 case CX88_BOARD_WINFAST_DTV1800H_XC4000: 3198 case CX88_BOARD_WINFAST_DTV2000H_PLUS: 3199 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36: 3200 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43: 3201 return cx88_xc4000_winfast2000h_plus_callback(core, 3202 command, arg); 3203 } 3204 return -EINVAL; 3205} 3206 3207/* 3208 * Tuner callback function. Currently only needed for the Pinnacle 3209 * PCTV HD 800i with an xc5000 silicon tuner. This is used for both 3210 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c) 3211 */ 3212static int cx88_xc5000_tuner_callback(struct cx88_core *core, 3213 int command, int arg) 3214{ 3215 switch (core->boardnr) { 3216 case CX88_BOARD_PINNACLE_PCTV_HD_800i: 3217 if (command == 0) { /* This is the reset command from xc5000 */ 3218 3219 /* 3220 * djh - According to the engineer at PCTV Systems, 3221 * the xc5000 reset pin is supposed to be on GPIO12. 3222 * However, despite three nights of effort, pulling 3223 * that GPIO low didn't reset the xc5000. While 3224 * pulling MO_SRST_IO low does reset the xc5000, this 3225 * also resets in the s5h1409 being reset as well. 3226 * This causes tuning to always fail since the internal 3227 * state of the s5h1409 does not match the driver's 3228 * state. Given that the only two conditions in which 3229 * the driver performs a reset is during firmware load 3230 * and powering down the chip, I am taking out the 3231 * reset. We know that the chip is being reset 3232 * when the cx88 comes online, and not being able to 3233 * do power management for this board is worse than 3234 * not having any tuning at all. 3235 */ 3236 return 0; 3237 } 3238 3239 dprintk(1, "xc5000: unknown tuner callback command.\n"); 3240 return -EINVAL; 3241 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: 3242 if (command == 0) { /* This is the reset command from xc5000 */ 3243 cx_clear(MO_GP0_IO, 0x00000010); 3244 usleep_range(10000, 20000); 3245 cx_set(MO_GP0_IO, 0x00000010); 3246 return 0; 3247 } 3248 3249 dprintk(1, "xc5000: unknown tuner callback command.\n"); 3250 return -EINVAL; 3251 } 3252 return 0; /* Should never be here */ 3253} 3254 3255int cx88_tuner_callback(void *priv, int component, int command, int arg) 3256{ 3257 struct i2c_algo_bit_data *i2c_algo = priv; 3258 struct cx88_core *core; 3259 3260 if (!i2c_algo) { 3261 pr_err("Error - i2c private data undefined.\n"); 3262 return -EINVAL; 3263 } 3264 3265 core = i2c_algo->data; 3266 3267 if (!core) { 3268 pr_err("Error - device struct undefined.\n"); 3269 return -EINVAL; 3270 } 3271 3272 if (component != DVB_FRONTEND_COMPONENT_TUNER) 3273 return -EINVAL; 3274 3275 switch (core->board.tuner_type) { 3276 case TUNER_XC2028: 3277 dprintk(1, "Calling XC2028/3028 callback\n"); 3278 return cx88_xc2028_tuner_callback(core, command, arg); 3279 case TUNER_XC4000: 3280 dprintk(1, "Calling XC4000 callback\n"); 3281 return cx88_xc4000_tuner_callback(core, command, arg); 3282 case TUNER_XC5000: 3283 dprintk(1, "Calling XC5000 callback\n"); 3284 return cx88_xc5000_tuner_callback(core, command, arg); 3285 } 3286 pr_err("Error: Calling callback for tuner %d\n", 3287 core->board.tuner_type); 3288 return -EINVAL; 3289} 3290EXPORT_SYMBOL(cx88_tuner_callback); 3291 3292/* ----------------------------------------------------------------------- */ 3293 3294static void cx88_card_list(struct cx88_core *core, struct pci_dev *pci) 3295{ 3296 int i; 3297 3298 if (!pci->subsystem_vendor && !pci->subsystem_device) { 3299 pr_err("Your board has no valid PCI Subsystem ID and thus can't\n"); 3300 pr_err("be autodetected. Please pass card=<n> insmod option to\n"); 3301 pr_err("workaround that. Redirect complaints to the vendor of\n"); 3302 pr_err("the TV card\n"); 3303 } else { 3304 pr_err("Your board isn't known (yet) to the driver. You can\n"); 3305 pr_err("try to pick one of the existing card configs via\n"); 3306 pr_err("card=<n> insmod option. Updating to the latest\n"); 3307 pr_err("version might help as well.\n"); 3308 } 3309 pr_err("Here is a list of valid choices for the card=<n> insmod option:\n"); 3310 for (i = 0; i < ARRAY_SIZE(cx88_boards); i++) 3311 pr_err(" card=%d -> %s\n", i, cx88_boards[i].name); 3312} 3313 3314static void cx88_card_setup_pre_i2c(struct cx88_core *core) 3315{ 3316 switch (core->boardnr) { 3317 case CX88_BOARD_HAUPPAUGE_HVR1300: 3318 /* 3319 * Bring the 702 demod up before i2c scanning/attach or 3320 * devices are hidden. 3321 * 3322 * We leave here with the 702 on the bus 3323 * 3324 * "reset the IR receiver on GPIO[3]" 3325 * Reported by Mike Crash <mike AT mikecrash.com> 3326 */ 3327 cx_write(MO_GP0_IO, 0x0000ef88); 3328 udelay(1000); 3329 cx_clear(MO_GP0_IO, 0x00000088); 3330 udelay(50); 3331 cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */ 3332 udelay(1000); 3333 break; 3334 3335 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 3336 case CX88_BOARD_PROLINK_PV_8000GT: 3337 cx_write(MO_GP2_IO, 0xcf7); 3338 msleep(50); 3339 cx_write(MO_GP2_IO, 0xef5); 3340 msleep(50); 3341 cx_write(MO_GP2_IO, 0xcf7); 3342 usleep_range(10000, 20000); 3343 break; 3344 3345 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: 3346 /* Enable the xc5000 tuner */ 3347 cx_set(MO_GP0_IO, 0x00001010); 3348 break; 3349 3350 case CX88_BOARD_WINFAST_DTV2000H_J: 3351 case CX88_BOARD_HAUPPAUGE_HVR3000: 3352 case CX88_BOARD_HAUPPAUGE_HVR4000: 3353 /* Init GPIO */ 3354 cx_write(MO_GP0_IO, core->board.input[0].gpio0); 3355 udelay(1000); 3356 cx_clear(MO_GP0_IO, 0x00000080); 3357 udelay(50); 3358 cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */ 3359 udelay(1000); 3360 break; 3361 3362 case CX88_BOARD_NOTONLYTV_LV3H: 3363 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 3364 case CX88_BOARD_WINFAST_DTV1800H: 3365 cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0); 3366 break; 3367 3368 case CX88_BOARD_WINFAST_DTV1800H_XC4000: 3369 case CX88_BOARD_WINFAST_DTV2000H_PLUS: 3370 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36: 3371 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43: 3372 cx88_xc4000_winfast2000h_plus_callback(core, 3373 XC4000_TUNER_RESET, 0); 3374 break; 3375 3376 case CX88_BOARD_TWINHAN_VP1027_DVBS: 3377 cx_write(MO_GP0_IO, 0x00003230); 3378 cx_write(MO_GP0_IO, 0x00003210); 3379 usleep_range(10000, 20000); 3380 cx_write(MO_GP0_IO, 0x00001230); 3381 break; 3382 } 3383} 3384 3385/* 3386 * Sets board-dependent xc3028 configuration 3387 */ 3388void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) 3389{ 3390 memset(ctl, 0, sizeof(*ctl)); 3391 3392 ctl->fname = XC2028_DEFAULT_FIRMWARE; 3393 ctl->max_len = 64; 3394 3395 switch (core->boardnr) { 3396 case CX88_BOARD_POWERCOLOR_REAL_ANGEL: 3397 /* Now works with firmware version 2.7 */ 3398 if (core->i2c_algo.udelay < 16) 3399 core->i2c_algo.udelay = 16; 3400 break; 3401 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 3402 case CX88_BOARD_WINFAST_DTV1800H: 3403 ctl->demod = XC3028_FE_ZARLINK456; 3404 break; 3405 case CX88_BOARD_KWORLD_ATSC_120: 3406 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: 3407 ctl->demod = XC3028_FE_OREN538; 3408 break; 3409 case CX88_BOARD_GENIATECH_X8000_MT: 3410 /* 3411 * FIXME: For this board, the xc3028 never recovers after being 3412 * powered down (the reset GPIO probably is not set properly). 3413 * We don't have access to the hardware so we cannot determine 3414 * which GPIO is used for xc3028, so just disable power xc3028 3415 * power management for now 3416 */ 3417 ctl->disable_power_mgmt = 1; 3418 break; 3419 case CX88_BOARD_NOTONLYTV_LV3H: 3420 ctl->demod = XC3028_FE_ZARLINK456; 3421 ctl->fname = XC3028L_DEFAULT_FIRMWARE; 3422 ctl->read_not_reliable = 1; 3423 break; 3424 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 3425 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 3426 case CX88_BOARD_PROLINK_PV_8000GT: 3427 /* 3428 * Those boards uses non-MTS firmware 3429 */ 3430 break; 3431 case CX88_BOARD_PINNACLE_HYBRID_PCTV: 3432 case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII: 3433 ctl->demod = XC3028_FE_ZARLINK456; 3434 ctl->mts = 1; 3435 break; 3436 default: 3437 ctl->demod = XC3028_FE_OREN538; 3438 ctl->mts = 1; 3439 } 3440} 3441EXPORT_SYMBOL_GPL(cx88_setup_xc3028); 3442 3443static void cx88_card_setup(struct cx88_core *core) 3444{ 3445 static u8 eeprom[256]; 3446 struct tuner_setup tun_setup; 3447 unsigned int mode_mask = T_RADIO | T_ANALOG_TV; 3448 3449 memset(&tun_setup, 0, sizeof(tun_setup)); 3450 3451 if (!core->i2c_rc) { 3452 core->i2c_client.addr = 0xa0 >> 1; 3453 tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom)); 3454 } 3455 3456 switch (core->boardnr) { 3457 case CX88_BOARD_HAUPPAUGE: 3458 case CX88_BOARD_HAUPPAUGE_ROSLYN: 3459 if (!core->i2c_rc) 3460 hauppauge_eeprom(core, eeprom + 8); 3461 break; 3462 case CX88_BOARD_GDI: 3463 if (!core->i2c_rc) 3464 gdi_eeprom(core, eeprom); 3465 break; 3466 case CX88_BOARD_LEADTEK_PVR2000: 3467 case CX88_BOARD_WINFAST_DV2000: 3468 case CX88_BOARD_WINFAST2000XP_EXPERT: 3469 if (!core->i2c_rc) 3470 leadtek_eeprom(core, eeprom); 3471 break; 3472 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: 3473 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1: 3474 case CX88_BOARD_HAUPPAUGE_DVB_T1: 3475 case CX88_BOARD_HAUPPAUGE_HVR1100: 3476 case CX88_BOARD_HAUPPAUGE_HVR1100LP: 3477 case CX88_BOARD_HAUPPAUGE_HVR3000: 3478 case CX88_BOARD_HAUPPAUGE_HVR1300: 3479 case CX88_BOARD_HAUPPAUGE_HVR4000: 3480 case CX88_BOARD_HAUPPAUGE_HVR4000LITE: 3481 case CX88_BOARD_HAUPPAUGE_IRONLY: 3482 if (!core->i2c_rc) 3483 hauppauge_eeprom(core, eeprom); 3484 break; 3485 case CX88_BOARD_KWORLD_DVBS_100: 3486 cx_write(MO_GP0_IO, 0x000007f8); 3487 cx_write(MO_GP1_IO, 0x00000001); 3488 break; 3489 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 3490 /* GPIO0:0 is hooked to demod reset */ 3491 /* GPIO0:4 is hooked to xc3028 reset */ 3492 cx_write(MO_GP0_IO, 0x00111100); 3493 usleep_range(10000, 20000); 3494 cx_write(MO_GP0_IO, 0x00111111); 3495 break; 3496 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: 3497 /* GPIO0:6 is hooked to FX2 reset pin */ 3498 cx_set(MO_GP0_IO, 0x00004040); 3499 cx_clear(MO_GP0_IO, 0x00000040); 3500 msleep(1000); 3501 cx_set(MO_GP0_IO, 0x00004040); 3502 fallthrough; 3503 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: 3504 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: 3505 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID: 3506 /* GPIO0:0 is hooked to mt352 reset pin */ 3507 cx_set(MO_GP0_IO, 0x00000101); 3508 cx_clear(MO_GP0_IO, 0x00000001); 3509 usleep_range(10000, 20000); 3510 cx_set(MO_GP0_IO, 0x00000101); 3511 if (!core->i2c_rc && 3512 core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID) 3513 dvico_fusionhdtv_hybrid_init(core); 3514 break; 3515 case CX88_BOARD_KWORLD_DVB_T: 3516 case CX88_BOARD_DNTV_LIVE_DVB_T: 3517 cx_set(MO_GP0_IO, 0x00000707); 3518 cx_set(MO_GP2_IO, 0x00000101); 3519 cx_clear(MO_GP2_IO, 0x00000001); 3520 usleep_range(10000, 20000); 3521 cx_clear(MO_GP0_IO, 0x00000007); 3522 cx_set(MO_GP2_IO, 0x00000101); 3523 break; 3524 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: 3525 cx_write(MO_GP0_IO, 0x00080808); 3526 break; 3527 case CX88_BOARD_ATI_HDTVWONDER: 3528 if (!core->i2c_rc) { 3529 /* enable tuner */ 3530 int i; 3531 static const u8 buffer[][2] = { 3532 {0x10, 0x12}, 3533 {0x13, 0x04}, 3534 {0x16, 0x00}, 3535 {0x14, 0x04}, 3536 {0x17, 0x00} 3537 }; 3538 core->i2c_client.addr = 0x0a; 3539 3540 for (i = 0; i < ARRAY_SIZE(buffer); i++) 3541 if (i2c_master_send(&core->i2c_client, 3542 buffer[i], 2) != 2) 3543 pr_warn("Unable to enable tuner(%i).\n", 3544 i); 3545 } 3546 break; 3547 case CX88_BOARD_MSI_TVANYWHERE_MASTER: 3548 { 3549 struct v4l2_priv_tun_config tea5767_cfg; 3550 struct tea5767_ctrl ctl; 3551 3552 memset(&ctl, 0, sizeof(ctl)); 3553 3554 ctl.high_cut = 1; 3555 ctl.st_noise = 1; 3556 ctl.deemph_75 = 1; 3557 ctl.xtal_freq = TEA5767_HIGH_LO_13MHz; 3558 3559 tea5767_cfg.tuner = TUNER_TEA5767; 3560 tea5767_cfg.priv = &ctl; 3561 3562 call_all(core, tuner, s_config, &tea5767_cfg); 3563 break; 3564 } 3565 case CX88_BOARD_TEVII_S420: 3566 case CX88_BOARD_TEVII_S460: 3567 case CX88_BOARD_TEVII_S464: 3568 case CX88_BOARD_OMICOM_SS4_PCI: 3569 case CX88_BOARD_TBS_8910: 3570 case CX88_BOARD_TBS_8920: 3571 case CX88_BOARD_PROF_6200: 3572 case CX88_BOARD_PROF_7300: 3573 case CX88_BOARD_PROF_7301: 3574 case CX88_BOARD_SATTRADE_ST4200: 3575 cx_write(MO_GP0_IO, 0x8000); 3576 msleep(100); 3577 cx_write(MO_SRST_IO, 0); 3578 usleep_range(10000, 20000); 3579 cx_write(MO_GP0_IO, 0x8080); 3580 msleep(100); 3581 cx_write(MO_SRST_IO, 1); 3582 msleep(100); 3583 break; 3584 } /*end switch() */ 3585 3586 /* Setup tuners */ 3587 if (core->board.radio_type != UNSET) { 3588 tun_setup.mode_mask = T_RADIO; 3589 tun_setup.type = core->board.radio_type; 3590 tun_setup.addr = core->board.radio_addr; 3591 tun_setup.tuner_callback = cx88_tuner_callback; 3592 call_all(core, tuner, s_type_addr, &tun_setup); 3593 mode_mask &= ~T_RADIO; 3594 } 3595 3596 if (core->board.tuner_type != UNSET) { 3597 tun_setup.mode_mask = mode_mask; 3598 tun_setup.type = core->board.tuner_type; 3599 tun_setup.addr = core->board.tuner_addr; 3600 tun_setup.tuner_callback = cx88_tuner_callback; 3601 3602 call_all(core, tuner, s_type_addr, &tun_setup); 3603 } 3604 3605 if (core->board.tda9887_conf) { 3606 struct v4l2_priv_tun_config tda9887_cfg; 3607 3608 tda9887_cfg.tuner = TUNER_TDA9887; 3609 tda9887_cfg.priv = &core->board.tda9887_conf; 3610 3611 call_all(core, tuner, s_config, &tda9887_cfg); 3612 } 3613 3614 if (core->board.tuner_type == TUNER_XC2028) { 3615 struct v4l2_priv_tun_config xc2028_cfg; 3616 struct xc2028_ctrl ctl; 3617 3618 /* Fills device-dependent initialization parameters */ 3619 cx88_setup_xc3028(core, &ctl); 3620 3621 /* Sends parameters to xc2028/3028 tuner */ 3622 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg)); 3623 xc2028_cfg.tuner = TUNER_XC2028; 3624 xc2028_cfg.priv = &ctl; 3625 dprintk(1, "Asking xc2028/3028 to load firmware %s\n", 3626 ctl.fname); 3627 call_all(core, tuner, s_config, &xc2028_cfg); 3628 } 3629 call_all(core, tuner, standby); 3630} 3631 3632/* ------------------------------------------------------------------ */ 3633 3634static int cx88_pci_quirks(const char *name, struct pci_dev *pci) 3635{ 3636 unsigned int lat = UNSET; 3637 u8 ctrl = 0; 3638 u8 value; 3639 3640 /* check pci quirks */ 3641 if (pci_pci_problems & PCIPCI_TRITON) { 3642 pr_info("quirk: PCIPCI_TRITON -- set TBFX\n"); 3643 ctrl |= CX88X_EN_TBFX; 3644 } 3645 if (pci_pci_problems & PCIPCI_NATOMA) { 3646 pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n"); 3647 ctrl |= CX88X_EN_TBFX; 3648 } 3649 if (pci_pci_problems & PCIPCI_VIAETBF) { 3650 pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n"); 3651 ctrl |= CX88X_EN_TBFX; 3652 } 3653 if (pci_pci_problems & PCIPCI_VSFX) { 3654 pr_info("quirk: PCIPCI_VSFX -- set VSFX\n"); 3655 ctrl |= CX88X_EN_VSFX; 3656 } 3657#ifdef PCIPCI_ALIMAGIK 3658 if (pci_pci_problems & PCIPCI_ALIMAGIK) { 3659 pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n"); 3660 lat = 0x0A; 3661 } 3662#endif 3663 3664 /* check insmod options */ 3665 if (latency != UNSET) 3666 lat = latency; 3667 3668 /* apply stuff */ 3669 if (ctrl) { 3670 pci_read_config_byte(pci, CX88X_DEVCTRL, &value); 3671 value |= ctrl; 3672 pci_write_config_byte(pci, CX88X_DEVCTRL, value); 3673 } 3674 if (lat != UNSET) { 3675 pr_info("setting pci latency timer to %d\n", latency); 3676 pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency); 3677 } 3678 return 0; 3679} 3680 3681int cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci) 3682{ 3683 if (request_mem_region(pci_resource_start(pci, 0), 3684 pci_resource_len(pci, 0), 3685 core->name)) 3686 return 0; 3687 pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n", 3688 PCI_FUNC(pci->devfn), 3689 (unsigned long long)pci_resource_start(pci, 0), 3690 pci->subsystem_vendor, pci->subsystem_device); 3691 return -EBUSY; 3692} 3693 3694/* 3695 * Allocate and initialize the cx88 core struct. One should hold the 3696 * devlist mutex before calling this. 3697 */ 3698struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr) 3699{ 3700 struct cx88_core *core; 3701 int i; 3702 3703 core = kzalloc(sizeof(*core), GFP_KERNEL); 3704 if (!core) 3705 return NULL; 3706 3707 refcount_set(&core->refcount, 1); 3708 core->pci_bus = pci->bus->number; 3709 core->pci_slot = PCI_SLOT(pci->devfn); 3710 core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT | 3711 PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT | 3712 PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT; 3713 mutex_init(&core->lock); 3714 3715 core->nr = nr; 3716 sprintf(core->name, "cx88[%d]", core->nr); 3717 3718 /* 3719 * Note: Setting initial standard here would cause first call to 3720 * cx88_set_tvnorm() to return without programming any registers. Leave 3721 * it blank for at this point and it will get set later in 3722 * cx8800_initdev() 3723 */ 3724 core->tvnorm = 0; 3725 3726 core->width = 320; 3727 core->height = 240; 3728 core->field = V4L2_FIELD_INTERLACED; 3729 3730 strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name)); 3731 if (v4l2_device_register(NULL, &core->v4l2_dev)) { 3732 kfree(core); 3733 return NULL; 3734 } 3735 3736 if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) { 3737 v4l2_device_unregister(&core->v4l2_dev); 3738 kfree(core); 3739 return NULL; 3740 } 3741 3742 if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) { 3743 v4l2_ctrl_handler_free(&core->video_hdl); 3744 v4l2_device_unregister(&core->v4l2_dev); 3745 kfree(core); 3746 return NULL; 3747 } 3748 3749 if (cx88_get_resources(core, pci) != 0) { 3750 v4l2_ctrl_handler_free(&core->video_hdl); 3751 v4l2_ctrl_handler_free(&core->audio_hdl); 3752 v4l2_device_unregister(&core->v4l2_dev); 3753 kfree(core); 3754 return NULL; 3755 } 3756 3757 /* PCI stuff */ 3758 cx88_pci_quirks(core->name, pci); 3759 core->lmmio = ioremap(pci_resource_start(pci, 0), 3760 pci_resource_len(pci, 0)); 3761 core->bmmio = (u8 __iomem *)core->lmmio; 3762 3763 if (!core->lmmio) { 3764 release_mem_region(pci_resource_start(pci, 0), 3765 pci_resource_len(pci, 0)); 3766 v4l2_ctrl_handler_free(&core->video_hdl); 3767 v4l2_ctrl_handler_free(&core->audio_hdl); 3768 v4l2_device_unregister(&core->v4l2_dev); 3769 kfree(core); 3770 return NULL; 3771 } 3772 3773 /* board config */ 3774 core->boardnr = UNSET; 3775 if (card[core->nr] < ARRAY_SIZE(cx88_boards)) 3776 core->boardnr = card[core->nr]; 3777 for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++) 3778 if (pci->subsystem_vendor == cx88_subids[i].subvendor && 3779 pci->subsystem_device == cx88_subids[i].subdevice) 3780 core->boardnr = cx88_subids[i].card; 3781 if (core->boardnr == UNSET) { 3782 core->boardnr = CX88_BOARD_UNKNOWN; 3783 cx88_card_list(core, pci); 3784 } 3785 3786 core->board = cx88_boards[core->boardnr]; 3787 3788 if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB)) 3789 core->board.num_frontends = 1; 3790 3791 pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n", 3792 pci->subsystem_vendor, pci->subsystem_device, core->board.name, 3793 core->boardnr, card[core->nr] == core->boardnr ? 3794 "insmod option" : "autodetected", 3795 core->board.num_frontends); 3796 3797 if (tuner[core->nr] != UNSET) 3798 core->board.tuner_type = tuner[core->nr]; 3799 if (radio[core->nr] != UNSET) 3800 core->board.radio_type = radio[core->nr]; 3801 3802 dprintk(1, "TV tuner type %d, Radio tuner type %d\n", 3803 core->board.tuner_type, core->board.radio_type); 3804 3805 /* init hardware */ 3806 cx88_reset(core); 3807 cx88_card_setup_pre_i2c(core); 3808 cx88_i2c_init(core, pci); 3809 3810 /* load tuner module, if needed */ 3811 if (core->board.tuner_type != UNSET) { 3812 /* 3813 * Ignore 0x6b and 0x6f on cx88 boards. 3814 * FusionHDTV5 RT Gold has an ir receiver at 0x6b 3815 * and an RTC at 0x6f which can get corrupted if probed. 3816 */ 3817 static const unsigned short tv_addrs[] = { 3818 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */ 3819 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 3820 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 3821 I2C_CLIENT_END 3822 }; 3823 int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT); 3824 3825 /* 3826 * I don't trust the radio_type as is stored in the card 3827 * definitions, so we just probe for it. 3828 * The radio_type is sometimes missing, or set to UNSET but 3829 * later code configures a tea5767. 3830 */ 3831 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap, 3832 "tuner", 0, 3833 v4l2_i2c_tuner_addrs(ADDRS_RADIO)); 3834 if (has_demod) 3835 v4l2_i2c_new_subdev(&core->v4l2_dev, 3836 &core->i2c_adap, "tuner", 3837 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); 3838 if (core->board.tuner_addr == ADDR_UNSET) { 3839 v4l2_i2c_new_subdev(&core->v4l2_dev, 3840 &core->i2c_adap, "tuner", 3841 0, has_demod ? tv_addrs + 4 : tv_addrs); 3842 } else { 3843 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap, 3844 "tuner", core->board.tuner_addr, 3845 NULL); 3846 } 3847 } 3848 3849 cx88_card_setup(core); 3850 if (!disable_ir) { 3851 cx88_i2c_init_ir(core); 3852 cx88_ir_init(core, pci); 3853 } 3854 3855 return core; 3856}