Lines Matching +full:dual +full:- +full:radio

1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * card-specific stuff.
19 static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
20 static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; variable
21 static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
24 module_param_array(radio, int, NULL, 0444);
28 MODULE_PARM_DESC(radio, "radio tuner type");
45 /* ------------------------------------------------------------------ */
96 .radio = {
132 .radio = {
187 .radio = {
215 .radio = {
223 .name = "MSI TV-@nywhere Master",
248 .radio = {
285 .radio = {
317 .radio = {
325 .name = "IODATA GV-VCP3/PCI",
361 .radio = {
367 .name = "ASUS PVR-416",
383 .radio = {
390 .name = "MSI TV-@nywhere",
414 .name = "KWorld/VStream XPert DVB-T",
433 .name = "DViCO FusionHDTV DVB-T1",
472 .radio = {
478 .name = "DViCO FusionHDTV 3 Gold-Q",
485 * 0 - reset asserted
486 * 1 - normal operation
488 * 0 - enable selected source
489 * 1 - mute
491 * 0 - analog audio input connector on tab
492 * 1 - analog DAC output from CX23881 chip
494 * 0 - RF connector labeled CABLE
495 * 1 - RF connector labeled ANT
497 * 0 - normal RF
498 * 1 - high RF
520 .name = "Hauppauge Nova-T DVB-T",
532 .name = "Conexant DVB-T reference design",
557 .name = "DViCO FusionHDTV DVB-T Plus",
574 .name = "digitalnow DNTV Live! DVB-T",
624 .radio = {
657 .radio = {
665 .name = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
687 .radio = {
740 .radio = {
746 .name = "DViCO FusionHDTV 3 Gold-T",
768 .name = "ADS Tech Instant TV DVB-T PCI",
787 .name = "TerraTec Cinergy 1400 DVB-T",
803 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
846 .radio = {
856 .name = "Kworld V-Stream Xpert DVD",
905 .name = "WinFast DTV1000-T",
953 .name = "Hauppauge Nova-S-Plus DVB-S",
963 /* 2: Line-In */
968 /* 2: Line-In */
973 /* 2: Line-In */
979 .name = "Hauppauge Nova-SE2 DVB-S",
991 .name = "KWorld DVB-S 100",
1000 /* 2: Line-In */
1005 /* 2: Line-In */
1010 /* 2: Line-In */
1016 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
1032 /* fixme: Add radio support */
1036 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
1049 /* fixme: Add radio support */
1053 .name = "digitalnow DNTV Live! DVB-T Pro",
1073 .radio = {
1080 /* Kworld V-stream Xpert DVB-T with Thomson tuner */
1081 /* DTT 7579 Conexant CX22702-19 Conexant CX2388x */
1083 .name = "KWorld/VStream XPert DVB-T with cx22702",
1102 .name = "DViCO FusionHDTV DVB-T Dual Digital",
1140 .radio = {
1148 .name = "DViCO FusionHDTV DVB-T Hybrid",
1170 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
1193 * svideo and radio until they can be tested also.
1243 .radio = {
1284 .radio = {
1329 .radio = {
1339 .name = "Geniatech DVB-S",
1354 .name = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
1371 /* 2: Line-In */
1377 /* 2: Line-In */
1380 .radio = {
1410 .name = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
1439 .name = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
1459 /* 2: Line-In */
1465 /* 2: Line-In */
1469 .radio = {
1477 .name = "Samsung SMT 7020 DVB-S",
1583 .radio = {
1594 /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
1624 .radio = {
1660 .radio = {
1696 .radio = {
1712 * there is no way to deactivate audio pass-
1741 .radio = {
1750 .name = "Geniatech X8000-MT DVBT",
1775 .radio = {
1790 /* if gpio1:bit9 is enabled, DVB-T won't work */
1811 .radio = {
1820 .name = "DViCO FusionHDTV DVB-T PRO",
1875 .radio = {
1903 .radio = {
1911 * Both radio, analog and ATSC work with this board.
1913 * otherwise, tuner-xc3028 won't be detected.
1915 * tuner-xc3028 without doing an i2c probe.
1942 .radio = {
1951 .name = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
1961 * Analogue SAT DVB-T
1964 * S-Video 0xc4bf 0xc4bb
1966 * S-Video1 0xc4ff 0xc4fb
1971 * 2 1 O:MPEG PORT 0=DVB-T 1=DVB-S
1976 * 7 1 O:DVB-T DEMOD RESET LOW
1991 * 2: Line-In
1992 * 3: Line-In Expansion
2005 /* 2: Line-In */
2011 /* 2: Line-In */
2014 .radio = {
2024 .name = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
2036 .name = "TeVii S420 DVB-S",
2048 .name = "TeVii S460 DVB-S/S2",
2060 .name = "TeVii S464 DVB-S/S2",
2072 .name = "Omicom SS4 DVB-S/S2 PCI",
2084 .name = "TBS 8910 DVB-S",
2096 .name = "TBS 8920 DVB-S/S2",
2109 .name = "Prof 6200 DVB-S",
2121 .name = "PROF 7300 DVB-S/S2",
2133 .name = "SATTRADE ST4200 DVB-S/S2",
2169 .radio = {
2178 .name = "Hauppauge WinTV-IR Only",
2217 .radio = {
2258 .radio = {
2277 * 14: 0: FM radio
2309 .radio = {
2319 .name = "Prof 7301 DVB-S/S2",
2331 .name = "Twinhan VP-1027 DVB-S",
2344 /* ------------------------------------------------------------------ */
2446 .subdevice = 0x3000, /* HD-3000 card */
2544 /* Re-branded DViCO: DigitalNow DVB-T Dual */
2549 /* Re-branded DViCO: UltraView DVB-T Plus */
2620 .subdevice = 0xc111, /* AverMedia M150-D */
2665 .subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
2869 core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3; in leadtek_eeprom()
2872 core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3; in leadtek_eeprom()
2877 core->board.tuner_type, eeprom_data[0]); in leadtek_eeprom()
2885 core->board.tuner_type = tv.tuner_type; in hauppauge_eeprom()
2886 core->tuner_formats = tv.tuner_formats; in hauppauge_eeprom()
2887 core->board.radio.type = tv.has_radio ? CX88_RADIO : 0; in hauppauge_eeprom()
2888 core->model = tv.model; in hauppauge_eeprom()
2892 case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */ in hauppauge_eeprom()
2893 case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */ in hauppauge_eeprom()
2894 case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */ in hauppauge_eeprom()
2895 case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */ in hauppauge_eeprom()
2896 case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */ in hauppauge_eeprom()
2897 case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */ in hauppauge_eeprom()
2898 case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */ in hauppauge_eeprom()
2899 case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */ in hauppauge_eeprom()
2900 case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */ in hauppauge_eeprom()
2901 case 28552: /* WinTV-PVR 'Roslyn' (No IR) */ in hauppauge_eeprom()
2902 case 34519: /* WinTV-PCI-FM */ in hauppauge_eeprom()
2904 /* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */ in hauppauge_eeprom()
2905 case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */ in hauppauge_eeprom()
2906 case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */ in hauppauge_eeprom()
2908 /* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */ in hauppauge_eeprom()
2909 case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */ in hauppauge_eeprom()
2910 case 90002: /* Nova-T-PCI (9002) */ in hauppauge_eeprom()
2911 case 92001: /* Nova-S-Plus (Video and IR) */ in hauppauge_eeprom()
2912 case 92002: /* Nova-S-Plus (Video and IR) */ in hauppauge_eeprom()
2913 case 90003: /* Nova-T-PCI (9002 No RF out) */ in hauppauge_eeprom()
2914 case 90500: /* Nova-T-PCI (oem) */ in hauppauge_eeprom()
2915 case 90501: /* Nova-T-PCI (oem/IR) */ in hauppauge_eeprom()
2916 case 92000: /* Nova-SE2 (OEM, No Video or IR) */ in hauppauge_eeprom()
2917 case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */ in hauppauge_eeprom()
2918 case 94009: /* WinTV-HVR1100 (Video and IR Retail) */ in hauppauge_eeprom()
2919 case 94501: /* WinTV-HVR1100 (Video and IR OEM) */ in hauppauge_eeprom()
2920 case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */ in hauppauge_eeprom()
2921 case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */ in hauppauge_eeprom()
2922 case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */ in hauppauge_eeprom()
2923 case 96569: /* WinTV-HVR1300 () */ in hauppauge_eeprom()
2924 case 96659: /* WinTV-HVR1300 () */ in hauppauge_eeprom()
2925 case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */ in hauppauge_eeprom()
2986 core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id; in gdi_eeprom()
2987 core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ? in gdi_eeprom()
2999 switch (core->boardnr) { in cx88_dvico_xc2028_callback()
3001 /* GPIO-4 xc3028 tuner */ in cx88_dvico_xc2028_callback()
3016 return -EINVAL; in cx88_dvico_xc2028_callback()
3031 switch (INPUT(core->input).type) { in cx88_xc3028_geniatech_tuner_callback()
3050 return -EINVAL; in cx88_xc3028_geniatech_tuner_callback()
3067 return -EINVAL; in cx88_xc3028_winfast1800h_callback()
3084 return -EINVAL; in cx88_xc4000_winfast2000h_plus_callback()
3102 return -EINVAL; in cx88_pv_8000gt_callback()
3135 err = i2c_transfer(&core->i2c_adap, &msg, 1); in dvico_fusionhdtv_hybrid_init()
3147 /* Board-specific callbacks */ in cx88_xc2028_tuner_callback()
3148 switch (core->boardnr) { in cx88_xc2028_tuner_callback()
3168 switch (INPUT(core->input).type) { in cx88_xc2028_tuner_callback()
3170 dprintk(1, "setting GPIO to radio!\n"); in cx88_xc2028_tuner_callback()
3189 return -EINVAL; in cx88_xc2028_tuner_callback()
3195 /* Board-specific callbacks */ in cx88_xc4000_tuner_callback()
3196 switch (core->boardnr) { in cx88_xc4000_tuner_callback()
3204 return -EINVAL; in cx88_xc4000_tuner_callback()
3210 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c)
3215 switch (core->boardnr) { in cx88_xc5000_tuner_callback()
3220 * djh - According to the engineer at PCTV Systems, in cx88_xc5000_tuner_callback()
3240 return -EINVAL; in cx88_xc5000_tuner_callback()
3250 return -EINVAL; in cx88_xc5000_tuner_callback()
3261 pr_err("Error - i2c private data undefined.\n"); in cx88_tuner_callback()
3262 return -EINVAL; in cx88_tuner_callback()
3265 core = i2c_algo->data; in cx88_tuner_callback()
3268 pr_err("Error - device struct undefined.\n"); in cx88_tuner_callback()
3269 return -EINVAL; in cx88_tuner_callback()
3273 return -EINVAL; in cx88_tuner_callback()
3275 switch (core->board.tuner_type) { in cx88_tuner_callback()
3287 core->board.tuner_type); in cx88_tuner_callback()
3288 return -EINVAL; in cx88_tuner_callback()
3292 /* ----------------------------------------------------------------------- */
3298 if (!pci->subsystem_vendor && !pci->subsystem_device) { in cx88_card_list()
3311 pr_err(" card=%d -> %s\n", i, cx88_boards[i].name); in cx88_card_list()
3316 switch (core->boardnr) { in cx88_card_setup_pre_i2c()
3354 cx_write(MO_GP0_IO, core->board.input[0].gpio0); in cx88_card_setup_pre_i2c()
3386 * Sets board-dependent xc3028 configuration
3392 ctl->fname = XC2028_DEFAULT_FIRMWARE; in cx88_setup_xc3028()
3393 ctl->max_len = 64; in cx88_setup_xc3028()
3395 switch (core->boardnr) { in cx88_setup_xc3028()
3398 if (core->i2c_algo.udelay < 16) in cx88_setup_xc3028()
3399 core->i2c_algo.udelay = 16; in cx88_setup_xc3028()
3403 ctl->demod = XC3028_FE_ZARLINK456; in cx88_setup_xc3028()
3407 ctl->demod = XC3028_FE_OREN538; in cx88_setup_xc3028()
3417 ctl->disable_power_mgmt = 1; in cx88_setup_xc3028()
3420 ctl->demod = XC3028_FE_ZARLINK456; in cx88_setup_xc3028()
3421 ctl->fname = XC3028L_DEFAULT_FIRMWARE; in cx88_setup_xc3028()
3422 ctl->read_not_reliable = 1; in cx88_setup_xc3028()
3428 * Those boards uses non-MTS firmware in cx88_setup_xc3028()
3433 ctl->demod = XC3028_FE_ZARLINK456; in cx88_setup_xc3028()
3434 ctl->mts = 1; in cx88_setup_xc3028()
3437 ctl->demod = XC3028_FE_OREN538; in cx88_setup_xc3028()
3438 ctl->mts = 1; in cx88_setup_xc3028()
3451 if (!core->i2c_rc) { in cx88_card_setup()
3452 core->i2c_client.addr = 0xa0 >> 1; in cx88_card_setup()
3453 tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom)); in cx88_card_setup()
3456 switch (core->boardnr) { in cx88_card_setup()
3459 if (!core->i2c_rc) in cx88_card_setup()
3463 if (!core->i2c_rc) in cx88_card_setup()
3469 if (!core->i2c_rc) in cx88_card_setup()
3482 if (!core->i2c_rc) in cx88_card_setup()
3511 if (!core->i2c_rc && in cx88_card_setup()
3512 core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID) in cx88_card_setup()
3528 if (!core->i2c_rc) { in cx88_card_setup()
3538 core->i2c_client.addr = 0x0a; in cx88_card_setup()
3541 if (i2c_master_send(&core->i2c_client, in cx88_card_setup()
3587 if (core->board.radio_type != UNSET) { in cx88_card_setup()
3589 tun_setup.type = core->board.radio_type; in cx88_card_setup()
3590 tun_setup.addr = core->board.radio_addr; in cx88_card_setup()
3596 if (core->board.tuner_type != UNSET) { in cx88_card_setup()
3598 tun_setup.type = core->board.tuner_type; in cx88_card_setup()
3599 tun_setup.addr = core->board.tuner_addr; in cx88_card_setup()
3605 if (core->board.tda9887_conf) { in cx88_card_setup()
3609 tda9887_cfg.priv = &core->board.tda9887_conf; in cx88_card_setup()
3614 if (core->board.tuner_type == TUNER_XC2028) { in cx88_card_setup()
3618 /* Fills device-dependent initialization parameters */ in cx88_card_setup()
3632 /* ------------------------------------------------------------------ */
3642 pr_info("quirk: PCIPCI_TRITON -- set TBFX\n"); in cx88_pci_quirks()
3646 pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n"); in cx88_pci_quirks()
3650 pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n"); in cx88_pci_quirks()
3654 pr_info("quirk: PCIPCI_VSFX -- set VSFX\n"); in cx88_pci_quirks()
3659 pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n"); in cx88_pci_quirks()
3685 core->name)) in cx88_get_resources()
3688 PCI_FUNC(pci->devfn), in cx88_get_resources()
3690 pci->subsystem_vendor, pci->subsystem_device); in cx88_get_resources()
3691 return -EBUSY; in cx88_get_resources()
3707 refcount_set(&core->refcount, 1); in cx88_core_create()
3708 core->pci_bus = pci->bus->number; in cx88_core_create()
3709 core->pci_slot = PCI_SLOT(pci->devfn); in cx88_core_create()
3710 core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT | in cx88_core_create()
3713 mutex_init(&core->lock); in cx88_core_create()
3715 core->nr = nr; in cx88_core_create()
3716 sprintf(core->name, "cx88[%d]", core->nr); in cx88_core_create()
3724 core->tvnorm = 0; in cx88_core_create()
3726 core->width = 320; in cx88_core_create()
3727 core->height = 240; in cx88_core_create()
3728 core->field = V4L2_FIELD_INTERLACED; in cx88_core_create()
3730 strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name)); in cx88_core_create()
3731 if (v4l2_device_register(NULL, &core->v4l2_dev)) { in cx88_core_create()
3736 if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) { in cx88_core_create()
3737 v4l2_device_unregister(&core->v4l2_dev); in cx88_core_create()
3742 if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) { in cx88_core_create()
3743 v4l2_ctrl_handler_free(&core->video_hdl); in cx88_core_create()
3744 v4l2_device_unregister(&core->v4l2_dev); in cx88_core_create()
3750 v4l2_ctrl_handler_free(&core->video_hdl); in cx88_core_create()
3751 v4l2_ctrl_handler_free(&core->audio_hdl); in cx88_core_create()
3752 v4l2_device_unregister(&core->v4l2_dev); in cx88_core_create()
3758 cx88_pci_quirks(core->name, pci); in cx88_core_create()
3759 core->lmmio = ioremap(pci_resource_start(pci, 0), in cx88_core_create()
3761 core->bmmio = (u8 __iomem *)core->lmmio; in cx88_core_create()
3763 if (!core->lmmio) { in cx88_core_create()
3766 v4l2_ctrl_handler_free(&core->video_hdl); in cx88_core_create()
3767 v4l2_ctrl_handler_free(&core->audio_hdl); in cx88_core_create()
3768 v4l2_device_unregister(&core->v4l2_dev); in cx88_core_create()
3774 core->boardnr = UNSET; in cx88_core_create()
3775 if (card[core->nr] < ARRAY_SIZE(cx88_boards)) in cx88_core_create()
3776 core->boardnr = card[core->nr]; in cx88_core_create()
3777 for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++) in cx88_core_create()
3778 if (pci->subsystem_vendor == cx88_subids[i].subvendor && in cx88_core_create()
3779 pci->subsystem_device == cx88_subids[i].subdevice) in cx88_core_create()
3780 core->boardnr = cx88_subids[i].card; in cx88_core_create()
3781 if (core->boardnr == UNSET) { in cx88_core_create()
3782 core->boardnr = CX88_BOARD_UNKNOWN; in cx88_core_create()
3786 core->board = cx88_boards[core->boardnr]; in cx88_core_create()
3788 if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB)) in cx88_core_create()
3789 core->board.num_frontends = 1; in cx88_core_create()
3792 pci->subsystem_vendor, pci->subsystem_device, core->board.name, in cx88_core_create()
3793 core->boardnr, card[core->nr] == core->boardnr ? in cx88_core_create()
3795 core->board.num_frontends); in cx88_core_create()
3797 if (tuner[core->nr] != UNSET) in cx88_core_create()
3798 core->board.tuner_type = tuner[core->nr]; in cx88_core_create()
3799 if (radio[core->nr] != UNSET) in cx88_core_create()
3800 core->board.radio_type = radio[core->nr]; in cx88_core_create()
3802 dprintk(1, "TV tuner type %d, Radio tuner type %d\n", in cx88_core_create()
3803 core->board.tuner_type, core->board.radio_type); in cx88_core_create()
3811 if (core->board.tuner_type != UNSET) { in cx88_core_create()
3823 int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT); in cx88_core_create()
3831 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap, in cx88_core_create()
3835 v4l2_i2c_new_subdev(&core->v4l2_dev, in cx88_core_create()
3836 &core->i2c_adap, "tuner", in cx88_core_create()
3838 if (core->board.tuner_addr == ADDR_UNSET) { in cx88_core_create()
3839 v4l2_i2c_new_subdev(&core->v4l2_dev, in cx88_core_create()
3840 &core->i2c_adap, "tuner", in cx88_core_create()
3843 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap, in cx88_core_create()
3844 "tuner", core->board.tuner_addr, in cx88_core_create()