162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * device driver for Conexant 2388x based TV cards 462306a36Sopenharmony_ci * card-specific stuff. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "cx88.h" 1062306a36Sopenharmony_ci#include "tea5767.h" 1162306a36Sopenharmony_ci#include "xc4000.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/init.h> 1462306a36Sopenharmony_ci#include <linux/module.h> 1562306a36Sopenharmony_ci#include <linux/pci.h> 1662306a36Sopenharmony_ci#include <linux/delay.h> 1762306a36Sopenharmony_ci#include <linux/slab.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistatic unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; 2062306a36Sopenharmony_cistatic unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; 2162306a36Sopenharmony_cistatic unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET }; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cimodule_param_array(tuner, int, NULL, 0444); 2462306a36Sopenharmony_cimodule_param_array(radio, int, NULL, 0444); 2562306a36Sopenharmony_cimodule_param_array(card, int, NULL, 0444); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciMODULE_PARM_DESC(tuner, "tuner type"); 2862306a36Sopenharmony_ciMODULE_PARM_DESC(radio, "radio tuner type"); 2962306a36Sopenharmony_ciMODULE_PARM_DESC(card, "card type"); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic unsigned int latency = UNSET; 3262306a36Sopenharmony_cimodule_param(latency, int, 0444); 3362306a36Sopenharmony_ciMODULE_PARM_DESC(latency, "pci latency timer"); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic int disable_ir; 3662306a36Sopenharmony_cimodule_param(disable_ir, int, 0444); 3762306a36Sopenharmony_ciMODULE_PARM_DESC(disable_ir, "Disable IR support"); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci#define dprintk(level, fmt, arg...) do { \ 4062306a36Sopenharmony_ci if (cx88_core_debug >= level) \ 4162306a36Sopenharmony_ci printk(KERN_DEBUG pr_fmt("%s: core:" fmt), \ 4262306a36Sopenharmony_ci __func__, ##arg); \ 4362306a36Sopenharmony_ci} while (0) 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci/* ------------------------------------------------------------------ */ 4662306a36Sopenharmony_ci/* board config info */ 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci/* If radio_type !=UNSET, radio_addr should be specified 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic const struct cx88_board cx88_boards[] = { 5262306a36Sopenharmony_ci [CX88_BOARD_UNKNOWN] = { 5362306a36Sopenharmony_ci .name = "UNKNOWN/GENERIC", 5462306a36Sopenharmony_ci .tuner_type = UNSET, 5562306a36Sopenharmony_ci .radio_type = UNSET, 5662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 5762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 5862306a36Sopenharmony_ci .input = { { 5962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 6062306a36Sopenharmony_ci .vmux = 0, 6162306a36Sopenharmony_ci }, { 6262306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE2, 6362306a36Sopenharmony_ci .vmux = 1, 6462306a36Sopenharmony_ci }, { 6562306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE3, 6662306a36Sopenharmony_ci .vmux = 2, 6762306a36Sopenharmony_ci }, { 6862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE4, 6962306a36Sopenharmony_ci .vmux = 3, 7062306a36Sopenharmony_ci } }, 7162306a36Sopenharmony_ci }, 7262306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE] = { 7362306a36Sopenharmony_ci .name = "Hauppauge WinTV 34xxx models", 7462306a36Sopenharmony_ci .tuner_type = UNSET, 7562306a36Sopenharmony_ci .radio_type = UNSET, 7662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 7762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 7862306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 7962306a36Sopenharmony_ci .input = { { 8062306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 8162306a36Sopenharmony_ci .vmux = 0, 8262306a36Sopenharmony_ci .gpio0 = 0xff00, // internal decoder 8362306a36Sopenharmony_ci }, { 8462306a36Sopenharmony_ci .type = CX88_VMUX_DEBUG, 8562306a36Sopenharmony_ci .vmux = 0, 8662306a36Sopenharmony_ci .gpio0 = 0xff01, // mono from tuner chip 8762306a36Sopenharmony_ci }, { 8862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 8962306a36Sopenharmony_ci .vmux = 1, 9062306a36Sopenharmony_ci .gpio0 = 0xff02, 9162306a36Sopenharmony_ci }, { 9262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 9362306a36Sopenharmony_ci .vmux = 2, 9462306a36Sopenharmony_ci .gpio0 = 0xff02, 9562306a36Sopenharmony_ci } }, 9662306a36Sopenharmony_ci .radio = { 9762306a36Sopenharmony_ci .type = CX88_RADIO, 9862306a36Sopenharmony_ci .gpio0 = 0xff01, 9962306a36Sopenharmony_ci }, 10062306a36Sopenharmony_ci }, 10162306a36Sopenharmony_ci [CX88_BOARD_GDI] = { 10262306a36Sopenharmony_ci .name = "GDI Black Gold", 10362306a36Sopenharmony_ci .tuner_type = UNSET, 10462306a36Sopenharmony_ci .radio_type = UNSET, 10562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 10662306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 10762306a36Sopenharmony_ci .input = { { 10862306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 10962306a36Sopenharmony_ci .vmux = 0, 11062306a36Sopenharmony_ci }, { 11162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 11262306a36Sopenharmony_ci .vmux = 2, 11362306a36Sopenharmony_ci } }, 11462306a36Sopenharmony_ci }, 11562306a36Sopenharmony_ci [CX88_BOARD_PIXELVIEW] = { 11662306a36Sopenharmony_ci .name = "PixelView", 11762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 11862306a36Sopenharmony_ci .radio_type = UNSET, 11962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 12062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 12162306a36Sopenharmony_ci .input = { { 12262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 12362306a36Sopenharmony_ci .vmux = 0, 12462306a36Sopenharmony_ci .gpio0 = 0xff00, // internal decoder 12562306a36Sopenharmony_ci }, { 12662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 12762306a36Sopenharmony_ci .vmux = 1, 12862306a36Sopenharmony_ci }, { 12962306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 13062306a36Sopenharmony_ci .vmux = 2, 13162306a36Sopenharmony_ci } }, 13262306a36Sopenharmony_ci .radio = { 13362306a36Sopenharmony_ci .type = CX88_RADIO, 13462306a36Sopenharmony_ci .gpio0 = 0xff10, 13562306a36Sopenharmony_ci }, 13662306a36Sopenharmony_ci }, 13762306a36Sopenharmony_ci [CX88_BOARD_ATI_WONDER_PRO] = { 13862306a36Sopenharmony_ci .name = "ATI TV Wonder Pro", 13962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_4IN1, 14062306a36Sopenharmony_ci .radio_type = UNSET, 14162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 14262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 14362306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER, 14462306a36Sopenharmony_ci .input = { { 14562306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 14662306a36Sopenharmony_ci .vmux = 0, 14762306a36Sopenharmony_ci .gpio0 = 0x03ff, 14862306a36Sopenharmony_ci }, { 14962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 15062306a36Sopenharmony_ci .vmux = 1, 15162306a36Sopenharmony_ci .gpio0 = 0x03fe, 15262306a36Sopenharmony_ci }, { 15362306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 15462306a36Sopenharmony_ci .vmux = 2, 15562306a36Sopenharmony_ci .gpio0 = 0x03fe, 15662306a36Sopenharmony_ci } }, 15762306a36Sopenharmony_ci }, 15862306a36Sopenharmony_ci [CX88_BOARD_WINFAST2000XP_EXPERT] = { 15962306a36Sopenharmony_ci .name = "Leadtek Winfast 2000XP Expert", 16062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_4IN1, 16162306a36Sopenharmony_ci .radio_type = UNSET, 16262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 16362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 16462306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 16562306a36Sopenharmony_ci .input = { { 16662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 16762306a36Sopenharmony_ci .vmux = 0, 16862306a36Sopenharmony_ci .gpio0 = 0x00F5e700, 16962306a36Sopenharmony_ci .gpio1 = 0x00003004, 17062306a36Sopenharmony_ci .gpio2 = 0x00F5e700, 17162306a36Sopenharmony_ci .gpio3 = 0x02000000, 17262306a36Sopenharmony_ci }, { 17362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 17462306a36Sopenharmony_ci .vmux = 1, 17562306a36Sopenharmony_ci .gpio0 = 0x00F5c700, 17662306a36Sopenharmony_ci .gpio1 = 0x00003004, 17762306a36Sopenharmony_ci .gpio2 = 0x00F5c700, 17862306a36Sopenharmony_ci .gpio3 = 0x02000000, 17962306a36Sopenharmony_ci }, { 18062306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 18162306a36Sopenharmony_ci .vmux = 2, 18262306a36Sopenharmony_ci .gpio0 = 0x00F5c700, 18362306a36Sopenharmony_ci .gpio1 = 0x00003004, 18462306a36Sopenharmony_ci .gpio2 = 0x00F5c700, 18562306a36Sopenharmony_ci .gpio3 = 0x02000000, 18662306a36Sopenharmony_ci } }, 18762306a36Sopenharmony_ci .radio = { 18862306a36Sopenharmony_ci .type = CX88_RADIO, 18962306a36Sopenharmony_ci .gpio0 = 0x00F5d700, 19062306a36Sopenharmony_ci .gpio1 = 0x00003004, 19162306a36Sopenharmony_ci .gpio2 = 0x00F5d700, 19262306a36Sopenharmony_ci .gpio3 = 0x02000000, 19362306a36Sopenharmony_ci }, 19462306a36Sopenharmony_ci }, 19562306a36Sopenharmony_ci [CX88_BOARD_AVERTV_STUDIO_303] = { 19662306a36Sopenharmony_ci .name = "AverTV Studio 303 (M126)", 19762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 19862306a36Sopenharmony_ci .radio_type = UNSET, 19962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 20062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 20162306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 20262306a36Sopenharmony_ci .input = { { 20362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 20462306a36Sopenharmony_ci .vmux = 0, 20562306a36Sopenharmony_ci .gpio1 = 0xe09f, 20662306a36Sopenharmony_ci }, { 20762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 20862306a36Sopenharmony_ci .vmux = 1, 20962306a36Sopenharmony_ci .gpio1 = 0xe05f, 21062306a36Sopenharmony_ci }, { 21162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 21262306a36Sopenharmony_ci .vmux = 2, 21362306a36Sopenharmony_ci .gpio1 = 0xe05f, 21462306a36Sopenharmony_ci } }, 21562306a36Sopenharmony_ci .radio = { 21662306a36Sopenharmony_ci .gpio1 = 0xe0df, 21762306a36Sopenharmony_ci .type = CX88_RADIO, 21862306a36Sopenharmony_ci }, 21962306a36Sopenharmony_ci }, 22062306a36Sopenharmony_ci [CX88_BOARD_MSI_TVANYWHERE_MASTER] = { 22162306a36Sopenharmony_ci // added gpio values thanks to Michal 22262306a36Sopenharmony_ci // values for PAL from DScaler 22362306a36Sopenharmony_ci .name = "MSI TV-@nywhere Master", 22462306a36Sopenharmony_ci .tuner_type = TUNER_MT2032, 22562306a36Sopenharmony_ci .radio_type = UNSET, 22662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 22762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 22862306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC, 22962306a36Sopenharmony_ci .input = { { 23062306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 23162306a36Sopenharmony_ci .vmux = 0, 23262306a36Sopenharmony_ci .gpio0 = 0x000040bf, 23362306a36Sopenharmony_ci .gpio1 = 0x000080c0, 23462306a36Sopenharmony_ci .gpio2 = 0x0000ff40, 23562306a36Sopenharmony_ci }, { 23662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 23762306a36Sopenharmony_ci .vmux = 1, 23862306a36Sopenharmony_ci .gpio0 = 0x000040bf, 23962306a36Sopenharmony_ci .gpio1 = 0x000080c0, 24062306a36Sopenharmony_ci .gpio2 = 0x0000ff40, 24162306a36Sopenharmony_ci }, { 24262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 24362306a36Sopenharmony_ci .vmux = 2, 24462306a36Sopenharmony_ci .gpio0 = 0x000040bf, 24562306a36Sopenharmony_ci .gpio1 = 0x000080c0, 24662306a36Sopenharmony_ci .gpio2 = 0x0000ff40, 24762306a36Sopenharmony_ci } }, 24862306a36Sopenharmony_ci .radio = { 24962306a36Sopenharmony_ci .type = CX88_RADIO, 25062306a36Sopenharmony_ci .vmux = 3, 25162306a36Sopenharmony_ci .gpio0 = 0x000040bf, 25262306a36Sopenharmony_ci .gpio1 = 0x000080c0, 25362306a36Sopenharmony_ci .gpio2 = 0x0000ff20, 25462306a36Sopenharmony_ci }, 25562306a36Sopenharmony_ci }, 25662306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DV2000] = { 25762306a36Sopenharmony_ci .name = "Leadtek Winfast DV2000", 25862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 25962306a36Sopenharmony_ci .radio_type = UNSET, 26062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 26162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 26262306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 26362306a36Sopenharmony_ci .input = { { 26462306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 26562306a36Sopenharmony_ci .vmux = 0, 26662306a36Sopenharmony_ci .gpio0 = 0x0035e700, 26762306a36Sopenharmony_ci .gpio1 = 0x00003004, 26862306a36Sopenharmony_ci .gpio2 = 0x0035e700, 26962306a36Sopenharmony_ci .gpio3 = 0x02000000, 27062306a36Sopenharmony_ci }, { 27162306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 27262306a36Sopenharmony_ci .vmux = 1, 27362306a36Sopenharmony_ci .gpio0 = 0x0035c700, 27462306a36Sopenharmony_ci .gpio1 = 0x00003004, 27562306a36Sopenharmony_ci .gpio2 = 0x0035c700, 27662306a36Sopenharmony_ci .gpio3 = 0x02000000, 27762306a36Sopenharmony_ci }, { 27862306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 27962306a36Sopenharmony_ci .vmux = 2, 28062306a36Sopenharmony_ci .gpio0 = 0x0035c700, 28162306a36Sopenharmony_ci .gpio1 = 0x0035c700, 28262306a36Sopenharmony_ci .gpio2 = 0x02000000, 28362306a36Sopenharmony_ci .gpio3 = 0x02000000, 28462306a36Sopenharmony_ci } }, 28562306a36Sopenharmony_ci .radio = { 28662306a36Sopenharmony_ci .type = CX88_RADIO, 28762306a36Sopenharmony_ci .gpio0 = 0x0035d700, 28862306a36Sopenharmony_ci .gpio1 = 0x00007004, 28962306a36Sopenharmony_ci .gpio2 = 0x0035d700, 29062306a36Sopenharmony_ci .gpio3 = 0x02000000, 29162306a36Sopenharmony_ci }, 29262306a36Sopenharmony_ci }, 29362306a36Sopenharmony_ci [CX88_BOARD_LEADTEK_PVR2000] = { 29462306a36Sopenharmony_ci // gpio values for PAL version from regspy by DScaler 29562306a36Sopenharmony_ci .name = "Leadtek PVR 2000", 29662306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 29762306a36Sopenharmony_ci .radio_type = UNSET, 29862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 29962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 30062306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 30162306a36Sopenharmony_ci .input = { { 30262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 30362306a36Sopenharmony_ci .vmux = 0, 30462306a36Sopenharmony_ci .gpio0 = 0x0000bde2, 30562306a36Sopenharmony_ci .audioroute = 1, 30662306a36Sopenharmony_ci }, { 30762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 30862306a36Sopenharmony_ci .vmux = 1, 30962306a36Sopenharmony_ci .gpio0 = 0x0000bde6, 31062306a36Sopenharmony_ci .audioroute = 1, 31162306a36Sopenharmony_ci }, { 31262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 31362306a36Sopenharmony_ci .vmux = 2, 31462306a36Sopenharmony_ci .gpio0 = 0x0000bde6, 31562306a36Sopenharmony_ci .audioroute = 1, 31662306a36Sopenharmony_ci } }, 31762306a36Sopenharmony_ci .radio = { 31862306a36Sopenharmony_ci .type = CX88_RADIO, 31962306a36Sopenharmony_ci .gpio0 = 0x0000bd62, 32062306a36Sopenharmony_ci .audioroute = 1, 32162306a36Sopenharmony_ci }, 32262306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 32362306a36Sopenharmony_ci }, 32462306a36Sopenharmony_ci [CX88_BOARD_IODATA_GVVCP3PCI] = { 32562306a36Sopenharmony_ci .name = "IODATA GV-VCP3/PCI", 32662306a36Sopenharmony_ci .tuner_type = UNSET, 32762306a36Sopenharmony_ci .radio_type = UNSET, 32862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 32962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 33062306a36Sopenharmony_ci .input = { { 33162306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 33262306a36Sopenharmony_ci .vmux = 0, 33362306a36Sopenharmony_ci }, { 33462306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE2, 33562306a36Sopenharmony_ci .vmux = 1, 33662306a36Sopenharmony_ci }, { 33762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 33862306a36Sopenharmony_ci .vmux = 2, 33962306a36Sopenharmony_ci } }, 34062306a36Sopenharmony_ci }, 34162306a36Sopenharmony_ci [CX88_BOARD_PROLINK_PLAYTVPVR] = { 34262306a36Sopenharmony_ci .name = "Prolink PlayTV PVR", 34362306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1236_MK3, 34462306a36Sopenharmony_ci .radio_type = UNSET, 34562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 34662306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 34762306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 34862306a36Sopenharmony_ci .input = { { 34962306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 35062306a36Sopenharmony_ci .vmux = 0, 35162306a36Sopenharmony_ci .gpio0 = 0xbff0, 35262306a36Sopenharmony_ci }, { 35362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 35462306a36Sopenharmony_ci .vmux = 1, 35562306a36Sopenharmony_ci .gpio0 = 0xbff3, 35662306a36Sopenharmony_ci }, { 35762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 35862306a36Sopenharmony_ci .vmux = 2, 35962306a36Sopenharmony_ci .gpio0 = 0xbff3, 36062306a36Sopenharmony_ci } }, 36162306a36Sopenharmony_ci .radio = { 36262306a36Sopenharmony_ci .type = CX88_RADIO, 36362306a36Sopenharmony_ci .gpio0 = 0xbff0, 36462306a36Sopenharmony_ci }, 36562306a36Sopenharmony_ci }, 36662306a36Sopenharmony_ci [CX88_BOARD_ASUS_PVR_416] = { 36762306a36Sopenharmony_ci .name = "ASUS PVR-416", 36862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1236_MK3, 36962306a36Sopenharmony_ci .radio_type = UNSET, 37062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 37162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 37262306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 37362306a36Sopenharmony_ci .input = { { 37462306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 37562306a36Sopenharmony_ci .vmux = 0, 37662306a36Sopenharmony_ci .gpio0 = 0x0000fde6, 37762306a36Sopenharmony_ci }, { 37862306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 37962306a36Sopenharmony_ci .vmux = 2, 38062306a36Sopenharmony_ci .gpio0 = 0x0000fde6, // 0x0000fda6 L,R RCA audio in? 38162306a36Sopenharmony_ci .audioroute = 1, 38262306a36Sopenharmony_ci } }, 38362306a36Sopenharmony_ci .radio = { 38462306a36Sopenharmony_ci .type = CX88_RADIO, 38562306a36Sopenharmony_ci .gpio0 = 0x0000fde2, 38662306a36Sopenharmony_ci }, 38762306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 38862306a36Sopenharmony_ci }, 38962306a36Sopenharmony_ci [CX88_BOARD_MSI_TVANYWHERE] = { 39062306a36Sopenharmony_ci .name = "MSI TV-@nywhere", 39162306a36Sopenharmony_ci .tuner_type = TUNER_MT2032, 39262306a36Sopenharmony_ci .radio_type = UNSET, 39362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 39462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 39562306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 39662306a36Sopenharmony_ci .input = { { 39762306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 39862306a36Sopenharmony_ci .vmux = 0, 39962306a36Sopenharmony_ci .gpio0 = 0x00000fbf, 40062306a36Sopenharmony_ci .gpio2 = 0x0000fc08, 40162306a36Sopenharmony_ci }, { 40262306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 40362306a36Sopenharmony_ci .vmux = 1, 40462306a36Sopenharmony_ci .gpio0 = 0x00000fbf, 40562306a36Sopenharmony_ci .gpio2 = 0x0000fc68, 40662306a36Sopenharmony_ci }, { 40762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 40862306a36Sopenharmony_ci .vmux = 2, 40962306a36Sopenharmony_ci .gpio0 = 0x00000fbf, 41062306a36Sopenharmony_ci .gpio2 = 0x0000fc68, 41162306a36Sopenharmony_ci } }, 41262306a36Sopenharmony_ci }, 41362306a36Sopenharmony_ci [CX88_BOARD_KWORLD_DVB_T] = { 41462306a36Sopenharmony_ci .name = "KWorld/VStream XPert DVB-T", 41562306a36Sopenharmony_ci .tuner_type = UNSET, 41662306a36Sopenharmony_ci .radio_type = UNSET, 41762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 41862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 41962306a36Sopenharmony_ci .input = { { 42062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 42162306a36Sopenharmony_ci .vmux = 1, 42262306a36Sopenharmony_ci .gpio0 = 0x0700, 42362306a36Sopenharmony_ci .gpio2 = 0x0101, 42462306a36Sopenharmony_ci }, { 42562306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 42662306a36Sopenharmony_ci .vmux = 2, 42762306a36Sopenharmony_ci .gpio0 = 0x0700, 42862306a36Sopenharmony_ci .gpio2 = 0x0101, 42962306a36Sopenharmony_ci } }, 43062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 43162306a36Sopenharmony_ci }, 43262306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = { 43362306a36Sopenharmony_ci .name = "DViCO FusionHDTV DVB-T1", 43462306a36Sopenharmony_ci .tuner_type = UNSET, /* No analog tuner */ 43562306a36Sopenharmony_ci .radio_type = UNSET, 43662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 43762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 43862306a36Sopenharmony_ci .input = { { 43962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 44062306a36Sopenharmony_ci .vmux = 1, 44162306a36Sopenharmony_ci .gpio0 = 0x000027df, 44262306a36Sopenharmony_ci }, { 44362306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 44462306a36Sopenharmony_ci .vmux = 2, 44562306a36Sopenharmony_ci .gpio0 = 0x000027df, 44662306a36Sopenharmony_ci } }, 44762306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 44862306a36Sopenharmony_ci }, 44962306a36Sopenharmony_ci [CX88_BOARD_KWORLD_LTV883] = { 45062306a36Sopenharmony_ci .name = "KWorld LTV883RF", 45162306a36Sopenharmony_ci .tuner_type = TUNER_TNF_8831BGFF, 45262306a36Sopenharmony_ci .radio_type = UNSET, 45362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 45462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 45562306a36Sopenharmony_ci .input = { { 45662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 45762306a36Sopenharmony_ci .vmux = 0, 45862306a36Sopenharmony_ci .gpio0 = 0x07f8, 45962306a36Sopenharmony_ci }, { 46062306a36Sopenharmony_ci .type = CX88_VMUX_DEBUG, 46162306a36Sopenharmony_ci .vmux = 0, 46262306a36Sopenharmony_ci .gpio0 = 0x07f9, // mono from tuner chip 46362306a36Sopenharmony_ci }, { 46462306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 46562306a36Sopenharmony_ci .vmux = 1, 46662306a36Sopenharmony_ci .gpio0 = 0x000007fa, 46762306a36Sopenharmony_ci }, { 46862306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 46962306a36Sopenharmony_ci .vmux = 2, 47062306a36Sopenharmony_ci .gpio0 = 0x000007fa, 47162306a36Sopenharmony_ci } }, 47262306a36Sopenharmony_ci .radio = { 47362306a36Sopenharmony_ci .type = CX88_RADIO, 47462306a36Sopenharmony_ci .gpio0 = 0x000007f8, 47562306a36Sopenharmony_ci }, 47662306a36Sopenharmony_ci }, 47762306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = { 47862306a36Sopenharmony_ci .name = "DViCO FusionHDTV 3 Gold-Q", 47962306a36Sopenharmony_ci .tuner_type = TUNER_MICROTUNE_4042FI5, 48062306a36Sopenharmony_ci .radio_type = UNSET, 48162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 48262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 48362306a36Sopenharmony_ci /* 48462306a36Sopenharmony_ci * GPIO[0] resets DT3302 DTV receiver 48562306a36Sopenharmony_ci * 0 - reset asserted 48662306a36Sopenharmony_ci * 1 - normal operation 48762306a36Sopenharmony_ci * GPIO[1] mutes analog audio output connector 48862306a36Sopenharmony_ci * 0 - enable selected source 48962306a36Sopenharmony_ci * 1 - mute 49062306a36Sopenharmony_ci * GPIO[2] selects source for analog audio output connector 49162306a36Sopenharmony_ci * 0 - analog audio input connector on tab 49262306a36Sopenharmony_ci * 1 - analog DAC output from CX23881 chip 49362306a36Sopenharmony_ci * GPIO[3] selects RF input connector on tuner module 49462306a36Sopenharmony_ci * 0 - RF connector labeled CABLE 49562306a36Sopenharmony_ci * 1 - RF connector labeled ANT 49662306a36Sopenharmony_ci * GPIO[4] selects high RF for QAM256 mode 49762306a36Sopenharmony_ci * 0 - normal RF 49862306a36Sopenharmony_ci * 1 - high RF 49962306a36Sopenharmony_ci */ 50062306a36Sopenharmony_ci .input = { { 50162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 50262306a36Sopenharmony_ci .vmux = 0, 50362306a36Sopenharmony_ci .gpio0 = 0x0f0d, 50462306a36Sopenharmony_ci }, { 50562306a36Sopenharmony_ci .type = CX88_VMUX_CABLE, 50662306a36Sopenharmony_ci .vmux = 0, 50762306a36Sopenharmony_ci .gpio0 = 0x0f05, 50862306a36Sopenharmony_ci }, { 50962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 51062306a36Sopenharmony_ci .vmux = 1, 51162306a36Sopenharmony_ci .gpio0 = 0x0f00, 51262306a36Sopenharmony_ci }, { 51362306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 51462306a36Sopenharmony_ci .vmux = 2, 51562306a36Sopenharmony_ci .gpio0 = 0x0f00, 51662306a36Sopenharmony_ci } }, 51762306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 51862306a36Sopenharmony_ci }, 51962306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_DVB_T1] = { 52062306a36Sopenharmony_ci .name = "Hauppauge Nova-T DVB-T", 52162306a36Sopenharmony_ci .tuner_type = UNSET, 52262306a36Sopenharmony_ci .radio_type = UNSET, 52362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 52462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 52562306a36Sopenharmony_ci .input = { { 52662306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 52762306a36Sopenharmony_ci .vmux = 0, 52862306a36Sopenharmony_ci } }, 52962306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 53062306a36Sopenharmony_ci }, 53162306a36Sopenharmony_ci [CX88_BOARD_CONEXANT_DVB_T1] = { 53262306a36Sopenharmony_ci .name = "Conexant DVB-T reference design", 53362306a36Sopenharmony_ci .tuner_type = UNSET, 53462306a36Sopenharmony_ci .radio_type = UNSET, 53562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 53662306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 53762306a36Sopenharmony_ci .input = { { 53862306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 53962306a36Sopenharmony_ci .vmux = 0, 54062306a36Sopenharmony_ci } }, 54162306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 54262306a36Sopenharmony_ci }, 54362306a36Sopenharmony_ci [CX88_BOARD_PROVIDEO_PV259] = { 54462306a36Sopenharmony_ci .name = "Provideo PV259", 54562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FQ1216ME, 54662306a36Sopenharmony_ci .radio_type = UNSET, 54762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 54862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 54962306a36Sopenharmony_ci .input = { { 55062306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 55162306a36Sopenharmony_ci .vmux = 0, 55262306a36Sopenharmony_ci .audioroute = 1, 55362306a36Sopenharmony_ci } }, 55462306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 55562306a36Sopenharmony_ci }, 55662306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = { 55762306a36Sopenharmony_ci .name = "DViCO FusionHDTV DVB-T Plus", 55862306a36Sopenharmony_ci .tuner_type = UNSET, /* No analog tuner */ 55962306a36Sopenharmony_ci .radio_type = UNSET, 56062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 56162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 56262306a36Sopenharmony_ci .input = { { 56362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 56462306a36Sopenharmony_ci .vmux = 1, 56562306a36Sopenharmony_ci .gpio0 = 0x000027df, 56662306a36Sopenharmony_ci }, { 56762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 56862306a36Sopenharmony_ci .vmux = 2, 56962306a36Sopenharmony_ci .gpio0 = 0x000027df, 57062306a36Sopenharmony_ci } }, 57162306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 57262306a36Sopenharmony_ci }, 57362306a36Sopenharmony_ci [CX88_BOARD_DNTV_LIVE_DVB_T] = { 57462306a36Sopenharmony_ci .name = "digitalnow DNTV Live! DVB-T", 57562306a36Sopenharmony_ci .tuner_type = UNSET, 57662306a36Sopenharmony_ci .radio_type = UNSET, 57762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 57862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 57962306a36Sopenharmony_ci .input = { { 58062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 58162306a36Sopenharmony_ci .vmux = 1, 58262306a36Sopenharmony_ci .gpio0 = 0x00000700, 58362306a36Sopenharmony_ci .gpio2 = 0x00000101, 58462306a36Sopenharmony_ci }, { 58562306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 58662306a36Sopenharmony_ci .vmux = 2, 58762306a36Sopenharmony_ci .gpio0 = 0x00000700, 58862306a36Sopenharmony_ci .gpio2 = 0x00000101, 58962306a36Sopenharmony_ci } }, 59062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 59162306a36Sopenharmony_ci }, 59262306a36Sopenharmony_ci [CX88_BOARD_PCHDTV_HD3000] = { 59362306a36Sopenharmony_ci .name = "pcHDTV HD3000 HDTV", 59462306a36Sopenharmony_ci .tuner_type = TUNER_THOMSON_DTT761X, 59562306a36Sopenharmony_ci .radio_type = UNSET, 59662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 59762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 59862306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 59962306a36Sopenharmony_ci /* GPIO[2] = audio source for analog audio out connector 60062306a36Sopenharmony_ci * 0 = analog audio input connector 60162306a36Sopenharmony_ci * 1 = CX88 audio DACs 60262306a36Sopenharmony_ci * 60362306a36Sopenharmony_ci * GPIO[7] = input to CX88's audio/chroma ADC 60462306a36Sopenharmony_ci * 0 = FM 10.7 MHz IF 60562306a36Sopenharmony_ci * 1 = Sound 4.5 MHz IF 60662306a36Sopenharmony_ci * 60762306a36Sopenharmony_ci * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively 60862306a36Sopenharmony_ci * 60962306a36Sopenharmony_ci * GPIO[16] = Remote control input 61062306a36Sopenharmony_ci */ 61162306a36Sopenharmony_ci .input = { { 61262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 61362306a36Sopenharmony_ci .vmux = 0, 61462306a36Sopenharmony_ci .gpio0 = 0x00008484, 61562306a36Sopenharmony_ci }, { 61662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 61762306a36Sopenharmony_ci .vmux = 1, 61862306a36Sopenharmony_ci .gpio0 = 0x00008400, 61962306a36Sopenharmony_ci }, { 62062306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 62162306a36Sopenharmony_ci .vmux = 2, 62262306a36Sopenharmony_ci .gpio0 = 0x00008400, 62362306a36Sopenharmony_ci } }, 62462306a36Sopenharmony_ci .radio = { 62562306a36Sopenharmony_ci .type = CX88_RADIO, 62662306a36Sopenharmony_ci .gpio0 = 0x00008404, 62762306a36Sopenharmony_ci }, 62862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 62962306a36Sopenharmony_ci }, 63062306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_ROSLYN] = { 63162306a36Sopenharmony_ci // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu> 63262306a36Sopenharmony_ci // GPIO values obtained from regspy, courtesy Sean Covel 63362306a36Sopenharmony_ci .name = "Hauppauge WinTV 28xxx (Roslyn) models", 63462306a36Sopenharmony_ci .tuner_type = UNSET, 63562306a36Sopenharmony_ci .radio_type = UNSET, 63662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 63762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 63862306a36Sopenharmony_ci .input = { { 63962306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 64062306a36Sopenharmony_ci .vmux = 0, 64162306a36Sopenharmony_ci .gpio0 = 0xed1a, 64262306a36Sopenharmony_ci .gpio2 = 0x00ff, 64362306a36Sopenharmony_ci }, { 64462306a36Sopenharmony_ci .type = CX88_VMUX_DEBUG, 64562306a36Sopenharmony_ci .vmux = 0, 64662306a36Sopenharmony_ci .gpio0 = 0xff01, 64762306a36Sopenharmony_ci }, { 64862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 64962306a36Sopenharmony_ci .vmux = 1, 65062306a36Sopenharmony_ci .gpio0 = 0xff02, 65162306a36Sopenharmony_ci }, { 65262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 65362306a36Sopenharmony_ci .vmux = 2, 65462306a36Sopenharmony_ci .gpio0 = 0xed92, 65562306a36Sopenharmony_ci .gpio2 = 0x00ff, 65662306a36Sopenharmony_ci } }, 65762306a36Sopenharmony_ci .radio = { 65862306a36Sopenharmony_ci .type = CX88_RADIO, 65962306a36Sopenharmony_ci .gpio0 = 0xed96, 66062306a36Sopenharmony_ci .gpio2 = 0x00ff, 66162306a36Sopenharmony_ci }, 66262306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 66362306a36Sopenharmony_ci }, 66462306a36Sopenharmony_ci [CX88_BOARD_DIGITALLOGIC_MEC] = { 66562306a36Sopenharmony_ci .name = "Digital-Logic MICROSPACE Entertainment Center (MEC)", 66662306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 66762306a36Sopenharmony_ci .radio_type = UNSET, 66862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 66962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 67062306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 67162306a36Sopenharmony_ci .input = { { 67262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 67362306a36Sopenharmony_ci .vmux = 0, 67462306a36Sopenharmony_ci .gpio0 = 0x00009d80, 67562306a36Sopenharmony_ci .audioroute = 1, 67662306a36Sopenharmony_ci }, { 67762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 67862306a36Sopenharmony_ci .vmux = 1, 67962306a36Sopenharmony_ci .gpio0 = 0x00009d76, 68062306a36Sopenharmony_ci .audioroute = 1, 68162306a36Sopenharmony_ci }, { 68262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 68362306a36Sopenharmony_ci .vmux = 2, 68462306a36Sopenharmony_ci .gpio0 = 0x00009d76, 68562306a36Sopenharmony_ci .audioroute = 1, 68662306a36Sopenharmony_ci } }, 68762306a36Sopenharmony_ci .radio = { 68862306a36Sopenharmony_ci .type = CX88_RADIO, 68962306a36Sopenharmony_ci .gpio0 = 0x00009d00, 69062306a36Sopenharmony_ci .audioroute = 1, 69162306a36Sopenharmony_ci }, 69262306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 69362306a36Sopenharmony_ci }, 69462306a36Sopenharmony_ci [CX88_BOARD_IODATA_GVBCTV7E] = { 69562306a36Sopenharmony_ci .name = "IODATA GV/BCTV7E", 69662306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FQ1286, 69762306a36Sopenharmony_ci .radio_type = UNSET, 69862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 69962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 70062306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 70162306a36Sopenharmony_ci .input = { { 70262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 70362306a36Sopenharmony_ci .vmux = 1, 70462306a36Sopenharmony_ci .gpio1 = 0x0000e03f, 70562306a36Sopenharmony_ci }, { 70662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 70762306a36Sopenharmony_ci .vmux = 2, 70862306a36Sopenharmony_ci .gpio1 = 0x0000e07f, 70962306a36Sopenharmony_ci }, { 71062306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 71162306a36Sopenharmony_ci .vmux = 3, 71262306a36Sopenharmony_ci .gpio1 = 0x0000e07f, 71362306a36Sopenharmony_ci } } 71462306a36Sopenharmony_ci }, 71562306a36Sopenharmony_ci [CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = { 71662306a36Sopenharmony_ci .name = "PixelView PlayTV Ultra Pro (Stereo)", 71762306a36Sopenharmony_ci /* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */ 71862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 71962306a36Sopenharmony_ci .radio_type = UNSET, 72062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 72162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 72262306a36Sopenharmony_ci /* 72362306a36Sopenharmony_ci * Some variants use a tda9874 and so need the 72462306a36Sopenharmony_ci * tvaudio module. 72562306a36Sopenharmony_ci */ 72662306a36Sopenharmony_ci .audio_chip = CX88_AUDIO_TVAUDIO, 72762306a36Sopenharmony_ci .input = { { 72862306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 72962306a36Sopenharmony_ci .vmux = 0, 73062306a36Sopenharmony_ci .gpio0 = 0xbf61, /* internal decoder */ 73162306a36Sopenharmony_ci }, { 73262306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 73362306a36Sopenharmony_ci .vmux = 1, 73462306a36Sopenharmony_ci .gpio0 = 0xbf63, 73562306a36Sopenharmony_ci }, { 73662306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 73762306a36Sopenharmony_ci .vmux = 2, 73862306a36Sopenharmony_ci .gpio0 = 0xbf63, 73962306a36Sopenharmony_ci } }, 74062306a36Sopenharmony_ci .radio = { 74162306a36Sopenharmony_ci .type = CX88_RADIO, 74262306a36Sopenharmony_ci .gpio0 = 0xbf60, 74362306a36Sopenharmony_ci }, 74462306a36Sopenharmony_ci }, 74562306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = { 74662306a36Sopenharmony_ci .name = "DViCO FusionHDTV 3 Gold-T", 74762306a36Sopenharmony_ci .tuner_type = TUNER_THOMSON_DTT761X, 74862306a36Sopenharmony_ci .radio_type = UNSET, 74962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 75062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 75162306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 75262306a36Sopenharmony_ci .input = { { 75362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 75462306a36Sopenharmony_ci .vmux = 0, 75562306a36Sopenharmony_ci .gpio0 = 0x97ed, 75662306a36Sopenharmony_ci }, { 75762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 75862306a36Sopenharmony_ci .vmux = 1, 75962306a36Sopenharmony_ci .gpio0 = 0x97e9, 76062306a36Sopenharmony_ci }, { 76162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 76262306a36Sopenharmony_ci .vmux = 2, 76362306a36Sopenharmony_ci .gpio0 = 0x97e9, 76462306a36Sopenharmony_ci } }, 76562306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 76662306a36Sopenharmony_ci }, 76762306a36Sopenharmony_ci [CX88_BOARD_ADSTECH_DVB_T_PCI] = { 76862306a36Sopenharmony_ci .name = "ADS Tech Instant TV DVB-T PCI", 76962306a36Sopenharmony_ci .tuner_type = UNSET, 77062306a36Sopenharmony_ci .radio_type = UNSET, 77162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 77262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 77362306a36Sopenharmony_ci .input = { { 77462306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 77562306a36Sopenharmony_ci .vmux = 1, 77662306a36Sopenharmony_ci .gpio0 = 0x0700, 77762306a36Sopenharmony_ci .gpio2 = 0x0101, 77862306a36Sopenharmony_ci }, { 77962306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 78062306a36Sopenharmony_ci .vmux = 2, 78162306a36Sopenharmony_ci .gpio0 = 0x0700, 78262306a36Sopenharmony_ci .gpio2 = 0x0101, 78362306a36Sopenharmony_ci } }, 78462306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 78562306a36Sopenharmony_ci }, 78662306a36Sopenharmony_ci [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = { 78762306a36Sopenharmony_ci .name = "TerraTec Cinergy 1400 DVB-T", 78862306a36Sopenharmony_ci .tuner_type = UNSET, 78962306a36Sopenharmony_ci .input = { { 79062306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 79162306a36Sopenharmony_ci .vmux = 0, 79262306a36Sopenharmony_ci }, { 79362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 79462306a36Sopenharmony_ci .vmux = 2, 79562306a36Sopenharmony_ci }, { 79662306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 79762306a36Sopenharmony_ci .vmux = 2, 79862306a36Sopenharmony_ci } }, 79962306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 80062306a36Sopenharmony_ci }, 80162306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = { 80262306a36Sopenharmony_ci .name = "DViCO FusionHDTV 5 Gold", 80362306a36Sopenharmony_ci .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */ 80462306a36Sopenharmony_ci .radio_type = UNSET, 80562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 80662306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 80762306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 80862306a36Sopenharmony_ci .input = { { 80962306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 81062306a36Sopenharmony_ci .vmux = 0, 81162306a36Sopenharmony_ci .gpio0 = 0x87fd, 81262306a36Sopenharmony_ci }, { 81362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 81462306a36Sopenharmony_ci .vmux = 1, 81562306a36Sopenharmony_ci .gpio0 = 0x87f9, 81662306a36Sopenharmony_ci }, { 81762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 81862306a36Sopenharmony_ci .vmux = 2, 81962306a36Sopenharmony_ci .gpio0 = 0x87f9, 82062306a36Sopenharmony_ci } }, 82162306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 82262306a36Sopenharmony_ci }, 82362306a36Sopenharmony_ci [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = { 82462306a36Sopenharmony_ci .name = "AverMedia UltraTV Media Center PCI 550", 82562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1236_MK3, 82662306a36Sopenharmony_ci .radio_type = UNSET, 82762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 82862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 82962306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 83062306a36Sopenharmony_ci .input = { { 83162306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 83262306a36Sopenharmony_ci .vmux = 0, 83362306a36Sopenharmony_ci .gpio0 = 0x0000cd73, 83462306a36Sopenharmony_ci .audioroute = 1, 83562306a36Sopenharmony_ci }, { 83662306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 83762306a36Sopenharmony_ci .vmux = 1, 83862306a36Sopenharmony_ci .gpio0 = 0x0000cd73, 83962306a36Sopenharmony_ci .audioroute = 1, 84062306a36Sopenharmony_ci }, { 84162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 84262306a36Sopenharmony_ci .vmux = 3, 84362306a36Sopenharmony_ci .gpio0 = 0x0000cdb3, 84462306a36Sopenharmony_ci .audioroute = 1, 84562306a36Sopenharmony_ci } }, 84662306a36Sopenharmony_ci .radio = { 84762306a36Sopenharmony_ci .type = CX88_RADIO, 84862306a36Sopenharmony_ci .vmux = 2, 84962306a36Sopenharmony_ci .gpio0 = 0x0000cdf3, 85062306a36Sopenharmony_ci .audioroute = 1, 85162306a36Sopenharmony_ci }, 85262306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 85362306a36Sopenharmony_ci }, 85462306a36Sopenharmony_ci [CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = { 85562306a36Sopenharmony_ci /* Alexander Wold <awold@bigfoot.com> */ 85662306a36Sopenharmony_ci .name = "Kworld V-Stream Xpert DVD", 85762306a36Sopenharmony_ci .tuner_type = UNSET, 85862306a36Sopenharmony_ci .input = { { 85962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 86062306a36Sopenharmony_ci .vmux = 1, 86162306a36Sopenharmony_ci .gpio0 = 0x03000000, 86262306a36Sopenharmony_ci .gpio1 = 0x01000000, 86362306a36Sopenharmony_ci .gpio2 = 0x02000000, 86462306a36Sopenharmony_ci .gpio3 = 0x00100000, 86562306a36Sopenharmony_ci }, { 86662306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 86762306a36Sopenharmony_ci .vmux = 2, 86862306a36Sopenharmony_ci .gpio0 = 0x03000000, 86962306a36Sopenharmony_ci .gpio1 = 0x01000000, 87062306a36Sopenharmony_ci .gpio2 = 0x02000000, 87162306a36Sopenharmony_ci .gpio3 = 0x00100000, 87262306a36Sopenharmony_ci } }, 87362306a36Sopenharmony_ci }, 87462306a36Sopenharmony_ci [CX88_BOARD_ATI_HDTVWONDER] = { 87562306a36Sopenharmony_ci .name = "ATI HDTV Wonder", 87662306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_TUV1236D, 87762306a36Sopenharmony_ci .radio_type = UNSET, 87862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 87962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 88062306a36Sopenharmony_ci .input = { { 88162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 88262306a36Sopenharmony_ci .vmux = 0, 88362306a36Sopenharmony_ci .gpio0 = 0x00000ff7, 88462306a36Sopenharmony_ci .gpio1 = 0x000000ff, 88562306a36Sopenharmony_ci .gpio2 = 0x00000001, 88662306a36Sopenharmony_ci .gpio3 = 0x00000000, 88762306a36Sopenharmony_ci }, { 88862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 88962306a36Sopenharmony_ci .vmux = 1, 89062306a36Sopenharmony_ci .gpio0 = 0x00000ffe, 89162306a36Sopenharmony_ci .gpio1 = 0x000000ff, 89262306a36Sopenharmony_ci .gpio2 = 0x00000001, 89362306a36Sopenharmony_ci .gpio3 = 0x00000000, 89462306a36Sopenharmony_ci }, { 89562306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 89662306a36Sopenharmony_ci .vmux = 2, 89762306a36Sopenharmony_ci .gpio0 = 0x00000ffe, 89862306a36Sopenharmony_ci .gpio1 = 0x000000ff, 89962306a36Sopenharmony_ci .gpio2 = 0x00000001, 90062306a36Sopenharmony_ci .gpio3 = 0x00000000, 90162306a36Sopenharmony_ci } }, 90262306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 90362306a36Sopenharmony_ci }, 90462306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DTV1000] = { 90562306a36Sopenharmony_ci .name = "WinFast DTV1000-T", 90662306a36Sopenharmony_ci .tuner_type = UNSET, 90762306a36Sopenharmony_ci .radio_type = UNSET, 90862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 90962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 91062306a36Sopenharmony_ci .input = { { 91162306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 91262306a36Sopenharmony_ci .vmux = 0, 91362306a36Sopenharmony_ci }, { 91462306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 91562306a36Sopenharmony_ci .vmux = 1, 91662306a36Sopenharmony_ci }, { 91762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 91862306a36Sopenharmony_ci .vmux = 2, 91962306a36Sopenharmony_ci } }, 92062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 92162306a36Sopenharmony_ci }, 92262306a36Sopenharmony_ci [CX88_BOARD_AVERTV_303] = { 92362306a36Sopenharmony_ci .name = "AVerTV 303 (M126)", 92462306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 92562306a36Sopenharmony_ci .radio_type = UNSET, 92662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 92762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 92862306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 92962306a36Sopenharmony_ci .input = { { 93062306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 93162306a36Sopenharmony_ci .vmux = 0, 93262306a36Sopenharmony_ci .gpio0 = 0x00ff, 93362306a36Sopenharmony_ci .gpio1 = 0xe09f, 93462306a36Sopenharmony_ci .gpio2 = 0x0010, 93562306a36Sopenharmony_ci .gpio3 = 0x0000, 93662306a36Sopenharmony_ci }, { 93762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 93862306a36Sopenharmony_ci .vmux = 1, 93962306a36Sopenharmony_ci .gpio0 = 0x00ff, 94062306a36Sopenharmony_ci .gpio1 = 0xe05f, 94162306a36Sopenharmony_ci .gpio2 = 0x0010, 94262306a36Sopenharmony_ci .gpio3 = 0x0000, 94362306a36Sopenharmony_ci }, { 94462306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 94562306a36Sopenharmony_ci .vmux = 2, 94662306a36Sopenharmony_ci .gpio0 = 0x00ff, 94762306a36Sopenharmony_ci .gpio1 = 0xe05f, 94862306a36Sopenharmony_ci .gpio2 = 0x0010, 94962306a36Sopenharmony_ci .gpio3 = 0x0000, 95062306a36Sopenharmony_ci } }, 95162306a36Sopenharmony_ci }, 95262306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = { 95362306a36Sopenharmony_ci .name = "Hauppauge Nova-S-Plus DVB-S", 95462306a36Sopenharmony_ci .tuner_type = UNSET, 95562306a36Sopenharmony_ci .radio_type = UNSET, 95662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 95762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 95862306a36Sopenharmony_ci .audio_chip = CX88_AUDIO_WM8775, 95962306a36Sopenharmony_ci .i2sinputcntl = 2, 96062306a36Sopenharmony_ci .input = { { 96162306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 96262306a36Sopenharmony_ci .vmux = 0, 96362306a36Sopenharmony_ci /* 2: Line-In */ 96462306a36Sopenharmony_ci .audioroute = 2, 96562306a36Sopenharmony_ci }, { 96662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 96762306a36Sopenharmony_ci .vmux = 1, 96862306a36Sopenharmony_ci /* 2: Line-In */ 96962306a36Sopenharmony_ci .audioroute = 2, 97062306a36Sopenharmony_ci }, { 97162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 97262306a36Sopenharmony_ci .vmux = 2, 97362306a36Sopenharmony_ci /* 2: Line-In */ 97462306a36Sopenharmony_ci .audioroute = 2, 97562306a36Sopenharmony_ci } }, 97662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 97762306a36Sopenharmony_ci }, 97862306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = { 97962306a36Sopenharmony_ci .name = "Hauppauge Nova-SE2 DVB-S", 98062306a36Sopenharmony_ci .tuner_type = UNSET, 98162306a36Sopenharmony_ci .radio_type = UNSET, 98262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 98362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 98462306a36Sopenharmony_ci .input = { { 98562306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 98662306a36Sopenharmony_ci .vmux = 0, 98762306a36Sopenharmony_ci } }, 98862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 98962306a36Sopenharmony_ci }, 99062306a36Sopenharmony_ci [CX88_BOARD_KWORLD_DVBS_100] = { 99162306a36Sopenharmony_ci .name = "KWorld DVB-S 100", 99262306a36Sopenharmony_ci .tuner_type = UNSET, 99362306a36Sopenharmony_ci .radio_type = UNSET, 99462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 99562306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 99662306a36Sopenharmony_ci .audio_chip = CX88_AUDIO_WM8775, 99762306a36Sopenharmony_ci .input = { { 99862306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 99962306a36Sopenharmony_ci .vmux = 0, 100062306a36Sopenharmony_ci /* 2: Line-In */ 100162306a36Sopenharmony_ci .audioroute = 2, 100262306a36Sopenharmony_ci }, { 100362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 100462306a36Sopenharmony_ci .vmux = 1, 100562306a36Sopenharmony_ci /* 2: Line-In */ 100662306a36Sopenharmony_ci .audioroute = 2, 100762306a36Sopenharmony_ci }, { 100862306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 100962306a36Sopenharmony_ci .vmux = 2, 101062306a36Sopenharmony_ci /* 2: Line-In */ 101162306a36Sopenharmony_ci .audioroute = 2, 101262306a36Sopenharmony_ci } }, 101362306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 101462306a36Sopenharmony_ci }, 101562306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_HVR1100] = { 101662306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid", 101762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 101862306a36Sopenharmony_ci .radio_type = UNSET, 101962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 102062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 102162306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 102262306a36Sopenharmony_ci .input = { { 102362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 102462306a36Sopenharmony_ci .vmux = 0, 102562306a36Sopenharmony_ci }, { 102662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 102762306a36Sopenharmony_ci .vmux = 1, 102862306a36Sopenharmony_ci }, { 102962306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 103062306a36Sopenharmony_ci .vmux = 2, 103162306a36Sopenharmony_ci } }, 103262306a36Sopenharmony_ci /* fixme: Add radio support */ 103362306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 103462306a36Sopenharmony_ci }, 103562306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_HVR1100LP] = { 103662306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)", 103762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 103862306a36Sopenharmony_ci .radio_type = UNSET, 103962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 104062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 104162306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 104262306a36Sopenharmony_ci .input = { { 104362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 104462306a36Sopenharmony_ci .vmux = 0, 104562306a36Sopenharmony_ci }, { 104662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 104762306a36Sopenharmony_ci .vmux = 1, 104862306a36Sopenharmony_ci } }, 104962306a36Sopenharmony_ci /* fixme: Add radio support */ 105062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 105162306a36Sopenharmony_ci }, 105262306a36Sopenharmony_ci [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = { 105362306a36Sopenharmony_ci .name = "digitalnow DNTV Live! DVB-T Pro", 105462306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 105562306a36Sopenharmony_ci .radio_type = UNSET, 105662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 105762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 105862306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE | 105962306a36Sopenharmony_ci TDA9887_PORT2_ACTIVE, 106062306a36Sopenharmony_ci .input = { { 106162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 106262306a36Sopenharmony_ci .vmux = 0, 106362306a36Sopenharmony_ci .gpio0 = 0xf80808, 106462306a36Sopenharmony_ci }, { 106562306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 106662306a36Sopenharmony_ci .vmux = 1, 106762306a36Sopenharmony_ci .gpio0 = 0xf80808, 106862306a36Sopenharmony_ci }, { 106962306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 107062306a36Sopenharmony_ci .vmux = 2, 107162306a36Sopenharmony_ci .gpio0 = 0xf80808, 107262306a36Sopenharmony_ci } }, 107362306a36Sopenharmony_ci .radio = { 107462306a36Sopenharmony_ci .type = CX88_RADIO, 107562306a36Sopenharmony_ci .gpio0 = 0xf80808, 107662306a36Sopenharmony_ci }, 107762306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 107862306a36Sopenharmony_ci }, 107962306a36Sopenharmony_ci [CX88_BOARD_KWORLD_DVB_T_CX22702] = { 108062306a36Sopenharmony_ci /* Kworld V-stream Xpert DVB-T with Thomson tuner */ 108162306a36Sopenharmony_ci /* DTT 7579 Conexant CX22702-19 Conexant CX2388x */ 108262306a36Sopenharmony_ci /* Manenti Marco <marco_manenti@colman.it> */ 108362306a36Sopenharmony_ci .name = "KWorld/VStream XPert DVB-T with cx22702", 108462306a36Sopenharmony_ci .tuner_type = UNSET, 108562306a36Sopenharmony_ci .radio_type = UNSET, 108662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 108762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 108862306a36Sopenharmony_ci .input = { { 108962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 109062306a36Sopenharmony_ci .vmux = 1, 109162306a36Sopenharmony_ci .gpio0 = 0x0700, 109262306a36Sopenharmony_ci .gpio2 = 0x0101, 109362306a36Sopenharmony_ci }, { 109462306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 109562306a36Sopenharmony_ci .vmux = 2, 109662306a36Sopenharmony_ci .gpio0 = 0x0700, 109762306a36Sopenharmony_ci .gpio2 = 0x0101, 109862306a36Sopenharmony_ci } }, 109962306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 110062306a36Sopenharmony_ci }, 110162306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = { 110262306a36Sopenharmony_ci .name = "DViCO FusionHDTV DVB-T Dual Digital", 110362306a36Sopenharmony_ci .tuner_type = UNSET, /* No analog tuner */ 110462306a36Sopenharmony_ci .radio_type = UNSET, 110562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 110662306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 110762306a36Sopenharmony_ci .input = { { 110862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 110962306a36Sopenharmony_ci .vmux = 1, 111062306a36Sopenharmony_ci .gpio0 = 0x000067df, 111162306a36Sopenharmony_ci }, { 111262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 111362306a36Sopenharmony_ci .vmux = 2, 111462306a36Sopenharmony_ci .gpio0 = 0x000067df, 111562306a36Sopenharmony_ci } }, 111662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 111762306a36Sopenharmony_ci }, 111862306a36Sopenharmony_ci [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = { 111962306a36Sopenharmony_ci .name = "KWorld HardwareMpegTV XPert", 112062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_TDA8290, 112162306a36Sopenharmony_ci .radio_type = UNSET, 112262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 112362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 112462306a36Sopenharmony_ci .input = { { 112562306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 112662306a36Sopenharmony_ci .vmux = 0, 112762306a36Sopenharmony_ci .gpio0 = 0x3de2, 112862306a36Sopenharmony_ci .gpio2 = 0x00ff, 112962306a36Sopenharmony_ci }, { 113062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 113162306a36Sopenharmony_ci .vmux = 1, 113262306a36Sopenharmony_ci .gpio0 = 0x3de6, 113362306a36Sopenharmony_ci .audioroute = 1, 113462306a36Sopenharmony_ci }, { 113562306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 113662306a36Sopenharmony_ci .vmux = 2, 113762306a36Sopenharmony_ci .gpio0 = 0x3de6, 113862306a36Sopenharmony_ci .audioroute = 1, 113962306a36Sopenharmony_ci } }, 114062306a36Sopenharmony_ci .radio = { 114162306a36Sopenharmony_ci .type = CX88_RADIO, 114262306a36Sopenharmony_ci .gpio0 = 0x3de6, 114362306a36Sopenharmony_ci .gpio2 = 0x00ff, 114462306a36Sopenharmony_ci }, 114562306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 114662306a36Sopenharmony_ci }, 114762306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = { 114862306a36Sopenharmony_ci .name = "DViCO FusionHDTV DVB-T Hybrid", 114962306a36Sopenharmony_ci .tuner_type = TUNER_THOMSON_FE6600, 115062306a36Sopenharmony_ci .radio_type = UNSET, 115162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 115262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 115362306a36Sopenharmony_ci .input = { { 115462306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 115562306a36Sopenharmony_ci .vmux = 0, 115662306a36Sopenharmony_ci .gpio0 = 0x0000a75f, 115762306a36Sopenharmony_ci }, { 115862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 115962306a36Sopenharmony_ci .vmux = 1, 116062306a36Sopenharmony_ci .gpio0 = 0x0000a75b, 116162306a36Sopenharmony_ci }, { 116262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 116362306a36Sopenharmony_ci .vmux = 2, 116462306a36Sopenharmony_ci .gpio0 = 0x0000a75b, 116562306a36Sopenharmony_ci } }, 116662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 116762306a36Sopenharmony_ci }, 116862306a36Sopenharmony_ci [CX88_BOARD_PCHDTV_HD5500] = { 116962306a36Sopenharmony_ci .name = "pcHDTV HD5500 HDTV", 117062306a36Sopenharmony_ci .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */ 117162306a36Sopenharmony_ci .radio_type = UNSET, 117262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 117362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 117462306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 117562306a36Sopenharmony_ci .input = { { 117662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 117762306a36Sopenharmony_ci .vmux = 0, 117862306a36Sopenharmony_ci .gpio0 = 0x87fd, 117962306a36Sopenharmony_ci }, { 118062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 118162306a36Sopenharmony_ci .vmux = 1, 118262306a36Sopenharmony_ci .gpio0 = 0x87f9, 118362306a36Sopenharmony_ci }, { 118462306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 118562306a36Sopenharmony_ci .vmux = 2, 118662306a36Sopenharmony_ci .gpio0 = 0x87f9, 118762306a36Sopenharmony_ci } }, 118862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 118962306a36Sopenharmony_ci }, 119062306a36Sopenharmony_ci [CX88_BOARD_KWORLD_MCE200_DELUXE] = { 119162306a36Sopenharmony_ci /* 119262306a36Sopenharmony_ci * FIXME: tested TV input only, disabled composite, 119362306a36Sopenharmony_ci * svideo and radio until they can be tested also. 119462306a36Sopenharmony_ci */ 119562306a36Sopenharmony_ci .name = "Kworld MCE 200 Deluxe", 119662306a36Sopenharmony_ci .tuner_type = TUNER_TENA_9533_DI, 119762306a36Sopenharmony_ci .radio_type = UNSET, 119862306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 119962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 120062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 120162306a36Sopenharmony_ci .input = { { 120262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 120362306a36Sopenharmony_ci .vmux = 0, 120462306a36Sopenharmony_ci .gpio0 = 0x0000BDE6 120562306a36Sopenharmony_ci } }, 120662306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 120762306a36Sopenharmony_ci }, 120862306a36Sopenharmony_ci [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = { 120962306a36Sopenharmony_ci /* FIXME: SVideo, Composite and FM inputs are untested */ 121062306a36Sopenharmony_ci .name = "PixelView PlayTV P7000", 121162306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 121262306a36Sopenharmony_ci .radio_type = UNSET, 121362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 121462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 121562306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE | 121662306a36Sopenharmony_ci TDA9887_PORT2_ACTIVE, 121762306a36Sopenharmony_ci .input = { { 121862306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 121962306a36Sopenharmony_ci .vmux = 0, 122062306a36Sopenharmony_ci .gpio0 = 0x5da6, 122162306a36Sopenharmony_ci } }, 122262306a36Sopenharmony_ci .mpeg = CX88_MPEG_BLACKBIRD, 122362306a36Sopenharmony_ci }, 122462306a36Sopenharmony_ci [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = { 122562306a36Sopenharmony_ci .name = "NPG Tech Real TV FM Top 10", 122662306a36Sopenharmony_ci .tuner_type = TUNER_TNF_5335MF, /* Actually a TNF9535 */ 122762306a36Sopenharmony_ci .radio_type = UNSET, 122862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 122962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 123062306a36Sopenharmony_ci .input = { { 123162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 123262306a36Sopenharmony_ci .vmux = 0, 123362306a36Sopenharmony_ci .gpio0 = 0x0788, 123462306a36Sopenharmony_ci }, { 123562306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 123662306a36Sopenharmony_ci .vmux = 1, 123762306a36Sopenharmony_ci .gpio0 = 0x078b, 123862306a36Sopenharmony_ci }, { 123962306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 124062306a36Sopenharmony_ci .vmux = 2, 124162306a36Sopenharmony_ci .gpio0 = 0x078b, 124262306a36Sopenharmony_ci } }, 124362306a36Sopenharmony_ci .radio = { 124462306a36Sopenharmony_ci .type = CX88_RADIO, 124562306a36Sopenharmony_ci .gpio0 = 0x074a, 124662306a36Sopenharmony_ci }, 124762306a36Sopenharmony_ci }, 124862306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DTV2000H] = { 124962306a36Sopenharmony_ci .name = "WinFast DTV2000 H", 125062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 125162306a36Sopenharmony_ci .radio_type = UNSET, 125262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 125362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 125462306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 125562306a36Sopenharmony_ci .input = { { 125662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 125762306a36Sopenharmony_ci .vmux = 0, 125862306a36Sopenharmony_ci .gpio0 = 0x00017304, 125962306a36Sopenharmony_ci .gpio1 = 0x00008203, 126062306a36Sopenharmony_ci .gpio2 = 0x00017304, 126162306a36Sopenharmony_ci .gpio3 = 0x02000000, 126262306a36Sopenharmony_ci }, { 126362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 126462306a36Sopenharmony_ci .vmux = 1, 126562306a36Sopenharmony_ci .gpio0 = 0x0001d701, 126662306a36Sopenharmony_ci .gpio1 = 0x0000b207, 126762306a36Sopenharmony_ci .gpio2 = 0x0001d701, 126862306a36Sopenharmony_ci .gpio3 = 0x02000000, 126962306a36Sopenharmony_ci }, { 127062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE2, 127162306a36Sopenharmony_ci .vmux = 2, 127262306a36Sopenharmony_ci .gpio0 = 0x0001d503, 127362306a36Sopenharmony_ci .gpio1 = 0x0000b207, 127462306a36Sopenharmony_ci .gpio2 = 0x0001d503, 127562306a36Sopenharmony_ci .gpio3 = 0x02000000, 127662306a36Sopenharmony_ci }, { 127762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 127862306a36Sopenharmony_ci .vmux = 3, 127962306a36Sopenharmony_ci .gpio0 = 0x0001d701, 128062306a36Sopenharmony_ci .gpio1 = 0x0000b207, 128162306a36Sopenharmony_ci .gpio2 = 0x0001d701, 128262306a36Sopenharmony_ci .gpio3 = 0x02000000, 128362306a36Sopenharmony_ci } }, 128462306a36Sopenharmony_ci .radio = { 128562306a36Sopenharmony_ci .type = CX88_RADIO, 128662306a36Sopenharmony_ci .gpio0 = 0x00015702, 128762306a36Sopenharmony_ci .gpio1 = 0x0000f207, 128862306a36Sopenharmony_ci .gpio2 = 0x00015702, 128962306a36Sopenharmony_ci .gpio3 = 0x02000000, 129062306a36Sopenharmony_ci }, 129162306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 129262306a36Sopenharmony_ci }, 129362306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DTV2000H_J] = { 129462306a36Sopenharmony_ci .name = "WinFast DTV2000 H rev. J", 129562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216MEX_MK3, 129662306a36Sopenharmony_ci .radio_type = UNSET, 129762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 129862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 129962306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 130062306a36Sopenharmony_ci .input = { { 130162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 130262306a36Sopenharmony_ci .vmux = 0, 130362306a36Sopenharmony_ci .gpio0 = 0x00017300, 130462306a36Sopenharmony_ci .gpio1 = 0x00008207, 130562306a36Sopenharmony_ci .gpio2 = 0x00000000, 130662306a36Sopenharmony_ci .gpio3 = 0x02000000, 130762306a36Sopenharmony_ci }, { 130862306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 130962306a36Sopenharmony_ci .vmux = 0, 131062306a36Sopenharmony_ci .gpio0 = 0x00018300, 131162306a36Sopenharmony_ci .gpio1 = 0x0000f207, 131262306a36Sopenharmony_ci .gpio2 = 0x00017304, 131362306a36Sopenharmony_ci .gpio3 = 0x02000000, 131462306a36Sopenharmony_ci }, { 131562306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 131662306a36Sopenharmony_ci .vmux = 1, 131762306a36Sopenharmony_ci .gpio0 = 0x00018301, 131862306a36Sopenharmony_ci .gpio1 = 0x0000f207, 131962306a36Sopenharmony_ci .gpio2 = 0x00017304, 132062306a36Sopenharmony_ci .gpio3 = 0x02000000, 132162306a36Sopenharmony_ci }, { 132262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 132362306a36Sopenharmony_ci .vmux = 2, 132462306a36Sopenharmony_ci .gpio0 = 0x00018301, 132562306a36Sopenharmony_ci .gpio1 = 0x0000f207, 132662306a36Sopenharmony_ci .gpio2 = 0x00017304, 132762306a36Sopenharmony_ci .gpio3 = 0x02000000, 132862306a36Sopenharmony_ci } }, 132962306a36Sopenharmony_ci .radio = { 133062306a36Sopenharmony_ci .type = CX88_RADIO, 133162306a36Sopenharmony_ci .gpio0 = 0x00015702, 133262306a36Sopenharmony_ci .gpio1 = 0x0000f207, 133362306a36Sopenharmony_ci .gpio2 = 0x00015702, 133462306a36Sopenharmony_ci .gpio3 = 0x02000000, 133562306a36Sopenharmony_ci }, 133662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 133762306a36Sopenharmony_ci }, 133862306a36Sopenharmony_ci [CX88_BOARD_GENIATECH_DVBS] = { 133962306a36Sopenharmony_ci .name = "Geniatech DVB-S", 134062306a36Sopenharmony_ci .tuner_type = UNSET, 134162306a36Sopenharmony_ci .radio_type = UNSET, 134262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 134362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 134462306a36Sopenharmony_ci .input = { { 134562306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 134662306a36Sopenharmony_ci .vmux = 0, 134762306a36Sopenharmony_ci }, { 134862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 134962306a36Sopenharmony_ci .vmux = 1, 135062306a36Sopenharmony_ci } }, 135162306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 135262306a36Sopenharmony_ci }, 135362306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_HVR3000] = { 135462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T", 135562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 135662306a36Sopenharmony_ci .radio_type = UNSET, 135762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 135862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 135962306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 136062306a36Sopenharmony_ci .audio_chip = CX88_AUDIO_WM8775, 136162306a36Sopenharmony_ci .input = { { 136262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 136362306a36Sopenharmony_ci .vmux = 0, 136462306a36Sopenharmony_ci .gpio0 = 0x84bf, 136562306a36Sopenharmony_ci /* 1: TV Audio / FM Mono */ 136662306a36Sopenharmony_ci .audioroute = 1, 136762306a36Sopenharmony_ci }, { 136862306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 136962306a36Sopenharmony_ci .vmux = 1, 137062306a36Sopenharmony_ci .gpio0 = 0x84bf, 137162306a36Sopenharmony_ci /* 2: Line-In */ 137262306a36Sopenharmony_ci .audioroute = 2, 137362306a36Sopenharmony_ci }, { 137462306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 137562306a36Sopenharmony_ci .vmux = 2, 137662306a36Sopenharmony_ci .gpio0 = 0x84bf, 137762306a36Sopenharmony_ci /* 2: Line-In */ 137862306a36Sopenharmony_ci .audioroute = 2, 137962306a36Sopenharmony_ci } }, 138062306a36Sopenharmony_ci .radio = { 138162306a36Sopenharmony_ci .type = CX88_RADIO, 138262306a36Sopenharmony_ci .gpio0 = 0x84bf, 138362306a36Sopenharmony_ci /* 4: FM Stereo (untested) */ 138462306a36Sopenharmony_ci .audioroute = 8, 138562306a36Sopenharmony_ci }, 138662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 138762306a36Sopenharmony_ci .num_frontends = 2, 138862306a36Sopenharmony_ci }, 138962306a36Sopenharmony_ci [CX88_BOARD_NORWOOD_MICRO] = { 139062306a36Sopenharmony_ci .name = "Norwood Micro TV Tuner", 139162306a36Sopenharmony_ci .tuner_type = TUNER_TNF_5335MF, 139262306a36Sopenharmony_ci .radio_type = UNSET, 139362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 139462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 139562306a36Sopenharmony_ci .input = { { 139662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 139762306a36Sopenharmony_ci .vmux = 0, 139862306a36Sopenharmony_ci .gpio0 = 0x0709, 139962306a36Sopenharmony_ci }, { 140062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 140162306a36Sopenharmony_ci .vmux = 1, 140262306a36Sopenharmony_ci .gpio0 = 0x070b, 140362306a36Sopenharmony_ci }, { 140462306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 140562306a36Sopenharmony_ci .vmux = 2, 140662306a36Sopenharmony_ci .gpio0 = 0x070b, 140762306a36Sopenharmony_ci } }, 140862306a36Sopenharmony_ci }, 140962306a36Sopenharmony_ci [CX88_BOARD_TE_DTV_250_OEM_SWANN] = { 141062306a36Sopenharmony_ci .name = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM", 141162306a36Sopenharmony_ci .tuner_type = TUNER_LG_PAL_NEW_TAPC, 141262306a36Sopenharmony_ci .radio_type = UNSET, 141362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 141462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 141562306a36Sopenharmony_ci .input = { { 141662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 141762306a36Sopenharmony_ci .vmux = 0, 141862306a36Sopenharmony_ci .gpio0 = 0x003fffff, 141962306a36Sopenharmony_ci .gpio1 = 0x00e00000, 142062306a36Sopenharmony_ci .gpio2 = 0x003fffff, 142162306a36Sopenharmony_ci .gpio3 = 0x02000000, 142262306a36Sopenharmony_ci }, { 142362306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 142462306a36Sopenharmony_ci .vmux = 1, 142562306a36Sopenharmony_ci .gpio0 = 0x003fffff, 142662306a36Sopenharmony_ci .gpio1 = 0x00e00000, 142762306a36Sopenharmony_ci .gpio2 = 0x003fffff, 142862306a36Sopenharmony_ci .gpio3 = 0x02000000, 142962306a36Sopenharmony_ci }, { 143062306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 143162306a36Sopenharmony_ci .vmux = 2, 143262306a36Sopenharmony_ci .gpio0 = 0x003fffff, 143362306a36Sopenharmony_ci .gpio1 = 0x00e00000, 143462306a36Sopenharmony_ci .gpio2 = 0x003fffff, 143562306a36Sopenharmony_ci .gpio3 = 0x02000000, 143662306a36Sopenharmony_ci } }, 143762306a36Sopenharmony_ci }, 143862306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_HVR1300] = { 143962306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder", 144062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 144162306a36Sopenharmony_ci .radio_type = UNSET, 144262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 144362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 144462306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 144562306a36Sopenharmony_ci .audio_chip = CX88_AUDIO_WM8775, 144662306a36Sopenharmony_ci /* 144762306a36Sopenharmony_ci * gpio0 as reported by Mike Crash <mike AT mikecrash.com> 144862306a36Sopenharmony_ci */ 144962306a36Sopenharmony_ci .input = { { 145062306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 145162306a36Sopenharmony_ci .vmux = 0, 145262306a36Sopenharmony_ci .gpio0 = 0xef88, 145362306a36Sopenharmony_ci /* 1: TV Audio / FM Mono */ 145462306a36Sopenharmony_ci .audioroute = 1, 145562306a36Sopenharmony_ci }, { 145662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 145762306a36Sopenharmony_ci .vmux = 1, 145862306a36Sopenharmony_ci .gpio0 = 0xef88, 145962306a36Sopenharmony_ci /* 2: Line-In */ 146062306a36Sopenharmony_ci .audioroute = 2, 146162306a36Sopenharmony_ci }, { 146262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 146362306a36Sopenharmony_ci .vmux = 2, 146462306a36Sopenharmony_ci .gpio0 = 0xef88, 146562306a36Sopenharmony_ci /* 2: Line-In */ 146662306a36Sopenharmony_ci .audioroute = 2, 146762306a36Sopenharmony_ci } }, 146862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD, 146962306a36Sopenharmony_ci .radio = { 147062306a36Sopenharmony_ci .type = CX88_RADIO, 147162306a36Sopenharmony_ci .gpio0 = 0xef88, 147262306a36Sopenharmony_ci /* 4: FM Stereo (untested) */ 147362306a36Sopenharmony_ci .audioroute = 8, 147462306a36Sopenharmony_ci }, 147562306a36Sopenharmony_ci }, 147662306a36Sopenharmony_ci [CX88_BOARD_SAMSUNG_SMT_7020] = { 147762306a36Sopenharmony_ci .name = "Samsung SMT 7020 DVB-S", 147862306a36Sopenharmony_ci .tuner_type = UNSET, 147962306a36Sopenharmony_ci .radio_type = UNSET, 148062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 148162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 148262306a36Sopenharmony_ci .input = { { 148362306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 148462306a36Sopenharmony_ci .vmux = 0, 148562306a36Sopenharmony_ci } }, 148662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 148762306a36Sopenharmony_ci }, 148862306a36Sopenharmony_ci [CX88_BOARD_ADSTECH_PTV_390] = { 148962306a36Sopenharmony_ci .name = "ADS Tech Instant Video PCI", 149062306a36Sopenharmony_ci .tuner_type = UNSET, 149162306a36Sopenharmony_ci .radio_type = UNSET, 149262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 149362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 149462306a36Sopenharmony_ci .input = { { 149562306a36Sopenharmony_ci .type = CX88_VMUX_DEBUG, 149662306a36Sopenharmony_ci .vmux = 3, 149762306a36Sopenharmony_ci .gpio0 = 0x04ff, 149862306a36Sopenharmony_ci }, { 149962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 150062306a36Sopenharmony_ci .vmux = 1, 150162306a36Sopenharmony_ci .gpio0 = 0x07fa, 150262306a36Sopenharmony_ci }, { 150362306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 150462306a36Sopenharmony_ci .vmux = 2, 150562306a36Sopenharmony_ci .gpio0 = 0x07fa, 150662306a36Sopenharmony_ci } }, 150762306a36Sopenharmony_ci }, 150862306a36Sopenharmony_ci [CX88_BOARD_PINNACLE_PCTV_HD_800i] = { 150962306a36Sopenharmony_ci .name = "Pinnacle PCTV HD 800i", 151062306a36Sopenharmony_ci .tuner_type = TUNER_XC5000, 151162306a36Sopenharmony_ci .radio_type = UNSET, 151262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 151362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 151462306a36Sopenharmony_ci .input = { { 151562306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 151662306a36Sopenharmony_ci .vmux = 0, 151762306a36Sopenharmony_ci .gpio0 = 0x04fb, 151862306a36Sopenharmony_ci .gpio1 = 0x10ff, 151962306a36Sopenharmony_ci }, { 152062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 152162306a36Sopenharmony_ci .vmux = 1, 152262306a36Sopenharmony_ci .gpio0 = 0x04fb, 152362306a36Sopenharmony_ci .gpio1 = 0x10ef, 152462306a36Sopenharmony_ci .audioroute = 1, 152562306a36Sopenharmony_ci }, { 152662306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 152762306a36Sopenharmony_ci .vmux = 2, 152862306a36Sopenharmony_ci .gpio0 = 0x04fb, 152962306a36Sopenharmony_ci .gpio1 = 0x10ef, 153062306a36Sopenharmony_ci .audioroute = 1, 153162306a36Sopenharmony_ci } }, 153262306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 153362306a36Sopenharmony_ci }, 153462306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = { 153562306a36Sopenharmony_ci .name = "DViCO FusionHDTV 5 PCI nano", 153662306a36Sopenharmony_ci /* xc3008 tuner, digital only for now */ 153762306a36Sopenharmony_ci .tuner_type = UNSET, 153862306a36Sopenharmony_ci .radio_type = UNSET, 153962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 154062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 154162306a36Sopenharmony_ci .input = { { 154262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 154362306a36Sopenharmony_ci .vmux = 0, 154462306a36Sopenharmony_ci .gpio0 = 0x000027df, /* Unconfirmed */ 154562306a36Sopenharmony_ci }, { 154662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 154762306a36Sopenharmony_ci .vmux = 1, 154862306a36Sopenharmony_ci .gpio0 = 0x000027df, /* Unconfirmed */ 154962306a36Sopenharmony_ci .audioroute = 1, 155062306a36Sopenharmony_ci }, { 155162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 155262306a36Sopenharmony_ci .vmux = 2, 155362306a36Sopenharmony_ci .gpio0 = 0x000027df, /* Unconfirmed */ 155462306a36Sopenharmony_ci .audioroute = 1, 155562306a36Sopenharmony_ci } }, 155662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 155762306a36Sopenharmony_ci }, 155862306a36Sopenharmony_ci [CX88_BOARD_PINNACLE_HYBRID_PCTV] = { 155962306a36Sopenharmony_ci .name = "Pinnacle Hybrid PCTV", 156062306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 156162306a36Sopenharmony_ci .tuner_addr = 0x61, 156262306a36Sopenharmony_ci .radio_type = UNSET, 156362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 156462306a36Sopenharmony_ci .input = { { 156562306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 156662306a36Sopenharmony_ci .vmux = 0, 156762306a36Sopenharmony_ci .gpio0 = 0x004ff, 156862306a36Sopenharmony_ci .gpio1 = 0x010ff, 156962306a36Sopenharmony_ci .gpio2 = 0x00001, 157062306a36Sopenharmony_ci }, { 157162306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 157262306a36Sopenharmony_ci .vmux = 1, 157362306a36Sopenharmony_ci .gpio0 = 0x004fb, 157462306a36Sopenharmony_ci .gpio1 = 0x010ef, 157562306a36Sopenharmony_ci .audioroute = 1, 157662306a36Sopenharmony_ci }, { 157762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 157862306a36Sopenharmony_ci .vmux = 2, 157962306a36Sopenharmony_ci .gpio0 = 0x004fb, 158062306a36Sopenharmony_ci .gpio1 = 0x010ef, 158162306a36Sopenharmony_ci .audioroute = 1, 158262306a36Sopenharmony_ci } }, 158362306a36Sopenharmony_ci .radio = { 158462306a36Sopenharmony_ci .type = CX88_RADIO, 158562306a36Sopenharmony_ci .gpio0 = 0x004ff, 158662306a36Sopenharmony_ci .gpio1 = 0x010ff, 158762306a36Sopenharmony_ci .gpio2 = 0x0ff, 158862306a36Sopenharmony_ci }, 158962306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 159062306a36Sopenharmony_ci }, 159162306a36Sopenharmony_ci /* Terry Wu <terrywu2009@gmail.com> */ 159262306a36Sopenharmony_ci /* TV Audio : set GPIO 2, 18, 19 value to 0, 1, 0 */ 159362306a36Sopenharmony_ci /* FM Audio : set GPIO 2, 18, 19 value to 0, 0, 0 */ 159462306a36Sopenharmony_ci /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */ 159562306a36Sopenharmony_ci /* Mute Audio : set GPIO 2 value to 1 */ 159662306a36Sopenharmony_ci [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = { 159762306a36Sopenharmony_ci .name = "Leadtek TV2000 XP Global", 159862306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 159962306a36Sopenharmony_ci .tuner_addr = 0x61, 160062306a36Sopenharmony_ci .radio_type = UNSET, 160162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 160262306a36Sopenharmony_ci .input = { { 160362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 160462306a36Sopenharmony_ci .vmux = 0, 160562306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 160662306a36Sopenharmony_ci .gpio1 = 0x0000, 160762306a36Sopenharmony_ci .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */ 160862306a36Sopenharmony_ci .gpio3 = 0x0000, 160962306a36Sopenharmony_ci }, { 161062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 161162306a36Sopenharmony_ci .vmux = 1, 161262306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 161362306a36Sopenharmony_ci .gpio1 = 0x0000, 161462306a36Sopenharmony_ci .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 161562306a36Sopenharmony_ci .gpio3 = 0x0000, 161662306a36Sopenharmony_ci }, { 161762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 161862306a36Sopenharmony_ci .vmux = 2, 161962306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 162062306a36Sopenharmony_ci .gpio1 = 0x0000, 162162306a36Sopenharmony_ci .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 162262306a36Sopenharmony_ci .gpio3 = 0x0000, 162362306a36Sopenharmony_ci } }, 162462306a36Sopenharmony_ci .radio = { 162562306a36Sopenharmony_ci .type = CX88_RADIO, 162662306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 162762306a36Sopenharmony_ci .gpio1 = 0x0000, 162862306a36Sopenharmony_ci .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */ 162962306a36Sopenharmony_ci .gpio3 = 0x0000, 163062306a36Sopenharmony_ci }, 163162306a36Sopenharmony_ci }, 163262306a36Sopenharmony_ci [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = { 163362306a36Sopenharmony_ci .name = "Leadtek TV2000 XP Global (SC4100)", 163462306a36Sopenharmony_ci .tuner_type = TUNER_XC4000, 163562306a36Sopenharmony_ci .tuner_addr = 0x61, 163662306a36Sopenharmony_ci .radio_type = UNSET, 163762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 163862306a36Sopenharmony_ci .input = { { 163962306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 164062306a36Sopenharmony_ci .vmux = 0, 164162306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 164262306a36Sopenharmony_ci .gpio1 = 0x0000, 164362306a36Sopenharmony_ci .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */ 164462306a36Sopenharmony_ci .gpio3 = 0x0000, 164562306a36Sopenharmony_ci }, { 164662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 164762306a36Sopenharmony_ci .vmux = 1, 164862306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 164962306a36Sopenharmony_ci .gpio1 = 0x0000, 165062306a36Sopenharmony_ci .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 165162306a36Sopenharmony_ci .gpio3 = 0x0000, 165262306a36Sopenharmony_ci }, { 165362306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 165462306a36Sopenharmony_ci .vmux = 2, 165562306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 165662306a36Sopenharmony_ci .gpio1 = 0x0000, 165762306a36Sopenharmony_ci .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */ 165862306a36Sopenharmony_ci .gpio3 = 0x0000, 165962306a36Sopenharmony_ci } }, 166062306a36Sopenharmony_ci .radio = { 166162306a36Sopenharmony_ci .type = CX88_RADIO, 166262306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 166362306a36Sopenharmony_ci .gpio1 = 0x0000, 166462306a36Sopenharmony_ci .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */ 166562306a36Sopenharmony_ci .gpio3 = 0x0000, 166662306a36Sopenharmony_ci }, 166762306a36Sopenharmony_ci }, 166862306a36Sopenharmony_ci [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = { 166962306a36Sopenharmony_ci .name = "Leadtek TV2000 XP Global (XC4100)", 167062306a36Sopenharmony_ci .tuner_type = TUNER_XC4000, 167162306a36Sopenharmony_ci .tuner_addr = 0x61, 167262306a36Sopenharmony_ci .radio_type = UNSET, 167362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 167462306a36Sopenharmony_ci .input = { { 167562306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 167662306a36Sopenharmony_ci .vmux = 0, 167762306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 167862306a36Sopenharmony_ci .gpio1 = 0x6040, /* pin 14 = 1, pin 13 = 0 */ 167962306a36Sopenharmony_ci .gpio2 = 0x0000, 168062306a36Sopenharmony_ci .gpio3 = 0x0000, 168162306a36Sopenharmony_ci }, { 168262306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 168362306a36Sopenharmony_ci .vmux = 1, 168462306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 168562306a36Sopenharmony_ci .gpio1 = 0x6060, /* pin 14 = 1, pin 13 = 1 */ 168662306a36Sopenharmony_ci .gpio2 = 0x0000, 168762306a36Sopenharmony_ci .gpio3 = 0x0000, 168862306a36Sopenharmony_ci }, { 168962306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 169062306a36Sopenharmony_ci .vmux = 2, 169162306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 169262306a36Sopenharmony_ci .gpio1 = 0x6060, /* pin 14 = 1, pin 13 = 1 */ 169362306a36Sopenharmony_ci .gpio2 = 0x0000, 169462306a36Sopenharmony_ci .gpio3 = 0x0000, 169562306a36Sopenharmony_ci } }, 169662306a36Sopenharmony_ci .radio = { 169762306a36Sopenharmony_ci .type = CX88_RADIO, 169862306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 169962306a36Sopenharmony_ci .gpio1 = 0x6000, /* pin 14 = 1, pin 13 = 0 */ 170062306a36Sopenharmony_ci .gpio2 = 0x0000, 170162306a36Sopenharmony_ci .gpio3 = 0x0000, 170262306a36Sopenharmony_ci }, 170362306a36Sopenharmony_ci }, 170462306a36Sopenharmony_ci [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = { 170562306a36Sopenharmony_ci /* Long names may confuse LIRC. */ 170662306a36Sopenharmony_ci .name = "PowerColor RA330", 170762306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 170862306a36Sopenharmony_ci .tuner_addr = 0x61, 170962306a36Sopenharmony_ci .input = { { 171062306a36Sopenharmony_ci /* 171162306a36Sopenharmony_ci * Due to the way the cx88 driver is written, 171262306a36Sopenharmony_ci * there is no way to deactivate audio pass- 171362306a36Sopenharmony_ci * through without this entry. Furthermore, if 171462306a36Sopenharmony_ci * the TV mux entry is first, you get audio 171562306a36Sopenharmony_ci * from the tuner on boot for a little while. 171662306a36Sopenharmony_ci */ 171762306a36Sopenharmony_ci .type = CX88_VMUX_DEBUG, 171862306a36Sopenharmony_ci .vmux = 3, 171962306a36Sopenharmony_ci .gpio0 = 0x00ff, 172062306a36Sopenharmony_ci .gpio1 = 0xf39d, 172162306a36Sopenharmony_ci .gpio3 = 0x0000, 172262306a36Sopenharmony_ci }, { 172362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 172462306a36Sopenharmony_ci .vmux = 0, 172562306a36Sopenharmony_ci .gpio0 = 0x00ff, 172662306a36Sopenharmony_ci .gpio1 = 0xf35d, 172762306a36Sopenharmony_ci .gpio3 = 0x0000, 172862306a36Sopenharmony_ci }, { 172962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 173062306a36Sopenharmony_ci .vmux = 1, 173162306a36Sopenharmony_ci .gpio0 = 0x00ff, 173262306a36Sopenharmony_ci .gpio1 = 0xf37d, 173362306a36Sopenharmony_ci .gpio3 = 0x0000, 173462306a36Sopenharmony_ci }, { 173562306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 173662306a36Sopenharmony_ci .vmux = 2, 173762306a36Sopenharmony_ci .gpio0 = 0x000ff, 173862306a36Sopenharmony_ci .gpio1 = 0x0f37d, 173962306a36Sopenharmony_ci .gpio3 = 0x00000, 174062306a36Sopenharmony_ci } }, 174162306a36Sopenharmony_ci .radio = { 174262306a36Sopenharmony_ci .type = CX88_RADIO, 174362306a36Sopenharmony_ci .gpio0 = 0x000ff, 174462306a36Sopenharmony_ci .gpio1 = 0x0f35d, 174562306a36Sopenharmony_ci .gpio3 = 0x00000, 174662306a36Sopenharmony_ci }, 174762306a36Sopenharmony_ci }, 174862306a36Sopenharmony_ci [CX88_BOARD_GENIATECH_X8000_MT] = { 174962306a36Sopenharmony_ci /* Also PowerColor Real Angel 330 and Geniatech X800 OEM */ 175062306a36Sopenharmony_ci .name = "Geniatech X8000-MT DVBT", 175162306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 175262306a36Sopenharmony_ci .tuner_addr = 0x61, 175362306a36Sopenharmony_ci .input = { { 175462306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 175562306a36Sopenharmony_ci .vmux = 0, 175662306a36Sopenharmony_ci .gpio0 = 0x00000000, 175762306a36Sopenharmony_ci .gpio1 = 0x00e3e341, 175862306a36Sopenharmony_ci .gpio2 = 0x00000000, 175962306a36Sopenharmony_ci .gpio3 = 0x00000000, 176062306a36Sopenharmony_ci }, { 176162306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 176262306a36Sopenharmony_ci .vmux = 1, 176362306a36Sopenharmony_ci .gpio0 = 0x00000000, 176462306a36Sopenharmony_ci .gpio1 = 0x00e3e361, 176562306a36Sopenharmony_ci .gpio2 = 0x00000000, 176662306a36Sopenharmony_ci .gpio3 = 0x00000000, 176762306a36Sopenharmony_ci }, { 176862306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 176962306a36Sopenharmony_ci .vmux = 2, 177062306a36Sopenharmony_ci .gpio0 = 0x00000000, 177162306a36Sopenharmony_ci .gpio1 = 0x00e3e361, 177262306a36Sopenharmony_ci .gpio2 = 0x00000000, 177362306a36Sopenharmony_ci .gpio3 = 0x00000000, 177462306a36Sopenharmony_ci } }, 177562306a36Sopenharmony_ci .radio = { 177662306a36Sopenharmony_ci .type = CX88_RADIO, 177762306a36Sopenharmony_ci .gpio0 = 0x00000000, 177862306a36Sopenharmony_ci .gpio1 = 0x00e3e341, 177962306a36Sopenharmony_ci .gpio2 = 0x00000000, 178062306a36Sopenharmony_ci .gpio3 = 0x00000000, 178162306a36Sopenharmony_ci }, 178262306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 178362306a36Sopenharmony_ci }, 178462306a36Sopenharmony_ci [CX88_BOARD_NOTONLYTV_LV3H] = { 178562306a36Sopenharmony_ci .name = "NotOnlyTV LV3H", 178662306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 178762306a36Sopenharmony_ci .radio_type = UNSET, 178862306a36Sopenharmony_ci .tuner_addr = 0x61, 178962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 179062306a36Sopenharmony_ci /* if gpio1:bit9 is enabled, DVB-T won't work */ 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci .input = { { 179362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 179462306a36Sopenharmony_ci .vmux = 0, 179562306a36Sopenharmony_ci .gpio0 = 0x0000, 179662306a36Sopenharmony_ci .gpio1 = 0xa141, 179762306a36Sopenharmony_ci .gpio2 = 0x0000, 179862306a36Sopenharmony_ci }, { 179962306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 180062306a36Sopenharmony_ci .vmux = 1, 180162306a36Sopenharmony_ci .gpio0 = 0x0000, 180262306a36Sopenharmony_ci .gpio1 = 0xa161, 180362306a36Sopenharmony_ci .gpio2 = 0x0000, 180462306a36Sopenharmony_ci }, { 180562306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 180662306a36Sopenharmony_ci .vmux = 2, 180762306a36Sopenharmony_ci .gpio0 = 0x0000, 180862306a36Sopenharmony_ci .gpio1 = 0xa161, 180962306a36Sopenharmony_ci .gpio2 = 0x0000, 181062306a36Sopenharmony_ci } }, 181162306a36Sopenharmony_ci .radio = { 181262306a36Sopenharmony_ci .type = CX88_RADIO, 181362306a36Sopenharmony_ci .gpio0 = 0x0000, 181462306a36Sopenharmony_ci .gpio1 = 0xa141, 181562306a36Sopenharmony_ci .gpio2 = 0x0000, 181662306a36Sopenharmony_ci }, 181762306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 181862306a36Sopenharmony_ci }, 181962306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = { 182062306a36Sopenharmony_ci .name = "DViCO FusionHDTV DVB-T PRO", 182162306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 182262306a36Sopenharmony_ci .tuner_addr = 0x61, 182362306a36Sopenharmony_ci .radio_type = UNSET, 182462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 182562306a36Sopenharmony_ci .input = { { 182662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 182762306a36Sopenharmony_ci .vmux = 1, 182862306a36Sopenharmony_ci .gpio0 = 0x000067df, 182962306a36Sopenharmony_ci }, { 183062306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 183162306a36Sopenharmony_ci .vmux = 2, 183262306a36Sopenharmony_ci .gpio0 = 0x000067df, 183362306a36Sopenharmony_ci } }, 183462306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 183562306a36Sopenharmony_ci }, 183662306a36Sopenharmony_ci [CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = { 183762306a36Sopenharmony_ci .name = "DViCO FusionHDTV 7 Gold", 183862306a36Sopenharmony_ci .tuner_type = TUNER_XC5000, 183962306a36Sopenharmony_ci .radio_type = UNSET, 184062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 184162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 184262306a36Sopenharmony_ci .input = { { 184362306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 184462306a36Sopenharmony_ci .vmux = 0, 184562306a36Sopenharmony_ci .gpio0 = 0x10df, 184662306a36Sopenharmony_ci }, { 184762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 184862306a36Sopenharmony_ci .vmux = 1, 184962306a36Sopenharmony_ci .gpio0 = 0x16d9, 185062306a36Sopenharmony_ci }, { 185162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 185262306a36Sopenharmony_ci .vmux = 2, 185362306a36Sopenharmony_ci .gpio0 = 0x16d9, 185462306a36Sopenharmony_ci } }, 185562306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 185662306a36Sopenharmony_ci }, 185762306a36Sopenharmony_ci [CX88_BOARD_PROLINK_PV_8000GT] = { 185862306a36Sopenharmony_ci .name = "Prolink Pixelview MPEG 8000GT", 185962306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 186062306a36Sopenharmony_ci .tuner_addr = 0x61, 186162306a36Sopenharmony_ci .input = { { 186262306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 186362306a36Sopenharmony_ci .vmux = 0, 186462306a36Sopenharmony_ci .gpio0 = 0x0ff, 186562306a36Sopenharmony_ci .gpio2 = 0x0cfb, 186662306a36Sopenharmony_ci }, { 186762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 186862306a36Sopenharmony_ci .vmux = 1, 186962306a36Sopenharmony_ci .gpio2 = 0x0cfb, 187062306a36Sopenharmony_ci }, { 187162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 187262306a36Sopenharmony_ci .vmux = 2, 187362306a36Sopenharmony_ci .gpio2 = 0x0cfb, 187462306a36Sopenharmony_ci } }, 187562306a36Sopenharmony_ci .radio = { 187662306a36Sopenharmony_ci .type = CX88_RADIO, 187762306a36Sopenharmony_ci .gpio2 = 0x0cfb, 187862306a36Sopenharmony_ci }, 187962306a36Sopenharmony_ci }, 188062306a36Sopenharmony_ci [CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = { 188162306a36Sopenharmony_ci .name = "Prolink Pixelview Global Extreme", 188262306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 188362306a36Sopenharmony_ci .tuner_addr = 0x61, 188462306a36Sopenharmony_ci .input = { { 188562306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 188662306a36Sopenharmony_ci .vmux = 0, 188762306a36Sopenharmony_ci .gpio0 = 0x04fb, 188862306a36Sopenharmony_ci .gpio1 = 0x04080, 188962306a36Sopenharmony_ci .gpio2 = 0x0cf7, 189062306a36Sopenharmony_ci }, { 189162306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 189262306a36Sopenharmony_ci .vmux = 1, 189362306a36Sopenharmony_ci .gpio0 = 0x04fb, 189462306a36Sopenharmony_ci .gpio1 = 0x04080, 189562306a36Sopenharmony_ci .gpio2 = 0x0cfb, 189662306a36Sopenharmony_ci }, { 189762306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 189862306a36Sopenharmony_ci .vmux = 2, 189962306a36Sopenharmony_ci .gpio0 = 0x04fb, 190062306a36Sopenharmony_ci .gpio1 = 0x04080, 190162306a36Sopenharmony_ci .gpio2 = 0x0cfb, 190262306a36Sopenharmony_ci } }, 190362306a36Sopenharmony_ci .radio = { 190462306a36Sopenharmony_ci .type = CX88_RADIO, 190562306a36Sopenharmony_ci .gpio0 = 0x04ff, 190662306a36Sopenharmony_ci .gpio1 = 0x04080, 190762306a36Sopenharmony_ci .gpio2 = 0x0cf7, 190862306a36Sopenharmony_ci }, 190962306a36Sopenharmony_ci }, 191062306a36Sopenharmony_ci /* 191162306a36Sopenharmony_ci * Both radio, analog and ATSC work with this board. 191262306a36Sopenharmony_ci * However, for analog to work, s5h1409 gate should be open, 191362306a36Sopenharmony_ci * otherwise, tuner-xc3028 won't be detected. 191462306a36Sopenharmony_ci * A proper fix require using the newer i2c methods to add 191562306a36Sopenharmony_ci * tuner-xc3028 without doing an i2c probe. 191662306a36Sopenharmony_ci */ 191762306a36Sopenharmony_ci [CX88_BOARD_KWORLD_ATSC_120] = { 191862306a36Sopenharmony_ci .name = "Kworld PlusTV HD PCI 120 (ATSC 120)", 191962306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 192062306a36Sopenharmony_ci .radio_type = UNSET, 192162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 192262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 192362306a36Sopenharmony_ci .input = { { 192462306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 192562306a36Sopenharmony_ci .vmux = 0, 192662306a36Sopenharmony_ci .gpio0 = 0x000000ff, 192762306a36Sopenharmony_ci .gpio1 = 0x0000f35d, 192862306a36Sopenharmony_ci .gpio2 = 0x00000000, 192962306a36Sopenharmony_ci }, { 193062306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 193162306a36Sopenharmony_ci .vmux = 1, 193262306a36Sopenharmony_ci .gpio0 = 0x000000ff, 193362306a36Sopenharmony_ci .gpio1 = 0x0000f37e, 193462306a36Sopenharmony_ci .gpio2 = 0x00000000, 193562306a36Sopenharmony_ci }, { 193662306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 193762306a36Sopenharmony_ci .vmux = 2, 193862306a36Sopenharmony_ci .gpio0 = 0x000000ff, 193962306a36Sopenharmony_ci .gpio1 = 0x0000f37e, 194062306a36Sopenharmony_ci .gpio2 = 0x00000000, 194162306a36Sopenharmony_ci } }, 194262306a36Sopenharmony_ci .radio = { 194362306a36Sopenharmony_ci .type = CX88_RADIO, 194462306a36Sopenharmony_ci .gpio0 = 0x000000ff, 194562306a36Sopenharmony_ci .gpio1 = 0x0000f35d, 194662306a36Sopenharmony_ci .gpio2 = 0x00000000, 194762306a36Sopenharmony_ci }, 194862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 194962306a36Sopenharmony_ci }, 195062306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_HVR4000] = { 195162306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid", 195262306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, 195362306a36Sopenharmony_ci .radio_type = UNSET, 195462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 195562306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 195662306a36Sopenharmony_ci .tda9887_conf = TDA9887_PRESENT, 195762306a36Sopenharmony_ci .audio_chip = CX88_AUDIO_WM8775, 195862306a36Sopenharmony_ci /* 195962306a36Sopenharmony_ci * GPIO0 (WINTV2000) 196062306a36Sopenharmony_ci * 196162306a36Sopenharmony_ci * Analogue SAT DVB-T 196262306a36Sopenharmony_ci * Antenna 0xc4bf 0xc4bb 196362306a36Sopenharmony_ci * Composite 0xc4bf 0xc4bb 196462306a36Sopenharmony_ci * S-Video 0xc4bf 0xc4bb 196562306a36Sopenharmony_ci * Composite1 0xc4ff 0xc4fb 196662306a36Sopenharmony_ci * S-Video1 0xc4ff 0xc4fb 196762306a36Sopenharmony_ci * 196862306a36Sopenharmony_ci * BIT VALUE FUNCTION GP{x}_IO 196962306a36Sopenharmony_ci * 0 1 I:? 197062306a36Sopenharmony_ci * 1 1 I:? 197162306a36Sopenharmony_ci * 2 1 O:MPEG PORT 0=DVB-T 1=DVB-S 197262306a36Sopenharmony_ci * 3 1 I:? 197362306a36Sopenharmony_ci * 4 1 I:? 197462306a36Sopenharmony_ci * 5 1 I:? 197562306a36Sopenharmony_ci * 6 0 O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION 197662306a36Sopenharmony_ci * 7 1 O:DVB-T DEMOD RESET LOW 197762306a36Sopenharmony_ci * 197862306a36Sopenharmony_ci * BIT VALUE FUNCTION GP{x}_OE 197962306a36Sopenharmony_ci * 8 0 I 198062306a36Sopenharmony_ci * 9 0 I 198162306a36Sopenharmony_ci * a 1 O 198262306a36Sopenharmony_ci * b 0 I 198362306a36Sopenharmony_ci * c 0 I 198462306a36Sopenharmony_ci * d 0 I 198562306a36Sopenharmony_ci * e 1 O 198662306a36Sopenharmony_ci * f 1 O 198762306a36Sopenharmony_ci * 198862306a36Sopenharmony_ci * WM8775 ADC 198962306a36Sopenharmony_ci * 199062306a36Sopenharmony_ci * 1: TV Audio / FM Mono 199162306a36Sopenharmony_ci * 2: Line-In 199262306a36Sopenharmony_ci * 3: Line-In Expansion 199362306a36Sopenharmony_ci * 4: FM Stereo 199462306a36Sopenharmony_ci */ 199562306a36Sopenharmony_ci .input = { { 199662306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 199762306a36Sopenharmony_ci .vmux = 0, 199862306a36Sopenharmony_ci .gpio0 = 0xc4bf, 199962306a36Sopenharmony_ci /* 1: TV Audio / FM Mono */ 200062306a36Sopenharmony_ci .audioroute = 1, 200162306a36Sopenharmony_ci }, { 200262306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 200362306a36Sopenharmony_ci .vmux = 1, 200462306a36Sopenharmony_ci .gpio0 = 0xc4bf, 200562306a36Sopenharmony_ci /* 2: Line-In */ 200662306a36Sopenharmony_ci .audioroute = 2, 200762306a36Sopenharmony_ci }, { 200862306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 200962306a36Sopenharmony_ci .vmux = 2, 201062306a36Sopenharmony_ci .gpio0 = 0xc4bf, 201162306a36Sopenharmony_ci /* 2: Line-In */ 201262306a36Sopenharmony_ci .audioroute = 2, 201362306a36Sopenharmony_ci } }, 201462306a36Sopenharmony_ci .radio = { 201562306a36Sopenharmony_ci .type = CX88_RADIO, 201662306a36Sopenharmony_ci .gpio0 = 0xc4bf, 201762306a36Sopenharmony_ci /* 4: FM Stereo */ 201862306a36Sopenharmony_ci .audioroute = 8, 201962306a36Sopenharmony_ci }, 202062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 202162306a36Sopenharmony_ci .num_frontends = 2, 202262306a36Sopenharmony_ci }, 202362306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_HVR4000LITE] = { 202462306a36Sopenharmony_ci .name = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2", 202562306a36Sopenharmony_ci .tuner_type = UNSET, 202662306a36Sopenharmony_ci .radio_type = UNSET, 202762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 202862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 202962306a36Sopenharmony_ci .input = { { 203062306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 203162306a36Sopenharmony_ci .vmux = 0, 203262306a36Sopenharmony_ci } }, 203362306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 203462306a36Sopenharmony_ci }, 203562306a36Sopenharmony_ci [CX88_BOARD_TEVII_S420] = { 203662306a36Sopenharmony_ci .name = "TeVii S420 DVB-S", 203762306a36Sopenharmony_ci .tuner_type = UNSET, 203862306a36Sopenharmony_ci .radio_type = UNSET, 203962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 204062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 204162306a36Sopenharmony_ci .input = { { 204262306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 204362306a36Sopenharmony_ci .vmux = 0, 204462306a36Sopenharmony_ci } }, 204562306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 204662306a36Sopenharmony_ci }, 204762306a36Sopenharmony_ci [CX88_BOARD_TEVII_S460] = { 204862306a36Sopenharmony_ci .name = "TeVii S460 DVB-S/S2", 204962306a36Sopenharmony_ci .tuner_type = UNSET, 205062306a36Sopenharmony_ci .radio_type = UNSET, 205162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 205262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 205362306a36Sopenharmony_ci .input = { { 205462306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 205562306a36Sopenharmony_ci .vmux = 0, 205662306a36Sopenharmony_ci } }, 205762306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 205862306a36Sopenharmony_ci }, 205962306a36Sopenharmony_ci [CX88_BOARD_TEVII_S464] = { 206062306a36Sopenharmony_ci .name = "TeVii S464 DVB-S/S2", 206162306a36Sopenharmony_ci .tuner_type = UNSET, 206262306a36Sopenharmony_ci .radio_type = UNSET, 206362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 206462306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 206562306a36Sopenharmony_ci .input = { { 206662306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 206762306a36Sopenharmony_ci .vmux = 0, 206862306a36Sopenharmony_ci } }, 206962306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 207062306a36Sopenharmony_ci }, 207162306a36Sopenharmony_ci [CX88_BOARD_OMICOM_SS4_PCI] = { 207262306a36Sopenharmony_ci .name = "Omicom SS4 DVB-S/S2 PCI", 207362306a36Sopenharmony_ci .tuner_type = UNSET, 207462306a36Sopenharmony_ci .radio_type = UNSET, 207562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 207662306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 207762306a36Sopenharmony_ci .input = { { 207862306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 207962306a36Sopenharmony_ci .vmux = 0, 208062306a36Sopenharmony_ci } }, 208162306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 208262306a36Sopenharmony_ci }, 208362306a36Sopenharmony_ci [CX88_BOARD_TBS_8910] = { 208462306a36Sopenharmony_ci .name = "TBS 8910 DVB-S", 208562306a36Sopenharmony_ci .tuner_type = UNSET, 208662306a36Sopenharmony_ci .radio_type = UNSET, 208762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 208862306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 208962306a36Sopenharmony_ci .input = { { 209062306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 209162306a36Sopenharmony_ci .vmux = 0, 209262306a36Sopenharmony_ci } }, 209362306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 209462306a36Sopenharmony_ci }, 209562306a36Sopenharmony_ci [CX88_BOARD_TBS_8920] = { 209662306a36Sopenharmony_ci .name = "TBS 8920 DVB-S/S2", 209762306a36Sopenharmony_ci .tuner_type = UNSET, 209862306a36Sopenharmony_ci .radio_type = UNSET, 209962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 210062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 210162306a36Sopenharmony_ci .input = { { 210262306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 210362306a36Sopenharmony_ci .vmux = 0, 210462306a36Sopenharmony_ci .gpio0 = 0x8080, 210562306a36Sopenharmony_ci } }, 210662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 210762306a36Sopenharmony_ci }, 210862306a36Sopenharmony_ci [CX88_BOARD_PROF_6200] = { 210962306a36Sopenharmony_ci .name = "Prof 6200 DVB-S", 211062306a36Sopenharmony_ci .tuner_type = UNSET, 211162306a36Sopenharmony_ci .radio_type = UNSET, 211262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 211362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 211462306a36Sopenharmony_ci .input = { { 211562306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 211662306a36Sopenharmony_ci .vmux = 0, 211762306a36Sopenharmony_ci } }, 211862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 211962306a36Sopenharmony_ci }, 212062306a36Sopenharmony_ci [CX88_BOARD_PROF_7300] = { 212162306a36Sopenharmony_ci .name = "PROF 7300 DVB-S/S2", 212262306a36Sopenharmony_ci .tuner_type = UNSET, 212362306a36Sopenharmony_ci .radio_type = UNSET, 212462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 212562306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 212662306a36Sopenharmony_ci .input = { { 212762306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 212862306a36Sopenharmony_ci .vmux = 0, 212962306a36Sopenharmony_ci } }, 213062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 213162306a36Sopenharmony_ci }, 213262306a36Sopenharmony_ci [CX88_BOARD_SATTRADE_ST4200] = { 213362306a36Sopenharmony_ci .name = "SATTRADE ST4200 DVB-S/S2", 213462306a36Sopenharmony_ci .tuner_type = UNSET, 213562306a36Sopenharmony_ci .radio_type = UNSET, 213662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 213762306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 213862306a36Sopenharmony_ci .input = { { 213962306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 214062306a36Sopenharmony_ci .vmux = 0, 214162306a36Sopenharmony_ci } }, 214262306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 214362306a36Sopenharmony_ci }, 214462306a36Sopenharmony_ci [CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = { 214562306a36Sopenharmony_ci .name = "Terratec Cinergy HT PCI MKII", 214662306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 214762306a36Sopenharmony_ci .tuner_addr = 0x61, 214862306a36Sopenharmony_ci .radio_type = UNSET, 214962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 215062306a36Sopenharmony_ci .input = { { 215162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 215262306a36Sopenharmony_ci .vmux = 0, 215362306a36Sopenharmony_ci .gpio0 = 0x004ff, 215462306a36Sopenharmony_ci .gpio1 = 0x010ff, 215562306a36Sopenharmony_ci .gpio2 = 0x00001, 215662306a36Sopenharmony_ci }, { 215762306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 215862306a36Sopenharmony_ci .vmux = 1, 215962306a36Sopenharmony_ci .gpio0 = 0x004fb, 216062306a36Sopenharmony_ci .gpio1 = 0x010ef, 216162306a36Sopenharmony_ci .audioroute = 1, 216262306a36Sopenharmony_ci }, { 216362306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 216462306a36Sopenharmony_ci .vmux = 2, 216562306a36Sopenharmony_ci .gpio0 = 0x004fb, 216662306a36Sopenharmony_ci .gpio1 = 0x010ef, 216762306a36Sopenharmony_ci .audioroute = 1, 216862306a36Sopenharmony_ci } }, 216962306a36Sopenharmony_ci .radio = { 217062306a36Sopenharmony_ci .type = CX88_RADIO, 217162306a36Sopenharmony_ci .gpio0 = 0x004ff, 217262306a36Sopenharmony_ci .gpio1 = 0x010ff, 217362306a36Sopenharmony_ci .gpio2 = 0x0ff, 217462306a36Sopenharmony_ci }, 217562306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 217662306a36Sopenharmony_ci }, 217762306a36Sopenharmony_ci [CX88_BOARD_HAUPPAUGE_IRONLY] = { 217862306a36Sopenharmony_ci .name = "Hauppauge WinTV-IR Only", 217962306a36Sopenharmony_ci .tuner_type = UNSET, 218062306a36Sopenharmony_ci .radio_type = UNSET, 218162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 218262306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 218362306a36Sopenharmony_ci }, 218462306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DTV1800H] = { 218562306a36Sopenharmony_ci .name = "Leadtek WinFast DTV1800 Hybrid", 218662306a36Sopenharmony_ci .tuner_type = TUNER_XC2028, 218762306a36Sopenharmony_ci .radio_type = UNSET, 218862306a36Sopenharmony_ci .tuner_addr = 0x61, 218962306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 219062306a36Sopenharmony_ci /* 219162306a36Sopenharmony_ci * GPIO setting 219262306a36Sopenharmony_ci * 219362306a36Sopenharmony_ci * 2: mute (0=off,1=on) 219462306a36Sopenharmony_ci * 12: tuner reset pin 219562306a36Sopenharmony_ci * 13: audio source (0=tuner audio,1=line in) 219662306a36Sopenharmony_ci * 14: FM (0=on,1=off ???) 219762306a36Sopenharmony_ci */ 219862306a36Sopenharmony_ci .input = { { 219962306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 220062306a36Sopenharmony_ci .vmux = 0, 220162306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 220262306a36Sopenharmony_ci .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */ 220362306a36Sopenharmony_ci .gpio2 = 0x0000, 220462306a36Sopenharmony_ci }, { 220562306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 220662306a36Sopenharmony_ci .vmux = 1, 220762306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 220862306a36Sopenharmony_ci .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 220962306a36Sopenharmony_ci .gpio2 = 0x0000, 221062306a36Sopenharmony_ci }, { 221162306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 221262306a36Sopenharmony_ci .vmux = 2, 221362306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 221462306a36Sopenharmony_ci .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 221562306a36Sopenharmony_ci .gpio2 = 0x0000, 221662306a36Sopenharmony_ci } }, 221762306a36Sopenharmony_ci .radio = { 221862306a36Sopenharmony_ci .type = CX88_RADIO, 221962306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 222062306a36Sopenharmony_ci .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */ 222162306a36Sopenharmony_ci .gpio2 = 0x0000, 222262306a36Sopenharmony_ci }, 222362306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 222462306a36Sopenharmony_ci }, 222562306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DTV1800H_XC4000] = { 222662306a36Sopenharmony_ci .name = "Leadtek WinFast DTV1800 H (XC4000)", 222762306a36Sopenharmony_ci .tuner_type = TUNER_XC4000, 222862306a36Sopenharmony_ci .radio_type = UNSET, 222962306a36Sopenharmony_ci .tuner_addr = 0x61, 223062306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 223162306a36Sopenharmony_ci /* 223262306a36Sopenharmony_ci * GPIO setting 223362306a36Sopenharmony_ci * 223462306a36Sopenharmony_ci * 2: mute (0=off,1=on) 223562306a36Sopenharmony_ci * 12: tuner reset pin 223662306a36Sopenharmony_ci * 13: audio source (0=tuner audio,1=line in) 223762306a36Sopenharmony_ci * 14: FM (0=on,1=off ???) 223862306a36Sopenharmony_ci */ 223962306a36Sopenharmony_ci .input = { { 224062306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 224162306a36Sopenharmony_ci .vmux = 0, 224262306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 224362306a36Sopenharmony_ci .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */ 224462306a36Sopenharmony_ci .gpio2 = 0x0000, 224562306a36Sopenharmony_ci }, { 224662306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 224762306a36Sopenharmony_ci .vmux = 1, 224862306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 224962306a36Sopenharmony_ci .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 225062306a36Sopenharmony_ci .gpio2 = 0x0000, 225162306a36Sopenharmony_ci }, { 225262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 225362306a36Sopenharmony_ci .vmux = 2, 225462306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 225562306a36Sopenharmony_ci .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */ 225662306a36Sopenharmony_ci .gpio2 = 0x0000, 225762306a36Sopenharmony_ci } }, 225862306a36Sopenharmony_ci .radio = { 225962306a36Sopenharmony_ci .type = CX88_RADIO, 226062306a36Sopenharmony_ci .gpio0 = 0x0400, /* pin 2 = 0 */ 226162306a36Sopenharmony_ci .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */ 226262306a36Sopenharmony_ci .gpio2 = 0x0000, 226362306a36Sopenharmony_ci }, 226462306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 226562306a36Sopenharmony_ci }, 226662306a36Sopenharmony_ci [CX88_BOARD_WINFAST_DTV2000H_PLUS] = { 226762306a36Sopenharmony_ci .name = "Leadtek WinFast DTV2000 H PLUS", 226862306a36Sopenharmony_ci .tuner_type = TUNER_XC4000, 226962306a36Sopenharmony_ci .radio_type = UNSET, 227062306a36Sopenharmony_ci .tuner_addr = 0x61, 227162306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 227262306a36Sopenharmony_ci /* 227362306a36Sopenharmony_ci * GPIO 227462306a36Sopenharmony_ci * 2: 1: mute audio 227562306a36Sopenharmony_ci * 12: 0: reset XC4000 227662306a36Sopenharmony_ci * 13: 1: audio input is line in (0: tuner) 227762306a36Sopenharmony_ci * 14: 0: FM radio 227862306a36Sopenharmony_ci * 16: 0: RF input is cable 227962306a36Sopenharmony_ci */ 228062306a36Sopenharmony_ci .input = { { 228162306a36Sopenharmony_ci .type = CX88_VMUX_TELEVISION, 228262306a36Sopenharmony_ci .vmux = 0, 228362306a36Sopenharmony_ci .gpio0 = 0x0403, 228462306a36Sopenharmony_ci .gpio1 = 0xF0D7, 228562306a36Sopenharmony_ci .gpio2 = 0x0101, 228662306a36Sopenharmony_ci .gpio3 = 0x0000, 228762306a36Sopenharmony_ci }, { 228862306a36Sopenharmony_ci .type = CX88_VMUX_CABLE, 228962306a36Sopenharmony_ci .vmux = 0, 229062306a36Sopenharmony_ci .gpio0 = 0x0403, 229162306a36Sopenharmony_ci .gpio1 = 0xF0D7, 229262306a36Sopenharmony_ci .gpio2 = 0x0100, 229362306a36Sopenharmony_ci .gpio3 = 0x0000, 229462306a36Sopenharmony_ci }, { 229562306a36Sopenharmony_ci .type = CX88_VMUX_COMPOSITE1, 229662306a36Sopenharmony_ci .vmux = 1, 229762306a36Sopenharmony_ci .gpio0 = 0x0403, /* was 0x0407 */ 229862306a36Sopenharmony_ci .gpio1 = 0xF0F7, 229962306a36Sopenharmony_ci .gpio2 = 0x0101, 230062306a36Sopenharmony_ci .gpio3 = 0x0000, 230162306a36Sopenharmony_ci }, { 230262306a36Sopenharmony_ci .type = CX88_VMUX_SVIDEO, 230362306a36Sopenharmony_ci .vmux = 2, 230462306a36Sopenharmony_ci .gpio0 = 0x0403, /* was 0x0407 */ 230562306a36Sopenharmony_ci .gpio1 = 0xF0F7, 230662306a36Sopenharmony_ci .gpio2 = 0x0101, 230762306a36Sopenharmony_ci .gpio3 = 0x0000, 230862306a36Sopenharmony_ci } }, 230962306a36Sopenharmony_ci .radio = { 231062306a36Sopenharmony_ci .type = CX88_RADIO, 231162306a36Sopenharmony_ci .gpio0 = 0x0403, 231262306a36Sopenharmony_ci .gpio1 = 0xF097, 231362306a36Sopenharmony_ci .gpio2 = 0x0100, 231462306a36Sopenharmony_ci .gpio3 = 0x0000, 231562306a36Sopenharmony_ci }, 231662306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 231762306a36Sopenharmony_ci }, 231862306a36Sopenharmony_ci [CX88_BOARD_PROF_7301] = { 231962306a36Sopenharmony_ci .name = "Prof 7301 DVB-S/S2", 232062306a36Sopenharmony_ci .tuner_type = UNSET, 232162306a36Sopenharmony_ci .radio_type = UNSET, 232262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 232362306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 232462306a36Sopenharmony_ci .input = { { 232562306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 232662306a36Sopenharmony_ci .vmux = 0, 232762306a36Sopenharmony_ci } }, 232862306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 232962306a36Sopenharmony_ci }, 233062306a36Sopenharmony_ci [CX88_BOARD_TWINHAN_VP1027_DVBS] = { 233162306a36Sopenharmony_ci .name = "Twinhan VP-1027 DVB-S", 233262306a36Sopenharmony_ci .tuner_type = UNSET, 233362306a36Sopenharmony_ci .radio_type = UNSET, 233462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 233562306a36Sopenharmony_ci .radio_addr = ADDR_UNSET, 233662306a36Sopenharmony_ci .input = { { 233762306a36Sopenharmony_ci .type = CX88_VMUX_DVB, 233862306a36Sopenharmony_ci .vmux = 0, 233962306a36Sopenharmony_ci } }, 234062306a36Sopenharmony_ci .mpeg = CX88_MPEG_DVB, 234162306a36Sopenharmony_ci }, 234262306a36Sopenharmony_ci}; 234362306a36Sopenharmony_ci 234462306a36Sopenharmony_ci/* ------------------------------------------------------------------ */ 234562306a36Sopenharmony_ci/* PCI subsystem IDs */ 234662306a36Sopenharmony_ci 234762306a36Sopenharmony_cistatic const struct cx88_subid cx88_subids[] = { 234862306a36Sopenharmony_ci { 234962306a36Sopenharmony_ci .subvendor = 0x0070, 235062306a36Sopenharmony_ci .subdevice = 0x3400, 235162306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE, 235262306a36Sopenharmony_ci }, { 235362306a36Sopenharmony_ci .subvendor = 0x0070, 235462306a36Sopenharmony_ci .subdevice = 0x3401, 235562306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE, 235662306a36Sopenharmony_ci }, { 235762306a36Sopenharmony_ci .subvendor = 0x14c7, 235862306a36Sopenharmony_ci .subdevice = 0x0106, 235962306a36Sopenharmony_ci .card = CX88_BOARD_GDI, 236062306a36Sopenharmony_ci }, { 236162306a36Sopenharmony_ci .subvendor = 0x14c7, 236262306a36Sopenharmony_ci .subdevice = 0x0107, /* with mpeg encoder */ 236362306a36Sopenharmony_ci .card = CX88_BOARD_GDI, 236462306a36Sopenharmony_ci }, { 236562306a36Sopenharmony_ci .subvendor = PCI_VENDOR_ID_ATI, 236662306a36Sopenharmony_ci .subdevice = 0x00f8, 236762306a36Sopenharmony_ci .card = CX88_BOARD_ATI_WONDER_PRO, 236862306a36Sopenharmony_ci }, { 236962306a36Sopenharmony_ci .subvendor = PCI_VENDOR_ID_ATI, 237062306a36Sopenharmony_ci .subdevice = 0x00f9, 237162306a36Sopenharmony_ci .card = CX88_BOARD_ATI_WONDER_PRO, 237262306a36Sopenharmony_ci }, { 237362306a36Sopenharmony_ci .subvendor = 0x107d, 237462306a36Sopenharmony_ci .subdevice = 0x6611, 237562306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST2000XP_EXPERT, 237662306a36Sopenharmony_ci }, { 237762306a36Sopenharmony_ci .subvendor = 0x107d, 237862306a36Sopenharmony_ci .subdevice = 0x6613, /* NTSC */ 237962306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST2000XP_EXPERT, 238062306a36Sopenharmony_ci }, { 238162306a36Sopenharmony_ci .subvendor = 0x107d, 238262306a36Sopenharmony_ci .subdevice = 0x6620, 238362306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DV2000, 238462306a36Sopenharmony_ci }, { 238562306a36Sopenharmony_ci .subvendor = 0x107d, 238662306a36Sopenharmony_ci .subdevice = 0x663b, 238762306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 238862306a36Sopenharmony_ci }, { 238962306a36Sopenharmony_ci .subvendor = 0x107d, 239062306a36Sopenharmony_ci .subdevice = 0x663c, 239162306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 239262306a36Sopenharmony_ci }, { 239362306a36Sopenharmony_ci .subvendor = 0x1461, 239462306a36Sopenharmony_ci .subdevice = 0x000b, 239562306a36Sopenharmony_ci .card = CX88_BOARD_AVERTV_STUDIO_303, 239662306a36Sopenharmony_ci }, { 239762306a36Sopenharmony_ci .subvendor = 0x1462, 239862306a36Sopenharmony_ci .subdevice = 0x8606, 239962306a36Sopenharmony_ci .card = CX88_BOARD_MSI_TVANYWHERE_MASTER, 240062306a36Sopenharmony_ci }, { 240162306a36Sopenharmony_ci .subvendor = 0x10fc, 240262306a36Sopenharmony_ci .subdevice = 0xd003, 240362306a36Sopenharmony_ci .card = CX88_BOARD_IODATA_GVVCP3PCI, 240462306a36Sopenharmony_ci }, { 240562306a36Sopenharmony_ci .subvendor = 0x1043, 240662306a36Sopenharmony_ci .subdevice = 0x4823, /* with mpeg encoder */ 240762306a36Sopenharmony_ci .card = CX88_BOARD_ASUS_PVR_416, 240862306a36Sopenharmony_ci }, { 240962306a36Sopenharmony_ci .subvendor = 0x17de, 241062306a36Sopenharmony_ci .subdevice = 0x08a6, 241162306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_DVB_T, 241262306a36Sopenharmony_ci }, { 241362306a36Sopenharmony_ci .subvendor = 0x18ac, 241462306a36Sopenharmony_ci .subdevice = 0xd810, 241562306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q, 241662306a36Sopenharmony_ci }, { 241762306a36Sopenharmony_ci .subvendor = 0x18ac, 241862306a36Sopenharmony_ci .subdevice = 0xd820, 241962306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T, 242062306a36Sopenharmony_ci }, { 242162306a36Sopenharmony_ci .subvendor = 0x18ac, 242262306a36Sopenharmony_ci .subdevice = 0xdb00, 242362306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1, 242462306a36Sopenharmony_ci }, { 242562306a36Sopenharmony_ci .subvendor = 0x0070, 242662306a36Sopenharmony_ci .subdevice = 0x9002, 242762306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_DVB_T1, 242862306a36Sopenharmony_ci }, { 242962306a36Sopenharmony_ci .subvendor = 0x14f1, 243062306a36Sopenharmony_ci .subdevice = 0x0187, 243162306a36Sopenharmony_ci .card = CX88_BOARD_CONEXANT_DVB_T1, 243262306a36Sopenharmony_ci }, { 243362306a36Sopenharmony_ci .subvendor = 0x1540, 243462306a36Sopenharmony_ci .subdevice = 0x2580, 243562306a36Sopenharmony_ci .card = CX88_BOARD_PROVIDEO_PV259, 243662306a36Sopenharmony_ci }, { 243762306a36Sopenharmony_ci .subvendor = 0x18ac, 243862306a36Sopenharmony_ci .subdevice = 0xdb10, 243962306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS, 244062306a36Sopenharmony_ci }, { 244162306a36Sopenharmony_ci .subvendor = 0x1554, 244262306a36Sopenharmony_ci .subdevice = 0x4811, 244362306a36Sopenharmony_ci .card = CX88_BOARD_PIXELVIEW, 244462306a36Sopenharmony_ci }, { 244562306a36Sopenharmony_ci .subvendor = 0x7063, 244662306a36Sopenharmony_ci .subdevice = 0x3000, /* HD-3000 card */ 244762306a36Sopenharmony_ci .card = CX88_BOARD_PCHDTV_HD3000, 244862306a36Sopenharmony_ci }, { 244962306a36Sopenharmony_ci .subvendor = 0x17de, 245062306a36Sopenharmony_ci .subdevice = 0xa8a6, 245162306a36Sopenharmony_ci .card = CX88_BOARD_DNTV_LIVE_DVB_T, 245262306a36Sopenharmony_ci }, { 245362306a36Sopenharmony_ci .subvendor = 0x0070, 245462306a36Sopenharmony_ci .subdevice = 0x2801, 245562306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_ROSLYN, 245662306a36Sopenharmony_ci }, { 245762306a36Sopenharmony_ci .subvendor = 0x14f1, 245862306a36Sopenharmony_ci .subdevice = 0x0342, 245962306a36Sopenharmony_ci .card = CX88_BOARD_DIGITALLOGIC_MEC, 246062306a36Sopenharmony_ci }, { 246162306a36Sopenharmony_ci .subvendor = 0x10fc, 246262306a36Sopenharmony_ci .subdevice = 0xd035, 246362306a36Sopenharmony_ci .card = CX88_BOARD_IODATA_GVBCTV7E, 246462306a36Sopenharmony_ci }, { 246562306a36Sopenharmony_ci .subvendor = 0x1421, 246662306a36Sopenharmony_ci .subdevice = 0x0334, 246762306a36Sopenharmony_ci .card = CX88_BOARD_ADSTECH_DVB_T_PCI, 246862306a36Sopenharmony_ci }, { 246962306a36Sopenharmony_ci .subvendor = 0x153b, 247062306a36Sopenharmony_ci .subdevice = 0x1166, 247162306a36Sopenharmony_ci .card = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1, 247262306a36Sopenharmony_ci }, { 247362306a36Sopenharmony_ci .subvendor = 0x18ac, 247462306a36Sopenharmony_ci .subdevice = 0xd500, 247562306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD, 247662306a36Sopenharmony_ci }, { 247762306a36Sopenharmony_ci .subvendor = 0x1461, 247862306a36Sopenharmony_ci .subdevice = 0x8011, 247962306a36Sopenharmony_ci .card = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550, 248062306a36Sopenharmony_ci }, { 248162306a36Sopenharmony_ci .subvendor = PCI_VENDOR_ID_ATI, 248262306a36Sopenharmony_ci .subdevice = 0xa101, 248362306a36Sopenharmony_ci .card = CX88_BOARD_ATI_HDTVWONDER, 248462306a36Sopenharmony_ci }, { 248562306a36Sopenharmony_ci .subvendor = 0x107d, 248662306a36Sopenharmony_ci .subdevice = 0x665f, 248762306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DTV1000, 248862306a36Sopenharmony_ci }, { 248962306a36Sopenharmony_ci .subvendor = 0x1461, 249062306a36Sopenharmony_ci .subdevice = 0x000a, 249162306a36Sopenharmony_ci .card = CX88_BOARD_AVERTV_303, 249262306a36Sopenharmony_ci }, { 249362306a36Sopenharmony_ci .subvendor = 0x0070, 249462306a36Sopenharmony_ci .subdevice = 0x9200, 249562306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_NOVASE2_S1, 249662306a36Sopenharmony_ci }, { 249762306a36Sopenharmony_ci .subvendor = 0x0070, 249862306a36Sopenharmony_ci .subdevice = 0x9201, 249962306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1, 250062306a36Sopenharmony_ci }, { 250162306a36Sopenharmony_ci .subvendor = 0x0070, 250262306a36Sopenharmony_ci .subdevice = 0x9202, 250362306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1, 250462306a36Sopenharmony_ci }, { 250562306a36Sopenharmony_ci .subvendor = 0x17de, 250662306a36Sopenharmony_ci .subdevice = 0x08b2, 250762306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_DVBS_100, 250862306a36Sopenharmony_ci }, { 250962306a36Sopenharmony_ci .subvendor = 0x0070, 251062306a36Sopenharmony_ci .subdevice = 0x9400, 251162306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1100, 251262306a36Sopenharmony_ci }, { 251362306a36Sopenharmony_ci .subvendor = 0x0070, 251462306a36Sopenharmony_ci .subdevice = 0x9402, 251562306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1100, 251662306a36Sopenharmony_ci }, { 251762306a36Sopenharmony_ci .subvendor = 0x0070, 251862306a36Sopenharmony_ci .subdevice = 0x9800, 251962306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1100LP, 252062306a36Sopenharmony_ci }, { 252162306a36Sopenharmony_ci .subvendor = 0x0070, 252262306a36Sopenharmony_ci .subdevice = 0x9802, 252362306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1100LP, 252462306a36Sopenharmony_ci }, { 252562306a36Sopenharmony_ci .subvendor = 0x0070, 252662306a36Sopenharmony_ci .subdevice = 0x9001, 252762306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_DVB_T1, 252862306a36Sopenharmony_ci }, { 252962306a36Sopenharmony_ci .subvendor = 0x1822, 253062306a36Sopenharmony_ci .subdevice = 0x0025, 253162306a36Sopenharmony_ci .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO, 253262306a36Sopenharmony_ci }, { 253362306a36Sopenharmony_ci .subvendor = 0x17de, 253462306a36Sopenharmony_ci .subdevice = 0x08a1, 253562306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_DVB_T_CX22702, 253662306a36Sopenharmony_ci }, { 253762306a36Sopenharmony_ci .subvendor = 0x18ac, 253862306a36Sopenharmony_ci .subdevice = 0xdb50, 253962306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL, 254062306a36Sopenharmony_ci }, { 254162306a36Sopenharmony_ci .subvendor = 0x18ac, 254262306a36Sopenharmony_ci .subdevice = 0xdb54, 254362306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL, 254462306a36Sopenharmony_ci /* Re-branded DViCO: DigitalNow DVB-T Dual */ 254562306a36Sopenharmony_ci }, { 254662306a36Sopenharmony_ci .subvendor = 0x18ac, 254762306a36Sopenharmony_ci .subdevice = 0xdb11, 254862306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS, 254962306a36Sopenharmony_ci /* Re-branded DViCO: UltraView DVB-T Plus */ 255062306a36Sopenharmony_ci }, { 255162306a36Sopenharmony_ci .subvendor = 0x18ac, 255262306a36Sopenharmony_ci .subdevice = 0xdb30, 255362306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO, 255462306a36Sopenharmony_ci }, { 255562306a36Sopenharmony_ci .subvendor = 0x17de, 255662306a36Sopenharmony_ci .subdevice = 0x0840, 255762306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT, 255862306a36Sopenharmony_ci }, { 255962306a36Sopenharmony_ci .subvendor = 0x1421, 256062306a36Sopenharmony_ci .subdevice = 0x0305, 256162306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT, 256262306a36Sopenharmony_ci }, { 256362306a36Sopenharmony_ci .subvendor = 0x18ac, 256462306a36Sopenharmony_ci .subdevice = 0xdb40, 256562306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID, 256662306a36Sopenharmony_ci }, { 256762306a36Sopenharmony_ci .subvendor = 0x18ac, 256862306a36Sopenharmony_ci .subdevice = 0xdb44, 256962306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID, 257062306a36Sopenharmony_ci }, { 257162306a36Sopenharmony_ci .subvendor = 0x7063, 257262306a36Sopenharmony_ci .subdevice = 0x5500, 257362306a36Sopenharmony_ci .card = CX88_BOARD_PCHDTV_HD5500, 257462306a36Sopenharmony_ci }, { 257562306a36Sopenharmony_ci .subvendor = 0x17de, 257662306a36Sopenharmony_ci .subdevice = 0x0841, 257762306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_MCE200_DELUXE, 257862306a36Sopenharmony_ci }, { 257962306a36Sopenharmony_ci .subvendor = 0x1822, 258062306a36Sopenharmony_ci .subdevice = 0x0019, 258162306a36Sopenharmony_ci .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO, 258262306a36Sopenharmony_ci }, { 258362306a36Sopenharmony_ci .subvendor = 0x1554, 258462306a36Sopenharmony_ci .subdevice = 0x4813, 258562306a36Sopenharmony_ci .card = CX88_BOARD_PIXELVIEW_PLAYTV_P7000, 258662306a36Sopenharmony_ci }, { 258762306a36Sopenharmony_ci .subvendor = 0x14f1, 258862306a36Sopenharmony_ci .subdevice = 0x0842, 258962306a36Sopenharmony_ci .card = CX88_BOARD_NPGTECH_REALTV_TOP10FM, 259062306a36Sopenharmony_ci }, { 259162306a36Sopenharmony_ci .subvendor = 0x107d, 259262306a36Sopenharmony_ci .subdevice = 0x665e, 259362306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DTV2000H, 259462306a36Sopenharmony_ci }, { 259562306a36Sopenharmony_ci .subvendor = 0x107d, 259662306a36Sopenharmony_ci .subdevice = 0x6f2b, 259762306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DTV2000H_J, 259862306a36Sopenharmony_ci }, { 259962306a36Sopenharmony_ci .subvendor = 0x18ac, 260062306a36Sopenharmony_ci .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */ 260162306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q, 260262306a36Sopenharmony_ci }, { 260362306a36Sopenharmony_ci .subvendor = 0x14f1, 260462306a36Sopenharmony_ci .subdevice = 0x0084, 260562306a36Sopenharmony_ci .card = CX88_BOARD_GENIATECH_DVBS, 260662306a36Sopenharmony_ci }, { 260762306a36Sopenharmony_ci .subvendor = 0x0070, 260862306a36Sopenharmony_ci .subdevice = 0x1404, 260962306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR3000, 261062306a36Sopenharmony_ci }, { 261162306a36Sopenharmony_ci .subvendor = 0x18ac, 261262306a36Sopenharmony_ci .subdevice = 0xdc00, 261362306a36Sopenharmony_ci .card = CX88_BOARD_SAMSUNG_SMT_7020, 261462306a36Sopenharmony_ci }, { 261562306a36Sopenharmony_ci .subvendor = 0x18ac, 261662306a36Sopenharmony_ci .subdevice = 0xdccd, 261762306a36Sopenharmony_ci .card = CX88_BOARD_SAMSUNG_SMT_7020, 261862306a36Sopenharmony_ci }, { 261962306a36Sopenharmony_ci .subvendor = 0x1461, 262062306a36Sopenharmony_ci .subdevice = 0xc111, /* AverMedia M150-D */ 262162306a36Sopenharmony_ci /* This board is known to work with the ASUS PVR416 config */ 262262306a36Sopenharmony_ci .card = CX88_BOARD_ASUS_PVR_416, 262362306a36Sopenharmony_ci }, { 262462306a36Sopenharmony_ci .subvendor = 0xc180, 262562306a36Sopenharmony_ci .subdevice = 0xc980, 262662306a36Sopenharmony_ci .card = CX88_BOARD_TE_DTV_250_OEM_SWANN, 262762306a36Sopenharmony_ci }, { 262862306a36Sopenharmony_ci .subvendor = 0x0070, 262962306a36Sopenharmony_ci .subdevice = 0x9600, 263062306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1300, 263162306a36Sopenharmony_ci }, { 263262306a36Sopenharmony_ci .subvendor = 0x0070, 263362306a36Sopenharmony_ci .subdevice = 0x9601, 263462306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1300, 263562306a36Sopenharmony_ci }, { 263662306a36Sopenharmony_ci .subvendor = 0x0070, 263762306a36Sopenharmony_ci .subdevice = 0x9602, 263862306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR1300, 263962306a36Sopenharmony_ci }, { 264062306a36Sopenharmony_ci .subvendor = 0x107d, 264162306a36Sopenharmony_ci .subdevice = 0x6632, 264262306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 264362306a36Sopenharmony_ci }, { 264462306a36Sopenharmony_ci .subvendor = 0x12ab, 264562306a36Sopenharmony_ci .subdevice = 0x2300, /* Club3D Zap TV2100 */ 264662306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_DVB_T_CX22702, 264762306a36Sopenharmony_ci }, { 264862306a36Sopenharmony_ci .subvendor = 0x0070, 264962306a36Sopenharmony_ci .subdevice = 0x9000, 265062306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_DVB_T1, 265162306a36Sopenharmony_ci }, { 265262306a36Sopenharmony_ci .subvendor = 0x0070, 265362306a36Sopenharmony_ci .subdevice = 0x1400, 265462306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR3000, 265562306a36Sopenharmony_ci }, { 265662306a36Sopenharmony_ci .subvendor = 0x0070, 265762306a36Sopenharmony_ci .subdevice = 0x1401, 265862306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR3000, 265962306a36Sopenharmony_ci }, { 266062306a36Sopenharmony_ci .subvendor = 0x0070, 266162306a36Sopenharmony_ci .subdevice = 0x1402, 266262306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR3000, 266362306a36Sopenharmony_ci }, { 266462306a36Sopenharmony_ci .subvendor = 0x1421, 266562306a36Sopenharmony_ci .subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */ 266662306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_DVBS_100, 266762306a36Sopenharmony_ci }, { 266862306a36Sopenharmony_ci .subvendor = 0x1421, 266962306a36Sopenharmony_ci .subdevice = 0x0390, 267062306a36Sopenharmony_ci .card = CX88_BOARD_ADSTECH_PTV_390, 267162306a36Sopenharmony_ci }, { 267262306a36Sopenharmony_ci .subvendor = 0x11bd, 267362306a36Sopenharmony_ci .subdevice = 0x0051, 267462306a36Sopenharmony_ci .card = CX88_BOARD_PINNACLE_PCTV_HD_800i, 267562306a36Sopenharmony_ci }, { 267662306a36Sopenharmony_ci .subvendor = 0x18ac, 267762306a36Sopenharmony_ci .subdevice = 0xd530, 267862306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO, 267962306a36Sopenharmony_ci }, { 268062306a36Sopenharmony_ci .subvendor = 0x12ab, 268162306a36Sopenharmony_ci .subdevice = 0x1788, 268262306a36Sopenharmony_ci .card = CX88_BOARD_PINNACLE_HYBRID_PCTV, 268362306a36Sopenharmony_ci }, { 268462306a36Sopenharmony_ci .subvendor = 0x14f1, 268562306a36Sopenharmony_ci .subdevice = 0xea3d, 268662306a36Sopenharmony_ci .card = CX88_BOARD_POWERCOLOR_REAL_ANGEL, 268762306a36Sopenharmony_ci }, { 268862306a36Sopenharmony_ci .subvendor = 0x107d, 268962306a36Sopenharmony_ci .subdevice = 0x6f18, 269062306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 269162306a36Sopenharmony_ci }, { 269262306a36Sopenharmony_ci /* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */ 269362306a36Sopenharmony_ci .subvendor = 0x14f1, 269462306a36Sopenharmony_ci .subdevice = 0x8852, 269562306a36Sopenharmony_ci .card = CX88_BOARD_GENIATECH_X8000_MT, 269662306a36Sopenharmony_ci }, { 269762306a36Sopenharmony_ci .subvendor = 0x18ac, 269862306a36Sopenharmony_ci .subdevice = 0xd610, 269962306a36Sopenharmony_ci .card = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD, 270062306a36Sopenharmony_ci }, { 270162306a36Sopenharmony_ci .subvendor = 0x1554, 270262306a36Sopenharmony_ci .subdevice = 0x4935, 270362306a36Sopenharmony_ci .card = CX88_BOARD_PROLINK_PV_8000GT, 270462306a36Sopenharmony_ci }, { 270562306a36Sopenharmony_ci .subvendor = 0x1554, 270662306a36Sopenharmony_ci .subdevice = 0x4976, 270762306a36Sopenharmony_ci .card = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME, 270862306a36Sopenharmony_ci }, { 270962306a36Sopenharmony_ci .subvendor = 0x17de, 271062306a36Sopenharmony_ci .subdevice = 0x08c1, 271162306a36Sopenharmony_ci .card = CX88_BOARD_KWORLD_ATSC_120, 271262306a36Sopenharmony_ci }, { 271362306a36Sopenharmony_ci .subvendor = 0x0070, 271462306a36Sopenharmony_ci .subdevice = 0x6900, 271562306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR4000, 271662306a36Sopenharmony_ci }, { 271762306a36Sopenharmony_ci .subvendor = 0x0070, 271862306a36Sopenharmony_ci .subdevice = 0x6904, 271962306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR4000, 272062306a36Sopenharmony_ci }, { 272162306a36Sopenharmony_ci .subvendor = 0x0070, 272262306a36Sopenharmony_ci .subdevice = 0x6902, 272362306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR4000, 272462306a36Sopenharmony_ci }, { 272562306a36Sopenharmony_ci .subvendor = 0x0070, 272662306a36Sopenharmony_ci .subdevice = 0x6905, 272762306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE, 272862306a36Sopenharmony_ci }, { 272962306a36Sopenharmony_ci .subvendor = 0x0070, 273062306a36Sopenharmony_ci .subdevice = 0x6906, 273162306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE, 273262306a36Sopenharmony_ci }, { 273362306a36Sopenharmony_ci .subvendor = 0xd420, 273462306a36Sopenharmony_ci .subdevice = 0x9022, 273562306a36Sopenharmony_ci .card = CX88_BOARD_TEVII_S420, 273662306a36Sopenharmony_ci }, { 273762306a36Sopenharmony_ci .subvendor = 0xd460, 273862306a36Sopenharmony_ci .subdevice = 0x9022, 273962306a36Sopenharmony_ci .card = CX88_BOARD_TEVII_S460, 274062306a36Sopenharmony_ci }, { 274162306a36Sopenharmony_ci .subvendor = 0xd464, 274262306a36Sopenharmony_ci .subdevice = 0x9022, 274362306a36Sopenharmony_ci .card = CX88_BOARD_TEVII_S464, 274462306a36Sopenharmony_ci }, { 274562306a36Sopenharmony_ci .subvendor = 0xA044, 274662306a36Sopenharmony_ci .subdevice = 0x2011, 274762306a36Sopenharmony_ci .card = CX88_BOARD_OMICOM_SS4_PCI, 274862306a36Sopenharmony_ci }, { 274962306a36Sopenharmony_ci .subvendor = 0x8910, 275062306a36Sopenharmony_ci .subdevice = 0x8888, 275162306a36Sopenharmony_ci .card = CX88_BOARD_TBS_8910, 275262306a36Sopenharmony_ci }, { 275362306a36Sopenharmony_ci .subvendor = 0x8920, 275462306a36Sopenharmony_ci .subdevice = 0x8888, 275562306a36Sopenharmony_ci .card = CX88_BOARD_TBS_8920, 275662306a36Sopenharmony_ci }, { 275762306a36Sopenharmony_ci .subvendor = 0xb022, 275862306a36Sopenharmony_ci .subdevice = 0x3022, 275962306a36Sopenharmony_ci .card = CX88_BOARD_PROF_6200, 276062306a36Sopenharmony_ci }, { 276162306a36Sopenharmony_ci .subvendor = 0xB033, 276262306a36Sopenharmony_ci .subdevice = 0x3033, 276362306a36Sopenharmony_ci .card = CX88_BOARD_PROF_7300, 276462306a36Sopenharmony_ci }, { 276562306a36Sopenharmony_ci .subvendor = 0xb200, 276662306a36Sopenharmony_ci .subdevice = 0x4200, 276762306a36Sopenharmony_ci .card = CX88_BOARD_SATTRADE_ST4200, 276862306a36Sopenharmony_ci }, { 276962306a36Sopenharmony_ci .subvendor = 0x153b, 277062306a36Sopenharmony_ci .subdevice = 0x1177, 277162306a36Sopenharmony_ci .card = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII, 277262306a36Sopenharmony_ci }, { 277362306a36Sopenharmony_ci .subvendor = 0x0070, 277462306a36Sopenharmony_ci .subdevice = 0x9290, 277562306a36Sopenharmony_ci .card = CX88_BOARD_HAUPPAUGE_IRONLY, 277662306a36Sopenharmony_ci }, { 277762306a36Sopenharmony_ci .subvendor = 0x107d, 277862306a36Sopenharmony_ci .subdevice = 0x6654, 277962306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DTV1800H, 278062306a36Sopenharmony_ci }, { 278162306a36Sopenharmony_ci /* WinFast DTV1800 H with XC4000 tuner */ 278262306a36Sopenharmony_ci .subvendor = 0x107d, 278362306a36Sopenharmony_ci .subdevice = 0x6f38, 278462306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DTV1800H_XC4000, 278562306a36Sopenharmony_ci }, { 278662306a36Sopenharmony_ci .subvendor = 0x107d, 278762306a36Sopenharmony_ci .subdevice = 0x6f42, 278862306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DTV2000H_PLUS, 278962306a36Sopenharmony_ci }, { 279062306a36Sopenharmony_ci /* PVR2000 PAL Model [107d:6630] */ 279162306a36Sopenharmony_ci .subvendor = 0x107d, 279262306a36Sopenharmony_ci .subdevice = 0x6630, 279362306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 279462306a36Sopenharmony_ci }, { 279562306a36Sopenharmony_ci /* PVR2000 PAL Model [107d:6638] */ 279662306a36Sopenharmony_ci .subvendor = 0x107d, 279762306a36Sopenharmony_ci .subdevice = 0x6638, 279862306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 279962306a36Sopenharmony_ci }, { 280062306a36Sopenharmony_ci /* PVR2000 NTSC Model [107d:6631] */ 280162306a36Sopenharmony_ci .subvendor = 0x107d, 280262306a36Sopenharmony_ci .subdevice = 0x6631, 280362306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 280462306a36Sopenharmony_ci }, { 280562306a36Sopenharmony_ci /* PVR2000 NTSC Model [107d:6637] */ 280662306a36Sopenharmony_ci .subvendor = 0x107d, 280762306a36Sopenharmony_ci .subdevice = 0x6637, 280862306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 280962306a36Sopenharmony_ci }, { 281062306a36Sopenharmony_ci /* PVR2000 NTSC Model [107d:663d] */ 281162306a36Sopenharmony_ci .subvendor = 0x107d, 281262306a36Sopenharmony_ci .subdevice = 0x663d, 281362306a36Sopenharmony_ci .card = CX88_BOARD_LEADTEK_PVR2000, 281462306a36Sopenharmony_ci }, { 281562306a36Sopenharmony_ci /* DV2000 NTSC Model [107d:6621] */ 281662306a36Sopenharmony_ci .subvendor = 0x107d, 281762306a36Sopenharmony_ci .subdevice = 0x6621, 281862306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_DV2000, 281962306a36Sopenharmony_ci }, { 282062306a36Sopenharmony_ci /* TV2000 XP Global [107d:6618] */ 282162306a36Sopenharmony_ci .subvendor = 0x107d, 282262306a36Sopenharmony_ci .subdevice = 0x6618, 282362306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 282462306a36Sopenharmony_ci }, { 282562306a36Sopenharmony_ci /* TV2000 XP Global [107d:6618] */ 282662306a36Sopenharmony_ci .subvendor = 0x107d, 282762306a36Sopenharmony_ci .subdevice = 0x6619, 282862306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL, 282962306a36Sopenharmony_ci }, { 283062306a36Sopenharmony_ci /* WinFast TV2000 XP Global with XC4000 tuner */ 283162306a36Sopenharmony_ci .subvendor = 0x107d, 283262306a36Sopenharmony_ci .subdevice = 0x6f36, 283362306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36, 283462306a36Sopenharmony_ci }, { 283562306a36Sopenharmony_ci /* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */ 283662306a36Sopenharmony_ci .subvendor = 0x107d, 283762306a36Sopenharmony_ci .subdevice = 0x6f43, 283862306a36Sopenharmony_ci .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43, 283962306a36Sopenharmony_ci }, { 284062306a36Sopenharmony_ci .subvendor = 0xb034, 284162306a36Sopenharmony_ci .subdevice = 0x3034, 284262306a36Sopenharmony_ci .card = CX88_BOARD_PROF_7301, 284362306a36Sopenharmony_ci }, { 284462306a36Sopenharmony_ci .subvendor = 0x1822, 284562306a36Sopenharmony_ci .subdevice = 0x0023, 284662306a36Sopenharmony_ci .card = CX88_BOARD_TWINHAN_VP1027_DVBS, 284762306a36Sopenharmony_ci }, 284862306a36Sopenharmony_ci}; 284962306a36Sopenharmony_ci 285062306a36Sopenharmony_ci/* 285162306a36Sopenharmony_ci * some leadtek specific stuff 285262306a36Sopenharmony_ci */ 285362306a36Sopenharmony_cistatic void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) 285462306a36Sopenharmony_ci{ 285562306a36Sopenharmony_ci if (eeprom_data[4] != 0x7d || 285662306a36Sopenharmony_ci eeprom_data[5] != 0x10 || 285762306a36Sopenharmony_ci eeprom_data[7] != 0x66) { 285862306a36Sopenharmony_ci pr_warn("Leadtek eeprom invalid.\n"); 285962306a36Sopenharmony_ci return; 286062306a36Sopenharmony_ci } 286162306a36Sopenharmony_ci 286262306a36Sopenharmony_ci /* Terry Wu <terrywu2009@gmail.com> */ 286362306a36Sopenharmony_ci switch (eeprom_data[6]) { 286462306a36Sopenharmony_ci case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */ 286562306a36Sopenharmony_ci case 0x21: /* SSID 6621 for DV2000 NTSC Model */ 286662306a36Sopenharmony_ci case 0x31: /* SSID 6631 for PVR2000 NTSC Model */ 286762306a36Sopenharmony_ci case 0x37: /* SSID 6637 for PVR2000 NTSC Model */ 286862306a36Sopenharmony_ci case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */ 286962306a36Sopenharmony_ci core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3; 287062306a36Sopenharmony_ci break; 287162306a36Sopenharmony_ci default: 287262306a36Sopenharmony_ci core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3; 287362306a36Sopenharmony_ci break; 287462306a36Sopenharmony_ci } 287562306a36Sopenharmony_ci 287662306a36Sopenharmony_ci pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n", 287762306a36Sopenharmony_ci core->board.tuner_type, eeprom_data[0]); 287862306a36Sopenharmony_ci} 287962306a36Sopenharmony_ci 288062306a36Sopenharmony_cistatic void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data) 288162306a36Sopenharmony_ci{ 288262306a36Sopenharmony_ci struct tveeprom tv; 288362306a36Sopenharmony_ci 288462306a36Sopenharmony_ci tveeprom_hauppauge_analog(&tv, eeprom_data); 288562306a36Sopenharmony_ci core->board.tuner_type = tv.tuner_type; 288662306a36Sopenharmony_ci core->tuner_formats = tv.tuner_formats; 288762306a36Sopenharmony_ci core->board.radio.type = tv.has_radio ? CX88_RADIO : 0; 288862306a36Sopenharmony_ci core->model = tv.model; 288962306a36Sopenharmony_ci 289062306a36Sopenharmony_ci /* Make sure we support the board model */ 289162306a36Sopenharmony_ci switch (tv.model) { 289262306a36Sopenharmony_ci case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */ 289362306a36Sopenharmony_ci case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */ 289462306a36Sopenharmony_ci case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */ 289562306a36Sopenharmony_ci case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */ 289662306a36Sopenharmony_ci case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */ 289762306a36Sopenharmony_ci case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */ 289862306a36Sopenharmony_ci case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */ 289962306a36Sopenharmony_ci case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */ 290062306a36Sopenharmony_ci case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */ 290162306a36Sopenharmony_ci case 28552: /* WinTV-PVR 'Roslyn' (No IR) */ 290262306a36Sopenharmony_ci case 34519: /* WinTV-PCI-FM */ 290362306a36Sopenharmony_ci case 69009: 290462306a36Sopenharmony_ci /* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */ 290562306a36Sopenharmony_ci case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */ 290662306a36Sopenharmony_ci case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */ 290762306a36Sopenharmony_ci case 69559: 290862306a36Sopenharmony_ci /* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */ 290962306a36Sopenharmony_ci case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */ 291062306a36Sopenharmony_ci case 90002: /* Nova-T-PCI (9002) */ 291162306a36Sopenharmony_ci case 92001: /* Nova-S-Plus (Video and IR) */ 291262306a36Sopenharmony_ci case 92002: /* Nova-S-Plus (Video and IR) */ 291362306a36Sopenharmony_ci case 90003: /* Nova-T-PCI (9002 No RF out) */ 291462306a36Sopenharmony_ci case 90500: /* Nova-T-PCI (oem) */ 291562306a36Sopenharmony_ci case 90501: /* Nova-T-PCI (oem/IR) */ 291662306a36Sopenharmony_ci case 92000: /* Nova-SE2 (OEM, No Video or IR) */ 291762306a36Sopenharmony_ci case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */ 291862306a36Sopenharmony_ci case 94009: /* WinTV-HVR1100 (Video and IR Retail) */ 291962306a36Sopenharmony_ci case 94501: /* WinTV-HVR1100 (Video and IR OEM) */ 292062306a36Sopenharmony_ci case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */ 292162306a36Sopenharmony_ci case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */ 292262306a36Sopenharmony_ci case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */ 292362306a36Sopenharmony_ci case 96569: /* WinTV-HVR1300 () */ 292462306a36Sopenharmony_ci case 96659: /* WinTV-HVR1300 () */ 292562306a36Sopenharmony_ci case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */ 292662306a36Sopenharmony_ci /* known */ 292762306a36Sopenharmony_ci break; 292862306a36Sopenharmony_ci case CX88_BOARD_SAMSUNG_SMT_7020: 292962306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x008989FF); 293062306a36Sopenharmony_ci break; 293162306a36Sopenharmony_ci default: 293262306a36Sopenharmony_ci pr_warn("warning: unknown hauppauge model #%d\n", tv.model); 293362306a36Sopenharmony_ci break; 293462306a36Sopenharmony_ci } 293562306a36Sopenharmony_ci 293662306a36Sopenharmony_ci pr_info("hauppauge eeprom: model=%d\n", tv.model); 293762306a36Sopenharmony_ci} 293862306a36Sopenharmony_ci 293962306a36Sopenharmony_ci/* 294062306a36Sopenharmony_ci * some GDI (was: Modular Technology) specific stuff 294162306a36Sopenharmony_ci */ 294262306a36Sopenharmony_ci 294362306a36Sopenharmony_cistatic const struct { 294462306a36Sopenharmony_ci int id; 294562306a36Sopenharmony_ci int fm; 294662306a36Sopenharmony_ci const char *name; 294762306a36Sopenharmony_ci} gdi_tuner[] = { 294862306a36Sopenharmony_ci [0x01] = { .id = UNSET, 294962306a36Sopenharmony_ci .name = "NTSC_M" }, 295062306a36Sopenharmony_ci [0x02] = { .id = UNSET, 295162306a36Sopenharmony_ci .name = "PAL_B" }, 295262306a36Sopenharmony_ci [0x03] = { .id = UNSET, 295362306a36Sopenharmony_ci .name = "PAL_I" }, 295462306a36Sopenharmony_ci [0x04] = { .id = UNSET, 295562306a36Sopenharmony_ci .name = "PAL_D" }, 295662306a36Sopenharmony_ci [0x05] = { .id = UNSET, 295762306a36Sopenharmony_ci .name = "SECAM" }, 295862306a36Sopenharmony_ci 295962306a36Sopenharmony_ci [0x10] = { .id = UNSET, 296062306a36Sopenharmony_ci .fm = 1, 296162306a36Sopenharmony_ci .name = "TEMIC_4049" }, 296262306a36Sopenharmony_ci [0x11] = { .id = TUNER_TEMIC_4136FY5, 296362306a36Sopenharmony_ci .name = "TEMIC_4136" }, 296462306a36Sopenharmony_ci [0x12] = { .id = UNSET, 296562306a36Sopenharmony_ci .name = "TEMIC_4146" }, 296662306a36Sopenharmony_ci 296762306a36Sopenharmony_ci [0x20] = { .id = TUNER_PHILIPS_FQ1216ME, 296862306a36Sopenharmony_ci .fm = 1, 296962306a36Sopenharmony_ci .name = "PHILIPS_FQ1216_MK3" }, 297062306a36Sopenharmony_ci [0x21] = { .id = UNSET, .fm = 1, 297162306a36Sopenharmony_ci .name = "PHILIPS_FQ1236_MK3" }, 297262306a36Sopenharmony_ci [0x22] = { .id = UNSET, 297362306a36Sopenharmony_ci .name = "PHILIPS_FI1236_MK3" }, 297462306a36Sopenharmony_ci [0x23] = { .id = UNSET, 297562306a36Sopenharmony_ci .name = "PHILIPS_FI1216_MK3" }, 297662306a36Sopenharmony_ci}; 297762306a36Sopenharmony_ci 297862306a36Sopenharmony_cistatic void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data) 297962306a36Sopenharmony_ci{ 298062306a36Sopenharmony_ci const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner)) 298162306a36Sopenharmony_ci ? gdi_tuner[eeprom_data[0x0d]].name : NULL; 298262306a36Sopenharmony_ci 298362306a36Sopenharmony_ci pr_info("GDI: tuner=%s\n", name ? name : "unknown"); 298462306a36Sopenharmony_ci if (!name) 298562306a36Sopenharmony_ci return; 298662306a36Sopenharmony_ci core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id; 298762306a36Sopenharmony_ci core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ? 298862306a36Sopenharmony_ci CX88_RADIO : 0; 298962306a36Sopenharmony_ci} 299062306a36Sopenharmony_ci 299162306a36Sopenharmony_ci/* 299262306a36Sopenharmony_ci * some Divco specific stuff 299362306a36Sopenharmony_ci */ 299462306a36Sopenharmony_cistatic int cx88_dvico_xc2028_callback(struct cx88_core *core, 299562306a36Sopenharmony_ci int command, int arg) 299662306a36Sopenharmony_ci{ 299762306a36Sopenharmony_ci switch (command) { 299862306a36Sopenharmony_ci case XC2028_TUNER_RESET: 299962306a36Sopenharmony_ci switch (core->boardnr) { 300062306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: 300162306a36Sopenharmony_ci /* GPIO-4 xc3028 tuner */ 300262306a36Sopenharmony_ci 300362306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00001000); 300462306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000010); 300562306a36Sopenharmony_ci msleep(100); 300662306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000010); 300762306a36Sopenharmony_ci msleep(100); 300862306a36Sopenharmony_ci break; 300962306a36Sopenharmony_ci default: 301062306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x101000); 301162306a36Sopenharmony_ci mdelay(5); 301262306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x101010); 301362306a36Sopenharmony_ci } 301462306a36Sopenharmony_ci break; 301562306a36Sopenharmony_ci default: 301662306a36Sopenharmony_ci return -EINVAL; 301762306a36Sopenharmony_ci } 301862306a36Sopenharmony_ci 301962306a36Sopenharmony_ci return 0; 302062306a36Sopenharmony_ci} 302162306a36Sopenharmony_ci 302262306a36Sopenharmony_ci/* 302362306a36Sopenharmony_ci * some Geniatech specific stuff 302462306a36Sopenharmony_ci */ 302562306a36Sopenharmony_ci 302662306a36Sopenharmony_cistatic int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core, 302762306a36Sopenharmony_ci int command, int mode) 302862306a36Sopenharmony_ci{ 302962306a36Sopenharmony_ci switch (command) { 303062306a36Sopenharmony_ci case XC2028_TUNER_RESET: 303162306a36Sopenharmony_ci switch (INPUT(core->input).type) { 303262306a36Sopenharmony_ci case CX88_RADIO: 303362306a36Sopenharmony_ci break; 303462306a36Sopenharmony_ci case CX88_VMUX_DVB: 303562306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x030302); 303662306a36Sopenharmony_ci mdelay(50); 303762306a36Sopenharmony_ci break; 303862306a36Sopenharmony_ci default: 303962306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x030301); 304062306a36Sopenharmony_ci mdelay(50); 304162306a36Sopenharmony_ci } 304262306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x101010); 304362306a36Sopenharmony_ci mdelay(50); 304462306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x101000); 304562306a36Sopenharmony_ci mdelay(50); 304662306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x101010); 304762306a36Sopenharmony_ci mdelay(50); 304862306a36Sopenharmony_ci return 0; 304962306a36Sopenharmony_ci } 305062306a36Sopenharmony_ci return -EINVAL; 305162306a36Sopenharmony_ci} 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_cistatic int cx88_xc3028_winfast1800h_callback(struct cx88_core *core, 305462306a36Sopenharmony_ci int command, int arg) 305562306a36Sopenharmony_ci{ 305662306a36Sopenharmony_ci switch (command) { 305762306a36Sopenharmony_ci case XC2028_TUNER_RESET: 305862306a36Sopenharmony_ci /* GPIO 12 (xc3028 tuner reset) */ 305962306a36Sopenharmony_ci cx_set(MO_GP1_IO, 0x1010); 306062306a36Sopenharmony_ci mdelay(50); 306162306a36Sopenharmony_ci cx_clear(MO_GP1_IO, 0x10); 306262306a36Sopenharmony_ci mdelay(75); 306362306a36Sopenharmony_ci cx_set(MO_GP1_IO, 0x10); 306462306a36Sopenharmony_ci mdelay(75); 306562306a36Sopenharmony_ci return 0; 306662306a36Sopenharmony_ci } 306762306a36Sopenharmony_ci return -EINVAL; 306862306a36Sopenharmony_ci} 306962306a36Sopenharmony_ci 307062306a36Sopenharmony_cistatic int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core, 307162306a36Sopenharmony_ci int command, int arg) 307262306a36Sopenharmony_ci{ 307362306a36Sopenharmony_ci switch (command) { 307462306a36Sopenharmony_ci case XC4000_TUNER_RESET: 307562306a36Sopenharmony_ci /* GPIO 12 (xc4000 tuner reset) */ 307662306a36Sopenharmony_ci cx_set(MO_GP1_IO, 0x1010); 307762306a36Sopenharmony_ci mdelay(50); 307862306a36Sopenharmony_ci cx_clear(MO_GP1_IO, 0x10); 307962306a36Sopenharmony_ci mdelay(75); 308062306a36Sopenharmony_ci cx_set(MO_GP1_IO, 0x10); 308162306a36Sopenharmony_ci mdelay(75); 308262306a36Sopenharmony_ci return 0; 308362306a36Sopenharmony_ci } 308462306a36Sopenharmony_ci return -EINVAL; 308562306a36Sopenharmony_ci} 308662306a36Sopenharmony_ci 308762306a36Sopenharmony_ci/* 308862306a36Sopenharmony_ci * some Divco specific stuff 308962306a36Sopenharmony_ci */ 309062306a36Sopenharmony_cistatic int cx88_pv_8000gt_callback(struct cx88_core *core, 309162306a36Sopenharmony_ci int command, int arg) 309262306a36Sopenharmony_ci{ 309362306a36Sopenharmony_ci switch (command) { 309462306a36Sopenharmony_ci case XC2028_TUNER_RESET: 309562306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xcf7); 309662306a36Sopenharmony_ci mdelay(50); 309762306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xef5); 309862306a36Sopenharmony_ci mdelay(50); 309962306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xcf7); 310062306a36Sopenharmony_ci break; 310162306a36Sopenharmony_ci default: 310262306a36Sopenharmony_ci return -EINVAL; 310362306a36Sopenharmony_ci } 310462306a36Sopenharmony_ci 310562306a36Sopenharmony_ci return 0; 310662306a36Sopenharmony_ci} 310762306a36Sopenharmony_ci 310862306a36Sopenharmony_ci/* 310962306a36Sopenharmony_ci * some DViCO specific stuff 311062306a36Sopenharmony_ci */ 311162306a36Sopenharmony_ci 311262306a36Sopenharmony_cistatic void dvico_fusionhdtv_hybrid_init(struct cx88_core *core) 311362306a36Sopenharmony_ci{ 311462306a36Sopenharmony_ci struct i2c_msg msg = { .addr = 0x45, .flags = 0 }; 311562306a36Sopenharmony_ci int i, err; 311662306a36Sopenharmony_ci static u8 init_bufs[13][5] = { 311762306a36Sopenharmony_ci { 0x10, 0x00, 0x20, 0x01, 0x03 }, 311862306a36Sopenharmony_ci { 0x10, 0x10, 0x01, 0x00, 0x21 }, 311962306a36Sopenharmony_ci { 0x10, 0x10, 0x10, 0x00, 0xCA }, 312062306a36Sopenharmony_ci { 0x10, 0x10, 0x12, 0x00, 0x08 }, 312162306a36Sopenharmony_ci { 0x10, 0x10, 0x13, 0x00, 0x0A }, 312262306a36Sopenharmony_ci { 0x10, 0x10, 0x16, 0x01, 0xC0 }, 312362306a36Sopenharmony_ci { 0x10, 0x10, 0x22, 0x01, 0x3D }, 312462306a36Sopenharmony_ci { 0x10, 0x10, 0x73, 0x01, 0x2E }, 312562306a36Sopenharmony_ci { 0x10, 0x10, 0x72, 0x00, 0xC5 }, 312662306a36Sopenharmony_ci { 0x10, 0x10, 0x71, 0x01, 0x97 }, 312762306a36Sopenharmony_ci { 0x10, 0x10, 0x70, 0x00, 0x0F }, 312862306a36Sopenharmony_ci { 0x10, 0x10, 0xB0, 0x00, 0x01 }, 312962306a36Sopenharmony_ci { 0x03, 0x0C }, 313062306a36Sopenharmony_ci }; 313162306a36Sopenharmony_ci 313262306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(init_bufs); i++) { 313362306a36Sopenharmony_ci msg.buf = init_bufs[i]; 313462306a36Sopenharmony_ci msg.len = (i != 12 ? 5 : 2); 313562306a36Sopenharmony_ci err = i2c_transfer(&core->i2c_adap, &msg, 1); 313662306a36Sopenharmony_ci if (err != 1) { 313762306a36Sopenharmony_ci pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n", 313862306a36Sopenharmony_ci i, err); 313962306a36Sopenharmony_ci return; 314062306a36Sopenharmony_ci } 314162306a36Sopenharmony_ci } 314262306a36Sopenharmony_ci} 314362306a36Sopenharmony_ci 314462306a36Sopenharmony_cistatic int cx88_xc2028_tuner_callback(struct cx88_core *core, 314562306a36Sopenharmony_ci int command, int arg) 314662306a36Sopenharmony_ci{ 314762306a36Sopenharmony_ci /* Board-specific callbacks */ 314862306a36Sopenharmony_ci switch (core->boardnr) { 314962306a36Sopenharmony_ci case CX88_BOARD_POWERCOLOR_REAL_ANGEL: 315062306a36Sopenharmony_ci case CX88_BOARD_GENIATECH_X8000_MT: 315162306a36Sopenharmony_ci case CX88_BOARD_KWORLD_ATSC_120: 315262306a36Sopenharmony_ci return cx88_xc3028_geniatech_tuner_callback(core, 315362306a36Sopenharmony_ci command, arg); 315462306a36Sopenharmony_ci case CX88_BOARD_PROLINK_PV_8000GT: 315562306a36Sopenharmony_ci case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 315662306a36Sopenharmony_ci return cx88_pv_8000gt_callback(core, command, arg); 315762306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 315862306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: 315962306a36Sopenharmony_ci return cx88_dvico_xc2028_callback(core, command, arg); 316062306a36Sopenharmony_ci case CX88_BOARD_NOTONLYTV_LV3H: 316162306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 316262306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV1800H: 316362306a36Sopenharmony_ci return cx88_xc3028_winfast1800h_callback(core, command, arg); 316462306a36Sopenharmony_ci } 316562306a36Sopenharmony_ci 316662306a36Sopenharmony_ci switch (command) { 316762306a36Sopenharmony_ci case XC2028_TUNER_RESET: 316862306a36Sopenharmony_ci switch (INPUT(core->input).type) { 316962306a36Sopenharmony_ci case CX88_RADIO: 317062306a36Sopenharmony_ci dprintk(1, "setting GPIO to radio!\n"); 317162306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x4ff); 317262306a36Sopenharmony_ci mdelay(250); 317362306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xff); 317462306a36Sopenharmony_ci mdelay(250); 317562306a36Sopenharmony_ci break; 317662306a36Sopenharmony_ci case CX88_VMUX_DVB: /* Digital TV*/ 317762306a36Sopenharmony_ci default: /* Analog TV */ 317862306a36Sopenharmony_ci dprintk(1, "setting GPIO to TV!\n"); 317962306a36Sopenharmony_ci break; 318062306a36Sopenharmony_ci } 318162306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x101010); 318262306a36Sopenharmony_ci mdelay(250); 318362306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x101000); 318462306a36Sopenharmony_ci mdelay(250); 318562306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x101010); 318662306a36Sopenharmony_ci mdelay(250); 318762306a36Sopenharmony_ci return 0; 318862306a36Sopenharmony_ci } 318962306a36Sopenharmony_ci return -EINVAL; 319062306a36Sopenharmony_ci} 319162306a36Sopenharmony_ci 319262306a36Sopenharmony_cistatic int cx88_xc4000_tuner_callback(struct cx88_core *core, 319362306a36Sopenharmony_ci int command, int arg) 319462306a36Sopenharmony_ci{ 319562306a36Sopenharmony_ci /* Board-specific callbacks */ 319662306a36Sopenharmony_ci switch (core->boardnr) { 319762306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV1800H_XC4000: 319862306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV2000H_PLUS: 319962306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36: 320062306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43: 320162306a36Sopenharmony_ci return cx88_xc4000_winfast2000h_plus_callback(core, 320262306a36Sopenharmony_ci command, arg); 320362306a36Sopenharmony_ci } 320462306a36Sopenharmony_ci return -EINVAL; 320562306a36Sopenharmony_ci} 320662306a36Sopenharmony_ci 320762306a36Sopenharmony_ci/* 320862306a36Sopenharmony_ci * Tuner callback function. Currently only needed for the Pinnacle 320962306a36Sopenharmony_ci * PCTV HD 800i with an xc5000 silicon tuner. This is used for both 321062306a36Sopenharmony_ci * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c) 321162306a36Sopenharmony_ci */ 321262306a36Sopenharmony_cistatic int cx88_xc5000_tuner_callback(struct cx88_core *core, 321362306a36Sopenharmony_ci int command, int arg) 321462306a36Sopenharmony_ci{ 321562306a36Sopenharmony_ci switch (core->boardnr) { 321662306a36Sopenharmony_ci case CX88_BOARD_PINNACLE_PCTV_HD_800i: 321762306a36Sopenharmony_ci if (command == 0) { /* This is the reset command from xc5000 */ 321862306a36Sopenharmony_ci 321962306a36Sopenharmony_ci /* 322062306a36Sopenharmony_ci * djh - According to the engineer at PCTV Systems, 322162306a36Sopenharmony_ci * the xc5000 reset pin is supposed to be on GPIO12. 322262306a36Sopenharmony_ci * However, despite three nights of effort, pulling 322362306a36Sopenharmony_ci * that GPIO low didn't reset the xc5000. While 322462306a36Sopenharmony_ci * pulling MO_SRST_IO low does reset the xc5000, this 322562306a36Sopenharmony_ci * also resets in the s5h1409 being reset as well. 322662306a36Sopenharmony_ci * This causes tuning to always fail since the internal 322762306a36Sopenharmony_ci * state of the s5h1409 does not match the driver's 322862306a36Sopenharmony_ci * state. Given that the only two conditions in which 322962306a36Sopenharmony_ci * the driver performs a reset is during firmware load 323062306a36Sopenharmony_ci * and powering down the chip, I am taking out the 323162306a36Sopenharmony_ci * reset. We know that the chip is being reset 323262306a36Sopenharmony_ci * when the cx88 comes online, and not being able to 323362306a36Sopenharmony_ci * do power management for this board is worse than 323462306a36Sopenharmony_ci * not having any tuning at all. 323562306a36Sopenharmony_ci */ 323662306a36Sopenharmony_ci return 0; 323762306a36Sopenharmony_ci } 323862306a36Sopenharmony_ci 323962306a36Sopenharmony_ci dprintk(1, "xc5000: unknown tuner callback command.\n"); 324062306a36Sopenharmony_ci return -EINVAL; 324162306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: 324262306a36Sopenharmony_ci if (command == 0) { /* This is the reset command from xc5000 */ 324362306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000010); 324462306a36Sopenharmony_ci usleep_range(10000, 20000); 324562306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000010); 324662306a36Sopenharmony_ci return 0; 324762306a36Sopenharmony_ci } 324862306a36Sopenharmony_ci 324962306a36Sopenharmony_ci dprintk(1, "xc5000: unknown tuner callback command.\n"); 325062306a36Sopenharmony_ci return -EINVAL; 325162306a36Sopenharmony_ci } 325262306a36Sopenharmony_ci return 0; /* Should never be here */ 325362306a36Sopenharmony_ci} 325462306a36Sopenharmony_ci 325562306a36Sopenharmony_ciint cx88_tuner_callback(void *priv, int component, int command, int arg) 325662306a36Sopenharmony_ci{ 325762306a36Sopenharmony_ci struct i2c_algo_bit_data *i2c_algo = priv; 325862306a36Sopenharmony_ci struct cx88_core *core; 325962306a36Sopenharmony_ci 326062306a36Sopenharmony_ci if (!i2c_algo) { 326162306a36Sopenharmony_ci pr_err("Error - i2c private data undefined.\n"); 326262306a36Sopenharmony_ci return -EINVAL; 326362306a36Sopenharmony_ci } 326462306a36Sopenharmony_ci 326562306a36Sopenharmony_ci core = i2c_algo->data; 326662306a36Sopenharmony_ci 326762306a36Sopenharmony_ci if (!core) { 326862306a36Sopenharmony_ci pr_err("Error - device struct undefined.\n"); 326962306a36Sopenharmony_ci return -EINVAL; 327062306a36Sopenharmony_ci } 327162306a36Sopenharmony_ci 327262306a36Sopenharmony_ci if (component != DVB_FRONTEND_COMPONENT_TUNER) 327362306a36Sopenharmony_ci return -EINVAL; 327462306a36Sopenharmony_ci 327562306a36Sopenharmony_ci switch (core->board.tuner_type) { 327662306a36Sopenharmony_ci case TUNER_XC2028: 327762306a36Sopenharmony_ci dprintk(1, "Calling XC2028/3028 callback\n"); 327862306a36Sopenharmony_ci return cx88_xc2028_tuner_callback(core, command, arg); 327962306a36Sopenharmony_ci case TUNER_XC4000: 328062306a36Sopenharmony_ci dprintk(1, "Calling XC4000 callback\n"); 328162306a36Sopenharmony_ci return cx88_xc4000_tuner_callback(core, command, arg); 328262306a36Sopenharmony_ci case TUNER_XC5000: 328362306a36Sopenharmony_ci dprintk(1, "Calling XC5000 callback\n"); 328462306a36Sopenharmony_ci return cx88_xc5000_tuner_callback(core, command, arg); 328562306a36Sopenharmony_ci } 328662306a36Sopenharmony_ci pr_err("Error: Calling callback for tuner %d\n", 328762306a36Sopenharmony_ci core->board.tuner_type); 328862306a36Sopenharmony_ci return -EINVAL; 328962306a36Sopenharmony_ci} 329062306a36Sopenharmony_ciEXPORT_SYMBOL(cx88_tuner_callback); 329162306a36Sopenharmony_ci 329262306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 329362306a36Sopenharmony_ci 329462306a36Sopenharmony_cistatic void cx88_card_list(struct cx88_core *core, struct pci_dev *pci) 329562306a36Sopenharmony_ci{ 329662306a36Sopenharmony_ci int i; 329762306a36Sopenharmony_ci 329862306a36Sopenharmony_ci if (!pci->subsystem_vendor && !pci->subsystem_device) { 329962306a36Sopenharmony_ci pr_err("Your board has no valid PCI Subsystem ID and thus can't\n"); 330062306a36Sopenharmony_ci pr_err("be autodetected. Please pass card=<n> insmod option to\n"); 330162306a36Sopenharmony_ci pr_err("workaround that. Redirect complaints to the vendor of\n"); 330262306a36Sopenharmony_ci pr_err("the TV card\n"); 330362306a36Sopenharmony_ci } else { 330462306a36Sopenharmony_ci pr_err("Your board isn't known (yet) to the driver. You can\n"); 330562306a36Sopenharmony_ci pr_err("try to pick one of the existing card configs via\n"); 330662306a36Sopenharmony_ci pr_err("card=<n> insmod option. Updating to the latest\n"); 330762306a36Sopenharmony_ci pr_err("version might help as well.\n"); 330862306a36Sopenharmony_ci } 330962306a36Sopenharmony_ci pr_err("Here is a list of valid choices for the card=<n> insmod option:\n"); 331062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(cx88_boards); i++) 331162306a36Sopenharmony_ci pr_err(" card=%d -> %s\n", i, cx88_boards[i].name); 331262306a36Sopenharmony_ci} 331362306a36Sopenharmony_ci 331462306a36Sopenharmony_cistatic void cx88_card_setup_pre_i2c(struct cx88_core *core) 331562306a36Sopenharmony_ci{ 331662306a36Sopenharmony_ci switch (core->boardnr) { 331762306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR1300: 331862306a36Sopenharmony_ci /* 331962306a36Sopenharmony_ci * Bring the 702 demod up before i2c scanning/attach or 332062306a36Sopenharmony_ci * devices are hidden. 332162306a36Sopenharmony_ci * 332262306a36Sopenharmony_ci * We leave here with the 702 on the bus 332362306a36Sopenharmony_ci * 332462306a36Sopenharmony_ci * "reset the IR receiver on GPIO[3]" 332562306a36Sopenharmony_ci * Reported by Mike Crash <mike AT mikecrash.com> 332662306a36Sopenharmony_ci */ 332762306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x0000ef88); 332862306a36Sopenharmony_ci udelay(1000); 332962306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000088); 333062306a36Sopenharmony_ci udelay(50); 333162306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */ 333262306a36Sopenharmony_ci udelay(1000); 333362306a36Sopenharmony_ci break; 333462306a36Sopenharmony_ci 333562306a36Sopenharmony_ci case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 333662306a36Sopenharmony_ci case CX88_BOARD_PROLINK_PV_8000GT: 333762306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xcf7); 333862306a36Sopenharmony_ci msleep(50); 333962306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xef5); 334062306a36Sopenharmony_ci msleep(50); 334162306a36Sopenharmony_ci cx_write(MO_GP2_IO, 0xcf7); 334262306a36Sopenharmony_ci usleep_range(10000, 20000); 334362306a36Sopenharmony_ci break; 334462306a36Sopenharmony_ci 334562306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD: 334662306a36Sopenharmony_ci /* Enable the xc5000 tuner */ 334762306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00001010); 334862306a36Sopenharmony_ci break; 334962306a36Sopenharmony_ci 335062306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV2000H_J: 335162306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR3000: 335262306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR4000: 335362306a36Sopenharmony_ci /* Init GPIO */ 335462306a36Sopenharmony_ci cx_write(MO_GP0_IO, core->board.input[0].gpio0); 335562306a36Sopenharmony_ci udelay(1000); 335662306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000080); 335762306a36Sopenharmony_ci udelay(50); 335862306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */ 335962306a36Sopenharmony_ci udelay(1000); 336062306a36Sopenharmony_ci break; 336162306a36Sopenharmony_ci 336262306a36Sopenharmony_ci case CX88_BOARD_NOTONLYTV_LV3H: 336362306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 336462306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV1800H: 336562306a36Sopenharmony_ci cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0); 336662306a36Sopenharmony_ci break; 336762306a36Sopenharmony_ci 336862306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV1800H_XC4000: 336962306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV2000H_PLUS: 337062306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36: 337162306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43: 337262306a36Sopenharmony_ci cx88_xc4000_winfast2000h_plus_callback(core, 337362306a36Sopenharmony_ci XC4000_TUNER_RESET, 0); 337462306a36Sopenharmony_ci break; 337562306a36Sopenharmony_ci 337662306a36Sopenharmony_ci case CX88_BOARD_TWINHAN_VP1027_DVBS: 337762306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x00003230); 337862306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x00003210); 337962306a36Sopenharmony_ci usleep_range(10000, 20000); 338062306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x00001230); 338162306a36Sopenharmony_ci break; 338262306a36Sopenharmony_ci } 338362306a36Sopenharmony_ci} 338462306a36Sopenharmony_ci 338562306a36Sopenharmony_ci/* 338662306a36Sopenharmony_ci * Sets board-dependent xc3028 configuration 338762306a36Sopenharmony_ci */ 338862306a36Sopenharmony_civoid cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl) 338962306a36Sopenharmony_ci{ 339062306a36Sopenharmony_ci memset(ctl, 0, sizeof(*ctl)); 339162306a36Sopenharmony_ci 339262306a36Sopenharmony_ci ctl->fname = XC2028_DEFAULT_FIRMWARE; 339362306a36Sopenharmony_ci ctl->max_len = 64; 339462306a36Sopenharmony_ci 339562306a36Sopenharmony_ci switch (core->boardnr) { 339662306a36Sopenharmony_ci case CX88_BOARD_POWERCOLOR_REAL_ANGEL: 339762306a36Sopenharmony_ci /* Now works with firmware version 2.7 */ 339862306a36Sopenharmony_ci if (core->i2c_algo.udelay < 16) 339962306a36Sopenharmony_ci core->i2c_algo.udelay = 16; 340062306a36Sopenharmony_ci break; 340162306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 340262306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DTV1800H: 340362306a36Sopenharmony_ci ctl->demod = XC3028_FE_ZARLINK456; 340462306a36Sopenharmony_ci break; 340562306a36Sopenharmony_ci case CX88_BOARD_KWORLD_ATSC_120: 340662306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO: 340762306a36Sopenharmony_ci ctl->demod = XC3028_FE_OREN538; 340862306a36Sopenharmony_ci break; 340962306a36Sopenharmony_ci case CX88_BOARD_GENIATECH_X8000_MT: 341062306a36Sopenharmony_ci /* 341162306a36Sopenharmony_ci * FIXME: For this board, the xc3028 never recovers after being 341262306a36Sopenharmony_ci * powered down (the reset GPIO probably is not set properly). 341362306a36Sopenharmony_ci * We don't have access to the hardware so we cannot determine 341462306a36Sopenharmony_ci * which GPIO is used for xc3028, so just disable power xc3028 341562306a36Sopenharmony_ci * power management for now 341662306a36Sopenharmony_ci */ 341762306a36Sopenharmony_ci ctl->disable_power_mgmt = 1; 341862306a36Sopenharmony_ci break; 341962306a36Sopenharmony_ci case CX88_BOARD_NOTONLYTV_LV3H: 342062306a36Sopenharmony_ci ctl->demod = XC3028_FE_ZARLINK456; 342162306a36Sopenharmony_ci ctl->fname = XC3028L_DEFAULT_FIRMWARE; 342262306a36Sopenharmony_ci ctl->read_not_reliable = 1; 342362306a36Sopenharmony_ci break; 342462306a36Sopenharmony_ci case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL: 342562306a36Sopenharmony_ci case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME: 342662306a36Sopenharmony_ci case CX88_BOARD_PROLINK_PV_8000GT: 342762306a36Sopenharmony_ci /* 342862306a36Sopenharmony_ci * Those boards uses non-MTS firmware 342962306a36Sopenharmony_ci */ 343062306a36Sopenharmony_ci break; 343162306a36Sopenharmony_ci case CX88_BOARD_PINNACLE_HYBRID_PCTV: 343262306a36Sopenharmony_ci case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII: 343362306a36Sopenharmony_ci ctl->demod = XC3028_FE_ZARLINK456; 343462306a36Sopenharmony_ci ctl->mts = 1; 343562306a36Sopenharmony_ci break; 343662306a36Sopenharmony_ci default: 343762306a36Sopenharmony_ci ctl->demod = XC3028_FE_OREN538; 343862306a36Sopenharmony_ci ctl->mts = 1; 343962306a36Sopenharmony_ci } 344062306a36Sopenharmony_ci} 344162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(cx88_setup_xc3028); 344262306a36Sopenharmony_ci 344362306a36Sopenharmony_cistatic void cx88_card_setup(struct cx88_core *core) 344462306a36Sopenharmony_ci{ 344562306a36Sopenharmony_ci static u8 eeprom[256]; 344662306a36Sopenharmony_ci struct tuner_setup tun_setup; 344762306a36Sopenharmony_ci unsigned int mode_mask = T_RADIO | T_ANALOG_TV; 344862306a36Sopenharmony_ci 344962306a36Sopenharmony_ci memset(&tun_setup, 0, sizeof(tun_setup)); 345062306a36Sopenharmony_ci 345162306a36Sopenharmony_ci if (!core->i2c_rc) { 345262306a36Sopenharmony_ci core->i2c_client.addr = 0xa0 >> 1; 345362306a36Sopenharmony_ci tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom)); 345462306a36Sopenharmony_ci } 345562306a36Sopenharmony_ci 345662306a36Sopenharmony_ci switch (core->boardnr) { 345762306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE: 345862306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_ROSLYN: 345962306a36Sopenharmony_ci if (!core->i2c_rc) 346062306a36Sopenharmony_ci hauppauge_eeprom(core, eeprom + 8); 346162306a36Sopenharmony_ci break; 346262306a36Sopenharmony_ci case CX88_BOARD_GDI: 346362306a36Sopenharmony_ci if (!core->i2c_rc) 346462306a36Sopenharmony_ci gdi_eeprom(core, eeprom); 346562306a36Sopenharmony_ci break; 346662306a36Sopenharmony_ci case CX88_BOARD_LEADTEK_PVR2000: 346762306a36Sopenharmony_ci case CX88_BOARD_WINFAST_DV2000: 346862306a36Sopenharmony_ci case CX88_BOARD_WINFAST2000XP_EXPERT: 346962306a36Sopenharmony_ci if (!core->i2c_rc) 347062306a36Sopenharmony_ci leadtek_eeprom(core, eeprom); 347162306a36Sopenharmony_ci break; 347262306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1: 347362306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_NOVASE2_S1: 347462306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_DVB_T1: 347562306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR1100: 347662306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR1100LP: 347762306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR3000: 347862306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR1300: 347962306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR4000: 348062306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_HVR4000LITE: 348162306a36Sopenharmony_ci case CX88_BOARD_HAUPPAUGE_IRONLY: 348262306a36Sopenharmony_ci if (!core->i2c_rc) 348362306a36Sopenharmony_ci hauppauge_eeprom(core, eeprom); 348462306a36Sopenharmony_ci break; 348562306a36Sopenharmony_ci case CX88_BOARD_KWORLD_DVBS_100: 348662306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x000007f8); 348762306a36Sopenharmony_ci cx_write(MO_GP1_IO, 0x00000001); 348862306a36Sopenharmony_ci break; 348962306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO: 349062306a36Sopenharmony_ci /* GPIO0:0 is hooked to demod reset */ 349162306a36Sopenharmony_ci /* GPIO0:4 is hooked to xc3028 reset */ 349262306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x00111100); 349362306a36Sopenharmony_ci usleep_range(10000, 20000); 349462306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x00111111); 349562306a36Sopenharmony_ci break; 349662306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL: 349762306a36Sopenharmony_ci /* GPIO0:6 is hooked to FX2 reset pin */ 349862306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00004040); 349962306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000040); 350062306a36Sopenharmony_ci msleep(1000); 350162306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00004040); 350262306a36Sopenharmony_ci fallthrough; 350362306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: 350462306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: 350562306a36Sopenharmony_ci case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID: 350662306a36Sopenharmony_ci /* GPIO0:0 is hooked to mt352 reset pin */ 350762306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000101); 350862306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000001); 350962306a36Sopenharmony_ci usleep_range(10000, 20000); 351062306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000101); 351162306a36Sopenharmony_ci if (!core->i2c_rc && 351262306a36Sopenharmony_ci core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID) 351362306a36Sopenharmony_ci dvico_fusionhdtv_hybrid_init(core); 351462306a36Sopenharmony_ci break; 351562306a36Sopenharmony_ci case CX88_BOARD_KWORLD_DVB_T: 351662306a36Sopenharmony_ci case CX88_BOARD_DNTV_LIVE_DVB_T: 351762306a36Sopenharmony_ci cx_set(MO_GP0_IO, 0x00000707); 351862306a36Sopenharmony_ci cx_set(MO_GP2_IO, 0x00000101); 351962306a36Sopenharmony_ci cx_clear(MO_GP2_IO, 0x00000001); 352062306a36Sopenharmony_ci usleep_range(10000, 20000); 352162306a36Sopenharmony_ci cx_clear(MO_GP0_IO, 0x00000007); 352262306a36Sopenharmony_ci cx_set(MO_GP2_IO, 0x00000101); 352362306a36Sopenharmony_ci break; 352462306a36Sopenharmony_ci case CX88_BOARD_DNTV_LIVE_DVB_T_PRO: 352562306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x00080808); 352662306a36Sopenharmony_ci break; 352762306a36Sopenharmony_ci case CX88_BOARD_ATI_HDTVWONDER: 352862306a36Sopenharmony_ci if (!core->i2c_rc) { 352962306a36Sopenharmony_ci /* enable tuner */ 353062306a36Sopenharmony_ci int i; 353162306a36Sopenharmony_ci static const u8 buffer[][2] = { 353262306a36Sopenharmony_ci {0x10, 0x12}, 353362306a36Sopenharmony_ci {0x13, 0x04}, 353462306a36Sopenharmony_ci {0x16, 0x00}, 353562306a36Sopenharmony_ci {0x14, 0x04}, 353662306a36Sopenharmony_ci {0x17, 0x00} 353762306a36Sopenharmony_ci }; 353862306a36Sopenharmony_ci core->i2c_client.addr = 0x0a; 353962306a36Sopenharmony_ci 354062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(buffer); i++) 354162306a36Sopenharmony_ci if (i2c_master_send(&core->i2c_client, 354262306a36Sopenharmony_ci buffer[i], 2) != 2) 354362306a36Sopenharmony_ci pr_warn("Unable to enable tuner(%i).\n", 354462306a36Sopenharmony_ci i); 354562306a36Sopenharmony_ci } 354662306a36Sopenharmony_ci break; 354762306a36Sopenharmony_ci case CX88_BOARD_MSI_TVANYWHERE_MASTER: 354862306a36Sopenharmony_ci { 354962306a36Sopenharmony_ci struct v4l2_priv_tun_config tea5767_cfg; 355062306a36Sopenharmony_ci struct tea5767_ctrl ctl; 355162306a36Sopenharmony_ci 355262306a36Sopenharmony_ci memset(&ctl, 0, sizeof(ctl)); 355362306a36Sopenharmony_ci 355462306a36Sopenharmony_ci ctl.high_cut = 1; 355562306a36Sopenharmony_ci ctl.st_noise = 1; 355662306a36Sopenharmony_ci ctl.deemph_75 = 1; 355762306a36Sopenharmony_ci ctl.xtal_freq = TEA5767_HIGH_LO_13MHz; 355862306a36Sopenharmony_ci 355962306a36Sopenharmony_ci tea5767_cfg.tuner = TUNER_TEA5767; 356062306a36Sopenharmony_ci tea5767_cfg.priv = &ctl; 356162306a36Sopenharmony_ci 356262306a36Sopenharmony_ci call_all(core, tuner, s_config, &tea5767_cfg); 356362306a36Sopenharmony_ci break; 356462306a36Sopenharmony_ci } 356562306a36Sopenharmony_ci case CX88_BOARD_TEVII_S420: 356662306a36Sopenharmony_ci case CX88_BOARD_TEVII_S460: 356762306a36Sopenharmony_ci case CX88_BOARD_TEVII_S464: 356862306a36Sopenharmony_ci case CX88_BOARD_OMICOM_SS4_PCI: 356962306a36Sopenharmony_ci case CX88_BOARD_TBS_8910: 357062306a36Sopenharmony_ci case CX88_BOARD_TBS_8920: 357162306a36Sopenharmony_ci case CX88_BOARD_PROF_6200: 357262306a36Sopenharmony_ci case CX88_BOARD_PROF_7300: 357362306a36Sopenharmony_ci case CX88_BOARD_PROF_7301: 357462306a36Sopenharmony_ci case CX88_BOARD_SATTRADE_ST4200: 357562306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x8000); 357662306a36Sopenharmony_ci msleep(100); 357762306a36Sopenharmony_ci cx_write(MO_SRST_IO, 0); 357862306a36Sopenharmony_ci usleep_range(10000, 20000); 357962306a36Sopenharmony_ci cx_write(MO_GP0_IO, 0x8080); 358062306a36Sopenharmony_ci msleep(100); 358162306a36Sopenharmony_ci cx_write(MO_SRST_IO, 1); 358262306a36Sopenharmony_ci msleep(100); 358362306a36Sopenharmony_ci break; 358462306a36Sopenharmony_ci } /*end switch() */ 358562306a36Sopenharmony_ci 358662306a36Sopenharmony_ci /* Setup tuners */ 358762306a36Sopenharmony_ci if (core->board.radio_type != UNSET) { 358862306a36Sopenharmony_ci tun_setup.mode_mask = T_RADIO; 358962306a36Sopenharmony_ci tun_setup.type = core->board.radio_type; 359062306a36Sopenharmony_ci tun_setup.addr = core->board.radio_addr; 359162306a36Sopenharmony_ci tun_setup.tuner_callback = cx88_tuner_callback; 359262306a36Sopenharmony_ci call_all(core, tuner, s_type_addr, &tun_setup); 359362306a36Sopenharmony_ci mode_mask &= ~T_RADIO; 359462306a36Sopenharmony_ci } 359562306a36Sopenharmony_ci 359662306a36Sopenharmony_ci if (core->board.tuner_type != UNSET) { 359762306a36Sopenharmony_ci tun_setup.mode_mask = mode_mask; 359862306a36Sopenharmony_ci tun_setup.type = core->board.tuner_type; 359962306a36Sopenharmony_ci tun_setup.addr = core->board.tuner_addr; 360062306a36Sopenharmony_ci tun_setup.tuner_callback = cx88_tuner_callback; 360162306a36Sopenharmony_ci 360262306a36Sopenharmony_ci call_all(core, tuner, s_type_addr, &tun_setup); 360362306a36Sopenharmony_ci } 360462306a36Sopenharmony_ci 360562306a36Sopenharmony_ci if (core->board.tda9887_conf) { 360662306a36Sopenharmony_ci struct v4l2_priv_tun_config tda9887_cfg; 360762306a36Sopenharmony_ci 360862306a36Sopenharmony_ci tda9887_cfg.tuner = TUNER_TDA9887; 360962306a36Sopenharmony_ci tda9887_cfg.priv = &core->board.tda9887_conf; 361062306a36Sopenharmony_ci 361162306a36Sopenharmony_ci call_all(core, tuner, s_config, &tda9887_cfg); 361262306a36Sopenharmony_ci } 361362306a36Sopenharmony_ci 361462306a36Sopenharmony_ci if (core->board.tuner_type == TUNER_XC2028) { 361562306a36Sopenharmony_ci struct v4l2_priv_tun_config xc2028_cfg; 361662306a36Sopenharmony_ci struct xc2028_ctrl ctl; 361762306a36Sopenharmony_ci 361862306a36Sopenharmony_ci /* Fills device-dependent initialization parameters */ 361962306a36Sopenharmony_ci cx88_setup_xc3028(core, &ctl); 362062306a36Sopenharmony_ci 362162306a36Sopenharmony_ci /* Sends parameters to xc2028/3028 tuner */ 362262306a36Sopenharmony_ci memset(&xc2028_cfg, 0, sizeof(xc2028_cfg)); 362362306a36Sopenharmony_ci xc2028_cfg.tuner = TUNER_XC2028; 362462306a36Sopenharmony_ci xc2028_cfg.priv = &ctl; 362562306a36Sopenharmony_ci dprintk(1, "Asking xc2028/3028 to load firmware %s\n", 362662306a36Sopenharmony_ci ctl.fname); 362762306a36Sopenharmony_ci call_all(core, tuner, s_config, &xc2028_cfg); 362862306a36Sopenharmony_ci } 362962306a36Sopenharmony_ci call_all(core, tuner, standby); 363062306a36Sopenharmony_ci} 363162306a36Sopenharmony_ci 363262306a36Sopenharmony_ci/* ------------------------------------------------------------------ */ 363362306a36Sopenharmony_ci 363462306a36Sopenharmony_cistatic int cx88_pci_quirks(const char *name, struct pci_dev *pci) 363562306a36Sopenharmony_ci{ 363662306a36Sopenharmony_ci unsigned int lat = UNSET; 363762306a36Sopenharmony_ci u8 ctrl = 0; 363862306a36Sopenharmony_ci u8 value; 363962306a36Sopenharmony_ci 364062306a36Sopenharmony_ci /* check pci quirks */ 364162306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_TRITON) { 364262306a36Sopenharmony_ci pr_info("quirk: PCIPCI_TRITON -- set TBFX\n"); 364362306a36Sopenharmony_ci ctrl |= CX88X_EN_TBFX; 364462306a36Sopenharmony_ci } 364562306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_NATOMA) { 364662306a36Sopenharmony_ci pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n"); 364762306a36Sopenharmony_ci ctrl |= CX88X_EN_TBFX; 364862306a36Sopenharmony_ci } 364962306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_VIAETBF) { 365062306a36Sopenharmony_ci pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n"); 365162306a36Sopenharmony_ci ctrl |= CX88X_EN_TBFX; 365262306a36Sopenharmony_ci } 365362306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_VSFX) { 365462306a36Sopenharmony_ci pr_info("quirk: PCIPCI_VSFX -- set VSFX\n"); 365562306a36Sopenharmony_ci ctrl |= CX88X_EN_VSFX; 365662306a36Sopenharmony_ci } 365762306a36Sopenharmony_ci#ifdef PCIPCI_ALIMAGIK 365862306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_ALIMAGIK) { 365962306a36Sopenharmony_ci pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n"); 366062306a36Sopenharmony_ci lat = 0x0A; 366162306a36Sopenharmony_ci } 366262306a36Sopenharmony_ci#endif 366362306a36Sopenharmony_ci 366462306a36Sopenharmony_ci /* check insmod options */ 366562306a36Sopenharmony_ci if (latency != UNSET) 366662306a36Sopenharmony_ci lat = latency; 366762306a36Sopenharmony_ci 366862306a36Sopenharmony_ci /* apply stuff */ 366962306a36Sopenharmony_ci if (ctrl) { 367062306a36Sopenharmony_ci pci_read_config_byte(pci, CX88X_DEVCTRL, &value); 367162306a36Sopenharmony_ci value |= ctrl; 367262306a36Sopenharmony_ci pci_write_config_byte(pci, CX88X_DEVCTRL, value); 367362306a36Sopenharmony_ci } 367462306a36Sopenharmony_ci if (lat != UNSET) { 367562306a36Sopenharmony_ci pr_info("setting pci latency timer to %d\n", latency); 367662306a36Sopenharmony_ci pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency); 367762306a36Sopenharmony_ci } 367862306a36Sopenharmony_ci return 0; 367962306a36Sopenharmony_ci} 368062306a36Sopenharmony_ci 368162306a36Sopenharmony_ciint cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci) 368262306a36Sopenharmony_ci{ 368362306a36Sopenharmony_ci if (request_mem_region(pci_resource_start(pci, 0), 368462306a36Sopenharmony_ci pci_resource_len(pci, 0), 368562306a36Sopenharmony_ci core->name)) 368662306a36Sopenharmony_ci return 0; 368762306a36Sopenharmony_ci pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n", 368862306a36Sopenharmony_ci PCI_FUNC(pci->devfn), 368962306a36Sopenharmony_ci (unsigned long long)pci_resource_start(pci, 0), 369062306a36Sopenharmony_ci pci->subsystem_vendor, pci->subsystem_device); 369162306a36Sopenharmony_ci return -EBUSY; 369262306a36Sopenharmony_ci} 369362306a36Sopenharmony_ci 369462306a36Sopenharmony_ci/* 369562306a36Sopenharmony_ci * Allocate and initialize the cx88 core struct. One should hold the 369662306a36Sopenharmony_ci * devlist mutex before calling this. 369762306a36Sopenharmony_ci */ 369862306a36Sopenharmony_cistruct cx88_core *cx88_core_create(struct pci_dev *pci, int nr) 369962306a36Sopenharmony_ci{ 370062306a36Sopenharmony_ci struct cx88_core *core; 370162306a36Sopenharmony_ci int i; 370262306a36Sopenharmony_ci 370362306a36Sopenharmony_ci core = kzalloc(sizeof(*core), GFP_KERNEL); 370462306a36Sopenharmony_ci if (!core) 370562306a36Sopenharmony_ci return NULL; 370662306a36Sopenharmony_ci 370762306a36Sopenharmony_ci refcount_set(&core->refcount, 1); 370862306a36Sopenharmony_ci core->pci_bus = pci->bus->number; 370962306a36Sopenharmony_ci core->pci_slot = PCI_SLOT(pci->devfn); 371062306a36Sopenharmony_ci core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT | 371162306a36Sopenharmony_ci PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT | 371262306a36Sopenharmony_ci PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT; 371362306a36Sopenharmony_ci mutex_init(&core->lock); 371462306a36Sopenharmony_ci 371562306a36Sopenharmony_ci core->nr = nr; 371662306a36Sopenharmony_ci sprintf(core->name, "cx88[%d]", core->nr); 371762306a36Sopenharmony_ci 371862306a36Sopenharmony_ci /* 371962306a36Sopenharmony_ci * Note: Setting initial standard here would cause first call to 372062306a36Sopenharmony_ci * cx88_set_tvnorm() to return without programming any registers. Leave 372162306a36Sopenharmony_ci * it blank for at this point and it will get set later in 372262306a36Sopenharmony_ci * cx8800_initdev() 372362306a36Sopenharmony_ci */ 372462306a36Sopenharmony_ci core->tvnorm = 0; 372562306a36Sopenharmony_ci 372662306a36Sopenharmony_ci core->width = 320; 372762306a36Sopenharmony_ci core->height = 240; 372862306a36Sopenharmony_ci core->field = V4L2_FIELD_INTERLACED; 372962306a36Sopenharmony_ci 373062306a36Sopenharmony_ci strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name)); 373162306a36Sopenharmony_ci if (v4l2_device_register(NULL, &core->v4l2_dev)) { 373262306a36Sopenharmony_ci kfree(core); 373362306a36Sopenharmony_ci return NULL; 373462306a36Sopenharmony_ci } 373562306a36Sopenharmony_ci 373662306a36Sopenharmony_ci if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) { 373762306a36Sopenharmony_ci v4l2_device_unregister(&core->v4l2_dev); 373862306a36Sopenharmony_ci kfree(core); 373962306a36Sopenharmony_ci return NULL; 374062306a36Sopenharmony_ci } 374162306a36Sopenharmony_ci 374262306a36Sopenharmony_ci if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) { 374362306a36Sopenharmony_ci v4l2_ctrl_handler_free(&core->video_hdl); 374462306a36Sopenharmony_ci v4l2_device_unregister(&core->v4l2_dev); 374562306a36Sopenharmony_ci kfree(core); 374662306a36Sopenharmony_ci return NULL; 374762306a36Sopenharmony_ci } 374862306a36Sopenharmony_ci 374962306a36Sopenharmony_ci if (cx88_get_resources(core, pci) != 0) { 375062306a36Sopenharmony_ci v4l2_ctrl_handler_free(&core->video_hdl); 375162306a36Sopenharmony_ci v4l2_ctrl_handler_free(&core->audio_hdl); 375262306a36Sopenharmony_ci v4l2_device_unregister(&core->v4l2_dev); 375362306a36Sopenharmony_ci kfree(core); 375462306a36Sopenharmony_ci return NULL; 375562306a36Sopenharmony_ci } 375662306a36Sopenharmony_ci 375762306a36Sopenharmony_ci /* PCI stuff */ 375862306a36Sopenharmony_ci cx88_pci_quirks(core->name, pci); 375962306a36Sopenharmony_ci core->lmmio = ioremap(pci_resource_start(pci, 0), 376062306a36Sopenharmony_ci pci_resource_len(pci, 0)); 376162306a36Sopenharmony_ci core->bmmio = (u8 __iomem *)core->lmmio; 376262306a36Sopenharmony_ci 376362306a36Sopenharmony_ci if (!core->lmmio) { 376462306a36Sopenharmony_ci release_mem_region(pci_resource_start(pci, 0), 376562306a36Sopenharmony_ci pci_resource_len(pci, 0)); 376662306a36Sopenharmony_ci v4l2_ctrl_handler_free(&core->video_hdl); 376762306a36Sopenharmony_ci v4l2_ctrl_handler_free(&core->audio_hdl); 376862306a36Sopenharmony_ci v4l2_device_unregister(&core->v4l2_dev); 376962306a36Sopenharmony_ci kfree(core); 377062306a36Sopenharmony_ci return NULL; 377162306a36Sopenharmony_ci } 377262306a36Sopenharmony_ci 377362306a36Sopenharmony_ci /* board config */ 377462306a36Sopenharmony_ci core->boardnr = UNSET; 377562306a36Sopenharmony_ci if (card[core->nr] < ARRAY_SIZE(cx88_boards)) 377662306a36Sopenharmony_ci core->boardnr = card[core->nr]; 377762306a36Sopenharmony_ci for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++) 377862306a36Sopenharmony_ci if (pci->subsystem_vendor == cx88_subids[i].subvendor && 377962306a36Sopenharmony_ci pci->subsystem_device == cx88_subids[i].subdevice) 378062306a36Sopenharmony_ci core->boardnr = cx88_subids[i].card; 378162306a36Sopenharmony_ci if (core->boardnr == UNSET) { 378262306a36Sopenharmony_ci core->boardnr = CX88_BOARD_UNKNOWN; 378362306a36Sopenharmony_ci cx88_card_list(core, pci); 378462306a36Sopenharmony_ci } 378562306a36Sopenharmony_ci 378662306a36Sopenharmony_ci core->board = cx88_boards[core->boardnr]; 378762306a36Sopenharmony_ci 378862306a36Sopenharmony_ci if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB)) 378962306a36Sopenharmony_ci core->board.num_frontends = 1; 379062306a36Sopenharmony_ci 379162306a36Sopenharmony_ci pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n", 379262306a36Sopenharmony_ci pci->subsystem_vendor, pci->subsystem_device, core->board.name, 379362306a36Sopenharmony_ci core->boardnr, card[core->nr] == core->boardnr ? 379462306a36Sopenharmony_ci "insmod option" : "autodetected", 379562306a36Sopenharmony_ci core->board.num_frontends); 379662306a36Sopenharmony_ci 379762306a36Sopenharmony_ci if (tuner[core->nr] != UNSET) 379862306a36Sopenharmony_ci core->board.tuner_type = tuner[core->nr]; 379962306a36Sopenharmony_ci if (radio[core->nr] != UNSET) 380062306a36Sopenharmony_ci core->board.radio_type = radio[core->nr]; 380162306a36Sopenharmony_ci 380262306a36Sopenharmony_ci dprintk(1, "TV tuner type %d, Radio tuner type %d\n", 380362306a36Sopenharmony_ci core->board.tuner_type, core->board.radio_type); 380462306a36Sopenharmony_ci 380562306a36Sopenharmony_ci /* init hardware */ 380662306a36Sopenharmony_ci cx88_reset(core); 380762306a36Sopenharmony_ci cx88_card_setup_pre_i2c(core); 380862306a36Sopenharmony_ci cx88_i2c_init(core, pci); 380962306a36Sopenharmony_ci 381062306a36Sopenharmony_ci /* load tuner module, if needed */ 381162306a36Sopenharmony_ci if (core->board.tuner_type != UNSET) { 381262306a36Sopenharmony_ci /* 381362306a36Sopenharmony_ci * Ignore 0x6b and 0x6f on cx88 boards. 381462306a36Sopenharmony_ci * FusionHDTV5 RT Gold has an ir receiver at 0x6b 381562306a36Sopenharmony_ci * and an RTC at 0x6f which can get corrupted if probed. 381662306a36Sopenharmony_ci */ 381762306a36Sopenharmony_ci static const unsigned short tv_addrs[] = { 381862306a36Sopenharmony_ci 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */ 381962306a36Sopenharmony_ci 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 382062306a36Sopenharmony_ci 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e, 382162306a36Sopenharmony_ci I2C_CLIENT_END 382262306a36Sopenharmony_ci }; 382362306a36Sopenharmony_ci int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT); 382462306a36Sopenharmony_ci 382562306a36Sopenharmony_ci /* 382662306a36Sopenharmony_ci * I don't trust the radio_type as is stored in the card 382762306a36Sopenharmony_ci * definitions, so we just probe for it. 382862306a36Sopenharmony_ci * The radio_type is sometimes missing, or set to UNSET but 382962306a36Sopenharmony_ci * later code configures a tea5767. 383062306a36Sopenharmony_ci */ 383162306a36Sopenharmony_ci v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap, 383262306a36Sopenharmony_ci "tuner", 0, 383362306a36Sopenharmony_ci v4l2_i2c_tuner_addrs(ADDRS_RADIO)); 383462306a36Sopenharmony_ci if (has_demod) 383562306a36Sopenharmony_ci v4l2_i2c_new_subdev(&core->v4l2_dev, 383662306a36Sopenharmony_ci &core->i2c_adap, "tuner", 383762306a36Sopenharmony_ci 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); 383862306a36Sopenharmony_ci if (core->board.tuner_addr == ADDR_UNSET) { 383962306a36Sopenharmony_ci v4l2_i2c_new_subdev(&core->v4l2_dev, 384062306a36Sopenharmony_ci &core->i2c_adap, "tuner", 384162306a36Sopenharmony_ci 0, has_demod ? tv_addrs + 4 : tv_addrs); 384262306a36Sopenharmony_ci } else { 384362306a36Sopenharmony_ci v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap, 384462306a36Sopenharmony_ci "tuner", core->board.tuner_addr, 384562306a36Sopenharmony_ci NULL); 384662306a36Sopenharmony_ci } 384762306a36Sopenharmony_ci } 384862306a36Sopenharmony_ci 384962306a36Sopenharmony_ci cx88_card_setup(core); 385062306a36Sopenharmony_ci if (!disable_ir) { 385162306a36Sopenharmony_ci cx88_i2c_init_ir(core); 385262306a36Sopenharmony_ci cx88_ir_init(core, pci); 385362306a36Sopenharmony_ci } 385462306a36Sopenharmony_ci 385562306a36Sopenharmony_ci return core; 385662306a36Sopenharmony_ci} 3857