3857 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * device driver for Conexant 2388x based TV cards4 * 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 specified49 */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 decoder83 }, {84 .type = CX88_VMUX_DEBUG,85 .vmux = 0,86 .gpio0 = 0xff01, // mono from tuner chip87 }, {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 decoder125 }, {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 Michal222 // values for PAL from DScaler223 .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 DScaler295 .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 chip463 }, {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 receiver485 * 0 - reset asserted486 * 1 - normal operation487 * GPIO[1] mutes analog audio output connector488 * 0 - enable selected source489 * 1 - mute490 * GPIO[2] selects source for analog audio output connector491 * 0 - analog audio input connector on tab492 * 1 - analog DAC output from CX23881 chip493 * GPIO[3] selects RF input connector on tuner module494 * 0 - RF connector labeled CABLE495 * 1 - RF connector labeled ANT496 * GPIO[4] selects high RF for QAM256 mode497 * 0 - normal RF498 * 1 - high RF499 */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 connector600 * 0 = analog audio input connector601 * 1 = CX88 audio DACs602 *603 * GPIO[7] = input to CX88's audio/chroma ADC604 * 0 = FM 10.7 MHz IF605 * 1 = Sound 4.5 MHz IF606 *607 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively608 *609 * GPIO[16] = Remote control input610 */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 Covel633 .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 the724 * 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 = 0x0000BDE61205 } },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, if1714 * the TV mux entry is first, you get audio1715 * 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 add1915 * 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-T1962 * Antenna 0xc4bf 0xc4bb1963 * Composite 0xc4bf 0xc4bb1964 * S-Video 0xc4bf 0xc4bb1965 * Composite1 0xc4ff 0xc4fb1966 * S-Video1 0xc4ff 0xc4fb1967 *1968 * BIT VALUE FUNCTION GP{x}_IO1969 * 0 1 I:?1970 * 1 1 I:?1971 * 2 1 O:MPEG PORT 0=DVB-T 1=DVB-S1972 * 3 1 I:?1973 * 4 1 I:?1974 * 5 1 I:?1975 * 6 0 O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION1976 * 7 1 O:DVB-T DEMOD RESET LOW1977 *1978 * BIT VALUE FUNCTION GP{x}_OE1979 * 8 0 I1980 * 9 0 I1981 * a 1 O1982 * b 0 I1983 * c 0 I1984 * d 0 I1985 * e 1 O1986 * f 1 O1987 *1988 * WM8775 ADC1989 *1990 * 1: TV Audio / FM Mono1991 * 2: Line-In1992 * 3: Line-In Expansion1993 * 4: FM Stereo1994 */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 setting2192 *2193 * 2: mute (0=off,1=on)2194 * 12: tuner reset pin2195 * 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 setting2233 *2234 * 2: mute (0=off,1=on)2235 * 12: tuner reset pin2236 * 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 * GPIO2274 * 2: 1: mute audio2275 * 12: 0: reset XC40002276 * 13: 1: audio input is line in (0: tuner)2277 * 14: 0: FM radio2278 * 16: 0: RF input is cable2279 */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 stuff2852 */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 stuff2941 */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 stuff2993 */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 stuff3024 */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 stuff3089 */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 stuff3110 */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 Pinnacle3209 * PCTV HD 800i with an xc5000 silicon tuner. This is used for both3210 * 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, pulling3223 * that GPIO low didn't reset the xc5000. While3224 * pulling MO_SRST_IO low does reset the xc5000, this3225 * also resets in the s5h1409 being reset as well.3226 * This causes tuning to always fail since the internal3227 * state of the s5h1409 does not match the driver's3228 * state. Given that the only two conditions in which3229 * the driver performs a reset is during firmware load3230 * and powering down the chip, I am taking out the3231 * reset. We know that the chip is being reset3232 * when the cx88 comes online, and not being able to3233 * do power management for this board is worse than3234 * 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 or3320 * devices are hidden.3321 *3322 * We leave here with the 702 on the bus3323 *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 configuration3387 */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 being3412 * powered down (the reset GPIO probably is not set properly).3413 * We don't have access to the hardware so we cannot determine3414 * which GPIO is used for xc3028, so just disable power xc30283415 * power management for now3416 */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 firmware3429 */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_ALIMAGIK3658 if (pci_pci_problems & PCIPCI_ALIMAGIK) {3659 pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n");3660 lat = 0x0A;3661 }3662#endif3663 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 the3696 * 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 to3720 * cx88_set_tvnorm() to return without programming any registers. Leave3721 * it blank for at this point and it will get set later in3722 * 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 0x6b3815 * 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_END3822 };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 card3827 * definitions, so we just probe for it.3828 * The radio_type is sometimes missing, or set to UNSET but3829 * 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}3857