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