4934 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 4 bttv-cards.c5 6 this file has configuration information - card-specific stuff7 like the big tvcards array for the most part8 9 Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de)10 & Marcus Metzler (mocm@thp.uni-koeln.de)11 (c) 1999-2001 Gerd Knorr <kraxel@goldbach.in-berlin.de>12 13 14*/15 16#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt17 18#include <linux/delay.h>19#include <linux/module.h>20#include <linux/kmod.h>21#include <linux/init.h>22#include <linux/pci.h>23#include <linux/vmalloc.h>24#include <linux/firmware.h>25#include <net/checksum.h>26 27#include <linux/unaligned.h>28#include <asm/io.h>29 30#include "bttvp.h"31#include <media/v4l2-common.h>32#include <media/i2c/tvaudio.h>33#include "bttv-audio-hook.h"34 35/* fwd decl */36static void boot_msp34xx(struct bttv *btv, int pin);37static void hauppauge_eeprom(struct bttv *btv);38static void avermedia_eeprom(struct bttv *btv);39static void osprey_eeprom(struct bttv *btv, const u8 ee[256]);40static void modtec_eeprom(struct bttv *btv);41static void init_PXC200(struct bttv *btv);42static void init_RTV24(struct bttv *btv);43static void init_PCI8604PW(struct bttv *btv);44 45static void rv605_muxsel(struct bttv *btv, unsigned int input);46static void eagle_muxsel(struct bttv *btv, unsigned int input);47static void xguard_muxsel(struct bttv *btv, unsigned int input);48static void ivc120_muxsel(struct bttv *btv, unsigned int input);49static void gvc1100_muxsel(struct bttv *btv, unsigned int input);50 51static void PXC200_muxsel(struct bttv *btv, unsigned int input);52 53static void picolo_tetra_muxsel(struct bttv *btv, unsigned int input);54static void picolo_tetra_init(struct bttv *btv);55 56static void tibetCS16_muxsel(struct bttv *btv, unsigned int input);57static void tibetCS16_init(struct bttv *btv);58 59static void kodicom4400r_muxsel(struct bttv *btv, unsigned int input);60static void kodicom4400r_init(struct bttv *btv);61 62static void sigmaSLC_muxsel(struct bttv *btv, unsigned int input);63static void sigmaSQ_muxsel(struct bttv *btv, unsigned int input);64 65static void geovision_muxsel(struct bttv *btv, unsigned int input);66 67static void phytec_muxsel(struct bttv *btv, unsigned int input);68 69static void gv800s_muxsel(struct bttv *btv, unsigned int input);70static void gv800s_init(struct bttv *btv);71 72static void td3116_muxsel(struct bttv *btv, unsigned int input);73 74static int terratec_active_radio_upgrade(struct bttv *btv);75static int tea575x_init(struct bttv *btv);76static void identify_by_eeprom(struct bttv *btv,77 unsigned char eeprom_data[256]);78static int pvr_boot(struct bttv *btv);79 80/* config variables */81static unsigned int triton1;82static unsigned int vsfx;83static unsigned int latency = UNSET;84 85static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };86static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };87static unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };88static unsigned int svhs[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };89static unsigned int remote[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };90static unsigned int audiodev[BTTV_MAX];91static unsigned int saa6588[BTTV_MAX];92static struct bttv *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL };93static unsigned int autoload = UNSET;94static unsigned int gpiomask = UNSET;95static unsigned int audioall = UNSET;96static unsigned int audiomux[5] = { [ 0 ... 4 ] = UNSET };97 98/* insmod options */99module_param(triton1, int, 0444);100module_param(vsfx, int, 0444);101module_param(latency, int, 0444);102module_param(gpiomask, int, 0444);103module_param(audioall, int, 0444);104module_param(autoload, int, 0444);105 106module_param_array(card, int, NULL, 0444);107module_param_array(pll, int, NULL, 0444);108module_param_array(tuner, int, NULL, 0444);109module_param_array(svhs, int, NULL, 0444);110module_param_array(remote, int, NULL, 0444);111module_param_array(audiodev, int, NULL, 0444);112module_param_array(audiomux, int, NULL, 0444);113 114MODULE_PARM_DESC(triton1, "set ETBF pci config bit [enable bug compatibility for triton1 + others]");115MODULE_PARM_DESC(vsfx, "set VSFX pci config bit [yet another chipset flaw workaround]");116MODULE_PARM_DESC(latency,"pci latency timer");117MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list");118MODULE_PARM_DESC(pll, "specify installed crystal (0=none, 28=28 MHz, 35=35 MHz, 14=14 MHz)");119MODULE_PARM_DESC(tuner,"specify installed tuner type");120MODULE_PARM_DESC(autoload, "obsolete option, please do not use anymore");121MODULE_PARM_DESC(audiodev, "specify audio device:\n"122 "\t\t-1 = no audio\n"123 "\t\t 0 = autodetect (default)\n"124 "\t\t 1 = msp3400\n"125 "\t\t 2 = tda7432\n"126 "\t\t 3 = tvaudio");127MODULE_PARM_DESC(saa6588, "if 1, then load the saa6588 RDS module, default (0) is to use the card definition.");128 129MODULE_FIRMWARE("hcwamc.rbf");130 131/* I2C addresses list */132#define I2C_ADDR_TDA7432 0x8a133#define I2C_ADDR_MSP3400 0x80134#define I2C_ADDR_MSP3400_ALT 0x88135 136 137/* ----------------------------------------------------------------------- */138/* list of card IDs for bt878+ cards */139 140static struct CARD {141 unsigned id;142 int cardnr;143 char *name;144} cards[] = {145 { 0x13eb0070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV" },146 { 0x39000070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV-D" },147 { 0x45000070, BTTV_BOARD_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" },148 { 0xff000070, BTTV_BOARD_OSPREY1x0, "Osprey-100" },149 { 0xff010070, BTTV_BOARD_OSPREY2x0_SVID,"Osprey-200" },150 { 0xff020070, BTTV_BOARD_OSPREY500, "Osprey-500" },151 { 0xff030070, BTTV_BOARD_OSPREY2000, "Osprey-2000" },152 { 0xff040070, BTTV_BOARD_OSPREY540, "Osprey-540" },153 { 0xff070070, BTTV_BOARD_OSPREY440, "Osprey-440" },154 155 { 0x00011002, BTTV_BOARD_ATI_TVWONDER, "ATI TV Wonder" },156 { 0x00031002, BTTV_BOARD_ATI_TVWONDERVE,"ATI TV Wonder/VE" },157 158 { 0x6606107d, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" },159 { 0x6607107d, BTTV_BOARD_WINFASTVC100, "Leadtek WinFast VC 100" },160 { 0x6609107d, BTTV_BOARD_WINFAST2000, "Leadtek TV 2000 XP" },161 { 0x263610b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" },162 { 0x264510b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" },163 { 0x402010fc, BTTV_BOARD_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" },164 { 0x405010fc, BTTV_BOARD_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" },165 { 0x407010fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" },166 { 0xd01810fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" },167 168 { 0x001211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" },169 /* some cards ship with byteswapped IDs ... */170 { 0x1200bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" },171 { 0xff00bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" },172 /* this seems to happen as well ... */173 { 0xff1211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" },174 175 { 0x3000121a, BTTV_BOARD_VOODOOTV_200, "3Dfx VoodooTV 200" },176 { 0x263710b4, BTTV_BOARD_VOODOOTV_FM, "3Dfx VoodooTV FM" },177 { 0x3060121a, BTTV_BOARD_STB2, "3Dfx VoodooTV 100/ STB OEM" },178 179 { 0x3000144f, BTTV_BOARD_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" },180 { 0xa005144f, BTTV_BOARD_MAGICTVIEW063, "CPH06X TView99-Card" },181 { 0x3002144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" },182 { 0x3005144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" },183 { 0x5000144f, BTTV_BOARD_MAGICTVIEW061, "Askey CPH050" },184 { 0x300014ff, BTTV_BOARD_MAGICTVIEW061, "TView 99 (CPH061)" },185 { 0x300214ff, BTTV_BOARD_PHOEBE_TVMAS, "Phoebe TV Master (CPH060)" },186 187 { 0x00011461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" },188 { 0x00021461, BTTV_BOARD_AVERMEDIA98, "AVermedia TVCapture 98" },189 { 0x00031461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" },190 { 0x00041461, BTTV_BOARD_AVERMEDIA98, "AVerMedia TVCapture 98" },191 { 0x03001461, BTTV_BOARD_AVERMEDIA98, "VDOMATE TV TUNER CARD" },192 193 { 0x1117153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL B/G)" },194 { 0x1118153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL B/G)" },195 { 0x1119153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL I)" },196 { 0x111a153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL I)" },197 198 { 0x1123153b, BTTV_BOARD_TERRATVRADIO, "Terratec TV Radio+" },199 { 0x1127153b, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.05)" },200 /* clashes with FlyVideo201 *{ 0x18521852, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.10)" }, */202 { 0x1134153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (LR102)" },203 { 0x1135153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" }, /* LR102 */204 { 0x5018153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue" }, /* ?? */205 { 0xff3b153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" }, /* ?? */206 207 { 0x400015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" },208 { 0x400a15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" },209 { 0x400d15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },210 { 0x401015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },211 { 0x401615b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },212 213 { 0x1430aa00, BTTV_BOARD_PV143, "Provideo PV143A" },214 { 0x1431aa00, BTTV_BOARD_PV143, "Provideo PV143B" },215 { 0x1432aa00, BTTV_BOARD_PV143, "Provideo PV143C" },216 { 0x1433aa00, BTTV_BOARD_PV143, "Provideo PV143D" },217 { 0x1433aa03, BTTV_BOARD_PV143, "Security Eyes" },218 219 { 0x1460aa00, BTTV_BOARD_PV150, "Provideo PV150A-1" },220 { 0x1461aa01, BTTV_BOARD_PV150, "Provideo PV150A-2" },221 { 0x1462aa02, BTTV_BOARD_PV150, "Provideo PV150A-3" },222 { 0x1463aa03, BTTV_BOARD_PV150, "Provideo PV150A-4" },223 224 { 0x1464aa04, BTTV_BOARD_PV150, "Provideo PV150B-1" },225 { 0x1465aa05, BTTV_BOARD_PV150, "Provideo PV150B-2" },226 { 0x1466aa06, BTTV_BOARD_PV150, "Provideo PV150B-3" },227 { 0x1467aa07, BTTV_BOARD_PV150, "Provideo PV150B-4" },228 229 { 0xa132ff00, BTTV_BOARD_IVC100, "IVC-100" },230 { 0xa1550000, BTTV_BOARD_IVC200, "IVC-200" },231 { 0xa1550001, BTTV_BOARD_IVC200, "IVC-200" },232 { 0xa1550002, BTTV_BOARD_IVC200, "IVC-200" },233 { 0xa1550003, BTTV_BOARD_IVC200, "IVC-200" },234 { 0xa1550100, BTTV_BOARD_IVC200, "IVC-200G" },235 { 0xa1550101, BTTV_BOARD_IVC200, "IVC-200G" },236 { 0xa1550102, BTTV_BOARD_IVC200, "IVC-200G" },237 { 0xa1550103, BTTV_BOARD_IVC200, "IVC-200G" },238 { 0xa1550800, BTTV_BOARD_IVC200, "IVC-200" },239 { 0xa1550801, BTTV_BOARD_IVC200, "IVC-200" },240 { 0xa1550802, BTTV_BOARD_IVC200, "IVC-200" },241 { 0xa1550803, BTTV_BOARD_IVC200, "IVC-200" },242 { 0xa182ff00, BTTV_BOARD_IVC120, "IVC-120G" },243 { 0xa182ff01, BTTV_BOARD_IVC120, "IVC-120G" },244 { 0xa182ff02, BTTV_BOARD_IVC120, "IVC-120G" },245 { 0xa182ff03, BTTV_BOARD_IVC120, "IVC-120G" },246 { 0xa182ff04, BTTV_BOARD_IVC120, "IVC-120G" },247 { 0xa182ff05, BTTV_BOARD_IVC120, "IVC-120G" },248 { 0xa182ff06, BTTV_BOARD_IVC120, "IVC-120G" },249 { 0xa182ff07, BTTV_BOARD_IVC120, "IVC-120G" },250 { 0xa182ff08, BTTV_BOARD_IVC120, "IVC-120G" },251 { 0xa182ff09, BTTV_BOARD_IVC120, "IVC-120G" },252 { 0xa182ff0a, BTTV_BOARD_IVC120, "IVC-120G" },253 { 0xa182ff0b, BTTV_BOARD_IVC120, "IVC-120G" },254 { 0xa182ff0c, BTTV_BOARD_IVC120, "IVC-120G" },255 { 0xa182ff0d, BTTV_BOARD_IVC120, "IVC-120G" },256 { 0xa182ff0e, BTTV_BOARD_IVC120, "IVC-120G" },257 { 0xa182ff0f, BTTV_BOARD_IVC120, "IVC-120G" },258 { 0xf0500000, BTTV_BOARD_IVCE8784, "IVCE-8784" },259 { 0xf0500001, BTTV_BOARD_IVCE8784, "IVCE-8784" },260 { 0xf0500002, BTTV_BOARD_IVCE8784, "IVCE-8784" },261 { 0xf0500003, BTTV_BOARD_IVCE8784, "IVCE-8784" },262 263 { 0x41424344, BTTV_BOARD_GRANDTEC, "GrandTec Multi Capture" },264 { 0x01020304, BTTV_BOARD_XGUARD, "Grandtec Grand X-Guard" },265 266 { 0x18501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },267 { 0xa0501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },268 { 0x18511851, BTTV_BOARD_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" },269 { 0x18521852, BTTV_BOARD_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" },270 { 0x41a0a051, BTTV_BOARD_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" },271 { 0x18501f7f, BTTV_BOARD_FLYVIDEO_98, "Lifeview Flyvideo 98" },272 273 { 0x010115cb, BTTV_BOARD_GMV1, "AG GMV1" },274 { 0x010114c7, BTTV_BOARD_MODTEC_205, "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" },275 276 { 0x10b42636, BTTV_BOARD_HAUPPAUGE878, "STB ???" },277 { 0x217d6606, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" },278 { 0xfff6f6ff, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" },279 { 0x03116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 311" },280 { 0x06116000, BTTV_BOARD_SENSORAY311_611, "Sensoray 611" },281 { 0x00790e11, BTTV_BOARD_WINDVR, "Canopus WinDVR PCI" },282 { 0xa0fca1a0, BTTV_BOARD_ZOLTRIX, "Face to Face Tvmax" },283 { 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" },284 { 0x146caa0c, BTTV_BOARD_PV951, "ituner spectra8" },285 { 0x200a1295, BTTV_BOARD_PXC200, "ImageNation PXC200A" },286 287 { 0x40111554, BTTV_BOARD_PV_BT878P_9B, "Prolink Pixelview PV-BT" },288 { 0x17de0a01, BTTV_BOARD_KWORLD, "Mecer TV/FM/Video Tuner" },289 290 { 0x01051805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #1" },291 { 0x01061805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #2" },292 { 0x01071805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #3" },293 { 0x01081805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #4" },294 295 { 0x15409511, BTTV_BOARD_ACORP_Y878F, "Acorp Y878F" },296 297 { 0x53534149, BTTV_BOARD_SSAI_SECURITY, "SSAI Security Video Interface" },298 { 0x5353414a, BTTV_BOARD_SSAI_ULTRASOUND, "SSAI Ultrasound Video Interface" },299 300 /* likely broken, vendor id doesn't match the other magic views ...301 * { 0xa0fca04f, BTTV_BOARD_MAGICTVIEW063, "Guillemot Maxi TV Video 3" }, */302 303 /* Duplicate PCI ID, reconfigure for this board during the eeprom read.304 * { 0x13eb0070, BTTV_BOARD_HAUPPAUGE_IMPACTVCB, "Hauppauge ImpactVCB" }, */305 306 { 0x109e036e, BTTV_BOARD_CONCEPTRONIC_CTVFMI2, "Conceptronic CTVFMi v2"},307 308 /* DVB cards (using pci function .1 for mpeg data xfer) */309 { 0x001c11bd, BTTV_BOARD_PINNACLESAT, "Pinnacle PCTV Sat" },310 { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" },311 { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV"},312 { 0x002611bd, BTTV_BOARD_TWINHAN_DST, "Pinnacle PCTV SAT CI" },313 { 0x00011822, BTTV_BOARD_TWINHAN_DST, "Twinhan VisionPlus DVB" },314 { 0xfc00270f, BTTV_BOARD_TWINHAN_DST, "ChainTech digitop DST-1000 DVB-S" },315 { 0x07711461, BTTV_BOARD_AVDVBT_771, "AVermedia AverTV DVB-T 771" },316 { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" },317 { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE, "DViCO FusionHDTV DVB-T Lite" },318 { 0xdb1118ac, BTTV_BOARD_DVICO_DVBT_LITE, "Ultraview DVB-T Lite" },319 { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE, "DViCO FusionHDTV 5 Lite" },320 { 0x00261822, BTTV_BOARD_TWINHAN_DST, "DNTV Live! Mini "},321 { 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },322 { 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },323 { 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },324 { 0x763d800a, BTTV_BOARD_GEOVISION_GV800S, "GeoVision GV-800(S) (master)" },325 { 0x763d800b, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },326 { 0x763d800c, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },327 { 0x763d800d, BTTV_BOARD_GEOVISION_GV800S_SL, "GeoVision GV-800(S) (slave)" },328 329 { 0x15401830, BTTV_BOARD_PV183, "Provideo PV183-1" },330 { 0x15401831, BTTV_BOARD_PV183, "Provideo PV183-2" },331 { 0x15401832, BTTV_BOARD_PV183, "Provideo PV183-3" },332 { 0x15401833, BTTV_BOARD_PV183, "Provideo PV183-4" },333 { 0x15401834, BTTV_BOARD_PV183, "Provideo PV183-5" },334 { 0x15401835, BTTV_BOARD_PV183, "Provideo PV183-6" },335 { 0x15401836, BTTV_BOARD_PV183, "Provideo PV183-7" },336 { 0x15401837, BTTV_BOARD_PV183, "Provideo PV183-8" },337 { 0x3116f200, BTTV_BOARD_TVT_TD3116, "Tongwei Video Technology TD-3116" },338 { 0x02280279, BTTV_BOARD_APOSONIC_WDVR, "Aposonic W-DVR" },339 { 0, -1, NULL }340};341 342/* ----------------------------------------------------------------------- */343/* array with description for bt848 / bt878 tv/grabber cards */344 345struct tvcard bttv_tvcards[] = {346 /* ---- card 0x00 ---------------------------------- */347 [BTTV_BOARD_UNKNOWN] = {348 .name = " *** UNKNOWN/GENERIC *** ",349 .video_inputs = 4,350 .svhs = 2,351 .muxsel = MUXSEL(2, 3, 1, 0),352 .tuner_type = UNSET,353 .tuner_addr = ADDR_UNSET,354 },355 [BTTV_BOARD_MIRO] = {356 .name = "MIRO PCTV",357 .video_inputs = 4,358 /* .audio_inputs= 1, */359 .svhs = 2,360 .gpiomask = 15,361 .muxsel = MUXSEL(2, 3, 1, 1),362 .gpiomux = { 2, 0, 0, 0 },363 .gpiomute = 10,364 .tuner_type = UNSET,365 .tuner_addr = ADDR_UNSET,366 },367 [BTTV_BOARD_HAUPPAUGE] = {368 .name = "Hauppauge (bt848)",369 .video_inputs = 4,370 /* .audio_inputs= 1, */371 .svhs = 2,372 .gpiomask = 7,373 .muxsel = MUXSEL(2, 3, 1, 1),374 .gpiomux = { 0, 1, 2, 3 },375 .gpiomute = 4,376 .tuner_type = UNSET,377 .tuner_addr = ADDR_UNSET,378 },379 [BTTV_BOARD_STB] = {380 .name = "STB, Gateway P/N 6000699 (bt848)",381 .video_inputs = 3,382 /* .audio_inputs= 1, */383 .svhs = 2,384 .gpiomask = 7,385 .muxsel = MUXSEL(2, 3, 1, 1),386 .gpiomux = { 4, 0, 2, 3 },387 .gpiomute = 1,388 .no_msp34xx = 1,389 .tuner_type = TUNER_PHILIPS_NTSC,390 .tuner_addr = ADDR_UNSET,391 .pll = PLL_28,392 .has_radio = 1,393 },394 395 /* ---- card 0x04 ---------------------------------- */396 [BTTV_BOARD_INTEL] = {397 .name = "Intel Create and Share PCI/ Smart Video Recorder III",398 .video_inputs = 4,399 /* .audio_inputs= 0, */400 .svhs = 2,401 .gpiomask = 0,402 .muxsel = MUXSEL(2, 3, 1, 1),403 .gpiomux = { 0 },404 .tuner_type = TUNER_ABSENT,405 .tuner_addr = ADDR_UNSET,406 },407 [BTTV_BOARD_DIAMOND] = {408 .name = "Diamond DTV2000",409 .video_inputs = 4,410 /* .audio_inputs= 1, */411 .svhs = 2,412 .gpiomask = 3,413 .muxsel = MUXSEL(2, 3, 1, 0),414 .gpiomux = { 0, 1, 0, 1 },415 .gpiomute = 3,416 .tuner_type = UNSET,417 .tuner_addr = ADDR_UNSET,418 },419 [BTTV_BOARD_AVERMEDIA] = {420 .name = "AVerMedia TVPhone",421 .video_inputs = 3,422 /* .audio_inputs= 1, */423 .svhs = 3,424 .muxsel = MUXSEL(2, 3, 1, 1),425 .gpiomask = 0x0f,426 .gpiomux = { 0x0c, 0x04, 0x08, 0x04 },427 /* 0x04 for some cards ?? */428 .tuner_type = UNSET,429 .tuner_addr = ADDR_UNSET,430 .audio_mode_gpio= avermedia_tvphone_audio,431 .has_remote = 1,432 },433 [BTTV_BOARD_MATRIX_VISION] = {434 .name = "MATRIX-Vision MV-Delta",435 .video_inputs = 5,436 /* .audio_inputs= 1, */437 .svhs = 3,438 .gpiomask = 0,439 .muxsel = MUXSEL(2, 3, 1, 0, 0),440 .gpiomux = { 0 },441 .tuner_type = TUNER_ABSENT,442 .tuner_addr = ADDR_UNSET,443 },444 445 /* ---- card 0x08 ---------------------------------- */446 [BTTV_BOARD_FLYVIDEO] = {447 .name = "Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26",448 .video_inputs = 4,449 /* .audio_inputs= 1, */450 .svhs = 2,451 .gpiomask = 0xc00,452 .muxsel = MUXSEL(2, 3, 1, 1),453 .gpiomux = { 0, 0xc00, 0x800, 0x400 },454 .gpiomute = 0xc00,455 .pll = PLL_28,456 .tuner_type = UNSET,457 .tuner_addr = ADDR_UNSET,458 },459 [BTTV_BOARD_TURBOTV] = {460 .name = "IMS/IXmicro TurboTV",461 .video_inputs = 3,462 /* .audio_inputs= 1, */463 .svhs = 2,464 .gpiomask = 3,465 .muxsel = MUXSEL(2, 3, 1, 1),466 .gpiomux = { 1, 1, 2, 3 },467 .pll = PLL_28,468 .tuner_type = TUNER_TEMIC_PAL,469 .tuner_addr = ADDR_UNSET,470 },471 [BTTV_BOARD_HAUPPAUGE878] = {472 .name = "Hauppauge (bt878)",473 .video_inputs = 4,474 /* .audio_inputs= 1, */475 .svhs = 2,476 .gpiomask = 0x0f, /* old: 7 */477 .muxsel = MUXSEL(2, 0, 1, 1),478 .gpiomux = { 0, 1, 2, 3 },479 .gpiomute = 4,480 .pll = PLL_28,481 .tuner_type = UNSET,482 .tuner_addr = ADDR_UNSET,483 },484 [BTTV_BOARD_MIROPRO] = {485 .name = "MIRO PCTV pro",486 .video_inputs = 3,487 /* .audio_inputs= 1, */488 .svhs = 2,489 .gpiomask = 0x3014f,490 .muxsel = MUXSEL(2, 3, 1, 1),491 .gpiomux = { 0x20001,0x10001, 0, 0 },492 .gpiomute = 10,493 .tuner_type = UNSET,494 .tuner_addr = ADDR_UNSET,495 },496 497 /* ---- card 0x0c ---------------------------------- */498 [BTTV_BOARD_ADSTECH_TV] = {499 .name = "ADS Technologies Channel Surfer TV (bt848)",500 .video_inputs = 3,501 /* .audio_inputs= 1, */502 .svhs = 2,503 .gpiomask = 15,504 .muxsel = MUXSEL(2, 3, 1, 1),505 .gpiomux = { 13, 14, 11, 7 },506 .tuner_type = UNSET,507 .tuner_addr = ADDR_UNSET,508 },509 [BTTV_BOARD_AVERMEDIA98] = {510 .name = "AVerMedia TVCapture 98",511 .video_inputs = 3,512 /* .audio_inputs= 4, */513 .svhs = 2,514 .gpiomask = 15,515 .muxsel = MUXSEL(2, 3, 1, 1),516 .gpiomux = { 13, 14, 11, 7 },517 .msp34xx_alt = 1,518 .pll = PLL_28,519 .tuner_type = TUNER_PHILIPS_PAL,520 .tuner_addr = ADDR_UNSET,521 .audio_mode_gpio= avermedia_tv_stereo_audio,522 .no_gpioirq = 1,523 },524 [BTTV_BOARD_VHX] = {525 .name = "Aimslab Video Highway Xtreme (VHX)",526 .video_inputs = 3,527 /* .audio_inputs= 1, */528 .svhs = 2,529 .gpiomask = 7,530 .muxsel = MUXSEL(2, 3, 1, 1),531 .gpiomux = { 0, 2, 1, 3 }, /* old: {0, 1, 2, 3, 4} */532 .gpiomute = 4,533 .pll = PLL_28,534 .tuner_type = UNSET,535 .tuner_addr = ADDR_UNSET,536 },537 [BTTV_BOARD_ZOLTRIX] = {538 .name = "Zoltrix TV-Max",539 .video_inputs = 3,540 /* .audio_inputs= 1, */541 .svhs = 2,542 .gpiomask = 15,543 .muxsel = MUXSEL(2, 3, 1, 1),544 .gpiomux = { 0, 0, 1, 0 },545 .gpiomute = 10,546 .tuner_type = UNSET,547 .tuner_addr = ADDR_UNSET,548 },549 550 /* ---- card 0x10 ---------------------------------- */551 [BTTV_BOARD_PIXVIEWPLAYTV] = {552 .name = "Prolink Pixelview PlayTV (bt878)",553 .video_inputs = 3,554 /* .audio_inputs= 1, */555 .svhs = 2,556 .gpiomask = 0x01fe00,557 .muxsel = MUXSEL(2, 3, 1, 1),558 /* 2003-10-20 by "Anton A. Arapov" <arapov@mail.ru> */559 .gpiomux = { 0x001e00, 0, 0x018000, 0x014000 },560 .gpiomute = 0x002000,561 .pll = PLL_28,562 .tuner_type = UNSET,563 .tuner_addr = ADDR_UNSET,564 },565 [BTTV_BOARD_WINVIEW_601] = {566 .name = "Leadtek WinView 601",567 .video_inputs = 3,568 /* .audio_inputs= 1, */569 .svhs = 2,570 .gpiomask = 0x8300f8,571 .muxsel = MUXSEL(2, 3, 1, 1, 0),572 .gpiomux = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007 },573 .gpiomute = 0xcfa007,574 .tuner_type = UNSET,575 .tuner_addr = ADDR_UNSET,576 .volume_gpio = winview_volume,577 .has_radio = 1,578 },579 [BTTV_BOARD_AVEC_INTERCAP] = {580 .name = "AVEC Intercapture",581 .video_inputs = 3,582 /* .audio_inputs= 2, */583 .svhs = 2,584 .gpiomask = 0,585 .muxsel = MUXSEL(2, 3, 1, 1),586 .gpiomux = { 1, 0, 0, 0 },587 .tuner_type = UNSET,588 .tuner_addr = ADDR_UNSET,589 },590 [BTTV_BOARD_LIFE_FLYKIT] = {591 .name = "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)",592 .video_inputs = 4,593 /* .audio_inputs= 1, */594 .svhs = NO_SVHS,595 .gpiomask = 0x8dff00,596 .muxsel = MUXSEL(2, 3, 1, 1),597 .gpiomux = { 0 },598 .no_msp34xx = 1,599 .tuner_type = TUNER_ABSENT,600 .tuner_addr = ADDR_UNSET,601 },602 603 /* ---- card 0x14 ---------------------------------- */604 [BTTV_BOARD_CEI_RAFFLES] = {605 .name = "CEI Raffles Card",606 .video_inputs = 3,607 /* .audio_inputs= 3, */608 .svhs = 2,609 .muxsel = MUXSEL(2, 3, 1, 1),610 .tuner_type = UNSET,611 .tuner_addr = ADDR_UNSET,612 },613 [BTTV_BOARD_CONFERENCETV] = {614 .name = "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50",615 .video_inputs = 4,616 /* .audio_inputs= 2, tuner, line in */617 .svhs = 2,618 .gpiomask = 0x1800,619 .muxsel = MUXSEL(2, 3, 1, 1),620 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },621 .gpiomute = 0x1800,622 .pll = PLL_28,623 .tuner_type = TUNER_PHILIPS_PAL_I,624 .tuner_addr = ADDR_UNSET,625 },626 [BTTV_BOARD_PHOEBE_TVMAS] = {627 .name = "Askey CPH050/ Phoebe Tv Master + FM",628 .video_inputs = 3,629 /* .audio_inputs= 1, */630 .svhs = 2,631 .gpiomask = 0xc00,632 .muxsel = MUXSEL(2, 3, 1, 1),633 .gpiomux = { 0, 1, 0x800, 0x400 },634 .gpiomute = 0xc00,635 .pll = PLL_28,636 .tuner_type = UNSET,637 .tuner_addr = ADDR_UNSET,638 },639 [BTTV_BOARD_MODTEC_205] = {640 .name = "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878",641 .video_inputs = 3,642 /* .audio_inputs= 1, */643 .svhs = NO_SVHS,644 .has_dig_in = 1,645 .gpiomask = 7,646 .muxsel = MUXSEL(2, 3, 0), /* input 2 is digital */647 /* .digital_mode= DIGITAL_MODE_CAMERA, */648 .gpiomux = { 0, 0, 0, 0 },649 .no_msp34xx = 1,650 .pll = PLL_28,651 .tuner_type = TUNER_ALPS_TSBB5_PAL_I,652 .tuner_addr = ADDR_UNSET,653 },654 655 /* ---- card 0x18 ---------------------------------- */656 [BTTV_BOARD_MAGICTVIEW061] = {657 .name = "Askey CPH05X/06X (bt878) [many vendors]",658 .video_inputs = 3,659 /* .audio_inputs= 1, */660 .svhs = 2,661 .gpiomask = 0xe00,662 .muxsel = MUXSEL(2, 3, 1, 1),663 .gpiomux = {0x400, 0x400, 0x400, 0x400 },664 .gpiomute = 0xc00,665 .pll = PLL_28,666 .tuner_type = UNSET,667 .tuner_addr = ADDR_UNSET,668 .has_remote = 1,669 .has_radio = 1, /* not every card has radio */670 },671 [BTTV_BOARD_VOBIS_BOOSTAR] = {672 .name = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar",673 .video_inputs = 3,674 /* .audio_inputs= 1, */675 .svhs = 2,676 .gpiomask = 0x1f0fff,677 .muxsel = MUXSEL(2, 3, 1, 1),678 .gpiomux = { 0x20000, 0x30000, 0x10000, 0 },679 .gpiomute = 0x40000,680 .tuner_type = TUNER_PHILIPS_PAL,681 .tuner_addr = ADDR_UNSET,682 .audio_mode_gpio= terratv_audio,683 },684 [BTTV_BOARD_HAUPPAUG_WCAM] = {685 .name = "Hauppauge WinCam newer (bt878)",686 .video_inputs = 4,687 /* .audio_inputs= 1, */688 .svhs = 3,689 .gpiomask = 7,690 .muxsel = MUXSEL(2, 0, 1, 1),691 .gpiomux = { 0, 1, 2, 3 },692 .gpiomute = 4,693 .tuner_type = UNSET,694 .tuner_addr = ADDR_UNSET,695 },696 [BTTV_BOARD_MAXI] = {697 .name = "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50",698 .video_inputs = 4,699 /* .audio_inputs= 2, */700 .svhs = 2,701 .gpiomask = 0x1800,702 .muxsel = MUXSEL(2, 3, 1, 1),703 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },704 .gpiomute = 0x1800,705 .pll = PLL_28,706 .tuner_type = TUNER_PHILIPS_SECAM,707 .tuner_addr = ADDR_UNSET,708 },709 710 /* ---- card 0x1c ---------------------------------- */711 [BTTV_BOARD_TERRATV] = {712 .name = "Terratec TerraTV+ Version 1.1 (bt878)",713 .video_inputs = 3,714 /* .audio_inputs= 1, */715 .svhs = 2,716 .gpiomask = 0x1f0fff,717 .muxsel = MUXSEL(2, 3, 1, 1),718 .gpiomux = { 0x20000, 0x30000, 0x10000, 0x00000 },719 .gpiomute = 0x40000,720 .tuner_type = TUNER_PHILIPS_PAL,721 .tuner_addr = ADDR_UNSET,722 .audio_mode_gpio= terratv_audio,723 /* GPIO wiring:724 External 20 pin connector (for Active Radio Upgrade board)725 gpio00: i2c-sda726 gpio01: i2c-scl727 gpio02: om5610-data728 gpio03: om5610-clk729 gpio04: om5610-wre730 gpio05: om5610-stereo731 gpio06: rds6588-davn732 gpio07: Pin 7 n.c.733 gpio08: nIOW734 gpio09+10: nIOR, nSEL ?? (bt878)735 gpio09: nIOR (bt848)736 gpio10: nSEL (bt848)737 Sound Routing:738 gpio16: u2-A0 (1st 4052bt)739 gpio17: u2-A1740 gpio18: u2-nEN741 gpio19: u4-A0 (2nd 4052)742 gpio20: u4-A1743 u4-nEN - GND744 Btspy:745 00000 : Cdrom (internal audio input)746 10000 : ext. Video audio input747 20000 : TV Mono748 a0000 : TV Mono/2749 1a0000 : TV Stereo750 30000 : Radio751 40000 : Mute752 */753 754 },755 [BTTV_BOARD_PXC200] = {756 /* Jannik Fritsch <jannik@techfak.uni-bielefeld.de> */757 .name = "Imagenation PXC200",758 .video_inputs = 5,759 /* .audio_inputs= 1, */760 .svhs = 1, /* was: 4 */761 .gpiomask = 0,762 .muxsel = MUXSEL(2, 3, 1, 0, 0),763 .gpiomux = { 0 },764 .tuner_type = TUNER_ABSENT,765 .tuner_addr = ADDR_UNSET,766 .muxsel_hook = PXC200_muxsel,767 768 },769 [BTTV_BOARD_FLYVIDEO_98] = {770 .name = "Lifeview FlyVideo 98 LR50",771 .video_inputs = 4,772 /* .audio_inputs= 1, */773 .svhs = 2,774 .gpiomask = 0x1800, /* 0x8dfe00 */775 .muxsel = MUXSEL(2, 3, 1, 1),776 .gpiomux = { 0, 0x0800, 0x1000, 0x1000 },777 .gpiomute = 0x1800,778 .pll = PLL_28,779 .tuner_type = UNSET,780 .tuner_addr = ADDR_UNSET,781 },782 [BTTV_BOARD_IPROTV] = {783 .name = "Formac iProTV, Formac ProTV I (bt848)",784 .video_inputs = 4,785 /* .audio_inputs= 1, */786 .svhs = 3,787 .gpiomask = 1,788 .muxsel = MUXSEL(2, 3, 1, 1),789 .gpiomux = { 1, 0, 0, 0 },790 .pll = PLL_28,791 .tuner_type = TUNER_PHILIPS_PAL,792 .tuner_addr = ADDR_UNSET,793 },794 795 /* ---- card 0x20 ---------------------------------- */796 [BTTV_BOARD_INTEL_C_S_PCI] = {797 .name = "Intel Create and Share PCI/ Smart Video Recorder III",798 .video_inputs = 4,799 /* .audio_inputs= 0, */800 .svhs = 2,801 .gpiomask = 0,802 .muxsel = MUXSEL(2, 3, 1, 1),803 .gpiomux = { 0 },804 .tuner_type = TUNER_ABSENT,805 .tuner_addr = ADDR_UNSET,806 },807 [BTTV_BOARD_TERRATVALUE] = {808 .name = "Terratec TerraTValue Version Bt878",809 .video_inputs = 3,810 /* .audio_inputs= 1, */811 .svhs = 2,812 .gpiomask = 0xffff00,813 .muxsel = MUXSEL(2, 3, 1, 1),814 .gpiomux = { 0x500, 0, 0x300, 0x900 },815 .gpiomute = 0x900,816 .pll = PLL_28,817 .tuner_type = TUNER_PHILIPS_PAL,818 .tuner_addr = ADDR_UNSET,819 },820 [BTTV_BOARD_WINFAST2000] = {821 .name = "Leadtek WinFast 2000/ WinFast 2000 XP",822 .video_inputs = 4,823 /* .audio_inputs= 1, */824 .svhs = 2,825 /* TV, CVid, SVid, CVid over SVid connector */826 .muxsel = MUXSEL(2, 3, 1, 1, 0),827 /* Alexander Varakin <avarakin@hotmail.com> [stereo version] */828 .gpiomask = 0xb33000,829 .gpiomux = { 0x122000,0x1000,0x0000,0x620000 },830 .gpiomute = 0x800000,831 /* Audio Routing for "WinFast 2000 XP" (no tv stereo !)832 gpio23 -- hef4052:nEnable (0x800000)833 gpio12 -- hef4052:A1834 gpio13 -- hef4052:A0835 0x0000: external audio836 0x1000: FM837 0x2000: TV838 0x3000: n.c.839 Note: There exists another variant "Winfast 2000" with tv stereo !?840 Note: eeprom only contains FF and pci subsystem id 107d:6606841 */842 .pll = PLL_28,843 .has_radio = 1,844 .tuner_type = TUNER_PHILIPS_PAL, /* default for now, gpio reads BFFF06 for Pal bg+dk */845 .tuner_addr = ADDR_UNSET,846 .audio_mode_gpio= winfast2000_audio,847 .has_remote = 1,848 },849 [BTTV_BOARD_CHRONOS_VS2] = {850 .name = "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II",851 .video_inputs = 4,852 /* .audio_inputs= 3, */853 .svhs = 2,854 .gpiomask = 0x1800,855 .muxsel = MUXSEL(2, 3, 1, 1),856 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },857 .gpiomute = 0x1800,858 .pll = PLL_28,859 .tuner_type = UNSET,860 .tuner_addr = ADDR_UNSET,861 },862 863 /* ---- card 0x24 ---------------------------------- */864 [BTTV_BOARD_TYPHOON_TVIEW] = {865 .name = "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner",866 .video_inputs = 4,867 /* .audio_inputs= 3, */868 .svhs = 2,869 .gpiomask = 0x1800,870 .muxsel = MUXSEL(2, 3, 1, 1),871 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },872 .gpiomute = 0x1800,873 .pll = PLL_28,874 .tuner_type = UNSET,875 .tuner_addr = ADDR_UNSET,876 .has_radio = 1,877 },878 [BTTV_BOARD_PXELVWPLTVPRO] = {879 .name = "Prolink PixelView PlayTV pro",880 .video_inputs = 3,881 /* .audio_inputs= 1, */882 .svhs = 2,883 .gpiomask = 0xff,884 .muxsel = MUXSEL(2, 3, 1, 1),885 .gpiomux = { 0x21, 0x20, 0x24, 0x2c },886 .gpiomute = 0x29,887 .no_msp34xx = 1,888 .pll = PLL_28,889 .tuner_type = UNSET,890 .tuner_addr = ADDR_UNSET,891 },892 [BTTV_BOARD_MAGICTVIEW063] = {893 .name = "Askey CPH06X TView99",894 .video_inputs = 4,895 /* .audio_inputs= 1, */896 .svhs = 2,897 .gpiomask = 0x551e00,898 .muxsel = MUXSEL(2, 3, 1, 0),899 .gpiomux = { 0x551400, 0x551200, 0, 0 },900 .gpiomute = 0x551c00,901 .pll = PLL_28,902 .tuner_type = TUNER_PHILIPS_PAL_I,903 .tuner_addr = ADDR_UNSET,904 .has_remote = 1,905 },906 [BTTV_BOARD_PINNACLE] = {907 .name = "Pinnacle PCTV Studio/Rave",908 .video_inputs = 3,909 /* .audio_inputs= 1, */910 .svhs = 2,911 .gpiomask = 0x03000F,912 .muxsel = MUXSEL(2, 3, 1, 1),913 .gpiomux = { 2, 0xd0001, 0, 0 },914 .gpiomute = 1,915 .pll = PLL_28,916 .tuner_type = UNSET,917 .tuner_addr = ADDR_UNSET,918 },919 920 /* ---- card 0x28 ---------------------------------- */921 [BTTV_BOARD_STB2] = {922 .name = "STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100",923 .video_inputs = 3,924 /* .audio_inputs= 1, */925 .svhs = 2,926 .gpiomask = 7,927 .muxsel = MUXSEL(2, 3, 1, 1),928 .gpiomux = { 4, 0, 2, 3 },929 .gpiomute = 1,930 .no_msp34xx = 1,931 .tuner_type = TUNER_PHILIPS_NTSC,932 .tuner_addr = ADDR_UNSET,933 .pll = PLL_28,934 .has_radio = 1,935 },936 [BTTV_BOARD_AVPHONE98] = {937 .name = "AVerMedia TVPhone 98",938 .video_inputs = 3,939 /* .audio_inputs= 4, */940 .svhs = 2,941 .gpiomask = 15,942 .muxsel = MUXSEL(2, 3, 1, 1),943 .gpiomux = { 13, 4, 11, 7 },944 .pll = PLL_28,945 .tuner_type = UNSET,946 .tuner_addr = ADDR_UNSET,947 .has_radio = 1,948 .audio_mode_gpio= avermedia_tvphone_audio,949 },950 [BTTV_BOARD_PV951] = {951 .name = "ProVideo PV951", /* pic16c54 */952 .video_inputs = 3,953 /* .audio_inputs= 1, */954 .svhs = 2,955 .gpiomask = 0,956 .muxsel = MUXSEL(2, 3, 1, 1),957 .gpiomux = { 0, 0, 0, 0},958 .no_msp34xx = 1,959 .pll = PLL_28,960 .tuner_type = TUNER_PHILIPS_PAL_I,961 .tuner_addr = ADDR_UNSET,962 },963 [BTTV_BOARD_ONAIR_TV] = {964 .name = "Little OnAir TV",965 .video_inputs = 3,966 /* .audio_inputs= 1, */967 .svhs = 2,968 .gpiomask = 0xe00b,969 .muxsel = MUXSEL(2, 3, 1, 1),970 .gpiomux = { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0 },971 .gpiomute = 0xff3ffc,972 .no_msp34xx = 1,973 .tuner_type = UNSET,974 .tuner_addr = ADDR_UNSET,975 },976 977 /* ---- card 0x2c ---------------------------------- */978 [BTTV_BOARD_SIGMA_TVII_FM] = {979 .name = "Sigma TVII-FM",980 .video_inputs = 2,981 /* .audio_inputs= 1, */982 .svhs = NO_SVHS,983 .gpiomask = 3,984 .muxsel = MUXSEL(2, 3, 1, 1),985 .gpiomux = { 1, 1, 0, 2 },986 .gpiomute = 3,987 .no_msp34xx = 1,988 .pll = PLL_NONE,989 .tuner_type = UNSET,990 .tuner_addr = ADDR_UNSET,991 },992 [BTTV_BOARD_MATRIX_VISION2] = {993 .name = "MATRIX-Vision MV-Delta 2",994 .video_inputs = 5,995 /* .audio_inputs= 1, */996 .svhs = 3,997 .gpiomask = 0,998 .muxsel = MUXSEL(2, 3, 1, 0, 0),999 .gpiomux = { 0 },1000 .no_msp34xx = 1,1001 .pll = PLL_28,1002 .tuner_type = TUNER_ABSENT,1003 .tuner_addr = ADDR_UNSET,1004 },1005 [BTTV_BOARD_ZOLTRIX_GENIE] = {1006 .name = "Zoltrix Genie TV/FM",1007 .video_inputs = 3,1008 /* .audio_inputs= 1, */1009 .svhs = 2,1010 .gpiomask = 0xbcf03f,1011 .muxsel = MUXSEL(2, 3, 1, 1),1012 .gpiomux = { 0xbc803f, 0xbc903f, 0xbcb03f, 0 },1013 .gpiomute = 0xbcb03f,1014 .no_msp34xx = 1,1015 .pll = PLL_28,1016 .tuner_type = TUNER_TEMIC_4039FR5_NTSC,1017 .tuner_addr = ADDR_UNSET,1018 },1019 [BTTV_BOARD_TERRATVRADIO] = {1020 .name = "Terratec TV/Radio+",1021 .video_inputs = 3,1022 /* .audio_inputs= 1, */1023 .svhs = 2,1024 .gpiomask = 0x70000,1025 .muxsel = MUXSEL(2, 3, 1, 1),1026 .gpiomux = { 0x20000, 0x30000, 0x10000, 0 },1027 .gpiomute = 0x40000,1028 .no_msp34xx = 1,1029 .pll = PLL_35,1030 .tuner_type = TUNER_PHILIPS_PAL_I,1031 .tuner_addr = ADDR_UNSET,1032 .has_radio = 1,1033 },1034 1035 /* ---- card 0x30 ---------------------------------- */1036 [BTTV_BOARD_DYNALINK] = {1037 .name = "Askey CPH03x/ Dynalink Magic TView",1038 .video_inputs = 3,1039 /* .audio_inputs= 1, */1040 .svhs = 2,1041 .gpiomask = 15,1042 .muxsel = MUXSEL(2, 3, 1, 1),1043 .gpiomux = {2,0,0,0 },1044 .gpiomute = 1,1045 .pll = PLL_28,1046 .tuner_type = UNSET,1047 .tuner_addr = ADDR_UNSET,1048 },1049 [BTTV_BOARD_GVBCTV3PCI] = {1050 .name = "IODATA GV-BCTV3/PCI",1051 .video_inputs = 3,1052 /* .audio_inputs= 1, */1053 .svhs = 2,1054 .gpiomask = 0x010f00,1055 .muxsel = MUXSEL(2, 3, 0, 0),1056 .gpiomux = {0x10000, 0, 0x10000, 0 },1057 .no_msp34xx = 1,1058 .pll = PLL_28,1059 .tuner_type = TUNER_ALPS_TSHC6_NTSC,1060 .tuner_addr = ADDR_UNSET,1061 .audio_mode_gpio= gvbctv3pci_audio,1062 },1063 [BTTV_BOARD_PXELVWPLTVPAK] = {1064 .name = "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP",1065 .video_inputs = 5,1066 /* .audio_inputs= 1, */1067 .svhs = 3,1068 .has_dig_in = 1,1069 .gpiomask = 0xAA0000,1070 .muxsel = MUXSEL(2, 3, 1, 1, 0), /* in 4 is digital */1071 /* .digital_mode= DIGITAL_MODE_CAMERA, */1072 .gpiomux = { 0x20000, 0, 0x80000, 0x80000 },1073 .gpiomute = 0xa8000,1074 .no_msp34xx = 1,1075 .pll = PLL_28,1076 .tuner_type = TUNER_PHILIPS_PAL_I,1077 .tuner_addr = ADDR_UNSET,1078 .has_remote = 1,1079 /* GPIO wiring: (different from Rev.4C !)1080 GPIO17: U4.A0 (first hef4052bt)1081 GPIO19: U4.A11082 GPIO20: U5.A1 (second hef4052bt)1083 GPIO21: U4.nEN1084 GPIO22: BT832 Reset Line1085 GPIO23: A5,A0, U5,nEN1086 Note: At i2c=0x8a is a Bt832 chip, which changes to 0x88 after being reset via GPIO221087 */1088 },1089 [BTTV_BOARD_EAGLE] = {1090 .name = "Eagle Wireless Capricorn2 (bt878A)",1091 .video_inputs = 4,1092 /* .audio_inputs= 1, */1093 .svhs = 2,1094 .gpiomask = 7,1095 .muxsel = MUXSEL(2, 0, 1, 1),1096 .gpiomux = { 0, 1, 2, 3 },1097 .gpiomute = 4,1098 .pll = PLL_28,1099 .tuner_type = UNSET /* TUNER_ALPS_TMDH2_NTSC */,1100 .tuner_addr = ADDR_UNSET,1101 },1102 1103 /* ---- card 0x34 ---------------------------------- */1104 [BTTV_BOARD_PINNACLEPRO] = {1105 /* David Härdeman <david@2gen.com> */1106 .name = "Pinnacle PCTV Studio Pro",1107 .video_inputs = 4,1108 /* .audio_inputs= 1, */1109 .svhs = 3,1110 .gpiomask = 0x03000F,1111 .muxsel = MUXSEL(2, 3, 1, 1),1112 .gpiomux = { 1, 0xd0001, 0, 0 },1113 .gpiomute = 10,1114 /* sound path (5 sources):1115 MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable)1116 0= ext. Audio IN1117 1= from MUX21118 2= Mono TV sound from Tuner1119 3= not connected1120 MUX2 (mask 0x30000):1121 0,2,3= from MSP34xx1122 1= FM stereo Radio from Tuner */1123 .pll = PLL_28,1124 .tuner_type = UNSET,1125 .tuner_addr = ADDR_UNSET,1126 },1127 [BTTV_BOARD_TVIEW_RDS_FM] = {1128 /* Claas Langbehn <claas@bigfoot.com>,1129 Sven Grothklags <sven@upb.de> */1130 .name = "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS",1131 .video_inputs = 4,1132 /* .audio_inputs= 3, */1133 .svhs = 2,1134 .gpiomask = 0x1c,1135 .muxsel = MUXSEL(2, 3, 1, 1),1136 .gpiomux = { 0, 0, 0x10, 8 },1137 .gpiomute = 4,1138 .pll = PLL_28,1139 .tuner_type = TUNER_PHILIPS_PAL,1140 .tuner_addr = ADDR_UNSET,1141 .has_radio = 1,1142 },1143 [BTTV_BOARD_LIFETEC_9415] = {1144 /* Tim Röstermundt <rosterm@uni-muenster.de>1145 in de.comp.os.unix.linux.hardware:1146 options bttv card=0 pll=1 radio=1 gpiomask=0x18e01147 gpiomux =0x44c71f,0x44d71f,0,0x44d71f,0x44dfff1148 options tuner type=5 */1149 .name = "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]",1150 .video_inputs = 4,1151 /* .audio_inputs= 1, */1152 .svhs = 2,1153 .gpiomask = 0x18e0,1154 .muxsel = MUXSEL(2, 3, 1, 1),1155 .gpiomux = { 0x0000,0x0800,0x1000,0x1000 },1156 .gpiomute = 0x18e0,1157 /* For cards with tda9820/tda9821:1158 0x0000: Tuner normal stereo1159 0x0080: Tuner A2 SAP (second audio program = Zweikanalton)1160 0x0880: Tuner A2 stereo */1161 .pll = PLL_28,1162 .tuner_type = UNSET,1163 .tuner_addr = ADDR_UNSET,1164 },1165 [BTTV_BOARD_BESTBUY_EASYTV] = {1166 /* Miguel Angel Alvarez <maacruz@navegalia.com>1167 old Easy TV BT848 version (model CPH031) */1168 .name = "Askey CPH031/ BESTBUY Easy TV",1169 .video_inputs = 4,1170 /* .audio_inputs= 1, */1171 .svhs = 2,1172 .gpiomask = 0xF,1173 .muxsel = MUXSEL(2, 3, 1, 0),1174 .gpiomux = { 2, 0, 0, 0 },1175 .gpiomute = 10,1176 .pll = PLL_28,1177 .tuner_type = TUNER_TEMIC_PAL,1178 .tuner_addr = ADDR_UNSET,1179 },1180 1181 /* ---- card 0x38 ---------------------------------- */1182 [BTTV_BOARD_FLYVIDEO_98FM] = {1183 /* Gordon Heydon <gjheydon@bigfoot.com ('98) */1184 .name = "Lifeview FlyVideo 98FM LR50",1185 .video_inputs = 4,1186 /* .audio_inputs= 3, */1187 .svhs = 2,1188 .gpiomask = 0x1800,1189 .muxsel = MUXSEL(2, 3, 1, 1),1190 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },1191 .gpiomute = 0x1800,1192 .pll = PLL_28,1193 .tuner_type = TUNER_PHILIPS_PAL,1194 .tuner_addr = ADDR_UNSET,1195 },1196 /* This is the ultimate cheapo capture card1197 * just a BT848A on a small PCB!1198 * Steve Hosgood <steve@equiinet.com> */1199 [BTTV_BOARD_GRANDTEC] = {1200 .name = "GrandTec 'Grand Video Capture' (Bt848)",1201 .video_inputs = 2,1202 /* .audio_inputs= 0, */1203 .svhs = 1,1204 .gpiomask = 0,1205 .muxsel = MUXSEL(3, 1),1206 .gpiomux = { 0 },1207 .no_msp34xx = 1,1208 .pll = PLL_35,1209 .tuner_type = TUNER_ABSENT,1210 .tuner_addr = ADDR_UNSET,1211 },1212 [BTTV_BOARD_ASKEY_CPH060] = {1213 /* Daniel Herrington <daniel.herrington@home.com> */1214 .name = "Askey CPH060/ Phoebe TV Master Only (No FM)",1215 .video_inputs = 3,1216 /* .audio_inputs= 1, */1217 .svhs = 2,1218 .gpiomask = 0xe00,1219 .muxsel = MUXSEL(2, 3, 1, 1),1220 .gpiomux = { 0x400, 0x400, 0x400, 0x400 },1221 .gpiomute = 0x800,1222 .pll = PLL_28,1223 .tuner_type = TUNER_TEMIC_4036FY5_NTSC,1224 .tuner_addr = ADDR_UNSET,1225 },1226 [BTTV_BOARD_ASKEY_CPH03X] = {1227 /* Matti Mottus <mottus@physic.ut.ee> */1228 .name = "Askey CPH03x TV Capturer",1229 .video_inputs = 4,1230 /* .audio_inputs= 1, */1231 .svhs = 2,1232 .gpiomask = 0x03000F,1233 .muxsel = MUXSEL(2, 3, 1, 0),1234 .gpiomux = { 2, 0, 0, 0 },1235 .gpiomute = 1,1236 .pll = PLL_28,1237 .tuner_type = TUNER_TEMIC_PAL,1238 .tuner_addr = ADDR_UNSET,1239 .has_remote = 1,1240 },1241 1242 /* ---- card 0x3c ---------------------------------- */1243 [BTTV_BOARD_MM100PCTV] = {1244 /* Philip Blundell <philb@gnu.org> */1245 .name = "Modular Technology MM100PCTV",1246 .video_inputs = 2,1247 /* .audio_inputs= 2, */1248 .svhs = NO_SVHS,1249 .gpiomask = 11,1250 .muxsel = MUXSEL(2, 3, 1, 1),1251 .gpiomux = { 2, 0, 0, 1 },1252 .gpiomute = 8,1253 .pll = PLL_35,1254 .tuner_type = TUNER_TEMIC_PAL,1255 .tuner_addr = ADDR_UNSET,1256 },1257 [BTTV_BOARD_GMV1] = {1258 /* Adrian Cox <adrian@humboldt.co.uk */1259 .name = "AG Electronics GMV1",1260 .video_inputs = 2,1261 /* .audio_inputs= 0, */1262 .svhs = 1,1263 .gpiomask = 0xF,1264 .muxsel = MUXSEL(2, 2),1265 .gpiomux = { },1266 .no_msp34xx = 1,1267 .pll = PLL_28,1268 .tuner_type = TUNER_ABSENT,1269 .tuner_addr = ADDR_UNSET,1270 },1271 [BTTV_BOARD_BESTBUY_EASYTV2] = {1272 /* Miguel Angel Alvarez <maacruz@navegalia.com>1273 new Easy TV BT878 version (model CPH061)1274 special thanks to Informatica Mieres for providing the card */1275 .name = "Askey CPH061/ BESTBUY Easy TV (bt878)",1276 .video_inputs = 3,1277 /* .audio_inputs= 2, */1278 .svhs = 2,1279 .gpiomask = 0xFF,1280 .muxsel = MUXSEL(2, 3, 1, 0),1281 .gpiomux = { 1, 0, 4, 4 },1282 .gpiomute = 9,1283 .pll = PLL_28,1284 .tuner_type = TUNER_PHILIPS_PAL,1285 .tuner_addr = ADDR_UNSET,1286 },1287 [BTTV_BOARD_ATI_TVWONDER] = {1288 /* Lukas Gebauer <geby@volny.cz> */1289 .name = "ATI TV-Wonder",1290 .video_inputs = 3,1291 /* .audio_inputs= 1, */1292 .svhs = 2,1293 .gpiomask = 0xf03f,1294 .muxsel = MUXSEL(2, 3, 1, 0),1295 .gpiomux = { 0xbffe, 0, 0xbfff, 0 },1296 .gpiomute = 0xbffe,1297 .pll = PLL_28,1298 .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL,1299 .tuner_addr = ADDR_UNSET,1300 },1301 1302 /* ---- card 0x40 ---------------------------------- */1303 [BTTV_BOARD_ATI_TVWONDERVE] = {1304 /* Lukas Gebauer <geby@volny.cz> */1305 .name = "ATI TV-Wonder VE",1306 .video_inputs = 2,1307 /* .audio_inputs= 1, */1308 .svhs = NO_SVHS,1309 .gpiomask = 1,1310 .muxsel = MUXSEL(2, 3, 0, 1),1311 .gpiomux = { 0, 0, 1, 0 },1312 .no_msp34xx = 1,1313 .pll = PLL_28,1314 .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL,1315 .tuner_addr = ADDR_UNSET,1316 },1317 [BTTV_BOARD_FLYVIDEO2000] = {1318 /* DeeJay <deejay@westel900.net (2000S) */1319 .name = "Lifeview FlyVideo 2000S LR90",1320 .video_inputs = 3,1321 /* .audio_inputs= 3, */1322 .svhs = 2,1323 .gpiomask = 0x18e0,1324 .muxsel = MUXSEL(2, 3, 0, 1),1325 /* Radio changed from 1e80 to 0x800 to make1326 FlyVideo2000S in .hu happy (gm)*/1327 /* -dk-???: set mute=0x1800 for tda9874h daughterboard */1328 .gpiomux = { 0x0000,0x0800,0x1000,0x1000 },1329 .gpiomute = 0x1800,1330 .audio_mode_gpio= fv2000s_audio,1331 .no_msp34xx = 1,1332 .pll = PLL_28,1333 .tuner_type = TUNER_PHILIPS_PAL,1334 .tuner_addr = ADDR_UNSET,1335 },1336 [BTTV_BOARD_TERRATVALUER] = {1337 .name = "Terratec TValueRadio",1338 .video_inputs = 3,1339 /* .audio_inputs= 1, */1340 .svhs = 2,1341 .gpiomask = 0xffff00,1342 .muxsel = MUXSEL(2, 3, 1, 1),1343 .gpiomux = { 0x500, 0x500, 0x300, 0x900 },1344 .gpiomute = 0x900,1345 .pll = PLL_28,1346 .tuner_type = TUNER_PHILIPS_PAL,1347 .tuner_addr = ADDR_UNSET,1348 .has_radio = 1,1349 },1350 [BTTV_BOARD_GVBCTV4PCI] = {1351 /* TANAKA Kei <peg00625@nifty.com> */1352 .name = "IODATA GV-BCTV4/PCI",1353 .video_inputs = 3,1354 /* .audio_inputs= 1, */1355 .svhs = 2,1356 .gpiomask = 0x010f00,1357 .muxsel = MUXSEL(2, 3, 0, 0),1358 .gpiomux = {0x10000, 0, 0x10000, 0 },1359 .no_msp34xx = 1,1360 .pll = PLL_28,1361 .tuner_type = TUNER_SHARP_2U5JF5540_NTSC,1362 .tuner_addr = ADDR_UNSET,1363 .audio_mode_gpio= gvbctv3pci_audio,1364 },1365 1366 /* ---- card 0x44 ---------------------------------- */1367 [BTTV_BOARD_VOODOOTV_FM] = {1368 .name = "3Dfx VoodooTV FM (Euro)",1369 /* try "insmod msp3400 simple=0" if you have1370 * sound problems with this card. */1371 .video_inputs = 4,1372 /* .audio_inputs= 1, */1373 .svhs = NO_SVHS,1374 .gpiomask = 0x4f8a00,1375 /* 0x100000: 1=MSP enabled (0=disable again)1376 * 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */1377 .gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff },1378 .gpiomute = 0x947fff,1379 /* tvtuner, radio, external,internal, mute, stereo1380 * tuner, Composite, SVid, Composite-on-Svid-adapter */1381 .muxsel = MUXSEL(2, 3, 0, 1),1382 .tuner_type = TUNER_MT2032,1383 .tuner_addr = ADDR_UNSET,1384 .pll = PLL_28,1385 .has_radio = 1,1386 },1387 [BTTV_BOARD_VOODOOTV_200] = {1388 .name = "VoodooTV 200 (USA)",1389 /* try "insmod msp3400 simple=0" if you have1390 * sound problems with this card. */1391 .video_inputs = 4,1392 /* .audio_inputs= 1, */1393 .svhs = NO_SVHS,1394 .gpiomask = 0x4f8a00,1395 /* 0x100000: 1=MSP enabled (0=disable again)1396 * 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) */1397 .gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff },1398 .gpiomute = 0x947fff,1399 /* tvtuner, radio, external,internal, mute, stereo1400 * tuner, Composite, SVid, Composite-on-Svid-adapter */1401 .muxsel = MUXSEL(2, 3, 0, 1),1402 .tuner_type = TUNER_MT2032,1403 .tuner_addr = ADDR_UNSET,1404 .pll = PLL_28,1405 .has_radio = 1,1406 },1407 [BTTV_BOARD_AIMMS] = {1408 /* Philip Blundell <pb@nexus.co.uk> */1409 .name = "Active Imaging AIMMS",1410 .video_inputs = 1,1411 /* .audio_inputs= 0, */1412 .tuner_type = TUNER_ABSENT,1413 .tuner_addr = ADDR_UNSET,1414 .pll = PLL_28,1415 .muxsel = MUXSEL(2),1416 .gpiomask = 01417 },1418 [BTTV_BOARD_PV_BT878P_PLUS] = {1419 /* Tomasz Pyra <hellfire@sedez.iq.pl> */1420 .name = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)",1421 .video_inputs = 3,1422 /* .audio_inputs= 4, */1423 .svhs = 2,1424 .gpiomask = 15,1425 .muxsel = MUXSEL(2, 3, 1, 1),1426 .gpiomux = { 0, 0, 11, 7 }, /* TV and Radio with same GPIO ! */1427 .gpiomute = 13,1428 .pll = PLL_28,1429 .tuner_type = TUNER_LG_PAL_I_FM,1430 .tuner_addr = ADDR_UNSET,1431 .has_remote = 1,1432 /* GPIO wiring:1433 GPIO0: U4.A0 (hef4052bt)1434 GPIO1: U4.A11435 GPIO2: U4.A1 (second hef4052bt)1436 GPIO3: U4.nEN, U5.A0, A5.nEN1437 GPIO8-15: vrd866b ?1438 */1439 },1440 [BTTV_BOARD_FLYVIDEO98EZ] = {1441 .name = "Lifeview FlyVideo 98EZ (capture only) LR51",1442 .video_inputs = 4,1443 /* .audio_inputs= 0, */1444 .svhs = 2,1445 /* AV1, AV2, SVHS, CVid adapter on SVHS */1446 .muxsel = MUXSEL(2, 3, 1, 1),1447 .pll = PLL_28,1448 .no_msp34xx = 1,1449 .tuner_type = TUNER_ABSENT,1450 .tuner_addr = ADDR_UNSET,1451 },1452 1453 /* ---- card 0x48 ---------------------------------- */1454 [BTTV_BOARD_PV_BT878P_9B] = {1455 /* Dariusz Kowalewski <darekk@automex.pl> */1456 .name = "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)",1457 .video_inputs = 4,1458 /* .audio_inputs= 1, */1459 .svhs = 2,1460 .gpiomask = 0x3f,1461 .muxsel = MUXSEL(2, 3, 1, 1),1462 .gpiomux = { 0x01, 0x00, 0x03, 0x03 },1463 .gpiomute = 0x09,1464 .no_msp34xx = 1,1465 .pll = PLL_28,1466 .tuner_type = TUNER_PHILIPS_PAL,1467 .tuner_addr = ADDR_UNSET,1468 .audio_mode_gpio= pvbt878p9b_audio, /* Note: not all cards have stereo */1469 .has_radio = 1, /* Note: not all cards have radio */1470 .has_remote = 1,1471 /* GPIO wiring:1472 GPIO0: A0 hef40521473 GPIO1: A1 hef40521474 GPIO3: nEN hef40521475 GPIO8-15: vrd866b1476 GPIO20,22,23: R30,R29,R281477 */1478 },1479 [BTTV_BOARD_SENSORAY311_611] = {1480 /* Clay Kunz <ckunz@mail.arc.nasa.gov> */1481 /* you must jumper JP5 for the 311 card (PC/104+) to work */1482 .name = "Sensoray 311/611",1483 .video_inputs = 5,1484 /* .audio_inputs= 0, */1485 .svhs = 4,1486 .gpiomask = 0,1487 .muxsel = MUXSEL(2, 3, 1, 0, 0),1488 .gpiomux = { 0 },1489 .tuner_type = TUNER_ABSENT,1490 .tuner_addr = ADDR_UNSET,1491 },1492 [BTTV_BOARD_RV605] = {1493 /* Miguel Freitas <miguel@cetuc.puc-rio.br> */1494 .name = "RemoteVision MX (RV605)",1495 .video_inputs = 16,1496 /* .audio_inputs= 0, */1497 .svhs = NO_SVHS,1498 .gpiomask = 0x00,1499 .gpiomask2 = 0x07ff,1500 .muxsel = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),1501 .no_msp34xx = 1,1502 .tuner_type = TUNER_ABSENT,1503 .tuner_addr = ADDR_UNSET,1504 .muxsel_hook = rv605_muxsel,1505 },1506 [BTTV_BOARD_POWERCLR_MTV878] = {1507 .name = "Powercolor MTV878/ MTV878R/ MTV878F",1508 .video_inputs = 3,1509 /* .audio_inputs= 2, */1510 .svhs = 2,1511 .gpiomask = 0x1C800F, /* Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset */1512 .muxsel = MUXSEL(2, 1, 1),1513 .gpiomux = { 0, 1, 2, 2 },1514 .gpiomute = 4,1515 .tuner_type = TUNER_PHILIPS_PAL,1516 .tuner_addr = ADDR_UNSET,1517 .pll = PLL_28,1518 .has_radio = 1,1519 },1520 1521 /* ---- card 0x4c ---------------------------------- */1522 [BTTV_BOARD_WINDVR] = {1523 /* Masaki Suzuki <masaki@btree.org> */1524 .name = "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)",1525 .video_inputs = 3,1526 /* .audio_inputs= 1, */1527 .svhs = 2,1528 .gpiomask = 0x140007,1529 .muxsel = MUXSEL(2, 3, 1, 1),1530 .gpiomux = { 0, 1, 2, 3 },1531 .gpiomute = 4,1532 .tuner_type = TUNER_PHILIPS_NTSC,1533 .tuner_addr = ADDR_UNSET,1534 .audio_mode_gpio= windvr_audio,1535 },1536 [BTTV_BOARD_GRANDTEC_MULTI] = {1537 .name = "GrandTec Multi Capture Card (Bt878)",1538 .video_inputs = 4,1539 /* .audio_inputs= 0, */1540 .svhs = NO_SVHS,1541 .gpiomask = 0,1542 .muxsel = MUXSEL(2, 3, 1, 0),1543 .gpiomux = { 0 },1544 .no_msp34xx = 1,1545 .pll = PLL_28,1546 .tuner_type = TUNER_ABSENT,1547 .tuner_addr = ADDR_UNSET,1548 },1549 [BTTV_BOARD_KWORLD] = {1550 .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF",1551 .video_inputs = 4,1552 /* .audio_inputs= 3, */1553 .svhs = 2,1554 .gpiomask = 7,1555 /* Tuner, SVid, SVHS, SVid to SVHS connector */1556 .muxsel = MUXSEL(2, 3, 1, 1),1557 .gpiomux = { 0, 0, 4, 4 },/* Yes, this tuner uses the same audio output for TV and FM radio!1558 * This card lacks external Audio In, so we mute it on Ext. & Int.1559 * The PCB can take a sbx1637/sbx1673, wiring unknown.1560 * This card lacks PCI subsystem ID, sigh.1561 * gpiomux =1: lower volume, 2+3: mute1562 * btwincap uses 0x80000/0x800031563 */1564 .gpiomute = 4,1565 .no_msp34xx = 1,1566 .pll = PLL_28,1567 .tuner_type = TUNER_PHILIPS_PAL,1568 .tuner_addr = ADDR_UNSET,1569 /* Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and1570 radio signal strength indicators work fine. */1571 .has_radio = 1,1572 /* GPIO Info:1573 GPIO0,1: HEF4052 A0,A11574 GPIO2: HEF4052 nENABLE1575 GPIO3-7: n.c.1576 GPIO8-13: IRDC357 data0-5 (data6 n.c. ?) [chip not present on my card]1577 GPIO14,15: ??1578 GPIO16-21: n.c.1579 GPIO22,23: ??1580 ?? : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/1581 },1582 [BTTV_BOARD_DSP_TCVIDEO] = {1583 /* Arthur Tetzlaff-Deas, DSP Design Ltd <software@dspdesign.com> */1584 .name = "DSP Design TCVIDEO",1585 .video_inputs = 4,1586 .svhs = NO_SVHS,1587 .muxsel = MUXSEL(2, 3, 1, 0),1588 .pll = PLL_28,1589 .tuner_type = UNSET,1590 .tuner_addr = ADDR_UNSET,1591 },1592 1593 /* ---- card 0x50 ---------------------------------- */1594 [BTTV_BOARD_HAUPPAUGEPVR] = {1595 .name = "Hauppauge WinTV PVR",1596 .video_inputs = 4,1597 /* .audio_inputs= 1, */1598 .svhs = 2,1599 .muxsel = MUXSEL(2, 0, 1, 1),1600 .pll = PLL_28,1601 .tuner_type = UNSET,1602 .tuner_addr = ADDR_UNSET,1603 1604 .gpiomask = 7,1605 .gpiomux = {7},1606 },1607 [BTTV_BOARD_GVBCTV5PCI] = {1608 .name = "IODATA GV-BCTV5/PCI",1609 .video_inputs = 3,1610 /* .audio_inputs= 1, */1611 .svhs = 2,1612 .gpiomask = 0x0f0f80,1613 .muxsel = MUXSEL(2, 3, 1, 0),1614 .gpiomux = {0x030000, 0x010000, 0, 0 },1615 .gpiomute = 0x020000,1616 .no_msp34xx = 1,1617 .pll = PLL_28,1618 .tuner_type = TUNER_PHILIPS_NTSC_M,1619 .tuner_addr = ADDR_UNSET,1620 .audio_mode_gpio= gvbctv5pci_audio,1621 .has_radio = 1,1622 },1623 [BTTV_BOARD_OSPREY1x0] = {1624 .name = "Osprey 100/150 (878)", /* 0x1(2|3)-45C6-C1 */1625 .video_inputs = 4, /* id-inputs-clock */1626 /* .audio_inputs= 0, */1627 .svhs = 3,1628 .muxsel = MUXSEL(3, 2, 0, 1),1629 .pll = PLL_28,1630 .tuner_type = TUNER_ABSENT,1631 .tuner_addr = ADDR_UNSET,1632 .no_msp34xx = 1,1633 .no_tda7432 = 1,1634 },1635 [BTTV_BOARD_OSPREY1x0_848] = {1636 .name = "Osprey 100/150 (848)", /* 0x04-54C0-C1 & older boards */1637 .video_inputs = 3,1638 /* .audio_inputs= 0, */1639 .svhs = 2,1640 .muxsel = MUXSEL(2, 3, 1),1641 .pll = PLL_28,1642 .tuner_type = TUNER_ABSENT,1643 .tuner_addr = ADDR_UNSET,1644 .no_msp34xx = 1,1645 .no_tda7432 = 1,1646 },1647 1648 /* ---- card 0x54 ---------------------------------- */1649 [BTTV_BOARD_OSPREY101_848] = {1650 .name = "Osprey 101 (848)", /* 0x05-40C0-C1 */1651 .video_inputs = 2,1652 /* .audio_inputs= 0, */1653 .svhs = 1,1654 .muxsel = MUXSEL(3, 1),1655 .pll = PLL_28,1656 .tuner_type = TUNER_ABSENT,1657 .tuner_addr = ADDR_UNSET,1658 .no_msp34xx = 1,1659 .no_tda7432 = 1,1660 },1661 [BTTV_BOARD_OSPREY1x1] = {1662 .name = "Osprey 101/151", /* 0x1(4|5)-0004-C4 */1663 .video_inputs = 1,1664 /* .audio_inputs= 0, */1665 .svhs = NO_SVHS,1666 .muxsel = MUXSEL(0),1667 .pll = PLL_28,1668 .tuner_type = TUNER_ABSENT,1669 .tuner_addr = ADDR_UNSET,1670 .no_msp34xx = 1,1671 .no_tda7432 = 1,1672 },1673 [BTTV_BOARD_OSPREY1x1_SVID] = {1674 .name = "Osprey 101/151 w/ svid", /* 0x(16|17|20)-00C4-C1 */1675 .video_inputs = 2,1676 /* .audio_inputs= 0, */1677 .svhs = 1,1678 .muxsel = MUXSEL(0, 1),1679 .pll = PLL_28,1680 .tuner_type = TUNER_ABSENT,1681 .tuner_addr = ADDR_UNSET,1682 .no_msp34xx = 1,1683 .no_tda7432 = 1,1684 },1685 [BTTV_BOARD_OSPREY2xx] = {1686 .name = "Osprey 200/201/250/251", /* 0x1(8|9|E|F)-0004-C4 */1687 .video_inputs = 1,1688 /* .audio_inputs= 1, */1689 .svhs = NO_SVHS,1690 .muxsel = MUXSEL(0),1691 .pll = PLL_28,1692 .tuner_type = TUNER_ABSENT,1693 .tuner_addr = ADDR_UNSET,1694 .no_msp34xx = 1,1695 .no_tda7432 = 1,1696 },1697 1698 /* ---- card 0x58 ---------------------------------- */1699 [BTTV_BOARD_OSPREY2x0_SVID] = {1700 .name = "Osprey 200/250", /* 0x1(A|B)-00C4-C1 */1701 .video_inputs = 2,1702 /* .audio_inputs= 1, */1703 .svhs = 1,1704 .muxsel = MUXSEL(0, 1),1705 .pll = PLL_28,1706 .tuner_type = TUNER_ABSENT,1707 .tuner_addr = ADDR_UNSET,1708 .no_msp34xx = 1,1709 .no_tda7432 = 1,1710 },1711 [BTTV_BOARD_OSPREY2x0] = {1712 .name = "Osprey 210/220/230", /* 0x1(A|B)-04C0-C1 */1713 .video_inputs = 2,1714 /* .audio_inputs= 1, */1715 .svhs = 1,1716 .muxsel = MUXSEL(2, 3),1717 .pll = PLL_28,1718 .tuner_type = TUNER_ABSENT,1719 .tuner_addr = ADDR_UNSET,1720 .no_msp34xx = 1,1721 .no_tda7432 = 1,1722 },1723 [BTTV_BOARD_OSPREY500] = {1724 .name = "Osprey 500", /* 500 */1725 .video_inputs = 2,1726 /* .audio_inputs= 1, */1727 .svhs = 1,1728 .muxsel = MUXSEL(2, 3),1729 .pll = PLL_28,1730 .tuner_type = TUNER_ABSENT,1731 .tuner_addr = ADDR_UNSET,1732 .no_msp34xx = 1,1733 .no_tda7432 = 1,1734 },1735 [BTTV_BOARD_OSPREY540] = {1736 .name = "Osprey 540", /* 540 */1737 .video_inputs = 4,1738 /* .audio_inputs= 1, */1739 .pll = PLL_28,1740 .tuner_type = TUNER_ABSENT,1741 .tuner_addr = ADDR_UNSET,1742 .no_msp34xx = 1,1743 .no_tda7432 = 1,1744 },1745 1746 /* ---- card 0x5C ---------------------------------- */1747 [BTTV_BOARD_OSPREY2000] = {1748 .name = "Osprey 2000", /* 2000 */1749 .video_inputs = 2,1750 /* .audio_inputs= 1, */1751 .svhs = 1,1752 .muxsel = MUXSEL(2, 3),1753 .pll = PLL_28,1754 .tuner_type = TUNER_ABSENT,1755 .tuner_addr = ADDR_UNSET,1756 .no_msp34xx = 1,1757 .no_tda7432 = 1, /* must avoid, conflicts with the bt860 */1758 },1759 [BTTV_BOARD_IDS_EAGLE] = {1760 /* M G Berberich <berberic@forwiss.uni-passau.de> */1761 .name = "IDS Eagle",1762 .video_inputs = 4,1763 /* .audio_inputs= 0, */1764 .tuner_type = TUNER_ABSENT,1765 .tuner_addr = ADDR_UNSET,1766 .svhs = NO_SVHS,1767 .gpiomask = 0,1768 .muxsel = MUXSEL(2, 2, 2, 2),1769 .muxsel_hook = eagle_muxsel,1770 .no_msp34xx = 1,1771 .pll = PLL_28,1772 },1773 [BTTV_BOARD_PINNACLESAT] = {1774 .name = "Pinnacle PCTV Sat",1775 .video_inputs = 2,1776 /* .audio_inputs= 0, */1777 .svhs = 1,1778 .tuner_type = TUNER_ABSENT,1779 .tuner_addr = ADDR_UNSET,1780 .no_msp34xx = 1,1781 .no_tda7432 = 1,1782 .muxsel = MUXSEL(3, 1),1783 .pll = PLL_28,1784 .no_gpioirq = 1,1785 .has_dvb = 1,1786 },1787 [BTTV_BOARD_FORMAC_PROTV] = {1788 .name = "Formac ProTV II (bt878)",1789 .video_inputs = 4,1790 /* .audio_inputs= 1, */1791 .svhs = 3,1792 .gpiomask = 2,1793 /* TV, Comp1, Composite over SVID con, SVID */1794 .muxsel = MUXSEL(2, 3, 1, 1),1795 .gpiomux = { 2, 2, 0, 0 },1796 .pll = PLL_28,1797 .has_radio = 1,1798 .tuner_type = TUNER_PHILIPS_PAL,1799 .tuner_addr = ADDR_UNSET,1800 /* sound routing:1801 GPIO=0x00,0x01,0x03: mute (?)1802 0x02: both TV and radio (tuner: FM1216/I)1803 The card has onboard audio connectors labeled "cdrom" and "board",1804 not soldered here, though unknown wiring.1805 Card lacks: external audio in, pci subsystem id.1806 */1807 },1808 1809 /* ---- card 0x60 ---------------------------------- */1810 [BTTV_BOARD_MACHTV] = {1811 .name = "MachTV",1812 .video_inputs = 3,1813 /* .audio_inputs= 1, */1814 .svhs = NO_SVHS,1815 .gpiomask = 7,1816 .muxsel = MUXSEL(2, 3, 1, 1),1817 .gpiomux = { 0, 1, 2, 3},1818 .gpiomute = 4,1819 .tuner_type = TUNER_PHILIPS_PAL,1820 .tuner_addr = ADDR_UNSET,1821 .pll = PLL_28,1822 },1823 [BTTV_BOARD_EURESYS_PICOLO] = {1824 .name = "Euresys Picolo",1825 .video_inputs = 3,1826 /* .audio_inputs= 0, */1827 .svhs = 2,1828 .gpiomask = 0,1829 .no_msp34xx = 1,1830 .no_tda7432 = 1,1831 .muxsel = MUXSEL(2, 0, 1),1832 .pll = PLL_28,1833 .tuner_type = TUNER_ABSENT,1834 .tuner_addr = ADDR_UNSET,1835 },1836 [BTTV_BOARD_PV150] = {1837 /* Luc Van Hoeylandt <luc@e-magic.be> */1838 .name = "ProVideo PV150", /* 0x4f */1839 .video_inputs = 2,1840 /* .audio_inputs= 0, */1841 .svhs = NO_SVHS,1842 .gpiomask = 0,1843 .muxsel = MUXSEL(2, 3),1844 .gpiomux = { 0 },1845 .no_msp34xx = 1,1846 .pll = PLL_28,1847 .tuner_type = TUNER_ABSENT,1848 .tuner_addr = ADDR_UNSET,1849 },1850 [BTTV_BOARD_AD_TVK503] = {1851 /* Hiroshi Takekawa <sian@big.or.jp> */1852 /* This card lacks subsystem ID */1853 .name = "AD-TVK503", /* 0x63 */1854 .video_inputs = 4,1855 /* .audio_inputs= 1, */1856 .svhs = 2,1857 .gpiomask = 0x001e8007,1858 .muxsel = MUXSEL(2, 3, 1, 0),1859 /* Tuner, Radio, external, internal, off, on */1860 .gpiomux = { 0x08, 0x0f, 0x0a, 0x08 },1861 .gpiomute = 0x0f,1862 .no_msp34xx = 1,1863 .pll = PLL_28,1864 .tuner_type = TUNER_PHILIPS_NTSC,1865 .tuner_addr = ADDR_UNSET,1866 .audio_mode_gpio= adtvk503_audio,1867 },1868 1869 /* ---- card 0x64 ---------------------------------- */1870 [BTTV_BOARD_HERCULES_SM_TV] = {1871 .name = "Hercules Smart TV Stereo",1872 .video_inputs = 4,1873 /* .audio_inputs= 1, */1874 .svhs = 2,1875 .gpiomask = 0x00,1876 .muxsel = MUXSEL(2, 3, 1, 1),1877 .no_msp34xx = 1,1878 .pll = PLL_28,1879 .tuner_type = TUNER_PHILIPS_PAL,1880 .tuner_addr = ADDR_UNSET,1881 /* Notes:1882 - card lacks subsystem ID1883 - stereo variant w/ daughter board with tda9874a @0xb01884 - Audio Routing:1885 always from tda9874 independent of GPIO (?)1886 external line in: unknown1887 - Other chips: em78p156elp @ 0x96 (probably IR remote control)1888 hef4053 (instead 4052) for unknown function1889 */1890 },1891 [BTTV_BOARD_PACETV] = {1892 .name = "Pace TV & Radio Card",1893 .video_inputs = 4,1894 /* .audio_inputs= 1, */1895 .svhs = 2,1896 /* Tuner, CVid, SVid, CVid over SVid connector */1897 .muxsel = MUXSEL(2, 3, 1, 1),1898 .gpiomask = 0,1899 .no_tda7432 = 1,1900 .tuner_type = TUNER_PHILIPS_PAL_I,1901 .tuner_addr = ADDR_UNSET,1902 .has_radio = 1,1903 .pll = PLL_28,1904 /* Bt878, Bt832, FI1246 tuner; no pci subsystem id1905 only internal line out: (4pin header) RGGL1906 Radio must be decoded by msp3410d (not routed through)*/1907 /*1908 .digital_mode = DIGITAL_MODE_CAMERA, todo!1909 */1910 },1911 [BTTV_BOARD_IVC200] = {1912 /* Chris Willing <chris@vislab.usyd.edu.au> */1913 .name = "IVC-200",1914 .video_inputs = 1,1915 /* .audio_inputs= 0, */1916 .tuner_type = TUNER_ABSENT,1917 .tuner_addr = ADDR_UNSET,1918 .svhs = NO_SVHS,1919 .gpiomask = 0xdf,1920 .muxsel = MUXSEL(2),1921 .pll = PLL_28,1922 },1923 [BTTV_BOARD_IVCE8784] = {1924 .name = "IVCE-8784",1925 .video_inputs = 1,1926 /* .audio_inputs= 0, */1927 .tuner_type = TUNER_ABSENT,1928 .tuner_addr = ADDR_UNSET,1929 .svhs = NO_SVHS,1930 .gpiomask = 0xdf,1931 .muxsel = MUXSEL(2),1932 .pll = PLL_28,1933 },1934 [BTTV_BOARD_XGUARD] = {1935 .name = "Grand X-Guard / Trust 814PCI",1936 .video_inputs = 16,1937 /* .audio_inputs= 0, */1938 .svhs = NO_SVHS,1939 .tuner_type = TUNER_ABSENT,1940 .tuner_addr = ADDR_UNSET,1941 .gpiomask2 = 0xff,1942 .muxsel = MUXSEL(2,2,2,2, 3,3,3,3, 1,1,1,1, 0,0,0,0),1943 .muxsel_hook = xguard_muxsel,1944 .no_msp34xx = 1,1945 .no_tda7432 = 1,1946 .pll = PLL_28,1947 },1948 1949 /* ---- card 0x68 ---------------------------------- */1950 [BTTV_BOARD_NEBULA_DIGITV] = {1951 .name = "Nebula Electronics DigiTV",1952 .video_inputs = 1,1953 .svhs = NO_SVHS,1954 .muxsel = MUXSEL(2, 3, 1, 0),1955 .no_msp34xx = 1,1956 .no_tda7432 = 1,1957 .pll = PLL_28,1958 .tuner_type = TUNER_ABSENT,1959 .tuner_addr = ADDR_UNSET,1960 .has_dvb = 1,1961 .has_remote = 1,1962 .gpiomask = 0x1b,1963 .no_gpioirq = 1,1964 },1965 [BTTV_BOARD_PV143] = {1966 /* Jorge Boncompte - DTI2 <jorge@dti2.net> */1967 .name = "ProVideo PV143",1968 .video_inputs = 4,1969 /* .audio_inputs= 0, */1970 .svhs = NO_SVHS,1971 .gpiomask = 0,1972 .muxsel = MUXSEL(2, 3, 1, 0),1973 .gpiomux = { 0 },1974 .no_msp34xx = 1,1975 .pll = PLL_28,1976 .tuner_type = TUNER_ABSENT,1977 .tuner_addr = ADDR_UNSET,1978 },1979 [BTTV_BOARD_VD009X1_VD011_MINIDIN] = {1980 /* M.Klahr@phytec.de */1981 .name = "PHYTEC VD-009-X1 VD-011 MiniDIN (bt878)",1982 .video_inputs = 4,1983 /* .audio_inputs= 0, */1984 .svhs = 3,1985 .gpiomask = 0x00,1986 .muxsel = MUXSEL(2, 3, 1, 0),1987 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */1988 .pll = PLL_28,1989 .tuner_type = TUNER_ABSENT,1990 .tuner_addr = ADDR_UNSET,1991 },1992 [BTTV_BOARD_VD009X1_VD011_COMBI] = {1993 .name = "PHYTEC VD-009-X1 VD-011 Combi (bt878)",1994 .video_inputs = 4,1995 /* .audio_inputs= 0, */1996 .svhs = 3,1997 .gpiomask = 0x00,1998 .muxsel = MUXSEL(2, 3, 1, 1),1999 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2000 .pll = PLL_28,2001 .tuner_type = TUNER_ABSENT,2002 .tuner_addr = ADDR_UNSET,2003 },2004 2005 /* ---- card 0x6c ---------------------------------- */2006 [BTTV_BOARD_VD009_MINIDIN] = {2007 .name = "PHYTEC VD-009 MiniDIN (bt878)",2008 .video_inputs = 10,2009 /* .audio_inputs= 0, */2010 .svhs = 9,2011 .gpiomask = 0x00,2012 .gpiomask2 = 0x03, /* used for external video mux */2013 .muxsel = MUXSEL(2, 2, 2, 2, 3, 3, 3, 3, 1, 0),2014 .muxsel_hook = phytec_muxsel,2015 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2016 .pll = PLL_28,2017 .tuner_type = TUNER_ABSENT,2018 .tuner_addr = ADDR_UNSET,2019 },2020 [BTTV_BOARD_VD009_COMBI] = {2021 .name = "PHYTEC VD-009 Combi (bt878)",2022 .video_inputs = 10,2023 /* .audio_inputs= 0, */2024 .svhs = 9,2025 .gpiomask = 0x00,2026 .gpiomask2 = 0x03, /* used for external video mux */2027 .muxsel = MUXSEL(2, 2, 2, 2, 3, 3, 3, 3, 1, 1),2028 .muxsel_hook = phytec_muxsel,2029 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2030 .pll = PLL_28,2031 .tuner_type = TUNER_ABSENT,2032 .tuner_addr = ADDR_UNSET,2033 },2034 [BTTV_BOARD_IVC100] = {2035 .name = "IVC-100",2036 .video_inputs = 4,2037 /* .audio_inputs= 0, */2038 .tuner_type = TUNER_ABSENT,2039 .tuner_addr = ADDR_UNSET,2040 .svhs = NO_SVHS,2041 .gpiomask = 0xdf,2042 .muxsel = MUXSEL(2, 3, 1, 0),2043 .pll = PLL_28,2044 },2045 [BTTV_BOARD_IVC120] = {2046 /* IVC-120G - Alan Garfield <alan@fromorbit.com> */2047 .name = "IVC-120G",2048 .video_inputs = 16,2049 /* .audio_inputs= 0, */2050 .tuner_type = TUNER_ABSENT,2051 .tuner_addr = ADDR_UNSET,2052 .svhs = NO_SVHS, /* card has no svhs */2053 .no_msp34xx = 1,2054 .no_tda7432 = 1,2055 .gpiomask = 0x00,2056 .muxsel = MUXSEL(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),2057 .muxsel_hook = ivc120_muxsel,2058 .pll = PLL_28,2059 },2060 2061 /* ---- card 0x70 ---------------------------------- */2062 [BTTV_BOARD_PC_HDTV] = {2063 .name = "pcHDTV HD-2000 TV",2064 .video_inputs = 4,2065 /* .audio_inputs= 1, */2066 .svhs = 2,2067 .muxsel = MUXSEL(2, 3, 1, 0),2068 .tuner_type = TUNER_PHILIPS_FCV1236D,2069 .tuner_addr = ADDR_UNSET,2070 .has_dvb = 1,2071 },2072 [BTTV_BOARD_TWINHAN_DST] = {2073 .name = "Twinhan DST + clones",2074 .no_msp34xx = 1,2075 .no_tda7432 = 1,2076 .tuner_type = TUNER_ABSENT,2077 .tuner_addr = ADDR_UNSET,2078 .no_video = 1,2079 .has_dvb = 1,2080 },2081 [BTTV_BOARD_WINFASTVC100] = {2082 .name = "Winfast VC100",2083 .video_inputs = 3,2084 /* .audio_inputs= 0, */2085 .svhs = 1,2086 /* Vid In, SVid In, Vid over SVid in connector */2087 .muxsel = MUXSEL(3, 1, 1, 3),2088 .no_msp34xx = 1,2089 .no_tda7432 = 1,2090 .tuner_type = TUNER_ABSENT,2091 .tuner_addr = ADDR_UNSET,2092 .pll = PLL_28,2093 },2094 [BTTV_BOARD_TEV560] = {2095 .name = "Teppro TEV-560/InterVision IV-560",2096 .video_inputs = 3,2097 /* .audio_inputs= 1, */2098 .svhs = 2,2099 .gpiomask = 3,2100 .muxsel = MUXSEL(2, 3, 1, 1),2101 .gpiomux = { 1, 1, 1, 1 },2102 .tuner_type = TUNER_PHILIPS_PAL,2103 .tuner_addr = ADDR_UNSET,2104 .pll = PLL_35,2105 },2106 2107 /* ---- card 0x74 ---------------------------------- */2108 [BTTV_BOARD_SIMUS_GVC1100] = {2109 .name = "SIMUS GVC1100",2110 .video_inputs = 4,2111 /* .audio_inputs= 0, */2112 .svhs = NO_SVHS,2113 .tuner_type = TUNER_ABSENT,2114 .tuner_addr = ADDR_UNSET,2115 .pll = PLL_28,2116 .muxsel = MUXSEL(2, 2, 2, 2),2117 .gpiomask = 0x3F,2118 .muxsel_hook = gvc1100_muxsel,2119 },2120 [BTTV_BOARD_NGSTV_PLUS] = {2121 /* Carlos Silva r3pek@r3pek.homelinux.org || card 0x75 */2122 .name = "NGS NGSTV+",2123 .video_inputs = 3,2124 .svhs = 2,2125 .gpiomask = 0x008007,2126 .muxsel = MUXSEL(2, 3, 0, 0),2127 .gpiomux = { 0, 0, 0, 0 },2128 .gpiomute = 0x000003,2129 .pll = PLL_28,2130 .tuner_type = TUNER_PHILIPS_PAL,2131 .tuner_addr = ADDR_UNSET,2132 .has_remote = 1,2133 },2134 [BTTV_BOARD_LMLBT4] = {2135 /* http://linuxmedialabs.com */2136 .name = "LMLBT4",2137 .video_inputs = 4, /* IN1,IN2,IN3,IN4 */2138 /* .audio_inputs= 0, */2139 .svhs = NO_SVHS,2140 .muxsel = MUXSEL(2, 3, 1, 0),2141 .no_msp34xx = 1,2142 .no_tda7432 = 1,2143 .tuner_type = TUNER_ABSENT,2144 .tuner_addr = ADDR_UNSET,2145 },2146 [BTTV_BOARD_TEKRAM_M205] = {2147 /* Helmroos Harri <harri.helmroos@pp.inet.fi> */2148 .name = "Tekram M205 PRO",2149 .video_inputs = 3,2150 /* .audio_inputs= 1, */2151 .tuner_type = TUNER_PHILIPS_PAL,2152 .tuner_addr = ADDR_UNSET,2153 .svhs = 2,2154 .gpiomask = 0x68,2155 .muxsel = MUXSEL(2, 3, 1),2156 .gpiomux = { 0x68, 0x68, 0x61, 0x61 },2157 .pll = PLL_28,2158 },2159 2160 /* ---- card 0x78 ---------------------------------- */2161 [BTTV_BOARD_CONTVFMI] = {2162 /* Javier Cendan Ares <jcendan@lycos.es> */2163 /* bt878 TV + FM without subsystem ID */2164 .name = "Conceptronic CONTVFMi",2165 .video_inputs = 3,2166 /* .audio_inputs= 1, */2167 .svhs = 2,2168 .gpiomask = 0x008007,2169 .muxsel = MUXSEL(2, 3, 1, 1),2170 .gpiomux = { 0, 1, 2, 2 },2171 .gpiomute = 3,2172 .pll = PLL_28,2173 .tuner_type = TUNER_PHILIPS_PAL,2174 .tuner_addr = ADDR_UNSET,2175 .has_remote = 1,2176 .has_radio = 1,2177 },2178 [BTTV_BOARD_PICOLO_TETRA_CHIP] = {2179 /*Eric DEBIEF <debief@telemsa.com>*/2180 /*EURESYS Picolo Tetra : 4 Conexant Fusion 878A, no audio, video input set with analog multiplexers GPIO controlled*/2181 /*adds picolo_tetra_muxsel(), picolo_tetra_init(), the following declaration*/2182 /*structure and #define BTTV_BOARD_PICOLO_TETRA_CHIP 0x79 in bttv.h*/2183 .name = "Euresys Picolo Tetra",2184 .video_inputs = 4,2185 /* .audio_inputs= 0, */2186 .svhs = NO_SVHS,2187 .gpiomask = 0,2188 .gpiomask2 = 0x3C<<16,/*Set the GPIO[18]->GPIO[21] as output pin.==> drive the video inputs through analog multiplexers*/2189 .no_msp34xx = 1,2190 .no_tda7432 = 1,2191 /*878A input is always MUX0, see above.*/2192 .muxsel = MUXSEL(2, 2, 2, 2),2193 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2194 .pll = PLL_28,2195 .muxsel_hook = picolo_tetra_muxsel,/*Required as it doesn't follow the classic input selection policy*/2196 .tuner_type = TUNER_ABSENT,2197 .tuner_addr = ADDR_UNSET,2198 },2199 [BTTV_BOARD_SPIRIT_TV] = {2200 /* Spirit TV Tuner from http://spiritmodems.com.au */2201 /* Stafford Goodsell <surge@goliath.homeunix.org> */2202 .name = "Spirit TV Tuner",2203 .video_inputs = 3,2204 /* .audio_inputs= 1, */2205 .svhs = 2,2206 .gpiomask = 0x0000000f,2207 .muxsel = MUXSEL(2, 1, 1),2208 .gpiomux = { 0x02, 0x00, 0x00, 0x00 },2209 .tuner_type = TUNER_TEMIC_PAL,2210 .tuner_addr = ADDR_UNSET,2211 .no_msp34xx = 1,2212 },2213 [BTTV_BOARD_AVDVBT_771] = {2214 /* Wolfram Joost <wojo@frokaschwei.de> */2215 .name = "AVerMedia AVerTV DVB-T 771",2216 .video_inputs = 2,2217 .svhs = 1,2218 .tuner_type = TUNER_ABSENT,2219 .tuner_addr = ADDR_UNSET,2220 .muxsel = MUXSEL(3, 3),2221 .no_msp34xx = 1,2222 .no_tda7432 = 1,2223 .pll = PLL_28,2224 .has_dvb = 1,2225 .no_gpioirq = 1,2226 .has_remote = 1,2227 },2228 /* ---- card 0x7c ---------------------------------- */2229 [BTTV_BOARD_AVDVBT_761] = {2230 /* Matt Jesson <dvb@jesson.eclipse.co.uk> */2231 /* Based on the Nebula card data - added remote and new card number - BTTV_BOARD_AVDVBT_761, see also ir-kbd-gpio.c */2232 .name = "AverMedia AverTV DVB-T 761",2233 .video_inputs = 2,2234 .svhs = 1,2235 .muxsel = MUXSEL(3, 1, 2, 0), /* Comp0, S-Video, ?, ? */2236 .no_msp34xx = 1,2237 .no_tda7432 = 1,2238 .pll = PLL_28,2239 .tuner_type = TUNER_ABSENT,2240 .tuner_addr = ADDR_UNSET,2241 .has_dvb = 1,2242 .no_gpioirq = 1,2243 .has_remote = 1,2244 },2245 [BTTV_BOARD_MATRIX_VISIONSQ] = {2246 /* andre.schwarz@matrix-vision.de */2247 .name = "MATRIX Vision Sigma-SQ",2248 .video_inputs = 16,2249 /* .audio_inputs= 0, */2250 .svhs = NO_SVHS,2251 .gpiomask = 0x0,2252 .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3),2253 .muxsel_hook = sigmaSQ_muxsel,2254 .gpiomux = { 0 },2255 .no_msp34xx = 1,2256 .pll = PLL_28,2257 .tuner_type = TUNER_ABSENT,2258 .tuner_addr = ADDR_UNSET,2259 },2260 [BTTV_BOARD_MATRIX_VISIONSLC] = {2261 /* andre.schwarz@matrix-vision.de */2262 .name = "MATRIX Vision Sigma-SLC",2263 .video_inputs = 4,2264 /* .audio_inputs= 0, */2265 .svhs = NO_SVHS,2266 .gpiomask = 0x0,2267 .muxsel = MUXSEL(2, 2, 2, 2),2268 .muxsel_hook = sigmaSLC_muxsel,2269 .gpiomux = { 0 },2270 .no_msp34xx = 1,2271 .pll = PLL_28,2272 .tuner_type = TUNER_ABSENT,2273 .tuner_addr = ADDR_UNSET,2274 },2275 /* BTTV_BOARD_APAC_VIEWCOMP */2276 [BTTV_BOARD_APAC_VIEWCOMP] = {2277 /* Attila Kondoros <attila.kondoros@chello.hu> */2278 /* bt878 TV + FM 0x00000000 subsystem ID */2279 .name = "APAC Viewcomp 878(AMAX)",2280 .video_inputs = 2,2281 /* .audio_inputs= 1, */2282 .svhs = NO_SVHS,2283 .gpiomask = 0xFF,2284 .muxsel = MUXSEL(2, 3, 1, 1),2285 .gpiomux = { 2, 0, 0, 0 },2286 .gpiomute = 10,2287 .pll = PLL_28,2288 .tuner_type = TUNER_PHILIPS_PAL,2289 .tuner_addr = ADDR_UNSET,2290 .has_remote = 1, /* miniremote works, see ir-kbd-gpio.c */2291 .has_radio = 1, /* not every card has radio */2292 },2293 2294 /* ---- card 0x80 ---------------------------------- */2295 [BTTV_BOARD_DVICO_DVBT_LITE] = {2296 /* Chris Pascoe <c.pascoe@itee.uq.edu.au> */2297 .name = "DViCO FusionHDTV DVB-T Lite",2298 .no_msp34xx = 1,2299 .no_tda7432 = 1,2300 .pll = PLL_28,2301 .no_video = 1,2302 .has_dvb = 1,2303 .tuner_type = TUNER_ABSENT,2304 .tuner_addr = ADDR_UNSET,2305 },2306 [BTTV_BOARD_VGEAR_MYVCD] = {2307 /* Steven <photon38@pchome.com.tw> */2308 .name = "V-Gear MyVCD",2309 .video_inputs = 3,2310 /* .audio_inputs= 1, */2311 .svhs = 2,2312 .gpiomask = 0x3f,2313 .muxsel = MUXSEL(2, 3, 1, 0),2314 .gpiomux = {0x31, 0x31, 0x31, 0x31 },2315 .gpiomute = 0x31,2316 .no_msp34xx = 1,2317 .pll = PLL_28,2318 .tuner_type = TUNER_PHILIPS_NTSC_M,2319 .tuner_addr = ADDR_UNSET,2320 .has_radio = 0,2321 },2322 [BTTV_BOARD_SUPER_TV] = {2323 /* Rick C <cryptdragoon@gmail.com> */2324 .name = "Super TV Tuner",2325 .video_inputs = 4,2326 /* .audio_inputs= 1, */2327 .svhs = 2,2328 .muxsel = MUXSEL(2, 3, 1, 0),2329 .tuner_type = TUNER_PHILIPS_NTSC,2330 .tuner_addr = ADDR_UNSET,2331 .gpiomask = 0x008007,2332 .gpiomux = { 0, 0x000001,0,0 },2333 .has_radio = 1,2334 },2335 [BTTV_BOARD_TIBET_CS16] = {2336 /* Chris Fanning <video4linux@haydon.net> */2337 .name = "Tibet Systems 'Progress DVR' CS16",2338 .video_inputs = 16,2339 /* .audio_inputs= 0, */2340 .svhs = NO_SVHS,2341 .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),2342 .pll = PLL_28,2343 .no_msp34xx = 1,2344 .no_tda7432 = 1,2345 .tuner_type = TUNER_ABSENT,2346 .tuner_addr = ADDR_UNSET,2347 .muxsel_hook = tibetCS16_muxsel,2348 },2349 [BTTV_BOARD_KODICOM_4400R] = {2350 /* Bill Brack <wbrack@mmm.com.hk> */2351 /*2352 * Note that, because of the card's wiring, the "master"2353 * BT878A chip (i.e. the one which controls the analog switch2354 * and must use this card type) is the 2nd one detected. The2355 * other 3 chips should use card type 0x85, whose description2356 * follows this one. There is a EEPROM on the card (which is2357 * connected to the I2C of one of those other chips), but is2358 * not currently handled. There is also a facility for a2359 * "monitor", which is also not currently implemented.2360 */2361 .name = "Kodicom 4400R (master)",2362 .video_inputs = 16,2363 /* .audio_inputs= 0, */2364 .tuner_type = TUNER_ABSENT,2365 .tuner_addr = ADDR_UNSET,2366 .svhs = NO_SVHS,2367 /* GPIO bits 0-9 used for analog switch:2368 * 00 - 03: camera selector2369 * 04 - 06: channel (controller) selector2370 * 07: data (1->on, 0->off)2371 * 08: strobe2372 * 09: reset2373 * bit 16 is input from sync separator for the channel2374 */2375 .gpiomask = 0x0003ff,2376 .no_gpioirq = 1,2377 .muxsel = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),2378 .pll = PLL_28,2379 .no_msp34xx = 1,2380 .no_tda7432 = 1,2381 .muxsel_hook = kodicom4400r_muxsel,2382 },2383 [BTTV_BOARD_KODICOM_4400R_SL] = {2384 /* Bill Brack <wbrack@mmm.com.hk> */2385 /* Note that, for reasons unknown, the "master" BT878A chip (i.e. the2386 * one which controls the analog switch, and must use the card type)2387 * is the 2nd one detected. The other 3 chips should use this card2388 * type2389 */2390 .name = "Kodicom 4400R (slave)",2391 .video_inputs = 16,2392 /* .audio_inputs= 0, */2393 .tuner_type = TUNER_ABSENT,2394 .tuner_addr = ADDR_UNSET,2395 .svhs = NO_SVHS,2396 .gpiomask = 0x010000,2397 .no_gpioirq = 1,2398 .muxsel = MUXSEL(3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3),2399 .pll = PLL_28,2400 .no_msp34xx = 1,2401 .no_tda7432 = 1,2402 .muxsel_hook = kodicom4400r_muxsel,2403 },2404 /* ---- card 0x86---------------------------------- */2405 [BTTV_BOARD_ADLINK_RTV24] = {2406 /* Michael Henson <mhenson@clarityvi.com> */2407 /* Adlink RTV24 with special unlock codes */2408 .name = "Adlink RTV24",2409 .video_inputs = 4,2410 /* .audio_inputs= 1, */2411 .svhs = 2,2412 .muxsel = MUXSEL(2, 3, 1, 0),2413 .tuner_type = UNSET,2414 .tuner_addr = ADDR_UNSET,2415 .pll = PLL_28,2416 },2417 /* ---- card 0x87---------------------------------- */2418 [BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE] = {2419 /* Michael Krufky <mkrufky@linuxtv.org> */2420 .name = "DViCO FusionHDTV 5 Lite",2421 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */2422 .tuner_addr = ADDR_UNSET,2423 .video_inputs = 3,2424 /* .audio_inputs= 1, */2425 .svhs = 2,2426 .muxsel = MUXSEL(2, 3, 1),2427 .gpiomask = 0x00e00007,2428 .gpiomux = { 0x00400005, 0, 0x00000001, 0 },2429 .gpiomute = 0x00c00007,2430 .no_msp34xx = 1,2431 .no_tda7432 = 1,2432 .has_dvb = 1,2433 },2434 /* ---- card 0x88---------------------------------- */2435 [BTTV_BOARD_ACORP_Y878F] = {2436 /* Mauro Carvalho Chehab <mchehab@kernel.org> */2437 .name = "Acorp Y878F",2438 .video_inputs = 3,2439 /* .audio_inputs= 1, */2440 .svhs = 2,2441 .gpiomask = 0x01fe00,2442 .muxsel = MUXSEL(2, 3, 1, 1),2443 .gpiomux = { 0x001e00, 0, 0x018000, 0x014000 },2444 .gpiomute = 0x002000,2445 .pll = PLL_28,2446 .tuner_type = TUNER_YMEC_TVF66T5_B_DFF,2447 .tuner_addr = 0xc1 >>1,2448 .has_radio = 1,2449 },2450 /* ---- card 0x89 ---------------------------------- */2451 [BTTV_BOARD_CONCEPTRONIC_CTVFMI2] = {2452 .name = "Conceptronic CTVFMi v2",2453 .video_inputs = 3,2454 /* .audio_inputs= 1, */2455 .svhs = 2,2456 .gpiomask = 0x001c0007,2457 .muxsel = MUXSEL(2, 3, 1, 1),2458 .gpiomux = { 0, 1, 2, 2 },2459 .gpiomute = 3,2460 .pll = PLL_28,2461 .tuner_type = TUNER_TENA_9533_DI,2462 .tuner_addr = ADDR_UNSET,2463 .has_remote = 1,2464 .has_radio = 1,2465 },2466 /* ---- card 0x8a ---------------------------------- */2467 [BTTV_BOARD_PV_BT878P_2E] = {2468 .name = "Prolink Pixelview PV-BT878P+ (Rev.2E)",2469 .video_inputs = 5,2470 /* .audio_inputs= 1, */2471 .svhs = 3,2472 .has_dig_in = 1,2473 .gpiomask = 0x01fe00,2474 .muxsel = MUXSEL(2, 3, 1, 1, 0), /* in 4 is digital */2475 /* .digital_mode= DIGITAL_MODE_CAMERA, */2476 .gpiomux = { 0x00400, 0x10400, 0x04400, 0x80000 },2477 .gpiomute = 0x12400,2478 .no_msp34xx = 1,2479 .pll = PLL_28,2480 .tuner_type = TUNER_LG_PAL_FM,2481 .tuner_addr = ADDR_UNSET,2482 .has_remote = 1,2483 },2484 /* ---- card 0x8b ---------------------------------- */2485 [BTTV_BOARD_PV_M4900] = {2486 /* Sérgio Fortier <sergiofortier@yahoo.com.br> */2487 .name = "Prolink PixelView PlayTV MPEG2 PV-M4900",2488 .video_inputs = 3,2489 /* .audio_inputs= 1, */2490 .svhs = 2,2491 .gpiomask = 0x3f,2492 .muxsel = MUXSEL(2, 3, 1, 1),2493 .gpiomux = { 0x21, 0x20, 0x24, 0x2c },2494 .gpiomute = 0x29,2495 .no_msp34xx = 1,2496 .pll = PLL_28,2497 .tuner_type = TUNER_YMEC_TVF_5533MF,2498 .tuner_addr = ADDR_UNSET,2499 .has_radio = 1,2500 .has_remote = 1,2501 },2502 /* ---- card 0x8c ---------------------------------- */2503 /* Has four Bt878 chips behind a PCI bridge, each chip has:2504 one external BNC composite input (mux 2)2505 three internal composite inputs (unknown muxes)2506 an 18-bit stereo A/D (CS5331A), which has:2507 one external stereo unbalanced (RCA) audio connection2508 one (or 3?) internal stereo balanced (XLR) audio connection2509 input is selected via gpio to a 14052B mux2510 (mask=0x300, unbal=0x000, bal=0x100, ??=0x200,0x300)2511 gain is controlled via an X9221A chip on the I2C bus @0x282512 sample rate is controlled via gpio to an MK1413S2513 (mask=0x3, 32kHz=0x0, 44.1kHz=0x1, 48kHz=0x2, ??=0x3)2514 There is neither a tuner nor an svideo input. */2515 [BTTV_BOARD_OSPREY440] = {2516 .name = "Osprey 440",2517 .video_inputs = 4,2518 /* .audio_inputs= 2, */2519 .svhs = NO_SVHS,2520 .muxsel = MUXSEL(2, 3, 0, 1), /* 3,0,1 are guesses */2521 .gpiomask = 0x303,2522 .gpiomute = 0x000, /* int + 32kHz */2523 .gpiomux = { 0, 0, 0x000, 0x100},2524 .pll = PLL_28,2525 .tuner_type = TUNER_ABSENT,2526 .tuner_addr = ADDR_UNSET,2527 .no_msp34xx = 1,2528 .no_tda7432 = 1,2529 },2530 /* ---- card 0x8d ---------------------------------- */2531 [BTTV_BOARD_ASOUND_SKYEYE] = {2532 .name = "Asound Skyeye PCTV",2533 .video_inputs = 3,2534 /* .audio_inputs= 1, */2535 .svhs = 2,2536 .gpiomask = 15,2537 .muxsel = MUXSEL(2, 3, 1, 1),2538 .gpiomux = { 2, 0, 0, 0 },2539 .gpiomute = 1,2540 .pll = PLL_28,2541 .tuner_type = TUNER_PHILIPS_NTSC,2542 .tuner_addr = ADDR_UNSET,2543 },2544 /* ---- card 0x8e ---------------------------------- */2545 [BTTV_BOARD_SABRENT_TVFM] = {2546 .name = "Sabrent TV-FM (bttv version)",2547 .video_inputs = 3,2548 /* .audio_inputs= 1, */2549 .svhs = 2,2550 .gpiomask = 0x108007,2551 .muxsel = MUXSEL(2, 3, 1, 1),2552 .gpiomux = { 100000, 100002, 100002, 100000 },2553 .no_msp34xx = 1,2554 .no_tda7432 = 1,2555 .pll = PLL_28,2556 .tuner_type = TUNER_TNF_5335MF,2557 .tuner_addr = ADDR_UNSET,2558 .has_radio = 1,2559 },2560 /* ---- card 0x8f ---------------------------------- */2561 [BTTV_BOARD_HAUPPAUGE_IMPACTVCB] = {2562 .name = "Hauppauge ImpactVCB (bt878)",2563 .video_inputs = 4,2564 /* .audio_inputs= 0, */2565 .svhs = NO_SVHS,2566 .gpiomask = 0x0f, /* old: 7 */2567 .muxsel = MUXSEL(0, 1, 3, 2), /* Composite 0-3 */2568 .no_msp34xx = 1,2569 .no_tda7432 = 1,2570 .tuner_type = TUNER_ABSENT,2571 .tuner_addr = ADDR_UNSET,2572 },2573 [BTTV_BOARD_MACHTV_MAGICTV] = {2574 /* Julian Calaby <julian.calaby@gmail.com>2575 * Slightly different from original MachTV definition (0x60)2576 2577 * FIXME: RegSpy says gpiomask should be "0x001c800f", but it2578 * stuffs up remote chip. Bug is a pin on the jaecs is not set2579 * properly (methinks) causing no keyup bits being set */2580 2581 .name = "MagicTV", /* rebranded MachTV */2582 .video_inputs = 3,2583 /* .audio_inputs= 1, */2584 .svhs = 2,2585 .gpiomask = 7,2586 .muxsel = MUXSEL(2, 3, 1, 1),2587 .gpiomux = { 0, 1, 2, 3 },2588 .gpiomute = 4,2589 .tuner_type = TUNER_TEMIC_4009FR5_PAL,2590 .tuner_addr = ADDR_UNSET,2591 .pll = PLL_28,2592 .has_radio = 1,2593 .has_remote = 1,2594 },2595 [BTTV_BOARD_SSAI_SECURITY] = {2596 .name = "SSAI Security Video Interface",2597 .video_inputs = 4,2598 /* .audio_inputs= 0, */2599 .svhs = NO_SVHS,2600 .muxsel = MUXSEL(0, 1, 2, 3),2601 .tuner_type = TUNER_ABSENT,2602 .tuner_addr = ADDR_UNSET,2603 },2604 [BTTV_BOARD_SSAI_ULTRASOUND] = {2605 .name = "SSAI Ultrasound Video Interface",2606 .video_inputs = 2,2607 /* .audio_inputs= 0, */2608 .svhs = 1,2609 .muxsel = MUXSEL(2, 0, 1, 3),2610 .tuner_type = TUNER_ABSENT,2611 .tuner_addr = ADDR_UNSET,2612 },2613 /* ---- card 0x94---------------------------------- */2614 [BTTV_BOARD_DVICO_FUSIONHDTV_2] = {2615 .name = "DViCO FusionHDTV 2",2616 .tuner_type = TUNER_PHILIPS_FCV1236D,2617 .tuner_addr = ADDR_UNSET,2618 .video_inputs = 3,2619 /* .audio_inputs= 1, */2620 .svhs = 2,2621 .muxsel = MUXSEL(2, 3, 1),2622 .gpiomask = 0x00e00007,2623 .gpiomux = { 0x00400005, 0, 0x00000001, 0 },2624 .gpiomute = 0x00c00007,2625 .no_msp34xx = 1,2626 .no_tda7432 = 1,2627 },2628 /* ---- card 0x95---------------------------------- */2629 [BTTV_BOARD_TYPHOON_TVTUNERPCI] = {2630 .name = "Typhoon TV-Tuner PCI (50684)",2631 .video_inputs = 3,2632 /* .audio_inputs= 1, */2633 .svhs = 2,2634 .gpiomask = 0x3014f,2635 .muxsel = MUXSEL(2, 3, 1, 1),2636 .gpiomux = { 0x20001,0x10001, 0, 0 },2637 .gpiomute = 10,2638 .pll = PLL_28,2639 .tuner_type = TUNER_PHILIPS_PAL_I,2640 .tuner_addr = ADDR_UNSET,2641 },2642 [BTTV_BOARD_GEOVISION_GV600] = {2643 /* emhn@usb.ve */2644 .name = "Geovision GV-600",2645 .video_inputs = 16,2646 /* .audio_inputs= 0, */2647 .svhs = NO_SVHS,2648 .gpiomask = 0x0,2649 .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),2650 .muxsel_hook = geovision_muxsel,2651 .gpiomux = { 0 },2652 .no_msp34xx = 1,2653 .pll = PLL_28,2654 .tuner_type = TUNER_ABSENT,2655 .tuner_addr = ADDR_UNSET,2656 },2657 [BTTV_BOARD_KOZUMI_KTV_01C] = {2658 /* Mauro Lacy <mauro@lacy.com.ar>2659 * Based on MagicTV and Conceptronic CONTVFMi */2660 2661 .name = "Kozumi KTV-01C",2662 .video_inputs = 3,2663 /* .audio_inputs= 1, */2664 .svhs = 2,2665 .gpiomask = 0x008007,2666 .muxsel = MUXSEL(2, 3, 1, 1),2667 .gpiomux = { 0, 1, 2, 2 }, /* CONTVFMi */2668 .gpiomute = 3, /* CONTVFMi */2669 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, /* TCL MK3 */2670 .tuner_addr = ADDR_UNSET,2671 .pll = PLL_28,2672 .has_radio = 1,2673 .has_remote = 1,2674 },2675 [BTTV_BOARD_ENLTV_FM_2] = {2676 /* Encore TV Tuner Pro ENL TV-FM-22677 Mauro Carvalho Chehab <mchehab@kernel.org> */2678 .name = "Encore ENL TV-FM-2",2679 .video_inputs = 3,2680 /* .audio_inputs= 1, */2681 .svhs = 2,2682 /* bit 6 -> IR disabled2683 bit 18/17 = 00 -> mute2684 01 -> enable external audio input2685 10 -> internal audio input (mono?)2686 11 -> internal audio input2687 */2688 .gpiomask = 0x060040,2689 .muxsel = MUXSEL(2, 3, 3),2690 .gpiomux = { 0x60000, 0x60000, 0x20000, 0x20000 },2691 .gpiomute = 0,2692 .tuner_type = TUNER_TCL_MF02GIP_5N,2693 .tuner_addr = ADDR_UNSET,2694 .pll = PLL_28,2695 .has_radio = 1,2696 .has_remote = 1,2697 },2698 [BTTV_BOARD_VD012] = {2699 /* D.Heer@Phytec.de */2700 .name = "PHYTEC VD-012 (bt878)",2701 .video_inputs = 4,2702 /* .audio_inputs= 0, */2703 .svhs = NO_SVHS,2704 .gpiomask = 0x00,2705 .muxsel = MUXSEL(0, 2, 3, 1),2706 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2707 .pll = PLL_28,2708 .tuner_type = TUNER_ABSENT,2709 .tuner_addr = ADDR_UNSET,2710 },2711 [BTTV_BOARD_VD012_X1] = {2712 /* D.Heer@Phytec.de */2713 .name = "PHYTEC VD-012-X1 (bt878)",2714 .video_inputs = 4,2715 /* .audio_inputs= 0, */2716 .svhs = 3,2717 .gpiomask = 0x00,2718 .muxsel = MUXSEL(2, 3, 1),2719 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2720 .pll = PLL_28,2721 .tuner_type = TUNER_ABSENT,2722 .tuner_addr = ADDR_UNSET,2723 },2724 [BTTV_BOARD_VD012_X2] = {2725 /* D.Heer@Phytec.de */2726 .name = "PHYTEC VD-012-X2 (bt878)",2727 .video_inputs = 4,2728 /* .audio_inputs= 0, */2729 .svhs = 3,2730 .gpiomask = 0x00,2731 .muxsel = MUXSEL(3, 2, 1),2732 .gpiomux = { 0, 0, 0, 0 }, /* card has no audio */2733 .pll = PLL_28,2734 .tuner_type = TUNER_ABSENT,2735 .tuner_addr = ADDR_UNSET,2736 },2737 [BTTV_BOARD_GEOVISION_GV800S] = {2738 /* Bruno Christo <bchristo@inf.ufsm.br>2739 *2740 * GeoVision GV-800(S) has 4 Conexant Fusion 878A:2741 * 1 audio input per BT878A = 4 audio inputs2742 * 4 video inputs per BT878A = 16 video inputs2743 * This is the first BT878A chip of the GV-800(S). It's the2744 * "master" chip and it controls the video inputs through an2745 * analog multiplexer (a CD22M3494) via some GPIO pins. The2746 * slaves should use card type 0x9e (following this one).2747 * There is a EEPROM on the card which is currently not handled.2748 * The audio input is not working yet.2749 */2750 .name = "Geovision GV-800(S) (master)",2751 .video_inputs = 4,2752 /* .audio_inputs= 1, */2753 .tuner_type = TUNER_ABSENT,2754 .tuner_addr = ADDR_UNSET,2755 .svhs = NO_SVHS,2756 .gpiomask = 0xf107f,2757 .no_gpioirq = 1,2758 .muxsel = MUXSEL(2, 2, 2, 2),2759 .pll = PLL_28,2760 .no_msp34xx = 1,2761 .no_tda7432 = 1,2762 .muxsel_hook = gv800s_muxsel,2763 },2764 [BTTV_BOARD_GEOVISION_GV800S_SL] = {2765 /* Bruno Christo <bchristo@inf.ufsm.br>2766 *2767 * GeoVision GV-800(S) has 4 Conexant Fusion 878A:2768 * 1 audio input per BT878A = 4 audio inputs2769 * 4 video inputs per BT878A = 16 video inputs2770 * The 3 other BT878A chips are "slave" chips of the GV-800(S)2771 * and should use this card type.2772 * The audio input is not working yet.2773 */2774 .name = "Geovision GV-800(S) (slave)",2775 .video_inputs = 4,2776 /* .audio_inputs= 1, */2777 .tuner_type = TUNER_ABSENT,2778 .tuner_addr = ADDR_UNSET,2779 .svhs = NO_SVHS,2780 .gpiomask = 0x00,2781 .no_gpioirq = 1,2782 .muxsel = MUXSEL(2, 2, 2, 2),2783 .pll = PLL_28,2784 .no_msp34xx = 1,2785 .no_tda7432 = 1,2786 .muxsel_hook = gv800s_muxsel,2787 },2788 [BTTV_BOARD_PV183] = {2789 .name = "ProVideo PV183", /* 0x9f */2790 .video_inputs = 2,2791 /* .audio_inputs= 0, */2792 .svhs = NO_SVHS,2793 .gpiomask = 0,2794 .muxsel = MUXSEL(2, 3),2795 .gpiomux = { 0 },2796 .no_msp34xx = 1,2797 .pll = PLL_28,2798 .tuner_type = TUNER_ABSENT,2799 .tuner_addr = ADDR_UNSET,2800 },2801 /* ---- card 0xa0---------------------------------- */2802 [BTTV_BOARD_TVT_TD3116] = {2803 .name = "Tongwei Video Technology TD-3116",2804 .video_inputs = 16,2805 .gpiomask = 0xc00ff,2806 .muxsel = MUXSEL(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2),2807 .muxsel_hook = td3116_muxsel,2808 .svhs = NO_SVHS,2809 .pll = PLL_28,2810 .tuner_type = TUNER_ABSENT,2811 },2812 [BTTV_BOARD_APOSONIC_WDVR] = {2813 .name = "Aposonic W-DVR",2814 .video_inputs = 4,2815 .svhs = NO_SVHS,2816 .muxsel = MUXSEL(2, 3, 1, 0),2817 .tuner_type = TUNER_ABSENT,2818 },2819 [BTTV_BOARD_ADLINK_MPG24] = {2820 /* Adlink MPG24 */2821 .name = "Adlink MPG24",2822 .video_inputs = 1,2823 /* .audio_inputs= 1, */2824 .svhs = NO_SVHS,2825 .muxsel = MUXSEL(2, 2, 2, 2),2826 .tuner_type = UNSET,2827 .tuner_addr = ADDR_UNSET,2828 .pll = PLL_28,2829 },2830 [BTTV_BOARD_BT848_CAP_14] = {2831 .name = "Bt848 Capture 14MHz",2832 .video_inputs = 4,2833 .svhs = 2,2834 .muxsel = MUXSEL(2, 3, 1, 0),2835 .pll = PLL_14,2836 .tuner_type = TUNER_ABSENT,2837 },2838 [BTTV_BOARD_CYBERVISION_CV06] = {2839 .name = "CyberVision CV06 (SV)",2840 .video_inputs = 4,2841 /* .audio_inputs= 0, */2842 .svhs = NO_SVHS,2843 .muxsel = MUXSEL(2, 3, 1, 0),2844 .pll = PLL_28,2845 .tuner_type = TUNER_ABSENT,2846 .tuner_addr = ADDR_UNSET,2847 },2848 [BTTV_BOARD_KWORLD_VSTREAM_XPERT] = {2849 /* Pojar George <geoubuntu@gmail.com> */2850 .name = "Kworld V-Stream Xpert TV PVR878",2851 .video_inputs = 3,2852 /* .audio_inputs= 1, */2853 .svhs = 2,2854 .gpiomask = 0x001c0007,2855 .muxsel = MUXSEL(2, 3, 1, 1),2856 .gpiomux = { 0, 1, 2, 2 },2857 .gpiomute = 3,2858 .pll = PLL_28,2859 .tuner_type = TUNER_TENA_9533_DI,2860 .tuner_addr = ADDR_UNSET,2861 .has_remote = 1,2862 .has_radio = 1,2863 },2864 /* ---- card 0xa6---------------------------------- */2865 [BTTV_BOARD_PCI_8604PW] = {2866 /* PCI-8604PW with special unlock sequence */2867 .name = "PCI-8604PW",2868 .video_inputs = 2,2869 /* .audio_inputs= 0, */2870 .svhs = NO_SVHS,2871 /* The second input is available on CN4, if populated.2872 * The other 5x2 header (CN2?) connects to the same inputs2873 * as the on-board BNCs */2874 .muxsel = MUXSEL(2, 3),2875 .tuner_type = TUNER_ABSENT,2876 .no_msp34xx = 1,2877 .no_tda7432 = 1,2878 .pll = PLL_35,2879 },2880};2881 2882static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);2883 2884/* ----------------------------------------------------------------------- */2885 2886static unsigned char eeprom_data[256];2887 2888/*2889 * identify card2890 */2891void bttv_idcard(struct bttv *btv)2892{2893 unsigned int gpiobits;2894 int i,type;2895 2896 /* read PCI subsystem ID */2897 btv->cardid = btv->c.pci->subsystem_device << 16;2898 btv->cardid |= btv->c.pci->subsystem_vendor;2899 2900 if (0 != btv->cardid && 0xffffffff != btv->cardid) {2901 /* look for the card */2902 for (type = -1, i = 0; cards[i].id != 0; i++)2903 if (cards[i].id == btv->cardid)2904 type = i;2905 2906 if (type != -1) {2907 /* found it */2908 pr_info("%d: detected: %s [card=%d], PCI subsystem ID is %04x:%04x\n",2909 btv->c.nr, cards[type].name, cards[type].cardnr,2910 btv->cardid & 0xffff,2911 (btv->cardid >> 16) & 0xffff);2912 btv->c.type = cards[type].cardnr;2913 } else {2914 /* 404 */2915 pr_info("%d: subsystem: %04x:%04x (UNKNOWN)\n",2916 btv->c.nr, btv->cardid & 0xffff,2917 (btv->cardid >> 16) & 0xffff);2918 pr_debug("please mail id, board name and the correct card= insmod option to linux-media@vger.kernel.org\n");2919 }2920 }2921 2922 /* let the user override the autodetected type */2923 if (card[btv->c.nr] < bttv_num_tvcards)2924 btv->c.type=card[btv->c.nr];2925 2926 /* print which card config we are using */2927 pr_info("%d: using: %s [card=%d,%s]\n",2928 btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type,2929 card[btv->c.nr] < bttv_num_tvcards2930 ? "insmod option" : "autodetected");2931 2932 /* overwrite gpio stuff ?? */2933 if (UNSET == audioall && UNSET == audiomux[0])2934 return;2935 2936 if (UNSET != audiomux[0]) {2937 gpiobits = 0;2938 for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {2939 bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i];2940 gpiobits |= audiomux[i];2941 }2942 } else {2943 gpiobits = audioall;2944 for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {2945 bttv_tvcards[btv->c.type].gpiomux[i] = audioall;2946 }2947 }2948 bttv_tvcards[btv->c.type].gpiomask = (UNSET != gpiomask) ? gpiomask : gpiobits;2949 pr_info("%d: gpio config override: mask=0x%x, mux=",2950 btv->c.nr, bttv_tvcards[btv->c.type].gpiomask);2951 for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {2952 pr_cont("%s0x%x",2953 i ? "," : "", bttv_tvcards[btv->c.type].gpiomux[i]);2954 }2955 pr_cont("\n");2956}2957 2958/*2959 * (most) board specific initialisations goes here2960 */2961 2962/* Some Modular Technology cards have an eeprom, but no subsystem ID */2963static void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])2964{2965 int type = -1;2966 2967 if (0 == strncmp(eeprom_data,"GET MM20xPCTV",13))2968 type = BTTV_BOARD_MODTEC_205;2969 else if (0 == strncmp(eeprom_data+20,"Picolo",7))2970 type = BTTV_BOARD_EURESYS_PICOLO;2971 else if (eeprom_data[0] == 0x84 && eeprom_data[2]== 0)2972 type = BTTV_BOARD_HAUPPAUGE; /* old bt848 */2973 2974 if (-1 != type) {2975 btv->c.type = type;2976 pr_info("%d: detected by eeprom: %s [card=%d]\n",2977 btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type);2978 }2979}2980 2981static void flyvideo_gpio(struct bttv *btv)2982{2983 int gpio, has_remote, has_radio, is_capture_only;2984 int is_lr90, has_tda9820_tda9821;2985 int tuner_type = UNSET, ttype;2986 2987 gpio_inout(0xffffff, 0);2988 udelay(8); /* without this we would see the 0x1800 mask */2989 gpio = gpio_read();2990 /* FIXME: must restore OUR_EN ??? */2991 2992 /* all cards provide GPIO info, some have an additional eeprom2993 * LR50: GPIO coding can be found lower right CP1 .. CP92994 * CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1.2995 * GPIO14-12: n.c.2996 * LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878)2997 2998 * lowest 3 bytes are remote control codes (no handshake needed)2999 * xxxFFF: No remote control chip soldered3000 * xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered3001 * Note: Some bits are Audio_Mask !3002 */3003 ttype = (gpio & 0x0f0000) >> 16;3004 switch (ttype) {3005 case 0x0:3006 tuner_type = 2; /* NTSC, e.g. TPI8NSR11P */3007 break;3008 case 0x2:3009 tuner_type = 39; /* LG NTSC (newer TAPC series) TAPC-H701P */3010 break;3011 case 0x4:3012 tuner_type = 5; /* Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216 */3013 break;3014 case 0x6:3015 tuner_type = 37; /* LG PAL (newer TAPC series) TAPC-G702P */3016 break;3017 case 0xC:3018 tuner_type = 3; /* Philips SECAM(+PAL) FQ1216ME or FI1216MF */3019 break;3020 default:3021 pr_info("%d: FlyVideo_gpio: unknown tuner type\n", btv->c.nr);3022 break;3023 }3024 3025 has_remote = gpio & 0x800000;3026 has_radio = gpio & 0x400000;3027 /* unknown 0x200000;3028 * unknown2 0x100000; */3029 is_capture_only = !(gpio & 0x008000); /* GPIO15 */3030 has_tda9820_tda9821 = !(gpio & 0x004000);3031 is_lr90 = !(gpio & 0x002000); /* else LR26/LR50 (LR38/LR51 f. capture only) */3032 /*3033 * gpio & 0x001000 output bit for audio routing */3034 3035 if (is_capture_only)3036 tuner_type = TUNER_ABSENT; /* No tuner present */3037 3038 pr_info("%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",3039 btv->c.nr, has_radio ? "yes" : "no",3040 has_remote ? "yes" : "no", tuner_type, gpio);3041 pr_info("%d: FlyVideo LR90=%s tda9821/tda9820=%s capture_only=%s\n",3042 btv->c.nr, is_lr90 ? "yes" : "no",3043 has_tda9820_tda9821 ? "yes" : "no",3044 is_capture_only ? "yes" : "no");3045 3046 if (tuner_type != UNSET) /* only set if known tuner autodetected, else let insmod option through */3047 btv->tuner_type = tuner_type;3048 btv->has_radio = has_radio;3049 3050 /* LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c803051 * LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c003052 * Audio options: from tuner, from tda9821/tda9821(mono,stereo,sap), from tda9874, ext., mute */3053 if (has_tda9820_tda9821)3054 btv->audio_mode_gpio = lt9415_audio;3055 /* todo: if(has_tda9874) btv->audio_mode_gpio = fv2000s_audio; */3056}3057 3058static int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1,3059 14,2,17,1, 4,1,4,3, 1,2,16,1, 4,4,4,4 };3060static int miro_fmtuner[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1,3061 1,1,1,1, 1,1,1,0, 0,0,0,0, 0,1,0,0 };3062 3063static void miro_pinnacle_gpio(struct bttv *btv)3064{3065 int id,msp,gpio;3066 char *info;3067 3068 gpio_inout(0xffffff, 0);3069 gpio = gpio_read();3070 id = ((gpio>>10) & 63) -1;3071 msp = bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx");3072 if (id < 32) {3073 btv->tuner_type = miro_tunermap[id];3074 if (0 == (gpio & 0x20)) {3075 btv->has_radio = 1;3076 if (!miro_fmtuner[id]) {3077 btv->has_tea575x = 1;3078 btv->tea_gpio.wren = 6;3079 btv->tea_gpio.most = 7;3080 btv->tea_gpio.clk = 8;3081 btv->tea_gpio.data = 9;3082 tea575x_init(btv);3083 }3084 } else {3085 btv->has_radio = 0;3086 }3087 if (-1 != msp) {3088 if (btv->c.type == BTTV_BOARD_MIRO)3089 btv->c.type = BTTV_BOARD_MIROPRO;3090 if (btv->c.type == BTTV_BOARD_PINNACLE)3091 btv->c.type = BTTV_BOARD_PINNACLEPRO;3092 }3093 pr_info("%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",3094 btv->c.nr, id+1, btv->tuner_type,3095 !btv->has_radio ? "no" :3096 (btv->has_tea575x ? "tea575x" : "fmtuner"),3097 (-1 == msp) ? "no" : "yes");3098 } else {3099 /* new cards with microtune tuner */3100 id = 63 - id;3101 btv->has_radio = 0;3102 switch (id) {3103 case 1:3104 info = "PAL / mono";3105 btv->tda9887_conf = TDA9887_INTERCARRIER;3106 break;3107 case 2:3108 info = "PAL+SECAM / stereo";3109 btv->has_radio = 1;3110 btv->tda9887_conf = TDA9887_QSS;3111 break;3112 case 3:3113 info = "NTSC / stereo";3114 btv->has_radio = 1;3115 btv->tda9887_conf = TDA9887_QSS;3116 break;3117 case 4:3118 info = "PAL+SECAM / mono";3119 btv->tda9887_conf = TDA9887_QSS;3120 break;3121 case 5:3122 info = "NTSC / mono";3123 btv->tda9887_conf = TDA9887_INTERCARRIER;3124 break;3125 case 6:3126 info = "NTSC / stereo";3127 btv->tda9887_conf = TDA9887_INTERCARRIER;3128 break;3129 case 7:3130 info = "PAL / stereo";3131 btv->tda9887_conf = TDA9887_INTERCARRIER;3132 break;3133 default:3134 info = "oops: unknown card";3135 break;3136 }3137 if (-1 != msp)3138 btv->c.type = BTTV_BOARD_PINNACLEPRO;3139 pr_info("%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n",3140 btv->c.nr, id, info, btv->has_radio ? "yes" : "no");3141 btv->tuner_type = TUNER_MT2032;3142 }3143}3144 3145/* GPIO21 L: Buffer aktiv, H: Buffer inaktiv */3146#define LM1882_SYNC_DRIVE 0x200000L3147 3148static void init_ids_eagle(struct bttv *btv)3149{3150 gpio_inout(0xffffff,0xFFFF37);3151 gpio_write(0x200020);3152 3153 /* flash strobe inverter ?! */3154 gpio_write(0x200024);3155 3156 /* switch sync drive off */3157 gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE);3158 3159 /* set BT848 muxel to 2 */3160 btaor((2)<<5, ~(2<<5), BT848_IFORM);3161}3162 3163/* Muxsel helper for the IDS Eagle.3164 * the eagles does not use the standard muxsel-bits but3165 * has its own multiplexer */3166static void eagle_muxsel(struct bttv *btv, unsigned int input)3167{3168 gpio_bits(3, input & 3);3169 3170 /* composite */3171 /* set chroma ADC to sleep */3172 btor(BT848_ADC_C_SLEEP, BT848_ADC);3173 /* set to composite video */3174 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);3175 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);3176 3177 /* switch sync drive off */3178 gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE);3179}3180 3181static void gvc1100_muxsel(struct bttv *btv, unsigned int input)3182{3183 static const int masks[] = {0x30, 0x01, 0x12, 0x23};3184 gpio_write(masks[input%4]);3185}3186 3187/* LMLBT4x initialization - to allow access to GPIO bits for sensors input and3188 alarms output3189 3190 GPIObit | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |3191 assignment | TI | O3|INx| O2| O1|IN4|IN3|IN2|IN1| | |3192 3193 IN - sensor inputs, INx - sensor inputs and TI XORed together3194 O1,O2,O3 - alarm outputs (relays)3195 3196 OUT ENABLE 1 1 0 . 1 1 0 0 . 0 0 0 0 = 0x6C03197 3198*/3199 3200static void init_lmlbt4x(struct bttv *btv)3201{3202 pr_debug("LMLBT4x init\n");3203 btwrite(0x000000, BT848_GPIO_REG_INP);3204 gpio_inout(0xffffff, 0x0006C0);3205 gpio_write(0x000000);3206}3207 3208static void sigmaSQ_muxsel(struct bttv *btv, unsigned int input)3209{3210 unsigned int inmux = input % 8;3211 gpio_inout( 0xf, 0xf );3212 gpio_bits( 0xf, inmux );3213}3214 3215static void sigmaSLC_muxsel(struct bttv *btv, unsigned int input)3216{3217 unsigned int inmux = input % 4;3218 gpio_inout( 3<<9, 3<<9 );3219 gpio_bits( 3<<9, inmux<<9 );3220}3221 3222static void geovision_muxsel(struct bttv *btv, unsigned int input)3223{3224 unsigned int inmux = input % 16;3225 gpio_inout(0xf, 0xf);3226 gpio_bits(0xf, inmux);3227}3228 3229/*3230 * The TD3116 has 2 74HC4051 muxes wired to the MUX0 input of a bt878.3231 * The first 74HC4051 has the lower 8 inputs, the second one the higher 8.3232 * The muxes are controlled via a 74HC373 latch which is connected to3233 * GPIOs 0-7. GPIO 18 is connected to the LE signal of the latch.3234 * Q0 of the latch is connected to the Enable (~E) input of the first3235 * 74HC4051. Q1 - Q3 are connected to S0 - S2 of the same 74HC4051.3236 * Q4 - Q7 are connected to the second 74HC4051 in the same way.3237 */3238 3239static void td3116_latch_value(struct bttv *btv, u32 value)3240{3241 gpio_bits((1<<18) | 0xff, value);3242 gpio_bits((1<<18) | 0xff, (1<<18) | value);3243 udelay(1);3244 gpio_bits((1<<18) | 0xff, value);3245}3246 3247static void td3116_muxsel(struct bttv *btv, unsigned int input)3248{3249 u32 value;3250 u32 highbit;3251 3252 highbit = (input & 0x8) >> 3 ;3253 3254 /* Disable outputs and set value in the mux */3255 value = 0x11; /* Disable outputs */3256 value |= ((input & 0x7) << 1) << (4 * highbit);3257 td3116_latch_value(btv, value);3258 3259 /* Enable the correct output */3260 value &= ~0x11;3261 value |= ((highbit ^ 0x1) << 4) | highbit;3262 td3116_latch_value(btv, value);3263}3264 3265/* ----------------------------------------------------------------------- */3266 3267static void bttv_reset_audio(struct bttv *btv)3268{3269 /*3270 * BT878A has a audio-reset register.3271 * 1. This register is an audio reset function but it is in3272 * function-0 (video capture) address space.3273 * 2. It is enough to do this once per power-up of the card.3274 * 3. There is a typo in the Conexant doc -- it is not at3275 * 0x5B, but at 0x058. (B is an odd-number, obviously a typo!).3276 * --//Shrikumar 0306093277 */3278 if (btv->id != 878)3279 return;3280 3281 if (bttv_debug)3282 pr_debug("%d: BT878A ARESET\n", btv->c.nr);3283 btwrite((1<<7), 0x058);3284 udelay(10);3285 btwrite( 0, 0x058);3286}3287 3288/* initialization part one -- before registering i2c bus */3289void bttv_init_card1(struct bttv *btv)3290{3291 switch (btv->c.type) {3292 case BTTV_BOARD_HAUPPAUGE:3293 case BTTV_BOARD_HAUPPAUGE878:3294 boot_msp34xx(btv,5);3295 break;3296 case BTTV_BOARD_VOODOOTV_200:3297 case BTTV_BOARD_VOODOOTV_FM:3298 boot_msp34xx(btv,20);3299 break;3300 case BTTV_BOARD_AVERMEDIA98:3301 boot_msp34xx(btv,11);3302 break;3303 case BTTV_BOARD_HAUPPAUGEPVR:3304 pvr_boot(btv);3305 break;3306 case BTTV_BOARD_TWINHAN_DST:3307 case BTTV_BOARD_AVDVBT_771:3308 case BTTV_BOARD_PINNACLESAT:3309 btv->use_i2c_hw = 1;3310 break;3311 case BTTV_BOARD_ADLINK_RTV24:3312 init_RTV24( btv );3313 break;3314 case BTTV_BOARD_PCI_8604PW:3315 init_PCI8604PW(btv);3316 break;3317 3318 }3319 if (!bttv_tvcards[btv->c.type].has_dvb)3320 bttv_reset_audio(btv);3321}3322 3323/* initialization part two -- after registering i2c bus */3324void bttv_init_card2(struct bttv *btv)3325{3326 btv->tuner_type = UNSET;3327 3328 if (BTTV_BOARD_UNKNOWN == btv->c.type) {3329 bttv_readee(btv,eeprom_data,0xa0);3330 identify_by_eeprom(btv,eeprom_data);3331 }3332 3333 switch (btv->c.type) {3334 case BTTV_BOARD_MIRO:3335 case BTTV_BOARD_MIROPRO:3336 case BTTV_BOARD_PINNACLE:3337 case BTTV_BOARD_PINNACLEPRO:3338 /* miro/pinnacle */3339 miro_pinnacle_gpio(btv);3340 break;3341 case BTTV_BOARD_FLYVIDEO_98:3342 case BTTV_BOARD_MAXI:3343 case BTTV_BOARD_LIFE_FLYKIT:3344 case BTTV_BOARD_FLYVIDEO:3345 case BTTV_BOARD_TYPHOON_TVIEW:3346 case BTTV_BOARD_CHRONOS_VS2:3347 case BTTV_BOARD_FLYVIDEO_98FM:3348 case BTTV_BOARD_FLYVIDEO2000:3349 case BTTV_BOARD_FLYVIDEO98EZ:3350 case BTTV_BOARD_CONFERENCETV:3351 case BTTV_BOARD_LIFETEC_9415:3352 flyvideo_gpio(btv);3353 break;3354 case BTTV_BOARD_HAUPPAUGE:3355 case BTTV_BOARD_HAUPPAUGE878:3356 case BTTV_BOARD_HAUPPAUGEPVR:3357 /* pick up some config infos from the eeprom */3358 bttv_readee(btv,eeprom_data,0xa0);3359 hauppauge_eeprom(btv);3360 break;3361 case BTTV_BOARD_AVERMEDIA98:3362 case BTTV_BOARD_AVPHONE98:3363 bttv_readee(btv,eeprom_data,0xa0);3364 avermedia_eeprom(btv);3365 break;3366 case BTTV_BOARD_PXC200:3367 init_PXC200(btv);3368 break;3369 case BTTV_BOARD_PICOLO_TETRA_CHIP:3370 picolo_tetra_init(btv);3371 break;3372 case BTTV_BOARD_VHX:3373 btv->has_radio = 1;3374 btv->has_tea575x = 1;3375 btv->tea_gpio.wren = 5;3376 btv->tea_gpio.most = 6;3377 btv->tea_gpio.clk = 3;3378 btv->tea_gpio.data = 4;3379 tea575x_init(btv);3380 break;3381 case BTTV_BOARD_VOBIS_BOOSTAR:3382 case BTTV_BOARD_TERRATV:3383 terratec_active_radio_upgrade(btv);3384 break;3385 case BTTV_BOARD_MAGICTVIEW061:3386 if (btv->cardid == 0x3002144f) {3387 btv->has_radio=1;3388 pr_info("%d: radio detected by subsystem id (CPH05x)\n",3389 btv->c.nr);3390 }3391 break;3392 case BTTV_BOARD_STB2:3393 if (btv->cardid == 0x3060121a) {3394 /* Fix up entry for 3DFX VoodooTV 100,3395 which is an OEM STB card variant. */3396 btv->has_radio=0;3397 btv->tuner_type=TUNER_TEMIC_NTSC;3398 }3399 break;3400 case BTTV_BOARD_OSPREY1x0:3401 case BTTV_BOARD_OSPREY1x0_848:3402 case BTTV_BOARD_OSPREY101_848:3403 case BTTV_BOARD_OSPREY1x1:3404 case BTTV_BOARD_OSPREY1x1_SVID:3405 case BTTV_BOARD_OSPREY2xx:3406 case BTTV_BOARD_OSPREY2x0_SVID:3407 case BTTV_BOARD_OSPREY2x0:3408 case BTTV_BOARD_OSPREY440:3409 case BTTV_BOARD_OSPREY500:3410 case BTTV_BOARD_OSPREY540:3411 case BTTV_BOARD_OSPREY2000:3412 bttv_readee(btv,eeprom_data,0xa0);3413 osprey_eeprom(btv, eeprom_data);3414 break;3415 case BTTV_BOARD_IDS_EAGLE:3416 init_ids_eagle(btv);3417 break;3418 case BTTV_BOARD_MODTEC_205:3419 bttv_readee(btv,eeprom_data,0xa0);3420 modtec_eeprom(btv);3421 break;3422 case BTTV_BOARD_LMLBT4:3423 init_lmlbt4x(btv);3424 break;3425 case BTTV_BOARD_TIBET_CS16:3426 tibetCS16_init(btv);3427 break;3428 case BTTV_BOARD_KODICOM_4400R:3429 kodicom4400r_init(btv);3430 break;3431 case BTTV_BOARD_GEOVISION_GV800S:3432 gv800s_init(btv);3433 break;3434 }3435 3436 /* pll configuration */3437 if (!(btv->id==848 && btv->revision==0x11)) {3438 /* defaults from card list */3439 if (PLL_28 == bttv_tvcards[btv->c.type].pll) {3440 btv->pll.pll_ifreq=28636363;3441 btv->pll.pll_crystal=BT848_IFORM_XT0;3442 }3443 if (PLL_35 == bttv_tvcards[btv->c.type].pll) {3444 btv->pll.pll_ifreq=35468950;3445 btv->pll.pll_crystal=BT848_IFORM_XT1;3446 }3447 if (PLL_14 == bttv_tvcards[btv->c.type].pll) {3448 btv->pll.pll_ifreq = 14318181;3449 btv->pll.pll_crystal = BT848_IFORM_XT0;3450 }3451 /* insmod options can override */3452 switch (pll[btv->c.nr]) {3453 case 0: /* none */3454 btv->pll.pll_crystal = 0;3455 btv->pll.pll_ifreq = 0;3456 btv->pll.pll_ofreq = 0;3457 break;3458 case 1: /* 28 MHz */3459 case 28:3460 btv->pll.pll_ifreq = 28636363;3461 btv->pll.pll_ofreq = 0;3462 btv->pll.pll_crystal = BT848_IFORM_XT0;3463 break;3464 case 2: /* 35 MHz */3465 case 35:3466 btv->pll.pll_ifreq = 35468950;3467 btv->pll.pll_ofreq = 0;3468 btv->pll.pll_crystal = BT848_IFORM_XT1;3469 break;3470 case 3: /* 14 MHz */3471 case 14:3472 btv->pll.pll_ifreq = 14318181;3473 btv->pll.pll_ofreq = 0;3474 btv->pll.pll_crystal = BT848_IFORM_XT0;3475 break;3476 }3477 }3478 btv->pll.pll_current = -1;3479 3480 /* tuner configuration (from card list / autodetect / insmod option) */3481 if (UNSET != bttv_tvcards[btv->c.type].tuner_type)3482 if (UNSET == btv->tuner_type)3483 btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type;3484 if (UNSET != tuner[btv->c.nr])3485 btv->tuner_type = tuner[btv->c.nr];3486 3487 if (btv->tuner_type == TUNER_ABSENT)3488 pr_info("%d: tuner absent\n", btv->c.nr);3489 else if (btv->tuner_type == UNSET)3490 pr_warn("%d: tuner type unset\n", btv->c.nr);3491 else3492 pr_info("%d: tuner type=%d\n", btv->c.nr, btv->tuner_type);3493 3494 if (autoload != UNSET) {3495 pr_warn("%d: the autoload option is obsolete\n", btv->c.nr);3496 pr_warn("%d: use option msp3400, tda7432 or tvaudio to override which audio module should be used\n",3497 btv->c.nr);3498 }3499 3500 if (UNSET == btv->tuner_type)3501 btv->tuner_type = TUNER_ABSENT;3502 3503 btv->dig = bttv_tvcards[btv->c.type].has_dig_in ?3504 bttv_tvcards[btv->c.type].video_inputs - 1 : UNSET;3505 btv->svhs = bttv_tvcards[btv->c.type].svhs == NO_SVHS ?3506 UNSET : bttv_tvcards[btv->c.type].svhs;3507 if (svhs[btv->c.nr] != UNSET)3508 btv->svhs = svhs[btv->c.nr];3509 if (remote[btv->c.nr] != UNSET)3510 btv->has_remote = remote[btv->c.nr];3511 3512 if (bttv_tvcards[btv->c.type].has_radio)3513 btv->has_radio = 1;3514 if (bttv_tvcards[btv->c.type].has_remote)3515 btv->has_remote = 1;3516 if (!bttv_tvcards[btv->c.type].no_gpioirq)3517 btv->gpioirq = 1;3518 if (bttv_tvcards[btv->c.type].volume_gpio)3519 btv->volume_gpio = bttv_tvcards[btv->c.type].volume_gpio;3520 if (bttv_tvcards[btv->c.type].audio_mode_gpio)3521 btv->audio_mode_gpio = bttv_tvcards[btv->c.type].audio_mode_gpio;3522 3523 if (btv->tuner_type == TUNER_ABSENT)3524 return; /* no tuner or related drivers to load */3525 3526 if (btv->has_saa6588 || saa6588[btv->c.nr]) {3527 /* Probe for RDS receiver chip */3528 static const unsigned short addrs[] = {3529 0x20 >> 1,3530 0x22 >> 1,3531 I2C_CLIENT_END3532 };3533 struct v4l2_subdev *sd;3534 3535 sd = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3536 &btv->c.i2c_adap, "saa6588", 0, addrs);3537 btv->has_saa6588 = (sd != NULL);3538 }3539 3540 /* try to detect audio/fader chips */3541 3542 /* First check if the user specified the audio chip via a module3543 option. */3544 3545 switch (audiodev[btv->c.nr]) {3546 case -1:3547 return; /* do not load any audio module */3548 3549 case 0: /* autodetect */3550 break;3551 3552 case 1: {3553 /* The user specified that we should probe for msp3400 */3554 static const unsigned short addrs[] = {3555 I2C_ADDR_MSP3400 >> 1,3556 I2C_ADDR_MSP3400_ALT >> 1,3557 I2C_CLIENT_END3558 };3559 3560 btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3561 &btv->c.i2c_adap, "msp3400", 0, addrs);3562 if (btv->sd_msp34xx)3563 return;3564 goto no_audio;3565 }3566 3567 case 2: {3568 /* The user specified that we should probe for tda7432 */3569 static const unsigned short addrs[] = {3570 I2C_ADDR_TDA7432 >> 1,3571 I2C_CLIENT_END3572 };3573 3574 if (v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3575 &btv->c.i2c_adap, "tda7432", 0, addrs))3576 return;3577 goto no_audio;3578 }3579 3580 case 3: {3581 /* The user specified that we should probe for tvaudio */3582 btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3583 &btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());3584 if (btv->sd_tvaudio)3585 return;3586 goto no_audio;3587 }3588 3589 default:3590 pr_warn("%d: unknown audiodev value!\n", btv->c.nr);3591 return;3592 }3593 3594 /* There were no overrides, so now we try to discover this through the3595 card definition */3596 3597 /* probe for msp3400 first: this driver can detect whether or not3598 it really is a msp3400, so it will return NULL when the device3599 found is really something else (e.g. a tea6300). */3600 if (!bttv_tvcards[btv->c.type].no_msp34xx) {3601 btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3602 &btv->c.i2c_adap, "msp3400",3603 0, I2C_ADDRS(I2C_ADDR_MSP3400 >> 1));3604 } else if (bttv_tvcards[btv->c.type].msp34xx_alt) {3605 btv->sd_msp34xx = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3606 &btv->c.i2c_adap, "msp3400",3607 0, I2C_ADDRS(I2C_ADDR_MSP3400_ALT >> 1));3608 }3609 3610 /* If we found a msp34xx, then we're done. */3611 if (btv->sd_msp34xx)3612 return;3613 3614 /* Now see if we can find one of the tvaudio devices. */3615 btv->sd_tvaudio = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3616 &btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());3617 if (btv->sd_tvaudio) {3618 /* There may be two tvaudio chips on the card, so try to3619 find another. */3620 v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3621 &btv->c.i2c_adap, "tvaudio", 0, tvaudio_addrs());3622 }3623 3624 /* it might also be a tda7432. */3625 if (!bttv_tvcards[btv->c.type].no_tda7432) {3626 static const unsigned short addrs[] = {3627 I2C_ADDR_TDA7432 >> 1,3628 I2C_CLIENT_END3629 };3630 3631 btv->sd_tda7432 = v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3632 &btv->c.i2c_adap, "tda7432", 0, addrs);3633 if (btv->sd_tda7432)3634 return;3635 }3636 if (btv->sd_tvaudio)3637 return;3638 3639no_audio:3640 pr_warn("%d: audio absent, no audio device found!\n", btv->c.nr);3641}3642 3643 3644/* initialize the tuner */3645void bttv_init_tuner(struct bttv *btv)3646{3647 int addr = ADDR_UNSET;3648 3649 if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr)3650 addr = bttv_tvcards[btv->c.type].tuner_addr;3651 3652 if (btv->tuner_type != TUNER_ABSENT) {3653 struct tuner_setup tun_setup;3654 3655 /* Load tuner module before issuing tuner config call! */3656 if (btv->has_radio)3657 v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3658 &btv->c.i2c_adap, "tuner",3659 0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));3660 v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3661 &btv->c.i2c_adap, "tuner",3662 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));3663 v4l2_i2c_new_subdev(&btv->c.v4l2_dev,3664 &btv->c.i2c_adap, "tuner",3665 0, v4l2_i2c_tuner_addrs(ADDRS_TV_WITH_DEMOD));3666 3667 tun_setup.mode_mask = T_ANALOG_TV;3668 tun_setup.type = btv->tuner_type;3669 tun_setup.addr = addr;3670 3671 if (btv->has_radio)3672 tun_setup.mode_mask |= T_RADIO;3673 3674 bttv_call_all(btv, tuner, s_type_addr, &tun_setup);3675 }3676 3677 if (btv->tda9887_conf) {3678 struct v4l2_priv_tun_config tda9887_cfg;3679 3680 tda9887_cfg.tuner = TUNER_TDA9887;3681 tda9887_cfg.priv = &btv->tda9887_conf;3682 3683 bttv_call_all(btv, tuner, s_config, &tda9887_cfg);3684 }3685}3686 3687/* ----------------------------------------------------------------------- */3688 3689static void modtec_eeprom(struct bttv *btv)3690{3691 if( strncmp(&(eeprom_data[0x1e]),"Temic 4066 FY5",14) ==0) {3692 btv->tuner_type=TUNER_TEMIC_4066FY5_PAL_I;3693 pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",3694 btv->c.nr, &eeprom_data[0x1e]);3695 } else if (strncmp(&(eeprom_data[0x1e]),"Alps TSBB5",10) ==0) {3696 btv->tuner_type=TUNER_ALPS_TSBB5_PAL_I;3697 pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",3698 btv->c.nr, &eeprom_data[0x1e]);3699 } else if (strncmp(&(eeprom_data[0x1e]),"Philips FM1246",14) ==0) {3700 btv->tuner_type=TUNER_PHILIPS_NTSC;3701 pr_info("%d: Modtec: Tuner autodetected by eeprom: %s\n",3702 btv->c.nr, &eeprom_data[0x1e]);3703 } else {3704 pr_info("%d: Modtec: Unknown TunerString: %s\n",3705 btv->c.nr, &eeprom_data[0x1e]);3706 }3707}3708 3709static void hauppauge_eeprom(struct bttv *btv)3710{3711 struct tveeprom tv;3712 3713 tveeprom_hauppauge_analog(&tv, eeprom_data);3714 btv->tuner_type = tv.tuner_type;3715 btv->has_radio = tv.has_radio;3716 3717 pr_info("%d: Hauppauge eeprom indicates model#%d\n",3718 btv->c.nr, tv.model);3719 3720 /*3721 * Some of the 878 boards have duplicate PCI IDs. Switch the board3722 * type based on model #.3723 */3724 if(tv.model == 64900) {3725 pr_info("%d: Switching board type from %s to %s\n",3726 btv->c.nr,3727 bttv_tvcards[btv->c.type].name,3728 bttv_tvcards[BTTV_BOARD_HAUPPAUGE_IMPACTVCB].name);3729 btv->c.type = BTTV_BOARD_HAUPPAUGE_IMPACTVCB;3730 }3731 3732 /* The 61334 needs the msp3410 to do the radio demod to get sound */3733 if (tv.model == 61334)3734 btv->radio_uses_msp_demodulator = 1;3735}3736 3737/* ----------------------------------------------------------------------- */3738 3739static void bttv_tea575x_set_pins(struct snd_tea575x *tea, u8 pins)3740{3741 struct bttv *btv = tea->private_data;3742 struct bttv_tea575x_gpio gpio = btv->tea_gpio;3743 u16 val = 0;3744 3745 val |= (pins & TEA575X_DATA) ? (1 << gpio.data) : 0;3746 val |= (pins & TEA575X_CLK) ? (1 << gpio.clk) : 0;3747 val |= (pins & TEA575X_WREN) ? (1 << gpio.wren) : 0;3748 3749 gpio_bits((1 << gpio.data) | (1 << gpio.clk) | (1 << gpio.wren), val);3750 if (btv->mbox_ior) {3751 /* IOW and CSEL active */3752 gpio_bits(btv->mbox_iow | btv->mbox_csel, 0);3753 udelay(5);3754 /* all inactive */3755 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,3756 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);3757 }3758}3759 3760static u8 bttv_tea575x_get_pins(struct snd_tea575x *tea)3761{3762 struct bttv *btv = tea->private_data;3763 struct bttv_tea575x_gpio gpio = btv->tea_gpio;3764 u8 ret = 0;3765 u16 val;3766 3767 if (btv->mbox_ior) {3768 /* IOR and CSEL active */3769 gpio_bits(btv->mbox_ior | btv->mbox_csel, 0);3770 udelay(5);3771 }3772 val = gpio_read();3773 if (btv->mbox_ior) {3774 /* all inactive */3775 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,3776 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);3777 }3778 3779 if (val & (1 << gpio.data))3780 ret |= TEA575X_DATA;3781 if (val & (1 << gpio.most))3782 ret |= TEA575X_MOST;3783 3784 return ret;3785}3786 3787static void bttv_tea575x_set_direction(struct snd_tea575x *tea, bool output)3788{3789 struct bttv *btv = tea->private_data;3790 struct bttv_tea575x_gpio gpio = btv->tea_gpio;3791 u32 mask = (1 << gpio.clk) | (1 << gpio.wren) | (1 << gpio.data) |3792 (1 << gpio.most);3793 3794 if (output)3795 gpio_inout(mask, (1 << gpio.data) | (1 << gpio.clk) |3796 (1 << gpio.wren));3797 else3798 gpio_inout(mask, (1 << gpio.clk) | (1 << gpio.wren));3799}3800 3801static const struct snd_tea575x_ops bttv_tea_ops = {3802 .set_pins = bttv_tea575x_set_pins,3803 .get_pins = bttv_tea575x_get_pins,3804 .set_direction = bttv_tea575x_set_direction,3805};3806 3807static int tea575x_init(struct bttv *btv)3808{3809 btv->tea.private_data = btv;3810 btv->tea.ops = &bttv_tea_ops;3811 if (!snd_tea575x_hw_init(&btv->tea)) {3812 pr_info("%d: detected TEA575x radio\n", btv->c.nr);3813 btv->tea.mute = false;3814 return 0;3815 }3816 3817 btv->has_tea575x = 0;3818 btv->has_radio = 0;3819 3820 return -ENODEV;3821}3822 3823/* ----------------------------------------------------------------------- */3824 3825static int terratec_active_radio_upgrade(struct bttv *btv)3826{3827 btv->has_radio = 1;3828 btv->has_tea575x = 1;3829 btv->tea_gpio.wren = 4;3830 btv->tea_gpio.most = 5;3831 btv->tea_gpio.clk = 3;3832 btv->tea_gpio.data = 2;3833 3834 btv->mbox_iow = 1 << 8;3835 btv->mbox_ior = 1 << 9;3836 btv->mbox_csel = 1 << 10;3837 3838 if (!tea575x_init(btv)) {3839 pr_info("%d: Terratec Active Radio Upgrade found\n", btv->c.nr);3840 btv->has_saa6588 = 1;3841 }3842 3843 return 0;3844}3845 3846 3847/* ----------------------------------------------------------------------- */3848 3849/*3850 * minimal bootstrap for the WinTV/PVR -- upload altera firmware.3851 *3852 * The hcwamc.rbf firmware file is on the Hauppauge driver CD. Have3853 * a look at Pvr/pvr45xxx.EXE (self-extracting zip archive, can be3854 * unpacked with unzip).3855 */3856#define PVR_GPIO_DELAY 103857 3858#define BTTV_ALT_DATA 0x0000013859#define BTTV_ALT_DCLK 0x1000003860#define BTTV_ALT_NCONFIG 0x8000003861 3862static int pvr_altera_load(struct bttv *btv, const u8 *micro, u32 microlen)3863{3864 u32 n;3865 u8 bits;3866 int i;3867 3868 gpio_inout(0xffffff,BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG);3869 gpio_write(0);3870 udelay(PVR_GPIO_DELAY);3871 3872 gpio_write(BTTV_ALT_NCONFIG);3873 udelay(PVR_GPIO_DELAY);3874 3875 for (n = 0; n < microlen; n++) {3876 bits = micro[n];3877 for (i = 0 ; i < 8 ; i++) {3878 gpio_bits(BTTV_ALT_DCLK,0);3879 if (bits & 0x01)3880 gpio_bits(BTTV_ALT_DATA,BTTV_ALT_DATA);3881 else3882 gpio_bits(BTTV_ALT_DATA,0);3883 gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK);3884 bits >>= 1;3885 }3886 }3887 gpio_bits(BTTV_ALT_DCLK,0);3888 udelay(PVR_GPIO_DELAY);3889 3890 /* begin Altera init loop (Not necessary,but doesn't hurt) */3891 for (i = 0 ; i < 30 ; i++) {3892 gpio_bits(BTTV_ALT_DCLK,0);3893 gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK);3894 }3895 gpio_bits(BTTV_ALT_DCLK,0);3896 return 0;3897}3898 3899static int pvr_boot(struct bttv *btv)3900{3901 const struct firmware *fw_entry;3902 int rc;3903 3904 rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev);3905 if (rc != 0) {3906 pr_warn("%d: no altera firmware [via hotplug]\n", btv->c.nr);3907 return rc;3908 }3909 rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size);3910 pr_info("%d: altera firmware upload %s\n",3911 btv->c.nr, (rc < 0) ? "failed" : "ok");3912 release_firmware(fw_entry);3913 return rc;3914}3915 3916/* ----------------------------------------------------------------------- */3917/* some osprey specific stuff */3918 3919static void osprey_eeprom(struct bttv *btv, const u8 ee[256])3920{3921 int i;3922 u32 serial = 0;3923 int cardid = -1;3924 3925 /* This code will never actually get called in this case.... */3926 if (btv->c.type == BTTV_BOARD_UNKNOWN) {3927 /* this might be an antique... check for MMAC label in eeprom */3928 if (!strncmp(ee, "MMAC", 4)) {3929 u8 checksum = 0;3930 for (i = 0; i < 21; i++)3931 checksum += ee[i];3932 if (checksum != ee[21])3933 return;3934 cardid = BTTV_BOARD_OSPREY1x0_848;3935 for (i = 12; i < 21; i++) {3936 serial *= 10;3937 serial += ee[i] - '0';3938 }3939 }3940 } else {3941 unsigned short type;3942 3943 for (i = 4 * 16; i < 8 * 16; i += 16) {3944 u16 checksum = (__force u16)ip_compute_csum(ee + i, 16);3945 3946 if ((checksum & 0xff) + (checksum >> 8) == 0xff)3947 break;3948 }3949 if (i >= 8*16)3950 return;3951 ee += i;3952 3953 /* found a valid descriptor */3954 type = get_unaligned_be16((__be16 *)(ee+4));3955 3956 switch(type) {3957 /* 848 based */3958 case 0x0004:3959 cardid = BTTV_BOARD_OSPREY1x0_848;3960 break;3961 case 0x0005:3962 cardid = BTTV_BOARD_OSPREY101_848;3963 break;3964 3965 /* 878 based */3966 case 0x0012:3967 case 0x0013:3968 cardid = BTTV_BOARD_OSPREY1x0;3969 break;3970 case 0x0014:3971 case 0x0015:3972 cardid = BTTV_BOARD_OSPREY1x1;3973 break;3974 case 0x0016:3975 case 0x0017:3976 case 0x0020:3977 cardid = BTTV_BOARD_OSPREY1x1_SVID;3978 break;3979 case 0x0018:3980 case 0x0019:3981 case 0x001E:3982 case 0x001F:3983 cardid = BTTV_BOARD_OSPREY2xx;3984 break;3985 case 0x001A:3986 case 0x001B:3987 cardid = BTTV_BOARD_OSPREY2x0_SVID;3988 break;3989 case 0x0040:3990 cardid = BTTV_BOARD_OSPREY500;3991 break;3992 case 0x0050:3993 case 0x0056:3994 cardid = BTTV_BOARD_OSPREY540;3995 /* bttv_osprey_540_init(btv); */3996 break;3997 case 0x0060:3998 case 0x0070:3999 case 0x00A0:4000 cardid = BTTV_BOARD_OSPREY2x0;4001 /* enable output on select control lines */4002 gpio_inout(0xffffff,0x000303);4003 break;4004 case 0x00D8:4005 cardid = BTTV_BOARD_OSPREY440;4006 break;4007 default:4008 /* unknown...leave generic, but get serial # */4009 pr_info("%d: osprey eeprom: unknown card type 0x%04x\n",4010 btv->c.nr, type);4011 break;4012 }4013 serial = get_unaligned_be32((__be32 *)(ee+6));4014 }4015 4016 pr_info("%d: osprey eeprom: card=%d '%s' serial=%u\n",4017 btv->c.nr, cardid,4018 cardid > 0 ? bttv_tvcards[cardid].name : "Unknown", serial);4019 4020 if (cardid<0 || btv->c.type == cardid)4021 return;4022 4023 /* card type isn't set correctly */4024 if (card[btv->c.nr] < bttv_num_tvcards) {4025 pr_warn("%d: osprey eeprom: Not overriding user specified card type\n",4026 btv->c.nr);4027 } else {4028 pr_info("%d: osprey eeprom: Changing card type from %d to %d\n",4029 btv->c.nr, btv->c.type, cardid);4030 btv->c.type = cardid;4031 }4032}4033 4034/* ----------------------------------------------------------------------- */4035/* AVermedia specific stuff, from bktr_card.c */4036 4037static int tuner_0_table[] = {4038 TUNER_PHILIPS_NTSC, TUNER_PHILIPS_PAL /* PAL-BG*/,4039 TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL /* PAL-I*/,4040 TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL,4041 TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM,4042 TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL,4043 TUNER_PHILIPS_FM1216ME_MK3 };4044 4045static int tuner_1_table[] = {4046 TUNER_TEMIC_NTSC, TUNER_TEMIC_PAL,4047 TUNER_TEMIC_PAL, TUNER_TEMIC_PAL,4048 TUNER_TEMIC_PAL, TUNER_TEMIC_PAL,4049 TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, /* TUNER_TEMIC_SECAM */4050 TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL};4051 4052static void avermedia_eeprom(struct bttv *btv)4053{4054 int tuner_make, tuner_tv_fm, tuner_format, tuner_type = 0;4055 4056 tuner_make = (eeprom_data[0x41] & 0x7);4057 tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3;4058 tuner_format = (eeprom_data[0x42] & 0xf0) >> 4;4059 btv->has_remote = (eeprom_data[0x42] & 0x01);4060 4061 if (tuner_make == 0 || tuner_make == 2)4062 if (tuner_format <= 0x0a)4063 tuner_type = tuner_0_table[tuner_format];4064 if (tuner_make == 1)4065 if (tuner_format <= 9)4066 tuner_type = tuner_1_table[tuner_format];4067 4068 if (tuner_make == 4)4069 if (tuner_format == 0x09)4070 tuner_type = TUNER_LG_NTSC_NEW_TAPC; /* TAPC-G702P */4071 4072 pr_info("%d: Avermedia eeprom[0x%02x%02x]: tuner=",4073 btv->c.nr, eeprom_data[0x41], eeprom_data[0x42]);4074 if (tuner_type) {4075 btv->tuner_type = tuner_type;4076 pr_cont("%d", tuner_type);4077 } else4078 pr_cont("Unknown type");4079 pr_cont(" radio:%s remote control:%s\n",4080 tuner_tv_fm ? "yes" : "no",4081 btv->has_remote ? "yes" : "no");4082}4083 4084/*4085 * For Voodoo TV/FM and Voodoo 200. These cards' tuners use a TDA98804086 * analog demod, which is not I2C controlled like the newer and more common4087 * TDA9887 series. Instead it has two tri-state input pins, S0 and S1,4088 * that control the IF for the video and audio. Apparently, bttv GPIO4089 * 0x10000 is connected to S0. S0 low selects a 38.9 MHz VIF for B/G/D/K/I4090 * (i.e., PAL) while high selects 45.75 MHz for M/N (i.e., NTSC).4091 */4092u32 bttv_tda9880_setnorm(struct bttv *btv, u32 gpiobits)4093{4094 4095 if (btv->audio_input == TVAUDIO_INPUT_TUNER) {4096 if (bttv_tvnorms[btv->tvnorm].v4l2_id & V4L2_STD_MN)4097 gpiobits |= 0x10000;4098 else4099 gpiobits &= ~0x10000;4100 }4101 4102 gpio_bits(bttv_tvcards[btv->c.type].gpiomask, gpiobits);4103 return gpiobits;4104}4105 4106 4107/*4108 * reset/enable the MSP on some Hauppauge cards4109 * Thanks to Kyösti Mälkki (kmalkki@cc.hut.fi)!4110 *4111 * Hauppauge: pin 54112 * Voodoo: pin 204113 */4114static void boot_msp34xx(struct bttv *btv, int pin)4115{4116 int mask = (1 << pin);4117 4118 gpio_inout(mask,mask);4119 gpio_bits(mask,0);4120 mdelay(2);4121 udelay(500);4122 gpio_bits(mask,mask);4123 4124 if (bttv_gpio)4125 bttv_gpio_tracking(btv,"msp34xx");4126 if (bttv_verbose)4127 pr_info("%d: Hauppauge/Voodoo msp34xx: reset line init [%d]\n",4128 btv->c.nr, pin);4129}4130 4131/* ----------------------------------------------------------------------- */4132/* Imagenation L-Model PXC200 Framegrabber */4133/* This is basically the same procedure as4134 * used by Alessandro Rubini in his pxc2004135 * driver, but using BTTV functions */4136 4137static void init_PXC200(struct bttv *btv)4138{4139 static int vals[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d, 0x01, 0x02,4140 0x03, 0x04, 0x05, 0x06, 0x00 };4141 unsigned int i;4142 int tmp;4143 u32 val;4144 4145 /* Initialise GPIO-connected stuff */4146 gpio_inout(0xffffff, (1<<13));4147 gpio_write(0);4148 udelay(3);4149 gpio_write(1<<13);4150 /* GPIO inputs are pulled up, so no need to drive4151 * reset pin any longer */4152 gpio_bits(0xffffff, 0);4153 if (bttv_gpio)4154 bttv_gpio_tracking(btv,"pxc200");4155 4156 /* we could/should try and reset/control the AD pots? but4157 right now we simply turned off the crushing. Without4158 this the AGC drifts drifts4159 remember the EN is reverse logic -->4160 setting BT848_ADC_AGC_EN disable the AGC4161 tboult@eecs.lehigh.edu4162 */4163 4164 btwrite(BT848_ADC_RESERVED|BT848_ADC_AGC_EN, BT848_ADC);4165 4166 /* Initialise MAX517 DAC */4167 pr_info("Setting DAC reference voltage level ...\n");4168 bttv_I2CWrite(btv,0x5E,0,0x80,1);4169 4170 /* Initialise 12C508 PIC */4171 /* The I2CWrite and I2CRead commands are actually to the4172 * same chips - but the R/W bit is included in the address4173 * argument so the numbers are different */4174 4175 4176 pr_info("Initialising 12C508 PIC chip ...\n");4177 4178 /* First of all, enable the clock line. This is used in the PXC200-F */4179 val = btread(BT848_GPIO_DMA_CTL);4180 val |= BT848_GPIO_DMA_CTL_GPCLKMODE;4181 btwrite(val, BT848_GPIO_DMA_CTL);4182 4183 /* Then, push to 0 the reset pin long enough to reset the *4184 * device same as above for the reset line, but not the same4185 * value sent to the GPIO-connected stuff4186 * which one is the good one? */4187 gpio_inout(0xffffff,(1<<2));4188 gpio_write(0);4189 udelay(10);4190 gpio_write(1<<2);4191 4192 for (i = 0; i < ARRAY_SIZE(vals); i++) {4193 tmp=bttv_I2CWrite(btv,0x1E,0,vals[i],1);4194 if (tmp != -1) {4195 pr_info("I2C Write(%2.2x) = %i\nI2C Read () = %2.2x\n\n",4196 vals[i],tmp,bttv_I2CRead(btv,0x1F,NULL));4197 }4198 }4199 4200 pr_info("PXC200 Initialised\n");4201}4202 4203 4204 4205/* ----------------------------------------------------------------------- */4206/*4207 * The Adlink RTV-24 (aka Angelo) has some special initialisation to unlock4208 * it. This apparently involves the following procedure for each 878 chip:4209 *4210 * 1) write 0x00C3FEFF to the GPIO_OUT_EN register4211 *4212 * 2) write to GPIO_DATA4213 * - 0x0E4214 * - sleep 1ms4215 * - 0x10 + 0x0E4216 * - sleep 10ms4217 * - 0x0E4218 * read from GPIO_DATA into buf (uint_32)4219 * - if ( data>>18 & 0x01 != 0) || ( buf>>19 & 0x01 != 1 )4220 * error. ERROR_CPLD_Check_Failed stop.4221 *4222 * 3) write to GPIO_DATA4223 * - write 0x4400 + 0x0E4224 * - sleep 10ms4225 * - write 0x4410 + 0x0E4226 * - sleep 1ms4227 * - write 0x0E4228 * read from GPIO_DATA into buf (uint_32)4229 * - if ( buf>>18 & 0x01 ) || ( buf>>19 & 0x01 != 0 )4230 * error. ERROR_CPLD_Check_Failed.4231 */4232/* ----------------------------------------------------------------------- */4233static void4234init_RTV24 (struct bttv *btv)4235{4236 uint32_t dataRead = 0;4237 long watchdog_value = 0x0E;4238 4239 pr_info("%d: Adlink RTV-24 initialisation in progress ...\n",4240 btv->c.nr);4241 4242 btwrite (0x00c3feff, BT848_GPIO_OUT_EN);4243 4244 btwrite (0 + watchdog_value, BT848_GPIO_DATA);4245 msleep (1);4246 btwrite (0x10 + watchdog_value, BT848_GPIO_DATA);4247 msleep (10);4248 btwrite (0 + watchdog_value, BT848_GPIO_DATA);4249 4250 dataRead = btread (BT848_GPIO_DATA);4251 4252 if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 1)) {4253 pr_info("%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n",4254 btv->c.nr, dataRead);4255 }4256 4257 btwrite (0x4400 + watchdog_value, BT848_GPIO_DATA);4258 msleep (10);4259 btwrite (0x4410 + watchdog_value, BT848_GPIO_DATA);4260 msleep (1);4261 btwrite (watchdog_value, BT848_GPIO_DATA);4262 msleep (1);4263 dataRead = btread (BT848_GPIO_DATA);4264 4265 if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 0)) {4266 pr_info("%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n",4267 btv->c.nr, dataRead);4268 4269 return;4270 }4271 4272 pr_info("%d: Adlink RTV-24 initialisation complete\n", btv->c.nr);4273}4274 4275 4276 4277/* ----------------------------------------------------------------------- */4278/*4279 * The PCI-8604PW contains a CPLD, probably an ispMACH 4A, that filters4280 * the PCI REQ signals coming from the four BT878 chips. After power4281 * up, the CPLD does not forward requests to the bus, which prevents4282 * the BT878 from fetching RISC instructions from memory. While the4283 * CPLD is connected to most of the GPIOs of PCI device 0xD, only4284 * five appear to play a role in unlocking the REQ signal. The following4285 * sequence has been determined by trial and error without access to the4286 * original driver.4287 *4288 * Eight GPIOs of device 0xC are provided on connector CN4 (4 in, 4 out).4289 * Devices 0xE and 0xF do not appear to have anything connected to their4290 * GPIOs.4291 *4292 * The correct GPIO_OUT_EN value might have some more bits set. It should4293 * be possible to derive it from a boundary scan of the CPLD. Its JTAG4294 * pins are routed to test points.4295 *4296 */4297/* ----------------------------------------------------------------------- */4298static void4299init_PCI8604PW(struct bttv *btv)4300{4301 int state;4302 4303 if ((PCI_SLOT(btv->c.pci->devfn) & ~3) != 0xC) {4304 pr_warn("This is not a PCI-8604PW\n");4305 return;4306 }4307 4308 if (PCI_SLOT(btv->c.pci->devfn) != 0xD)4309 return;4310 4311 btwrite(0x080002, BT848_GPIO_OUT_EN);4312 4313 state = (btread(BT848_GPIO_DATA) >> 21) & 7;4314 4315 for (;;) {4316 switch (state) {4317 case 1:4318 case 5:4319 case 6:4320 case 4:4321 pr_debug("PCI-8604PW in state %i, toggling pin\n",4322 state);4323 btwrite(0x080000, BT848_GPIO_DATA);4324 msleep(1);4325 btwrite(0x000000, BT848_GPIO_DATA);4326 msleep(1);4327 break;4328 case 7:4329 pr_info("PCI-8604PW unlocked\n");4330 return;4331 case 0:4332 /* FIXME: If we are in state 7 and toggle GPIO[19] one4333 more time, the CPLD goes into state 0, where PCI bus4334 mastering is inhibited again. We have not managed to4335 get out of that state. */4336 4337 pr_err("PCI-8604PW locked until reset\n");4338 return;4339 default:4340 pr_err("PCI-8604PW in unknown state %i\n", state);4341 return;4342 }4343 4344 state = (state << 4) | ((btread(BT848_GPIO_DATA) >> 21) & 7);4345 4346 switch (state) {4347 case 0x15:4348 case 0x56:4349 case 0x64:4350 case 0x47:4351 /* The transition from state 7 to state 0 is, as explained4352 above, valid but undesired and with this code impossible4353 as we exit as soon as we are in state 7.4354 case 0x70: */4355 break;4356 default:4357 pr_err("PCI-8604PW invalid transition %i -> %i\n",4358 state >> 4, state & 7);4359 return;4360 }4361 state &= 7;4362 }4363}4364 4365/* RemoteVision MX (rv605) muxsel helper [Miguel Freitas]4366 *4367 * This is needed because rv605 don't use a normal multiplex, but a crosspoint4368 * switch instead (CD22M3494E). This IC can have multiple active connections4369 * between Xn (input) and Yn (output) pins. We need to clear any existing4370 * connection prior to establish a new one, pulsing the STROBE pin.4371 *4372 * The board hardwire Y0 (xpoint) to MUX1 and MUXOUT to Yin.4373 * GPIO pins are wired as:4374 * GPIO[0:3] - AX[0:3] (xpoint) - P1[0:3] (microcontroller)4375 * GPIO[4:6] - AY[0:2] (xpoint) - P1[4:6] (microcontroller)4376 * GPIO[7] - DATA (xpoint) - P1[7] (microcontroller)4377 * GPIO[8] - - P3[5] (microcontroller)4378 * GPIO[9] - RESET (xpoint) - P3[6] (microcontroller)4379 * GPIO[10] - STROBE (xpoint) - P3[7] (microcontroller)4380 * GPINTR - - P3[4] (microcontroller)4381 *4382 * The microcontroller is a 80C32 like. It should be possible to change xpoint4383 * configuration either directly (as we are doing) or using the microcontroller4384 * which is also wired to I2C interface. I have no further info on the4385 * microcontroller features, one would need to disassembly the firmware.4386 * note: the vendor refused to give any information on this product, all4387 * that stuff was found using a multimeter! :)4388 */4389static void rv605_muxsel(struct bttv *btv, unsigned int input)4390{4391 static const u8 muxgpio[] = { 0x3, 0x1, 0x2, 0x4, 0xf, 0x7, 0xe, 0x0,4392 0xd, 0xb, 0xc, 0x6, 0x9, 0x5, 0x8, 0xa };4393 4394 gpio_bits(0x07f, muxgpio[input]);4395 4396 /* reset all connections */4397 gpio_bits(0x200,0x200);4398 mdelay(1);4399 gpio_bits(0x200,0x000);4400 mdelay(1);4401 4402 /* create a new connection */4403 gpio_bits(0x480,0x480);4404 mdelay(1);4405 gpio_bits(0x480,0x080);4406 mdelay(1);4407}4408 4409/* Tibet Systems 'Progress DVR' CS16 muxsel helper [Chris Fanning]4410 *4411 * The CS16 (available on eBay cheap) is a PCI board with four Fusion4412 * 878A chips, a PCI bridge, an Atmel microcontroller, four sync separator4413 * chips, ten eight input analog multiplexors, a not chip and a few4414 * other components.4415 *4416 * 16 inputs on a secondary bracket are provided and can be selected4417 * from each of the four capture chips. Two of the eight input4418 * multiplexors are used to select from any of the 16 input signals.4419 *4420 * Unsupported hardware capabilities:4421 * . A video output monitor on the secondary bracket can be selected from4422 * one of the 878A chips.4423 * . Another passthrough but I haven't spent any time investigating it.4424 * . Digital I/O (logic level connected to GPIO) is available from an4425 * onboard header.4426 *4427 * The on chip input mux should always be set to 2.4428 * GPIO[16:19] - Video input selection4429 * GPIO[0:3] - Video output monitor select (only available from one 878A)4430 * GPIO[?:?] - Digital I/O.4431 *4432 * There is an ATMEL microcontroller with an 8031 core on board. I have not4433 * determined what function (if any) it provides. With the microcontroller4434 * and sync separator chips a guess is that it might have to do with video4435 * switching and maybe some digital I/O.4436 */4437static void tibetCS16_muxsel(struct bttv *btv, unsigned int input)4438{4439 /* video mux */4440 gpio_bits(0x0f0000, input << 16);4441}4442 4443static void tibetCS16_init(struct bttv *btv)4444{4445 /* enable gpio bits, mask obtained via btSpy */4446 gpio_inout(0xffffff, 0x0f7fff);4447 gpio_write(0x0f7fff);4448}4449 4450/*4451 * The following routines for the Kodicom-4400r get a little mind-twisting.4452 * There is a "master" controller and three "slave" controllers, together4453 * an analog switch which connects any of 16 cameras to any of the BT87A's.4454 * The analog switch is controlled by the "master", but the detection order4455 * of the four BT878A chips is in an order which I just don't understand.4456 * The "master" is actually the second controller to be detected. The4457 * logic on the board uses logical numbers for the 4 controllers, but4458 * those numbers are different from the detection sequence. When working4459 * with the analog switch, we need to "map" from the detection sequence4460 * over to the board's logical controller number. This mapping sequence4461 * is {3, 0, 2, 1}, i.e. the first controller to be detected is logical4462 * unit 3, the second (which is the master) is logical unit 0, etc.4463 * We need to maintain the status of the analog switch (which of the 164464 * cameras is connected to which of the 4 controllers) in sw_status array.4465 */4466 4467/*4468 * First a routine to set the analog switch, which controls which camera4469 * is routed to which controller. The switch comprises an X-address4470 * (gpio bits 0-3, representing the camera, ranging from 0-15), and a4471 * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).4472 * A data value (gpio bit 7) of '1' enables the switch, and '0' disables4473 * the switch. A STROBE bit (gpio bit 8) latches the data value into the4474 * specified address. The idea is to set the address and data, then bring4475 * STROBE high, and finally bring STROBE back to low.4476 */4477static void kodicom4400r_write(struct bttv *btv,4478 unsigned char xaddr,4479 unsigned char yaddr,4480 unsigned char data) {4481 unsigned int udata;4482 4483 udata = (data << 7) | ((yaddr&3) << 4) | (xaddr&0xf);4484 gpio_bits(0x1ff, udata); /* write ADDR and DAT */4485 gpio_bits(0x1ff, udata | (1 << 8)); /* strobe high */4486 gpio_bits(0x1ff, udata); /* strobe low */4487}4488 4489/*4490 * Next the mux select. Both the "master" and "slave" 'cards' (controllers)4491 * use this routine. The routine finds the "master" for the card, maps4492 * the controller number from the detected position over to the logical4493 * number, writes the appropriate data to the analog switch, and housekeeps4494 * the local copy of the switch information. The parameter 'input' is the4495 * requested camera number (0 - 15).4496 */4497static void kodicom4400r_muxsel(struct bttv *btv, unsigned int input)4498{4499 int xaddr, yaddr;4500 struct bttv *mctlr;4501 static unsigned char map[4] = {3, 0, 2, 1};4502 4503 mctlr = master[btv->c.nr];4504 if (mctlr == NULL) { /* ignore if master not yet detected */4505 return;4506 }4507 yaddr = (btv->c.nr - mctlr->c.nr + 1) & 3; /* the '&' is for safety */4508 yaddr = map[yaddr];4509 xaddr = input & 0xf;4510 /* Check if the controller/camera pair has changed, else ignore */4511 if (mctlr->sw_status[yaddr] != xaddr)4512 {4513 /* "open" the old switch, "close" the new one, save the new */4514 kodicom4400r_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0);4515 mctlr->sw_status[yaddr] = xaddr;4516 kodicom4400r_write(mctlr, xaddr, yaddr, 1);4517 }4518}4519 4520/*4521 * During initialisation, we need to reset the analog switch. We4522 * also preset the switch to map the 4 connectors on the card to the4523 * *user's* (see above description of kodicom4400r_muxsel) channels4524 * 0 through 34525 */4526static void kodicom4400r_init(struct bttv *btv)4527{4528 int ix;4529 4530 gpio_inout(0x0003ff, 0x0003ff);4531 gpio_write(1 << 9); /* reset MUX */4532 gpio_write(0);4533 /* Preset camera 0 to the 4 controllers */4534 for (ix = 0; ix < 4; ix++) {4535 btv->sw_status[ix] = ix;4536 kodicom4400r_write(btv, ix, ix, 1);4537 }4538 /*4539 * Since this is the "master", we need to set up the4540 * other three controller chips' pointers to this structure4541 * for later use in the muxsel routine.4542 */4543 if ((btv->c.nr<1) || (btv->c.nr>BTTV_MAX-3))4544 return;4545 master[btv->c.nr-1] = btv;4546 master[btv->c.nr] = btv;4547 master[btv->c.nr+1] = btv;4548 master[btv->c.nr+2] = btv;4549}4550 4551/* The Grandtec X-Guard framegrabber card uses two Dual 4-channel4552 * video multiplexers to provide up to 16 video inputs. These4553 * multiplexers are controlled by the lower 8 GPIO pins of the4554 * bt878. The multiplexers probably Pericom PI5V331Q or similar.4555 4556 * xxx0 is pin xxx of multiplexer U5,4557 * yyy1 is pin yyy of multiplexer U24558 */4559#define ENA0 0x014560#define ENB0 0x024561#define ENA1 0x044562#define ENB1 0x084563 4564#define IN10 0x104565#define IN00 0x204566#define IN11 0x404567#define IN01 0x804568 4569static void xguard_muxsel(struct bttv *btv, unsigned int input)4570{4571 static const int masks[] = {4572 ENB0, ENB0|IN00, ENB0|IN10, ENB0|IN00|IN10,4573 ENA0, ENA0|IN00, ENA0|IN10, ENA0|IN00|IN10,4574 ENB1, ENB1|IN01, ENB1|IN11, ENB1|IN01|IN11,4575 ENA1, ENA1|IN01, ENA1|IN11, ENA1|IN01|IN11,4576 };4577 gpio_write(masks[input%16]);4578}4579static void picolo_tetra_init(struct bttv *btv)4580{4581 /*This is the video input redirection functionality : I DID NOT USE IT. */4582 btwrite (0x08<<16,BT848_GPIO_DATA);/*GPIO[19] [==> 4053 B+C] set to 1 */4583 btwrite (0x04<<16,BT848_GPIO_DATA);/*GPIO[18] [==> 4053 A] set to 1*/4584}4585static void picolo_tetra_muxsel (struct bttv* btv, unsigned int input)4586{4587 4588 dprintk("%d : picolo_tetra_muxsel => input = %d\n", btv->c.nr, input);4589 /*Just set the right path in the analog multiplexers : channel 1 -> 4 ==> Analog Mux ==> MUX0*/4590 /*GPIO[20]&GPIO[21] used to choose the right input*/4591 btwrite (input<<20,BT848_GPIO_DATA);4592 4593}4594 4595/*4596 * ivc120_muxsel [Added by Alan Garfield <alan@fromorbit.com>]4597 *4598 * The IVC120G security card has 4 i2c controlled TDA8540 matrix4599 * switchers to provide 16 channels to MUX0. The TDA8540's have4600 * 4 independent outputs and as such the IVC120G also has the4601 * optional "Monitor Out" bus. This allows the card to be looking4602 * at one input while the monitor is looking at another.4603 *4604 * Since I've couldn't be bothered figuring out how to add an4605 * independent muxsel for the monitor bus, I've just set it to4606 * whatever the card is looking at.4607 *4608 * OUT0 of the TDA8540's is connected to MUX0 (0x03)4609 * OUT1 of the TDA8540's is connected to "Monitor Out" (0x0C)4610 *4611 * TDA8540_ALT3 IN0-3 = Channel 13 - 16 (0x03)4612 * TDA8540_ALT4 IN0-3 = Channel 1 - 4 (0x03)4613 * TDA8540_ALT5 IN0-3 = Channel 5 - 8 (0x03)4614 * TDA8540_ALT6 IN0-3 = Channel 9 - 12 (0x03)4615 *4616 */4617 4618/* All 7 possible sub-ids for the TDA8540 Matrix Switcher */4619#define I2C_TDA8540 0x904620#define I2C_TDA8540_ALT1 0x924621#define I2C_TDA8540_ALT2 0x944622#define I2C_TDA8540_ALT3 0x964623#define I2C_TDA8540_ALT4 0x984624#define I2C_TDA8540_ALT5 0x9a4625#define I2C_TDA8540_ALT6 0x9c4626 4627static void ivc120_muxsel(struct bttv *btv, unsigned int input)4628{4629 /* Simple maths */4630 int key = input % 4;4631 int matrix = input / 4;4632 4633 dprintk("%d: ivc120_muxsel: Input - %02d | TDA - %02d | In - %02d\n",4634 btv->c.nr, input, matrix, key);4635 4636 /* Handles the input selection on the TDA8540's */4637 bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x00,4638 ((matrix == 3) ? (key | key << 2) : 0x00), 1);4639 bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x00,4640 ((matrix == 0) ? (key | key << 2) : 0x00), 1);4641 bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x00,4642 ((matrix == 1) ? (key | key << 2) : 0x00), 1);4643 bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x00,4644 ((matrix == 2) ? (key | key << 2) : 0x00), 1);4645 4646 /* Handles the output enables on the TDA8540's */4647 bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x02,4648 ((matrix == 3) ? 0x03 : 0x00), 1); /* 13 - 16 */4649 bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x02,4650 ((matrix == 0) ? 0x03 : 0x00), 1); /* 1-4 */4651 bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x02,4652 ((matrix == 1) ? 0x03 : 0x00), 1); /* 5-8 */4653 bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x02,4654 ((matrix == 2) ? 0x03 : 0x00), 1); /* 9-12 */4655 4656 /* 878's MUX0 is already selected for input via muxsel values */4657}4658 4659 4660/* PXC200 muxsel helper4661 * luke@syseng.anu.edu.au4662 * another transplant4663 * from Alessandro Rubini (rubini@linux.it)4664 *4665 * There are 4 kinds of cards:4666 * PXC200L which is bt8484667 * PXC200F which is bt848 with PIC controlling mux4668 * PXC200AL which is bt8784669 * PXC200AF which is bt878 with PIC controlling mux4670 */4671#define PX_CFG_PXC200F 0x014672#define PX_FLAG_PXC200A 0x00001000 /* a pxc200A is bt-878 based */4673#define PX_I2C_PIC 0x0f4674#define PX_PXC200A_CARDID 0x200a12954675#define PX_I2C_CMD_CFG 0x004676 4677static void PXC200_muxsel(struct bttv *btv, unsigned int input)4678{4679 int rc;4680 long mux;4681 int bitmask;4682 unsigned char buf[2];4683 4684 /* Read PIC config to determine if this is a PXC200F */4685 /* PX_I2C_CMD_CFG*/4686 buf[0]=0;4687 buf[1]=0;4688 rc=bttv_I2CWrite(btv,(PX_I2C_PIC<<1),buf[0],buf[1],1);4689 if (rc) {4690 pr_debug("%d: PXC200_muxsel: pic cfg write failed:%d\n",4691 btv->c.nr, rc);4692 /* not PXC ? do nothing */4693 return;4694 }4695 4696 rc=bttv_I2CRead(btv,(PX_I2C_PIC<<1),NULL);4697 if (!(rc & PX_CFG_PXC200F)) {4698 pr_debug("%d: PXC200_muxsel: not PXC200F rc:%d\n",4699 btv->c.nr, rc);4700 return;4701 }4702 4703 4704 /* The multiplexer in the 200F is handled by the GPIO port */4705 /* get correct mapping between inputs */4706 /* mux = bttv_tvcards[btv->type].muxsel[input] & 3; */4707 /* ** not needed!? */4708 mux = input;4709 4710 /* make sure output pins are enabled */4711 /* bitmask=0x30f; */4712 bitmask=0x302;4713 /* check whether we have a PXC200A */4714 if (btv->cardid == PX_PXC200A_CARDID) {4715 bitmask ^= 0x180; /* use 7 and 9, not 8 and 9 */4716 bitmask |= 7<<4; /* the DAC */4717 }4718 btwrite(bitmask, BT848_GPIO_OUT_EN);4719 4720 bitmask = btread(BT848_GPIO_DATA);4721 if (btv->cardid == PX_PXC200A_CARDID)4722 bitmask = (bitmask & ~0x280) | ((mux & 2) << 8) | ((mux & 1) << 7);4723 else /* older device */4724 bitmask = (bitmask & ~0x300) | ((mux & 3) << 8);4725 btwrite(bitmask,BT848_GPIO_DATA);4726 4727 /*4728 * Was "to be safe, set the bt848 to input 0"4729 * Actually, since it's ok at load time, better not messing4730 * with these bits (on PXC200AF you need to set mux 2 here)4731 *4732 * needed because bttv-driver sets mux before calling this function4733 */4734 if (btv->cardid == PX_PXC200A_CARDID)4735 btaor(2<<5, ~BT848_IFORM_MUXSEL, BT848_IFORM);4736 else /* older device */4737 btand(~BT848_IFORM_MUXSEL,BT848_IFORM);4738 4739 pr_debug("%d: setting input channel to:%d\n", btv->c.nr, (int)mux);4740}4741 4742static void phytec_muxsel(struct bttv *btv, unsigned int input)4743{4744 unsigned int mux = input % 4;4745 4746 if (input == btv->svhs)4747 mux = 0;4748 4749 gpio_bits(0x3, mux);4750}4751 4752/*4753 * GeoVision GV-800(S) functions4754 * Bruno Christo <bchristo@inf.ufsm.br>4755*/4756 4757/* This is a function to control the analog switch, which determines which4758 * camera is routed to which controller. The switch comprises an X-address4759 * (gpio bits 0-3, representing the camera, ranging from 0-15), and a4760 * Y-address (gpio bits 4-6, representing the controller, ranging from 0-3).4761 * A data value (gpio bit 18) of '1' enables the switch, and '0' disables4762 * the switch. A STROBE bit (gpio bit 17) latches the data value into the4763 * specified address. There is also a chip select (gpio bit 16).4764 * The idea is to set the address and chip select together, bring4765 * STROBE high, write the data, and finally bring STROBE back to low.4766 */4767static void gv800s_write(struct bttv *btv,4768 unsigned char xaddr,4769 unsigned char yaddr,4770 unsigned char data) {4771 /* On the "master" 878A:4772 * GPIO bits 0-9 are used for the analog switch:4773 * 00 - 03: camera selector4774 * 04 - 06: 878A (controller) selector4775 * 16: cselect4776 * 17: strobe4777 * 18: data (1->on, 0->off)4778 * 19: reset4779 */4780 const u32 ADDRESS = ((xaddr&0xf) | (yaddr&3)<<4);4781 const u32 CSELECT = 1<<16;4782 const u32 STROBE = 1<<17;4783 const u32 DATA = data<<18;4784 4785 gpio_bits(0x1007f, ADDRESS | CSELECT); /* write ADDRESS and CSELECT */4786 gpio_bits(0x20000, STROBE); /* STROBE high */4787 gpio_bits(0x40000, DATA); /* write DATA */4788 gpio_bits(0x20000, ~STROBE); /* STROBE low */4789}4790 4791/*4792 * GeoVision GV-800(S) muxsel4793 *4794 * Each of the 4 cards (controllers) use this function.4795 * The controller using this function selects the input through the GPIO pins4796 * of the "master" card. A pointer to this card is stored in master[btv->c.nr].4797 *4798 * The parameter 'input' is the requested camera number (0-4) on the controller.4799 * The map array has the address of each input. Note that the addresses in the4800 * array are in the sequence the original GeoVision driver uses, that is, set4801 * every controller to input 0, then to input 1, 2, 3, repeat. This means that4802 * the physical "camera 1" connector corresponds to controller 0 input 0,4803 * "camera 2" corresponds to controller 1 input 0, and so on.4804 *4805 * After getting the input address, the function then writes the appropriate4806 * data to the analog switch, and housekeeps the local copy of the switch4807 * information.4808 */4809static void gv800s_muxsel(struct bttv *btv, unsigned int input)4810{4811 struct bttv *mctlr;4812 int xaddr, yaddr;4813 static unsigned int map[4][4] = { { 0x0, 0x4, 0xa, 0x6 },4814 { 0x1, 0x5, 0xb, 0x7 },4815 { 0x2, 0x8, 0xc, 0xe },4816 { 0x3, 0x9, 0xd, 0xf } };4817 input = input%4;4818 mctlr = master[btv->c.nr];4819 if (mctlr == NULL) {4820 /* do nothing until the "master" is detected */4821 return;4822 }4823 yaddr = (btv->c.nr - mctlr->c.nr) & 3;4824 xaddr = map[yaddr][input] & 0xf;4825 4826 /* Check if the controller/camera pair has changed, ignore otherwise */4827 if (mctlr->sw_status[yaddr] != xaddr) {4828 /* disable the old switch, enable the new one and save status */4829 gv800s_write(mctlr, mctlr->sw_status[yaddr], yaddr, 0);4830 mctlr->sw_status[yaddr] = xaddr;4831 gv800s_write(mctlr, xaddr, yaddr, 1);4832 }4833}4834 4835/* GeoVision GV-800(S) "master" chip init */4836static void gv800s_init(struct bttv *btv)4837{4838 int ix;4839 4840 gpio_inout(0xf107f, 0xf107f);4841 gpio_write(1<<19); /* reset the analog MUX */4842 gpio_write(0);4843 4844 /* Preset camera 0 to the 4 controllers */4845 for (ix = 0; ix < 4; ix++) {4846 btv->sw_status[ix] = ix;4847 gv800s_write(btv, ix, ix, 1);4848 }4849 4850 /* Inputs on the "master" controller need this brightness fix */4851 bttv_I2CWrite(btv, 0x18, 0x5, 0x90, 1);4852 4853 if (btv->c.nr > BTTV_MAX-4)4854 return;4855 /*4856 * Store the "master" controller pointer in the master4857 * array for later use in the muxsel function.4858 */4859 master[btv->c.nr] = btv;4860 master[btv->c.nr+1] = btv;4861 master[btv->c.nr+2] = btv;4862 master[btv->c.nr+3] = btv;4863}4864 4865/* ----------------------------------------------------------------------- */4866/* motherboard chipset specific stuff */4867 4868void __init bttv_check_chipset(void)4869{4870 struct pci_dev *dev = NULL;4871 4872 if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF))4873 triton1 = 1;4874 if (pci_pci_problems & PCIPCI_VSFX)4875 vsfx = 1;4876#ifdef PCIPCI_ALIMAGIK4877 if (pci_pci_problems & PCIPCI_ALIMAGIK)4878 latency = 0x0A;4879#endif4880 4881 4882 /* print warnings about any quirks found */4883 if (triton1)4884 pr_info("Host bridge needs ETBF enabled\n");4885 if (vsfx)4886 pr_info("Host bridge needs VSFX enabled\n");4887 if (UNSET != latency)4888 pr_info("pci latency fixup [%d]\n", latency);4889 while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL,4890 PCI_DEVICE_ID_INTEL_82441, dev))) {4891 unsigned char b;4892 pci_read_config_byte(dev, 0x53, &b);4893 if (bttv_debug)4894 pr_info("Host bridge: 82441FX Natoma, bufcon=0x%02x\n",4895 b);4896 }4897}4898 4899int bttv_handle_chipset(struct bttv *btv)4900{4901 unsigned char command;4902 4903 if (!triton1 && !vsfx && UNSET == latency)4904 return 0;4905 4906 if (bttv_verbose) {4907 if (triton1)4908 pr_info("%d: enabling ETBF (430FX/VP3 compatibility)\n",4909 btv->c.nr);4910 if (vsfx && btv->id >= 878)4911 pr_info("%d: enabling VSFX\n", btv->c.nr);4912 if (UNSET != latency)4913 pr_info("%d: setting pci timer to %d\n",4914 btv->c.nr, latency);4915 }4916 4917 if (btv->id < 878) {4918 /* bt848 (mis)uses a bit in the irq mask for etbf */4919 if (triton1)4920 btv->triton1 = BT848_INT_ETBF;4921 } else {4922 /* bt878 has a bit in the pci config space for it */4923 pci_read_config_byte(btv->c.pci, BT878_DEVCTRL, &command);4924 if (triton1)4925 command |= BT878_EN_TBFX;4926 if (vsfx)4927 command |= BT878_EN_VSFX;4928 pci_write_config_byte(btv->c.pci, BT878_DEVCTRL, command);4929 }4930 if (UNSET != latency)4931 pci_write_config_byte(btv->c.pci, PCI_LATENCY_TIMER, latency);4932 return 0;4933}4934