162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci bttv-cards.c 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci this file has configuration information - card-specific stuff 762306a36Sopenharmony_ci like the big tvcards array for the most part 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) 1062306a36Sopenharmony_ci & Marcus Metzler (mocm@thp.uni-koeln.de) 1162306a36Sopenharmony_ci (c) 1999-2001 Gerd Knorr <kraxel@goldbach.in-berlin.de> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci*/ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include <linux/delay.h> 1962306a36Sopenharmony_ci#include <linux/module.h> 2062306a36Sopenharmony_ci#include <linux/kmod.h> 2162306a36Sopenharmony_ci#include <linux/init.h> 2262306a36Sopenharmony_ci#include <linux/pci.h> 2362306a36Sopenharmony_ci#include <linux/vmalloc.h> 2462306a36Sopenharmony_ci#include <linux/firmware.h> 2562306a36Sopenharmony_ci#include <net/checksum.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include <asm/unaligned.h> 2862306a36Sopenharmony_ci#include <asm/io.h> 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#include "bttvp.h" 3162306a36Sopenharmony_ci#include <media/v4l2-common.h> 3262306a36Sopenharmony_ci#include <media/i2c/tvaudio.h> 3362306a36Sopenharmony_ci#include "bttv-audio-hook.h" 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* fwd decl */ 3662306a36Sopenharmony_cistatic void boot_msp34xx(struct bttv *btv, int pin); 3762306a36Sopenharmony_cistatic void hauppauge_eeprom(struct bttv *btv); 3862306a36Sopenharmony_cistatic void avermedia_eeprom(struct bttv *btv); 3962306a36Sopenharmony_cistatic void osprey_eeprom(struct bttv *btv, const u8 ee[256]); 4062306a36Sopenharmony_cistatic void modtec_eeprom(struct bttv *btv); 4162306a36Sopenharmony_cistatic void init_PXC200(struct bttv *btv); 4262306a36Sopenharmony_cistatic void init_RTV24(struct bttv *btv); 4362306a36Sopenharmony_cistatic void init_PCI8604PW(struct bttv *btv); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic void rv605_muxsel(struct bttv *btv, unsigned int input); 4662306a36Sopenharmony_cistatic void eagle_muxsel(struct bttv *btv, unsigned int input); 4762306a36Sopenharmony_cistatic void xguard_muxsel(struct bttv *btv, unsigned int input); 4862306a36Sopenharmony_cistatic void ivc120_muxsel(struct bttv *btv, unsigned int input); 4962306a36Sopenharmony_cistatic void gvc1100_muxsel(struct bttv *btv, unsigned int input); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic void PXC200_muxsel(struct bttv *btv, unsigned int input); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic void picolo_tetra_muxsel(struct bttv *btv, unsigned int input); 5462306a36Sopenharmony_cistatic void picolo_tetra_init(struct bttv *btv); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic void tibetCS16_muxsel(struct bttv *btv, unsigned int input); 5762306a36Sopenharmony_cistatic void tibetCS16_init(struct bttv *btv); 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistatic void kodicom4400r_muxsel(struct bttv *btv, unsigned int input); 6062306a36Sopenharmony_cistatic void kodicom4400r_init(struct bttv *btv); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_cistatic void sigmaSLC_muxsel(struct bttv *btv, unsigned int input); 6362306a36Sopenharmony_cistatic void sigmaSQ_muxsel(struct bttv *btv, unsigned int input); 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic void geovision_muxsel(struct bttv *btv, unsigned int input); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic void phytec_muxsel(struct bttv *btv, unsigned int input); 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cistatic void gv800s_muxsel(struct bttv *btv, unsigned int input); 7062306a36Sopenharmony_cistatic void gv800s_init(struct bttv *btv); 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_cistatic void td3116_muxsel(struct bttv *btv, unsigned int input); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic int terratec_active_radio_upgrade(struct bttv *btv); 7562306a36Sopenharmony_cistatic int tea575x_init(struct bttv *btv); 7662306a36Sopenharmony_cistatic void identify_by_eeprom(struct bttv *btv, 7762306a36Sopenharmony_ci unsigned char eeprom_data[256]); 7862306a36Sopenharmony_cistatic int pvr_boot(struct bttv *btv); 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* config variables */ 8162306a36Sopenharmony_cistatic unsigned int triton1; 8262306a36Sopenharmony_cistatic unsigned int vsfx; 8362306a36Sopenharmony_cistatic unsigned int latency = UNSET; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; 8662306a36Sopenharmony_cistatic unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; 8762306a36Sopenharmony_cistatic unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; 8862306a36Sopenharmony_cistatic unsigned int svhs[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; 8962306a36Sopenharmony_cistatic unsigned int remote[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET }; 9062306a36Sopenharmony_cistatic unsigned int audiodev[BTTV_MAX]; 9162306a36Sopenharmony_cistatic unsigned int saa6588[BTTV_MAX]; 9262306a36Sopenharmony_cistatic struct bttv *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL }; 9362306a36Sopenharmony_cistatic unsigned int autoload = UNSET; 9462306a36Sopenharmony_cistatic unsigned int gpiomask = UNSET; 9562306a36Sopenharmony_cistatic unsigned int audioall = UNSET; 9662306a36Sopenharmony_cistatic unsigned int audiomux[5] = { [ 0 ... 4 ] = UNSET }; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* insmod options */ 9962306a36Sopenharmony_cimodule_param(triton1, int, 0444); 10062306a36Sopenharmony_cimodule_param(vsfx, int, 0444); 10162306a36Sopenharmony_cimodule_param(latency, int, 0444); 10262306a36Sopenharmony_cimodule_param(gpiomask, int, 0444); 10362306a36Sopenharmony_cimodule_param(audioall, int, 0444); 10462306a36Sopenharmony_cimodule_param(autoload, int, 0444); 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cimodule_param_array(card, int, NULL, 0444); 10762306a36Sopenharmony_cimodule_param_array(pll, int, NULL, 0444); 10862306a36Sopenharmony_cimodule_param_array(tuner, int, NULL, 0444); 10962306a36Sopenharmony_cimodule_param_array(svhs, int, NULL, 0444); 11062306a36Sopenharmony_cimodule_param_array(remote, int, NULL, 0444); 11162306a36Sopenharmony_cimodule_param_array(audiodev, int, NULL, 0444); 11262306a36Sopenharmony_cimodule_param_array(audiomux, int, NULL, 0444); 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciMODULE_PARM_DESC(triton1, "set ETBF pci config bit [enable bug compatibility for triton1 + others]"); 11562306a36Sopenharmony_ciMODULE_PARM_DESC(vsfx, "set VSFX pci config bit [yet another chipset flaw workaround]"); 11662306a36Sopenharmony_ciMODULE_PARM_DESC(latency,"pci latency timer"); 11762306a36Sopenharmony_ciMODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list"); 11862306a36Sopenharmony_ciMODULE_PARM_DESC(pll, "specify installed crystal (0=none, 28=28 MHz, 35=35 MHz, 14=14 MHz)"); 11962306a36Sopenharmony_ciMODULE_PARM_DESC(tuner,"specify installed tuner type"); 12062306a36Sopenharmony_ciMODULE_PARM_DESC(autoload, "obsolete option, please do not use anymore"); 12162306a36Sopenharmony_ciMODULE_PARM_DESC(audiodev, "specify audio device:\n" 12262306a36Sopenharmony_ci "\t\t-1 = no audio\n" 12362306a36Sopenharmony_ci "\t\t 0 = autodetect (default)\n" 12462306a36Sopenharmony_ci "\t\t 1 = msp3400\n" 12562306a36Sopenharmony_ci "\t\t 2 = tda7432\n" 12662306a36Sopenharmony_ci "\t\t 3 = tvaudio"); 12762306a36Sopenharmony_ciMODULE_PARM_DESC(saa6588, "if 1, then load the saa6588 RDS module, default (0) is to use the card definition."); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci/* I2C addresses list */ 13162306a36Sopenharmony_ci#define I2C_ADDR_TDA7432 0x8a 13262306a36Sopenharmony_ci#define I2C_ADDR_MSP3400 0x80 13362306a36Sopenharmony_ci#define I2C_ADDR_MSP3400_ALT 0x88 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 13762306a36Sopenharmony_ci/* list of card IDs for bt878+ cards */ 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic struct CARD { 14062306a36Sopenharmony_ci unsigned id; 14162306a36Sopenharmony_ci int cardnr; 14262306a36Sopenharmony_ci char *name; 14362306a36Sopenharmony_ci} cards[] = { 14462306a36Sopenharmony_ci { 0x13eb0070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV" }, 14562306a36Sopenharmony_ci { 0x39000070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV-D" }, 14662306a36Sopenharmony_ci { 0x45000070, BTTV_BOARD_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" }, 14762306a36Sopenharmony_ci { 0xff000070, BTTV_BOARD_OSPREY1x0, "Osprey-100" }, 14862306a36Sopenharmony_ci { 0xff010070, BTTV_BOARD_OSPREY2x0_SVID,"Osprey-200" }, 14962306a36Sopenharmony_ci { 0xff020070, BTTV_BOARD_OSPREY500, "Osprey-500" }, 15062306a36Sopenharmony_ci { 0xff030070, BTTV_BOARD_OSPREY2000, "Osprey-2000" }, 15162306a36Sopenharmony_ci { 0xff040070, BTTV_BOARD_OSPREY540, "Osprey-540" }, 15262306a36Sopenharmony_ci { 0xff070070, BTTV_BOARD_OSPREY440, "Osprey-440" }, 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci { 0x00011002, BTTV_BOARD_ATI_TVWONDER, "ATI TV Wonder" }, 15562306a36Sopenharmony_ci { 0x00031002, BTTV_BOARD_ATI_TVWONDERVE,"ATI TV Wonder/VE" }, 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci { 0x6606107d, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" }, 15862306a36Sopenharmony_ci { 0x6607107d, BTTV_BOARD_WINFASTVC100, "Leadtek WinFast VC 100" }, 15962306a36Sopenharmony_ci { 0x6609107d, BTTV_BOARD_WINFAST2000, "Leadtek TV 2000 XP" }, 16062306a36Sopenharmony_ci { 0x263610b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" }, 16162306a36Sopenharmony_ci { 0x264510b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" }, 16262306a36Sopenharmony_ci { 0x402010fc, BTTV_BOARD_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" }, 16362306a36Sopenharmony_ci { 0x405010fc, BTTV_BOARD_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" }, 16462306a36Sopenharmony_ci { 0x407010fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" }, 16562306a36Sopenharmony_ci { 0xd01810fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" }, 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci { 0x001211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" }, 16862306a36Sopenharmony_ci /* some cards ship with byteswapped IDs ... */ 16962306a36Sopenharmony_ci { 0x1200bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" }, 17062306a36Sopenharmony_ci { 0xff00bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" }, 17162306a36Sopenharmony_ci /* this seems to happen as well ... */ 17262306a36Sopenharmony_ci { 0xff1211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" }, 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci { 0x3000121a, BTTV_BOARD_VOODOOTV_200, "3Dfx VoodooTV 200" }, 17562306a36Sopenharmony_ci { 0x263710b4, BTTV_BOARD_VOODOOTV_FM, "3Dfx VoodooTV FM" }, 17662306a36Sopenharmony_ci { 0x3060121a, BTTV_BOARD_STB2, "3Dfx VoodooTV 100/ STB OEM" }, 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci { 0x3000144f, BTTV_BOARD_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" }, 17962306a36Sopenharmony_ci { 0xa005144f, BTTV_BOARD_MAGICTVIEW063, "CPH06X TView99-Card" }, 18062306a36Sopenharmony_ci { 0x3002144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" }, 18162306a36Sopenharmony_ci { 0x3005144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" }, 18262306a36Sopenharmony_ci { 0x5000144f, BTTV_BOARD_MAGICTVIEW061, "Askey CPH050" }, 18362306a36Sopenharmony_ci { 0x300014ff, BTTV_BOARD_MAGICTVIEW061, "TView 99 (CPH061)" }, 18462306a36Sopenharmony_ci { 0x300214ff, BTTV_BOARD_PHOEBE_TVMAS, "Phoebe TV Master (CPH060)" }, 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci { 0x00011461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" }, 18762306a36Sopenharmony_ci { 0x00021461, BTTV_BOARD_AVERMEDIA98, "AVermedia TVCapture 98" }, 18862306a36Sopenharmony_ci { 0x00031461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" }, 18962306a36Sopenharmony_ci { 0x00041461, BTTV_BOARD_AVERMEDIA98, "AVerMedia TVCapture 98" }, 19062306a36Sopenharmony_ci { 0x03001461, BTTV_BOARD_AVERMEDIA98, "VDOMATE TV TUNER CARD" }, 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci { 0x1117153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL B/G)" }, 19362306a36Sopenharmony_ci { 0x1118153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL B/G)" }, 19462306a36Sopenharmony_ci { 0x1119153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL I)" }, 19562306a36Sopenharmony_ci { 0x111a153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL I)" }, 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci { 0x1123153b, BTTV_BOARD_TERRATVRADIO, "Terratec TV Radio+" }, 19862306a36Sopenharmony_ci { 0x1127153b, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.05)" }, 19962306a36Sopenharmony_ci /* clashes with FlyVideo 20062306a36Sopenharmony_ci *{ 0x18521852, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.10)" }, */ 20162306a36Sopenharmony_ci { 0x1134153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (LR102)" }, 20262306a36Sopenharmony_ci { 0x1135153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" }, /* LR102 */ 20362306a36Sopenharmony_ci { 0x5018153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue" }, /* ?? */ 20462306a36Sopenharmony_ci { 0xff3b153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" }, /* ?? */ 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci { 0x400015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, 20762306a36Sopenharmony_ci { 0x400a15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, 20862306a36Sopenharmony_ci { 0x400d15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, 20962306a36Sopenharmony_ci { 0x401015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, 21062306a36Sopenharmony_ci { 0x401615b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci { 0x1430aa00, BTTV_BOARD_PV143, "Provideo PV143A" }, 21362306a36Sopenharmony_ci { 0x1431aa00, BTTV_BOARD_PV143, "Provideo PV143B" }, 21462306a36Sopenharmony_ci { 0x1432aa00, BTTV_BOARD_PV143, "Provideo PV143C" }, 21562306a36Sopenharmony_ci { 0x1433aa00, BTTV_BOARD_PV143, "Provideo PV143D" }, 21662306a36Sopenharmony_ci { 0x1433aa03, BTTV_BOARD_PV143, "Security Eyes" }, 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci { 0x1460aa00, BTTV_BOARD_PV150, "Provideo PV150A-1" }, 21962306a36Sopenharmony_ci { 0x1461aa01, BTTV_BOARD_PV150, "Provideo PV150A-2" }, 22062306a36Sopenharmony_ci { 0x1462aa02, BTTV_BOARD_PV150, "Provideo PV150A-3" }, 22162306a36Sopenharmony_ci { 0x1463aa03, BTTV_BOARD_PV150, "Provideo PV150A-4" }, 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci { 0x1464aa04, BTTV_BOARD_PV150, "Provideo PV150B-1" }, 22462306a36Sopenharmony_ci { 0x1465aa05, BTTV_BOARD_PV150, "Provideo PV150B-2" }, 22562306a36Sopenharmony_ci { 0x1466aa06, BTTV_BOARD_PV150, "Provideo PV150B-3" }, 22662306a36Sopenharmony_ci { 0x1467aa07, BTTV_BOARD_PV150, "Provideo PV150B-4" }, 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci { 0xa132ff00, BTTV_BOARD_IVC100, "IVC-100" }, 22962306a36Sopenharmony_ci { 0xa1550000, BTTV_BOARD_IVC200, "IVC-200" }, 23062306a36Sopenharmony_ci { 0xa1550001, BTTV_BOARD_IVC200, "IVC-200" }, 23162306a36Sopenharmony_ci { 0xa1550002, BTTV_BOARD_IVC200, "IVC-200" }, 23262306a36Sopenharmony_ci { 0xa1550003, BTTV_BOARD_IVC200, "IVC-200" }, 23362306a36Sopenharmony_ci { 0xa1550100, BTTV_BOARD_IVC200, "IVC-200G" }, 23462306a36Sopenharmony_ci { 0xa1550101, BTTV_BOARD_IVC200, "IVC-200G" }, 23562306a36Sopenharmony_ci { 0xa1550102, BTTV_BOARD_IVC200, "IVC-200G" }, 23662306a36Sopenharmony_ci { 0xa1550103, BTTV_BOARD_IVC200, "IVC-200G" }, 23762306a36Sopenharmony_ci { 0xa1550800, BTTV_BOARD_IVC200, "IVC-200" }, 23862306a36Sopenharmony_ci { 0xa1550801, BTTV_BOARD_IVC200, "IVC-200" }, 23962306a36Sopenharmony_ci { 0xa1550802, BTTV_BOARD_IVC200, "IVC-200" }, 24062306a36Sopenharmony_ci { 0xa1550803, BTTV_BOARD_IVC200, "IVC-200" }, 24162306a36Sopenharmony_ci { 0xa182ff00, BTTV_BOARD_IVC120, "IVC-120G" }, 24262306a36Sopenharmony_ci { 0xa182ff01, BTTV_BOARD_IVC120, "IVC-120G" }, 24362306a36Sopenharmony_ci { 0xa182ff02, BTTV_BOARD_IVC120, "IVC-120G" }, 24462306a36Sopenharmony_ci { 0xa182ff03, BTTV_BOARD_IVC120, "IVC-120G" }, 24562306a36Sopenharmony_ci { 0xa182ff04, BTTV_BOARD_IVC120, "IVC-120G" }, 24662306a36Sopenharmony_ci { 0xa182ff05, BTTV_BOARD_IVC120, "IVC-120G" }, 24762306a36Sopenharmony_ci { 0xa182ff06, BTTV_BOARD_IVC120, "IVC-120G" }, 24862306a36Sopenharmony_ci { 0xa182ff07, BTTV_BOARD_IVC120, "IVC-120G" }, 24962306a36Sopenharmony_ci { 0xa182ff08, BTTV_BOARD_IVC120, "IVC-120G" }, 25062306a36Sopenharmony_ci { 0xa182ff09, BTTV_BOARD_IVC120, "IVC-120G" }, 25162306a36Sopenharmony_ci { 0xa182ff0a, BTTV_BOARD_IVC120, "IVC-120G" }, 25262306a36Sopenharmony_ci { 0xa182ff0b, BTTV_BOARD_IVC120, "IVC-120G" }, 25362306a36Sopenharmony_ci { 0xa182ff0c, BTTV_BOARD_IVC120, "IVC-120G" }, 25462306a36Sopenharmony_ci { 0xa182ff0d, BTTV_BOARD_IVC120, "IVC-120G" }, 25562306a36Sopenharmony_ci { 0xa182ff0e, BTTV_BOARD_IVC120, "IVC-120G" }, 25662306a36Sopenharmony_ci { 0xa182ff0f, BTTV_BOARD_IVC120, "IVC-120G" }, 25762306a36Sopenharmony_ci { 0xf0500000, BTTV_BOARD_IVCE8784, "IVCE-8784" }, 25862306a36Sopenharmony_ci { 0xf0500001, BTTV_BOARD_IVCE8784, "IVCE-8784" }, 25962306a36Sopenharmony_ci { 0xf0500002, BTTV_BOARD_IVCE8784, "IVCE-8784" }, 26062306a36Sopenharmony_ci { 0xf0500003, BTTV_BOARD_IVCE8784, "IVCE-8784" }, 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci { 0x41424344, BTTV_BOARD_GRANDTEC, "GrandTec Multi Capture" }, 26362306a36Sopenharmony_ci { 0x01020304, BTTV_BOARD_XGUARD, "Grandtec Grand X-Guard" }, 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci { 0x18501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, 26662306a36Sopenharmony_ci { 0xa0501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, 26762306a36Sopenharmony_ci { 0x18511851, BTTV_BOARD_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" }, 26862306a36Sopenharmony_ci { 0x18521852, BTTV_BOARD_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" }, 26962306a36Sopenharmony_ci { 0x41a0a051, BTTV_BOARD_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" }, 27062306a36Sopenharmony_ci { 0x18501f7f, BTTV_BOARD_FLYVIDEO_98, "Lifeview Flyvideo 98" }, 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci { 0x010115cb, BTTV_BOARD_GMV1, "AG GMV1" }, 27362306a36Sopenharmony_ci { 0x010114c7, BTTV_BOARD_MODTEC_205, "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" }, 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ci { 0x10b42636, BTTV_BOARD_HAUPPAUGE878, "STB ???" }, 27662306a36Sopenharmony_ci { 0x217d6606, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" }, 27762306a36Sopenharmony_ci { 0xfff6f6ff, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" }, 27862306a36Sopenharmony_ci { 0x03116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 311" }, 27962306a36Sopenharmony_ci { 0x06116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 611" }, 28062306a36Sopenharmony_ci { 0x00790e11, BTTV_BOARD_WINDVR, "Canopus WinDVR PCI" }, 28162306a36Sopenharmony_ci { 0xa0fca1a0, BTTV_BOARD_ZOLTRIX, "Face to Face Tvmax" }, 28262306a36Sopenharmony_ci { 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" }, 28362306a36Sopenharmony_ci { 0x146caa0c, BTTV_BOARD_PV951, "ituner spectra8" }, 28462306a36Sopenharmony_ci { 0x200a1295, BTTV_BOARD_PXC200, "ImageNation PXC200A" }, 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci { 0x40111554, BTTV_BOARD_PV_BT878P_9B, "Prolink Pixelview PV-BT" }, 28762306a36Sopenharmony_ci { 0x17de0a01, BTTV_BOARD_KWORLD, "Mecer TV/FM/Video Tuner" }, 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci { 0x01051805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #1" }, 29062306a36Sopenharmony_ci { 0x01061805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #2" }, 29162306a36Sopenharmony_ci { 0x01071805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #3" }, 29262306a36Sopenharmony_ci { 0x01081805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #4" }, 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci { 0x15409511, BTTV_BOARD_ACORP_Y878F, "Acorp Y878F" }, 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci { 0x53534149, BTTV_BOARD_SSAI_SECURITY, "SSAI Security Video Interface" }, 29762306a36Sopenharmony_ci { 0x5353414a, BTTV_BOARD_SSAI_ULTRASOUND, "SSAI Ultrasound Video Interface" }, 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci /* likely broken, vendor id doesn't match the other magic views ... 30062306a36Sopenharmony_ci * { 0xa0fca04f, BTTV_BOARD_MAGICTVIEW063, "Guillemot Maxi TV Video 3" }, */ 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci /* Duplicate PCI ID, reconfigure for this board during the eeprom read. 30362306a36Sopenharmony_ci * { 0x13eb0070, BTTV_BOARD_HAUPPAUGE_IMPACTVCB, "Hauppauge ImpactVCB" }, */ 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci { 0x109e036e, BTTV_BOARD_CONCEPTRONIC_CTVFMI2, "Conceptronic CTVFMi v2"}, 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci /* DVB cards (using pci function .1 for mpeg data xfer) */ 30862306a36Sopenharmony_ci { 0x001c11bd, BTTV_BOARD_PINNACLESAT, "Pinnacle PCTV Sat" }, 30962306a36Sopenharmony_ci { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" }, 31062306a36Sopenharmony_ci { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV"}, 31162306a36Sopenharmony_ci { 0x002611bd, BTTV_BOARD_TWINHAN_DST, "Pinnacle PCTV SAT CI" }, 31262306a36Sopenharmony_ci { 0x00011822, BTTV_BOARD_TWINHAN_DST, "Twinhan VisionPlus DVB" }, 31362306a36Sopenharmony_ci { 0xfc00270f, BTTV_BOARD_TWINHAN_DST, "ChainTech digitop DST-1000 DVB-S" }, 31462306a36Sopenharmony_ci { 0x07711461, BTTV_BOARD_AVDVBT_771, "AVermedia AverTV DVB-T 771" }, 31562306a36Sopenharmony_ci { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" }, 31662306a36Sopenharmony_ci { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE, "DViCO FusionHDTV DVB-T Lite" }, 31762306a36Sopenharmony_ci { 0xdb1118ac, BTTV_BOARD_DVICO_DVBT_LITE, "Ultraview DVB-T Lite" }, 31862306a36Sopenharmony_ci { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE, "DViCO FusionHDTV 5 Lite" }, 31962306a36Sopenharmony_ci { 0x00261822, BTTV_BOARD_TWINHAN_DST, "DNTV Live! Mini "}, 32062306a36Sopenharmony_ci { 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" }, 32162306a36Sopenharmony_ci { 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" }, 32262306a36Sopenharmony_ci { 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" }, 32362306a36Sopenharmony_ci { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" }, 32462306a36Sopenharmony_ci { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" }, 32562306a36Sopenharmony_ci { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" }, 32662306a36Sopenharmony_ci { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" }, 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci { 0x15401830, BTTV_BOARD_PV183, "Provideo PV183-1" }, 32962306a36Sopenharmony_ci { 0x15401831, BTTV_BOARD_PV183, "Provideo PV183-2" }, 33062306a36Sopenharmony_ci { 0x15401832, BTTV_BOARD_PV183, "Provideo PV183-3" }, 33162306a36Sopenharmony_ci { 0x15401833, BTTV_BOARD_PV183, "Provideo PV183-4" }, 33262306a36Sopenharmony_ci { 0x15401834, BTTV_BOARD_PV183, "Provideo PV183-5" }, 33362306a36Sopenharmony_ci { 0x15401835, BTTV_BOARD_PV183, "Provideo PV183-6" }, 33462306a36Sopenharmony_ci { 0x15401836, BTTV_BOARD_PV183, "Provideo PV183-7" }, 33562306a36Sopenharmony_ci { 0x15401837, BTTV_BOARD_PV183, "Provideo PV183-8" }, 33662306a36Sopenharmony_ci { 0x3116f200, BTTV_BOARD_TVT_TD3116, "Tongwei Video Technology TD-3116" }, 33762306a36Sopenharmony_ci { 0x02280279, BTTV_BOARD_APOSONIC_WDVR, "Aposonic W-DVR" }, 33862306a36Sopenharmony_ci { 0, -1, NULL } 33962306a36Sopenharmony_ci}; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 34262306a36Sopenharmony_ci/* array with description for bt848 / bt878 tv/grabber cards */ 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistruct tvcard bttv_tvcards[] = { 34562306a36Sopenharmony_ci /* ---- card 0x00 ---------------------------------- */ 34662306a36Sopenharmony_ci [BTTV_BOARD_UNKNOWN] = { 34762306a36Sopenharmony_ci .name = " *** UNKNOWN/GENERIC *** ", 34862306a36Sopenharmony_ci .video_inputs = 4, 34962306a36Sopenharmony_ci .svhs = 2, 35062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 35162306a36Sopenharmony_ci .tuner_type = UNSET, 35262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 35362306a36Sopenharmony_ci }, 35462306a36Sopenharmony_ci [BTTV_BOARD_MIRO] = { 35562306a36Sopenharmony_ci .name = "MIRO PCTV", 35662306a36Sopenharmony_ci .video_inputs = 4, 35762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 35862306a36Sopenharmony_ci .svhs = 2, 35962306a36Sopenharmony_ci .gpiomask = 15, 36062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 36162306a36Sopenharmony_ci .gpiomux = { 2, 0, 0, 0 }, 36262306a36Sopenharmony_ci .gpiomute = 10, 36362306a36Sopenharmony_ci .tuner_type = UNSET, 36462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 36562306a36Sopenharmony_ci }, 36662306a36Sopenharmony_ci [BTTV_BOARD_HAUPPAUGE] = { 36762306a36Sopenharmony_ci .name = "Hauppauge (bt848)", 36862306a36Sopenharmony_ci .video_inputs = 4, 36962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 37062306a36Sopenharmony_ci .svhs = 2, 37162306a36Sopenharmony_ci .gpiomask = 7, 37262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 37362306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3 }, 37462306a36Sopenharmony_ci .gpiomute = 4, 37562306a36Sopenharmony_ci .tuner_type = UNSET, 37662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 37762306a36Sopenharmony_ci }, 37862306a36Sopenharmony_ci [BTTV_BOARD_STB] = { 37962306a36Sopenharmony_ci .name = "STB, Gateway P/N 6000699 (bt848)", 38062306a36Sopenharmony_ci .video_inputs = 3, 38162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 38262306a36Sopenharmony_ci .svhs = 2, 38362306a36Sopenharmony_ci .gpiomask = 7, 38462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 38562306a36Sopenharmony_ci .gpiomux = { 4, 0, 2, 3 }, 38662306a36Sopenharmony_ci .gpiomute = 1, 38762306a36Sopenharmony_ci .no_msp34xx = 1, 38862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC, 38962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 39062306a36Sopenharmony_ci .pll = PLL_28, 39162306a36Sopenharmony_ci .has_radio = 1, 39262306a36Sopenharmony_ci }, 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci /* ---- card 0x04 ---------------------------------- */ 39562306a36Sopenharmony_ci [BTTV_BOARD_INTEL] = { 39662306a36Sopenharmony_ci .name = "Intel Create and Share PCI/ Smart Video Recorder III", 39762306a36Sopenharmony_ci .video_inputs = 4, 39862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 39962306a36Sopenharmony_ci .svhs = 2, 40062306a36Sopenharmony_ci .gpiomask = 0, 40162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 40262306a36Sopenharmony_ci .gpiomux = { 0 }, 40362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 40462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 40562306a36Sopenharmony_ci }, 40662306a36Sopenharmony_ci [BTTV_BOARD_DIAMOND] = { 40762306a36Sopenharmony_ci .name = "Diamond DTV2000", 40862306a36Sopenharmony_ci .video_inputs = 4, 40962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 41062306a36Sopenharmony_ci .svhs = 2, 41162306a36Sopenharmony_ci .gpiomask = 3, 41262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 41362306a36Sopenharmony_ci .gpiomux = { 0, 1, 0, 1 }, 41462306a36Sopenharmony_ci .gpiomute = 3, 41562306a36Sopenharmony_ci .tuner_type = UNSET, 41662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 41762306a36Sopenharmony_ci }, 41862306a36Sopenharmony_ci [BTTV_BOARD_AVERMEDIA] = { 41962306a36Sopenharmony_ci .name = "AVerMedia TVPhone", 42062306a36Sopenharmony_ci .video_inputs = 3, 42162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 42262306a36Sopenharmony_ci .svhs = 3, 42362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 42462306a36Sopenharmony_ci .gpiomask = 0x0f, 42562306a36Sopenharmony_ci .gpiomux = { 0x0c, 0x04, 0x08, 0x04 }, 42662306a36Sopenharmony_ci /* 0x04 for some cards ?? */ 42762306a36Sopenharmony_ci .tuner_type = UNSET, 42862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 42962306a36Sopenharmony_ci .audio_mode_gpio= avermedia_tvphone_audio, 43062306a36Sopenharmony_ci .has_remote = 1, 43162306a36Sopenharmony_ci }, 43262306a36Sopenharmony_ci [BTTV_BOARD_MATRIX_VISION] = { 43362306a36Sopenharmony_ci .name = "MATRIX-Vision MV-Delta", 43462306a36Sopenharmony_ci .video_inputs = 5, 43562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 43662306a36Sopenharmony_ci .svhs = 3, 43762306a36Sopenharmony_ci .gpiomask = 0, 43862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0, 0), 43962306a36Sopenharmony_ci .gpiomux = { 0 }, 44062306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 44162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 44262306a36Sopenharmony_ci }, 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_ci /* ---- card 0x08 ---------------------------------- */ 44562306a36Sopenharmony_ci [BTTV_BOARD_FLYVIDEO] = { 44662306a36Sopenharmony_ci .name = "Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26", 44762306a36Sopenharmony_ci .video_inputs = 4, 44862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 44962306a36Sopenharmony_ci .svhs = 2, 45062306a36Sopenharmony_ci .gpiomask = 0xc00, 45162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 45262306a36Sopenharmony_ci .gpiomux = { 0, 0xc00, 0x800, 0x400 }, 45362306a36Sopenharmony_ci .gpiomute = 0xc00, 45462306a36Sopenharmony_ci .pll = PLL_28, 45562306a36Sopenharmony_ci .tuner_type = UNSET, 45662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 45762306a36Sopenharmony_ci }, 45862306a36Sopenharmony_ci [BTTV_BOARD_TURBOTV] = { 45962306a36Sopenharmony_ci .name = "IMS/IXmicro TurboTV", 46062306a36Sopenharmony_ci .video_inputs = 3, 46162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 46262306a36Sopenharmony_ci .svhs = 2, 46362306a36Sopenharmony_ci .gpiomask = 3, 46462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 46562306a36Sopenharmony_ci .gpiomux = { 1, 1, 2, 3 }, 46662306a36Sopenharmony_ci .pll = PLL_28, 46762306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_PAL, 46862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 46962306a36Sopenharmony_ci }, 47062306a36Sopenharmony_ci [BTTV_BOARD_HAUPPAUGE878] = { 47162306a36Sopenharmony_ci .name = "Hauppauge (bt878)", 47262306a36Sopenharmony_ci .video_inputs = 4, 47362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 47462306a36Sopenharmony_ci .svhs = 2, 47562306a36Sopenharmony_ci .gpiomask = 0x0f, /* old: 7 */ 47662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 0, 1, 1), 47762306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3 }, 47862306a36Sopenharmony_ci .gpiomute = 4, 47962306a36Sopenharmony_ci .pll = PLL_28, 48062306a36Sopenharmony_ci .tuner_type = UNSET, 48162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 48262306a36Sopenharmony_ci }, 48362306a36Sopenharmony_ci [BTTV_BOARD_MIROPRO] = { 48462306a36Sopenharmony_ci .name = "MIRO PCTV pro", 48562306a36Sopenharmony_ci .video_inputs = 3, 48662306a36Sopenharmony_ci /* .audio_inputs= 1, */ 48762306a36Sopenharmony_ci .svhs = 2, 48862306a36Sopenharmony_ci .gpiomask = 0x3014f, 48962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 49062306a36Sopenharmony_ci .gpiomux = { 0x20001,0x10001, 0, 0 }, 49162306a36Sopenharmony_ci .gpiomute = 10, 49262306a36Sopenharmony_ci .tuner_type = UNSET, 49362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 49462306a36Sopenharmony_ci }, 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci /* ---- card 0x0c ---------------------------------- */ 49762306a36Sopenharmony_ci [BTTV_BOARD_ADSTECH_TV] = { 49862306a36Sopenharmony_ci .name = "ADS Technologies Channel Surfer TV (bt848)", 49962306a36Sopenharmony_ci .video_inputs = 3, 50062306a36Sopenharmony_ci /* .audio_inputs= 1, */ 50162306a36Sopenharmony_ci .svhs = 2, 50262306a36Sopenharmony_ci .gpiomask = 15, 50362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 50462306a36Sopenharmony_ci .gpiomux = { 13, 14, 11, 7 }, 50562306a36Sopenharmony_ci .tuner_type = UNSET, 50662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 50762306a36Sopenharmony_ci }, 50862306a36Sopenharmony_ci [BTTV_BOARD_AVERMEDIA98] = { 50962306a36Sopenharmony_ci .name = "AVerMedia TVCapture 98", 51062306a36Sopenharmony_ci .video_inputs = 3, 51162306a36Sopenharmony_ci /* .audio_inputs= 4, */ 51262306a36Sopenharmony_ci .svhs = 2, 51362306a36Sopenharmony_ci .gpiomask = 15, 51462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 51562306a36Sopenharmony_ci .gpiomux = { 13, 14, 11, 7 }, 51662306a36Sopenharmony_ci .msp34xx_alt = 1, 51762306a36Sopenharmony_ci .pll = PLL_28, 51862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 51962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 52062306a36Sopenharmony_ci .audio_mode_gpio= avermedia_tv_stereo_audio, 52162306a36Sopenharmony_ci .no_gpioirq = 1, 52262306a36Sopenharmony_ci }, 52362306a36Sopenharmony_ci [BTTV_BOARD_VHX] = { 52462306a36Sopenharmony_ci .name = "Aimslab Video Highway Xtreme (VHX)", 52562306a36Sopenharmony_ci .video_inputs = 3, 52662306a36Sopenharmony_ci /* .audio_inputs= 1, */ 52762306a36Sopenharmony_ci .svhs = 2, 52862306a36Sopenharmony_ci .gpiomask = 7, 52962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 53062306a36Sopenharmony_ci .gpiomux = { 0, 2, 1, 3 }, /* old: {0, 1, 2, 3, 4} */ 53162306a36Sopenharmony_ci .gpiomute = 4, 53262306a36Sopenharmony_ci .pll = PLL_28, 53362306a36Sopenharmony_ci .tuner_type = UNSET, 53462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 53562306a36Sopenharmony_ci }, 53662306a36Sopenharmony_ci [BTTV_BOARD_ZOLTRIX] = { 53762306a36Sopenharmony_ci .name = "Zoltrix TV-Max", 53862306a36Sopenharmony_ci .video_inputs = 3, 53962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 54062306a36Sopenharmony_ci .svhs = 2, 54162306a36Sopenharmony_ci .gpiomask = 15, 54262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 54362306a36Sopenharmony_ci .gpiomux = { 0, 0, 1, 0 }, 54462306a36Sopenharmony_ci .gpiomute = 10, 54562306a36Sopenharmony_ci .tuner_type = UNSET, 54662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 54762306a36Sopenharmony_ci }, 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ci /* ---- card 0x10 ---------------------------------- */ 55062306a36Sopenharmony_ci [BTTV_BOARD_PIXVIEWPLAYTV] = { 55162306a36Sopenharmony_ci .name = "Prolink Pixelview PlayTV (bt878)", 55262306a36Sopenharmony_ci .video_inputs = 3, 55362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 55462306a36Sopenharmony_ci .svhs = 2, 55562306a36Sopenharmony_ci .gpiomask = 0x01fe00, 55662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 55762306a36Sopenharmony_ci /* 2003-10-20 by "Anton A. Arapov" <arapov@mail.ru> */ 55862306a36Sopenharmony_ci .gpiomux = { 0x001e00, 0, 0x018000, 0x014000 }, 55962306a36Sopenharmony_ci .gpiomute = 0x002000, 56062306a36Sopenharmony_ci .pll = PLL_28, 56162306a36Sopenharmony_ci .tuner_type = UNSET, 56262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 56362306a36Sopenharmony_ci }, 56462306a36Sopenharmony_ci [BTTV_BOARD_WINVIEW_601] = { 56562306a36Sopenharmony_ci .name = "Leadtek WinView 601", 56662306a36Sopenharmony_ci .video_inputs = 3, 56762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 56862306a36Sopenharmony_ci .svhs = 2, 56962306a36Sopenharmony_ci .gpiomask = 0x8300f8, 57062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1, 0), 57162306a36Sopenharmony_ci .gpiomux = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007 }, 57262306a36Sopenharmony_ci .gpiomute = 0xcfa007, 57362306a36Sopenharmony_ci .tuner_type = UNSET, 57462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 57562306a36Sopenharmony_ci .volume_gpio = winview_volume, 57662306a36Sopenharmony_ci .has_radio = 1, 57762306a36Sopenharmony_ci }, 57862306a36Sopenharmony_ci [BTTV_BOARD_AVEC_INTERCAP] = { 57962306a36Sopenharmony_ci .name = "AVEC Intercapture", 58062306a36Sopenharmony_ci .video_inputs = 3, 58162306a36Sopenharmony_ci /* .audio_inputs= 2, */ 58262306a36Sopenharmony_ci .svhs = 2, 58362306a36Sopenharmony_ci .gpiomask = 0, 58462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 58562306a36Sopenharmony_ci .gpiomux = { 1, 0, 0, 0 }, 58662306a36Sopenharmony_ci .tuner_type = UNSET, 58762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 58862306a36Sopenharmony_ci }, 58962306a36Sopenharmony_ci [BTTV_BOARD_LIFE_FLYKIT] = { 59062306a36Sopenharmony_ci .name = "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)", 59162306a36Sopenharmony_ci .video_inputs = 4, 59262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 59362306a36Sopenharmony_ci .svhs = NO_SVHS, 59462306a36Sopenharmony_ci .gpiomask = 0x8dff00, 59562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 59662306a36Sopenharmony_ci .gpiomux = { 0 }, 59762306a36Sopenharmony_ci .no_msp34xx = 1, 59862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 59962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 60062306a36Sopenharmony_ci }, 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ci /* ---- card 0x14 ---------------------------------- */ 60362306a36Sopenharmony_ci [BTTV_BOARD_CEI_RAFFLES] = { 60462306a36Sopenharmony_ci .name = "CEI Raffles Card", 60562306a36Sopenharmony_ci .video_inputs = 3, 60662306a36Sopenharmony_ci /* .audio_inputs= 3, */ 60762306a36Sopenharmony_ci .svhs = 2, 60862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 60962306a36Sopenharmony_ci .tuner_type = UNSET, 61062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 61162306a36Sopenharmony_ci }, 61262306a36Sopenharmony_ci [BTTV_BOARD_CONFERENCETV] = { 61362306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50", 61462306a36Sopenharmony_ci .video_inputs = 4, 61562306a36Sopenharmony_ci /* .audio_inputs= 2, tuner, line in */ 61662306a36Sopenharmony_ci .svhs = 2, 61762306a36Sopenharmony_ci .gpiomask = 0x1800, 61862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 61962306a36Sopenharmony_ci .gpiomux = { 0, 0x800, 0x1000, 0x1000 }, 62062306a36Sopenharmony_ci .gpiomute = 0x1800, 62162306a36Sopenharmony_ci .pll = PLL_28, 62262306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 62362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 62462306a36Sopenharmony_ci }, 62562306a36Sopenharmony_ci [BTTV_BOARD_PHOEBE_TVMAS] = { 62662306a36Sopenharmony_ci .name = "Askey CPH050/ Phoebe Tv Master + FM", 62762306a36Sopenharmony_ci .video_inputs = 3, 62862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 62962306a36Sopenharmony_ci .svhs = 2, 63062306a36Sopenharmony_ci .gpiomask = 0xc00, 63162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 63262306a36Sopenharmony_ci .gpiomux = { 0, 1, 0x800, 0x400 }, 63362306a36Sopenharmony_ci .gpiomute = 0xc00, 63462306a36Sopenharmony_ci .pll = PLL_28, 63562306a36Sopenharmony_ci .tuner_type = UNSET, 63662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 63762306a36Sopenharmony_ci }, 63862306a36Sopenharmony_ci [BTTV_BOARD_MODTEC_205] = { 63962306a36Sopenharmony_ci .name = "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878", 64062306a36Sopenharmony_ci .video_inputs = 3, 64162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 64262306a36Sopenharmony_ci .svhs = NO_SVHS, 64362306a36Sopenharmony_ci .has_dig_in = 1, 64462306a36Sopenharmony_ci .gpiomask = 7, 64562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0), /* input 2 is digital */ 64662306a36Sopenharmony_ci /* .digital_mode= DIGITAL_MODE_CAMERA, */ 64762306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, 64862306a36Sopenharmony_ci .no_msp34xx = 1, 64962306a36Sopenharmony_ci .pll = PLL_28, 65062306a36Sopenharmony_ci .tuner_type = TUNER_ALPS_TSBB5_PAL_I, 65162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 65262306a36Sopenharmony_ci }, 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci /* ---- card 0x18 ---------------------------------- */ 65562306a36Sopenharmony_ci [BTTV_BOARD_MAGICTVIEW061] = { 65662306a36Sopenharmony_ci .name = "Askey CPH05X/06X (bt878) [many vendors]", 65762306a36Sopenharmony_ci .video_inputs = 3, 65862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 65962306a36Sopenharmony_ci .svhs = 2, 66062306a36Sopenharmony_ci .gpiomask = 0xe00, 66162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 66262306a36Sopenharmony_ci .gpiomux = {0x400, 0x400, 0x400, 0x400 }, 66362306a36Sopenharmony_ci .gpiomute = 0xc00, 66462306a36Sopenharmony_ci .pll = PLL_28, 66562306a36Sopenharmony_ci .tuner_type = UNSET, 66662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 66762306a36Sopenharmony_ci .has_remote = 1, 66862306a36Sopenharmony_ci .has_radio = 1, /* not every card has radio */ 66962306a36Sopenharmony_ci }, 67062306a36Sopenharmony_ci [BTTV_BOARD_VOBIS_BOOSTAR] = { 67162306a36Sopenharmony_ci .name = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar", 67262306a36Sopenharmony_ci .video_inputs = 3, 67362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 67462306a36Sopenharmony_ci .svhs = 2, 67562306a36Sopenharmony_ci .gpiomask = 0x1f0fff, 67662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 67762306a36Sopenharmony_ci .gpiomux = { 0x20000, 0x30000, 0x10000, 0 }, 67862306a36Sopenharmony_ci .gpiomute = 0x40000, 67962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 68062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 68162306a36Sopenharmony_ci .audio_mode_gpio= terratv_audio, 68262306a36Sopenharmony_ci }, 68362306a36Sopenharmony_ci [BTTV_BOARD_HAUPPAUG_WCAM] = { 68462306a36Sopenharmony_ci .name = "Hauppauge WinCam newer (bt878)", 68562306a36Sopenharmony_ci .video_inputs = 4, 68662306a36Sopenharmony_ci /* .audio_inputs= 1, */ 68762306a36Sopenharmony_ci .svhs = 3, 68862306a36Sopenharmony_ci .gpiomask = 7, 68962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 0, 1, 1), 69062306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3 }, 69162306a36Sopenharmony_ci .gpiomute = 4, 69262306a36Sopenharmony_ci .tuner_type = UNSET, 69362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 69462306a36Sopenharmony_ci }, 69562306a36Sopenharmony_ci [BTTV_BOARD_MAXI] = { 69662306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50", 69762306a36Sopenharmony_ci .video_inputs = 4, 69862306a36Sopenharmony_ci /* .audio_inputs= 2, */ 69962306a36Sopenharmony_ci .svhs = 2, 70062306a36Sopenharmony_ci .gpiomask = 0x1800, 70162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 70262306a36Sopenharmony_ci .gpiomux = { 0, 0x800, 0x1000, 0x1000 }, 70362306a36Sopenharmony_ci .gpiomute = 0x1800, 70462306a36Sopenharmony_ci .pll = PLL_28, 70562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_SECAM, 70662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 70762306a36Sopenharmony_ci }, 70862306a36Sopenharmony_ci 70962306a36Sopenharmony_ci /* ---- card 0x1c ---------------------------------- */ 71062306a36Sopenharmony_ci [BTTV_BOARD_TERRATV] = { 71162306a36Sopenharmony_ci .name = "Terratec TerraTV+ Version 1.1 (bt878)", 71262306a36Sopenharmony_ci .video_inputs = 3, 71362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 71462306a36Sopenharmony_ci .svhs = 2, 71562306a36Sopenharmony_ci .gpiomask = 0x1f0fff, 71662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 71762306a36Sopenharmony_ci .gpiomux = { 0x20000, 0x30000, 0x10000, 0x00000 }, 71862306a36Sopenharmony_ci .gpiomute = 0x40000, 71962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 72062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 72162306a36Sopenharmony_ci .audio_mode_gpio= terratv_audio, 72262306a36Sopenharmony_ci /* GPIO wiring: 72362306a36Sopenharmony_ci External 20 pin connector (for Active Radio Upgrade board) 72462306a36Sopenharmony_ci gpio00: i2c-sda 72562306a36Sopenharmony_ci gpio01: i2c-scl 72662306a36Sopenharmony_ci gpio02: om5610-data 72762306a36Sopenharmony_ci gpio03: om5610-clk 72862306a36Sopenharmony_ci gpio04: om5610-wre 72962306a36Sopenharmony_ci gpio05: om5610-stereo 73062306a36Sopenharmony_ci gpio06: rds6588-davn 73162306a36Sopenharmony_ci gpio07: Pin 7 n.c. 73262306a36Sopenharmony_ci gpio08: nIOW 73362306a36Sopenharmony_ci gpio09+10: nIOR, nSEL ?? (bt878) 73462306a36Sopenharmony_ci gpio09: nIOR (bt848) 73562306a36Sopenharmony_ci gpio10: nSEL (bt848) 73662306a36Sopenharmony_ci Sound Routing: 73762306a36Sopenharmony_ci gpio16: u2-A0 (1st 4052bt) 73862306a36Sopenharmony_ci gpio17: u2-A1 73962306a36Sopenharmony_ci gpio18: u2-nEN 74062306a36Sopenharmony_ci gpio19: u4-A0 (2nd 4052) 74162306a36Sopenharmony_ci gpio20: u4-A1 74262306a36Sopenharmony_ci u4-nEN - GND 74362306a36Sopenharmony_ci Btspy: 74462306a36Sopenharmony_ci 00000 : Cdrom (internal audio input) 74562306a36Sopenharmony_ci 10000 : ext. Video audio input 74662306a36Sopenharmony_ci 20000 : TV Mono 74762306a36Sopenharmony_ci a0000 : TV Mono/2 74862306a36Sopenharmony_ci 1a0000 : TV Stereo 74962306a36Sopenharmony_ci 30000 : Radio 75062306a36Sopenharmony_ci 40000 : Mute 75162306a36Sopenharmony_ci */ 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci }, 75462306a36Sopenharmony_ci [BTTV_BOARD_PXC200] = { 75562306a36Sopenharmony_ci /* Jannik Fritsch <jannik@techfak.uni-bielefeld.de> */ 75662306a36Sopenharmony_ci .name = "Imagenation PXC200", 75762306a36Sopenharmony_ci .video_inputs = 5, 75862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 75962306a36Sopenharmony_ci .svhs = 1, /* was: 4 */ 76062306a36Sopenharmony_ci .gpiomask = 0, 76162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0, 0), 76262306a36Sopenharmony_ci .gpiomux = { 0 }, 76362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 76462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 76562306a36Sopenharmony_ci .muxsel_hook = PXC200_muxsel, 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ci }, 76862306a36Sopenharmony_ci [BTTV_BOARD_FLYVIDEO_98] = { 76962306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98 LR50", 77062306a36Sopenharmony_ci .video_inputs = 4, 77162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 77262306a36Sopenharmony_ci .svhs = 2, 77362306a36Sopenharmony_ci .gpiomask = 0x1800, /* 0x8dfe00 */ 77462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 77562306a36Sopenharmony_ci .gpiomux = { 0, 0x0800, 0x1000, 0x1000 }, 77662306a36Sopenharmony_ci .gpiomute = 0x1800, 77762306a36Sopenharmony_ci .pll = PLL_28, 77862306a36Sopenharmony_ci .tuner_type = UNSET, 77962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 78062306a36Sopenharmony_ci }, 78162306a36Sopenharmony_ci [BTTV_BOARD_IPROTV] = { 78262306a36Sopenharmony_ci .name = "Formac iProTV, Formac ProTV I (bt848)", 78362306a36Sopenharmony_ci .video_inputs = 4, 78462306a36Sopenharmony_ci /* .audio_inputs= 1, */ 78562306a36Sopenharmony_ci .svhs = 3, 78662306a36Sopenharmony_ci .gpiomask = 1, 78762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 78862306a36Sopenharmony_ci .gpiomux = { 1, 0, 0, 0 }, 78962306a36Sopenharmony_ci .pll = PLL_28, 79062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 79162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 79262306a36Sopenharmony_ci }, 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci /* ---- card 0x20 ---------------------------------- */ 79562306a36Sopenharmony_ci [BTTV_BOARD_INTEL_C_S_PCI] = { 79662306a36Sopenharmony_ci .name = "Intel Create and Share PCI/ Smart Video Recorder III", 79762306a36Sopenharmony_ci .video_inputs = 4, 79862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 79962306a36Sopenharmony_ci .svhs = 2, 80062306a36Sopenharmony_ci .gpiomask = 0, 80162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 80262306a36Sopenharmony_ci .gpiomux = { 0 }, 80362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 80462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 80562306a36Sopenharmony_ci }, 80662306a36Sopenharmony_ci [BTTV_BOARD_TERRATVALUE] = { 80762306a36Sopenharmony_ci .name = "Terratec TerraTValue Version Bt878", 80862306a36Sopenharmony_ci .video_inputs = 3, 80962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 81062306a36Sopenharmony_ci .svhs = 2, 81162306a36Sopenharmony_ci .gpiomask = 0xffff00, 81262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 81362306a36Sopenharmony_ci .gpiomux = { 0x500, 0, 0x300, 0x900 }, 81462306a36Sopenharmony_ci .gpiomute = 0x900, 81562306a36Sopenharmony_ci .pll = PLL_28, 81662306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 81762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 81862306a36Sopenharmony_ci }, 81962306a36Sopenharmony_ci [BTTV_BOARD_WINFAST2000] = { 82062306a36Sopenharmony_ci .name = "Leadtek WinFast 2000/ WinFast 2000 XP", 82162306a36Sopenharmony_ci .video_inputs = 4, 82262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 82362306a36Sopenharmony_ci .svhs = 2, 82462306a36Sopenharmony_ci /* TV, CVid, SVid, CVid over SVid connector */ 82562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1, 0), 82662306a36Sopenharmony_ci /* Alexander Varakin <avarakin@hotmail.com> [stereo version] */ 82762306a36Sopenharmony_ci .gpiomask = 0xb33000, 82862306a36Sopenharmony_ci .gpiomux = { 0x122000,0x1000,0x0000,0x620000 }, 82962306a36Sopenharmony_ci .gpiomute = 0x800000, 83062306a36Sopenharmony_ci /* Audio Routing for "WinFast 2000 XP" (no tv stereo !) 83162306a36Sopenharmony_ci gpio23 -- hef4052:nEnable (0x800000) 83262306a36Sopenharmony_ci gpio12 -- hef4052:A1 83362306a36Sopenharmony_ci gpio13 -- hef4052:A0 83462306a36Sopenharmony_ci 0x0000: external audio 83562306a36Sopenharmony_ci 0x1000: FM 83662306a36Sopenharmony_ci 0x2000: TV 83762306a36Sopenharmony_ci 0x3000: n.c. 83862306a36Sopenharmony_ci Note: There exists another variant "Winfast 2000" with tv stereo !? 83962306a36Sopenharmony_ci Note: eeprom only contains FF and pci subsystem id 107d:6606 84062306a36Sopenharmony_ci */ 84162306a36Sopenharmony_ci .pll = PLL_28, 84262306a36Sopenharmony_ci .has_radio = 1, 84362306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, /* default for now, gpio reads BFFF06 for Pal bg+dk */ 84462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 84562306a36Sopenharmony_ci .audio_mode_gpio= winfast2000_audio, 84662306a36Sopenharmony_ci .has_remote = 1, 84762306a36Sopenharmony_ci }, 84862306a36Sopenharmony_ci [BTTV_BOARD_CHRONOS_VS2] = { 84962306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II", 85062306a36Sopenharmony_ci .video_inputs = 4, 85162306a36Sopenharmony_ci /* .audio_inputs= 3, */ 85262306a36Sopenharmony_ci .svhs = 2, 85362306a36Sopenharmony_ci .gpiomask = 0x1800, 85462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 85562306a36Sopenharmony_ci .gpiomux = { 0, 0x800, 0x1000, 0x1000 }, 85662306a36Sopenharmony_ci .gpiomute = 0x1800, 85762306a36Sopenharmony_ci .pll = PLL_28, 85862306a36Sopenharmony_ci .tuner_type = UNSET, 85962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 86062306a36Sopenharmony_ci }, 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci /* ---- card 0x24 ---------------------------------- */ 86362306a36Sopenharmony_ci [BTTV_BOARD_TYPHOON_TVIEW] = { 86462306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner", 86562306a36Sopenharmony_ci .video_inputs = 4, 86662306a36Sopenharmony_ci /* .audio_inputs= 3, */ 86762306a36Sopenharmony_ci .svhs = 2, 86862306a36Sopenharmony_ci .gpiomask = 0x1800, 86962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 87062306a36Sopenharmony_ci .gpiomux = { 0, 0x800, 0x1000, 0x1000 }, 87162306a36Sopenharmony_ci .gpiomute = 0x1800, 87262306a36Sopenharmony_ci .pll = PLL_28, 87362306a36Sopenharmony_ci .tuner_type = UNSET, 87462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 87562306a36Sopenharmony_ci .has_radio = 1, 87662306a36Sopenharmony_ci }, 87762306a36Sopenharmony_ci [BTTV_BOARD_PXELVWPLTVPRO] = { 87862306a36Sopenharmony_ci .name = "Prolink PixelView PlayTV pro", 87962306a36Sopenharmony_ci .video_inputs = 3, 88062306a36Sopenharmony_ci /* .audio_inputs= 1, */ 88162306a36Sopenharmony_ci .svhs = 2, 88262306a36Sopenharmony_ci .gpiomask = 0xff, 88362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 88462306a36Sopenharmony_ci .gpiomux = { 0x21, 0x20, 0x24, 0x2c }, 88562306a36Sopenharmony_ci .gpiomute = 0x29, 88662306a36Sopenharmony_ci .no_msp34xx = 1, 88762306a36Sopenharmony_ci .pll = PLL_28, 88862306a36Sopenharmony_ci .tuner_type = UNSET, 88962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 89062306a36Sopenharmony_ci }, 89162306a36Sopenharmony_ci [BTTV_BOARD_MAGICTVIEW063] = { 89262306a36Sopenharmony_ci .name = "Askey CPH06X TView99", 89362306a36Sopenharmony_ci .video_inputs = 4, 89462306a36Sopenharmony_ci /* .audio_inputs= 1, */ 89562306a36Sopenharmony_ci .svhs = 2, 89662306a36Sopenharmony_ci .gpiomask = 0x551e00, 89762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 89862306a36Sopenharmony_ci .gpiomux = { 0x551400, 0x551200, 0, 0 }, 89962306a36Sopenharmony_ci .gpiomute = 0x551c00, 90062306a36Sopenharmony_ci .pll = PLL_28, 90162306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 90262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 90362306a36Sopenharmony_ci .has_remote = 1, 90462306a36Sopenharmony_ci }, 90562306a36Sopenharmony_ci [BTTV_BOARD_PINNACLE] = { 90662306a36Sopenharmony_ci .name = "Pinnacle PCTV Studio/Rave", 90762306a36Sopenharmony_ci .video_inputs = 3, 90862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 90962306a36Sopenharmony_ci .svhs = 2, 91062306a36Sopenharmony_ci .gpiomask = 0x03000F, 91162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 91262306a36Sopenharmony_ci .gpiomux = { 2, 0xd0001, 0, 0 }, 91362306a36Sopenharmony_ci .gpiomute = 1, 91462306a36Sopenharmony_ci .pll = PLL_28, 91562306a36Sopenharmony_ci .tuner_type = UNSET, 91662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 91762306a36Sopenharmony_ci }, 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci /* ---- card 0x28 ---------------------------------- */ 92062306a36Sopenharmony_ci [BTTV_BOARD_STB2] = { 92162306a36Sopenharmony_ci .name = "STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100", 92262306a36Sopenharmony_ci .video_inputs = 3, 92362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 92462306a36Sopenharmony_ci .svhs = 2, 92562306a36Sopenharmony_ci .gpiomask = 7, 92662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 92762306a36Sopenharmony_ci .gpiomux = { 4, 0, 2, 3 }, 92862306a36Sopenharmony_ci .gpiomute = 1, 92962306a36Sopenharmony_ci .no_msp34xx = 1, 93062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC, 93162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 93262306a36Sopenharmony_ci .pll = PLL_28, 93362306a36Sopenharmony_ci .has_radio = 1, 93462306a36Sopenharmony_ci }, 93562306a36Sopenharmony_ci [BTTV_BOARD_AVPHONE98] = { 93662306a36Sopenharmony_ci .name = "AVerMedia TVPhone 98", 93762306a36Sopenharmony_ci .video_inputs = 3, 93862306a36Sopenharmony_ci /* .audio_inputs= 4, */ 93962306a36Sopenharmony_ci .svhs = 2, 94062306a36Sopenharmony_ci .gpiomask = 15, 94162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 94262306a36Sopenharmony_ci .gpiomux = { 13, 4, 11, 7 }, 94362306a36Sopenharmony_ci .pll = PLL_28, 94462306a36Sopenharmony_ci .tuner_type = UNSET, 94562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 94662306a36Sopenharmony_ci .has_radio = 1, 94762306a36Sopenharmony_ci .audio_mode_gpio= avermedia_tvphone_audio, 94862306a36Sopenharmony_ci }, 94962306a36Sopenharmony_ci [BTTV_BOARD_PV951] = { 95062306a36Sopenharmony_ci .name = "ProVideo PV951", /* pic16c54 */ 95162306a36Sopenharmony_ci .video_inputs = 3, 95262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 95362306a36Sopenharmony_ci .svhs = 2, 95462306a36Sopenharmony_ci .gpiomask = 0, 95562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 95662306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0}, 95762306a36Sopenharmony_ci .no_msp34xx = 1, 95862306a36Sopenharmony_ci .pll = PLL_28, 95962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 96062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 96162306a36Sopenharmony_ci }, 96262306a36Sopenharmony_ci [BTTV_BOARD_ONAIR_TV] = { 96362306a36Sopenharmony_ci .name = "Little OnAir TV", 96462306a36Sopenharmony_ci .video_inputs = 3, 96562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 96662306a36Sopenharmony_ci .svhs = 2, 96762306a36Sopenharmony_ci .gpiomask = 0xe00b, 96862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 96962306a36Sopenharmony_ci .gpiomux = { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0 }, 97062306a36Sopenharmony_ci .gpiomute = 0xff3ffc, 97162306a36Sopenharmony_ci .no_msp34xx = 1, 97262306a36Sopenharmony_ci .tuner_type = UNSET, 97362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 97462306a36Sopenharmony_ci }, 97562306a36Sopenharmony_ci 97662306a36Sopenharmony_ci /* ---- card 0x2c ---------------------------------- */ 97762306a36Sopenharmony_ci [BTTV_BOARD_SIGMA_TVII_FM] = { 97862306a36Sopenharmony_ci .name = "Sigma TVII-FM", 97962306a36Sopenharmony_ci .video_inputs = 2, 98062306a36Sopenharmony_ci /* .audio_inputs= 1, */ 98162306a36Sopenharmony_ci .svhs = NO_SVHS, 98262306a36Sopenharmony_ci .gpiomask = 3, 98362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 98462306a36Sopenharmony_ci .gpiomux = { 1, 1, 0, 2 }, 98562306a36Sopenharmony_ci .gpiomute = 3, 98662306a36Sopenharmony_ci .no_msp34xx = 1, 98762306a36Sopenharmony_ci .pll = PLL_NONE, 98862306a36Sopenharmony_ci .tuner_type = UNSET, 98962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 99062306a36Sopenharmony_ci }, 99162306a36Sopenharmony_ci [BTTV_BOARD_MATRIX_VISION2] = { 99262306a36Sopenharmony_ci .name = "MATRIX-Vision MV-Delta 2", 99362306a36Sopenharmony_ci .video_inputs = 5, 99462306a36Sopenharmony_ci /* .audio_inputs= 1, */ 99562306a36Sopenharmony_ci .svhs = 3, 99662306a36Sopenharmony_ci .gpiomask = 0, 99762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0, 0), 99862306a36Sopenharmony_ci .gpiomux = { 0 }, 99962306a36Sopenharmony_ci .no_msp34xx = 1, 100062306a36Sopenharmony_ci .pll = PLL_28, 100162306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 100262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 100362306a36Sopenharmony_ci }, 100462306a36Sopenharmony_ci [BTTV_BOARD_ZOLTRIX_GENIE] = { 100562306a36Sopenharmony_ci .name = "Zoltrix Genie TV/FM", 100662306a36Sopenharmony_ci .video_inputs = 3, 100762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 100862306a36Sopenharmony_ci .svhs = 2, 100962306a36Sopenharmony_ci .gpiomask = 0xbcf03f, 101062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 101162306a36Sopenharmony_ci .gpiomux = { 0xbc803f, 0xbc903f, 0xbcb03f, 0 }, 101262306a36Sopenharmony_ci .gpiomute = 0xbcb03f, 101362306a36Sopenharmony_ci .no_msp34xx = 1, 101462306a36Sopenharmony_ci .pll = PLL_28, 101562306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_4039FR5_NTSC, 101662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 101762306a36Sopenharmony_ci }, 101862306a36Sopenharmony_ci [BTTV_BOARD_TERRATVRADIO] = { 101962306a36Sopenharmony_ci .name = "Terratec TV/Radio+", 102062306a36Sopenharmony_ci .video_inputs = 3, 102162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 102262306a36Sopenharmony_ci .svhs = 2, 102362306a36Sopenharmony_ci .gpiomask = 0x70000, 102462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 102562306a36Sopenharmony_ci .gpiomux = { 0x20000, 0x30000, 0x10000, 0 }, 102662306a36Sopenharmony_ci .gpiomute = 0x40000, 102762306a36Sopenharmony_ci .no_msp34xx = 1, 102862306a36Sopenharmony_ci .pll = PLL_35, 102962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 103062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 103162306a36Sopenharmony_ci .has_radio = 1, 103262306a36Sopenharmony_ci }, 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci /* ---- card 0x30 ---------------------------------- */ 103562306a36Sopenharmony_ci [BTTV_BOARD_DYNALINK] = { 103662306a36Sopenharmony_ci .name = "Askey CPH03x/ Dynalink Magic TView", 103762306a36Sopenharmony_ci .video_inputs = 3, 103862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 103962306a36Sopenharmony_ci .svhs = 2, 104062306a36Sopenharmony_ci .gpiomask = 15, 104162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 104262306a36Sopenharmony_ci .gpiomux = {2,0,0,0 }, 104362306a36Sopenharmony_ci .gpiomute = 1, 104462306a36Sopenharmony_ci .pll = PLL_28, 104562306a36Sopenharmony_ci .tuner_type = UNSET, 104662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 104762306a36Sopenharmony_ci }, 104862306a36Sopenharmony_ci [BTTV_BOARD_GVBCTV3PCI] = { 104962306a36Sopenharmony_ci .name = "IODATA GV-BCTV3/PCI", 105062306a36Sopenharmony_ci .video_inputs = 3, 105162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 105262306a36Sopenharmony_ci .svhs = 2, 105362306a36Sopenharmony_ci .gpiomask = 0x010f00, 105462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 0), 105562306a36Sopenharmony_ci .gpiomux = {0x10000, 0, 0x10000, 0 }, 105662306a36Sopenharmony_ci .no_msp34xx = 1, 105762306a36Sopenharmony_ci .pll = PLL_28, 105862306a36Sopenharmony_ci .tuner_type = TUNER_ALPS_TSHC6_NTSC, 105962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 106062306a36Sopenharmony_ci .audio_mode_gpio= gvbctv3pci_audio, 106162306a36Sopenharmony_ci }, 106262306a36Sopenharmony_ci [BTTV_BOARD_PXELVWPLTVPAK] = { 106362306a36Sopenharmony_ci .name = "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP", 106462306a36Sopenharmony_ci .video_inputs = 5, 106562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 106662306a36Sopenharmony_ci .svhs = 3, 106762306a36Sopenharmony_ci .has_dig_in = 1, 106862306a36Sopenharmony_ci .gpiomask = 0xAA0000, 106962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1, 0), /* in 4 is digital */ 107062306a36Sopenharmony_ci /* .digital_mode= DIGITAL_MODE_CAMERA, */ 107162306a36Sopenharmony_ci .gpiomux = { 0x20000, 0, 0x80000, 0x80000 }, 107262306a36Sopenharmony_ci .gpiomute = 0xa8000, 107362306a36Sopenharmony_ci .no_msp34xx = 1, 107462306a36Sopenharmony_ci .pll = PLL_28, 107562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 107662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 107762306a36Sopenharmony_ci .has_remote = 1, 107862306a36Sopenharmony_ci /* GPIO wiring: (different from Rev.4C !) 107962306a36Sopenharmony_ci GPIO17: U4.A0 (first hef4052bt) 108062306a36Sopenharmony_ci GPIO19: U4.A1 108162306a36Sopenharmony_ci GPIO20: U5.A1 (second hef4052bt) 108262306a36Sopenharmony_ci GPIO21: U4.nEN 108362306a36Sopenharmony_ci GPIO22: BT832 Reset Line 108462306a36Sopenharmony_ci GPIO23: A5,A0, U5,nEN 108562306a36Sopenharmony_ci Note: At i2c=0x8a is a Bt832 chip, which changes to 0x88 after being reset via GPIO22 108662306a36Sopenharmony_ci */ 108762306a36Sopenharmony_ci }, 108862306a36Sopenharmony_ci [BTTV_BOARD_EAGLE] = { 108962306a36Sopenharmony_ci .name = "Eagle Wireless Capricorn2 (bt878A)", 109062306a36Sopenharmony_ci .video_inputs = 4, 109162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 109262306a36Sopenharmony_ci .svhs = 2, 109362306a36Sopenharmony_ci .gpiomask = 7, 109462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 0, 1, 1), 109562306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3 }, 109662306a36Sopenharmony_ci .gpiomute = 4, 109762306a36Sopenharmony_ci .pll = PLL_28, 109862306a36Sopenharmony_ci .tuner_type = UNSET /* TUNER_ALPS_TMDH2_NTSC */, 109962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 110062306a36Sopenharmony_ci }, 110162306a36Sopenharmony_ci 110262306a36Sopenharmony_ci /* ---- card 0x34 ---------------------------------- */ 110362306a36Sopenharmony_ci [BTTV_BOARD_PINNACLEPRO] = { 110462306a36Sopenharmony_ci /* David Härdeman <david@2gen.com> */ 110562306a36Sopenharmony_ci .name = "Pinnacle PCTV Studio Pro", 110662306a36Sopenharmony_ci .video_inputs = 4, 110762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 110862306a36Sopenharmony_ci .svhs = 3, 110962306a36Sopenharmony_ci .gpiomask = 0x03000F, 111062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 111162306a36Sopenharmony_ci .gpiomux = { 1, 0xd0001, 0, 0 }, 111262306a36Sopenharmony_ci .gpiomute = 10, 111362306a36Sopenharmony_ci /* sound path (5 sources): 111462306a36Sopenharmony_ci MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable) 111562306a36Sopenharmony_ci 0= ext. Audio IN 111662306a36Sopenharmony_ci 1= from MUX2 111762306a36Sopenharmony_ci 2= Mono TV sound from Tuner 111862306a36Sopenharmony_ci 3= not connected 111962306a36Sopenharmony_ci MUX2 (mask 0x30000): 112062306a36Sopenharmony_ci 0,2,3= from MSP34xx 112162306a36Sopenharmony_ci 1= FM stereo Radio from Tuner */ 112262306a36Sopenharmony_ci .pll = PLL_28, 112362306a36Sopenharmony_ci .tuner_type = UNSET, 112462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 112562306a36Sopenharmony_ci }, 112662306a36Sopenharmony_ci [BTTV_BOARD_TVIEW_RDS_FM] = { 112762306a36Sopenharmony_ci /* Claas Langbehn <claas@bigfoot.com>, 112862306a36Sopenharmony_ci Sven Grothklags <sven@upb.de> */ 112962306a36Sopenharmony_ci .name = "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS", 113062306a36Sopenharmony_ci .video_inputs = 4, 113162306a36Sopenharmony_ci /* .audio_inputs= 3, */ 113262306a36Sopenharmony_ci .svhs = 2, 113362306a36Sopenharmony_ci .gpiomask = 0x1c, 113462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 113562306a36Sopenharmony_ci .gpiomux = { 0, 0, 0x10, 8 }, 113662306a36Sopenharmony_ci .gpiomute = 4, 113762306a36Sopenharmony_ci .pll = PLL_28, 113862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 113962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 114062306a36Sopenharmony_ci .has_radio = 1, 114162306a36Sopenharmony_ci }, 114262306a36Sopenharmony_ci [BTTV_BOARD_LIFETEC_9415] = { 114362306a36Sopenharmony_ci /* Tim Röstermundt <rosterm@uni-muenster.de> 114462306a36Sopenharmony_ci in de.comp.os.unix.linux.hardware: 114562306a36Sopenharmony_ci options bttv card=0 pll=1 radio=1 gpiomask=0x18e0 114662306a36Sopenharmony_ci gpiomux =0x44c71f,0x44d71f,0,0x44d71f,0x44dfff 114762306a36Sopenharmony_ci options tuner type=5 */ 114862306a36Sopenharmony_ci .name = "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]", 114962306a36Sopenharmony_ci .video_inputs = 4, 115062306a36Sopenharmony_ci /* .audio_inputs= 1, */ 115162306a36Sopenharmony_ci .svhs = 2, 115262306a36Sopenharmony_ci .gpiomask = 0x18e0, 115362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 115462306a36Sopenharmony_ci .gpiomux = { 0x0000,0x0800,0x1000,0x1000 }, 115562306a36Sopenharmony_ci .gpiomute = 0x18e0, 115662306a36Sopenharmony_ci /* For cards with tda9820/tda9821: 115762306a36Sopenharmony_ci 0x0000: Tuner normal stereo 115862306a36Sopenharmony_ci 0x0080: Tuner A2 SAP (second audio program = Zweikanalton) 115962306a36Sopenharmony_ci 0x0880: Tuner A2 stereo */ 116062306a36Sopenharmony_ci .pll = PLL_28, 116162306a36Sopenharmony_ci .tuner_type = UNSET, 116262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 116362306a36Sopenharmony_ci }, 116462306a36Sopenharmony_ci [BTTV_BOARD_BESTBUY_EASYTV] = { 116562306a36Sopenharmony_ci /* Miguel Angel Alvarez <maacruz@navegalia.com> 116662306a36Sopenharmony_ci old Easy TV BT848 version (model CPH031) */ 116762306a36Sopenharmony_ci .name = "Askey CPH031/ BESTBUY Easy TV", 116862306a36Sopenharmony_ci .video_inputs = 4, 116962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 117062306a36Sopenharmony_ci .svhs = 2, 117162306a36Sopenharmony_ci .gpiomask = 0xF, 117262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 117362306a36Sopenharmony_ci .gpiomux = { 2, 0, 0, 0 }, 117462306a36Sopenharmony_ci .gpiomute = 10, 117562306a36Sopenharmony_ci .pll = PLL_28, 117662306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_PAL, 117762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 117862306a36Sopenharmony_ci }, 117962306a36Sopenharmony_ci 118062306a36Sopenharmony_ci /* ---- card 0x38 ---------------------------------- */ 118162306a36Sopenharmony_ci [BTTV_BOARD_FLYVIDEO_98FM] = { 118262306a36Sopenharmony_ci /* Gordon Heydon <gjheydon@bigfoot.com ('98) */ 118362306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98FM LR50", 118462306a36Sopenharmony_ci .video_inputs = 4, 118562306a36Sopenharmony_ci /* .audio_inputs= 3, */ 118662306a36Sopenharmony_ci .svhs = 2, 118762306a36Sopenharmony_ci .gpiomask = 0x1800, 118862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 118962306a36Sopenharmony_ci .gpiomux = { 0, 0x800, 0x1000, 0x1000 }, 119062306a36Sopenharmony_ci .gpiomute = 0x1800, 119162306a36Sopenharmony_ci .pll = PLL_28, 119262306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 119362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 119462306a36Sopenharmony_ci }, 119562306a36Sopenharmony_ci /* This is the ultimate cheapo capture card 119662306a36Sopenharmony_ci * just a BT848A on a small PCB! 119762306a36Sopenharmony_ci * Steve Hosgood <steve@equiinet.com> */ 119862306a36Sopenharmony_ci [BTTV_BOARD_GRANDTEC] = { 119962306a36Sopenharmony_ci .name = "GrandTec 'Grand Video Capture' (Bt848)", 120062306a36Sopenharmony_ci .video_inputs = 2, 120162306a36Sopenharmony_ci /* .audio_inputs= 0, */ 120262306a36Sopenharmony_ci .svhs = 1, 120362306a36Sopenharmony_ci .gpiomask = 0, 120462306a36Sopenharmony_ci .muxsel = MUXSEL(3, 1), 120562306a36Sopenharmony_ci .gpiomux = { 0 }, 120662306a36Sopenharmony_ci .no_msp34xx = 1, 120762306a36Sopenharmony_ci .pll = PLL_35, 120862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 120962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 121062306a36Sopenharmony_ci }, 121162306a36Sopenharmony_ci [BTTV_BOARD_ASKEY_CPH060] = { 121262306a36Sopenharmony_ci /* Daniel Herrington <daniel.herrington@home.com> */ 121362306a36Sopenharmony_ci .name = "Askey CPH060/ Phoebe TV Master Only (No FM)", 121462306a36Sopenharmony_ci .video_inputs = 3, 121562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 121662306a36Sopenharmony_ci .svhs = 2, 121762306a36Sopenharmony_ci .gpiomask = 0xe00, 121862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 121962306a36Sopenharmony_ci .gpiomux = { 0x400, 0x400, 0x400, 0x400 }, 122062306a36Sopenharmony_ci .gpiomute = 0x800, 122162306a36Sopenharmony_ci .pll = PLL_28, 122262306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_4036FY5_NTSC, 122362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 122462306a36Sopenharmony_ci }, 122562306a36Sopenharmony_ci [BTTV_BOARD_ASKEY_CPH03X] = { 122662306a36Sopenharmony_ci /* Matti Mottus <mottus@physic.ut.ee> */ 122762306a36Sopenharmony_ci .name = "Askey CPH03x TV Capturer", 122862306a36Sopenharmony_ci .video_inputs = 4, 122962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 123062306a36Sopenharmony_ci .svhs = 2, 123162306a36Sopenharmony_ci .gpiomask = 0x03000F, 123262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 123362306a36Sopenharmony_ci .gpiomux = { 2, 0, 0, 0 }, 123462306a36Sopenharmony_ci .gpiomute = 1, 123562306a36Sopenharmony_ci .pll = PLL_28, 123662306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_PAL, 123762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 123862306a36Sopenharmony_ci .has_remote = 1, 123962306a36Sopenharmony_ci }, 124062306a36Sopenharmony_ci 124162306a36Sopenharmony_ci /* ---- card 0x3c ---------------------------------- */ 124262306a36Sopenharmony_ci [BTTV_BOARD_MM100PCTV] = { 124362306a36Sopenharmony_ci /* Philip Blundell <philb@gnu.org> */ 124462306a36Sopenharmony_ci .name = "Modular Technology MM100PCTV", 124562306a36Sopenharmony_ci .video_inputs = 2, 124662306a36Sopenharmony_ci /* .audio_inputs= 2, */ 124762306a36Sopenharmony_ci .svhs = NO_SVHS, 124862306a36Sopenharmony_ci .gpiomask = 11, 124962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 125062306a36Sopenharmony_ci .gpiomux = { 2, 0, 0, 1 }, 125162306a36Sopenharmony_ci .gpiomute = 8, 125262306a36Sopenharmony_ci .pll = PLL_35, 125362306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_PAL, 125462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 125562306a36Sopenharmony_ci }, 125662306a36Sopenharmony_ci [BTTV_BOARD_GMV1] = { 125762306a36Sopenharmony_ci /* Adrian Cox <adrian@humboldt.co.uk */ 125862306a36Sopenharmony_ci .name = "AG Electronics GMV1", 125962306a36Sopenharmony_ci .video_inputs = 2, 126062306a36Sopenharmony_ci /* .audio_inputs= 0, */ 126162306a36Sopenharmony_ci .svhs = 1, 126262306a36Sopenharmony_ci .gpiomask = 0xF, 126362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2), 126462306a36Sopenharmony_ci .gpiomux = { }, 126562306a36Sopenharmony_ci .no_msp34xx = 1, 126662306a36Sopenharmony_ci .pll = PLL_28, 126762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 126862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 126962306a36Sopenharmony_ci }, 127062306a36Sopenharmony_ci [BTTV_BOARD_BESTBUY_EASYTV2] = { 127162306a36Sopenharmony_ci /* Miguel Angel Alvarez <maacruz@navegalia.com> 127262306a36Sopenharmony_ci new Easy TV BT878 version (model CPH061) 127362306a36Sopenharmony_ci special thanks to Informatica Mieres for providing the card */ 127462306a36Sopenharmony_ci .name = "Askey CPH061/ BESTBUY Easy TV (bt878)", 127562306a36Sopenharmony_ci .video_inputs = 3, 127662306a36Sopenharmony_ci /* .audio_inputs= 2, */ 127762306a36Sopenharmony_ci .svhs = 2, 127862306a36Sopenharmony_ci .gpiomask = 0xFF, 127962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 128062306a36Sopenharmony_ci .gpiomux = { 1, 0, 4, 4 }, 128162306a36Sopenharmony_ci .gpiomute = 9, 128262306a36Sopenharmony_ci .pll = PLL_28, 128362306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 128462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 128562306a36Sopenharmony_ci }, 128662306a36Sopenharmony_ci [BTTV_BOARD_ATI_TVWONDER] = { 128762306a36Sopenharmony_ci /* Lukas Gebauer <geby@volny.cz> */ 128862306a36Sopenharmony_ci .name = "ATI TV-Wonder", 128962306a36Sopenharmony_ci .video_inputs = 3, 129062306a36Sopenharmony_ci /* .audio_inputs= 1, */ 129162306a36Sopenharmony_ci .svhs = 2, 129262306a36Sopenharmony_ci .gpiomask = 0xf03f, 129362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 129462306a36Sopenharmony_ci .gpiomux = { 0xbffe, 0, 0xbfff, 0 }, 129562306a36Sopenharmony_ci .gpiomute = 0xbffe, 129662306a36Sopenharmony_ci .pll = PLL_28, 129762306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL, 129862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 129962306a36Sopenharmony_ci }, 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_ci /* ---- card 0x40 ---------------------------------- */ 130262306a36Sopenharmony_ci [BTTV_BOARD_ATI_TVWONDERVE] = { 130362306a36Sopenharmony_ci /* Lukas Gebauer <geby@volny.cz> */ 130462306a36Sopenharmony_ci .name = "ATI TV-Wonder VE", 130562306a36Sopenharmony_ci .video_inputs = 2, 130662306a36Sopenharmony_ci /* .audio_inputs= 1, */ 130762306a36Sopenharmony_ci .svhs = NO_SVHS, 130862306a36Sopenharmony_ci .gpiomask = 1, 130962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 1), 131062306a36Sopenharmony_ci .gpiomux = { 0, 0, 1, 0 }, 131162306a36Sopenharmony_ci .no_msp34xx = 1, 131262306a36Sopenharmony_ci .pll = PLL_28, 131362306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL, 131462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 131562306a36Sopenharmony_ci }, 131662306a36Sopenharmony_ci [BTTV_BOARD_FLYVIDEO2000] = { 131762306a36Sopenharmony_ci /* DeeJay <deejay@westel900.net (2000S) */ 131862306a36Sopenharmony_ci .name = "Lifeview FlyVideo 2000S LR90", 131962306a36Sopenharmony_ci .video_inputs = 3, 132062306a36Sopenharmony_ci /* .audio_inputs= 3, */ 132162306a36Sopenharmony_ci .svhs = 2, 132262306a36Sopenharmony_ci .gpiomask = 0x18e0, 132362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 1), 132462306a36Sopenharmony_ci /* Radio changed from 1e80 to 0x800 to make 132562306a36Sopenharmony_ci FlyVideo2000S in .hu happy (gm)*/ 132662306a36Sopenharmony_ci /* -dk-???: set mute=0x1800 for tda9874h daughterboard */ 132762306a36Sopenharmony_ci .gpiomux = { 0x0000,0x0800,0x1000,0x1000 }, 132862306a36Sopenharmony_ci .gpiomute = 0x1800, 132962306a36Sopenharmony_ci .audio_mode_gpio= fv2000s_audio, 133062306a36Sopenharmony_ci .no_msp34xx = 1, 133162306a36Sopenharmony_ci .pll = PLL_28, 133262306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 133362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 133462306a36Sopenharmony_ci }, 133562306a36Sopenharmony_ci [BTTV_BOARD_TERRATVALUER] = { 133662306a36Sopenharmony_ci .name = "Terratec TValueRadio", 133762306a36Sopenharmony_ci .video_inputs = 3, 133862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 133962306a36Sopenharmony_ci .svhs = 2, 134062306a36Sopenharmony_ci .gpiomask = 0xffff00, 134162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 134262306a36Sopenharmony_ci .gpiomux = { 0x500, 0x500, 0x300, 0x900 }, 134362306a36Sopenharmony_ci .gpiomute = 0x900, 134462306a36Sopenharmony_ci .pll = PLL_28, 134562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 134662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 134762306a36Sopenharmony_ci .has_radio = 1, 134862306a36Sopenharmony_ci }, 134962306a36Sopenharmony_ci [BTTV_BOARD_GVBCTV4PCI] = { 135062306a36Sopenharmony_ci /* TANAKA Kei <peg00625@nifty.com> */ 135162306a36Sopenharmony_ci .name = "IODATA GV-BCTV4/PCI", 135262306a36Sopenharmony_ci .video_inputs = 3, 135362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 135462306a36Sopenharmony_ci .svhs = 2, 135562306a36Sopenharmony_ci .gpiomask = 0x010f00, 135662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 0), 135762306a36Sopenharmony_ci .gpiomux = {0x10000, 0, 0x10000, 0 }, 135862306a36Sopenharmony_ci .no_msp34xx = 1, 135962306a36Sopenharmony_ci .pll = PLL_28, 136062306a36Sopenharmony_ci .tuner_type = TUNER_SHARP_2U5JF5540_NTSC, 136162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 136262306a36Sopenharmony_ci .audio_mode_gpio= gvbctv3pci_audio, 136362306a36Sopenharmony_ci }, 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci /* ---- card 0x44 ---------------------------------- */ 136662306a36Sopenharmony_ci [BTTV_BOARD_VOODOOTV_FM] = { 136762306a36Sopenharmony_ci .name = "3Dfx VoodooTV FM (Euro)", 136862306a36Sopenharmony_ci /* try "insmod msp3400 simple=0" if you have 136962306a36Sopenharmony_ci * sound problems with this card. */ 137062306a36Sopenharmony_ci .video_inputs = 4, 137162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 137262306a36Sopenharmony_ci .svhs = NO_SVHS, 137362306a36Sopenharmony_ci .gpiomask = 0x4f8a00, 137462306a36Sopenharmony_ci /* 0x100000: 1=MSP enabled (0=disable again) 137562306a36Sopenharmony_ci * 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */ 137662306a36Sopenharmony_ci .gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff }, 137762306a36Sopenharmony_ci .gpiomute = 0x947fff, 137862306a36Sopenharmony_ci /* tvtuner, radio, external,internal, mute, stereo 137962306a36Sopenharmony_ci * tuner, Composite, SVid, Composite-on-Svid-adapter */ 138062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 1), 138162306a36Sopenharmony_ci .tuner_type = TUNER_MT2032, 138262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 138362306a36Sopenharmony_ci .pll = PLL_28, 138462306a36Sopenharmony_ci .has_radio = 1, 138562306a36Sopenharmony_ci }, 138662306a36Sopenharmony_ci [BTTV_BOARD_VOODOOTV_200] = { 138762306a36Sopenharmony_ci .name = "VoodooTV 200 (USA)", 138862306a36Sopenharmony_ci /* try "insmod msp3400 simple=0" if you have 138962306a36Sopenharmony_ci * sound problems with this card. */ 139062306a36Sopenharmony_ci .video_inputs = 4, 139162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 139262306a36Sopenharmony_ci .svhs = NO_SVHS, 139362306a36Sopenharmony_ci .gpiomask = 0x4f8a00, 139462306a36Sopenharmony_ci /* 0x100000: 1=MSP enabled (0=disable again) 139562306a36Sopenharmony_ci * 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */ 139662306a36Sopenharmony_ci .gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff }, 139762306a36Sopenharmony_ci .gpiomute = 0x947fff, 139862306a36Sopenharmony_ci /* tvtuner, radio, external,internal, mute, stereo 139962306a36Sopenharmony_ci * tuner, Composite, SVid, Composite-on-Svid-adapter */ 140062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 1), 140162306a36Sopenharmony_ci .tuner_type = TUNER_MT2032, 140262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 140362306a36Sopenharmony_ci .pll = PLL_28, 140462306a36Sopenharmony_ci .has_radio = 1, 140562306a36Sopenharmony_ci }, 140662306a36Sopenharmony_ci [BTTV_BOARD_AIMMS] = { 140762306a36Sopenharmony_ci /* Philip Blundell <pb@nexus.co.uk> */ 140862306a36Sopenharmony_ci .name = "Active Imaging AIMMS", 140962306a36Sopenharmony_ci .video_inputs = 1, 141062306a36Sopenharmony_ci /* .audio_inputs= 0, */ 141162306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 141262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 141362306a36Sopenharmony_ci .pll = PLL_28, 141462306a36Sopenharmony_ci .muxsel = MUXSEL(2), 141562306a36Sopenharmony_ci .gpiomask = 0 141662306a36Sopenharmony_ci }, 141762306a36Sopenharmony_ci [BTTV_BOARD_PV_BT878P_PLUS] = { 141862306a36Sopenharmony_ci /* Tomasz Pyra <hellfire@sedez.iq.pl> */ 141962306a36Sopenharmony_ci .name = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)", 142062306a36Sopenharmony_ci .video_inputs = 3, 142162306a36Sopenharmony_ci /* .audio_inputs= 4, */ 142262306a36Sopenharmony_ci .svhs = 2, 142362306a36Sopenharmony_ci .gpiomask = 15, 142462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 142562306a36Sopenharmony_ci .gpiomux = { 0, 0, 11, 7 }, /* TV and Radio with same GPIO ! */ 142662306a36Sopenharmony_ci .gpiomute = 13, 142762306a36Sopenharmony_ci .pll = PLL_28, 142862306a36Sopenharmony_ci .tuner_type = TUNER_LG_PAL_I_FM, 142962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 143062306a36Sopenharmony_ci .has_remote = 1, 143162306a36Sopenharmony_ci /* GPIO wiring: 143262306a36Sopenharmony_ci GPIO0: U4.A0 (hef4052bt) 143362306a36Sopenharmony_ci GPIO1: U4.A1 143462306a36Sopenharmony_ci GPIO2: U4.A1 (second hef4052bt) 143562306a36Sopenharmony_ci GPIO3: U4.nEN, U5.A0, A5.nEN 143662306a36Sopenharmony_ci GPIO8-15: vrd866b ? 143762306a36Sopenharmony_ci */ 143862306a36Sopenharmony_ci }, 143962306a36Sopenharmony_ci [BTTV_BOARD_FLYVIDEO98EZ] = { 144062306a36Sopenharmony_ci .name = "Lifeview FlyVideo 98EZ (capture only) LR51", 144162306a36Sopenharmony_ci .video_inputs = 4, 144262306a36Sopenharmony_ci /* .audio_inputs= 0, */ 144362306a36Sopenharmony_ci .svhs = 2, 144462306a36Sopenharmony_ci /* AV1, AV2, SVHS, CVid adapter on SVHS */ 144562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 144662306a36Sopenharmony_ci .pll = PLL_28, 144762306a36Sopenharmony_ci .no_msp34xx = 1, 144862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 144962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 145062306a36Sopenharmony_ci }, 145162306a36Sopenharmony_ci 145262306a36Sopenharmony_ci /* ---- card 0x48 ---------------------------------- */ 145362306a36Sopenharmony_ci [BTTV_BOARD_PV_BT878P_9B] = { 145462306a36Sopenharmony_ci /* Dariusz Kowalewski <darekk@automex.pl> */ 145562306a36Sopenharmony_ci .name = "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)", 145662306a36Sopenharmony_ci .video_inputs = 4, 145762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 145862306a36Sopenharmony_ci .svhs = 2, 145962306a36Sopenharmony_ci .gpiomask = 0x3f, 146062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 146162306a36Sopenharmony_ci .gpiomux = { 0x01, 0x00, 0x03, 0x03 }, 146262306a36Sopenharmony_ci .gpiomute = 0x09, 146362306a36Sopenharmony_ci .no_msp34xx = 1, 146462306a36Sopenharmony_ci .pll = PLL_28, 146562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 146662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 146762306a36Sopenharmony_ci .audio_mode_gpio= pvbt878p9b_audio, /* Note: not all cards have stereo */ 146862306a36Sopenharmony_ci .has_radio = 1, /* Note: not all cards have radio */ 146962306a36Sopenharmony_ci .has_remote = 1, 147062306a36Sopenharmony_ci /* GPIO wiring: 147162306a36Sopenharmony_ci GPIO0: A0 hef4052 147262306a36Sopenharmony_ci GPIO1: A1 hef4052 147362306a36Sopenharmony_ci GPIO3: nEN hef4052 147462306a36Sopenharmony_ci GPIO8-15: vrd866b 147562306a36Sopenharmony_ci GPIO20,22,23: R30,R29,R28 147662306a36Sopenharmony_ci */ 147762306a36Sopenharmony_ci }, 147862306a36Sopenharmony_ci [BTTV_BOARD_SENSORAY311_611] = { 147962306a36Sopenharmony_ci /* Clay Kunz <ckunz@mail.arc.nasa.gov> */ 148062306a36Sopenharmony_ci /* you must jumper JP5 for the 311 card (PC/104+) to work */ 148162306a36Sopenharmony_ci .name = "Sensoray 311/611", 148262306a36Sopenharmony_ci .video_inputs = 5, 148362306a36Sopenharmony_ci /* .audio_inputs= 0, */ 148462306a36Sopenharmony_ci .svhs = 4, 148562306a36Sopenharmony_ci .gpiomask = 0, 148662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0, 0), 148762306a36Sopenharmony_ci .gpiomux = { 0 }, 148862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 148962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 149062306a36Sopenharmony_ci }, 149162306a36Sopenharmony_ci [BTTV_BOARD_RV605] = { 149262306a36Sopenharmony_ci /* Miguel Freitas <miguel@cetuc.puc-rio.br> */ 149362306a36Sopenharmony_ci .name = "RemoteVision MX (RV605)", 149462306a36Sopenharmony_ci .video_inputs = 16, 149562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 149662306a36Sopenharmony_ci .svhs = NO_SVHS, 149762306a36Sopenharmony_ci .gpiomask = 0x00, 149862306a36Sopenharmony_ci .gpiomask2 = 0x07ff, 149962306a36Sopenharmony_ci .muxsel = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), 150062306a36Sopenharmony_ci .no_msp34xx = 1, 150162306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 150262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 150362306a36Sopenharmony_ci .muxsel_hook = rv605_muxsel, 150462306a36Sopenharmony_ci }, 150562306a36Sopenharmony_ci [BTTV_BOARD_POWERCLR_MTV878] = { 150662306a36Sopenharmony_ci .name = "Powercolor MTV878/ MTV878R/ MTV878F", 150762306a36Sopenharmony_ci .video_inputs = 3, 150862306a36Sopenharmony_ci /* .audio_inputs= 2, */ 150962306a36Sopenharmony_ci .svhs = 2, 151062306a36Sopenharmony_ci .gpiomask = 0x1C800F, /* Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset */ 151162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 1, 1), 151262306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 2 }, 151362306a36Sopenharmony_ci .gpiomute = 4, 151462306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 151562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 151662306a36Sopenharmony_ci .pll = PLL_28, 151762306a36Sopenharmony_ci .has_radio = 1, 151862306a36Sopenharmony_ci }, 151962306a36Sopenharmony_ci 152062306a36Sopenharmony_ci /* ---- card 0x4c ---------------------------------- */ 152162306a36Sopenharmony_ci [BTTV_BOARD_WINDVR] = { 152262306a36Sopenharmony_ci /* Masaki Suzuki <masaki@btree.org> */ 152362306a36Sopenharmony_ci .name = "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)", 152462306a36Sopenharmony_ci .video_inputs = 3, 152562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 152662306a36Sopenharmony_ci .svhs = 2, 152762306a36Sopenharmony_ci .gpiomask = 0x140007, 152862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 152962306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3 }, 153062306a36Sopenharmony_ci .gpiomute = 4, 153162306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC, 153262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 153362306a36Sopenharmony_ci .audio_mode_gpio= windvr_audio, 153462306a36Sopenharmony_ci }, 153562306a36Sopenharmony_ci [BTTV_BOARD_GRANDTEC_MULTI] = { 153662306a36Sopenharmony_ci .name = "GrandTec Multi Capture Card (Bt878)", 153762306a36Sopenharmony_ci .video_inputs = 4, 153862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 153962306a36Sopenharmony_ci .svhs = NO_SVHS, 154062306a36Sopenharmony_ci .gpiomask = 0, 154162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 154262306a36Sopenharmony_ci .gpiomux = { 0 }, 154362306a36Sopenharmony_ci .no_msp34xx = 1, 154462306a36Sopenharmony_ci .pll = PLL_28, 154562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 154662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 154762306a36Sopenharmony_ci }, 154862306a36Sopenharmony_ci [BTTV_BOARD_KWORLD] = { 154962306a36Sopenharmony_ci .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF", 155062306a36Sopenharmony_ci .video_inputs = 4, 155162306a36Sopenharmony_ci /* .audio_inputs= 3, */ 155262306a36Sopenharmony_ci .svhs = 2, 155362306a36Sopenharmony_ci .gpiomask = 7, 155462306a36Sopenharmony_ci /* Tuner, SVid, SVHS, SVid to SVHS connector */ 155562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 155662306a36Sopenharmony_ci .gpiomux = { 0, 0, 4, 4 },/* Yes, this tuner uses the same audio output for TV and FM radio! 155762306a36Sopenharmony_ci * This card lacks external Audio In, so we mute it on Ext. & Int. 155862306a36Sopenharmony_ci * The PCB can take a sbx1637/sbx1673, wiring unknown. 155962306a36Sopenharmony_ci * This card lacks PCI subsystem ID, sigh. 156062306a36Sopenharmony_ci * gpiomux =1: lower volume, 2+3: mute 156162306a36Sopenharmony_ci * btwincap uses 0x80000/0x80003 156262306a36Sopenharmony_ci */ 156362306a36Sopenharmony_ci .gpiomute = 4, 156462306a36Sopenharmony_ci .no_msp34xx = 1, 156562306a36Sopenharmony_ci .pll = PLL_28, 156662306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 156762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 156862306a36Sopenharmony_ci /* Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and 156962306a36Sopenharmony_ci radio signal strength indicators work fine. */ 157062306a36Sopenharmony_ci .has_radio = 1, 157162306a36Sopenharmony_ci /* GPIO Info: 157262306a36Sopenharmony_ci GPIO0,1: HEF4052 A0,A1 157362306a36Sopenharmony_ci GPIO2: HEF4052 nENABLE 157462306a36Sopenharmony_ci GPIO3-7: n.c. 157562306a36Sopenharmony_ci GPIO8-13: IRDC357 data0-5 (data6 n.c. ?) [chip not present on my card] 157662306a36Sopenharmony_ci GPIO14,15: ?? 157762306a36Sopenharmony_ci GPIO16-21: n.c. 157862306a36Sopenharmony_ci GPIO22,23: ?? 157962306a36Sopenharmony_ci ?? : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/ 158062306a36Sopenharmony_ci }, 158162306a36Sopenharmony_ci [BTTV_BOARD_DSP_TCVIDEO] = { 158262306a36Sopenharmony_ci /* Arthur Tetzlaff-Deas, DSP Design Ltd <software@dspdesign.com> */ 158362306a36Sopenharmony_ci .name = "DSP Design TCVIDEO", 158462306a36Sopenharmony_ci .video_inputs = 4, 158562306a36Sopenharmony_ci .svhs = NO_SVHS, 158662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 158762306a36Sopenharmony_ci .pll = PLL_28, 158862306a36Sopenharmony_ci .tuner_type = UNSET, 158962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 159062306a36Sopenharmony_ci }, 159162306a36Sopenharmony_ci 159262306a36Sopenharmony_ci /* ---- card 0x50 ---------------------------------- */ 159362306a36Sopenharmony_ci [BTTV_BOARD_HAUPPAUGEPVR] = { 159462306a36Sopenharmony_ci .name = "Hauppauge WinTV PVR", 159562306a36Sopenharmony_ci .video_inputs = 4, 159662306a36Sopenharmony_ci /* .audio_inputs= 1, */ 159762306a36Sopenharmony_ci .svhs = 2, 159862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 0, 1, 1), 159962306a36Sopenharmony_ci .pll = PLL_28, 160062306a36Sopenharmony_ci .tuner_type = UNSET, 160162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 160262306a36Sopenharmony_ci 160362306a36Sopenharmony_ci .gpiomask = 7, 160462306a36Sopenharmony_ci .gpiomux = {7}, 160562306a36Sopenharmony_ci }, 160662306a36Sopenharmony_ci [BTTV_BOARD_GVBCTV5PCI] = { 160762306a36Sopenharmony_ci .name = "IODATA GV-BCTV5/PCI", 160862306a36Sopenharmony_ci .video_inputs = 3, 160962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 161062306a36Sopenharmony_ci .svhs = 2, 161162306a36Sopenharmony_ci .gpiomask = 0x0f0f80, 161262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 161362306a36Sopenharmony_ci .gpiomux = {0x030000, 0x010000, 0, 0 }, 161462306a36Sopenharmony_ci .gpiomute = 0x020000, 161562306a36Sopenharmony_ci .no_msp34xx = 1, 161662306a36Sopenharmony_ci .pll = PLL_28, 161762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC_M, 161862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 161962306a36Sopenharmony_ci .audio_mode_gpio= gvbctv5pci_audio, 162062306a36Sopenharmony_ci .has_radio = 1, 162162306a36Sopenharmony_ci }, 162262306a36Sopenharmony_ci [BTTV_BOARD_OSPREY1x0] = { 162362306a36Sopenharmony_ci .name = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */ 162462306a36Sopenharmony_ci .video_inputs = 4, /* id-inputs-clock */ 162562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 162662306a36Sopenharmony_ci .svhs = 3, 162762306a36Sopenharmony_ci .muxsel = MUXSEL(3, 2, 0, 1), 162862306a36Sopenharmony_ci .pll = PLL_28, 162962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 163062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 163162306a36Sopenharmony_ci .no_msp34xx = 1, 163262306a36Sopenharmony_ci .no_tda7432 = 1, 163362306a36Sopenharmony_ci }, 163462306a36Sopenharmony_ci [BTTV_BOARD_OSPREY1x0_848] = { 163562306a36Sopenharmony_ci .name = "Osprey 100/150 (848)", /* 0x04-54C0-C1 & older boards */ 163662306a36Sopenharmony_ci .video_inputs = 3, 163762306a36Sopenharmony_ci /* .audio_inputs= 0, */ 163862306a36Sopenharmony_ci .svhs = 2, 163962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1), 164062306a36Sopenharmony_ci .pll = PLL_28, 164162306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 164262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 164362306a36Sopenharmony_ci .no_msp34xx = 1, 164462306a36Sopenharmony_ci .no_tda7432 = 1, 164562306a36Sopenharmony_ci }, 164662306a36Sopenharmony_ci 164762306a36Sopenharmony_ci /* ---- card 0x54 ---------------------------------- */ 164862306a36Sopenharmony_ci [BTTV_BOARD_OSPREY101_848] = { 164962306a36Sopenharmony_ci .name = "Osprey 101 (848)", /* 0x05-40C0-C1 */ 165062306a36Sopenharmony_ci .video_inputs = 2, 165162306a36Sopenharmony_ci /* .audio_inputs= 0, */ 165262306a36Sopenharmony_ci .svhs = 1, 165362306a36Sopenharmony_ci .muxsel = MUXSEL(3, 1), 165462306a36Sopenharmony_ci .pll = PLL_28, 165562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 165662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 165762306a36Sopenharmony_ci .no_msp34xx = 1, 165862306a36Sopenharmony_ci .no_tda7432 = 1, 165962306a36Sopenharmony_ci }, 166062306a36Sopenharmony_ci [BTTV_BOARD_OSPREY1x1] = { 166162306a36Sopenharmony_ci .name = "Osprey 101/151", /* 0x1(4|5)-0004-C4 */ 166262306a36Sopenharmony_ci .video_inputs = 1, 166362306a36Sopenharmony_ci /* .audio_inputs= 0, */ 166462306a36Sopenharmony_ci .svhs = NO_SVHS, 166562306a36Sopenharmony_ci .muxsel = MUXSEL(0), 166662306a36Sopenharmony_ci .pll = PLL_28, 166762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 166862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 166962306a36Sopenharmony_ci .no_msp34xx = 1, 167062306a36Sopenharmony_ci .no_tda7432 = 1, 167162306a36Sopenharmony_ci }, 167262306a36Sopenharmony_ci [BTTV_BOARD_OSPREY1x1_SVID] = { 167362306a36Sopenharmony_ci .name = "Osprey 101/151 w/ svid", /* 0x(16|17|20)-00C4-C1 */ 167462306a36Sopenharmony_ci .video_inputs = 2, 167562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 167662306a36Sopenharmony_ci .svhs = 1, 167762306a36Sopenharmony_ci .muxsel = MUXSEL(0, 1), 167862306a36Sopenharmony_ci .pll = PLL_28, 167962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 168062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 168162306a36Sopenharmony_ci .no_msp34xx = 1, 168262306a36Sopenharmony_ci .no_tda7432 = 1, 168362306a36Sopenharmony_ci }, 168462306a36Sopenharmony_ci [BTTV_BOARD_OSPREY2xx] = { 168562306a36Sopenharmony_ci .name = "Osprey 200/201/250/251", /* 0x1(8|9|E|F)-0004-C4 */ 168662306a36Sopenharmony_ci .video_inputs = 1, 168762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 168862306a36Sopenharmony_ci .svhs = NO_SVHS, 168962306a36Sopenharmony_ci .muxsel = MUXSEL(0), 169062306a36Sopenharmony_ci .pll = PLL_28, 169162306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 169262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 169362306a36Sopenharmony_ci .no_msp34xx = 1, 169462306a36Sopenharmony_ci .no_tda7432 = 1, 169562306a36Sopenharmony_ci }, 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ci /* ---- card 0x58 ---------------------------------- */ 169862306a36Sopenharmony_ci [BTTV_BOARD_OSPREY2x0_SVID] = { 169962306a36Sopenharmony_ci .name = "Osprey 200/250", /* 0x1(A|B)-00C4-C1 */ 170062306a36Sopenharmony_ci .video_inputs = 2, 170162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 170262306a36Sopenharmony_ci .svhs = 1, 170362306a36Sopenharmony_ci .muxsel = MUXSEL(0, 1), 170462306a36Sopenharmony_ci .pll = PLL_28, 170562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 170662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 170762306a36Sopenharmony_ci .no_msp34xx = 1, 170862306a36Sopenharmony_ci .no_tda7432 = 1, 170962306a36Sopenharmony_ci }, 171062306a36Sopenharmony_ci [BTTV_BOARD_OSPREY2x0] = { 171162306a36Sopenharmony_ci .name = "Osprey 210/220/230", /* 0x1(A|B)-04C0-C1 */ 171262306a36Sopenharmony_ci .video_inputs = 2, 171362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 171462306a36Sopenharmony_ci .svhs = 1, 171562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3), 171662306a36Sopenharmony_ci .pll = PLL_28, 171762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 171862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 171962306a36Sopenharmony_ci .no_msp34xx = 1, 172062306a36Sopenharmony_ci .no_tda7432 = 1, 172162306a36Sopenharmony_ci }, 172262306a36Sopenharmony_ci [BTTV_BOARD_OSPREY500] = { 172362306a36Sopenharmony_ci .name = "Osprey 500", /* 500 */ 172462306a36Sopenharmony_ci .video_inputs = 2, 172562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 172662306a36Sopenharmony_ci .svhs = 1, 172762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3), 172862306a36Sopenharmony_ci .pll = PLL_28, 172962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 173062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 173162306a36Sopenharmony_ci .no_msp34xx = 1, 173262306a36Sopenharmony_ci .no_tda7432 = 1, 173362306a36Sopenharmony_ci }, 173462306a36Sopenharmony_ci [BTTV_BOARD_OSPREY540] = { 173562306a36Sopenharmony_ci .name = "Osprey 540", /* 540 */ 173662306a36Sopenharmony_ci .video_inputs = 4, 173762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 173862306a36Sopenharmony_ci .pll = PLL_28, 173962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 174062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 174162306a36Sopenharmony_ci .no_msp34xx = 1, 174262306a36Sopenharmony_ci .no_tda7432 = 1, 174362306a36Sopenharmony_ci }, 174462306a36Sopenharmony_ci 174562306a36Sopenharmony_ci /* ---- card 0x5C ---------------------------------- */ 174662306a36Sopenharmony_ci [BTTV_BOARD_OSPREY2000] = { 174762306a36Sopenharmony_ci .name = "Osprey 2000", /* 2000 */ 174862306a36Sopenharmony_ci .video_inputs = 2, 174962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 175062306a36Sopenharmony_ci .svhs = 1, 175162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3), 175262306a36Sopenharmony_ci .pll = PLL_28, 175362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 175462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 175562306a36Sopenharmony_ci .no_msp34xx = 1, 175662306a36Sopenharmony_ci .no_tda7432 = 1, /* must avoid, conflicts with the bt860 */ 175762306a36Sopenharmony_ci }, 175862306a36Sopenharmony_ci [BTTV_BOARD_IDS_EAGLE] = { 175962306a36Sopenharmony_ci /* M G Berberich <berberic@forwiss.uni-passau.de> */ 176062306a36Sopenharmony_ci .name = "IDS Eagle", 176162306a36Sopenharmony_ci .video_inputs = 4, 176262306a36Sopenharmony_ci /* .audio_inputs= 0, */ 176362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 176462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 176562306a36Sopenharmony_ci .svhs = NO_SVHS, 176662306a36Sopenharmony_ci .gpiomask = 0, 176762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 176862306a36Sopenharmony_ci .muxsel_hook = eagle_muxsel, 176962306a36Sopenharmony_ci .no_msp34xx = 1, 177062306a36Sopenharmony_ci .pll = PLL_28, 177162306a36Sopenharmony_ci }, 177262306a36Sopenharmony_ci [BTTV_BOARD_PINNACLESAT] = { 177362306a36Sopenharmony_ci .name = "Pinnacle PCTV Sat", 177462306a36Sopenharmony_ci .video_inputs = 2, 177562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 177662306a36Sopenharmony_ci .svhs = 1, 177762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 177862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 177962306a36Sopenharmony_ci .no_msp34xx = 1, 178062306a36Sopenharmony_ci .no_tda7432 = 1, 178162306a36Sopenharmony_ci .muxsel = MUXSEL(3, 1), 178262306a36Sopenharmony_ci .pll = PLL_28, 178362306a36Sopenharmony_ci .no_gpioirq = 1, 178462306a36Sopenharmony_ci .has_dvb = 1, 178562306a36Sopenharmony_ci }, 178662306a36Sopenharmony_ci [BTTV_BOARD_FORMAC_PROTV] = { 178762306a36Sopenharmony_ci .name = "Formac ProTV II (bt878)", 178862306a36Sopenharmony_ci .video_inputs = 4, 178962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 179062306a36Sopenharmony_ci .svhs = 3, 179162306a36Sopenharmony_ci .gpiomask = 2, 179262306a36Sopenharmony_ci /* TV, Comp1, Composite over SVID con, SVID */ 179362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 179462306a36Sopenharmony_ci .gpiomux = { 2, 2, 0, 0 }, 179562306a36Sopenharmony_ci .pll = PLL_28, 179662306a36Sopenharmony_ci .has_radio = 1, 179762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 179862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 179962306a36Sopenharmony_ci /* sound routing: 180062306a36Sopenharmony_ci GPIO=0x00,0x01,0x03: mute (?) 180162306a36Sopenharmony_ci 0x02: both TV and radio (tuner: FM1216/I) 180262306a36Sopenharmony_ci The card has onboard audio connectors labeled "cdrom" and "board", 180362306a36Sopenharmony_ci not soldered here, though unknown wiring. 180462306a36Sopenharmony_ci Card lacks: external audio in, pci subsystem id. 180562306a36Sopenharmony_ci */ 180662306a36Sopenharmony_ci }, 180762306a36Sopenharmony_ci 180862306a36Sopenharmony_ci /* ---- card 0x60 ---------------------------------- */ 180962306a36Sopenharmony_ci [BTTV_BOARD_MACHTV] = { 181062306a36Sopenharmony_ci .name = "MachTV", 181162306a36Sopenharmony_ci .video_inputs = 3, 181262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 181362306a36Sopenharmony_ci .svhs = NO_SVHS, 181462306a36Sopenharmony_ci .gpiomask = 7, 181562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 181662306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3}, 181762306a36Sopenharmony_ci .gpiomute = 4, 181862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 181962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 182062306a36Sopenharmony_ci .pll = PLL_28, 182162306a36Sopenharmony_ci }, 182262306a36Sopenharmony_ci [BTTV_BOARD_EURESYS_PICOLO] = { 182362306a36Sopenharmony_ci .name = "Euresys Picolo", 182462306a36Sopenharmony_ci .video_inputs = 3, 182562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 182662306a36Sopenharmony_ci .svhs = 2, 182762306a36Sopenharmony_ci .gpiomask = 0, 182862306a36Sopenharmony_ci .no_msp34xx = 1, 182962306a36Sopenharmony_ci .no_tda7432 = 1, 183062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 0, 1), 183162306a36Sopenharmony_ci .pll = PLL_28, 183262306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 183362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 183462306a36Sopenharmony_ci }, 183562306a36Sopenharmony_ci [BTTV_BOARD_PV150] = { 183662306a36Sopenharmony_ci /* Luc Van Hoeylandt <luc@e-magic.be> */ 183762306a36Sopenharmony_ci .name = "ProVideo PV150", /* 0x4f */ 183862306a36Sopenharmony_ci .video_inputs = 2, 183962306a36Sopenharmony_ci /* .audio_inputs= 0, */ 184062306a36Sopenharmony_ci .svhs = NO_SVHS, 184162306a36Sopenharmony_ci .gpiomask = 0, 184262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3), 184362306a36Sopenharmony_ci .gpiomux = { 0 }, 184462306a36Sopenharmony_ci .no_msp34xx = 1, 184562306a36Sopenharmony_ci .pll = PLL_28, 184662306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 184762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 184862306a36Sopenharmony_ci }, 184962306a36Sopenharmony_ci [BTTV_BOARD_AD_TVK503] = { 185062306a36Sopenharmony_ci /* Hiroshi Takekawa <sian@big.or.jp> */ 185162306a36Sopenharmony_ci /* This card lacks subsystem ID */ 185262306a36Sopenharmony_ci .name = "AD-TVK503", /* 0x63 */ 185362306a36Sopenharmony_ci .video_inputs = 4, 185462306a36Sopenharmony_ci /* .audio_inputs= 1, */ 185562306a36Sopenharmony_ci .svhs = 2, 185662306a36Sopenharmony_ci .gpiomask = 0x001e8007, 185762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 185862306a36Sopenharmony_ci /* Tuner, Radio, external, internal, off, on */ 185962306a36Sopenharmony_ci .gpiomux = { 0x08, 0x0f, 0x0a, 0x08 }, 186062306a36Sopenharmony_ci .gpiomute = 0x0f, 186162306a36Sopenharmony_ci .no_msp34xx = 1, 186262306a36Sopenharmony_ci .pll = PLL_28, 186362306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC, 186462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 186562306a36Sopenharmony_ci .audio_mode_gpio= adtvk503_audio, 186662306a36Sopenharmony_ci }, 186762306a36Sopenharmony_ci 186862306a36Sopenharmony_ci /* ---- card 0x64 ---------------------------------- */ 186962306a36Sopenharmony_ci [BTTV_BOARD_HERCULES_SM_TV] = { 187062306a36Sopenharmony_ci .name = "Hercules Smart TV Stereo", 187162306a36Sopenharmony_ci .video_inputs = 4, 187262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 187362306a36Sopenharmony_ci .svhs = 2, 187462306a36Sopenharmony_ci .gpiomask = 0x00, 187562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 187662306a36Sopenharmony_ci .no_msp34xx = 1, 187762306a36Sopenharmony_ci .pll = PLL_28, 187862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 187962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 188062306a36Sopenharmony_ci /* Notes: 188162306a36Sopenharmony_ci - card lacks subsystem ID 188262306a36Sopenharmony_ci - stereo variant w/ daughter board with tda9874a @0xb0 188362306a36Sopenharmony_ci - Audio Routing: 188462306a36Sopenharmony_ci always from tda9874 independent of GPIO (?) 188562306a36Sopenharmony_ci external line in: unknown 188662306a36Sopenharmony_ci - Other chips: em78p156elp @ 0x96 (probably IR remote control) 188762306a36Sopenharmony_ci hef4053 (instead 4052) for unknown function 188862306a36Sopenharmony_ci */ 188962306a36Sopenharmony_ci }, 189062306a36Sopenharmony_ci [BTTV_BOARD_PACETV] = { 189162306a36Sopenharmony_ci .name = "Pace TV & Radio Card", 189262306a36Sopenharmony_ci .video_inputs = 4, 189362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 189462306a36Sopenharmony_ci .svhs = 2, 189562306a36Sopenharmony_ci /* Tuner, CVid, SVid, CVid over SVid connector */ 189662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 189762306a36Sopenharmony_ci .gpiomask = 0, 189862306a36Sopenharmony_ci .no_tda7432 = 1, 189962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 190062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 190162306a36Sopenharmony_ci .has_radio = 1, 190262306a36Sopenharmony_ci .pll = PLL_28, 190362306a36Sopenharmony_ci /* Bt878, Bt832, FI1246 tuner; no pci subsystem id 190462306a36Sopenharmony_ci only internal line out: (4pin header) RGGL 190562306a36Sopenharmony_ci Radio must be decoded by msp3410d (not routed through)*/ 190662306a36Sopenharmony_ci /* 190762306a36Sopenharmony_ci .digital_mode = DIGITAL_MODE_CAMERA, todo! 190862306a36Sopenharmony_ci */ 190962306a36Sopenharmony_ci }, 191062306a36Sopenharmony_ci [BTTV_BOARD_IVC200] = { 191162306a36Sopenharmony_ci /* Chris Willing <chris@vislab.usyd.edu.au> */ 191262306a36Sopenharmony_ci .name = "IVC-200", 191362306a36Sopenharmony_ci .video_inputs = 1, 191462306a36Sopenharmony_ci /* .audio_inputs= 0, */ 191562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 191662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 191762306a36Sopenharmony_ci .svhs = NO_SVHS, 191862306a36Sopenharmony_ci .gpiomask = 0xdf, 191962306a36Sopenharmony_ci .muxsel = MUXSEL(2), 192062306a36Sopenharmony_ci .pll = PLL_28, 192162306a36Sopenharmony_ci }, 192262306a36Sopenharmony_ci [BTTV_BOARD_IVCE8784] = { 192362306a36Sopenharmony_ci .name = "IVCE-8784", 192462306a36Sopenharmony_ci .video_inputs = 1, 192562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 192662306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 192762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 192862306a36Sopenharmony_ci .svhs = NO_SVHS, 192962306a36Sopenharmony_ci .gpiomask = 0xdf, 193062306a36Sopenharmony_ci .muxsel = MUXSEL(2), 193162306a36Sopenharmony_ci .pll = PLL_28, 193262306a36Sopenharmony_ci }, 193362306a36Sopenharmony_ci [BTTV_BOARD_XGUARD] = { 193462306a36Sopenharmony_ci .name = "Grand X-Guard / Trust 814PCI", 193562306a36Sopenharmony_ci .video_inputs = 16, 193662306a36Sopenharmony_ci /* .audio_inputs= 0, */ 193762306a36Sopenharmony_ci .svhs = NO_SVHS, 193862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 193962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 194062306a36Sopenharmony_ci .gpiomask2 = 0xff, 194162306a36Sopenharmony_ci .muxsel = MUXSEL(2,2,2,2, 3,3,3,3, 1,1,1,1, 0,0,0,0), 194262306a36Sopenharmony_ci .muxsel_hook = xguard_muxsel, 194362306a36Sopenharmony_ci .no_msp34xx = 1, 194462306a36Sopenharmony_ci .no_tda7432 = 1, 194562306a36Sopenharmony_ci .pll = PLL_28, 194662306a36Sopenharmony_ci }, 194762306a36Sopenharmony_ci 194862306a36Sopenharmony_ci /* ---- card 0x68 ---------------------------------- */ 194962306a36Sopenharmony_ci [BTTV_BOARD_NEBULA_DIGITV] = { 195062306a36Sopenharmony_ci .name = "Nebula Electronics DigiTV", 195162306a36Sopenharmony_ci .video_inputs = 1, 195262306a36Sopenharmony_ci .svhs = NO_SVHS, 195362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 195462306a36Sopenharmony_ci .no_msp34xx = 1, 195562306a36Sopenharmony_ci .no_tda7432 = 1, 195662306a36Sopenharmony_ci .pll = PLL_28, 195762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 195862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 195962306a36Sopenharmony_ci .has_dvb = 1, 196062306a36Sopenharmony_ci .has_remote = 1, 196162306a36Sopenharmony_ci .gpiomask = 0x1b, 196262306a36Sopenharmony_ci .no_gpioirq = 1, 196362306a36Sopenharmony_ci }, 196462306a36Sopenharmony_ci [BTTV_BOARD_PV143] = { 196562306a36Sopenharmony_ci /* Jorge Boncompte - DTI2 <jorge@dti2.net> */ 196662306a36Sopenharmony_ci .name = "ProVideo PV143", 196762306a36Sopenharmony_ci .video_inputs = 4, 196862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 196962306a36Sopenharmony_ci .svhs = NO_SVHS, 197062306a36Sopenharmony_ci .gpiomask = 0, 197162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 197262306a36Sopenharmony_ci .gpiomux = { 0 }, 197362306a36Sopenharmony_ci .no_msp34xx = 1, 197462306a36Sopenharmony_ci .pll = PLL_28, 197562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 197662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 197762306a36Sopenharmony_ci }, 197862306a36Sopenharmony_ci [BTTV_BOARD_VD009X1_VD011_MINIDIN] = { 197962306a36Sopenharmony_ci /* M.Klahr@phytec.de */ 198062306a36Sopenharmony_ci .name = "PHYTEC VD-009-X1 VD-011 MiniDIN (bt878)", 198162306a36Sopenharmony_ci .video_inputs = 4, 198262306a36Sopenharmony_ci /* .audio_inputs= 0, */ 198362306a36Sopenharmony_ci .svhs = 3, 198462306a36Sopenharmony_ci .gpiomask = 0x00, 198562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 198662306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 198762306a36Sopenharmony_ci .pll = PLL_28, 198862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 198962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 199062306a36Sopenharmony_ci }, 199162306a36Sopenharmony_ci [BTTV_BOARD_VD009X1_VD011_COMBI] = { 199262306a36Sopenharmony_ci .name = "PHYTEC VD-009-X1 VD-011 Combi (bt878)", 199362306a36Sopenharmony_ci .video_inputs = 4, 199462306a36Sopenharmony_ci /* .audio_inputs= 0, */ 199562306a36Sopenharmony_ci .svhs = 3, 199662306a36Sopenharmony_ci .gpiomask = 0x00, 199762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 199862306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 199962306a36Sopenharmony_ci .pll = PLL_28, 200062306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 200162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 200262306a36Sopenharmony_ci }, 200362306a36Sopenharmony_ci 200462306a36Sopenharmony_ci /* ---- card 0x6c ---------------------------------- */ 200562306a36Sopenharmony_ci [BTTV_BOARD_VD009_MINIDIN] = { 200662306a36Sopenharmony_ci .name = "PHYTEC VD-009 MiniDIN (bt878)", 200762306a36Sopenharmony_ci .video_inputs = 10, 200862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 200962306a36Sopenharmony_ci .svhs = 9, 201062306a36Sopenharmony_ci .gpiomask = 0x00, 201162306a36Sopenharmony_ci .gpiomask2 = 0x03, /* used for external video mux */ 201262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2, 3, 3, 3, 3, 1, 0), 201362306a36Sopenharmony_ci .muxsel_hook = phytec_muxsel, 201462306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 201562306a36Sopenharmony_ci .pll = PLL_28, 201662306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 201762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 201862306a36Sopenharmony_ci }, 201962306a36Sopenharmony_ci [BTTV_BOARD_VD009_COMBI] = { 202062306a36Sopenharmony_ci .name = "PHYTEC VD-009 Combi (bt878)", 202162306a36Sopenharmony_ci .video_inputs = 10, 202262306a36Sopenharmony_ci /* .audio_inputs= 0, */ 202362306a36Sopenharmony_ci .svhs = 9, 202462306a36Sopenharmony_ci .gpiomask = 0x00, 202562306a36Sopenharmony_ci .gpiomask2 = 0x03, /* used for external video mux */ 202662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2, 3, 3, 3, 3, 1, 1), 202762306a36Sopenharmony_ci .muxsel_hook = phytec_muxsel, 202862306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 202962306a36Sopenharmony_ci .pll = PLL_28, 203062306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 203162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 203262306a36Sopenharmony_ci }, 203362306a36Sopenharmony_ci [BTTV_BOARD_IVC100] = { 203462306a36Sopenharmony_ci .name = "IVC-100", 203562306a36Sopenharmony_ci .video_inputs = 4, 203662306a36Sopenharmony_ci /* .audio_inputs= 0, */ 203762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 203862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 203962306a36Sopenharmony_ci .svhs = NO_SVHS, 204062306a36Sopenharmony_ci .gpiomask = 0xdf, 204162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 204262306a36Sopenharmony_ci .pll = PLL_28, 204362306a36Sopenharmony_ci }, 204462306a36Sopenharmony_ci [BTTV_BOARD_IVC120] = { 204562306a36Sopenharmony_ci /* IVC-120G - Alan Garfield <alan@fromorbit.com> */ 204662306a36Sopenharmony_ci .name = "IVC-120G", 204762306a36Sopenharmony_ci .video_inputs = 16, 204862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 204962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 205062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 205162306a36Sopenharmony_ci .svhs = NO_SVHS, /* card has no svhs */ 205262306a36Sopenharmony_ci .no_msp34xx = 1, 205362306a36Sopenharmony_ci .no_tda7432 = 1, 205462306a36Sopenharmony_ci .gpiomask = 0x00, 205562306a36Sopenharmony_ci .muxsel = MUXSEL(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), 205662306a36Sopenharmony_ci .muxsel_hook = ivc120_muxsel, 205762306a36Sopenharmony_ci .pll = PLL_28, 205862306a36Sopenharmony_ci }, 205962306a36Sopenharmony_ci 206062306a36Sopenharmony_ci /* ---- card 0x70 ---------------------------------- */ 206162306a36Sopenharmony_ci [BTTV_BOARD_PC_HDTV] = { 206262306a36Sopenharmony_ci .name = "pcHDTV HD-2000 TV", 206362306a36Sopenharmony_ci .video_inputs = 4, 206462306a36Sopenharmony_ci /* .audio_inputs= 1, */ 206562306a36Sopenharmony_ci .svhs = 2, 206662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 206762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FCV1236D, 206862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 206962306a36Sopenharmony_ci .has_dvb = 1, 207062306a36Sopenharmony_ci }, 207162306a36Sopenharmony_ci [BTTV_BOARD_TWINHAN_DST] = { 207262306a36Sopenharmony_ci .name = "Twinhan DST + clones", 207362306a36Sopenharmony_ci .no_msp34xx = 1, 207462306a36Sopenharmony_ci .no_tda7432 = 1, 207562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 207662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 207762306a36Sopenharmony_ci .no_video = 1, 207862306a36Sopenharmony_ci .has_dvb = 1, 207962306a36Sopenharmony_ci }, 208062306a36Sopenharmony_ci [BTTV_BOARD_WINFASTVC100] = { 208162306a36Sopenharmony_ci .name = "Winfast VC100", 208262306a36Sopenharmony_ci .video_inputs = 3, 208362306a36Sopenharmony_ci /* .audio_inputs= 0, */ 208462306a36Sopenharmony_ci .svhs = 1, 208562306a36Sopenharmony_ci /* Vid In, SVid In, Vid over SVid in connector */ 208662306a36Sopenharmony_ci .muxsel = MUXSEL(3, 1, 1, 3), 208762306a36Sopenharmony_ci .no_msp34xx = 1, 208862306a36Sopenharmony_ci .no_tda7432 = 1, 208962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 209062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 209162306a36Sopenharmony_ci .pll = PLL_28, 209262306a36Sopenharmony_ci }, 209362306a36Sopenharmony_ci [BTTV_BOARD_TEV560] = { 209462306a36Sopenharmony_ci .name = "Teppro TEV-560/InterVision IV-560", 209562306a36Sopenharmony_ci .video_inputs = 3, 209662306a36Sopenharmony_ci /* .audio_inputs= 1, */ 209762306a36Sopenharmony_ci .svhs = 2, 209862306a36Sopenharmony_ci .gpiomask = 3, 209962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 210062306a36Sopenharmony_ci .gpiomux = { 1, 1, 1, 1 }, 210162306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 210262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 210362306a36Sopenharmony_ci .pll = PLL_35, 210462306a36Sopenharmony_ci }, 210562306a36Sopenharmony_ci 210662306a36Sopenharmony_ci /* ---- card 0x74 ---------------------------------- */ 210762306a36Sopenharmony_ci [BTTV_BOARD_SIMUS_GVC1100] = { 210862306a36Sopenharmony_ci .name = "SIMUS GVC1100", 210962306a36Sopenharmony_ci .video_inputs = 4, 211062306a36Sopenharmony_ci /* .audio_inputs= 0, */ 211162306a36Sopenharmony_ci .svhs = NO_SVHS, 211262306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 211362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 211462306a36Sopenharmony_ci .pll = PLL_28, 211562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 211662306a36Sopenharmony_ci .gpiomask = 0x3F, 211762306a36Sopenharmony_ci .muxsel_hook = gvc1100_muxsel, 211862306a36Sopenharmony_ci }, 211962306a36Sopenharmony_ci [BTTV_BOARD_NGSTV_PLUS] = { 212062306a36Sopenharmony_ci /* Carlos Silva r3pek@r3pek.homelinux.org || card 0x75 */ 212162306a36Sopenharmony_ci .name = "NGS NGSTV+", 212262306a36Sopenharmony_ci .video_inputs = 3, 212362306a36Sopenharmony_ci .svhs = 2, 212462306a36Sopenharmony_ci .gpiomask = 0x008007, 212562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 0), 212662306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, 212762306a36Sopenharmony_ci .gpiomute = 0x000003, 212862306a36Sopenharmony_ci .pll = PLL_28, 212962306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 213062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 213162306a36Sopenharmony_ci .has_remote = 1, 213262306a36Sopenharmony_ci }, 213362306a36Sopenharmony_ci [BTTV_BOARD_LMLBT4] = { 213462306a36Sopenharmony_ci /* http://linuxmedialabs.com */ 213562306a36Sopenharmony_ci .name = "LMLBT4", 213662306a36Sopenharmony_ci .video_inputs = 4, /* IN1,IN2,IN3,IN4 */ 213762306a36Sopenharmony_ci /* .audio_inputs= 0, */ 213862306a36Sopenharmony_ci .svhs = NO_SVHS, 213962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 214062306a36Sopenharmony_ci .no_msp34xx = 1, 214162306a36Sopenharmony_ci .no_tda7432 = 1, 214262306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 214362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 214462306a36Sopenharmony_ci }, 214562306a36Sopenharmony_ci [BTTV_BOARD_TEKRAM_M205] = { 214662306a36Sopenharmony_ci /* Helmroos Harri <harri.helmroos@pp.inet.fi> */ 214762306a36Sopenharmony_ci .name = "Tekram M205 PRO", 214862306a36Sopenharmony_ci .video_inputs = 3, 214962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 215062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 215162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 215262306a36Sopenharmony_ci .svhs = 2, 215362306a36Sopenharmony_ci .gpiomask = 0x68, 215462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1), 215562306a36Sopenharmony_ci .gpiomux = { 0x68, 0x68, 0x61, 0x61 }, 215662306a36Sopenharmony_ci .pll = PLL_28, 215762306a36Sopenharmony_ci }, 215862306a36Sopenharmony_ci 215962306a36Sopenharmony_ci /* ---- card 0x78 ---------------------------------- */ 216062306a36Sopenharmony_ci [BTTV_BOARD_CONTVFMI] = { 216162306a36Sopenharmony_ci /* Javier Cendan Ares <jcendan@lycos.es> */ 216262306a36Sopenharmony_ci /* bt878 TV + FM without subsystem ID */ 216362306a36Sopenharmony_ci .name = "Conceptronic CONTVFMi", 216462306a36Sopenharmony_ci .video_inputs = 3, 216562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 216662306a36Sopenharmony_ci .svhs = 2, 216762306a36Sopenharmony_ci .gpiomask = 0x008007, 216862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 216962306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 2 }, 217062306a36Sopenharmony_ci .gpiomute = 3, 217162306a36Sopenharmony_ci .pll = PLL_28, 217262306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 217362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 217462306a36Sopenharmony_ci .has_remote = 1, 217562306a36Sopenharmony_ci .has_radio = 1, 217662306a36Sopenharmony_ci }, 217762306a36Sopenharmony_ci [BTTV_BOARD_PICOLO_TETRA_CHIP] = { 217862306a36Sopenharmony_ci /*Eric DEBIEF <debief@telemsa.com>*/ 217962306a36Sopenharmony_ci /*EURESYS Picolo Tetra : 4 Conexant Fusion 878A, no audio, video input set with analog multiplexers GPIO controlled*/ 218062306a36Sopenharmony_ci /*adds picolo_tetra_muxsel(), picolo_tetra_init(), the following declaration*/ 218162306a36Sopenharmony_ci /*structure and #define BTTV_BOARD_PICOLO_TETRA_CHIP 0x79 in bttv.h*/ 218262306a36Sopenharmony_ci .name = "Euresys Picolo Tetra", 218362306a36Sopenharmony_ci .video_inputs = 4, 218462306a36Sopenharmony_ci /* .audio_inputs= 0, */ 218562306a36Sopenharmony_ci .svhs = NO_SVHS, 218662306a36Sopenharmony_ci .gpiomask = 0, 218762306a36Sopenharmony_ci .gpiomask2 = 0x3C<<16,/*Set the GPIO[18]->GPIO[21] as output pin.==> drive the video inputs through analog multiplexers*/ 218862306a36Sopenharmony_ci .no_msp34xx = 1, 218962306a36Sopenharmony_ci .no_tda7432 = 1, 219062306a36Sopenharmony_ci /*878A input is always MUX0, see above.*/ 219162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 219262306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 219362306a36Sopenharmony_ci .pll = PLL_28, 219462306a36Sopenharmony_ci .muxsel_hook = picolo_tetra_muxsel,/*Required as it doesn't follow the classic input selection policy*/ 219562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 219662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 219762306a36Sopenharmony_ci }, 219862306a36Sopenharmony_ci [BTTV_BOARD_SPIRIT_TV] = { 219962306a36Sopenharmony_ci /* Spirit TV Tuner from http://spiritmodems.com.au */ 220062306a36Sopenharmony_ci /* Stafford Goodsell <surge@goliath.homeunix.org> */ 220162306a36Sopenharmony_ci .name = "Spirit TV Tuner", 220262306a36Sopenharmony_ci .video_inputs = 3, 220362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 220462306a36Sopenharmony_ci .svhs = 2, 220562306a36Sopenharmony_ci .gpiomask = 0x0000000f, 220662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 1, 1), 220762306a36Sopenharmony_ci .gpiomux = { 0x02, 0x00, 0x00, 0x00 }, 220862306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_PAL, 220962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 221062306a36Sopenharmony_ci .no_msp34xx = 1, 221162306a36Sopenharmony_ci }, 221262306a36Sopenharmony_ci [BTTV_BOARD_AVDVBT_771] = { 221362306a36Sopenharmony_ci /* Wolfram Joost <wojo@frokaschwei.de> */ 221462306a36Sopenharmony_ci .name = "AVerMedia AVerTV DVB-T 771", 221562306a36Sopenharmony_ci .video_inputs = 2, 221662306a36Sopenharmony_ci .svhs = 1, 221762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 221862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 221962306a36Sopenharmony_ci .muxsel = MUXSEL(3, 3), 222062306a36Sopenharmony_ci .no_msp34xx = 1, 222162306a36Sopenharmony_ci .no_tda7432 = 1, 222262306a36Sopenharmony_ci .pll = PLL_28, 222362306a36Sopenharmony_ci .has_dvb = 1, 222462306a36Sopenharmony_ci .no_gpioirq = 1, 222562306a36Sopenharmony_ci .has_remote = 1, 222662306a36Sopenharmony_ci }, 222762306a36Sopenharmony_ci /* ---- card 0x7c ---------------------------------- */ 222862306a36Sopenharmony_ci [BTTV_BOARD_AVDVBT_761] = { 222962306a36Sopenharmony_ci /* Matt Jesson <dvb@jesson.eclipse.co.uk> */ 223062306a36Sopenharmony_ci /* Based on the Nebula card data - added remote and new card number - BTTV_BOARD_AVDVBT_761, see also ir-kbd-gpio.c */ 223162306a36Sopenharmony_ci .name = "AverMedia AverTV DVB-T 761", 223262306a36Sopenharmony_ci .video_inputs = 2, 223362306a36Sopenharmony_ci .svhs = 1, 223462306a36Sopenharmony_ci .muxsel = MUXSEL(3, 1, 2, 0), /* Comp0, S-Video, ?, ? */ 223562306a36Sopenharmony_ci .no_msp34xx = 1, 223662306a36Sopenharmony_ci .no_tda7432 = 1, 223762306a36Sopenharmony_ci .pll = PLL_28, 223862306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 223962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 224062306a36Sopenharmony_ci .has_dvb = 1, 224162306a36Sopenharmony_ci .no_gpioirq = 1, 224262306a36Sopenharmony_ci .has_remote = 1, 224362306a36Sopenharmony_ci }, 224462306a36Sopenharmony_ci [BTTV_BOARD_MATRIX_VISIONSQ] = { 224562306a36Sopenharmony_ci /* andre.schwarz@matrix-vision.de */ 224662306a36Sopenharmony_ci .name = "MATRIX Vision Sigma-SQ", 224762306a36Sopenharmony_ci .video_inputs = 16, 224862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 224962306a36Sopenharmony_ci .svhs = NO_SVHS, 225062306a36Sopenharmony_ci .gpiomask = 0x0, 225162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3), 225262306a36Sopenharmony_ci .muxsel_hook = sigmaSQ_muxsel, 225362306a36Sopenharmony_ci .gpiomux = { 0 }, 225462306a36Sopenharmony_ci .no_msp34xx = 1, 225562306a36Sopenharmony_ci .pll = PLL_28, 225662306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 225762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 225862306a36Sopenharmony_ci }, 225962306a36Sopenharmony_ci [BTTV_BOARD_MATRIX_VISIONSLC] = { 226062306a36Sopenharmony_ci /* andre.schwarz@matrix-vision.de */ 226162306a36Sopenharmony_ci .name = "MATRIX Vision Sigma-SLC", 226262306a36Sopenharmony_ci .video_inputs = 4, 226362306a36Sopenharmony_ci /* .audio_inputs= 0, */ 226462306a36Sopenharmony_ci .svhs = NO_SVHS, 226562306a36Sopenharmony_ci .gpiomask = 0x0, 226662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 226762306a36Sopenharmony_ci .muxsel_hook = sigmaSLC_muxsel, 226862306a36Sopenharmony_ci .gpiomux = { 0 }, 226962306a36Sopenharmony_ci .no_msp34xx = 1, 227062306a36Sopenharmony_ci .pll = PLL_28, 227162306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 227262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 227362306a36Sopenharmony_ci }, 227462306a36Sopenharmony_ci /* BTTV_BOARD_APAC_VIEWCOMP */ 227562306a36Sopenharmony_ci [BTTV_BOARD_APAC_VIEWCOMP] = { 227662306a36Sopenharmony_ci /* Attila Kondoros <attila.kondoros@chello.hu> */ 227762306a36Sopenharmony_ci /* bt878 TV + FM 0x00000000 subsystem ID */ 227862306a36Sopenharmony_ci .name = "APAC Viewcomp 878(AMAX)", 227962306a36Sopenharmony_ci .video_inputs = 2, 228062306a36Sopenharmony_ci /* .audio_inputs= 1, */ 228162306a36Sopenharmony_ci .svhs = NO_SVHS, 228262306a36Sopenharmony_ci .gpiomask = 0xFF, 228362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 228462306a36Sopenharmony_ci .gpiomux = { 2, 0, 0, 0 }, 228562306a36Sopenharmony_ci .gpiomute = 10, 228662306a36Sopenharmony_ci .pll = PLL_28, 228762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL, 228862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 228962306a36Sopenharmony_ci .has_remote = 1, /* miniremote works, see ir-kbd-gpio.c */ 229062306a36Sopenharmony_ci .has_radio = 1, /* not every card has radio */ 229162306a36Sopenharmony_ci }, 229262306a36Sopenharmony_ci 229362306a36Sopenharmony_ci /* ---- card 0x80 ---------------------------------- */ 229462306a36Sopenharmony_ci [BTTV_BOARD_DVICO_DVBT_LITE] = { 229562306a36Sopenharmony_ci /* Chris Pascoe <c.pascoe@itee.uq.edu.au> */ 229662306a36Sopenharmony_ci .name = "DViCO FusionHDTV DVB-T Lite", 229762306a36Sopenharmony_ci .no_msp34xx = 1, 229862306a36Sopenharmony_ci .no_tda7432 = 1, 229962306a36Sopenharmony_ci .pll = PLL_28, 230062306a36Sopenharmony_ci .no_video = 1, 230162306a36Sopenharmony_ci .has_dvb = 1, 230262306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 230362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 230462306a36Sopenharmony_ci }, 230562306a36Sopenharmony_ci [BTTV_BOARD_VGEAR_MYVCD] = { 230662306a36Sopenharmony_ci /* Steven <photon38@pchome.com.tw> */ 230762306a36Sopenharmony_ci .name = "V-Gear MyVCD", 230862306a36Sopenharmony_ci .video_inputs = 3, 230962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 231062306a36Sopenharmony_ci .svhs = 2, 231162306a36Sopenharmony_ci .gpiomask = 0x3f, 231262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 231362306a36Sopenharmony_ci .gpiomux = {0x31, 0x31, 0x31, 0x31 }, 231462306a36Sopenharmony_ci .gpiomute = 0x31, 231562306a36Sopenharmony_ci .no_msp34xx = 1, 231662306a36Sopenharmony_ci .pll = PLL_28, 231762306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC_M, 231862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 231962306a36Sopenharmony_ci .has_radio = 0, 232062306a36Sopenharmony_ci }, 232162306a36Sopenharmony_ci [BTTV_BOARD_SUPER_TV] = { 232262306a36Sopenharmony_ci /* Rick C <cryptdragoon@gmail.com> */ 232362306a36Sopenharmony_ci .name = "Super TV Tuner", 232462306a36Sopenharmony_ci .video_inputs = 4, 232562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 232662306a36Sopenharmony_ci .svhs = 2, 232762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 232862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC, 232962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 233062306a36Sopenharmony_ci .gpiomask = 0x008007, 233162306a36Sopenharmony_ci .gpiomux = { 0, 0x000001,0,0 }, 233262306a36Sopenharmony_ci .has_radio = 1, 233362306a36Sopenharmony_ci }, 233462306a36Sopenharmony_ci [BTTV_BOARD_TIBET_CS16] = { 233562306a36Sopenharmony_ci /* Chris Fanning <video4linux@haydon.net> */ 233662306a36Sopenharmony_ci .name = "Tibet Systems 'Progress DVR' CS16", 233762306a36Sopenharmony_ci .video_inputs = 16, 233862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 233962306a36Sopenharmony_ci .svhs = NO_SVHS, 234062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), 234162306a36Sopenharmony_ci .pll = PLL_28, 234262306a36Sopenharmony_ci .no_msp34xx = 1, 234362306a36Sopenharmony_ci .no_tda7432 = 1, 234462306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 234562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 234662306a36Sopenharmony_ci .muxsel_hook = tibetCS16_muxsel, 234762306a36Sopenharmony_ci }, 234862306a36Sopenharmony_ci [BTTV_BOARD_KODICOM_4400R] = { 234962306a36Sopenharmony_ci /* Bill Brack <wbrack@mmm.com.hk> */ 235062306a36Sopenharmony_ci /* 235162306a36Sopenharmony_ci * Note that, because of the card's wiring, the "master" 235262306a36Sopenharmony_ci * BT878A chip (i.e. the one which controls the analog switch 235362306a36Sopenharmony_ci * and must use this card type) is the 2nd one detected. The 235462306a36Sopenharmony_ci * other 3 chips should use card type 0x85, whose description 235562306a36Sopenharmony_ci * follows this one. There is a EEPROM on the card (which is 235662306a36Sopenharmony_ci * connected to the I2C of one of those other chips), but is 235762306a36Sopenharmony_ci * not currently handled. There is also a facility for a 235862306a36Sopenharmony_ci * "monitor", which is also not currently implemented. 235962306a36Sopenharmony_ci */ 236062306a36Sopenharmony_ci .name = "Kodicom 4400R (master)", 236162306a36Sopenharmony_ci .video_inputs = 16, 236262306a36Sopenharmony_ci /* .audio_inputs= 0, */ 236362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 236462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 236562306a36Sopenharmony_ci .svhs = NO_SVHS, 236662306a36Sopenharmony_ci /* GPIO bits 0-9 used for analog switch: 236762306a36Sopenharmony_ci * 00 - 03: camera selector 236862306a36Sopenharmony_ci * 04 - 06: channel (controller) selector 236962306a36Sopenharmony_ci * 07: data (1->on, 0->off) 237062306a36Sopenharmony_ci * 08: strobe 237162306a36Sopenharmony_ci * 09: reset 237262306a36Sopenharmony_ci * bit 16 is input from sync separator for the channel 237362306a36Sopenharmony_ci */ 237462306a36Sopenharmony_ci .gpiomask = 0x0003ff, 237562306a36Sopenharmony_ci .no_gpioirq = 1, 237662306a36Sopenharmony_ci .muxsel = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), 237762306a36Sopenharmony_ci .pll = PLL_28, 237862306a36Sopenharmony_ci .no_msp34xx = 1, 237962306a36Sopenharmony_ci .no_tda7432 = 1, 238062306a36Sopenharmony_ci .muxsel_hook = kodicom4400r_muxsel, 238162306a36Sopenharmony_ci }, 238262306a36Sopenharmony_ci [BTTV_BOARD_KODICOM_4400R_SL] = { 238362306a36Sopenharmony_ci /* Bill Brack <wbrack@mmm.com.hk> */ 238462306a36Sopenharmony_ci /* Note that, for reasons unknown, the "master" BT878A chip (i.e. the 238562306a36Sopenharmony_ci * one which controls the analog switch, and must use the card type) 238662306a36Sopenharmony_ci * is the 2nd one detected. The other 3 chips should use this card 238762306a36Sopenharmony_ci * type 238862306a36Sopenharmony_ci */ 238962306a36Sopenharmony_ci .name = "Kodicom 4400R (slave)", 239062306a36Sopenharmony_ci .video_inputs = 16, 239162306a36Sopenharmony_ci /* .audio_inputs= 0, */ 239262306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 239362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 239462306a36Sopenharmony_ci .svhs = NO_SVHS, 239562306a36Sopenharmony_ci .gpiomask = 0x010000, 239662306a36Sopenharmony_ci .no_gpioirq = 1, 239762306a36Sopenharmony_ci .muxsel = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), 239862306a36Sopenharmony_ci .pll = PLL_28, 239962306a36Sopenharmony_ci .no_msp34xx = 1, 240062306a36Sopenharmony_ci .no_tda7432 = 1, 240162306a36Sopenharmony_ci .muxsel_hook = kodicom4400r_muxsel, 240262306a36Sopenharmony_ci }, 240362306a36Sopenharmony_ci /* ---- card 0x86---------------------------------- */ 240462306a36Sopenharmony_ci [BTTV_BOARD_ADLINK_RTV24] = { 240562306a36Sopenharmony_ci /* Michael Henson <mhenson@clarityvi.com> */ 240662306a36Sopenharmony_ci /* Adlink RTV24 with special unlock codes */ 240762306a36Sopenharmony_ci .name = "Adlink RTV24", 240862306a36Sopenharmony_ci .video_inputs = 4, 240962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 241062306a36Sopenharmony_ci .svhs = 2, 241162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 241262306a36Sopenharmony_ci .tuner_type = UNSET, 241362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 241462306a36Sopenharmony_ci .pll = PLL_28, 241562306a36Sopenharmony_ci }, 241662306a36Sopenharmony_ci /* ---- card 0x87---------------------------------- */ 241762306a36Sopenharmony_ci [BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE] = { 241862306a36Sopenharmony_ci /* Michael Krufky <mkrufky@linuxtv.org> */ 241962306a36Sopenharmony_ci .name = "DViCO FusionHDTV 5 Lite", 242062306a36Sopenharmony_ci .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */ 242162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 242262306a36Sopenharmony_ci .video_inputs = 3, 242362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 242462306a36Sopenharmony_ci .svhs = 2, 242562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1), 242662306a36Sopenharmony_ci .gpiomask = 0x00e00007, 242762306a36Sopenharmony_ci .gpiomux = { 0x00400005, 0, 0x00000001, 0 }, 242862306a36Sopenharmony_ci .gpiomute = 0x00c00007, 242962306a36Sopenharmony_ci .no_msp34xx = 1, 243062306a36Sopenharmony_ci .no_tda7432 = 1, 243162306a36Sopenharmony_ci .has_dvb = 1, 243262306a36Sopenharmony_ci }, 243362306a36Sopenharmony_ci /* ---- card 0x88---------------------------------- */ 243462306a36Sopenharmony_ci [BTTV_BOARD_ACORP_Y878F] = { 243562306a36Sopenharmony_ci /* Mauro Carvalho Chehab <mchehab@kernel.org> */ 243662306a36Sopenharmony_ci .name = "Acorp Y878F", 243762306a36Sopenharmony_ci .video_inputs = 3, 243862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 243962306a36Sopenharmony_ci .svhs = 2, 244062306a36Sopenharmony_ci .gpiomask = 0x01fe00, 244162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 244262306a36Sopenharmony_ci .gpiomux = { 0x001e00, 0, 0x018000, 0x014000 }, 244362306a36Sopenharmony_ci .gpiomute = 0x002000, 244462306a36Sopenharmony_ci .pll = PLL_28, 244562306a36Sopenharmony_ci .tuner_type = TUNER_YMEC_TVF66T5_B_DFF, 244662306a36Sopenharmony_ci .tuner_addr = 0xc1 >>1, 244762306a36Sopenharmony_ci .has_radio = 1, 244862306a36Sopenharmony_ci }, 244962306a36Sopenharmony_ci /* ---- card 0x89 ---------------------------------- */ 245062306a36Sopenharmony_ci [BTTV_BOARD_CONCEPTRONIC_CTVFMI2] = { 245162306a36Sopenharmony_ci .name = "Conceptronic CTVFMi v2", 245262306a36Sopenharmony_ci .video_inputs = 3, 245362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 245462306a36Sopenharmony_ci .svhs = 2, 245562306a36Sopenharmony_ci .gpiomask = 0x001c0007, 245662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 245762306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 2 }, 245862306a36Sopenharmony_ci .gpiomute = 3, 245962306a36Sopenharmony_ci .pll = PLL_28, 246062306a36Sopenharmony_ci .tuner_type = TUNER_TENA_9533_DI, 246162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 246262306a36Sopenharmony_ci .has_remote = 1, 246362306a36Sopenharmony_ci .has_radio = 1, 246462306a36Sopenharmony_ci }, 246562306a36Sopenharmony_ci /* ---- card 0x8a ---------------------------------- */ 246662306a36Sopenharmony_ci [BTTV_BOARD_PV_BT878P_2E] = { 246762306a36Sopenharmony_ci .name = "Prolink Pixelview PV-BT878P+ (Rev.2E)", 246862306a36Sopenharmony_ci .video_inputs = 5, 246962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 247062306a36Sopenharmony_ci .svhs = 3, 247162306a36Sopenharmony_ci .has_dig_in = 1, 247262306a36Sopenharmony_ci .gpiomask = 0x01fe00, 247362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1, 0), /* in 4 is digital */ 247462306a36Sopenharmony_ci /* .digital_mode= DIGITAL_MODE_CAMERA, */ 247562306a36Sopenharmony_ci .gpiomux = { 0x00400, 0x10400, 0x04400, 0x80000 }, 247662306a36Sopenharmony_ci .gpiomute = 0x12400, 247762306a36Sopenharmony_ci .no_msp34xx = 1, 247862306a36Sopenharmony_ci .pll = PLL_28, 247962306a36Sopenharmony_ci .tuner_type = TUNER_LG_PAL_FM, 248062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 248162306a36Sopenharmony_ci .has_remote = 1, 248262306a36Sopenharmony_ci }, 248362306a36Sopenharmony_ci /* ---- card 0x8b ---------------------------------- */ 248462306a36Sopenharmony_ci [BTTV_BOARD_PV_M4900] = { 248562306a36Sopenharmony_ci /* Sérgio Fortier <sergiofortier@yahoo.com.br> */ 248662306a36Sopenharmony_ci .name = "Prolink PixelView PlayTV MPEG2 PV-M4900", 248762306a36Sopenharmony_ci .video_inputs = 3, 248862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 248962306a36Sopenharmony_ci .svhs = 2, 249062306a36Sopenharmony_ci .gpiomask = 0x3f, 249162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 249262306a36Sopenharmony_ci .gpiomux = { 0x21, 0x20, 0x24, 0x2c }, 249362306a36Sopenharmony_ci .gpiomute = 0x29, 249462306a36Sopenharmony_ci .no_msp34xx = 1, 249562306a36Sopenharmony_ci .pll = PLL_28, 249662306a36Sopenharmony_ci .tuner_type = TUNER_YMEC_TVF_5533MF, 249762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 249862306a36Sopenharmony_ci .has_radio = 1, 249962306a36Sopenharmony_ci .has_remote = 1, 250062306a36Sopenharmony_ci }, 250162306a36Sopenharmony_ci /* ---- card 0x8c ---------------------------------- */ 250262306a36Sopenharmony_ci /* Has four Bt878 chips behind a PCI bridge, each chip has: 250362306a36Sopenharmony_ci one external BNC composite input (mux 2) 250462306a36Sopenharmony_ci three internal composite inputs (unknown muxes) 250562306a36Sopenharmony_ci an 18-bit stereo A/D (CS5331A), which has: 250662306a36Sopenharmony_ci one external stereo unbalanced (RCA) audio connection 250762306a36Sopenharmony_ci one (or 3?) internal stereo balanced (XLR) audio connection 250862306a36Sopenharmony_ci input is selected via gpio to a 14052B mux 250962306a36Sopenharmony_ci (mask=0x300, unbal=0x000, bal=0x100, ??=0x200,0x300) 251062306a36Sopenharmony_ci gain is controlled via an X9221A chip on the I2C bus @0x28 251162306a36Sopenharmony_ci sample rate is controlled via gpio to an MK1413S 251262306a36Sopenharmony_ci (mask=0x3, 32kHz=0x0, 44.1kHz=0x1, 48kHz=0x2, ??=0x3) 251362306a36Sopenharmony_ci There is neither a tuner nor an svideo input. */ 251462306a36Sopenharmony_ci [BTTV_BOARD_OSPREY440] = { 251562306a36Sopenharmony_ci .name = "Osprey 440", 251662306a36Sopenharmony_ci .video_inputs = 4, 251762306a36Sopenharmony_ci /* .audio_inputs= 2, */ 251862306a36Sopenharmony_ci .svhs = NO_SVHS, 251962306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 0, 1), /* 3,0,1 are guesses */ 252062306a36Sopenharmony_ci .gpiomask = 0x303, 252162306a36Sopenharmony_ci .gpiomute = 0x000, /* int + 32kHz */ 252262306a36Sopenharmony_ci .gpiomux = { 0, 0, 0x000, 0x100}, 252362306a36Sopenharmony_ci .pll = PLL_28, 252462306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 252562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 252662306a36Sopenharmony_ci .no_msp34xx = 1, 252762306a36Sopenharmony_ci .no_tda7432 = 1, 252862306a36Sopenharmony_ci }, 252962306a36Sopenharmony_ci /* ---- card 0x8d ---------------------------------- */ 253062306a36Sopenharmony_ci [BTTV_BOARD_ASOUND_SKYEYE] = { 253162306a36Sopenharmony_ci .name = "Asound Skyeye PCTV", 253262306a36Sopenharmony_ci .video_inputs = 3, 253362306a36Sopenharmony_ci /* .audio_inputs= 1, */ 253462306a36Sopenharmony_ci .svhs = 2, 253562306a36Sopenharmony_ci .gpiomask = 15, 253662306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 253762306a36Sopenharmony_ci .gpiomux = { 2, 0, 0, 0 }, 253862306a36Sopenharmony_ci .gpiomute = 1, 253962306a36Sopenharmony_ci .pll = PLL_28, 254062306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_NTSC, 254162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 254262306a36Sopenharmony_ci }, 254362306a36Sopenharmony_ci /* ---- card 0x8e ---------------------------------- */ 254462306a36Sopenharmony_ci [BTTV_BOARD_SABRENT_TVFM] = { 254562306a36Sopenharmony_ci .name = "Sabrent TV-FM (bttv version)", 254662306a36Sopenharmony_ci .video_inputs = 3, 254762306a36Sopenharmony_ci /* .audio_inputs= 1, */ 254862306a36Sopenharmony_ci .svhs = 2, 254962306a36Sopenharmony_ci .gpiomask = 0x108007, 255062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 255162306a36Sopenharmony_ci .gpiomux = { 100000, 100002, 100002, 100000 }, 255262306a36Sopenharmony_ci .no_msp34xx = 1, 255362306a36Sopenharmony_ci .no_tda7432 = 1, 255462306a36Sopenharmony_ci .pll = PLL_28, 255562306a36Sopenharmony_ci .tuner_type = TUNER_TNF_5335MF, 255662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 255762306a36Sopenharmony_ci .has_radio = 1, 255862306a36Sopenharmony_ci }, 255962306a36Sopenharmony_ci /* ---- card 0x8f ---------------------------------- */ 256062306a36Sopenharmony_ci [BTTV_BOARD_HAUPPAUGE_IMPACTVCB] = { 256162306a36Sopenharmony_ci .name = "Hauppauge ImpactVCB (bt878)", 256262306a36Sopenharmony_ci .video_inputs = 4, 256362306a36Sopenharmony_ci /* .audio_inputs= 0, */ 256462306a36Sopenharmony_ci .svhs = NO_SVHS, 256562306a36Sopenharmony_ci .gpiomask = 0x0f, /* old: 7 */ 256662306a36Sopenharmony_ci .muxsel = MUXSEL(0, 1, 3, 2), /* Composite 0-3 */ 256762306a36Sopenharmony_ci .no_msp34xx = 1, 256862306a36Sopenharmony_ci .no_tda7432 = 1, 256962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 257062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 257162306a36Sopenharmony_ci }, 257262306a36Sopenharmony_ci [BTTV_BOARD_MACHTV_MAGICTV] = { 257362306a36Sopenharmony_ci /* Julian Calaby <julian.calaby@gmail.com> 257462306a36Sopenharmony_ci * Slightly different from original MachTV definition (0x60) 257562306a36Sopenharmony_ci 257662306a36Sopenharmony_ci * FIXME: RegSpy says gpiomask should be "0x001c800f", but it 257762306a36Sopenharmony_ci * stuffs up remote chip. Bug is a pin on the jaecs is not set 257862306a36Sopenharmony_ci * properly (methinks) causing no keyup bits being set */ 257962306a36Sopenharmony_ci 258062306a36Sopenharmony_ci .name = "MagicTV", /* rebranded MachTV */ 258162306a36Sopenharmony_ci .video_inputs = 3, 258262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 258362306a36Sopenharmony_ci .svhs = 2, 258462306a36Sopenharmony_ci .gpiomask = 7, 258562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 258662306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 3 }, 258762306a36Sopenharmony_ci .gpiomute = 4, 258862306a36Sopenharmony_ci .tuner_type = TUNER_TEMIC_4009FR5_PAL, 258962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 259062306a36Sopenharmony_ci .pll = PLL_28, 259162306a36Sopenharmony_ci .has_radio = 1, 259262306a36Sopenharmony_ci .has_remote = 1, 259362306a36Sopenharmony_ci }, 259462306a36Sopenharmony_ci [BTTV_BOARD_SSAI_SECURITY] = { 259562306a36Sopenharmony_ci .name = "SSAI Security Video Interface", 259662306a36Sopenharmony_ci .video_inputs = 4, 259762306a36Sopenharmony_ci /* .audio_inputs= 0, */ 259862306a36Sopenharmony_ci .svhs = NO_SVHS, 259962306a36Sopenharmony_ci .muxsel = MUXSEL(0, 1, 2, 3), 260062306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 260162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 260262306a36Sopenharmony_ci }, 260362306a36Sopenharmony_ci [BTTV_BOARD_SSAI_ULTRASOUND] = { 260462306a36Sopenharmony_ci .name = "SSAI Ultrasound Video Interface", 260562306a36Sopenharmony_ci .video_inputs = 2, 260662306a36Sopenharmony_ci /* .audio_inputs= 0, */ 260762306a36Sopenharmony_ci .svhs = 1, 260862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 0, 1, 3), 260962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 261062306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 261162306a36Sopenharmony_ci }, 261262306a36Sopenharmony_ci /* ---- card 0x94---------------------------------- */ 261362306a36Sopenharmony_ci [BTTV_BOARD_DVICO_FUSIONHDTV_2] = { 261462306a36Sopenharmony_ci .name = "DViCO FusionHDTV 2", 261562306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FCV1236D, 261662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 261762306a36Sopenharmony_ci .video_inputs = 3, 261862306a36Sopenharmony_ci /* .audio_inputs= 1, */ 261962306a36Sopenharmony_ci .svhs = 2, 262062306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1), 262162306a36Sopenharmony_ci .gpiomask = 0x00e00007, 262262306a36Sopenharmony_ci .gpiomux = { 0x00400005, 0, 0x00000001, 0 }, 262362306a36Sopenharmony_ci .gpiomute = 0x00c00007, 262462306a36Sopenharmony_ci .no_msp34xx = 1, 262562306a36Sopenharmony_ci .no_tda7432 = 1, 262662306a36Sopenharmony_ci }, 262762306a36Sopenharmony_ci /* ---- card 0x95---------------------------------- */ 262862306a36Sopenharmony_ci [BTTV_BOARD_TYPHOON_TVTUNERPCI] = { 262962306a36Sopenharmony_ci .name = "Typhoon TV-Tuner PCI (50684)", 263062306a36Sopenharmony_ci .video_inputs = 3, 263162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 263262306a36Sopenharmony_ci .svhs = 2, 263362306a36Sopenharmony_ci .gpiomask = 0x3014f, 263462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 263562306a36Sopenharmony_ci .gpiomux = { 0x20001,0x10001, 0, 0 }, 263662306a36Sopenharmony_ci .gpiomute = 10, 263762306a36Sopenharmony_ci .pll = PLL_28, 263862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_PAL_I, 263962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 264062306a36Sopenharmony_ci }, 264162306a36Sopenharmony_ci [BTTV_BOARD_GEOVISION_GV600] = { 264262306a36Sopenharmony_ci /* emhn@usb.ve */ 264362306a36Sopenharmony_ci .name = "Geovision GV-600", 264462306a36Sopenharmony_ci .video_inputs = 16, 264562306a36Sopenharmony_ci /* .audio_inputs= 0, */ 264662306a36Sopenharmony_ci .svhs = NO_SVHS, 264762306a36Sopenharmony_ci .gpiomask = 0x0, 264862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), 264962306a36Sopenharmony_ci .muxsel_hook = geovision_muxsel, 265062306a36Sopenharmony_ci .gpiomux = { 0 }, 265162306a36Sopenharmony_ci .no_msp34xx = 1, 265262306a36Sopenharmony_ci .pll = PLL_28, 265362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 265462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 265562306a36Sopenharmony_ci }, 265662306a36Sopenharmony_ci [BTTV_BOARD_KOZUMI_KTV_01C] = { 265762306a36Sopenharmony_ci /* Mauro Lacy <mauro@lacy.com.ar> 265862306a36Sopenharmony_ci * Based on MagicTV and Conceptronic CONTVFMi */ 265962306a36Sopenharmony_ci 266062306a36Sopenharmony_ci .name = "Kozumi KTV-01C", 266162306a36Sopenharmony_ci .video_inputs = 3, 266262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 266362306a36Sopenharmony_ci .svhs = 2, 266462306a36Sopenharmony_ci .gpiomask = 0x008007, 266562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 266662306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 2 }, /* CONTVFMi */ 266762306a36Sopenharmony_ci .gpiomute = 3, /* CONTVFMi */ 266862306a36Sopenharmony_ci .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, /* TCL MK3 */ 266962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 267062306a36Sopenharmony_ci .pll = PLL_28, 267162306a36Sopenharmony_ci .has_radio = 1, 267262306a36Sopenharmony_ci .has_remote = 1, 267362306a36Sopenharmony_ci }, 267462306a36Sopenharmony_ci [BTTV_BOARD_ENLTV_FM_2] = { 267562306a36Sopenharmony_ci /* Encore TV Tuner Pro ENL TV-FM-2 267662306a36Sopenharmony_ci Mauro Carvalho Chehab <mchehab@kernel.org> */ 267762306a36Sopenharmony_ci .name = "Encore ENL TV-FM-2", 267862306a36Sopenharmony_ci .video_inputs = 3, 267962306a36Sopenharmony_ci /* .audio_inputs= 1, */ 268062306a36Sopenharmony_ci .svhs = 2, 268162306a36Sopenharmony_ci /* bit 6 -> IR disabled 268262306a36Sopenharmony_ci bit 18/17 = 00 -> mute 268362306a36Sopenharmony_ci 01 -> enable external audio input 268462306a36Sopenharmony_ci 10 -> internal audio input (mono?) 268562306a36Sopenharmony_ci 11 -> internal audio input 268662306a36Sopenharmony_ci */ 268762306a36Sopenharmony_ci .gpiomask = 0x060040, 268862306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 3), 268962306a36Sopenharmony_ci .gpiomux = { 0x60000, 0x60000, 0x20000, 0x20000 }, 269062306a36Sopenharmony_ci .gpiomute = 0, 269162306a36Sopenharmony_ci .tuner_type = TUNER_TCL_MF02GIP_5N, 269262306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 269362306a36Sopenharmony_ci .pll = PLL_28, 269462306a36Sopenharmony_ci .has_radio = 1, 269562306a36Sopenharmony_ci .has_remote = 1, 269662306a36Sopenharmony_ci }, 269762306a36Sopenharmony_ci [BTTV_BOARD_VD012] = { 269862306a36Sopenharmony_ci /* D.Heer@Phytec.de */ 269962306a36Sopenharmony_ci .name = "PHYTEC VD-012 (bt878)", 270062306a36Sopenharmony_ci .video_inputs = 4, 270162306a36Sopenharmony_ci /* .audio_inputs= 0, */ 270262306a36Sopenharmony_ci .svhs = NO_SVHS, 270362306a36Sopenharmony_ci .gpiomask = 0x00, 270462306a36Sopenharmony_ci .muxsel = MUXSEL(0, 2, 3, 1), 270562306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 270662306a36Sopenharmony_ci .pll = PLL_28, 270762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 270862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 270962306a36Sopenharmony_ci }, 271062306a36Sopenharmony_ci [BTTV_BOARD_VD012_X1] = { 271162306a36Sopenharmony_ci /* D.Heer@Phytec.de */ 271262306a36Sopenharmony_ci .name = "PHYTEC VD-012-X1 (bt878)", 271362306a36Sopenharmony_ci .video_inputs = 4, 271462306a36Sopenharmony_ci /* .audio_inputs= 0, */ 271562306a36Sopenharmony_ci .svhs = 3, 271662306a36Sopenharmony_ci .gpiomask = 0x00, 271762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1), 271862306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 271962306a36Sopenharmony_ci .pll = PLL_28, 272062306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 272162306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 272262306a36Sopenharmony_ci }, 272362306a36Sopenharmony_ci [BTTV_BOARD_VD012_X2] = { 272462306a36Sopenharmony_ci /* D.Heer@Phytec.de */ 272562306a36Sopenharmony_ci .name = "PHYTEC VD-012-X2 (bt878)", 272662306a36Sopenharmony_ci .video_inputs = 4, 272762306a36Sopenharmony_ci /* .audio_inputs= 0, */ 272862306a36Sopenharmony_ci .svhs = 3, 272962306a36Sopenharmony_ci .gpiomask = 0x00, 273062306a36Sopenharmony_ci .muxsel = MUXSEL(3, 2, 1), 273162306a36Sopenharmony_ci .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */ 273262306a36Sopenharmony_ci .pll = PLL_28, 273362306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 273462306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 273562306a36Sopenharmony_ci }, 273662306a36Sopenharmony_ci [BTTV_BOARD_GEOVISION_GV800S] = { 273762306a36Sopenharmony_ci /* Bruno Christo <bchristo@inf.ufsm.br> 273862306a36Sopenharmony_ci * 273962306a36Sopenharmony_ci * GeoVision GV-800(S) has 4 Conexant Fusion 878A: 274062306a36Sopenharmony_ci * 1 audio input per BT878A = 4 audio inputs 274162306a36Sopenharmony_ci * 4 video inputs per BT878A = 16 video inputs 274262306a36Sopenharmony_ci * This is the first BT878A chip of the GV-800(S). It's the 274362306a36Sopenharmony_ci * "master" chip and it controls the video inputs through an 274462306a36Sopenharmony_ci * analog multiplexer (a CD22M3494) via some GPIO pins. The 274562306a36Sopenharmony_ci * slaves should use card type 0x9e (following this one). 274662306a36Sopenharmony_ci * There is a EEPROM on the card which is currently not handled. 274762306a36Sopenharmony_ci * The audio input is not working yet. 274862306a36Sopenharmony_ci */ 274962306a36Sopenharmony_ci .name = "Geovision GV-800(S) (master)", 275062306a36Sopenharmony_ci .video_inputs = 4, 275162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 275262306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 275362306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 275462306a36Sopenharmony_ci .svhs = NO_SVHS, 275562306a36Sopenharmony_ci .gpiomask = 0xf107f, 275662306a36Sopenharmony_ci .no_gpioirq = 1, 275762306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 275862306a36Sopenharmony_ci .pll = PLL_28, 275962306a36Sopenharmony_ci .no_msp34xx = 1, 276062306a36Sopenharmony_ci .no_tda7432 = 1, 276162306a36Sopenharmony_ci .muxsel_hook = gv800s_muxsel, 276262306a36Sopenharmony_ci }, 276362306a36Sopenharmony_ci [BTTV_BOARD_GEOVISION_GV800S_SL] = { 276462306a36Sopenharmony_ci /* Bruno Christo <bchristo@inf.ufsm.br> 276562306a36Sopenharmony_ci * 276662306a36Sopenharmony_ci * GeoVision GV-800(S) has 4 Conexant Fusion 878A: 276762306a36Sopenharmony_ci * 1 audio input per BT878A = 4 audio inputs 276862306a36Sopenharmony_ci * 4 video inputs per BT878A = 16 video inputs 276962306a36Sopenharmony_ci * The 3 other BT878A chips are "slave" chips of the GV-800(S) 277062306a36Sopenharmony_ci * and should use this card type. 277162306a36Sopenharmony_ci * The audio input is not working yet. 277262306a36Sopenharmony_ci */ 277362306a36Sopenharmony_ci .name = "Geovision GV-800(S) (slave)", 277462306a36Sopenharmony_ci .video_inputs = 4, 277562306a36Sopenharmony_ci /* .audio_inputs= 1, */ 277662306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 277762306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 277862306a36Sopenharmony_ci .svhs = NO_SVHS, 277962306a36Sopenharmony_ci .gpiomask = 0x00, 278062306a36Sopenharmony_ci .no_gpioirq = 1, 278162306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 278262306a36Sopenharmony_ci .pll = PLL_28, 278362306a36Sopenharmony_ci .no_msp34xx = 1, 278462306a36Sopenharmony_ci .no_tda7432 = 1, 278562306a36Sopenharmony_ci .muxsel_hook = gv800s_muxsel, 278662306a36Sopenharmony_ci }, 278762306a36Sopenharmony_ci [BTTV_BOARD_PV183] = { 278862306a36Sopenharmony_ci .name = "ProVideo PV183", /* 0x9f */ 278962306a36Sopenharmony_ci .video_inputs = 2, 279062306a36Sopenharmony_ci /* .audio_inputs= 0, */ 279162306a36Sopenharmony_ci .svhs = NO_SVHS, 279262306a36Sopenharmony_ci .gpiomask = 0, 279362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3), 279462306a36Sopenharmony_ci .gpiomux = { 0 }, 279562306a36Sopenharmony_ci .no_msp34xx = 1, 279662306a36Sopenharmony_ci .pll = PLL_28, 279762306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 279862306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 279962306a36Sopenharmony_ci }, 280062306a36Sopenharmony_ci /* ---- card 0xa0---------------------------------- */ 280162306a36Sopenharmony_ci [BTTV_BOARD_TVT_TD3116] = { 280262306a36Sopenharmony_ci .name = "Tongwei Video Technology TD-3116", 280362306a36Sopenharmony_ci .video_inputs = 16, 280462306a36Sopenharmony_ci .gpiomask = 0xc00ff, 280562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), 280662306a36Sopenharmony_ci .muxsel_hook = td3116_muxsel, 280762306a36Sopenharmony_ci .svhs = NO_SVHS, 280862306a36Sopenharmony_ci .pll = PLL_28, 280962306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 281062306a36Sopenharmony_ci }, 281162306a36Sopenharmony_ci [BTTV_BOARD_APOSONIC_WDVR] = { 281262306a36Sopenharmony_ci .name = "Aposonic W-DVR", 281362306a36Sopenharmony_ci .video_inputs = 4, 281462306a36Sopenharmony_ci .svhs = NO_SVHS, 281562306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 281662306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 281762306a36Sopenharmony_ci }, 281862306a36Sopenharmony_ci [BTTV_BOARD_ADLINK_MPG24] = { 281962306a36Sopenharmony_ci /* Adlink MPG24 */ 282062306a36Sopenharmony_ci .name = "Adlink MPG24", 282162306a36Sopenharmony_ci .video_inputs = 1, 282262306a36Sopenharmony_ci /* .audio_inputs= 1, */ 282362306a36Sopenharmony_ci .svhs = NO_SVHS, 282462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 2, 2, 2), 282562306a36Sopenharmony_ci .tuner_type = UNSET, 282662306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 282762306a36Sopenharmony_ci .pll = PLL_28, 282862306a36Sopenharmony_ci }, 282962306a36Sopenharmony_ci [BTTV_BOARD_BT848_CAP_14] = { 283062306a36Sopenharmony_ci .name = "Bt848 Capture 14MHz", 283162306a36Sopenharmony_ci .video_inputs = 4, 283262306a36Sopenharmony_ci .svhs = 2, 283362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 283462306a36Sopenharmony_ci .pll = PLL_14, 283562306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 283662306a36Sopenharmony_ci }, 283762306a36Sopenharmony_ci [BTTV_BOARD_CYBERVISION_CV06] = { 283862306a36Sopenharmony_ci .name = "CyberVision CV06 (SV)", 283962306a36Sopenharmony_ci .video_inputs = 4, 284062306a36Sopenharmony_ci /* .audio_inputs= 0, */ 284162306a36Sopenharmony_ci .svhs = NO_SVHS, 284262306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 0), 284362306a36Sopenharmony_ci .pll = PLL_28, 284462306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 284562306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 284662306a36Sopenharmony_ci }, 284762306a36Sopenharmony_ci [BTTV_BOARD_KWORLD_VSTREAM_XPERT] = { 284862306a36Sopenharmony_ci /* Pojar George <geoubuntu@gmail.com> */ 284962306a36Sopenharmony_ci .name = "Kworld V-Stream Xpert TV PVR878", 285062306a36Sopenharmony_ci .video_inputs = 3, 285162306a36Sopenharmony_ci /* .audio_inputs= 1, */ 285262306a36Sopenharmony_ci .svhs = 2, 285362306a36Sopenharmony_ci .gpiomask = 0x001c0007, 285462306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3, 1, 1), 285562306a36Sopenharmony_ci .gpiomux = { 0, 1, 2, 2 }, 285662306a36Sopenharmony_ci .gpiomute = 3, 285762306a36Sopenharmony_ci .pll = PLL_28, 285862306a36Sopenharmony_ci .tuner_type = TUNER_TENA_9533_DI, 285962306a36Sopenharmony_ci .tuner_addr = ADDR_UNSET, 286062306a36Sopenharmony_ci .has_remote = 1, 286162306a36Sopenharmony_ci .has_radio = 1, 286262306a36Sopenharmony_ci }, 286362306a36Sopenharmony_ci /* ---- card 0xa6---------------------------------- */ 286462306a36Sopenharmony_ci [BTTV_BOARD_PCI_8604PW] = { 286562306a36Sopenharmony_ci /* PCI-8604PW with special unlock sequence */ 286662306a36Sopenharmony_ci .name = "PCI-8604PW", 286762306a36Sopenharmony_ci .video_inputs = 2, 286862306a36Sopenharmony_ci /* .audio_inputs= 0, */ 286962306a36Sopenharmony_ci .svhs = NO_SVHS, 287062306a36Sopenharmony_ci /* The second input is available on CN4, if populated. 287162306a36Sopenharmony_ci * The other 5x2 header (CN2?) connects to the same inputs 287262306a36Sopenharmony_ci * as the on-board BNCs */ 287362306a36Sopenharmony_ci .muxsel = MUXSEL(2, 3), 287462306a36Sopenharmony_ci .tuner_type = TUNER_ABSENT, 287562306a36Sopenharmony_ci .no_msp34xx = 1, 287662306a36Sopenharmony_ci .no_tda7432 = 1, 287762306a36Sopenharmony_ci .pll = PLL_35, 287862306a36Sopenharmony_ci }, 287962306a36Sopenharmony_ci}; 288062306a36Sopenharmony_ci 288162306a36Sopenharmony_cistatic const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards); 288262306a36Sopenharmony_ci 288362306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 288462306a36Sopenharmony_ci 288562306a36Sopenharmony_cistatic unsigned char eeprom_data[256]; 288662306a36Sopenharmony_ci 288762306a36Sopenharmony_ci/* 288862306a36Sopenharmony_ci * identify card 288962306a36Sopenharmony_ci */ 289062306a36Sopenharmony_civoid bttv_idcard(struct bttv *btv) 289162306a36Sopenharmony_ci{ 289262306a36Sopenharmony_ci unsigned int gpiobits; 289362306a36Sopenharmony_ci int i,type; 289462306a36Sopenharmony_ci 289562306a36Sopenharmony_ci /* read PCI subsystem ID */ 289662306a36Sopenharmony_ci btv->cardid = btv->c.pci->subsystem_device << 16; 289762306a36Sopenharmony_ci btv->cardid |= btv->c.pci->subsystem_vendor; 289862306a36Sopenharmony_ci 289962306a36Sopenharmony_ci if (0 != btv->cardid && 0xffffffff != btv->cardid) { 290062306a36Sopenharmony_ci /* look for the card */ 290162306a36Sopenharmony_ci for (type = -1, i = 0; cards[i].id != 0; i++) 290262306a36Sopenharmony_ci if (cards[i].id == btv->cardid) 290362306a36Sopenharmony_ci type = i; 290462306a36Sopenharmony_ci 290562306a36Sopenharmony_ci if (type != -1) { 290662306a36Sopenharmony_ci /* found it */ 290762306a36Sopenharmony_ci pr_info("%d: detected: %s [card=%d], PCI subsystem ID is %04x:%04x\n", 290862306a36Sopenharmony_ci btv->c.nr, cards[type].name, cards[type].cardnr, 290962306a36Sopenharmony_ci btv->cardid & 0xffff, 291062306a36Sopenharmony_ci (btv->cardid >> 16) & 0xffff); 291162306a36Sopenharmony_ci btv->c.type = cards[type].cardnr; 291262306a36Sopenharmony_ci } else { 291362306a36Sopenharmony_ci /* 404 */ 291462306a36Sopenharmony_ci pr_info("%d: subsystem: %04x:%04x (UNKNOWN)\n", 291562306a36Sopenharmony_ci btv->c.nr, btv->cardid & 0xffff, 291662306a36Sopenharmony_ci (btv->cardid >> 16) & 0xffff); 291762306a36Sopenharmony_ci pr_debug("please mail id, board name and the correct card= insmod option to linux-media@vger.kernel.org\n"); 291862306a36Sopenharmony_ci } 291962306a36Sopenharmony_ci } 292062306a36Sopenharmony_ci 292162306a36Sopenharmony_ci /* let the user override the autodetected type */ 292262306a36Sopenharmony_ci if (card[btv->c.nr] < bttv_num_tvcards) 292362306a36Sopenharmony_ci btv->c.type=card[btv->c.nr]; 292462306a36Sopenharmony_ci 292562306a36Sopenharmony_ci /* print which card config we are using */ 292662306a36Sopenharmony_ci pr_info("%d: using: %s [card=%d,%s]\n", 292762306a36Sopenharmony_ci btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type, 292862306a36Sopenharmony_ci card[btv->c.nr] < bttv_num_tvcards 292962306a36Sopenharmony_ci ? "insmod option" : "autodetected"); 293062306a36Sopenharmony_ci 293162306a36Sopenharmony_ci /* overwrite gpio stuff ?? */ 293262306a36Sopenharmony_ci if (UNSET == audioall && UNSET == audiomux[0]) 293362306a36Sopenharmony_ci return; 293462306a36Sopenharmony_ci 293562306a36Sopenharmony_ci if (UNSET != audiomux[0]) { 293662306a36Sopenharmony_ci gpiobits = 0; 293762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) { 293862306a36Sopenharmony_ci bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i]; 293962306a36Sopenharmony_ci gpiobits |= audiomux[i]; 294062306a36Sopenharmony_ci } 294162306a36Sopenharmony_ci } else { 294262306a36Sopenharmony_ci gpiobits = audioall; 294362306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) { 294462306a36Sopenharmony_ci bttv_tvcards[btv->c.type].gpiomux[i] = audioall; 294562306a36Sopenharmony_ci } 294662306a36Sopenharmony_ci } 294762306a36Sopenharmony_ci bttv_tvcards[btv->c.type].gpiomask = (UNSET != gpiomask) ? gpiomask : gpiobits; 294862306a36Sopenharmony_ci pr_info("%d: gpio config override: mask=0x%x, mux=", 294962306a36Sopenharmony_ci btv->c.nr, bttv_tvcards[btv->c.type].gpiomask); 295062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) { 295162306a36Sopenharmony_ci pr_cont("%s0x%x", 295262306a36Sopenharmony_ci i ? "," : "", bttv_tvcards[btv->c.type].gpiomux[i]); 295362306a36Sopenharmony_ci } 295462306a36Sopenharmony_ci pr_cont("\n"); 295562306a36Sopenharmony_ci} 295662306a36Sopenharmony_ci 295762306a36Sopenharmony_ci/* 295862306a36Sopenharmony_ci * (most) board specific initialisations goes here 295962306a36Sopenharmony_ci */ 296062306a36Sopenharmony_ci 296162306a36Sopenharmony_ci/* Some Modular Technology cards have an eeprom, but no subsystem ID */ 296262306a36Sopenharmony_cistatic void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256]) 296362306a36Sopenharmony_ci{ 296462306a36Sopenharmony_ci int type = -1; 296562306a36Sopenharmony_ci 296662306a36Sopenharmony_ci if (0 == strncmp(eeprom_data,"GET MM20xPCTV",13)) 296762306a36Sopenharmony_ci type = BTTV_BOARD_MODTEC_205; 296862306a36Sopenharmony_ci else if (0 == strncmp(eeprom_data+20,"Picolo",7)) 296962306a36Sopenharmony_ci type = BTTV_BOARD_EURESYS_PICOLO; 297062306a36Sopenharmony_ci else if (eeprom_data[0] == 0x84 && eeprom_data[2]== 0) 297162306a36Sopenharmony_ci type = BTTV_BOARD_HAUPPAUGE; /* old bt848 */ 297262306a36Sopenharmony_ci 297362306a36Sopenharmony_ci if (-1 != type) { 297462306a36Sopenharmony_ci btv->c.type = type; 297562306a36Sopenharmony_ci pr_info("%d: detected by eeprom: %s [card=%d]\n", 297662306a36Sopenharmony_ci btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type); 297762306a36Sopenharmony_ci } 297862306a36Sopenharmony_ci} 297962306a36Sopenharmony_ci 298062306a36Sopenharmony_cistatic void flyvideo_gpio(struct bttv *btv) 298162306a36Sopenharmony_ci{ 298262306a36Sopenharmony_ci int gpio, has_remote, has_radio, is_capture_only; 298362306a36Sopenharmony_ci int is_lr90, has_tda9820_tda9821; 298462306a36Sopenharmony_ci int tuner_type = UNSET, ttype; 298562306a36Sopenharmony_ci 298662306a36Sopenharmony_ci gpio_inout(0xffffff, 0); 298762306a36Sopenharmony_ci udelay(8); /* without this we would see the 0x1800 mask */ 298862306a36Sopenharmony_ci gpio = gpio_read(); 298962306a36Sopenharmony_ci /* FIXME: must restore OUR_EN ??? */ 299062306a36Sopenharmony_ci 299162306a36Sopenharmony_ci /* all cards provide GPIO info, some have an additional eeprom 299262306a36Sopenharmony_ci * LR50: GPIO coding can be found lower right CP1 .. CP9 299362306a36Sopenharmony_ci * CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1. 299462306a36Sopenharmony_ci * GPIO14-12: n.c. 299562306a36Sopenharmony_ci * LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878) 299662306a36Sopenharmony_ci 299762306a36Sopenharmony_ci * lowest 3 bytes are remote control codes (no handshake needed) 299862306a36Sopenharmony_ci * xxxFFF: No remote control chip soldered 299962306a36Sopenharmony_ci * xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered 300062306a36Sopenharmony_ci * Note: Some bits are Audio_Mask ! 300162306a36Sopenharmony_ci */ 300262306a36Sopenharmony_ci ttype = (gpio & 0x0f0000) >> 16; 300362306a36Sopenharmony_ci switch (ttype) { 300462306a36Sopenharmony_ci case 0x0: 300562306a36Sopenharmony_ci tuner_type = 2; /* NTSC, e.g. TPI8NSR11P */ 300662306a36Sopenharmony_ci break; 300762306a36Sopenharmony_ci case 0x2: 300862306a36Sopenharmony_ci tuner_type = 39; /* LG NTSC (newer TAPC series) TAPC-H701P */ 300962306a36Sopenharmony_ci break; 301062306a36Sopenharmony_ci case 0x4: 301162306a36Sopenharmony_ci tuner_type = 5; /* Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216 */ 301262306a36Sopenharmony_ci break; 301362306a36Sopenharmony_ci case 0x6: 301462306a36Sopenharmony_ci tuner_type = 37; /* LG PAL (newer TAPC series) TAPC-G702P */ 301562306a36Sopenharmony_ci break; 301662306a36Sopenharmony_ci case 0xC: 301762306a36Sopenharmony_ci tuner_type = 3; /* Philips SECAM(+PAL) FQ1216ME or FI1216MF */ 301862306a36Sopenharmony_ci break; 301962306a36Sopenharmony_ci default: 302062306a36Sopenharmony_ci pr_info("%d: FlyVideo_gpio: unknown tuner type\n", btv->c.nr); 302162306a36Sopenharmony_ci break; 302262306a36Sopenharmony_ci } 302362306a36Sopenharmony_ci 302462306a36Sopenharmony_ci has_remote = gpio & 0x800000; 302562306a36Sopenharmony_ci has_radio = gpio & 0x400000; 302662306a36Sopenharmony_ci /* unknown 0x200000; 302762306a36Sopenharmony_ci * unknown2 0x100000; */ 302862306a36Sopenharmony_ci is_capture_only = !(gpio & 0x008000); /* GPIO15 */ 302962306a36Sopenharmony_ci has_tda9820_tda9821 = !(gpio & 0x004000); 303062306a36Sopenharmony_ci is_lr90 = !(gpio & 0x002000); /* else LR26/LR50 (LR38/LR51 f. capture only) */ 303162306a36Sopenharmony_ci /* 303262306a36Sopenharmony_ci * gpio & 0x001000 output bit for audio routing */ 303362306a36Sopenharmony_ci 303462306a36Sopenharmony_ci if (is_capture_only) 303562306a36Sopenharmony_ci tuner_type = TUNER_ABSENT; /* No tuner present */ 303662306a36Sopenharmony_ci 303762306a36Sopenharmony_ci pr_info("%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n", 303862306a36Sopenharmony_ci btv->c.nr, has_radio ? "yes" : "no", 303962306a36Sopenharmony_ci has_remote ? "yes" : "no", tuner_type, gpio); 304062306a36Sopenharmony_ci pr_info("%d: FlyVideo LR90=%s tda9821/tda9820=%s capture_only=%s\n", 304162306a36Sopenharmony_ci btv->c.nr, is_lr90 ? "yes" : "no", 304262306a36Sopenharmony_ci has_tda9820_tda9821 ? "yes" : "no", 304362306a36Sopenharmony_ci is_capture_only ? "yes" : "no"); 304462306a36Sopenharmony_ci 304562306a36Sopenharmony_ci if (tuner_type != UNSET) /* only set if known tuner autodetected, else let insmod option through */ 304662306a36Sopenharmony_ci btv->tuner_type = tuner_type; 304762306a36Sopenharmony_ci btv->has_radio = has_radio; 304862306a36Sopenharmony_ci 304962306a36Sopenharmony_ci /* LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c80 305062306a36Sopenharmony_ci * LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c00 305162306a36Sopenharmony_ci * Audio options: from tuner, from tda9821/tda9821(mono,stereo,sap), from tda9874, ext., mute */ 305262306a36Sopenharmony_ci if (has_tda9820_tda9821) 305362306a36Sopenharmony_ci btv->audio_mode_gpio = lt9415_audio; 305462306a36Sopenharmony_ci /* todo: if(has_tda9874) btv->audio_mode_gpio = fv2000s_audio; */ 305562306a36Sopenharmony_ci} 305662306a36Sopenharmony_ci 305762306a36Sopenharmony_cistatic int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1, 305862306a36Sopenharmony_ci 14,2,17,1, 4,1,4,3, 1,2,16,1, 4,4,4,4 }; 305962306a36Sopenharmony_cistatic int miro_fmtuner[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 306062306a36Sopenharmony_ci 1,1,1,1, 1,1,1,0, 0,0,0,0, 0,1,0,0 }; 306162306a36Sopenharmony_ci 306262306a36Sopenharmony_cistatic void miro_pinnacle_gpio(struct bttv *btv) 306362306a36Sopenharmony_ci{ 306462306a36Sopenharmony_ci int id,msp,gpio; 306562306a36Sopenharmony_ci char *info; 306662306a36Sopenharmony_ci 306762306a36Sopenharmony_ci gpio_inout(0xffffff, 0); 306862306a36Sopenharmony_ci gpio = gpio_read(); 306962306a36Sopenharmony_ci id = ((gpio>>10) & 63) -1; 307062306a36Sopenharmony_ci msp = bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx"); 307162306a36Sopenharmony_ci if (id < 32) { 307262306a36Sopenharmony_ci btv->tuner_type = miro_tunermap[id]; 307362306a36Sopenharmony_ci if (0 == (gpio & 0x20)) { 307462306a36Sopenharmony_ci btv->has_radio = 1; 307562306a36Sopenharmony_ci if (!miro_fmtuner[id]) { 307662306a36Sopenharmony_ci btv->has_tea575x = 1; 307762306a36Sopenharmony_ci btv->tea_gpio.wren = 6; 307862306a36Sopenharmony_ci btv->tea_gpio.most = 7; 307962306a36Sopenharmony_ci btv->tea_gpio.clk = 8; 308062306a36Sopenharmony_ci btv->tea_gpio.data = 9; 308162306a36Sopenharmony_ci tea575x_init(btv); 308262306a36Sopenharmony_ci } 308362306a36Sopenharmony_ci } else { 308462306a36Sopenharmony_ci btv->has_radio = 0; 308562306a36Sopenharmony_ci } 308662306a36Sopenharmony_ci if (-1 != msp) { 308762306a36Sopenharmony_ci if (btv->c.type == BTTV_BOARD_MIRO) 308862306a36Sopenharmony_ci btv->c.type = BTTV_BOARD_MIROPRO; 308962306a36Sopenharmony_ci if (btv->c.type == BTTV_BOARD_PINNACLE) 309062306a36Sopenharmony_ci btv->c.type = BTTV_BOARD_PINNACLEPRO; 309162306a36Sopenharmony_ci } 309262306a36Sopenharmony_ci pr_info("%d: miro: id=%d tuner=%d radio=%s stereo=%s\n", 309362306a36Sopenharmony_ci btv->c.nr, id+1, btv->tuner_type, 309462306a36Sopenharmony_ci !btv->has_radio ? "no" : 309562306a36Sopenharmony_ci (btv->has_tea575x ? "tea575x" : "fmtuner"), 309662306a36Sopenharmony_ci (-1 == msp) ? "no" : "yes"); 309762306a36Sopenharmony_ci } else { 309862306a36Sopenharmony_ci /* new cards with microtune tuner */ 309962306a36Sopenharmony_ci id = 63 - id; 310062306a36Sopenharmony_ci btv->has_radio = 0; 310162306a36Sopenharmony_ci switch (id) { 310262306a36Sopenharmony_ci case 1: 310362306a36Sopenharmony_ci info = "PAL / mono"; 310462306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_INTERCARRIER; 310562306a36Sopenharmony_ci break; 310662306a36Sopenharmony_ci case 2: 310762306a36Sopenharmony_ci info = "PAL+SECAM / stereo"; 310862306a36Sopenharmony_ci btv->has_radio = 1; 310962306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_QSS; 311062306a36Sopenharmony_ci break; 311162306a36Sopenharmony_ci case 3: 311262306a36Sopenharmony_ci info = "NTSC / stereo"; 311362306a36Sopenharmony_ci btv->has_radio = 1; 311462306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_QSS; 311562306a36Sopenharmony_ci break; 311662306a36Sopenharmony_ci case 4: 311762306a36Sopenharmony_ci info = "PAL+SECAM / mono"; 311862306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_QSS; 311962306a36Sopenharmony_ci break; 312062306a36Sopenharmony_ci case 5: 312162306a36Sopenharmony_ci info = "NTSC / mono"; 312262306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_INTERCARRIER; 312362306a36Sopenharmony_ci break; 312462306a36Sopenharmony_ci case 6: 312562306a36Sopenharmony_ci info = "NTSC / stereo"; 312662306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_INTERCARRIER; 312762306a36Sopenharmony_ci break; 312862306a36Sopenharmony_ci case 7: 312962306a36Sopenharmony_ci info = "PAL / stereo"; 313062306a36Sopenharmony_ci btv->tda9887_conf = TDA9887_INTERCARRIER; 313162306a36Sopenharmony_ci break; 313262306a36Sopenharmony_ci default: 313362306a36Sopenharmony_ci info = "oops: unknown card"; 313462306a36Sopenharmony_ci break; 313562306a36Sopenharmony_ci } 313662306a36Sopenharmony_ci if (-1 != msp) 313762306a36Sopenharmony_ci btv->c.type = BTTV_BOARD_PINNACLEPRO; 313862306a36Sopenharmony_ci pr_info("%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n", 313962306a36Sopenharmony_ci btv->c.nr, id, info, btv->has_radio ? "yes" : "no"); 314062306a36Sopenharmony_ci btv->tuner_type = TUNER_MT2032; 314162306a36Sopenharmony_ci } 314262306a36Sopenharmony_ci} 314362306a36Sopenharmony_ci 314462306a36Sopenharmony_ci/* GPIO21 L: Buffer aktiv, H: Buffer inaktiv */ 314562306a36Sopenharmony_ci#define LM1882_SYNC_DRIVE 0x200000L 314662306a36Sopenharmony_ci 314762306a36Sopenharmony_cistatic void init_ids_eagle(struct bttv *btv) 314862306a36Sopenharmony_ci{ 314962306a36Sopenharmony_ci gpio_inout(0xffffff,0xFFFF37); 315062306a36Sopenharmony_ci gpio_write(0x200020); 315162306a36Sopenharmony_ci 315262306a36Sopenharmony_ci /* flash strobe inverter ?! */ 315362306a36Sopenharmony_ci gpio_write(0x200024); 315462306a36Sopenharmony_ci 315562306a36Sopenharmony_ci /* switch sync drive off */ 315662306a36Sopenharmony_ci gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE); 315762306a36Sopenharmony_ci 315862306a36Sopenharmony_ci /* set BT848 muxel to 2 */ 315962306a36Sopenharmony_ci btaor((2)<<5, ~(2<<5), BT848_IFORM); 316062306a36Sopenharmony_ci} 316162306a36Sopenharmony_ci 316262306a36Sopenharmony_ci/* Muxsel helper for the IDS Eagle. 316362306a36Sopenharmony_ci * the eagles does not use the standard muxsel-bits but 316462306a36Sopenharmony_ci * has its own multiplexer */ 316562306a36Sopenharmony_cistatic void eagle_muxsel(struct bttv *btv, unsigned int input) 316662306a36Sopenharmony_ci{ 316762306a36Sopenharmony_ci gpio_bits(3, input & 3); 316862306a36Sopenharmony_ci 316962306a36Sopenharmony_ci /* composite */ 317062306a36Sopenharmony_ci /* set chroma ADC to sleep */ 317162306a36Sopenharmony_ci btor(BT848_ADC_C_SLEEP, BT848_ADC); 317262306a36Sopenharmony_ci /* set to composite video */ 317362306a36Sopenharmony_ci btand(~BT848_CONTROL_COMP, BT848_E_CONTROL); 317462306a36Sopenharmony_ci btand(~BT848_CONTROL_COMP, BT848_O_CONTROL); 317562306a36Sopenharmony_ci 317662306a36Sopenharmony_ci /* switch sync drive off */ 317762306a36Sopenharmony_ci gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE); 317862306a36Sopenharmony_ci} 317962306a36Sopenharmony_ci 318062306a36Sopenharmony_cistatic void gvc1100_muxsel(struct bttv *btv, unsigned int input) 318162306a36Sopenharmony_ci{ 318262306a36Sopenharmony_ci static const int masks[] = {0x30, 0x01, 0x12, 0x23}; 318362306a36Sopenharmony_ci gpio_write(masks[input%4]); 318462306a36Sopenharmony_ci} 318562306a36Sopenharmony_ci 318662306a36Sopenharmony_ci/* LMLBT4x initialization - to allow access to GPIO bits for sensors input and 318762306a36Sopenharmony_ci alarms output 318862306a36Sopenharmony_ci 318962306a36Sopenharmony_ci GPIObit | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 319062306a36Sopenharmony_ci assignment | TI | O3|INx| O2| O1|IN4|IN3|IN2|IN1| | | 319162306a36Sopenharmony_ci 319262306a36Sopenharmony_ci IN - sensor inputs, INx - sensor inputs and TI XORed together 319362306a36Sopenharmony_ci O1,O2,O3 - alarm outputs (relays) 319462306a36Sopenharmony_ci 319562306a36Sopenharmony_ci OUT ENABLE 1 1 0 . 1 1 0 0 . 0 0 0 0 = 0x6C0 319662306a36Sopenharmony_ci 319762306a36Sopenharmony_ci*/ 319862306a36Sopenharmony_ci 319962306a36Sopenharmony_cistatic void init_lmlbt4x(struct bttv *btv) 320062306a36Sopenharmony_ci{ 320162306a36Sopenharmony_ci pr_debug("LMLBT4x init\n"); 320262306a36Sopenharmony_ci btwrite(0x000000, BT848_GPIO_REG_INP); 320362306a36Sopenharmony_ci gpio_inout(0xffffff, 0x0006C0); 320462306a36Sopenharmony_ci gpio_write(0x000000); 320562306a36Sopenharmony_ci} 320662306a36Sopenharmony_ci 320762306a36Sopenharmony_cistatic void sigmaSQ_muxsel(struct bttv *btv, unsigned int input) 320862306a36Sopenharmony_ci{ 320962306a36Sopenharmony_ci unsigned int inmux = input % 8; 321062306a36Sopenharmony_ci gpio_inout( 0xf, 0xf ); 321162306a36Sopenharmony_ci gpio_bits( 0xf, inmux ); 321262306a36Sopenharmony_ci} 321362306a36Sopenharmony_ci 321462306a36Sopenharmony_cistatic void sigmaSLC_muxsel(struct bttv *btv, unsigned int input) 321562306a36Sopenharmony_ci{ 321662306a36Sopenharmony_ci unsigned int inmux = input % 4; 321762306a36Sopenharmony_ci gpio_inout( 3<<9, 3<<9 ); 321862306a36Sopenharmony_ci gpio_bits( 3<<9, inmux<<9 ); 321962306a36Sopenharmony_ci} 322062306a36Sopenharmony_ci 322162306a36Sopenharmony_cistatic void geovision_muxsel(struct bttv *btv, unsigned int input) 322262306a36Sopenharmony_ci{ 322362306a36Sopenharmony_ci unsigned int inmux = input % 16; 322462306a36Sopenharmony_ci gpio_inout(0xf, 0xf); 322562306a36Sopenharmony_ci gpio_bits(0xf, inmux); 322662306a36Sopenharmony_ci} 322762306a36Sopenharmony_ci 322862306a36Sopenharmony_ci/* 322962306a36Sopenharmony_ci * The TD3116 has 2 74HC4051 muxes wired to the MUX0 input of a bt878. 323062306a36Sopenharmony_ci * The first 74HC4051 has the lower 8 inputs, the second one the higher 8. 323162306a36Sopenharmony_ci * The muxes are controlled via a 74HC373 latch which is connected to 323262306a36Sopenharmony_ci * GPIOs 0-7. GPIO 18 is connected to the LE signal of the latch. 323362306a36Sopenharmony_ci * Q0 of the latch is connected to the Enable (~E) input of the first 323462306a36Sopenharmony_ci * 74HC4051. Q1 - Q3 are connected to S0 - S2 of the same 74HC4051. 323562306a36Sopenharmony_ci * Q4 - Q7 are connected to the second 74HC4051 in the same way. 323662306a36Sopenharmony_ci */ 323762306a36Sopenharmony_ci 323862306a36Sopenharmony_cistatic void td3116_latch_value(struct bttv *btv, u32 value) 323962306a36Sopenharmony_ci{ 324062306a36Sopenharmony_ci gpio_bits((1<<18) | 0xff, value); 324162306a36Sopenharmony_ci gpio_bits((1<<18) | 0xff, (1<<18) | value); 324262306a36Sopenharmony_ci udelay(1); 324362306a36Sopenharmony_ci gpio_bits((1<<18) | 0xff, value); 324462306a36Sopenharmony_ci} 324562306a36Sopenharmony_ci 324662306a36Sopenharmony_cistatic void td3116_muxsel(struct bttv *btv, unsigned int input) 324762306a36Sopenharmony_ci{ 324862306a36Sopenharmony_ci u32 value; 324962306a36Sopenharmony_ci u32 highbit; 325062306a36Sopenharmony_ci 325162306a36Sopenharmony_ci highbit = (input & 0x8) >> 3 ; 325262306a36Sopenharmony_ci 325362306a36Sopenharmony_ci /* Disable outputs and set value in the mux */ 325462306a36Sopenharmony_ci value = 0x11; /* Disable outputs */ 325562306a36Sopenharmony_ci value |= ((input & 0x7) << 1) << (4 * highbit); 325662306a36Sopenharmony_ci td3116_latch_value(btv, value); 325762306a36Sopenharmony_ci 325862306a36Sopenharmony_ci /* Enable the correct output */ 325962306a36Sopenharmony_ci value &= ~0x11; 326062306a36Sopenharmony_ci value |= ((highbit ^ 0x1) << 4) | highbit; 326162306a36Sopenharmony_ci td3116_latch_value(btv, value); 326262306a36Sopenharmony_ci} 326362306a36Sopenharmony_ci 326462306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 326562306a36Sopenharmony_ci 326662306a36Sopenharmony_cistatic void bttv_reset_audio(struct bttv *btv) 326762306a36Sopenharmony_ci{ 326862306a36Sopenharmony_ci /* 326962306a36Sopenharmony_ci * BT878A has a audio-reset register. 327062306a36Sopenharmony_ci * 1. This register is an audio reset function but it is in 327162306a36Sopenharmony_ci * function-0 (video capture) address space. 327262306a36Sopenharmony_ci * 2. It is enough to do this once per power-up of the card. 327362306a36Sopenharmony_ci * 3. There is a typo in the Conexant doc -- it is not at 327462306a36Sopenharmony_ci * 0x5B, but at 0x058. (B is an odd-number, obviously a typo!). 327562306a36Sopenharmony_ci * --//Shrikumar 030609 327662306a36Sopenharmony_ci */ 327762306a36Sopenharmony_ci if (btv->id != 878) 327862306a36Sopenharmony_ci return; 327962306a36Sopenharmony_ci 328062306a36Sopenharmony_ci if (bttv_debug) 328162306a36Sopenharmony_ci pr_debug("%d: BT878A ARESET\n", btv->c.nr); 328262306a36Sopenharmony_ci btwrite((1<<7), 0x058); 328362306a36Sopenharmony_ci udelay(10); 328462306a36Sopenharmony_ci btwrite( 0, 0x058); 328562306a36Sopenharmony_ci} 328662306a36Sopenharmony_ci 328762306a36Sopenharmony_ci/* initialization part one -- before registering i2c bus */ 328862306a36Sopenharmony_civoid bttv_init_card1(struct bttv *btv) 328962306a36Sopenharmony_ci{ 329062306a36Sopenharmony_ci switch (btv->c.type) { 329162306a36Sopenharmony_ci case BTTV_BOARD_HAUPPAUGE: 329262306a36Sopenharmony_ci case BTTV_BOARD_HAUPPAUGE878: 329362306a36Sopenharmony_ci boot_msp34xx(btv,5); 329462306a36Sopenharmony_ci break; 329562306a36Sopenharmony_ci case BTTV_BOARD_VOODOOTV_200: 329662306a36Sopenharmony_ci case BTTV_BOARD_VOODOOTV_FM: 329762306a36Sopenharmony_ci boot_msp34xx(btv,20); 329862306a36Sopenharmony_ci break; 329962306a36Sopenharmony_ci case BTTV_BOARD_AVERMEDIA98: 330062306a36Sopenharmony_ci boot_msp34xx(btv,11); 330162306a36Sopenharmony_ci break; 330262306a36Sopenharmony_ci case BTTV_BOARD_HAUPPAUGEPVR: 330362306a36Sopenharmony_ci pvr_boot(btv); 330462306a36Sopenharmony_ci break; 330562306a36Sopenharmony_ci case BTTV_BOARD_TWINHAN_DST: 330662306a36Sopenharmony_ci case BTTV_BOARD_AVDVBT_771: 330762306a36Sopenharmony_ci case BTTV_BOARD_PINNACLESAT: 330862306a36Sopenharmony_ci btv->use_i2c_hw = 1; 330962306a36Sopenharmony_ci break; 331062306a36Sopenharmony_ci case BTTV_BOARD_ADLINK_RTV24: 331162306a36Sopenharmony_ci init_RTV24( btv ); 331262306a36Sopenharmony_ci break; 331362306a36Sopenharmony_ci case BTTV_BOARD_PCI_8604PW: 331462306a36Sopenharmony_ci init_PCI8604PW(btv); 331562306a36Sopenharmony_ci break; 331662306a36Sopenharmony_ci 331762306a36Sopenharmony_ci } 331862306a36Sopenharmony_ci if (!bttv_tvcards[btv->c.type].has_dvb) 331962306a36Sopenharmony_ci bttv_reset_audio(btv); 332062306a36Sopenharmony_ci} 332162306a36Sopenharmony_ci 332262306a36Sopenharmony_ci/* initialization part two -- after registering i2c bus */ 332362306a36Sopenharmony_civoid bttv_init_card2(struct bttv *btv) 332462306a36Sopenharmony_ci{ 332562306a36Sopenharmony_ci btv->tuner_type = UNSET; 332662306a36Sopenharmony_ci 332762306a36Sopenharmony_ci if (BTTV_BOARD_UNKNOWN == btv->c.type) { 332862306a36Sopenharmony_ci bttv_readee(btv,eeprom_data,0xa0); 332962306a36Sopenharmony_ci identify_by_eeprom(btv,eeprom_data); 333062306a36Sopenharmony_ci } 333162306a36Sopenharmony_ci 333262306a36Sopenharmony_ci switch (btv->c.type) { 333362306a36Sopenharmony_ci case BTTV_BOARD_MIRO: 333462306a36Sopenharmony_ci case BTTV_BOARD_MIROPRO: 333562306a36Sopenharmony_ci case BTTV_BOARD_PINNACLE: 333662306a36Sopenharmony_ci case BTTV_BOARD_PINNACLEPRO: 333762306a36Sopenharmony_ci /* miro/pinnacle */ 333862306a36Sopenharmony_ci miro_pinnacle_gpio(btv); 333962306a36Sopenharmony_ci break; 334062306a36Sopenharmony_ci case BTTV_BOARD_FLYVIDEO_98: 334162306a36Sopenharmony_ci case BTTV_BOARD_MAXI: 334262306a36Sopenharmony_ci case BTTV_BOARD_LIFE_FLYKIT: 334362306a36Sopenharmony_ci case BTTV_BOARD_FLYVIDEO: 334462306a36Sopenharmony_ci case BTTV_BOARD_TYPHOON_TVIEW: 334562306a36Sopenharmony_ci case BTTV_BOARD_CHRONOS_VS2: 334662306a36Sopenharmony_ci case BTTV_BOARD_FLYVIDEO_98FM: 334762306a36Sopenharmony_ci case BTTV_BOARD_FLYVIDEO2000: 334862306a36Sopenharmony_ci case BTTV_BOARD_FLYVIDEO98EZ: 334962306a36Sopenharmony_ci case BTTV_BOARD_CONFERENCETV: 335062306a36Sopenharmony_ci case BTTV_BOARD_LIFETEC_9415: 335162306a36Sopenharmony_ci flyvideo_gpio(btv); 335262306a36Sopenharmony_ci break; 335362306a36Sopenharmony_ci case BTTV_BOARD_HAUPPAUGE: 335462306a36Sopenharmony_ci case BTTV_BOARD_HAUPPAUGE878: 335562306a36Sopenharmony_ci case BTTV_BOARD_HAUPPAUGEPVR: 335662306a36Sopenharmony_ci /* pick up some config infos from the eeprom */ 335762306a36Sopenharmony_ci bttv_readee(btv,eeprom_data,0xa0); 335862306a36Sopenharmony_ci hauppauge_eeprom(btv); 335962306a36Sopenharmony_ci break; 336062306a36Sopenharmony_ci case BTTV_BOARD_AVERMEDIA98: 336162306a36Sopenharmony_ci case BTTV_BOARD_AVPHONE98: 336262306a36Sopenharmony_ci bttv_readee(btv,eeprom_data,0xa0); 336362306a36Sopenharmony_ci avermedia_eeprom(btv); 336462306a36Sopenharmony_ci break; 336562306a36Sopenharmony_ci case BTTV_BOARD_PXC200: 336662306a36Sopenharmony_ci init_PXC200(btv); 336762306a36Sopenharmony_ci break; 336862306a36Sopenharmony_ci case BTTV_BOARD_PICOLO_TETRA_CHIP: 336962306a36Sopenharmony_ci picolo_tetra_init(btv); 337062306a36Sopenharmony_ci break; 337162306a36Sopenharmony_ci case BTTV_BOARD_VHX: 337262306a36Sopenharmony_ci btv->has_radio = 1; 337362306a36Sopenharmony_ci btv->has_tea575x = 1; 337462306a36Sopenharmony_ci btv->tea_gpio.wren = 5; 337562306a36Sopenharmony_ci btv->tea_gpio.most = 6; 337662306a36Sopenharmony_ci btv->tea_gpio.clk = 3; 337762306a36Sopenharmony_ci btv->tea_gpio.data = 4; 337862306a36Sopenharmony_ci tea575x_init(btv); 337962306a36Sopenharmony_ci break; 338062306a36Sopenharmony_ci case BTTV_BOARD_VOBIS_BOOSTAR: 338162306a36Sopenharmony_ci case BTTV_BOARD_TERRATV: 338262306a36Sopenharmony_ci terratec_active_radio_upgrade(btv); 338362306a36Sopenharmony_ci break; 338462306a36Sopenharmony_ci case BTTV_BOARD_MAGICTVIEW061: 338562306a36Sopenharmony_ci if (btv->cardid == 0x3002144f) { 338662306a36Sopenharmony_ci btv->has_radio=1; 338762306a36Sopenharmony_ci pr_info("%d: radio detected by subsystem id (CPH05x)\n", 338862306a36Sopenharmony_ci btv->c.nr); 338962306a36Sopenharmony_ci } 339062306a36Sopenharmony_ci break; 339162306a36Sopenharmony_ci case BTTV_BOARD_STB2: 339262306a36Sopenharmony_ci if (btv->cardid == 0x3060121a) { 339362306a36Sopenharmony_ci /* Fix up entry for 3DFX VoodooTV 100, 339462306a36Sopenharmony_ci which is an OEM STB card variant. */ 339562306a36Sopenharmony_ci btv->has_radio=0; 339662306a36Sopenharmony_ci btv->tuner_type=TUNER_TEMIC_NTSC; 339762306a36Sopenharmony_ci } 339862306a36Sopenharmony_ci break; 339962306a36Sopenharmony_ci case BTTV_BOARD_OSPREY1x0: 340062306a36Sopenharmony_ci case BTTV_BOARD_OSPREY1x0_848: 340162306a36Sopenharmony_ci case BTTV_BOARD_OSPREY101_848: 340262306a36Sopenharmony_ci case BTTV_BOARD_OSPREY1x1: 340362306a36Sopenharmony_ci case BTTV_BOARD_OSPREY1x1_SVID: 340462306a36Sopenharmony_ci case BTTV_BOARD_OSPREY2xx: 340562306a36Sopenharmony_ci case BTTV_BOARD_OSPREY2x0_SVID: 340662306a36Sopenharmony_ci case BTTV_BOARD_OSPREY2x0: 340762306a36Sopenharmony_ci case BTTV_BOARD_OSPREY440: 340862306a36Sopenharmony_ci case BTTV_BOARD_OSPREY500: 340962306a36Sopenharmony_ci case BTTV_BOARD_OSPREY540: 341062306a36Sopenharmony_ci case BTTV_BOARD_OSPREY2000: 341162306a36Sopenharmony_ci bttv_readee(btv,eeprom_data,0xa0); 341262306a36Sopenharmony_ci osprey_eeprom(btv, eeprom_data); 341362306a36Sopenharmony_ci break; 341462306a36Sopenharmony_ci case BTTV_BOARD_IDS_EAGLE: 341562306a36Sopenharmony_ci init_ids_eagle(btv); 341662306a36Sopenharmony_ci break; 341762306a36Sopenharmony_ci case BTTV_BOARD_MODTEC_205: 341862306a36Sopenharmony_ci bttv_readee(btv,eeprom_data,0xa0); 341962306a36Sopenharmony_ci modtec_eeprom(btv); 342062306a36Sopenharmony_ci break; 342162306a36Sopenharmony_ci case BTTV_BOARD_LMLBT4: 342262306a36Sopenharmony_ci init_lmlbt4x(btv); 342362306a36Sopenharmony_ci break; 342462306a36Sopenharmony_ci case BTTV_BOARD_TIBET_CS16: 342562306a36Sopenharmony_ci tibetCS16_init(btv); 342662306a36Sopenharmony_ci break; 342762306a36Sopenharmony_ci case BTTV_BOARD_KODICOM_4400R: 342862306a36Sopenharmony_ci kodicom4400r_init(btv); 342962306a36Sopenharmony_ci break; 343062306a36Sopenharmony_ci case BTTV_BOARD_GEOVISION_GV800S: 343162306a36Sopenharmony_ci gv800s_init(btv); 343262306a36Sopenharmony_ci break; 343362306a36Sopenharmony_ci } 343462306a36Sopenharmony_ci 343562306a36Sopenharmony_ci /* pll configuration */ 343662306a36Sopenharmony_ci if (!(btv->id==848 && btv->revision==0x11)) { 343762306a36Sopenharmony_ci /* defaults from card list */ 343862306a36Sopenharmony_ci if (PLL_28 == bttv_tvcards[btv->c.type].pll) { 343962306a36Sopenharmony_ci btv->pll.pll_ifreq=28636363; 344062306a36Sopenharmony_ci btv->pll.pll_crystal=BT848_IFORM_XT0; 344162306a36Sopenharmony_ci } 344262306a36Sopenharmony_ci if (PLL_35 == bttv_tvcards[btv->c.type].pll) { 344362306a36Sopenharmony_ci btv->pll.pll_ifreq=35468950; 344462306a36Sopenharmony_ci btv->pll.pll_crystal=BT848_IFORM_XT1; 344562306a36Sopenharmony_ci } 344662306a36Sopenharmony_ci if (PLL_14 == bttv_tvcards[btv->c.type].pll) { 344762306a36Sopenharmony_ci btv->pll.pll_ifreq = 14318181; 344862306a36Sopenharmony_ci btv->pll.pll_crystal = BT848_IFORM_XT0; 344962306a36Sopenharmony_ci } 345062306a36Sopenharmony_ci /* insmod options can override */ 345162306a36Sopenharmony_ci switch (pll[btv->c.nr]) { 345262306a36Sopenharmony_ci case 0: /* none */ 345362306a36Sopenharmony_ci btv->pll.pll_crystal = 0; 345462306a36Sopenharmony_ci btv->pll.pll_ifreq = 0; 345562306a36Sopenharmony_ci btv->pll.pll_ofreq = 0; 345662306a36Sopenharmony_ci break; 345762306a36Sopenharmony_ci case 1: /* 28 MHz */ 345862306a36Sopenharmony_ci case 28: 345962306a36Sopenharmony_ci btv->pll.pll_ifreq = 28636363; 346062306a36Sopenharmony_ci btv->pll.pll_ofreq = 0; 346162306a36Sopenharmony_ci btv->pll.pll_crystal = BT848_IFORM_XT0; 346262306a36Sopenharmony_ci break; 346362306a36Sopenharmony_ci case 2: /* 35 MHz */ 346462306a36Sopenharmony_ci case 35: 346562306a36Sopenharmony_ci btv->pll.pll_ifreq = 35468950; 346662306a36Sopenharmony_ci btv->pll.pll_ofreq = 0; 346762306a36Sopenharmony_ci btv->pll.pll_crystal = BT848_IFORM_XT1; 346862306a36Sopenharmony_ci break; 346962306a36Sopenharmony_ci case 3: /* 14 MHz */ 347062306a36Sopenharmony_ci case 14: 347162306a36Sopenharmony_ci btv->pll.pll_ifreq = 14318181; 347262306a36Sopenharmony_ci btv->pll.pll_ofreq = 0; 347362306a36Sopenharmony_ci btv->pll.pll_crystal = BT848_IFORM_XT0; 347462306a36Sopenharmony_ci break; 347562306a36Sopenharmony_ci } 347662306a36Sopenharmony_ci } 347762306a36Sopenharmony_ci btv->pll.pll_current = -1; 347862306a36Sopenharmony_ci 347962306a36Sopenharmony_ci /* tuner configuration (from card list / autodetect / insmod option) */ 348062306a36Sopenharmony_ci if (UNSET != bttv_tvcards[btv->c.type].tuner_type) 348162306a36Sopenharmony_ci if (UNSET == btv->tuner_type) 348262306a36Sopenharmony_ci btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type; 348362306a36Sopenharmony_ci if (UNSET != tuner[btv->c.nr]) 348462306a36Sopenharmony_ci btv->tuner_type = tuner[btv->c.nr]; 348562306a36Sopenharmony_ci 348662306a36Sopenharmony_ci if (btv->tuner_type == TUNER_ABSENT) 348762306a36Sopenharmony_ci pr_info("%d: tuner absent\n", btv->c.nr); 348862306a36Sopenharmony_ci else if (btv->tuner_type == UNSET) 348962306a36Sopenharmony_ci pr_warn("%d: tuner type unset\n", btv->c.nr); 349062306a36Sopenharmony_ci else 349162306a36Sopenharmony_ci pr_info("%d: tuner type=%d\n", btv->c.nr, btv->tuner_type); 349262306a36Sopenharmony_ci 349362306a36Sopenharmony_ci if (autoload != UNSET) { 349462306a36Sopenharmony_ci pr_warn("%d: the autoload option is obsolete\n", btv->c.nr); 349562306a36Sopenharmony_ci pr_warn("%d: use option msp3400, tda7432 or tvaudio to override which audio module should be used\n", 349662306a36Sopenharmony_ci btv->c.nr); 349762306a36Sopenharmony_ci } 349862306a36Sopenharmony_ci 349962306a36Sopenharmony_ci if (UNSET == btv->tuner_type) 350062306a36Sopenharmony_ci btv->tuner_type = TUNER_ABSENT; 350162306a36Sopenharmony_ci 350262306a36Sopenharmony_ci btv->dig = bttv_tvcards[btv->c.type].has_dig_in ? 350362306a36Sopenharmony_ci bttv_tvcards[btv->c.type].video_inputs - 1 : UNSET; 350462306a36Sopenharmony_ci btv->svhs = bttv_tvcards[btv->c.type].svhs == NO_SVHS ? 350562306a36Sopenharmony_ci UNSET : bttv_tvcards[btv->c.type].svhs; 350662306a36Sopenharmony_ci if (svhs[btv->c.nr] != UNSET) 350762306a36Sopenharmony_ci btv->svhs = svhs[btv->c.nr]; 350862306a36Sopenharmony_ci if (remote[btv->c.nr] != UNSET) 350962306a36Sopenharmony_ci btv->has_remote = remote[btv->c.nr]; 351062306a36Sopenharmony_ci 351162306a36Sopenharmony_ci if (bttv_tvcards[btv->c.type].has_radio) 351262306a36Sopenharmony_ci btv->has_radio = 1; 351362306a36Sopenharmony_ci if (bttv_tvcards[btv->c.type].has_remote) 351462306a36Sopenharmony_ci btv->has_remote = 1; 351562306a36Sopenharmony_ci if (!bttv_tvcards[btv->c.type].no_gpioirq) 351662306a36Sopenharmony_ci btv->gpioirq = 1; 351762306a36Sopenharmony_ci if (bttv_tvcards[btv->c.type].volume_gpio) 351862306a36Sopenharmony_ci btv->volume_gpio = bttv_tvcards[btv->c.type].volume_gpio; 351962306a36Sopenharmony_ci if (bttv_tvcards[btv->c.type].audio_mode_gpio) 352062306a36Sopenharmony_ci btv->audio_mode_gpio = bttv_tvcards[btv->c.type].audio_mode_gpio; 352162306a36Sopenharmony_ci 352262306a36Sopenharmony_ci if (btv->tuner_type == TUNER_ABSENT) 352362306a36Sopenharmony_ci return; /* no tuner or related drivers to load */ 352462306a36Sopenharmony_ci 352562306a36Sopenharmony_ci if (btv->has_saa6588 || saa6588[btv->c.nr]) { 352662306a36Sopenharmony_ci /* Probe for RDS receiver chip */ 352762306a36Sopenharmony_ci static const unsigned short addrs[] = { 352862306a36Sopenharmony_ci 0x20 >> 1, 352962306a36Sopenharmony_ci 0x22 >> 1, 353062306a36Sopenharmony_ci I2C_CLIENT_END 353162306a36Sopenharmony_ci }; 353262306a36Sopenharmony_ci struct v4l2_subdev *sd; 353362306a36Sopenharmony_ci 353462306a36Sopenharmony_ci sd = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 353562306a36Sopenharmony_ci &btv->c.i2c_adap, "saa6588", 0, addrs); 353662306a36Sopenharmony_ci btv->has_saa6588 = (sd != NULL); 353762306a36Sopenharmony_ci } 353862306a36Sopenharmony_ci 353962306a36Sopenharmony_ci /* try to detect audio/fader chips */ 354062306a36Sopenharmony_ci 354162306a36Sopenharmony_ci /* First check if the user specified the audio chip via a module 354262306a36Sopenharmony_ci option. */ 354362306a36Sopenharmony_ci 354462306a36Sopenharmony_ci switch (audiodev[btv->c.nr]) { 354562306a36Sopenharmony_ci case -1: 354662306a36Sopenharmony_ci return; /* do not load any audio module */ 354762306a36Sopenharmony_ci 354862306a36Sopenharmony_ci case 0: /* autodetect */ 354962306a36Sopenharmony_ci break; 355062306a36Sopenharmony_ci 355162306a36Sopenharmony_ci case 1: { 355262306a36Sopenharmony_ci /* The user specified that we should probe for msp3400 */ 355362306a36Sopenharmony_ci static const unsigned short addrs[] = { 355462306a36Sopenharmony_ci I2C_ADDR_MSP3400 >> 1, 355562306a36Sopenharmony_ci I2C_ADDR_MSP3400_ALT >> 1, 355662306a36Sopenharmony_ci I2C_CLIENT_END 355762306a36Sopenharmony_ci }; 355862306a36Sopenharmony_ci 355962306a36Sopenharmony_ci btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 356062306a36Sopenharmony_ci &btv->c.i2c_adap, "msp3400", 0, addrs); 356162306a36Sopenharmony_ci if (btv->sd_msp34xx) 356262306a36Sopenharmony_ci return; 356362306a36Sopenharmony_ci goto no_audio; 356462306a36Sopenharmony_ci } 356562306a36Sopenharmony_ci 356662306a36Sopenharmony_ci case 2: { 356762306a36Sopenharmony_ci /* The user specified that we should probe for tda7432 */ 356862306a36Sopenharmony_ci static const unsigned short addrs[] = { 356962306a36Sopenharmony_ci I2C_ADDR_TDA7432 >> 1, 357062306a36Sopenharmony_ci I2C_CLIENT_END 357162306a36Sopenharmony_ci }; 357262306a36Sopenharmony_ci 357362306a36Sopenharmony_ci if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 357462306a36Sopenharmony_ci &btv->c.i2c_adap, "tda7432", 0, addrs)) 357562306a36Sopenharmony_ci return; 357662306a36Sopenharmony_ci goto no_audio; 357762306a36Sopenharmony_ci } 357862306a36Sopenharmony_ci 357962306a36Sopenharmony_ci case 3: { 358062306a36Sopenharmony_ci /* The user specified that we should probe for tvaudio */ 358162306a36Sopenharmony_ci btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 358262306a36Sopenharmony_ci &btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs()); 358362306a36Sopenharmony_ci if (btv->sd_tvaudio) 358462306a36Sopenharmony_ci return; 358562306a36Sopenharmony_ci goto no_audio; 358662306a36Sopenharmony_ci } 358762306a36Sopenharmony_ci 358862306a36Sopenharmony_ci default: 358962306a36Sopenharmony_ci pr_warn("%d: unknown audiodev value!\n", btv->c.nr); 359062306a36Sopenharmony_ci return; 359162306a36Sopenharmony_ci } 359262306a36Sopenharmony_ci 359362306a36Sopenharmony_ci /* There were no overrides, so now we try to discover this through the 359462306a36Sopenharmony_ci card definition */ 359562306a36Sopenharmony_ci 359662306a36Sopenharmony_ci /* probe for msp3400 first: this driver can detect whether or not 359762306a36Sopenharmony_ci it really is a msp3400, so it will return NULL when the device 359862306a36Sopenharmony_ci found is really something else (e.g. a tea6300). */ 359962306a36Sopenharmony_ci if (!bttv_tvcards[btv->c.type].no_msp34xx) { 360062306a36Sopenharmony_ci btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 360162306a36Sopenharmony_ci &btv->c.i2c_adap, "msp3400", 360262306a36Sopenharmony_ci 0, I2C_ADDRS(I2C_ADDR_MSP3400 >> 1)); 360362306a36Sopenharmony_ci } else if (bttv_tvcards[btv->c.type].msp34xx_alt) { 360462306a36Sopenharmony_ci btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 360562306a36Sopenharmony_ci &btv->c.i2c_adap, "msp3400", 360662306a36Sopenharmony_ci 0, I2C_ADDRS(I2C_ADDR_MSP3400_ALT >> 1)); 360762306a36Sopenharmony_ci } 360862306a36Sopenharmony_ci 360962306a36Sopenharmony_ci /* If we found a msp34xx, then we're done. */ 361062306a36Sopenharmony_ci if (btv->sd_msp34xx) 361162306a36Sopenharmony_ci return; 361262306a36Sopenharmony_ci 361362306a36Sopenharmony_ci /* Now see if we can find one of the tvaudio devices. */ 361462306a36Sopenharmony_ci btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 361562306a36Sopenharmony_ci &btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs()); 361662306a36Sopenharmony_ci if (btv->sd_tvaudio) { 361762306a36Sopenharmony_ci /* There may be two tvaudio chips on the card, so try to 361862306a36Sopenharmony_ci find another. */ 361962306a36Sopenharmony_ci v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 362062306a36Sopenharmony_ci &btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs()); 362162306a36Sopenharmony_ci } 362262306a36Sopenharmony_ci 362362306a36Sopenharmony_ci /* it might also be a tda7432. */ 362462306a36Sopenharmony_ci if (!bttv_tvcards[btv->c.type].no_tda7432) { 362562306a36Sopenharmony_ci static const unsigned short addrs[] = { 362662306a36Sopenharmony_ci I2C_ADDR_TDA7432 >> 1, 362762306a36Sopenharmony_ci I2C_CLIENT_END 362862306a36Sopenharmony_ci }; 362962306a36Sopenharmony_ci 363062306a36Sopenharmony_ci btv->sd_tda7432 = v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 363162306a36Sopenharmony_ci &btv->c.i2c_adap, "tda7432", 0, addrs); 363262306a36Sopenharmony_ci if (btv->sd_tda7432) 363362306a36Sopenharmony_ci return; 363462306a36Sopenharmony_ci } 363562306a36Sopenharmony_ci if (btv->sd_tvaudio) 363662306a36Sopenharmony_ci return; 363762306a36Sopenharmony_ci 363862306a36Sopenharmony_cino_audio: 363962306a36Sopenharmony_ci pr_warn("%d: audio absent, no audio device found!\n", btv->c.nr); 364062306a36Sopenharmony_ci} 364162306a36Sopenharmony_ci 364262306a36Sopenharmony_ci 364362306a36Sopenharmony_ci/* initialize the tuner */ 364462306a36Sopenharmony_civoid bttv_init_tuner(struct bttv *btv) 364562306a36Sopenharmony_ci{ 364662306a36Sopenharmony_ci int addr = ADDR_UNSET; 364762306a36Sopenharmony_ci 364862306a36Sopenharmony_ci if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr) 364962306a36Sopenharmony_ci addr = bttv_tvcards[btv->c.type].tuner_addr; 365062306a36Sopenharmony_ci 365162306a36Sopenharmony_ci if (btv->tuner_type != TUNER_ABSENT) { 365262306a36Sopenharmony_ci struct tuner_setup tun_setup; 365362306a36Sopenharmony_ci 365462306a36Sopenharmony_ci /* Load tuner module before issuing tuner config call! */ 365562306a36Sopenharmony_ci if (btv->has_radio) 365662306a36Sopenharmony_ci v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 365762306a36Sopenharmony_ci &btv->c.i2c_adap, "tuner", 365862306a36Sopenharmony_ci 0, v4l2_i2c_tuner_addrs(ADDRS_RADIO)); 365962306a36Sopenharmony_ci v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 366062306a36Sopenharmony_ci &btv->c.i2c_adap, "tuner", 366162306a36Sopenharmony_ci 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); 366262306a36Sopenharmony_ci v4l2_i2c_new_subdev(&btv->c.v4l2_dev, 366362306a36Sopenharmony_ci &btv->c.i2c_adap, "tuner", 366462306a36Sopenharmony_ci 0, v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD)); 366562306a36Sopenharmony_ci 366662306a36Sopenharmony_ci tun_setup.mode_mask = T_ANALOG_TV; 366762306a36Sopenharmony_ci tun_setup.type = btv->tuner_type; 366862306a36Sopenharmony_ci tun_setup.addr = addr; 366962306a36Sopenharmony_ci 367062306a36Sopenharmony_ci if (btv->has_radio) 367162306a36Sopenharmony_ci tun_setup.mode_mask |= T_RADIO; 367262306a36Sopenharmony_ci 367362306a36Sopenharmony_ci bttv_call_all(btv, tuner, s_type_addr, &tun_setup); 367462306a36Sopenharmony_ci } 367562306a36Sopenharmony_ci 367662306a36Sopenharmony_ci if (btv->tda9887_conf) { 367762306a36Sopenharmony_ci struct v4l2_priv_tun_config tda9887_cfg; 367862306a36Sopenharmony_ci 367962306a36Sopenharmony_ci tda9887_cfg.tuner = TUNER_TDA9887; 368062306a36Sopenharmony_ci tda9887_cfg.priv = &btv->tda9887_conf; 368162306a36Sopenharmony_ci 368262306a36Sopenharmony_ci bttv_call_all(btv, tuner, s_config, &tda9887_cfg); 368362306a36Sopenharmony_ci } 368462306a36Sopenharmony_ci} 368562306a36Sopenharmony_ci 368662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 368762306a36Sopenharmony_ci 368862306a36Sopenharmony_cistatic void modtec_eeprom(struct bttv *btv) 368962306a36Sopenharmony_ci{ 369062306a36Sopenharmony_ci if( strncmp(&(eeprom_data[0x1e]),"Temic 4066 FY5",14) ==0) { 369162306a36Sopenharmony_ci btv->tuner_type=TUNER_TEMIC_4066FY5_PAL_I; 369262306a36Sopenharmony_ci pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n", 369362306a36Sopenharmony_ci btv->c.nr, &eeprom_data[0x1e]); 369462306a36Sopenharmony_ci } else if (strncmp(&(eeprom_data[0x1e]),"Alps TSBB5",10) ==0) { 369562306a36Sopenharmony_ci btv->tuner_type=TUNER_ALPS_TSBB5_PAL_I; 369662306a36Sopenharmony_ci pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n", 369762306a36Sopenharmony_ci btv->c.nr, &eeprom_data[0x1e]); 369862306a36Sopenharmony_ci } else if (strncmp(&(eeprom_data[0x1e]),"Philips FM1246",14) ==0) { 369962306a36Sopenharmony_ci btv->tuner_type=TUNER_PHILIPS_NTSC; 370062306a36Sopenharmony_ci pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n", 370162306a36Sopenharmony_ci btv->c.nr, &eeprom_data[0x1e]); 370262306a36Sopenharmony_ci } else { 370362306a36Sopenharmony_ci pr_info("%d: Modtec: Unknown TunerString: %s\n", 370462306a36Sopenharmony_ci btv->c.nr, &eeprom_data[0x1e]); 370562306a36Sopenharmony_ci } 370662306a36Sopenharmony_ci} 370762306a36Sopenharmony_ci 370862306a36Sopenharmony_cistatic void hauppauge_eeprom(struct bttv *btv) 370962306a36Sopenharmony_ci{ 371062306a36Sopenharmony_ci struct tveeprom tv; 371162306a36Sopenharmony_ci 371262306a36Sopenharmony_ci tveeprom_hauppauge_analog(&tv, eeprom_data); 371362306a36Sopenharmony_ci btv->tuner_type = tv.tuner_type; 371462306a36Sopenharmony_ci btv->has_radio = tv.has_radio; 371562306a36Sopenharmony_ci 371662306a36Sopenharmony_ci pr_info("%d: Hauppauge eeprom indicates model#%d\n", 371762306a36Sopenharmony_ci btv->c.nr, tv.model); 371862306a36Sopenharmony_ci 371962306a36Sopenharmony_ci /* 372062306a36Sopenharmony_ci * Some of the 878 boards have duplicate PCI IDs. Switch the board 372162306a36Sopenharmony_ci * type based on model #. 372262306a36Sopenharmony_ci */ 372362306a36Sopenharmony_ci if(tv.model == 64900) { 372462306a36Sopenharmony_ci pr_info("%d: Switching board type from %s to %s\n", 372562306a36Sopenharmony_ci btv->c.nr, 372662306a36Sopenharmony_ci bttv_tvcards[btv->c.type].name, 372762306a36Sopenharmony_ci bttv_tvcards[BTTV_BOARD_HAUPPAUGE_IMPACTVCB].name); 372862306a36Sopenharmony_ci btv->c.type = BTTV_BOARD_HAUPPAUGE_IMPACTVCB; 372962306a36Sopenharmony_ci } 373062306a36Sopenharmony_ci 373162306a36Sopenharmony_ci /* The 61334 needs the msp3410 to do the radio demod to get sound */ 373262306a36Sopenharmony_ci if (tv.model == 61334) 373362306a36Sopenharmony_ci btv->radio_uses_msp_demodulator = 1; 373462306a36Sopenharmony_ci} 373562306a36Sopenharmony_ci 373662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 373762306a36Sopenharmony_ci 373862306a36Sopenharmony_cistatic void bttv_tea575x_set_pins(struct snd_tea575x *tea, u8 pins) 373962306a36Sopenharmony_ci{ 374062306a36Sopenharmony_ci struct bttv *btv = tea->private_data; 374162306a36Sopenharmony_ci struct bttv_tea575x_gpio gpio = btv->tea_gpio; 374262306a36Sopenharmony_ci u16 val = 0; 374362306a36Sopenharmony_ci 374462306a36Sopenharmony_ci val |= (pins & TEA575X_DATA) ? (1 << gpio.data) : 0; 374562306a36Sopenharmony_ci val |= (pins & TEA575X_CLK) ? (1 << gpio.clk) : 0; 374662306a36Sopenharmony_ci val |= (pins & TEA575X_WREN) ? (1 << gpio.wren) : 0; 374762306a36Sopenharmony_ci 374862306a36Sopenharmony_ci gpio_bits((1 << gpio.data) | (1 << gpio.clk) | (1 << gpio.wren), val); 374962306a36Sopenharmony_ci if (btv->mbox_ior) { 375062306a36Sopenharmony_ci /* IOW and CSEL active */ 375162306a36Sopenharmony_ci gpio_bits(btv->mbox_iow | btv->mbox_csel, 0); 375262306a36Sopenharmony_ci udelay(5); 375362306a36Sopenharmony_ci /* all inactive */ 375462306a36Sopenharmony_ci gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel, 375562306a36Sopenharmony_ci btv->mbox_ior | btv->mbox_iow | btv->mbox_csel); 375662306a36Sopenharmony_ci } 375762306a36Sopenharmony_ci} 375862306a36Sopenharmony_ci 375962306a36Sopenharmony_cistatic u8 bttv_tea575x_get_pins(struct snd_tea575x *tea) 376062306a36Sopenharmony_ci{ 376162306a36Sopenharmony_ci struct bttv *btv = tea->private_data; 376262306a36Sopenharmony_ci struct bttv_tea575x_gpio gpio = btv->tea_gpio; 376362306a36Sopenharmony_ci u8 ret = 0; 376462306a36Sopenharmony_ci u16 val; 376562306a36Sopenharmony_ci 376662306a36Sopenharmony_ci if (btv->mbox_ior) { 376762306a36Sopenharmony_ci /* IOR and CSEL active */ 376862306a36Sopenharmony_ci gpio_bits(btv->mbox_ior | btv->mbox_csel, 0); 376962306a36Sopenharmony_ci udelay(5); 377062306a36Sopenharmony_ci } 377162306a36Sopenharmony_ci val = gpio_read(); 377262306a36Sopenharmony_ci if (btv->mbox_ior) { 377362306a36Sopenharmony_ci /* all inactive */ 377462306a36Sopenharmony_ci gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel, 377562306a36Sopenharmony_ci btv->mbox_ior | btv->mbox_iow | btv->mbox_csel); 377662306a36Sopenharmony_ci } 377762306a36Sopenharmony_ci 377862306a36Sopenharmony_ci if (val & (1 << gpio.data)) 377962306a36Sopenharmony_ci ret |= TEA575X_DATA; 378062306a36Sopenharmony_ci if (val & (1 << gpio.most)) 378162306a36Sopenharmony_ci ret |= TEA575X_MOST; 378262306a36Sopenharmony_ci 378362306a36Sopenharmony_ci return ret; 378462306a36Sopenharmony_ci} 378562306a36Sopenharmony_ci 378662306a36Sopenharmony_cistatic void bttv_tea575x_set_direction(struct snd_tea575x *tea, bool output) 378762306a36Sopenharmony_ci{ 378862306a36Sopenharmony_ci struct bttv *btv = tea->private_data; 378962306a36Sopenharmony_ci struct bttv_tea575x_gpio gpio = btv->tea_gpio; 379062306a36Sopenharmony_ci u32 mask = (1 << gpio.clk) | (1 << gpio.wren) | (1 << gpio.data) | 379162306a36Sopenharmony_ci (1 << gpio.most); 379262306a36Sopenharmony_ci 379362306a36Sopenharmony_ci if (output) 379462306a36Sopenharmony_ci gpio_inout(mask, (1 << gpio.data) | (1 << gpio.clk) | 379562306a36Sopenharmony_ci (1 << gpio.wren)); 379662306a36Sopenharmony_ci else 379762306a36Sopenharmony_ci gpio_inout(mask, (1 << gpio.clk) | (1 << gpio.wren)); 379862306a36Sopenharmony_ci} 379962306a36Sopenharmony_ci 380062306a36Sopenharmony_cistatic const struct snd_tea575x_ops bttv_tea_ops = { 380162306a36Sopenharmony_ci .set_pins = bttv_tea575x_set_pins, 380262306a36Sopenharmony_ci .get_pins = bttv_tea575x_get_pins, 380362306a36Sopenharmony_ci .set_direction = bttv_tea575x_set_direction, 380462306a36Sopenharmony_ci}; 380562306a36Sopenharmony_ci 380662306a36Sopenharmony_cistatic int tea575x_init(struct bttv *btv) 380762306a36Sopenharmony_ci{ 380862306a36Sopenharmony_ci btv->tea.private_data = btv; 380962306a36Sopenharmony_ci btv->tea.ops = &bttv_tea_ops; 381062306a36Sopenharmony_ci if (!snd_tea575x_hw_init(&btv->tea)) { 381162306a36Sopenharmony_ci pr_info("%d: detected TEA575x radio\n", btv->c.nr); 381262306a36Sopenharmony_ci btv->tea.mute = false; 381362306a36Sopenharmony_ci return 0; 381462306a36Sopenharmony_ci } 381562306a36Sopenharmony_ci 381662306a36Sopenharmony_ci btv->has_tea575x = 0; 381762306a36Sopenharmony_ci btv->has_radio = 0; 381862306a36Sopenharmony_ci 381962306a36Sopenharmony_ci return -ENODEV; 382062306a36Sopenharmony_ci} 382162306a36Sopenharmony_ci 382262306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 382362306a36Sopenharmony_ci 382462306a36Sopenharmony_cistatic int terratec_active_radio_upgrade(struct bttv *btv) 382562306a36Sopenharmony_ci{ 382662306a36Sopenharmony_ci btv->has_radio = 1; 382762306a36Sopenharmony_ci btv->has_tea575x = 1; 382862306a36Sopenharmony_ci btv->tea_gpio.wren = 4; 382962306a36Sopenharmony_ci btv->tea_gpio.most = 5; 383062306a36Sopenharmony_ci btv->tea_gpio.clk = 3; 383162306a36Sopenharmony_ci btv->tea_gpio.data = 2; 383262306a36Sopenharmony_ci 383362306a36Sopenharmony_ci btv->mbox_iow = 1 << 8; 383462306a36Sopenharmony_ci btv->mbox_ior = 1 << 9; 383562306a36Sopenharmony_ci btv->mbox_csel = 1 << 10; 383662306a36Sopenharmony_ci 383762306a36Sopenharmony_ci if (!tea575x_init(btv)) { 383862306a36Sopenharmony_ci pr_info("%d: Terratec Active Radio Upgrade found\n", btv->c.nr); 383962306a36Sopenharmony_ci btv->has_saa6588 = 1; 384062306a36Sopenharmony_ci } 384162306a36Sopenharmony_ci 384262306a36Sopenharmony_ci return 0; 384362306a36Sopenharmony_ci} 384462306a36Sopenharmony_ci 384562306a36Sopenharmony_ci 384662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 384762306a36Sopenharmony_ci 384862306a36Sopenharmony_ci/* 384962306a36Sopenharmony_ci * minimal bootstrap for the WinTV/PVR -- upload altera firmware. 385062306a36Sopenharmony_ci * 385162306a36Sopenharmony_ci * The hcwamc.rbf firmware file is on the Hauppauge driver CD. Have 385262306a36Sopenharmony_ci * a look at Pvr/pvr45xxx.EXE (self-extracting zip archive, can be 385362306a36Sopenharmony_ci * unpacked with unzip). 385462306a36Sopenharmony_ci */ 385562306a36Sopenharmony_ci#define PVR_GPIO_DELAY 10 385662306a36Sopenharmony_ci 385762306a36Sopenharmony_ci#define BTTV_ALT_DATA 0x000001 385862306a36Sopenharmony_ci#define BTTV_ALT_DCLK 0x100000 385962306a36Sopenharmony_ci#define BTTV_ALT_NCONFIG 0x800000 386062306a36Sopenharmony_ci 386162306a36Sopenharmony_cistatic int pvr_altera_load(struct bttv *btv, const u8 *micro, u32 microlen) 386262306a36Sopenharmony_ci{ 386362306a36Sopenharmony_ci u32 n; 386462306a36Sopenharmony_ci u8 bits; 386562306a36Sopenharmony_ci int i; 386662306a36Sopenharmony_ci 386762306a36Sopenharmony_ci gpio_inout(0xffffff,BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG); 386862306a36Sopenharmony_ci gpio_write(0); 386962306a36Sopenharmony_ci udelay(PVR_GPIO_DELAY); 387062306a36Sopenharmony_ci 387162306a36Sopenharmony_ci gpio_write(BTTV_ALT_NCONFIG); 387262306a36Sopenharmony_ci udelay(PVR_GPIO_DELAY); 387362306a36Sopenharmony_ci 387462306a36Sopenharmony_ci for (n = 0; n < microlen; n++) { 387562306a36Sopenharmony_ci bits = micro[n]; 387662306a36Sopenharmony_ci for (i = 0 ; i < 8 ; i++) { 387762306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DCLK,0); 387862306a36Sopenharmony_ci if (bits & 0x01) 387962306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DATA,BTTV_ALT_DATA); 388062306a36Sopenharmony_ci else 388162306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DATA,0); 388262306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK); 388362306a36Sopenharmony_ci bits >>= 1; 388462306a36Sopenharmony_ci } 388562306a36Sopenharmony_ci } 388662306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DCLK,0); 388762306a36Sopenharmony_ci udelay(PVR_GPIO_DELAY); 388862306a36Sopenharmony_ci 388962306a36Sopenharmony_ci /* begin Altera init loop (Not necessary,but doesn't hurt) */ 389062306a36Sopenharmony_ci for (i = 0 ; i < 30 ; i++) { 389162306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DCLK,0); 389262306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK); 389362306a36Sopenharmony_ci } 389462306a36Sopenharmony_ci gpio_bits(BTTV_ALT_DCLK,0); 389562306a36Sopenharmony_ci return 0; 389662306a36Sopenharmony_ci} 389762306a36Sopenharmony_ci 389862306a36Sopenharmony_cistatic int pvr_boot(struct bttv *btv) 389962306a36Sopenharmony_ci{ 390062306a36Sopenharmony_ci const struct firmware *fw_entry; 390162306a36Sopenharmony_ci int rc; 390262306a36Sopenharmony_ci 390362306a36Sopenharmony_ci rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev); 390462306a36Sopenharmony_ci if (rc != 0) { 390562306a36Sopenharmony_ci pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr); 390662306a36Sopenharmony_ci return rc; 390762306a36Sopenharmony_ci } 390862306a36Sopenharmony_ci rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size); 390962306a36Sopenharmony_ci pr_info("%d: altera firmware upload %s\n", 391062306a36Sopenharmony_ci btv->c.nr, (rc < 0) ? "failed" : "ok"); 391162306a36Sopenharmony_ci release_firmware(fw_entry); 391262306a36Sopenharmony_ci return rc; 391362306a36Sopenharmony_ci} 391462306a36Sopenharmony_ci 391562306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 391662306a36Sopenharmony_ci/* some osprey specific stuff */ 391762306a36Sopenharmony_ci 391862306a36Sopenharmony_cistatic void osprey_eeprom(struct bttv *btv, const u8 ee[256]) 391962306a36Sopenharmony_ci{ 392062306a36Sopenharmony_ci int i; 392162306a36Sopenharmony_ci u32 serial = 0; 392262306a36Sopenharmony_ci int cardid = -1; 392362306a36Sopenharmony_ci 392462306a36Sopenharmony_ci /* This code will never actually get called in this case.... */ 392562306a36Sopenharmony_ci if (btv->c.type == BTTV_BOARD_UNKNOWN) { 392662306a36Sopenharmony_ci /* this might be an antique... check for MMAC label in eeprom */ 392762306a36Sopenharmony_ci if (!strncmp(ee, "MMAC", 4)) { 392862306a36Sopenharmony_ci u8 checksum = 0; 392962306a36Sopenharmony_ci for (i = 0; i < 21; i++) 393062306a36Sopenharmony_ci checksum += ee[i]; 393162306a36Sopenharmony_ci if (checksum != ee[21]) 393262306a36Sopenharmony_ci return; 393362306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY1x0_848; 393462306a36Sopenharmony_ci for (i = 12; i < 21; i++) { 393562306a36Sopenharmony_ci serial *= 10; 393662306a36Sopenharmony_ci serial += ee[i] - '0'; 393762306a36Sopenharmony_ci } 393862306a36Sopenharmony_ci } 393962306a36Sopenharmony_ci } else { 394062306a36Sopenharmony_ci unsigned short type; 394162306a36Sopenharmony_ci 394262306a36Sopenharmony_ci for (i = 4 * 16; i < 8 * 16; i += 16) { 394362306a36Sopenharmony_ci u16 checksum = (__force u16)ip_compute_csum(ee + i, 16); 394462306a36Sopenharmony_ci 394562306a36Sopenharmony_ci if ((checksum & 0xff) + (checksum >> 8) == 0xff) 394662306a36Sopenharmony_ci break; 394762306a36Sopenharmony_ci } 394862306a36Sopenharmony_ci if (i >= 8*16) 394962306a36Sopenharmony_ci return; 395062306a36Sopenharmony_ci ee += i; 395162306a36Sopenharmony_ci 395262306a36Sopenharmony_ci /* found a valid descriptor */ 395362306a36Sopenharmony_ci type = get_unaligned_be16((__be16 *)(ee+4)); 395462306a36Sopenharmony_ci 395562306a36Sopenharmony_ci switch(type) { 395662306a36Sopenharmony_ci /* 848 based */ 395762306a36Sopenharmony_ci case 0x0004: 395862306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY1x0_848; 395962306a36Sopenharmony_ci break; 396062306a36Sopenharmony_ci case 0x0005: 396162306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY101_848; 396262306a36Sopenharmony_ci break; 396362306a36Sopenharmony_ci 396462306a36Sopenharmony_ci /* 878 based */ 396562306a36Sopenharmony_ci case 0x0012: 396662306a36Sopenharmony_ci case 0x0013: 396762306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY1x0; 396862306a36Sopenharmony_ci break; 396962306a36Sopenharmony_ci case 0x0014: 397062306a36Sopenharmony_ci case 0x0015: 397162306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY1x1; 397262306a36Sopenharmony_ci break; 397362306a36Sopenharmony_ci case 0x0016: 397462306a36Sopenharmony_ci case 0x0017: 397562306a36Sopenharmony_ci case 0x0020: 397662306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY1x1_SVID; 397762306a36Sopenharmony_ci break; 397862306a36Sopenharmony_ci case 0x0018: 397962306a36Sopenharmony_ci case 0x0019: 398062306a36Sopenharmony_ci case 0x001E: 398162306a36Sopenharmony_ci case 0x001F: 398262306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY2xx; 398362306a36Sopenharmony_ci break; 398462306a36Sopenharmony_ci case 0x001A: 398562306a36Sopenharmony_ci case 0x001B: 398662306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY2x0_SVID; 398762306a36Sopenharmony_ci break; 398862306a36Sopenharmony_ci case 0x0040: 398962306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY500; 399062306a36Sopenharmony_ci break; 399162306a36Sopenharmony_ci case 0x0050: 399262306a36Sopenharmony_ci case 0x0056: 399362306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY540; 399462306a36Sopenharmony_ci /* bttv_osprey_540_init(btv); */ 399562306a36Sopenharmony_ci break; 399662306a36Sopenharmony_ci case 0x0060: 399762306a36Sopenharmony_ci case 0x0070: 399862306a36Sopenharmony_ci case 0x00A0: 399962306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY2x0; 400062306a36Sopenharmony_ci /* enable output on select control lines */ 400162306a36Sopenharmony_ci gpio_inout(0xffffff,0x000303); 400262306a36Sopenharmony_ci break; 400362306a36Sopenharmony_ci case 0x00D8: 400462306a36Sopenharmony_ci cardid = BTTV_BOARD_OSPREY440; 400562306a36Sopenharmony_ci break; 400662306a36Sopenharmony_ci default: 400762306a36Sopenharmony_ci /* unknown...leave generic, but get serial # */ 400862306a36Sopenharmony_ci pr_info("%d: osprey eeprom: unknown card type 0x%04x\n", 400962306a36Sopenharmony_ci btv->c.nr, type); 401062306a36Sopenharmony_ci break; 401162306a36Sopenharmony_ci } 401262306a36Sopenharmony_ci serial = get_unaligned_be32((__be32 *)(ee+6)); 401362306a36Sopenharmony_ci } 401462306a36Sopenharmony_ci 401562306a36Sopenharmony_ci pr_info("%d: osprey eeprom: card=%d '%s' serial=%u\n", 401662306a36Sopenharmony_ci btv->c.nr, cardid, 401762306a36Sopenharmony_ci cardid > 0 ? bttv_tvcards[cardid].name : "Unknown", serial); 401862306a36Sopenharmony_ci 401962306a36Sopenharmony_ci if (cardid<0 || btv->c.type == cardid) 402062306a36Sopenharmony_ci return; 402162306a36Sopenharmony_ci 402262306a36Sopenharmony_ci /* card type isn't set correctly */ 402362306a36Sopenharmony_ci if (card[btv->c.nr] < bttv_num_tvcards) { 402462306a36Sopenharmony_ci pr_warn("%d: osprey eeprom: Not overriding user specified card type\n", 402562306a36Sopenharmony_ci btv->c.nr); 402662306a36Sopenharmony_ci } else { 402762306a36Sopenharmony_ci pr_info("%d: osprey eeprom: Changing card type from %d to %d\n", 402862306a36Sopenharmony_ci btv->c.nr, btv->c.type, cardid); 402962306a36Sopenharmony_ci btv->c.type = cardid; 403062306a36Sopenharmony_ci } 403162306a36Sopenharmony_ci} 403262306a36Sopenharmony_ci 403362306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 403462306a36Sopenharmony_ci/* AVermedia specific stuff, from bktr_card.c */ 403562306a36Sopenharmony_ci 403662306a36Sopenharmony_cistatic int tuner_0_table[] = { 403762306a36Sopenharmony_ci TUNER_PHILIPS_NTSC, TUNER_PHILIPS_PAL /* PAL-BG*/, 403862306a36Sopenharmony_ci TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL /* PAL-I*/, 403962306a36Sopenharmony_ci TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL, 404062306a36Sopenharmony_ci TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM, 404162306a36Sopenharmony_ci TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL, 404262306a36Sopenharmony_ci TUNER_PHILIPS_FM1216ME_MK3 }; 404362306a36Sopenharmony_ci 404462306a36Sopenharmony_cistatic int tuner_1_table[] = { 404562306a36Sopenharmony_ci TUNER_TEMIC_NTSC, TUNER_TEMIC_PAL, 404662306a36Sopenharmony_ci TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, 404762306a36Sopenharmony_ci TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, 404862306a36Sopenharmony_ci TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, /* TUNER_TEMIC_SECAM */ 404962306a36Sopenharmony_ci TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL}; 405062306a36Sopenharmony_ci 405162306a36Sopenharmony_cistatic void avermedia_eeprom(struct bttv *btv) 405262306a36Sopenharmony_ci{ 405362306a36Sopenharmony_ci int tuner_make, tuner_tv_fm, tuner_format, tuner_type = 0; 405462306a36Sopenharmony_ci 405562306a36Sopenharmony_ci tuner_make = (eeprom_data[0x41] & 0x7); 405662306a36Sopenharmony_ci tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; 405762306a36Sopenharmony_ci tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; 405862306a36Sopenharmony_ci btv->has_remote = (eeprom_data[0x42] & 0x01); 405962306a36Sopenharmony_ci 406062306a36Sopenharmony_ci if (tuner_make == 0 || tuner_make == 2) 406162306a36Sopenharmony_ci if (tuner_format <= 0x0a) 406262306a36Sopenharmony_ci tuner_type = tuner_0_table[tuner_format]; 406362306a36Sopenharmony_ci if (tuner_make == 1) 406462306a36Sopenharmony_ci if (tuner_format <= 9) 406562306a36Sopenharmony_ci tuner_type = tuner_1_table[tuner_format]; 406662306a36Sopenharmony_ci 406762306a36Sopenharmony_ci if (tuner_make == 4) 406862306a36Sopenharmony_ci if (tuner_format == 0x09) 406962306a36Sopenharmony_ci tuner_type = TUNER_LG_NTSC_NEW_TAPC; /* TAPC-G702P */ 407062306a36Sopenharmony_ci 407162306a36Sopenharmony_ci pr_info("%d: Avermedia eeprom[0x%02x%02x]: tuner=", 407262306a36Sopenharmony_ci btv->c.nr, eeprom_data[0x41], eeprom_data[0x42]); 407362306a36Sopenharmony_ci if (tuner_type) { 407462306a36Sopenharmony_ci btv->tuner_type = tuner_type; 407562306a36Sopenharmony_ci pr_cont("%d", tuner_type); 407662306a36Sopenharmony_ci } else 407762306a36Sopenharmony_ci pr_cont("Unknown type"); 407862306a36Sopenharmony_ci pr_cont(" radio:%s remote control:%s\n", 407962306a36Sopenharmony_ci tuner_tv_fm ? "yes" : "no", 408062306a36Sopenharmony_ci btv->has_remote ? "yes" : "no"); 408162306a36Sopenharmony_ci} 408262306a36Sopenharmony_ci 408362306a36Sopenharmony_ci/* 408462306a36Sopenharmony_ci * For Voodoo TV/FM and Voodoo 200. These cards' tuners use a TDA9880 408562306a36Sopenharmony_ci * analog demod, which is not I2C controlled like the newer and more common 408662306a36Sopenharmony_ci * TDA9887 series. Instead it has two tri-state input pins, S0 and S1, 408762306a36Sopenharmony_ci * that control the IF for the video and audio. Apparently, bttv GPIO 408862306a36Sopenharmony_ci * 0x10000 is connected to S0. S0 low selects a 38.9 MHz VIF for B/G/D/K/I 408962306a36Sopenharmony_ci * (i.e., PAL) while high selects 45.75 MHz for M/N (i.e., NTSC). 409062306a36Sopenharmony_ci */ 409162306a36Sopenharmony_ciu32 bttv_tda9880_setnorm(struct bttv *btv, u32 gpiobits) 409262306a36Sopenharmony_ci{ 409362306a36Sopenharmony_ci 409462306a36Sopenharmony_ci if (btv->audio_input == TVAUDIO_INPUT_TUNER) { 409562306a36Sopenharmony_ci if (bttv_tvnorms[btv->tvnorm].v4l2_id & V4L2_STD_MN) 409662306a36Sopenharmony_ci gpiobits |= 0x10000; 409762306a36Sopenharmony_ci else 409862306a36Sopenharmony_ci gpiobits &= ~0x10000; 409962306a36Sopenharmony_ci } 410062306a36Sopenharmony_ci 410162306a36Sopenharmony_ci gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpiobits); 410262306a36Sopenharmony_ci return gpiobits; 410362306a36Sopenharmony_ci} 410462306a36Sopenharmony_ci 410562306a36Sopenharmony_ci 410662306a36Sopenharmony_ci/* 410762306a36Sopenharmony_ci * reset/enable the MSP on some Hauppauge cards 410862306a36Sopenharmony_ci * Thanks to Kyösti Mälkki (kmalkki@cc.hut.fi)! 410962306a36Sopenharmony_ci * 411062306a36Sopenharmony_ci * Hauppauge: pin 5 411162306a36Sopenharmony_ci * Voodoo: pin 20 411262306a36Sopenharmony_ci */ 411362306a36Sopenharmony_cistatic void boot_msp34xx(struct bttv *btv, int pin) 411462306a36Sopenharmony_ci{ 411562306a36Sopenharmony_ci int mask = (1 << pin); 411662306a36Sopenharmony_ci 411762306a36Sopenharmony_ci gpio_inout(mask,mask); 411862306a36Sopenharmony_ci gpio_bits(mask,0); 411962306a36Sopenharmony_ci mdelay(2); 412062306a36Sopenharmony_ci udelay(500); 412162306a36Sopenharmony_ci gpio_bits(mask,mask); 412262306a36Sopenharmony_ci 412362306a36Sopenharmony_ci if (bttv_gpio) 412462306a36Sopenharmony_ci bttv_gpio_tracking(btv,"msp34xx"); 412562306a36Sopenharmony_ci if (bttv_verbose) 412662306a36Sopenharmony_ci pr_info("%d: Hauppauge/Voodoo msp34xx: reset line init [%d]\n", 412762306a36Sopenharmony_ci btv->c.nr, pin); 412862306a36Sopenharmony_ci} 412962306a36Sopenharmony_ci 413062306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 413162306a36Sopenharmony_ci/* Imagenation L-Model PXC200 Framegrabber */ 413262306a36Sopenharmony_ci/* This is basically the same procedure as 413362306a36Sopenharmony_ci * used by Alessandro Rubini in his pxc200 413462306a36Sopenharmony_ci * driver, but using BTTV functions */ 413562306a36Sopenharmony_ci 413662306a36Sopenharmony_cistatic void init_PXC200(struct bttv *btv) 413762306a36Sopenharmony_ci{ 413862306a36Sopenharmony_ci static int vals[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d, 0x01, 0x02, 413962306a36Sopenharmony_ci 0x03, 0x04, 0x05, 0x06, 0x00 }; 414062306a36Sopenharmony_ci unsigned int i; 414162306a36Sopenharmony_ci int tmp; 414262306a36Sopenharmony_ci u32 val; 414362306a36Sopenharmony_ci 414462306a36Sopenharmony_ci /* Initialise GPIO-connected stuff */ 414562306a36Sopenharmony_ci gpio_inout(0xffffff, (1<<13)); 414662306a36Sopenharmony_ci gpio_write(0); 414762306a36Sopenharmony_ci udelay(3); 414862306a36Sopenharmony_ci gpio_write(1<<13); 414962306a36Sopenharmony_ci /* GPIO inputs are pulled up, so no need to drive 415062306a36Sopenharmony_ci * reset pin any longer */ 415162306a36Sopenharmony_ci gpio_bits(0xffffff, 0); 415262306a36Sopenharmony_ci if (bttv_gpio) 415362306a36Sopenharmony_ci bttv_gpio_tracking(btv,"pxc200"); 415462306a36Sopenharmony_ci 415562306a36Sopenharmony_ci /* we could/should try and reset/control the AD pots? but 415662306a36Sopenharmony_ci right now we simply turned off the crushing. Without 415762306a36Sopenharmony_ci this the AGC drifts drifts 415862306a36Sopenharmony_ci remember the EN is reverse logic --> 415962306a36Sopenharmony_ci setting BT848_ADC_AGC_EN disable the AGC 416062306a36Sopenharmony_ci tboult@eecs.lehigh.edu 416162306a36Sopenharmony_ci */ 416262306a36Sopenharmony_ci 416362306a36Sopenharmony_ci btwrite(BT848_ADC_RESERVED|BT848_ADC_AGC_EN, BT848_ADC); 416462306a36Sopenharmony_ci 416562306a36Sopenharmony_ci /* Initialise MAX517 DAC */ 416662306a36Sopenharmony_ci pr_info("Setting DAC reference voltage level ...\n"); 416762306a36Sopenharmony_ci bttv_I2CWrite(btv,0x5E,0,0x80,1); 416862306a36Sopenharmony_ci 416962306a36Sopenharmony_ci /* Initialise 12C508 PIC */ 417062306a36Sopenharmony_ci /* The I2CWrite and I2CRead commands are actually to the 417162306a36Sopenharmony_ci * same chips - but the R/W bit is included in the address 417262306a36Sopenharmony_ci * argument so the numbers are different */ 417362306a36Sopenharmony_ci 417462306a36Sopenharmony_ci 417562306a36Sopenharmony_ci pr_info("Initialising 12C508 PIC chip ...\n"); 417662306a36Sopenharmony_ci 417762306a36Sopenharmony_ci /* First of all, enable the clock line. This is used in the PXC200-F */ 417862306a36Sopenharmony_ci val = btread(BT848_GPIO_DMA_CTL); 417962306a36Sopenharmony_ci val |= BT848_GPIO_DMA_CTL_GPCLKMODE; 418062306a36Sopenharmony_ci btwrite(val, BT848_GPIO_DMA_CTL); 418162306a36Sopenharmony_ci 418262306a36Sopenharmony_ci /* Then, push to 0 the reset pin long enough to reset the * 418362306a36Sopenharmony_ci * device same as above for the reset line, but not the same 418462306a36Sopenharmony_ci * value sent to the GPIO-connected stuff 418562306a36Sopenharmony_ci * which one is the good one? */ 418662306a36Sopenharmony_ci gpio_inout(0xffffff,(1<<2)); 418762306a36Sopenharmony_ci gpio_write(0); 418862306a36Sopenharmony_ci udelay(10); 418962306a36Sopenharmony_ci gpio_write(1<<2); 419062306a36Sopenharmony_ci 419162306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(vals); i++) { 419262306a36Sopenharmony_ci tmp=bttv_I2CWrite(btv,0x1E,0,vals[i],1); 419362306a36Sopenharmony_ci if (tmp != -1) { 419462306a36Sopenharmony_ci pr_info("I2C Write(%2.2x) = %i\nI2C Read () = %2.2x\n\n", 419562306a36Sopenharmony_ci vals[i],tmp,bttv_I2CRead(btv,0x1F,NULL)); 419662306a36Sopenharmony_ci } 419762306a36Sopenharmony_ci } 419862306a36Sopenharmony_ci 419962306a36Sopenharmony_ci pr_info("PXC200 Initialised\n"); 420062306a36Sopenharmony_ci} 420162306a36Sopenharmony_ci 420262306a36Sopenharmony_ci 420362306a36Sopenharmony_ci 420462306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 420562306a36Sopenharmony_ci/* 420662306a36Sopenharmony_ci * The Adlink RTV-24 (aka Angelo) has some special initialisation to unlock 420762306a36Sopenharmony_ci * it. This apparently involves the following procedure for each 878 chip: 420862306a36Sopenharmony_ci * 420962306a36Sopenharmony_ci * 1) write 0x00C3FEFF to the GPIO_OUT_EN register 421062306a36Sopenharmony_ci * 421162306a36Sopenharmony_ci * 2) write to GPIO_DATA 421262306a36Sopenharmony_ci * - 0x0E 421362306a36Sopenharmony_ci * - sleep 1ms 421462306a36Sopenharmony_ci * - 0x10 + 0x0E 421562306a36Sopenharmony_ci * - sleep 10ms 421662306a36Sopenharmony_ci * - 0x0E 421762306a36Sopenharmony_ci * read from GPIO_DATA into buf (uint_32) 421862306a36Sopenharmony_ci * - if ( data>>18 & 0x01 != 0) || ( buf>>19 & 0x01 != 1 ) 421962306a36Sopenharmony_ci * error. ERROR_CPLD_Check_Failed stop. 422062306a36Sopenharmony_ci * 422162306a36Sopenharmony_ci * 3) write to GPIO_DATA 422262306a36Sopenharmony_ci * - write 0x4400 + 0x0E 422362306a36Sopenharmony_ci * - sleep 10ms 422462306a36Sopenharmony_ci * - write 0x4410 + 0x0E 422562306a36Sopenharmony_ci * - sleep 1ms 422662306a36Sopenharmony_ci * - write 0x0E 422762306a36Sopenharmony_ci * read from GPIO_DATA into buf (uint_32) 422862306a36Sopenharmony_ci * - if ( buf>>18 & 0x01 ) || ( buf>>19 & 0x01 != 0 ) 422962306a36Sopenharmony_ci * error. ERROR_CPLD_Check_Failed. 423062306a36Sopenharmony_ci */ 423162306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 423262306a36Sopenharmony_cistatic void 423362306a36Sopenharmony_ciinit_RTV24 (struct bttv *btv) 423462306a36Sopenharmony_ci{ 423562306a36Sopenharmony_ci uint32_t dataRead = 0; 423662306a36Sopenharmony_ci long watchdog_value = 0x0E; 423762306a36Sopenharmony_ci 423862306a36Sopenharmony_ci pr_info("%d: Adlink RTV-24 initialisation in progress ...\n", 423962306a36Sopenharmony_ci btv->c.nr); 424062306a36Sopenharmony_ci 424162306a36Sopenharmony_ci btwrite (0x00c3feff, BT848_GPIO_OUT_EN); 424262306a36Sopenharmony_ci 424362306a36Sopenharmony_ci btwrite (0 + watchdog_value, BT848_GPIO_DATA); 424462306a36Sopenharmony_ci msleep (1); 424562306a36Sopenharmony_ci btwrite (0x10 + watchdog_value, BT848_GPIO_DATA); 424662306a36Sopenharmony_ci msleep (10); 424762306a36Sopenharmony_ci btwrite (0 + watchdog_value, BT848_GPIO_DATA); 424862306a36Sopenharmony_ci 424962306a36Sopenharmony_ci dataRead = btread (BT848_GPIO_DATA); 425062306a36Sopenharmony_ci 425162306a36Sopenharmony_ci if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 1)) { 425262306a36Sopenharmony_ci pr_info("%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n", 425362306a36Sopenharmony_ci btv->c.nr, dataRead); 425462306a36Sopenharmony_ci } 425562306a36Sopenharmony_ci 425662306a36Sopenharmony_ci btwrite (0x4400 + watchdog_value, BT848_GPIO_DATA); 425762306a36Sopenharmony_ci msleep (10); 425862306a36Sopenharmony_ci btwrite (0x4410 + watchdog_value, BT848_GPIO_DATA); 425962306a36Sopenharmony_ci msleep (1); 426062306a36Sopenharmony_ci btwrite (watchdog_value, BT848_GPIO_DATA); 426162306a36Sopenharmony_ci msleep (1); 426262306a36Sopenharmony_ci dataRead = btread (BT848_GPIO_DATA); 426362306a36Sopenharmony_ci 426462306a36Sopenharmony_ci if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 0)) { 426562306a36Sopenharmony_ci pr_info("%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n", 426662306a36Sopenharmony_ci btv->c.nr, dataRead); 426762306a36Sopenharmony_ci 426862306a36Sopenharmony_ci return; 426962306a36Sopenharmony_ci } 427062306a36Sopenharmony_ci 427162306a36Sopenharmony_ci pr_info("%d: Adlink RTV-24 initialisation complete\n", btv->c.nr); 427262306a36Sopenharmony_ci} 427362306a36Sopenharmony_ci 427462306a36Sopenharmony_ci 427562306a36Sopenharmony_ci 427662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 427762306a36Sopenharmony_ci/* 427862306a36Sopenharmony_ci * The PCI-8604PW contains a CPLD, probably an ispMACH 4A, that filters 427962306a36Sopenharmony_ci * the PCI REQ signals coming from the four BT878 chips. After power 428062306a36Sopenharmony_ci * up, the CPLD does not forward requests to the bus, which prevents 428162306a36Sopenharmony_ci * the BT878 from fetching RISC instructions from memory. While the 428262306a36Sopenharmony_ci * CPLD is connected to most of the GPIOs of PCI device 0xD, only 428362306a36Sopenharmony_ci * five appear to play a role in unlocking the REQ signal. The following 428462306a36Sopenharmony_ci * sequence has been determined by trial and error without access to the 428562306a36Sopenharmony_ci * original driver. 428662306a36Sopenharmony_ci * 428762306a36Sopenharmony_ci * Eight GPIOs of device 0xC are provided on connector CN4 (4 in, 4 out). 428862306a36Sopenharmony_ci * Devices 0xE and 0xF do not appear to have anything connected to their 428962306a36Sopenharmony_ci * GPIOs. 429062306a36Sopenharmony_ci * 429162306a36Sopenharmony_ci * The correct GPIO_OUT_EN value might have some more bits set. It should 429262306a36Sopenharmony_ci * be possible to derive it from a boundary scan of the CPLD. Its JTAG 429362306a36Sopenharmony_ci * pins are routed to test points. 429462306a36Sopenharmony_ci * 429562306a36Sopenharmony_ci */ 429662306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 429762306a36Sopenharmony_cistatic void 429862306a36Sopenharmony_ciinit_PCI8604PW(struct bttv *btv) 429962306a36Sopenharmony_ci{ 430062306a36Sopenharmony_ci int state; 430162306a36Sopenharmony_ci 430262306a36Sopenharmony_ci if ((PCI_SLOT(btv->c.pci->devfn) & ~3) != 0xC) { 430362306a36Sopenharmony_ci pr_warn("This is not a PCI-8604PW\n"); 430462306a36Sopenharmony_ci return; 430562306a36Sopenharmony_ci } 430662306a36Sopenharmony_ci 430762306a36Sopenharmony_ci if (PCI_SLOT(btv->c.pci->devfn) != 0xD) 430862306a36Sopenharmony_ci return; 430962306a36Sopenharmony_ci 431062306a36Sopenharmony_ci btwrite(0x080002, BT848_GPIO_OUT_EN); 431162306a36Sopenharmony_ci 431262306a36Sopenharmony_ci state = (btread(BT848_GPIO_DATA) >> 21) & 7; 431362306a36Sopenharmony_ci 431462306a36Sopenharmony_ci for (;;) { 431562306a36Sopenharmony_ci switch (state) { 431662306a36Sopenharmony_ci case 1: 431762306a36Sopenharmony_ci case 5: 431862306a36Sopenharmony_ci case 6: 431962306a36Sopenharmony_ci case 4: 432062306a36Sopenharmony_ci pr_debug("PCI-8604PW in state %i, toggling pin\n", 432162306a36Sopenharmony_ci state); 432262306a36Sopenharmony_ci btwrite(0x080000, BT848_GPIO_DATA); 432362306a36Sopenharmony_ci msleep(1); 432462306a36Sopenharmony_ci btwrite(0x000000, BT848_GPIO_DATA); 432562306a36Sopenharmony_ci msleep(1); 432662306a36Sopenharmony_ci break; 432762306a36Sopenharmony_ci case 7: 432862306a36Sopenharmony_ci pr_info("PCI-8604PW unlocked\n"); 432962306a36Sopenharmony_ci return; 433062306a36Sopenharmony_ci case 0: 433162306a36Sopenharmony_ci /* FIXME: If we are in state 7 and toggle GPIO[19] one 433262306a36Sopenharmony_ci more time, the CPLD goes into state 0, where PCI bus 433362306a36Sopenharmony_ci mastering is inhibited again. We have not managed to 433462306a36Sopenharmony_ci get out of that state. */ 433562306a36Sopenharmony_ci 433662306a36Sopenharmony_ci pr_err("PCI-8604PW locked until reset\n"); 433762306a36Sopenharmony_ci return; 433862306a36Sopenharmony_ci default: 433962306a36Sopenharmony_ci pr_err("PCI-8604PW in unknown state %i\n", state); 434062306a36Sopenharmony_ci return; 434162306a36Sopenharmony_ci } 434262306a36Sopenharmony_ci 434362306a36Sopenharmony_ci state = (state << 4) | ((btread(BT848_GPIO_DATA) >> 21) & 7); 434462306a36Sopenharmony_ci 434562306a36Sopenharmony_ci switch (state) { 434662306a36Sopenharmony_ci case 0x15: 434762306a36Sopenharmony_ci case 0x56: 434862306a36Sopenharmony_ci case 0x64: 434962306a36Sopenharmony_ci case 0x47: 435062306a36Sopenharmony_ci /* The transition from state 7 to state 0 is, as explained 435162306a36Sopenharmony_ci above, valid but undesired and with this code impossible 435262306a36Sopenharmony_ci as we exit as soon as we are in state 7. 435362306a36Sopenharmony_ci case 0x70: */ 435462306a36Sopenharmony_ci break; 435562306a36Sopenharmony_ci default: 435662306a36Sopenharmony_ci pr_err("PCI-8604PW invalid transition %i -> %i\n", 435762306a36Sopenharmony_ci state >> 4, state & 7); 435862306a36Sopenharmony_ci return; 435962306a36Sopenharmony_ci } 436062306a36Sopenharmony_ci state &= 7; 436162306a36Sopenharmony_ci } 436262306a36Sopenharmony_ci} 436362306a36Sopenharmony_ci 436462306a36Sopenharmony_ci/* RemoteVision MX (rv605) muxsel helper [Miguel Freitas] 436562306a36Sopenharmony_ci * 436662306a36Sopenharmony_ci * This is needed because rv605 don't use a normal multiplex, but a crosspoint 436762306a36Sopenharmony_ci * switch instead (CD22M3494E). This IC can have multiple active connections 436862306a36Sopenharmony_ci * between Xn (input) and Yn (output) pins. We need to clear any existing 436962306a36Sopenharmony_ci * connection prior to establish a new one, pulsing the STROBE pin. 437062306a36Sopenharmony_ci * 437162306a36Sopenharmony_ci * The board hardwire Y0 (xpoint) to MUX1 and MUXOUT to Yin. 437262306a36Sopenharmony_ci * GPIO pins are wired as: 437362306a36Sopenharmony_ci * GPIO[0:3] - AX[0:3] (xpoint) - P1[0:3] (microcontroller) 437462306a36Sopenharmony_ci * GPIO[4:6] - AY[0:2] (xpoint) - P1[4:6] (microcontroller) 437562306a36Sopenharmony_ci * GPIO[7] - DATA (xpoint) - P1[7] (microcontroller) 437662306a36Sopenharmony_ci * GPIO[8] - - P3[5] (microcontroller) 437762306a36Sopenharmony_ci * GPIO[9] - RESET (xpoint) - P3[6] (microcontroller) 437862306a36Sopenharmony_ci * GPIO[10] - STROBE (xpoint) - P3[7] (microcontroller) 437962306a36Sopenharmony_ci * GPINTR - - P3[4] (microcontroller) 438062306a36Sopenharmony_ci * 438162306a36Sopenharmony_ci * The microcontroller is a 80C32 like. It should be possible to change xpoint 438262306a36Sopenharmony_ci * configuration either directly (as we are doing) or using the microcontroller 438362306a36Sopenharmony_ci * which is also wired to I2C interface. I have no further info on the 438462306a36Sopenharmony_ci * microcontroller features, one would need to disassembly the firmware. 438562306a36Sopenharmony_ci * note: the vendor refused to give any information on this product, all 438662306a36Sopenharmony_ci * that stuff was found using a multimeter! :) 438762306a36Sopenharmony_ci */ 438862306a36Sopenharmony_cistatic void rv605_muxsel(struct bttv *btv, unsigned int input) 438962306a36Sopenharmony_ci{ 439062306a36Sopenharmony_ci static const u8 muxgpio[] = { 0x3, 0x1, 0x2, 0x4, 0xf, 0x7, 0xe, 0x0, 439162306a36Sopenharmony_ci 0xd, 0xb, 0xc, 0x6, 0x9, 0x5, 0x8, 0xa }; 439262306a36Sopenharmony_ci 439362306a36Sopenharmony_ci gpio_bits(0x07f, muxgpio[input]); 439462306a36Sopenharmony_ci 439562306a36Sopenharmony_ci /* reset all connections */ 439662306a36Sopenharmony_ci gpio_bits(0x200,0x200); 439762306a36Sopenharmony_ci mdelay(1); 439862306a36Sopenharmony_ci gpio_bits(0x200,0x000); 439962306a36Sopenharmony_ci mdelay(1); 440062306a36Sopenharmony_ci 440162306a36Sopenharmony_ci /* create a new connection */ 440262306a36Sopenharmony_ci gpio_bits(0x480,0x480); 440362306a36Sopenharmony_ci mdelay(1); 440462306a36Sopenharmony_ci gpio_bits(0x480,0x080); 440562306a36Sopenharmony_ci mdelay(1); 440662306a36Sopenharmony_ci} 440762306a36Sopenharmony_ci 440862306a36Sopenharmony_ci/* Tibet Systems 'Progress DVR' CS16 muxsel helper [Chris Fanning] 440962306a36Sopenharmony_ci * 441062306a36Sopenharmony_ci * The CS16 (available on eBay cheap) is a PCI board with four Fusion 441162306a36Sopenharmony_ci * 878A chips, a PCI bridge, an Atmel microcontroller, four sync separator 441262306a36Sopenharmony_ci * chips, ten eight input analog multiplexors, a not chip and a few 441362306a36Sopenharmony_ci * other components. 441462306a36Sopenharmony_ci * 441562306a36Sopenharmony_ci * 16 inputs on a secondary bracket are provided and can be selected 441662306a36Sopenharmony_ci * from each of the four capture chips. Two of the eight input 441762306a36Sopenharmony_ci * multiplexors are used to select from any of the 16 input signals. 441862306a36Sopenharmony_ci * 441962306a36Sopenharmony_ci * Unsupported hardware capabilities: 442062306a36Sopenharmony_ci * . A video output monitor on the secondary bracket can be selected from 442162306a36Sopenharmony_ci * one of the 878A chips. 442262306a36Sopenharmony_ci * . Another passthrough but I haven't spent any time investigating it. 442362306a36Sopenharmony_ci * . Digital I/O (logic level connected to GPIO) is available from an 442462306a36Sopenharmony_ci * onboard header. 442562306a36Sopenharmony_ci * 442662306a36Sopenharmony_ci * The on chip input mux should always be set to 2. 442762306a36Sopenharmony_ci * GPIO[16:19] - Video input selection 442862306a36Sopenharmony_ci * GPIO[0:3] - Video output monitor select (only available from one 878A) 442962306a36Sopenharmony_ci * GPIO[?:?] - Digital I/O. 443062306a36Sopenharmony_ci * 443162306a36Sopenharmony_ci * There is an ATMEL microcontroller with an 8031 core on board. I have not 443262306a36Sopenharmony_ci * determined what function (if any) it provides. With the microcontroller 443362306a36Sopenharmony_ci * and sync separator chips a guess is that it might have to do with video 443462306a36Sopenharmony_ci * switching and maybe some digital I/O. 443562306a36Sopenharmony_ci */ 443662306a36Sopenharmony_cistatic void tibetCS16_muxsel(struct bttv *btv, unsigned int input) 443762306a36Sopenharmony_ci{ 443862306a36Sopenharmony_ci /* video mux */ 443962306a36Sopenharmony_ci gpio_bits(0x0f0000, input << 16); 444062306a36Sopenharmony_ci} 444162306a36Sopenharmony_ci 444262306a36Sopenharmony_cistatic void tibetCS16_init(struct bttv *btv) 444362306a36Sopenharmony_ci{ 444462306a36Sopenharmony_ci /* enable gpio bits, mask obtained via btSpy */ 444562306a36Sopenharmony_ci gpio_inout(0xffffff, 0x0f7fff); 444662306a36Sopenharmony_ci gpio_write(0x0f7fff); 444762306a36Sopenharmony_ci} 444862306a36Sopenharmony_ci 444962306a36Sopenharmony_ci/* 445062306a36Sopenharmony_ci * The following routines for the Kodicom-4400r get a little mind-twisting. 445162306a36Sopenharmony_ci * There is a "master" controller and three "slave" controllers, together 445262306a36Sopenharmony_ci * an analog switch which connects any of 16 cameras to any of the BT87A's. 445362306a36Sopenharmony_ci * The analog switch is controlled by the "master", but the detection order 445462306a36Sopenharmony_ci * of the four BT878A chips is in an order which I just don't understand. 445562306a36Sopenharmony_ci * The "master" is actually the second controller to be detected. The 445662306a36Sopenharmony_ci * logic on the board uses logical numbers for the 4 controllers, but 445762306a36Sopenharmony_ci * those numbers are different from the detection sequence. When working 445862306a36Sopenharmony_ci * with the analog switch, we need to "map" from the detection sequence 445962306a36Sopenharmony_ci * over to the board's logical controller number. This mapping sequence 446062306a36Sopenharmony_ci * is {3, 0, 2, 1}, i.e. the first controller to be detected is logical 446162306a36Sopenharmony_ci * unit 3, the second (which is the master) is logical unit 0, etc. 446262306a36Sopenharmony_ci * We need to maintain the status of the analog switch (which of the 16 446362306a36Sopenharmony_ci * cameras is connected to which of the 4 controllers) in sw_status array. 446462306a36Sopenharmony_ci */ 446562306a36Sopenharmony_ci 446662306a36Sopenharmony_ci/* 446762306a36Sopenharmony_ci * First a routine to set the analog switch, which controls which camera 446862306a36Sopenharmony_ci * is routed to which controller. The switch comprises an X-address 446962306a36Sopenharmony_ci * (gpio bits 0-3, representing the camera, ranging from 0-15), and a 447062306a36Sopenharmony_ci * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3). 447162306a36Sopenharmony_ci * A data value (gpio bit 7) of '1' enables the switch, and '0' disables 447262306a36Sopenharmony_ci * the switch. A STROBE bit (gpio bit 8) latches the data value into the 447362306a36Sopenharmony_ci * specified address. The idea is to set the address and data, then bring 447462306a36Sopenharmony_ci * STROBE high, and finally bring STROBE back to low. 447562306a36Sopenharmony_ci */ 447662306a36Sopenharmony_cistatic void kodicom4400r_write(struct bttv *btv, 447762306a36Sopenharmony_ci unsigned char xaddr, 447862306a36Sopenharmony_ci unsigned char yaddr, 447962306a36Sopenharmony_ci unsigned char data) { 448062306a36Sopenharmony_ci unsigned int udata; 448162306a36Sopenharmony_ci 448262306a36Sopenharmony_ci udata = (data << 7) | ((yaddr&3) << 4) | (xaddr&0xf); 448362306a36Sopenharmony_ci gpio_bits(0x1ff, udata); /* write ADDR and DAT */ 448462306a36Sopenharmony_ci gpio_bits(0x1ff, udata | (1 << 8)); /* strobe high */ 448562306a36Sopenharmony_ci gpio_bits(0x1ff, udata); /* strobe low */ 448662306a36Sopenharmony_ci} 448762306a36Sopenharmony_ci 448862306a36Sopenharmony_ci/* 448962306a36Sopenharmony_ci * Next the mux select. Both the "master" and "slave" 'cards' (controllers) 449062306a36Sopenharmony_ci * use this routine. The routine finds the "master" for the card, maps 449162306a36Sopenharmony_ci * the controller number from the detected position over to the logical 449262306a36Sopenharmony_ci * number, writes the appropriate data to the analog switch, and housekeeps 449362306a36Sopenharmony_ci * the local copy of the switch information. The parameter 'input' is the 449462306a36Sopenharmony_ci * requested camera number (0 - 15). 449562306a36Sopenharmony_ci */ 449662306a36Sopenharmony_cistatic void kodicom4400r_muxsel(struct bttv *btv, unsigned int input) 449762306a36Sopenharmony_ci{ 449862306a36Sopenharmony_ci int xaddr, yaddr; 449962306a36Sopenharmony_ci struct bttv *mctlr; 450062306a36Sopenharmony_ci static unsigned char map[4] = {3, 0, 2, 1}; 450162306a36Sopenharmony_ci 450262306a36Sopenharmony_ci mctlr = master[btv->c.nr]; 450362306a36Sopenharmony_ci if (mctlr == NULL) { /* ignore if master not yet detected */ 450462306a36Sopenharmony_ci return; 450562306a36Sopenharmony_ci } 450662306a36Sopenharmony_ci yaddr = (btv->c.nr - mctlr->c.nr + 1) & 3; /* the '&' is for safety */ 450762306a36Sopenharmony_ci yaddr = map[yaddr]; 450862306a36Sopenharmony_ci xaddr = input & 0xf; 450962306a36Sopenharmony_ci /* Check if the controller/camera pair has changed, else ignore */ 451062306a36Sopenharmony_ci if (mctlr->sw_status[yaddr] != xaddr) 451162306a36Sopenharmony_ci { 451262306a36Sopenharmony_ci /* "open" the old switch, "close" the new one, save the new */ 451362306a36Sopenharmony_ci kodicom4400r_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0); 451462306a36Sopenharmony_ci mctlr->sw_status[yaddr] = xaddr; 451562306a36Sopenharmony_ci kodicom4400r_write(mctlr, xaddr, yaddr, 1); 451662306a36Sopenharmony_ci } 451762306a36Sopenharmony_ci} 451862306a36Sopenharmony_ci 451962306a36Sopenharmony_ci/* 452062306a36Sopenharmony_ci * During initialisation, we need to reset the analog switch. We 452162306a36Sopenharmony_ci * also preset the switch to map the 4 connectors on the card to the 452262306a36Sopenharmony_ci * *user's* (see above description of kodicom4400r_muxsel) channels 452362306a36Sopenharmony_ci * 0 through 3 452462306a36Sopenharmony_ci */ 452562306a36Sopenharmony_cistatic void kodicom4400r_init(struct bttv *btv) 452662306a36Sopenharmony_ci{ 452762306a36Sopenharmony_ci int ix; 452862306a36Sopenharmony_ci 452962306a36Sopenharmony_ci gpio_inout(0x0003ff, 0x0003ff); 453062306a36Sopenharmony_ci gpio_write(1 << 9); /* reset MUX */ 453162306a36Sopenharmony_ci gpio_write(0); 453262306a36Sopenharmony_ci /* Preset camera 0 to the 4 controllers */ 453362306a36Sopenharmony_ci for (ix = 0; ix < 4; ix++) { 453462306a36Sopenharmony_ci btv->sw_status[ix] = ix; 453562306a36Sopenharmony_ci kodicom4400r_write(btv, ix, ix, 1); 453662306a36Sopenharmony_ci } 453762306a36Sopenharmony_ci /* 453862306a36Sopenharmony_ci * Since this is the "master", we need to set up the 453962306a36Sopenharmony_ci * other three controller chips' pointers to this structure 454062306a36Sopenharmony_ci * for later use in the muxsel routine. 454162306a36Sopenharmony_ci */ 454262306a36Sopenharmony_ci if ((btv->c.nr<1) || (btv->c.nr>BTTV_MAX-3)) 454362306a36Sopenharmony_ci return; 454462306a36Sopenharmony_ci master[btv->c.nr-1] = btv; 454562306a36Sopenharmony_ci master[btv->c.nr] = btv; 454662306a36Sopenharmony_ci master[btv->c.nr+1] = btv; 454762306a36Sopenharmony_ci master[btv->c.nr+2] = btv; 454862306a36Sopenharmony_ci} 454962306a36Sopenharmony_ci 455062306a36Sopenharmony_ci/* The Grandtec X-Guard framegrabber card uses two Dual 4-channel 455162306a36Sopenharmony_ci * video multiplexers to provide up to 16 video inputs. These 455262306a36Sopenharmony_ci * multiplexers are controlled by the lower 8 GPIO pins of the 455362306a36Sopenharmony_ci * bt878. The multiplexers probably Pericom PI5V331Q or similar. 455462306a36Sopenharmony_ci 455562306a36Sopenharmony_ci * xxx0 is pin xxx of multiplexer U5, 455662306a36Sopenharmony_ci * yyy1 is pin yyy of multiplexer U2 455762306a36Sopenharmony_ci */ 455862306a36Sopenharmony_ci#define ENA0 0x01 455962306a36Sopenharmony_ci#define ENB0 0x02 456062306a36Sopenharmony_ci#define ENA1 0x04 456162306a36Sopenharmony_ci#define ENB1 0x08 456262306a36Sopenharmony_ci 456362306a36Sopenharmony_ci#define IN10 0x10 456462306a36Sopenharmony_ci#define IN00 0x20 456562306a36Sopenharmony_ci#define IN11 0x40 456662306a36Sopenharmony_ci#define IN01 0x80 456762306a36Sopenharmony_ci 456862306a36Sopenharmony_cistatic void xguard_muxsel(struct bttv *btv, unsigned int input) 456962306a36Sopenharmony_ci{ 457062306a36Sopenharmony_ci static const int masks[] = { 457162306a36Sopenharmony_ci ENB0, ENB0|IN00, ENB0|IN10, ENB0|IN00|IN10, 457262306a36Sopenharmony_ci ENA0, ENA0|IN00, ENA0|IN10, ENA0|IN00|IN10, 457362306a36Sopenharmony_ci ENB1, ENB1|IN01, ENB1|IN11, ENB1|IN01|IN11, 457462306a36Sopenharmony_ci ENA1, ENA1|IN01, ENA1|IN11, ENA1|IN01|IN11, 457562306a36Sopenharmony_ci }; 457662306a36Sopenharmony_ci gpio_write(masks[input%16]); 457762306a36Sopenharmony_ci} 457862306a36Sopenharmony_cistatic void picolo_tetra_init(struct bttv *btv) 457962306a36Sopenharmony_ci{ 458062306a36Sopenharmony_ci /*This is the video input redirection functionality : I DID NOT USE IT. */ 458162306a36Sopenharmony_ci btwrite (0x08<<16,BT848_GPIO_DATA);/*GPIO[19] [==> 4053 B+C] set to 1 */ 458262306a36Sopenharmony_ci btwrite (0x04<<16,BT848_GPIO_DATA);/*GPIO[18] [==> 4053 A] set to 1*/ 458362306a36Sopenharmony_ci} 458462306a36Sopenharmony_cistatic void picolo_tetra_muxsel (struct bttv* btv, unsigned int input) 458562306a36Sopenharmony_ci{ 458662306a36Sopenharmony_ci 458762306a36Sopenharmony_ci dprintk("%d : picolo_tetra_muxsel => input = %d\n", btv->c.nr, input); 458862306a36Sopenharmony_ci /*Just set the right path in the analog multiplexers : channel 1 -> 4 ==> Analog Mux ==> MUX0*/ 458962306a36Sopenharmony_ci /*GPIO[20]&GPIO[21] used to choose the right input*/ 459062306a36Sopenharmony_ci btwrite (input<<20,BT848_GPIO_DATA); 459162306a36Sopenharmony_ci 459262306a36Sopenharmony_ci} 459362306a36Sopenharmony_ci 459462306a36Sopenharmony_ci/* 459562306a36Sopenharmony_ci * ivc120_muxsel [Added by Alan Garfield <alan@fromorbit.com>] 459662306a36Sopenharmony_ci * 459762306a36Sopenharmony_ci * The IVC120G security card has 4 i2c controlled TDA8540 matrix 459862306a36Sopenharmony_ci * switchers to provide 16 channels to MUX0. The TDA8540's have 459962306a36Sopenharmony_ci * 4 independent outputs and as such the IVC120G also has the 460062306a36Sopenharmony_ci * optional "Monitor Out" bus. This allows the card to be looking 460162306a36Sopenharmony_ci * at one input while the monitor is looking at another. 460262306a36Sopenharmony_ci * 460362306a36Sopenharmony_ci * Since I've couldn't be bothered figuring out how to add an 460462306a36Sopenharmony_ci * independent muxsel for the monitor bus, I've just set it to 460562306a36Sopenharmony_ci * whatever the card is looking at. 460662306a36Sopenharmony_ci * 460762306a36Sopenharmony_ci * OUT0 of the TDA8540's is connected to MUX0 (0x03) 460862306a36Sopenharmony_ci * OUT1 of the TDA8540's is connected to "Monitor Out" (0x0C) 460962306a36Sopenharmony_ci * 461062306a36Sopenharmony_ci * TDA8540_ALT3 IN0-3 = Channel 13 - 16 (0x03) 461162306a36Sopenharmony_ci * TDA8540_ALT4 IN0-3 = Channel 1 - 4 (0x03) 461262306a36Sopenharmony_ci * TDA8540_ALT5 IN0-3 = Channel 5 - 8 (0x03) 461362306a36Sopenharmony_ci * TDA8540_ALT6 IN0-3 = Channel 9 - 12 (0x03) 461462306a36Sopenharmony_ci * 461562306a36Sopenharmony_ci */ 461662306a36Sopenharmony_ci 461762306a36Sopenharmony_ci/* All 7 possible sub-ids for the TDA8540 Matrix Switcher */ 461862306a36Sopenharmony_ci#define I2C_TDA8540 0x90 461962306a36Sopenharmony_ci#define I2C_TDA8540_ALT1 0x92 462062306a36Sopenharmony_ci#define I2C_TDA8540_ALT2 0x94 462162306a36Sopenharmony_ci#define I2C_TDA8540_ALT3 0x96 462262306a36Sopenharmony_ci#define I2C_TDA8540_ALT4 0x98 462362306a36Sopenharmony_ci#define I2C_TDA8540_ALT5 0x9a 462462306a36Sopenharmony_ci#define I2C_TDA8540_ALT6 0x9c 462562306a36Sopenharmony_ci 462662306a36Sopenharmony_cistatic void ivc120_muxsel(struct bttv *btv, unsigned int input) 462762306a36Sopenharmony_ci{ 462862306a36Sopenharmony_ci /* Simple maths */ 462962306a36Sopenharmony_ci int key = input % 4; 463062306a36Sopenharmony_ci int matrix = input / 4; 463162306a36Sopenharmony_ci 463262306a36Sopenharmony_ci dprintk("%d: ivc120_muxsel: Input - %02d | TDA - %02d | In - %02d\n", 463362306a36Sopenharmony_ci btv->c.nr, input, matrix, key); 463462306a36Sopenharmony_ci 463562306a36Sopenharmony_ci /* Handles the input selection on the TDA8540's */ 463662306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x00, 463762306a36Sopenharmony_ci ((matrix == 3) ? (key | key << 2) : 0x00), 1); 463862306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x00, 463962306a36Sopenharmony_ci ((matrix == 0) ? (key | key << 2) : 0x00), 1); 464062306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x00, 464162306a36Sopenharmony_ci ((matrix == 1) ? (key | key << 2) : 0x00), 1); 464262306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x00, 464362306a36Sopenharmony_ci ((matrix == 2) ? (key | key << 2) : 0x00), 1); 464462306a36Sopenharmony_ci 464562306a36Sopenharmony_ci /* Handles the output enables on the TDA8540's */ 464662306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x02, 464762306a36Sopenharmony_ci ((matrix == 3) ? 0x03 : 0x00), 1); /* 13 - 16 */ 464862306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x02, 464962306a36Sopenharmony_ci ((matrix == 0) ? 0x03 : 0x00), 1); /* 1-4 */ 465062306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x02, 465162306a36Sopenharmony_ci ((matrix == 1) ? 0x03 : 0x00), 1); /* 5-8 */ 465262306a36Sopenharmony_ci bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x02, 465362306a36Sopenharmony_ci ((matrix == 2) ? 0x03 : 0x00), 1); /* 9-12 */ 465462306a36Sopenharmony_ci 465562306a36Sopenharmony_ci /* 878's MUX0 is already selected for input via muxsel values */ 465662306a36Sopenharmony_ci} 465762306a36Sopenharmony_ci 465862306a36Sopenharmony_ci 465962306a36Sopenharmony_ci/* PXC200 muxsel helper 466062306a36Sopenharmony_ci * luke@syseng.anu.edu.au 466162306a36Sopenharmony_ci * another transplant 466262306a36Sopenharmony_ci * from Alessandro Rubini (rubini@linux.it) 466362306a36Sopenharmony_ci * 466462306a36Sopenharmony_ci * There are 4 kinds of cards: 466562306a36Sopenharmony_ci * PXC200L which is bt848 466662306a36Sopenharmony_ci * PXC200F which is bt848 with PIC controlling mux 466762306a36Sopenharmony_ci * PXC200AL which is bt878 466862306a36Sopenharmony_ci * PXC200AF which is bt878 with PIC controlling mux 466962306a36Sopenharmony_ci */ 467062306a36Sopenharmony_ci#define PX_CFG_PXC200F 0x01 467162306a36Sopenharmony_ci#define PX_FLAG_PXC200A 0x00001000 /* a pxc200A is bt-878 based */ 467262306a36Sopenharmony_ci#define PX_I2C_PIC 0x0f 467362306a36Sopenharmony_ci#define PX_PXC200A_CARDID 0x200a1295 467462306a36Sopenharmony_ci#define PX_I2C_CMD_CFG 0x00 467562306a36Sopenharmony_ci 467662306a36Sopenharmony_cistatic void PXC200_muxsel(struct bttv *btv, unsigned int input) 467762306a36Sopenharmony_ci{ 467862306a36Sopenharmony_ci int rc; 467962306a36Sopenharmony_ci long mux; 468062306a36Sopenharmony_ci int bitmask; 468162306a36Sopenharmony_ci unsigned char buf[2]; 468262306a36Sopenharmony_ci 468362306a36Sopenharmony_ci /* Read PIC config to determine if this is a PXC200F */ 468462306a36Sopenharmony_ci /* PX_I2C_CMD_CFG*/ 468562306a36Sopenharmony_ci buf[0]=0; 468662306a36Sopenharmony_ci buf[1]=0; 468762306a36Sopenharmony_ci rc=bttv_I2CWrite(btv,(PX_I2C_PIC<<1),buf[0],buf[1],1); 468862306a36Sopenharmony_ci if (rc) { 468962306a36Sopenharmony_ci pr_debug("%d: PXC200_muxsel: pic cfg write failed:%d\n", 469062306a36Sopenharmony_ci btv->c.nr, rc); 469162306a36Sopenharmony_ci /* not PXC ? do nothing */ 469262306a36Sopenharmony_ci return; 469362306a36Sopenharmony_ci } 469462306a36Sopenharmony_ci 469562306a36Sopenharmony_ci rc=bttv_I2CRead(btv,(PX_I2C_PIC<<1),NULL); 469662306a36Sopenharmony_ci if (!(rc & PX_CFG_PXC200F)) { 469762306a36Sopenharmony_ci pr_debug("%d: PXC200_muxsel: not PXC200F rc:%d\n", 469862306a36Sopenharmony_ci btv->c.nr, rc); 469962306a36Sopenharmony_ci return; 470062306a36Sopenharmony_ci } 470162306a36Sopenharmony_ci 470262306a36Sopenharmony_ci 470362306a36Sopenharmony_ci /* The multiplexer in the 200F is handled by the GPIO port */ 470462306a36Sopenharmony_ci /* get correct mapping between inputs */ 470562306a36Sopenharmony_ci /* mux = bttv_tvcards[btv->type].muxsel[input] & 3; */ 470662306a36Sopenharmony_ci /* ** not needed!? */ 470762306a36Sopenharmony_ci mux = input; 470862306a36Sopenharmony_ci 470962306a36Sopenharmony_ci /* make sure output pins are enabled */ 471062306a36Sopenharmony_ci /* bitmask=0x30f; */ 471162306a36Sopenharmony_ci bitmask=0x302; 471262306a36Sopenharmony_ci /* check whether we have a PXC200A */ 471362306a36Sopenharmony_ci if (btv->cardid == PX_PXC200A_CARDID) { 471462306a36Sopenharmony_ci bitmask ^= 0x180; /* use 7 and 9, not 8 and 9 */ 471562306a36Sopenharmony_ci bitmask |= 7<<4; /* the DAC */ 471662306a36Sopenharmony_ci } 471762306a36Sopenharmony_ci btwrite(bitmask, BT848_GPIO_OUT_EN); 471862306a36Sopenharmony_ci 471962306a36Sopenharmony_ci bitmask = btread(BT848_GPIO_DATA); 472062306a36Sopenharmony_ci if (btv->cardid == PX_PXC200A_CARDID) 472162306a36Sopenharmony_ci bitmask = (bitmask & ~0x280) | ((mux & 2) << 8) | ((mux & 1) << 7); 472262306a36Sopenharmony_ci else /* older device */ 472362306a36Sopenharmony_ci bitmask = (bitmask & ~0x300) | ((mux & 3) << 8); 472462306a36Sopenharmony_ci btwrite(bitmask,BT848_GPIO_DATA); 472562306a36Sopenharmony_ci 472662306a36Sopenharmony_ci /* 472762306a36Sopenharmony_ci * Was "to be safe, set the bt848 to input 0" 472862306a36Sopenharmony_ci * Actually, since it's ok at load time, better not messing 472962306a36Sopenharmony_ci * with these bits (on PXC200AF you need to set mux 2 here) 473062306a36Sopenharmony_ci * 473162306a36Sopenharmony_ci * needed because bttv-driver sets mux before calling this function 473262306a36Sopenharmony_ci */ 473362306a36Sopenharmony_ci if (btv->cardid == PX_PXC200A_CARDID) 473462306a36Sopenharmony_ci btaor(2<<5, ~BT848_IFORM_MUXSEL, BT848_IFORM); 473562306a36Sopenharmony_ci else /* older device */ 473662306a36Sopenharmony_ci btand(~BT848_IFORM_MUXSEL,BT848_IFORM); 473762306a36Sopenharmony_ci 473862306a36Sopenharmony_ci pr_debug("%d: setting input channel to:%d\n", btv->c.nr, (int)mux); 473962306a36Sopenharmony_ci} 474062306a36Sopenharmony_ci 474162306a36Sopenharmony_cistatic void phytec_muxsel(struct bttv *btv, unsigned int input) 474262306a36Sopenharmony_ci{ 474362306a36Sopenharmony_ci unsigned int mux = input % 4; 474462306a36Sopenharmony_ci 474562306a36Sopenharmony_ci if (input == btv->svhs) 474662306a36Sopenharmony_ci mux = 0; 474762306a36Sopenharmony_ci 474862306a36Sopenharmony_ci gpio_bits(0x3, mux); 474962306a36Sopenharmony_ci} 475062306a36Sopenharmony_ci 475162306a36Sopenharmony_ci/* 475262306a36Sopenharmony_ci * GeoVision GV-800(S) functions 475362306a36Sopenharmony_ci * Bruno Christo <bchristo@inf.ufsm.br> 475462306a36Sopenharmony_ci*/ 475562306a36Sopenharmony_ci 475662306a36Sopenharmony_ci/* This is a function to control the analog switch, which determines which 475762306a36Sopenharmony_ci * camera is routed to which controller. The switch comprises an X-address 475862306a36Sopenharmony_ci * (gpio bits 0-3, representing the camera, ranging from 0-15), and a 475962306a36Sopenharmony_ci * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3). 476062306a36Sopenharmony_ci * A data value (gpio bit 18) of '1' enables the switch, and '0' disables 476162306a36Sopenharmony_ci * the switch. A STROBE bit (gpio bit 17) latches the data value into the 476262306a36Sopenharmony_ci * specified address. There is also a chip select (gpio bit 16). 476362306a36Sopenharmony_ci * The idea is to set the address and chip select together, bring 476462306a36Sopenharmony_ci * STROBE high, write the data, and finally bring STROBE back to low. 476562306a36Sopenharmony_ci */ 476662306a36Sopenharmony_cistatic void gv800s_write(struct bttv *btv, 476762306a36Sopenharmony_ci unsigned char xaddr, 476862306a36Sopenharmony_ci unsigned char yaddr, 476962306a36Sopenharmony_ci unsigned char data) { 477062306a36Sopenharmony_ci /* On the "master" 878A: 477162306a36Sopenharmony_ci * GPIO bits 0-9 are used for the analog switch: 477262306a36Sopenharmony_ci * 00 - 03: camera selector 477362306a36Sopenharmony_ci * 04 - 06: 878A (controller) selector 477462306a36Sopenharmony_ci * 16: cselect 477562306a36Sopenharmony_ci * 17: strobe 477662306a36Sopenharmony_ci * 18: data (1->on, 0->off) 477762306a36Sopenharmony_ci * 19: reset 477862306a36Sopenharmony_ci */ 477962306a36Sopenharmony_ci const u32 ADDRESS = ((xaddr&0xf) | (yaddr&3)<<4); 478062306a36Sopenharmony_ci const u32 CSELECT = 1<<16; 478162306a36Sopenharmony_ci const u32 STROBE = 1<<17; 478262306a36Sopenharmony_ci const u32 DATA = data<<18; 478362306a36Sopenharmony_ci 478462306a36Sopenharmony_ci gpio_bits(0x1007f, ADDRESS | CSELECT); /* write ADDRESS and CSELECT */ 478562306a36Sopenharmony_ci gpio_bits(0x20000, STROBE); /* STROBE high */ 478662306a36Sopenharmony_ci gpio_bits(0x40000, DATA); /* write DATA */ 478762306a36Sopenharmony_ci gpio_bits(0x20000, ~STROBE); /* STROBE low */ 478862306a36Sopenharmony_ci} 478962306a36Sopenharmony_ci 479062306a36Sopenharmony_ci/* 479162306a36Sopenharmony_ci * GeoVision GV-800(S) muxsel 479262306a36Sopenharmony_ci * 479362306a36Sopenharmony_ci * Each of the 4 cards (controllers) use this function. 479462306a36Sopenharmony_ci * The controller using this function selects the input through the GPIO pins 479562306a36Sopenharmony_ci * of the "master" card. A pointer to this card is stored in master[btv->c.nr]. 479662306a36Sopenharmony_ci * 479762306a36Sopenharmony_ci * The parameter 'input' is the requested camera number (0-4) on the controller. 479862306a36Sopenharmony_ci * The map array has the address of each input. Note that the addresses in the 479962306a36Sopenharmony_ci * array are in the sequence the original GeoVision driver uses, that is, set 480062306a36Sopenharmony_ci * every controller to input 0, then to input 1, 2, 3, repeat. This means that 480162306a36Sopenharmony_ci * the physical "camera 1" connector corresponds to controller 0 input 0, 480262306a36Sopenharmony_ci * "camera 2" corresponds to controller 1 input 0, and so on. 480362306a36Sopenharmony_ci * 480462306a36Sopenharmony_ci * After getting the input address, the function then writes the appropriate 480562306a36Sopenharmony_ci * data to the analog switch, and housekeeps the local copy of the switch 480662306a36Sopenharmony_ci * information. 480762306a36Sopenharmony_ci */ 480862306a36Sopenharmony_cistatic void gv800s_muxsel(struct bttv *btv, unsigned int input) 480962306a36Sopenharmony_ci{ 481062306a36Sopenharmony_ci struct bttv *mctlr; 481162306a36Sopenharmony_ci int xaddr, yaddr; 481262306a36Sopenharmony_ci static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 }, 481362306a36Sopenharmony_ci { 0x1, 0x5, 0xb, 0x7 }, 481462306a36Sopenharmony_ci { 0x2, 0x8, 0xc, 0xe }, 481562306a36Sopenharmony_ci { 0x3, 0x9, 0xd, 0xf } }; 481662306a36Sopenharmony_ci input = input%4; 481762306a36Sopenharmony_ci mctlr = master[btv->c.nr]; 481862306a36Sopenharmony_ci if (mctlr == NULL) { 481962306a36Sopenharmony_ci /* do nothing until the "master" is detected */ 482062306a36Sopenharmony_ci return; 482162306a36Sopenharmony_ci } 482262306a36Sopenharmony_ci yaddr = (btv->c.nr - mctlr->c.nr) & 3; 482362306a36Sopenharmony_ci xaddr = map[yaddr][input] & 0xf; 482462306a36Sopenharmony_ci 482562306a36Sopenharmony_ci /* Check if the controller/camera pair has changed, ignore otherwise */ 482662306a36Sopenharmony_ci if (mctlr->sw_status[yaddr] != xaddr) { 482762306a36Sopenharmony_ci /* disable the old switch, enable the new one and save status */ 482862306a36Sopenharmony_ci gv800s_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0); 482962306a36Sopenharmony_ci mctlr->sw_status[yaddr] = xaddr; 483062306a36Sopenharmony_ci gv800s_write(mctlr, xaddr, yaddr, 1); 483162306a36Sopenharmony_ci } 483262306a36Sopenharmony_ci} 483362306a36Sopenharmony_ci 483462306a36Sopenharmony_ci/* GeoVision GV-800(S) "master" chip init */ 483562306a36Sopenharmony_cistatic void gv800s_init(struct bttv *btv) 483662306a36Sopenharmony_ci{ 483762306a36Sopenharmony_ci int ix; 483862306a36Sopenharmony_ci 483962306a36Sopenharmony_ci gpio_inout(0xf107f, 0xf107f); 484062306a36Sopenharmony_ci gpio_write(1<<19); /* reset the analog MUX */ 484162306a36Sopenharmony_ci gpio_write(0); 484262306a36Sopenharmony_ci 484362306a36Sopenharmony_ci /* Preset camera 0 to the 4 controllers */ 484462306a36Sopenharmony_ci for (ix = 0; ix < 4; ix++) { 484562306a36Sopenharmony_ci btv->sw_status[ix] = ix; 484662306a36Sopenharmony_ci gv800s_write(btv, ix, ix, 1); 484762306a36Sopenharmony_ci } 484862306a36Sopenharmony_ci 484962306a36Sopenharmony_ci /* Inputs on the "master" controller need this brightness fix */ 485062306a36Sopenharmony_ci bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1); 485162306a36Sopenharmony_ci 485262306a36Sopenharmony_ci if (btv->c.nr > BTTV_MAX-4) 485362306a36Sopenharmony_ci return; 485462306a36Sopenharmony_ci /* 485562306a36Sopenharmony_ci * Store the "master" controller pointer in the master 485662306a36Sopenharmony_ci * array for later use in the muxsel function. 485762306a36Sopenharmony_ci */ 485862306a36Sopenharmony_ci master[btv->c.nr] = btv; 485962306a36Sopenharmony_ci master[btv->c.nr+1] = btv; 486062306a36Sopenharmony_ci master[btv->c.nr+2] = btv; 486162306a36Sopenharmony_ci master[btv->c.nr+3] = btv; 486262306a36Sopenharmony_ci} 486362306a36Sopenharmony_ci 486462306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */ 486562306a36Sopenharmony_ci/* motherboard chipset specific stuff */ 486662306a36Sopenharmony_ci 486762306a36Sopenharmony_civoid __init bttv_check_chipset(void) 486862306a36Sopenharmony_ci{ 486962306a36Sopenharmony_ci struct pci_dev *dev = NULL; 487062306a36Sopenharmony_ci 487162306a36Sopenharmony_ci if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF)) 487262306a36Sopenharmony_ci triton1 = 1; 487362306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_VSFX) 487462306a36Sopenharmony_ci vsfx = 1; 487562306a36Sopenharmony_ci#ifdef PCIPCI_ALIMAGIK 487662306a36Sopenharmony_ci if (pci_pci_problems & PCIPCI_ALIMAGIK) 487762306a36Sopenharmony_ci latency = 0x0A; 487862306a36Sopenharmony_ci#endif 487962306a36Sopenharmony_ci 488062306a36Sopenharmony_ci 488162306a36Sopenharmony_ci /* print warnings about any quirks found */ 488262306a36Sopenharmony_ci if (triton1) 488362306a36Sopenharmony_ci pr_info("Host bridge needs ETBF enabled\n"); 488462306a36Sopenharmony_ci if (vsfx) 488562306a36Sopenharmony_ci pr_info("Host bridge needs VSFX enabled\n"); 488662306a36Sopenharmony_ci if (UNSET != latency) 488762306a36Sopenharmony_ci pr_info("pci latency fixup [%d]\n", latency); 488862306a36Sopenharmony_ci while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL, 488962306a36Sopenharmony_ci PCI_DEVICE_ID_INTEL_82441, dev))) { 489062306a36Sopenharmony_ci unsigned char b; 489162306a36Sopenharmony_ci pci_read_config_byte(dev, 0x53, &b); 489262306a36Sopenharmony_ci if (bttv_debug) 489362306a36Sopenharmony_ci pr_info("Host bridge: 82441FX Natoma, bufcon=0x%02x\n", 489462306a36Sopenharmony_ci b); 489562306a36Sopenharmony_ci } 489662306a36Sopenharmony_ci} 489762306a36Sopenharmony_ci 489862306a36Sopenharmony_ciint bttv_handle_chipset(struct bttv *btv) 489962306a36Sopenharmony_ci{ 490062306a36Sopenharmony_ci unsigned char command; 490162306a36Sopenharmony_ci 490262306a36Sopenharmony_ci if (!triton1 && !vsfx && UNSET == latency) 490362306a36Sopenharmony_ci return 0; 490462306a36Sopenharmony_ci 490562306a36Sopenharmony_ci if (bttv_verbose) { 490662306a36Sopenharmony_ci if (triton1) 490762306a36Sopenharmony_ci pr_info("%d: enabling ETBF (430FX/VP3 compatibility)\n", 490862306a36Sopenharmony_ci btv->c.nr); 490962306a36Sopenharmony_ci if (vsfx && btv->id >= 878) 491062306a36Sopenharmony_ci pr_info("%d: enabling VSFX\n", btv->c.nr); 491162306a36Sopenharmony_ci if (UNSET != latency) 491262306a36Sopenharmony_ci pr_info("%d: setting pci timer to %d\n", 491362306a36Sopenharmony_ci btv->c.nr, latency); 491462306a36Sopenharmony_ci } 491562306a36Sopenharmony_ci 491662306a36Sopenharmony_ci if (btv->id < 878) { 491762306a36Sopenharmony_ci /* bt848 (mis)uses a bit in the irq mask for etbf */ 491862306a36Sopenharmony_ci if (triton1) 491962306a36Sopenharmony_ci btv->triton1 = BT848_INT_ETBF; 492062306a36Sopenharmony_ci } else { 492162306a36Sopenharmony_ci /* bt878 has a bit in the pci config space for it */ 492262306a36Sopenharmony_ci pci_read_config_byte(btv->c.pci, BT878_DEVCTRL, &command); 492362306a36Sopenharmony_ci if (triton1) 492462306a36Sopenharmony_ci command |= BT878_EN_TBFX; 492562306a36Sopenharmony_ci if (vsfx) 492662306a36Sopenharmony_ci command |= BT878_EN_VSFX; 492762306a36Sopenharmony_ci pci_write_config_byte(btv->c.pci, BT878_DEVCTRL, command); 492862306a36Sopenharmony_ci } 492962306a36Sopenharmony_ci if (UNSET != latency) 493062306a36Sopenharmony_ci pci_write_config_byte(btv->c.pci, PCI_LATENCY_TIMER, latency); 493162306a36Sopenharmony_ci return 0; 493262306a36Sopenharmony_ci} 4933