1/* 2 bttv-cards.c 3 4 this file has configuration informations - card-specific stuff 5 like the big tvcards array for the most part 6 7 Copyright (C) 1996,97,98 Ralph Metzler (rjkm@thp.uni-koeln.de) 8 & Marcus Metzler (mocm@thp.uni-koeln.de) 9 (c) 1999-2001 Gerd Knorr <kraxel@goldbach.in-berlin.de> 10 11 This program is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 2 of the License, or 14 (at your option) any later version. 15 16 This program is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program; if not, write to the Free Software 23 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 24 25*/ 26 27#define __NO_VERSION__ 1 28 29#include <linux/version.h> 30#include <linux/delay.h> 31#include <linux/module.h> 32#include <linux/kmod.h> 33#include <linux/init.h> 34#include <linux/pci.h> 35 36#include <asm/io.h> 37 38#include "bttvp.h" 39#include "tuner.h" 40 41/* fwd decl */ 42static void boot_msp34xx(struct bttv *btv, int pin); 43static void hauppauge_eeprom(struct bttv *btv); 44static void avermedia_eeprom(struct bttv *btv); 45static void init_PXC200(struct bttv *btv); 46 47static void winview_audio(struct bttv *btv, struct video_audio *v, int set); 48static void lt9415_audio(struct bttv *btv, struct video_audio *v, int set); 49static void avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, 50 int set); 51static void terratv_audio(struct bttv *btv, struct video_audio *v, int set); 52static void gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set); 53static void winfast2000_audio(struct bttv *btv, struct video_audio *v, int set); 54static void pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set); 55static void fv2000s_audio(struct bttv *btv, struct video_audio *v, int set); 56static void windvr_audio(struct bttv *btv, struct video_audio *v, int set); 57static void rv605_muxsel(struct bttv *btv, unsigned int input); 58 59/* config variables */ 60static int triton1=0; 61static int vsfx=0; 62int no_overlay=-1; 63static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = -1}; 64static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = -1}; 65static unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = -1}; 66#ifdef MODULE 67static unsigned int autoload = 1; 68#else 69static unsigned int autoload = 0; 70#endif 71static unsigned int gpiomask = -1; 72static unsigned int audioall = -1; 73static unsigned int audiomux[5] = { -1, -1, -1, -1, -1 }; 74 75/* insmod options */ 76MODULE_PARM(triton1,"i"); 77MODULE_PARM_DESC(triton1,"set ETBF pci config bit " 78 "[enable bug compatibility for triton1 + others]"); 79MODULE_PARM(vsfx,"i"); 80MODULE_PARM_DESC(vsfx,"set VSFX pci config bit " 81 "[yet another chipset flaw workaround]"); 82MODULE_PARM(no_overlay,"i"); 83MODULE_PARM(card,"1-" __stringify(BTTV_MAX) "i"); 84MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list"); 85MODULE_PARM(pll,"1-" __stringify(BTTV_MAX) "i"); 86MODULE_PARM_DESC(pll,"specify installed crystal (0=none, 28=28 MHz, 35=35 MHz)"); 87MODULE_PARM(tuner,"1-" __stringify(BTTV_MAX) "i"); 88MODULE_PARM_DESC(tuner,"specify installed tuner type"); 89MODULE_PARM(autoload,"i"); 90MODULE_PARM_DESC(autoload,"automatically load i2c modules like tuner.o, default is 1 (yes)"); 91MODULE_PARM(gpiomask,"i"); 92MODULE_PARM(audioall,"i"); 93MODULE_PARM(audiomux,"1-5i"); 94 95/* kernel args */ 96#ifndef MODULE 97static int __init p_card(char *str) { return bttv_parse(str,BTTV_MAX,card); } 98static int __init p_pll(char *str) { return bttv_parse(str,BTTV_MAX,pll); } 99static int __init p_tuner(char *str) { return bttv_parse(str,BTTV_MAX,tuner); } 100__setup("bttv.card=", p_card); 101__setup("bttv.pll=", p_pll); 102__setup("bttv.tuner=", p_tuner); 103 104int __init bttv_parse(char *str, int max, int *vals) 105{ 106 int i,number,res = 2; 107 108 for (i = 0; res == 2 && i < max; i++) { 109 res = get_option(&str,&number); 110 if (res) 111 vals[i] = number; 112 } 113 return 1; 114} 115#endif 116 117/* ----------------------------------------------------------------------- */ 118/* list of card IDs for bt878+ cards */ 119 120static struct CARD { 121 unsigned id; 122 int cardnr; 123 char *name; 124} cards[] __devinitdata = { 125 { 0x13eb0070, BTTV_HAUPPAUGE878, "Hauppauge WinTV" }, 126 { 0x39000070, BTTV_HAUPPAUGE878, "Hauppauge WinTV-D" }, 127 { 0x45000070, BTTV_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" }, 128 { 0xff000070, BTTV_HAUPPAUGE878, "Osprey-100" }, 129 { 0xff010070, BTTV_HAUPPAUGE878, "Osprey-200" }, 130 131 { 0x00011002, BTTV_ATI_TVWONDER, "ATI TV Wonder" }, 132 { 0x00031002, BTTV_ATI_TVWONDERVE,"ATI TV Wonder/VE" }, 133 134 { 0x6606107d, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" }, 135 { 0x6607107d, BTTV_WINFAST2000, "Leadtek WinFast VC 100" }, 136 { 0x263610b4, BTTV_STB2, "STB TV PCI FM, P/N 6000704" }, 137 { 0x402010fc, BTTV_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" }, 138 { 0x405010fc, BTTV_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" }, 139 140 { 0x1200bd11, BTTV_PINNACLE, "Pinnacle PCTV" }, 141 { 0x001211bd, BTTV_PINNACLE, "Pinnacle PCTV" }, 142 { 0x001c11bd, BTTV_PINNACLE, "Pinnacle PCTV Sat" }, 143 144 { 0x3000121a, BTTV_VOODOOTV_FM, "3Dfx VoodooTV FM/ VoodooTV 200" }, 145 146 { 0x3000144f, BTTV_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" }, 147 { 0x3002144f, BTTV_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" }, 148 { 0x3005144f, BTTV_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" }, 149 150 { 0x00011461, BTTV_AVPHONE98, "AVerMedia TVPhone98" }, 151 { 0x00021461, BTTV_AVERMEDIA98, "AVermedia TVCapture 98" }, 152 { 0x00031461, BTTV_AVPHONE98, "AVerMedia TVPhone98" }, 153 { 0x00041461, BTTV_AVERMEDIA98, "AVerMedia TVCapture 98" }, 154 155 { 0x300014ff, BTTV_MAGICTVIEW061, "TView 99 (CPH061)" }, 156 { 0x300214ff, BTTV_PHOEBE_TVMAS, "Phoebe TV Master (CPH060)" }, 157 158 { 0x1117153b, BTTV_TERRATVALUE, "Terratec TValue" }, 159 { 0x1118153b, BTTV_TERRATVALUE, "Terratec TValue" }, 160 { 0x1119153b, BTTV_TERRATVALUE, "Terratec TValue" }, 161 { 0x111a153b, BTTV_TERRATVALUE, "Terratec TValue" }, 162 { 0x1123153b, BTTV_TERRATVRADIO, "Terratec TV Radio+" }, 163 { 0x1127153b, BTTV_TERRATV, "Terratec TV+" }, 164 // clashes with FlyVideo 165 //{ 0x18521852, BTTV_TERRATV, "Terratec TV+" }, 166 { 0x1134153b, BTTV_TERRATVALUE, "Terratec TValue" }, 167 { 0x1135153b, BTTV_TERRATVALUER, "Terratec TValue Radio" }, 168 { 0x5018153b, BTTV_TERRATVALUE, "Terratec TValue" }, 169 170 { 0x400a15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV" }, 171 { 0x400d15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, 172 { 0x401015b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, 173 { 0x401615b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" }, 174 175 { 0x010115cb, BTTV_GMV1, "AG GMV1" }, 176 { 0x010114c7, BTTV_MODTEC_205, "Modular Technology MM205 PCTV" }, 177 { 0x18501851, BTTV_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" }, 178 { 0x18511851, BTTV_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" }, 179 { 0x18521852, BTTV_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" }, 180 { 0x10b42636, BTTV_HAUPPAUGE878, "STB ???" }, 181 { 0x217d6606, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" }, 182 { 0x03116000, BTTV_SENSORAY311, "Sensoray 311" }, 183 { 0x00790e11, BTTV_WINDVR, "Canopus WinDVR PCI" }, 184 { 0xa0fca1a0, BTTV_ZOLTRIX, "Face to Face Tvmax" }, 185 186 { 0, -1, NULL } 187}; 188 189/* ----------------------------------------------------------------------- */ 190/* array with description for bt848 / bt878 tv/grabber cards */ 191 192struct tvcard bttv_tvcards[] = { 193{ 194/* ---- card 0x00 ---------------------------------- */ 195 name: " *** UNKNOWN/GENERIC *** ", 196 video_inputs: 4, 197 audio_inputs: 1, 198 tuner: 0, 199 svhs: 2, 200 muxsel: { 2, 3, 1, 0}, 201 tuner_type: -1, 202},{ 203 name: "MIRO PCTV", 204 video_inputs: 4, 205 audio_inputs: 1, 206 tuner: 0, 207 svhs: 2, 208 gpiomask: 15, 209 muxsel: { 2, 3, 1, 1}, 210 audiomux: { 2, 0, 0, 0, 10}, 211 needs_tvaudio: 1, 212 tuner_type: -1, 213},{ 214 name: "Hauppauge (bt848)", 215 video_inputs: 4, 216 audio_inputs: 1, 217 tuner: 0, 218 svhs: 2, 219 gpiomask: 7, 220 muxsel: { 2, 3, 1, 1}, 221 audiomux: { 0, 1, 2, 3, 4}, 222 needs_tvaudio: 1, 223 tuner_type: -1, 224},{ 225 name: "STB", 226 video_inputs: 3, 227 audio_inputs: 1, 228 tuner: 0, 229 svhs: 2, 230 gpiomask: 7, 231 muxsel: { 2, 3, 1, 1}, 232 audiomux: { 4, 0, 2, 3, 1}, 233 no_msp34xx: 1, 234 needs_tvaudio: 1, 235 tuner_type: -1, 236},{ 237 238/* ---- card 0x04 ---------------------------------- */ 239 name: "Intel Create and Share PCI/ Smart Video Recorder III", 240 video_inputs: 4, 241 audio_inputs: 0, 242 tuner: -1, 243 svhs: 2, 244 gpiomask: 0, 245 muxsel: { 2, 3, 1, 1}, 246 audiomux: { 0 }, 247 needs_tvaudio: 0, 248 tuner_type: 4, 249},{ 250 name: "Diamond DTV2000", 251 video_inputs: 4, 252 audio_inputs: 1, 253 tuner: 0, 254 svhs: 2, 255 gpiomask: 3, 256 muxsel: { 2, 3, 1, 0}, 257 audiomux: { 0, 1, 0, 1, 3}, 258 needs_tvaudio: 1, 259 tuner_type: -1, 260},{ 261 name: "AVerMedia TVPhone", 262 video_inputs: 3, 263 audio_inputs: 1, 264 tuner: 0, 265 svhs: 3, 266 muxsel: { 2, 3, 1, 1}, 267 gpiomask: 0x0f, 268 audiomux: { 0x0c, 0x04, 0x08, 0x04, 0}, 269 /* 0x04 for some cards ?? */ 270 needs_tvaudio: 1, 271 tuner_type: -1, 272 audio_hook: avermedia_tvphone_audio, 273},{ 274 name: "MATRIX-Vision MV-Delta", 275 video_inputs: 5, 276 audio_inputs: 1, 277 tuner: -1, 278 svhs: 3, 279 gpiomask: 0, 280 muxsel: { 2, 3, 1, 0, 0}, 281 audiomux: {0 }, 282 needs_tvaudio: 1, 283 tuner_type: -1, 284},{ 285 286/* ---- card 0x08 ---------------------------------- */ 287 name: "Lifeview FlyVideo II (Bt848) LR26", 288 video_inputs: 4, 289 audio_inputs: 1, 290 tuner: 0, 291 svhs: 2, 292 gpiomask: 0xc00, 293 muxsel: { 2, 3, 1, 1}, 294 audiomux: { 0, 0xc00, 0x800, 0x400, 0xc00, 0}, 295 needs_tvaudio: 1, 296 pll: PLL_28, 297 tuner_type: -1, 298},{ 299 name: "IMS/IXmicro TurboTV", 300 video_inputs: 3, 301 audio_inputs: 1, 302 tuner: 0, 303 svhs: 2, 304 gpiomask: 3, 305 muxsel: { 2, 3, 1, 1}, 306 audiomux: { 1, 1, 2, 3, 0}, 307 needs_tvaudio: 0, 308 pll: PLL_28, 309 tuner_type: TUNER_TEMIC_PAL, 310},{ 311 name: "Hauppauge (bt878)", 312 video_inputs: 4, 313 audio_inputs: 1, 314 tuner: 0, 315 svhs: 2, 316 gpiomask: 0x0f, /* old: 7 */ 317 muxsel: { 2, 0, 1, 1}, 318 audiomux: { 0, 1, 2, 3, 4}, 319 needs_tvaudio: 1, 320 pll: PLL_28, 321 tuner_type: -1, 322},{ 323 name: "MIRO PCTV pro", 324 video_inputs: 3, 325 audio_inputs: 1, 326 tuner: 0, 327 svhs: 2, 328 gpiomask: 0x3014f, 329 muxsel: { 2, 3, 1, 1}, 330 audiomux: { 0x20001,0x10001, 0, 0,10}, 331 needs_tvaudio: 1, 332 tuner_type: -1, 333},{ 334 335/* ---- card 0x0c ---------------------------------- */ 336 name: "ADS Technologies Channel Surfer TV (bt848)", 337 video_inputs: 3, 338 audio_inputs: 1, 339 tuner: 0, 340 svhs: 2, 341 gpiomask: 15, 342 muxsel: { 2, 3, 1, 1}, 343 audiomux: { 13, 14, 11, 7, 0, 0}, 344 needs_tvaudio: 1, 345 tuner_type: -1, 346},{ 347 name: "AVerMedia TVCapture 98", 348 video_inputs: 3, 349 audio_inputs: 4, 350 tuner: 0, 351 svhs: 2, 352 gpiomask: 15, 353 muxsel: { 2, 3, 1, 1}, 354 audiomux: { 13, 14, 11, 7, 0, 0}, 355 needs_tvaudio: 1, 356 pll: PLL_28, 357 tuner_type: TUNER_PHILIPS_PAL, 358},{ 359 name: "Aimslab Video Highway Xtreme (VHX)", 360 video_inputs: 3, 361 audio_inputs: 1, 362 tuner: 0, 363 svhs: 2, 364 gpiomask: 7, 365 muxsel: { 2, 3, 1, 1}, 366 audiomux: { 0, 2, 1, 3, 4}, /* old: { 0, 1, 2, 3, 4} */ 367 needs_tvaudio: 1, 368 pll: PLL_28, 369 tuner_type: -1, 370},{ 371 name: "Zoltrix TV-Max", 372 video_inputs: 3, 373 audio_inputs: 1, 374 tuner: 0, 375 svhs: 2, 376 gpiomask: 15, 377 muxsel: { 2, 3, 1, 1}, 378 audiomux: {0 , 0, 1 , 0, 10}, 379 needs_tvaudio: 1, 380 tuner_type: -1, 381},{ 382 383/* ---- card 0x10 ---------------------------------- */ 384 name: "Prolink Pixelview PlayTV (bt878)", 385 video_inputs: 3, 386 audio_inputs: 1, 387 tuner: 0, 388 svhs: 2, 389 gpiomask: 0x01fe00, 390 muxsel: { 2, 3, 1, 1}, 391 audiomux: { 0x01c000, 0, 0x018000, 0x014000, 0x002000, 0 }, 392 needs_tvaudio: 1, 393 pll: PLL_28, 394 tuner_type: -1, 395},{ 396 name: "Leadtek WinView 601", 397 video_inputs: 3, 398 audio_inputs: 1, 399 tuner: 0, 400 svhs: 2, 401 gpiomask: 0x8300f8, 402 muxsel: { 2, 3, 1, 1,0}, 403 audiomux: { 0x4fa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007}, 404 needs_tvaudio: 1, 405 tuner_type: -1, 406 audio_hook: winview_audio, 407 has_radio: 1, 408},{ 409 name: "AVEC Intercapture", 410 video_inputs: 3, 411 audio_inputs: 2, 412 tuner: 0, 413 svhs: 2, 414 gpiomask: 0, 415 muxsel: {2, 3, 1, 1}, 416 audiomux: {1, 0, 0, 0, 0}, 417 needs_tvaudio: 1, 418 tuner_type: -1, 419},{ 420 name: "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)", 421 video_inputs: 4, 422 audio_inputs: 1, 423 tuner: -1, 424 svhs: -1, 425 gpiomask: 0x8dff00, 426 muxsel: { 2, 3, 1, 1}, 427 audiomux: { 0 }, 428 no_msp34xx: 1, 429 tuner_type: -1, 430},{ 431 432/* ---- card 0x14 ---------------------------------- */ 433 name: "CEI Raffles Card", 434 video_inputs: 3, 435 audio_inputs: 3, 436 tuner: 0, 437 svhs: 2, 438 muxsel: {2, 3, 1, 1}, 439 tuner_type: -1, 440},{ 441 name: "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50", 442 video_inputs: 4, 443 audio_inputs: 2, // tuner, line in 444 tuner: 0, 445 svhs: 2, 446 gpiomask: 0x1800, 447 muxsel: { 2, 3, 1, 1}, 448 audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800}, 449 pll: PLL_28, 450 tuner_type: TUNER_PHILIPS_PAL_I, 451},{ 452 name: "Askey CPH050/ Phoebe Tv Master + FM", 453 video_inputs: 3, 454 audio_inputs: 1, 455 tuner: 0, 456 svhs: 2, 457 gpiomask: 0xc00, 458 muxsel: { 2, 3, 1, 1}, 459 audiomux: {0, 1, 0x800, 0x400, 0xc00, 0}, 460 needs_tvaudio: 1, 461 pll: PLL_28, 462 tuner_type: -1, 463},{ 464 name: "Modular Technology MM205 PCTV, bt878", 465 video_inputs: 2, 466 audio_inputs: 1, 467 tuner: 0, 468 svhs: -1, 469 gpiomask: 7, 470 muxsel: { 2, 3 }, 471 audiomux: { 0, 0, 0, 0, 0 }, 472 no_msp34xx: 1, 473 pll: PLL_28, 474 tuner_type: TUNER_ALPS_TSBB5_PAL_I, 475},{ 476 477/* ---- card 0x18 ---------------------------------- */ 478 name: "Askey CPH05X/06X (bt878) [many vendors]", 479 video_inputs: 3, 480 audio_inputs: 1, 481 tuner: 0, 482 svhs: 2, 483 gpiomask: 0xe00, 484 muxsel: { 2, 3, 1, 1}, 485 audiomux: {0x400, 0x400, 0x400, 0x400, 0xc00}, 486 needs_tvaudio: 1, 487 pll: PLL_28, 488 tuner_type: -1, 489},{ 490 name: "Terratec Terra TV+ Version 1.0 (Bt848)/Vobis TV-Boostar", 491 video_inputs: 3, 492 audio_inputs: 1, 493 tuner: 0, 494 svhs: 2, 495 gpiomask: 16777215, 496 muxsel: { 2, 3, 1, 1}, 497 audiomux: { 131072, 1, 1638400, 3,4}, 498 needs_tvaudio: 1, 499 tuner_type: -1, 500},{ 501 name: "Hauppauge WinCam newer (bt878)", 502 video_inputs: 4, 503 audio_inputs: 1, 504 tuner: 0, 505 svhs: 3, 506 gpiomask: 7, 507 muxsel: { 2, 0, 1, 1}, 508 audiomux: { 0, 1, 2, 3, 4}, 509 needs_tvaudio: 1, 510 tuner_type: -1, 511},{ 512 name: "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50", 513 video_inputs: 4, 514 audio_inputs: 2, 515 tuner: 0, 516 svhs: 2, 517 gpiomask: 0x1800, 518 muxsel: { 2, 3, 1, 1}, 519 audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800}, 520 pll: PLL_28, 521 tuner_type: TUNER_PHILIPS_SECAM, 522},{ 523 524/* ---- card 0x1c ---------------------------------- */ 525 name: "Terratec TerraTV+", 526 video_inputs: 3, 527 audio_inputs: 1, 528 tuner: 0, 529 svhs: 2, 530 gpiomask: 0x70000, 531 muxsel: { 2, 3, 1, 1}, 532 audiomux: { 0x20000, 0x30000, 0x10000, 0x00000, 0x40000}, 533 needs_tvaudio: 1, 534 tuner_type: TUNER_PHILIPS_PAL, 535 audio_hook: terratv_audio, 536},{ 537 /* Jannik Fritsch <jannik@techfak.uni-bielefeld.de> */ 538 name: "Imagenation PXC200", 539 video_inputs: 5, 540 audio_inputs: 1, 541 tuner: -1, 542 svhs: 1, /* was: 4 */ 543 gpiomask: 0, 544 muxsel: { 2, 3, 1, 0, 0}, 545 audiomux: { 0 }, 546 needs_tvaudio: 1, 547 tuner_type: -1, 548},{ 549 name: "Lifeview FlyVideo 98 LR50", 550 video_inputs: 4, 551 audio_inputs: 1, 552 tuner: 0, 553 svhs: 2, 554 gpiomask: 0x1800, //0x8dfe00 555 muxsel: { 2, 3, 1, 1}, 556 audiomux: { 0, 0x0800, 0x1000, 0x1000, 0x1800, 0 }, 557 pll: PLL_28, 558 tuner_type: -1, 559},{ 560 name: "Formac iProTV", 561 video_inputs: 3, 562 audio_inputs: 1, 563 tuner: 0, 564 svhs: 2, 565 gpiomask: 1, 566 muxsel: { 2, 3, 1, 1}, 567 audiomux: { 1, 0, 0, 0, 0 }, 568 tuner_type: -1, 569},{ 570 571/* ---- card 0x20 ---------------------------------- */ 572 name: "Intel Create and Share PCI/ Smart Video Recorder III", 573 video_inputs: 4, 574 audio_inputs: 0, 575 tuner: -1, 576 svhs: 2, 577 gpiomask: 0, 578 muxsel: { 2, 3, 1, 1}, 579 audiomux: { 0 }, 580 needs_tvaudio: 0, 581 tuner_type: 4, 582},{ 583 name: "Terratec TerraTValue", 584 video_inputs: 3, 585 audio_inputs: 1, 586 tuner: 0, 587 svhs: 2, 588 gpiomask: 0xffff00, 589 muxsel: { 2, 3, 1, 1}, 590 audiomux: { 0x500, 0, 0x300, 0x900, 0x900}, 591 needs_tvaudio: 1, 592 pll: PLL_28, 593 tuner_type: TUNER_PHILIPS_PAL, 594},{ 595 name: "Leadtek WinFast 2000/ WinFast 2000 XP", 596 video_inputs: 4, 597 audio_inputs: 1, 598 tuner: 0, 599 svhs: 2, 600 gpiomask: 0xc33000, 601 muxsel: { 2, 3, 1, 1, 0}, // TV, CVid, SVid, CVid over SVid connector 602 audiomux: { 0x422000,0x1000,0x0000,0x620000,0x800000}, 603 /* Audio Routing for "WinFast 2000 XP" (no tv stereo !) 604 gpio23 -- hef4052:nEnable (0x800000) 605 gpio12 -- hef4052:A1 606 gpio13 -- hef4052:A0 607 0x0000: external audio 608 0x1000: FM 609 0x2000: TV 610 0x3000: n.c. 611 Note: There exists another variant "Winfast 2000" with tv stereo !? 612 Note: eeprom only contains FF and pci subsystem id 107d:6606 613 */ 614 needs_tvaudio: 0, 615 pll: PLL_28, 616 has_radio: 1, 617 tuner_type: 5, // default for now, gpio reads BFFF06 for Pal bg+dk 618 audio_hook: winfast2000_audio, 619},{ 620 name: "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II", 621 video_inputs: 4, 622 audio_inputs: 3, 623 tuner: 0, 624 svhs: 2, 625 gpiomask: 0x1800, 626 muxsel: { 2, 3, 1, 1}, 627 audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800}, 628 pll: PLL_28, 629 tuner_type: -1, 630},{ 631 632/* ---- card 0x24 ---------------------------------- */ 633 name: "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner", 634 video_inputs: 4, 635 audio_inputs: 3, 636 tuner: 0, 637 svhs: 2, 638 gpiomask: 0x1800, 639 muxsel: { 2, 3, 1, 1}, 640 audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 }, 641 pll: PLL_28, 642 tuner_type: -1, 643 has_radio: 1, 644},{ 645 name: "Prolink PixelView PlayTV pro", 646 video_inputs: 3, 647 audio_inputs: 1, 648 tuner: 0, 649 svhs: 2, 650 gpiomask: 0xff, 651 muxsel: { 2, 3, 1, 1 }, 652 audiomux: { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 }, 653 no_msp34xx: 1, 654 pll: PLL_28, 655 tuner_type: -1, 656},{ 657 name: "Askey CPH06X TView99", 658 video_inputs: 4, 659 audio_inputs: 1, 660 tuner: 0, 661 svhs: 2, 662 gpiomask: 0x551e00, 663 muxsel: { 2, 3, 1, 0}, 664 audiomux: { 0x551400, 0x551200, 0, 0, 0x551c00, 0x551200 }, 665 needs_tvaudio: 1, 666 pll: PLL_28, 667 tuner_type: -1, 668},{ 669 name: "Pinnacle PCTV Studio/Rave", 670 video_inputs: 3, 671 audio_inputs: 1, 672 tuner: 0, 673 svhs: 2, 674 gpiomask: 0x03000F, 675 muxsel: { 2, 3, 1, 1}, 676 audiomux: { 2, 0, 0, 0, 1}, 677 needs_tvaudio: 1, 678 pll: PLL_28, 679 tuner_type: -1, 680},{ 681 682/* ---- card 0x28 ---------------------------------- */ 683 name: "STB2", 684 video_inputs: 3, 685 audio_inputs: 1, 686 tuner: 0, 687 svhs: 2, 688 gpiomask: 7, 689 muxsel: { 2, 3, 1, 1}, 690 audiomux: { 4, 0, 2, 3, 1}, 691 no_msp34xx: 1, 692 needs_tvaudio: 1, 693 tuner_type: -1, 694},{ 695 name: "AVerMedia TVPhone 98", 696 video_inputs: 3, 697 audio_inputs: 4, 698 tuner: 0, 699 svhs: 2, 700 gpiomask: 15, 701 muxsel: { 2, 3, 1, 1}, 702 audiomux: { 13, 4, 11, 7, 0, 0}, 703 needs_tvaudio: 1, 704 pll: PLL_28, 705 tuner_type: -1, 706 has_radio: 1, 707},{ 708 name: "ProVideo PV951", /* pic16c54 */ 709 video_inputs: 3, 710 audio_inputs: 1, 711 tuner: 0, 712 svhs: 2, 713 gpiomask: 0, 714 muxsel: { 2, 3, 1, 1}, 715 audiomux: { 0, 0, 0, 0, 0}, 716 needs_tvaudio: 1, 717 no_msp34xx: 1, 718 pll: PLL_28, 719 tuner_type: 1, 720},{ 721 name: "Little OnAir TV", 722 video_inputs: 3, 723 audio_inputs: 1, 724 tuner: 0, 725 svhs: 2, 726 gpiomask: 0xe00b, 727 muxsel: {2, 3, 1, 1}, 728 audiomux: {0xff9ff6, 0xff9ff6, 0xff1ff7, 0, 0xff3ffc}, 729 no_msp34xx: 1, 730 tuner_type: -1, 731},{ 732 733/* ---- card 0x2c ---------------------------------- */ 734 name: "Sigma TVII-FM", 735 video_inputs: 2, 736 audio_inputs: 1, 737 tuner: 0, 738 svhs: -1, 739 gpiomask: 3, 740 muxsel: {2, 3, 1, 1}, 741 audiomux: {1, 1, 0, 2, 3}, 742 no_msp34xx: 1, 743 pll: PLL_NONE, 744 tuner_type: -1, 745},{ 746 name: "MATRIX-Vision MV-Delta 2", 747 video_inputs: 5, 748 audio_inputs: 1, 749 tuner: -1, 750 svhs: 3, 751 gpiomask: 0, 752 muxsel: { 2, 3, 1, 0, 0}, 753 audiomux: {0 }, 754 no_msp34xx: 1, 755 pll: PLL_28, 756 tuner_type: -1, 757},{ 758 name: "Zoltrix Genie TV/FM", 759 video_inputs: 3, 760 audio_inputs: 1, 761 tuner: 0, 762 svhs: 2, 763 gpiomask: 0xbcf03f, 764 muxsel: { 2, 3, 1, 1}, 765 audiomux: { 0xbc803f, 0xbc903f, 0xbcb03f, 0, 0xbcb03f}, 766 no_msp34xx: 1, 767 pll: PLL_28, 768 tuner_type: 21, 769},{ 770 name: "Terratec TV/Radio+", 771 video_inputs: 3, 772 audio_inputs: 1, 773 tuner: 0, 774 svhs: 2, 775 gpiomask: 0x70000, 776 muxsel: { 2, 3, 1, 1}, 777 audiomux: { 0x20000, 0x30000, 0x10000, 0, 0x40000, 0x20000 }, 778 needs_tvaudio: 1, 779 no_msp34xx: 1, 780 pll: PLL_35, 781 tuner_type: 1, 782 has_radio: 1, 783},{ 784 785/* ---- card 0x30 ---------------------------------- */ 786 name: "Askey CPH03x/ Dynalink Magic TView", 787 video_inputs: 3, 788 audio_inputs: 1, 789 tuner: 0, 790 svhs: 2, 791 gpiomask: 15, 792 muxsel: { 2, 3, 1, 1}, 793 audiomux: {2,0,0,0,1}, 794 needs_tvaudio: 1, 795 pll: PLL_28, 796 tuner_type: -1, 797},{ 798 name: "IODATA GV-BCTV3/PCI", 799 video_inputs: 3, 800 audio_inputs: 1, 801 tuner: 0, 802 svhs: 2, 803 gpiomask: 0x010f00, 804 muxsel: {2, 3, 0, 0}, 805 audiomux: {0x10000, 0, 0x10000, 0, 0, 0}, 806 no_msp34xx: 1, 807 pll: PLL_28, 808 tuner_type: TUNER_ALPS_TSHC6_NTSC, 809 audio_hook: gvbctv3pci_audio, 810},{ 811 name: "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP", 812 video_inputs: 4, 813 audio_inputs: 1, 814 tuner: 0, 815 svhs: 3, 816 gpiomask: 0xAA0000, 817 muxsel: { 2,3,1,1 }, 818 audiomux: { 0x20000, 0, 0x80000, 0x80000, 0xa8000, 0x46000 }, 819 no_msp34xx: 1, 820 pll: PLL_28, 821 tuner_type: TUNER_PHILIPS_PAL_I, 822},{ 823 name: "Eagle Wireless Capricorn2 (bt878A)", 824 video_inputs: 4, 825 audio_inputs: 1, 826 tuner: 0, 827 svhs: 2, 828 gpiomask: 7, 829 muxsel: { 2, 0, 1, 1}, 830 audiomux: { 0, 1, 2, 3, 4}, 831 pll: PLL_28, 832 tuner_type: -1 /* TUNER_ALPS_TMDH2_NTSC */, 833},{ 834 835/* ---- card 0x34 ---------------------------------- */ 836 /* David H�rdeman <david@2gen.com> */ 837 name: "Pinnacle PCTV Studio Pro", 838 video_inputs: 3, 839 audio_inputs: 1, 840 tuner: 0, 841 svhs: 2, 842 gpiomask: 0x03000F, 843 muxsel: { 2, 3, 1, 1}, 844 audiomux: { 1, 0x10001, 0, 0, 10}, 845 /* sound path (5 sources): 846 MUX1 (mask 0x03), Enable Pin 0x08 (0=enable, 1=disable) 847 0= ext. Audio IN 848 1= from MUX2 849 2= Mono TV sound from Tuner 850 3= not connected 851 MUX2 (mask 0x30000): 852 0,2,3= from MSP34xx 853 1= FM stereo Radio from Tuner */ 854 needs_tvaudio: 1, 855 pll: PLL_28, 856 tuner_type: -1, 857},{ 858 /* Claas Langbehn <claas@bigfoot.com>, 859 Sven Grothklags <sven@upb.de> */ 860 name: "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS", 861 video_inputs: 3, 862 audio_inputs: 3, 863 tuner: 0, 864 svhs: 2, 865 gpiomask: 0x1c, 866 muxsel: { 2, 3, 1, 1}, 867 audiomux: { 0, 0, 0x10, 8, 4 }, 868 needs_tvaudio: 1, 869 pll: PLL_28, 870 tuner_type: TUNER_PHILIPS_PAL_I, 871 has_radio: 1, 872},{ 873 /* Tim R�stermundt <rosterm@uni-muenster.de> 874 in de.comp.os.unix.linux.hardware: 875 options bttv card=0 pll=1 radio=1 gpiomask=0x18e0 876 audiomux=0x44c71f,0x44d71f,0,0x44d71f,0x44dfff 877 options tuner type=5 */ 878 name: "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]", 879 video_inputs: 4, 880 audio_inputs: 1, 881 tuner: 0, 882 svhs: 2, 883 gpiomask: 0x18e0, 884 muxsel: { 2, 3, 1, 1}, 885 audiomux: { 0x0000,0x0800,0x1000,0x1000,0x18e0 }, 886 /* For cards with tda9820/tda9821: 887 0x0000: Tuner normal stereo 888 0x0080: Tuner A2 SAP (second audio program = Zweikanalton) 889 0x0880: Tuner A2 stereo */ 890 pll: PLL_28, 891 tuner_type: -1, 892},{ 893 /* Miguel Angel Alvarez <maacruz@navegalia.com> 894 old Easy TV BT848 version (model CPH031) */ 895 name: "Askey CPH031/ BESTBUY Easy TV", 896 video_inputs: 4, 897 audio_inputs: 1, 898 tuner: 0, 899 svhs: 2, 900 gpiomask: 0xF, 901 muxsel: { 2, 3, 1, 0}, 902 audiomux: { 2, 0, 0, 0, 10}, 903 needs_tvaudio: 0, 904 pll: PLL_28, 905 tuner_type: TUNER_TEMIC_PAL, 906},{ 907 908/* ---- card 0x38 ---------------------------------- */ 909 /* Gordon Heydon <gjheydon@bigfoot.com ('98) */ 910 name: "Lifeview FlyVideo 98FM LR50", 911 video_inputs: 4, 912 audio_inputs: 3, 913 tuner: 0, 914 svhs: 2, 915 gpiomask: 0x1800, 916 muxsel: { 2, 3, 1, 1}, 917 audiomux: { 0, 0x800, 0x1000, 0x1000, 0x1800, 0 }, 918 pll: PLL_28, 919 tuner_type: 5, 920},{ 921 /* This is the ultimate cheapo capture card 922 * just a BT848A on a small PCB! 923 * Steve Hosgood <steve@equiinet.com> */ 924 name: "GrandTec 'Grand Video Capture' (Bt848)", 925 video_inputs: 2, 926 audio_inputs: 0, 927 tuner: -1, 928 svhs: 1, 929 gpiomask: 0, 930 muxsel: { 3, 1 }, 931 audiomux: { 0 }, 932 needs_tvaudio: 0, 933 no_msp34xx: 1, 934 pll: PLL_35, 935 tuner_type: -1, 936},{ 937 /* Daniel Herrington <daniel.herrington@home.com> */ 938 name: "Askey CPH060/ Phoebe TV Master Only (No FM)", 939 video_inputs: 3, 940 audio_inputs: 1, 941 tuner: 0, 942 svhs: 2, 943 gpiomask: 0xe00, 944 muxsel: { 2, 3, 1, 1}, 945 audiomux: { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 }, 946 needs_tvaudio: 1, 947 pll: PLL_28, 948 tuner_type: TUNER_TEMIC_4036FY5_NTSC, 949},{ 950 /* Matti Mottus <mottus@physic.ut.ee> */ 951 name: "Askey CPH03x TV Capturer", 952 video_inputs: 4, 953 audio_inputs: 1, 954 tuner: 0, 955 svhs: 2, 956 gpiomask: 0x03000F, 957 muxsel: { 2, 3, 1, 0}, 958 audiomux: { 2,0,0,0,1 }, 959 pll: PLL_28, 960 tuner_type: 0, 961},{ 962 963/* ---- card 0x3c ---------------------------------- */ 964 /* Philip Blundell <philb@gnu.org> */ 965 name: "Modular Technology MM100PCTV", 966 video_inputs: 2, 967 audio_inputs: 2, 968 tuner: 0, 969 svhs: -1, 970 gpiomask: 11, 971 muxsel: { 2, 3, 1, 1}, 972 audiomux: { 2, 0, 0, 1, 8}, 973 pll: PLL_35, 974 tuner_type: TUNER_TEMIC_PAL, 975 976},{ 977 /* Adrian Cox <adrian@humboldt.co.uk */ 978 name: "AG Electronics GMV1", 979 video_inputs: 2, 980 audio_inputs: 0, 981 tuner: -1, 982 svhs: 1, 983 gpiomask: 0xF, 984 muxsel: { 2, 2}, 985 audiomux: { }, 986 no_msp34xx: 1, 987 needs_tvaudio: 0, 988 pll: PLL_28, 989 tuner_type: -1, 990},{ 991 /* Miguel Angel Alvarez <maacruz@navegalia.com> 992 new Easy TV BT878 version (model CPH061) 993 special thanks to Informatica Mieres for providing the card */ 994 name: "Askey CPH061/ BESTBUY Easy TV (bt878)", 995 video_inputs: 3, 996 audio_inputs: 2, 997 tuner: 0, 998 svhs: 2, 999 gpiomask: 0xFF, 1000 muxsel: { 2, 3, 1, 0}, 1001 audiomux: { 1, 0, 4, 4, 9}, 1002 needs_tvaudio: 0, 1003 pll: PLL_28, 1004 tuner_type: TUNER_PHILIPS_PAL, 1005},{ 1006 /* Lukas Gebauer <geby@volny.cz> */ 1007 name: "ATI TV-Wonder", 1008 video_inputs: 3, 1009 audio_inputs: 1, 1010 tuner: 0, 1011 svhs: 2, 1012 gpiomask: 0xf03f, 1013 muxsel: { 2, 3, 1, 0 }, 1014 audiomux: { 0xbffe, 0, 0xbfff, 0, 0xbffe}, 1015 pll: PLL_28, 1016 tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL, 1017},{ 1018 1019/* ---- card 0x40 ---------------------------------- */ 1020 /* Lukas Gebauer <geby@volny.cz> */ 1021 name: "ATI TV-Wonder VE", 1022 video_inputs: 2, 1023 audio_inputs: 1, 1024 tuner: 0, 1025 svhs: -1, 1026 gpiomask: 1, 1027 muxsel: { 2, 3, 0, 1}, 1028 audiomux: { 0, 0, 1, 0, 0}, 1029 no_msp34xx: 1, 1030 pll: PLL_28, 1031 tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL, 1032},{ 1033 /* DeeJay <deejay@westel900.net (2000S) */ 1034 name: "Lifeview FlyVideo 2000S LR90", 1035 video_inputs: 3, 1036 audio_inputs: 3, 1037 tuner: 0, 1038 svhs: 2, 1039 gpiomask: 0x18e0, 1040 muxsel: { 2, 3, 0, 1}, 1041 /* Radio changed from 1e80 to 0x800 to make 1042 FlyVideo2000S in .hu happy (gm)*/ 1043 /* -dk-???: set mute=0x1800 for tda9874h daughterboard */ 1044 audiomux: { 0x0000,0x0800,0x1000,0x1000,0x1800, 0x1080 }, 1045 audio_hook: fv2000s_audio, 1046 no_msp34xx: 1, 1047 no_tda9875: 1, 1048 needs_tvaudio: 1, 1049 pll: PLL_28, 1050 tuner_type: 5, 1051},{ 1052 name: "Terratec TValueRadio", 1053 video_inputs: 3, 1054 audio_inputs: 1, 1055 tuner: 0, 1056 svhs: 2, 1057 gpiomask: 0xffff00, 1058 muxsel: { 2, 3, 1, 1}, 1059 audiomux: { 0x500, 0x500, 0x300, 0x900, 0x900}, 1060 needs_tvaudio: 1, 1061 pll: PLL_28, 1062 tuner_type: TUNER_PHILIPS_PAL, 1063 has_radio: 1, 1064},{ 1065 /* TANAKA Kei <peg00625@nifty.com> */ 1066 name: "IODATA GV-BCTV4/PCI", 1067 video_inputs: 3, 1068 audio_inputs: 1, 1069 tuner: 0, 1070 svhs: 2, 1071 gpiomask: 0x010f00, 1072 muxsel: {2, 3, 0, 0}, 1073 audiomux: {0x10000, 0, 0x10000, 0, 0, 0}, 1074 no_msp34xx: 1, 1075 pll: PLL_28, 1076 tuner_type: TUNER_SHARP_2U5JF5540_NTSC, 1077 audio_hook: gvbctv3pci_audio, 1078},{ 1079 1080/* ---- card 0x44 ---------------------------------- */ 1081 name: "3Dfx VoodooTV FM (Euro), VoodooTV 200 (USA)", 1082 // try "insmod msp3400 simple=0" if you have 1083 // sound problems with this card. 1084 video_inputs: 4, 1085 audio_inputs: 1, 1086 tuner: 0, 1087 svhs: -1, 1088 gpiomask: 0x4f8a00, 1089 // 0x100000: 1=MSP enabled (0=disable again) 1090 // 0x010000: Connected to "S0" on tda9880 (0=Pal/BG, 1=NTSC) 1091 audiomux: {0x947fff, 0x987fff,0x947fff,0x947fff, 0x947fff}, 1092 // tvtuner, radio, external,internal, mute, stereo 1093 /* tuner, Composit, SVid, Composit-on-Svid-adapter*/ 1094 muxsel: { 2, 3 ,0 ,1}, 1095 tuner_type: TUNER_MT2032, 1096 pll: PLL_28, 1097 has_radio: 1, 1098},{ 1099 /* Philip Blundell <pb@nexus.co.uk> */ 1100 name: "Active Imaging AIMMS", 1101 video_inputs: 1, 1102 audio_inputs: 0, 1103 tuner: -1, 1104 tuner_type: -1, 1105 pll: PLL_28, 1106 muxsel: { 2 }, 1107 gpiomask: 0 1108},{ 1109 /* Tomasz Pyra <hellfire@sedez.iq.pl> */ 1110 name: "Prolink Pixelview PV-BT878P+ (Rev.4C)", 1111 video_inputs: 3, 1112 audio_inputs: 4, 1113 tuner: 0, 1114 svhs: 2, 1115 gpiomask: 15, 1116 muxsel: { 2, 3, 1, 1}, 1117 audiomux: { 0, 0, 11, 7, 13, 0}, 1118 needs_tvaudio: 1, 1119 pll: PLL_28, 1120 tuner_type: 25, 1121},{ 1122 name: "Lifeview FlyVideo 98EZ (capture only) LR51", 1123 video_inputs: 4, 1124 audio_inputs: 0, 1125 tuner: -1, 1126 svhs: 2, 1127 muxsel: { 2, 3, 1, 1}, // AV1, AV2, SVHS, CVid adapter on SVHS 1128 pll: PLL_28, 1129 no_msp34xx: 1, 1130},{ 1131 1132/* ---- card 0x48 ---------------------------------- */ 1133 /* Dariusz Kowalewski <darekk@automex.pl> */ 1134 name: "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)", 1135 video_inputs: 3, 1136 audio_inputs: 1, 1137 tuner: 0, 1138 svhs: 2, 1139 gpiomask: 0x3f, 1140 muxsel: { 2, 3, 0, 1 }, 1141 audiomux: { 0x01, 0x00, 0x03, 0x03, 0x09, 0x02 }, 1142 needs_tvaudio: 1, 1143 no_msp34xx: 1, 1144 no_tda9875: 1, 1145 pll: PLL_28, 1146 tuner_type: -1, 1147 audio_hook: pvbt878p9b_audio, 1148 has_radio: 1, 1149},{ 1150 /* Clay Kunz <ckunz@mail.arc.nasa.gov> */ 1151 /* you must jumper JP5 for the card to work */ 1152 name: "Sensoray 311", 1153 video_inputs: 5, 1154 audio_inputs: 0, 1155 tuner: -1, 1156 svhs: 4, 1157 gpiomask: 0, 1158 muxsel: { 2, 3, 1, 0, 0}, 1159 audiomux: { 0 }, 1160 needs_tvaudio: 0, 1161 tuner_type: -1, 1162},{ 1163 /* Miguel Freitas <miguel@cetuc.puc-rio.br> */ 1164 name: "RemoteVision MX (RV605)", 1165 video_inputs: 16, 1166 audio_inputs: 0, 1167 tuner: -1, 1168 svhs: -1, 1169 gpiomask: 0x00, 1170 gpiomask2: 0x07ff, 1171 muxsel: { 0x33, 0x13, 0x23, 0x43, 0xf3, 0x73, 0xe3, 0x03, 1172 0xd3, 0xb3, 0xc3, 0x63, 0x93, 0x53, 0x83, 0xa3 }, 1173 no_msp34xx: 1, 1174 no_tda9875: 1, 1175 tuner_type: -1, 1176 muxsel_hook: rv605_muxsel, 1177},{ 1178 name: "Powercolor MTV878/ MTV878R/ MTV878F", 1179 video_inputs: 3, 1180 audio_inputs: 2, 1181 tuner: 0, 1182 svhs: 2, 1183 gpiomask: 0x1C800F, // Bit0-2: Audio select, 8-12:remote control 14:remote valid 15:remote reset 1184 muxsel: { 2, 1, 1, }, 1185 audiomux: { 0, 1, 2, 2, 4 }, 1186 needs_tvaudio: 0, 1187 tuner_type: TUNER_PHILIPS_PAL, 1188 pll: PLL_28, 1189 has_radio: 1, 1190},{ 1191 1192/* ---- card 0x4c ---------------------------------- */ 1193 /* Masaki Suzuki <masaki@btree.org> */ 1194 name: "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)", 1195 video_inputs: 3, 1196 audio_inputs: 1, 1197 tuner: 0, 1198 svhs: 2, 1199 gpiomask: 0x140007, 1200 muxsel: { 2, 3, 1, 1 }, 1201 audiomux: { 0, 1, 2, 3, 4, 0 }, 1202 tuner_type: TUNER_PHILIPS_NTSC, 1203 audio_hook: windvr_audio, 1204},{ 1205 name: "GrandTec Multi Capture Card (Bt878)", 1206 video_inputs: 4, 1207 audio_inputs: 0, 1208 tuner: -1, 1209 svhs: -1, 1210 gpiomask: 0, 1211 muxsel: { 2, 3, 1, 0 }, 1212 audiomux: { 0 }, 1213 needs_tvaudio: 0, 1214 no_msp34xx: 1, 1215 pll: PLL_28, 1216 tuner_type: -1, 1217},{ 1218 name: "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF", 1219 video_inputs: 4, 1220 audio_inputs: 3, 1221 tuner: 0, 1222 svhs: 2, 1223 gpiomask: 7, 1224 muxsel: { 2, 3, 1, 1 }, // Tuner, SVid, SVHS, SVid to SVHS connector 1225 audiomux: { 0 ,0 ,4, 4,4,4},// Yes, this tuner uses the same audio output for TV and FM radio! 1226 // This card lacks external Audio In, so we mute it on Ext. & Int. 1227 // The PCB can take a sbx1637/sbx1673, wiring unknown. 1228 // This card lacks PCI subsystem ID, sigh. 1229 // audiomux=1: lower volume, 2+3: mute 1230 // btwincap uses 0x80000/0x80003 1231 needs_tvaudio: 0, 1232 no_msp34xx: 1, 1233 pll: PLL_28, 1234 tuner_type: 5, // Samsung TCPA9095PC27A (BG+DK), philips compatible, w/FM, stereo and 1235 // radio signal strength indicators work fine. 1236 has_radio: 1, 1237 /* GPIO Info: 1238 GPIO0,1: HEF4052 A0,A1 1239 GPIO2: HEF4052 nENABLE 1240 GPIO3-7: n.c. 1241 GPIO8-13: IRDC357 data0,5 (data6 n.c. ?) [chip not present on my card] 1242 GPIO14,15: ?? 1243 GPIO16-21: n.c. 1244 GPIO22,23: ?? 1245 ?? : mtu8b56ep microcontroller for IR (GPIO wiring unknown)*/ 1246},{ 1247 /* Arthur Tetzlaff-Deas, DSP Design Ltd <software@dspdesign.com> */ 1248 name: "DSP Design TCVIDEO", 1249 video_inputs: 4, 1250 svhs: -1, 1251 muxsel: { 2, 3, 1, 0}, 1252 pll: PLL_28, 1253 tuner_type: -1, 1254},{ 1255 1256 /* ---- card 0x50 ---------------------------------- */ 1257 name: "Hauppauge WinTV PVR", 1258 video_inputs: 4, 1259 audio_inputs: 1, 1260 tuner: 0, 1261 svhs: 2, 1262 muxsel: { 2, 0, 1, 1}, 1263 needs_tvaudio: 1, 1264 pll: PLL_28, 1265 tuner_type: -1, 1266 1267 gpiomask: 7, 1268 audiomux: {7}, 1269}}; 1270 1271const int bttv_num_tvcards = (sizeof(bttv_tvcards)/sizeof(struct tvcard)); 1272 1273/* ----------------------------------------------------------------------- */ 1274 1275static unsigned char eeprom_data[256]; 1276 1277/* 1278 * identify card 1279 */ 1280void __devinit bttv_idcard(struct bttv *btv) 1281{ 1282 unsigned int gpiobits; 1283 int i,type; 1284 unsigned short tmp; 1285 1286 /* read PCI subsystem ID */ 1287 pci_read_config_word(btv->dev, PCI_SUBSYSTEM_ID, &tmp); 1288 btv->cardid = tmp << 16; 1289 pci_read_config_word(btv->dev, PCI_SUBSYSTEM_VENDOR_ID, &tmp); 1290 btv->cardid |= tmp; 1291 1292 if (0 != btv->cardid && 0xffffffff != btv->cardid) { 1293 /* look for the card */ 1294 for (type = -1, i = 0; cards[i].id != 0; i++) 1295 if (cards[i].id == btv->cardid) 1296 type = i; 1297 1298 if (type != -1) { 1299 /* found it */ 1300 printk(KERN_INFO "bttv%d: detected: %s [card=%d], " 1301 "PCI subsystem ID is %04x:%04x\n", 1302 btv->nr,cards[type].name,cards[type].cardnr, 1303 btv->cardid & 0xffff, btv->cardid >> 16); 1304 btv->type = cards[type].cardnr; 1305 } else { 1306 /* 404 */ 1307 printk(KERN_INFO "bttv%d: subsystem: %04x:%04x (UNKNOWN)\n", 1308 btv->nr, btv->cardid&0xffff, btv->cardid>>16); 1309 printk(KERN_DEBUG "please mail id, board name and " 1310 "the correct card= insmod option to kraxel@bytesex.org\n"); 1311 } 1312 } 1313 1314 /* let the user override the autodetected type */ 1315 if (card[btv->nr] >= 0 && card[btv->nr] < bttv_num_tvcards) 1316 btv->type=card[btv->nr]; 1317 1318 /* print which card config we are using */ 1319 sprintf(btv->video_dev.name,"BT%d%s(%.23s)", 1320 btv->id, 1321 (btv->id==848 && btv->revision==0x12) ? "A" : "", 1322 bttv_tvcards[btv->type].name); 1323 printk(KERN_INFO "bttv%d: using: %s [card=%d,%s]\n",btv->nr, 1324 btv->video_dev.name,btv->type, 1325 (card[btv->nr] >= 0 && card[btv->nr] < bttv_num_tvcards) ? 1326 "insmod option" : "autodetected"); 1327 1328 /* overwrite gpio stuff ?? */ 1329 if (-1 == audioall && -1 == audiomux[0]) 1330 return; 1331 1332 if (-1 != audiomux[0]) { 1333 gpiobits = 0; 1334 for (i = 0; i < 5; i++) { 1335 bttv_tvcards[btv->type].audiomux[i] = audiomux[i]; 1336 gpiobits |= audiomux[i]; 1337 } 1338 } else { 1339 gpiobits = audioall; 1340 for (i = 0; i < 5; i++) { 1341 bttv_tvcards[btv->type].audiomux[i] = audioall; 1342 } 1343 } 1344 bttv_tvcards[btv->type].gpiomask = (-1 != gpiomask) ? gpiomask : gpiobits; 1345 printk(KERN_INFO "bttv%d: gpio config override: mask=0x%x, mux=", 1346 btv->nr,bttv_tvcards[btv->type].gpiomask); 1347 for (i = 0; i < 5; i++) { 1348 printk("%s0x%x", i ? "," : "", bttv_tvcards[btv->type].audiomux[i]); 1349 } 1350 printk("\n"); 1351} 1352 1353/* 1354 * (most) board specific initialisations goes here 1355 */ 1356 1357static void flyvideo_gpio(struct bttv *btv) 1358{ 1359 int gpio,outbits,has_remote,has_radio,is_capture_only,is_lr90,has_tda9820_tda9821; 1360 int tuner=-1,ttype; 1361 1362 outbits = btread(BT848_GPIO_OUT_EN); 1363 btwrite(0x00, BT848_GPIO_OUT_EN); 1364 udelay(8); // without this we would see the 0x1800 mask 1365 gpio=btread(BT848_GPIO_DATA); 1366 btwrite(outbits, BT848_GPIO_OUT_EN); 1367 // all cards provide GPIO info, some have an additional eeprom 1368 // LR50: GPIO coding can be found lower right CP1 .. CP9 1369 // CP9=GPIO23 .. CP1=GPIO15; when OPEN, the corresponding GPIO reads 1. 1370 // GPIO14-12: n.c. 1371 // LR90: GP9=GPIO23 .. GP1=GPIO15 (right above the bt878) 1372 1373 // lowest 3 bytes are remote control codes (no handshake needed) 1374 // xxxFFF: No remote control chip soldered 1375 // xxxF00(LR26/LR50), xxxFE0(LR90): Remote control chip (LVA001 or CF45) soldered 1376 // Note: Some bits are Audio_Mask ! 1377 1378 ttype=(gpio&0x0f0000)>>16; 1379 switch(ttype) { 1380 case 0x0: tuner=4; // None 1381 break; 1382 case 0x2: tuner=39;// LG NTSC (newer TAPC series) TAPC-H701P 1383 break; 1384 case 0x4: tuner=5; // Philips PAL TPI8PSB02P, TPI8PSB12P, TPI8PSB12D or FI1216, FM1216 1385 break; 1386 case 0x6: tuner=37; // LG PAL (newer TAPC series) TAPC-G702P 1387 break; 1388 case 0xC: tuner=3; // Philips SECAM(+PAL) FQ1216ME or FI1216MF 1389 break; 1390 default: 1391 printk(KERN_INFO "bttv%d: FlyVideo_gpio: unknown tuner type.\n", btv->nr); 1392 } 1393 1394 has_remote = gpio & 0x800000; 1395 has_radio = gpio & 0x400000; 1396 // unknown 0x200000; 1397 // unknown2 0x100000; 1398 is_capture_only = !(gpio & 0x008000); //GPIO15 1399 has_tda9820_tda9821 = !(gpio & 0x004000); 1400 is_lr90 = !(gpio & 0x002000); // else LR26/LR50 (LR38/LR51 f. capture only) 1401 // gpio & 0x001000 // output bit for audio routing 1402 1403 printk(KERN_INFO "bttv%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n", 1404 btv->nr, has_radio? "yes":"no ", has_remote? "yes":"no ", tuner, gpio); 1405 printk(KERN_INFO "bttv%d: FlyVideo LR90=%s tda9821/tda9820=%s capture_only=%s\n", 1406 btv->nr, is_lr90?"yes":"no ", has_tda9820_tda9821?"yes":"no ", 1407 is_capture_only?"yes":"no "); 1408 1409 if(tuner!= -1) // only set if known tuner autodetected, else let insmod option through 1410 btv->tuner_type = tuner; 1411 btv->has_radio = has_radio; 1412 1413 // LR90 Audio Routing is done by 2 hef4052, so Audio_Mask has 4 bits: 0x001c80 1414 // LR26/LR50 only has 1 hef4052, Audio_Mask 0x000c00 1415 // Audio options: from tuner, from tda9821/tda9821(mono,stereo.sap), from tda9874, ext., mute 1416 if(has_tda9820_tda9821) btv->audio_hook = lt9415_audio; 1417 //todo: if(has_tda9874) btv->audio_hook = fv2000s_audio; 1418} 1419 1420int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1, 1421 14,2,17,1, 4,1,4,3, 1,2,16,1, 4,4,4,4 }; 1422int miro_fmtuner[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 1423 1,1,1,1, 1,1,1,0, 0,0,0,0, 0,0,0,0 }; 1424 1425static void miro_pinnacle_gpio(struct bttv *btv) 1426{ 1427 int id,msp; 1428 1429 id = ((btread(BT848_GPIO_DATA)>>10) & 31) -1; 1430 msp = bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx"); 1431 btv->tuner_type = miro_tunermap[id]; 1432 if (0 == (btread(BT848_GPIO_DATA) & 0x20)) { 1433 btv->has_radio = 1; 1434 if (!miro_fmtuner[id]) { 1435 btv->has_matchbox = 1; 1436 btv->mbox_we = (1<<6); 1437 btv->mbox_most = (1<<7); 1438 btv->mbox_clk = (1<<8); 1439 btv->mbox_data = (1<<9); 1440 btv->mbox_mask = (1<<6)|(1<<7)|(1<<8)|(1<<9); 1441 } 1442 } else { 1443 btv->has_radio = 0; 1444 } 1445 if (-1 != msp) { 1446 if (btv->type == BTTV_MIRO) 1447 btv->type = BTTV_MIROPRO; 1448 if (btv->type == BTTV_PINNACLE) 1449 btv->type = BTTV_PINNACLEPRO; 1450 } 1451 printk(KERN_INFO "bttv%d: miro: id=%d tuner=%d radio=%s stereo=%s\n", 1452 btv->nr, id+1, btv->tuner_type, 1453 !btv->has_radio ? "no" : 1454 (btv->has_matchbox ? "matchbox" : "fmtuner"), 1455 (-1 == msp) ? "no" : "yes"); 1456} 1457 1458/* initialization part one -- before registering i2c bus */ 1459void __devinit bttv_init_card1(struct bttv *btv) 1460{ 1461 switch (btv->type) { 1462 case BTTV_HAUPPAUGE: 1463 case BTTV_HAUPPAUGE878: 1464 boot_msp34xx(btv,5); 1465 break; 1466 case BTTV_VOODOOTV_FM: 1467 boot_msp34xx(btv,20); 1468 break; 1469 case BTTV_HAUPPAUGEPVR: 1470 pvr_boot(btv); 1471 break; 1472 } 1473} 1474 1475/* initialization part two -- after registering i2c bus */ 1476void __devinit bttv_init_card2(struct bttv *btv) 1477{ 1478 btv->tuner_type = -1; 1479 1480 switch (btv->type) { 1481 case BTTV_MIRO: 1482 case BTTV_MIROPRO: 1483 case BTTV_PINNACLE: 1484 case BTTV_PINNACLEPRO: 1485 /* miro/pinnacle */ 1486 miro_pinnacle_gpio(btv); 1487 break; 1488 case BTTV_FLYVIDEO_98: 1489 case BTTV_MAXI: 1490 case BTTV_LIFE_FLYKIT: 1491 case BTTV_FLYVIDEO: 1492 case BTTV_TYPHOON_TVIEW: 1493 case BTTV_CHRONOS_VS2: 1494 case BTTV_FLYVIDEO_98FM: 1495 case BTTV_FLYVIDEO2000: 1496 case BTTV_FLYVIDEO98EZ: 1497 case BTTV_CONFERENCETV: 1498 case BTTV_LIFETEC_9415: 1499 flyvideo_gpio(btv); 1500 break; 1501 case BTTV_HAUPPAUGE: 1502 case BTTV_HAUPPAUGE878: 1503 case BTTV_HAUPPAUGEPVR: 1504 /* pick up some config infos from the eeprom */ 1505 bttv_readee(btv,eeprom_data,0xa0); 1506 hauppauge_eeprom(btv); 1507 break; 1508 case BTTV_AVERMEDIA98: 1509 case BTTV_AVPHONE98: 1510 bttv_readee(btv,eeprom_data,0xa0); 1511 avermedia_eeprom(btv); 1512 break; 1513 case BTTV_PXC200: 1514 init_PXC200(btv); 1515 break; 1516 case BTTV_VHX: 1517 btv->has_radio = 1; 1518 btv->has_matchbox = 1; 1519 btv->mbox_we = 0x20; 1520 btv->mbox_most = 0; 1521 btv->mbox_clk = 0x08; 1522 btv->mbox_data = 0x10; 1523 btv->mbox_mask = 0x38; 1524 break; 1525 case BTTV_MAGICTVIEW061: 1526 if (btv->cardid == 0x4002144f) { 1527 btv->has_radio=1; 1528 printk("bttv%d: radio detected by subsystem id (CPH05x)\n",btv->nr); 1529 } 1530 break; 1531 } 1532 1533 /* pll configuration */ 1534 if (!(btv->id==848 && btv->revision==0x11)) { 1535 /* defaults from card list */ 1536 if (PLL_28 == bttv_tvcards[btv->type].pll) { 1537 btv->pll.pll_ifreq=28636363; 1538 btv->pll.pll_crystal=BT848_IFORM_XT0; 1539 } 1540 if (PLL_35 == bttv_tvcards[btv->type].pll) { 1541 btv->pll.pll_ifreq=35468950; 1542 btv->pll.pll_crystal=BT848_IFORM_XT1; 1543 } 1544 /* insmod options can override */ 1545 switch (pll[btv->nr]) { 1546 case 0: /* none */ 1547 btv->pll.pll_crystal = 0; 1548 btv->pll.pll_ifreq = 0; 1549 btv->pll.pll_ofreq = 0; 1550 break; 1551 case 1: /* 28 MHz */ 1552 case 28: 1553 btv->pll.pll_ifreq = 28636363; 1554 btv->pll.pll_ofreq = 0; 1555 btv->pll.pll_crystal = BT848_IFORM_XT0; 1556 break; 1557 case 2: /* 35 MHz */ 1558 case 35: 1559 btv->pll.pll_ifreq = 35468950; 1560 btv->pll.pll_ofreq = 0; 1561 btv->pll.pll_crystal = BT848_IFORM_XT1; 1562 break; 1563 } 1564 } 1565 1566 /* tuner configuration (from card list / autodetect / insmod option) */ 1567 if (-1 != bttv_tvcards[btv->type].tuner_type) 1568 if( -1 == btv->tuner_type) 1569 btv->tuner_type = bttv_tvcards[btv->type].tuner_type; 1570 if (-1 != tuner[btv->nr]) 1571 btv->tuner_type = tuner[btv->nr]; 1572 if (btv->tuner_type != -1) 1573 bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type); 1574 printk("bttv%d: using tuner=%d\n",btv->nr,btv->tuner_type); 1575 1576 if (bttv_tvcards[btv->type].has_radio) 1577 btv->has_radio=1; 1578 1579 if (bttv_tvcards[btv->type].audio_hook) 1580 btv->audio_hook=bttv_tvcards[btv->type].audio_hook; 1581 1582 /* try to detect audio/fader chips */ 1583 if (!bttv_tvcards[btv->type].no_msp34xx && 1584 bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx") >=0) { 1585 if (autoload) 1586 request_module("msp3400"); 1587 } 1588 1589 if (!bttv_tvcards[btv->type].no_tda9875 && 1590 bttv_I2CRead(btv, I2C_TDA9875, "TDA9875") >=0) { 1591 if (autoload) 1592 request_module("tda9875"); 1593 } 1594 1595 if (bttv_I2CRead(btv, I2C_TDA7432, "TDA7432") >=0) { 1596 if (autoload) 1597 request_module("tda7432"); 1598 } 1599 1600 if (bttv_tvcards[btv->type].needs_tvaudio) { 1601 if (autoload) 1602 request_module("tvaudio"); 1603 } 1604 1605 if (bttv_tvcards[btv->type].tuner != -1) { 1606 if (autoload) 1607 request_module("tuner"); 1608 } 1609} 1610 1611 1612/* ----------------------------------------------------------------------- */ 1613/* some hauppauge specific stuff */ 1614 1615static struct HAUPPAUGE_TUNER 1616{ 1617 int id; 1618 char *name; 1619} 1620hauppauge_tuner[] __devinitdata = 1621{ 1622 { TUNER_ABSENT, "" }, 1623 { TUNER_ABSENT, "External" }, 1624 { TUNER_ABSENT, "Unspecified" }, 1625 { TUNER_PHILIPS_PAL, "Philips FI1216" }, 1626 { TUNER_PHILIPS_SECAM, "Philips FI1216MF" }, 1627 { TUNER_PHILIPS_NTSC, "Philips FI1236" }, 1628 { TUNER_PHILIPS_PAL_I, "Philips FI1246" }, 1629 { TUNER_PHILIPS_PAL_DK,"Philips FI1256" }, 1630 { TUNER_PHILIPS_PAL, "Philips FI1216 MK2" }, 1631 { TUNER_PHILIPS_SECAM, "Philips FI1216MF MK2" }, 1632 { TUNER_PHILIPS_NTSC, "Philips FI1236 MK2" }, 1633 { TUNER_PHILIPS_PAL_I, "Philips FI1246 MK2" }, 1634 { TUNER_PHILIPS_PAL_DK,"Philips FI1256 MK2" }, 1635 { TUNER_TEMIC_NTSC, "Temic 4032FY5" }, 1636 { TUNER_TEMIC_PAL, "Temic 4002FH5" }, 1637 { TUNER_TEMIC_PAL_I, "Temic 4062FY5" }, 1638 { TUNER_PHILIPS_PAL, "Philips FR1216 MK2" }, 1639 { TUNER_PHILIPS_SECAM, "Philips FR1216MF MK2" }, 1640 { TUNER_PHILIPS_NTSC, "Philips FR1236 MK2" }, 1641 { TUNER_PHILIPS_PAL_I, "Philips FR1246 MK2" }, 1642 { TUNER_PHILIPS_PAL_DK,"Philips FR1256 MK2" }, 1643 { TUNER_PHILIPS_PAL, "Philips FM1216" }, 1644 { TUNER_PHILIPS_SECAM, "Philips FM1216MF" }, 1645 { TUNER_PHILIPS_NTSC, "Philips FM1236" }, 1646 { TUNER_PHILIPS_PAL_I, "Philips FM1246" }, 1647 { TUNER_PHILIPS_PAL_DK,"Philips FM1256" }, 1648 { TUNER_TEMIC_4036FY5_NTSC, "Temic 4036FY5" }, 1649 { TUNER_ABSENT, "Samsung TCPN9082D" }, 1650 { TUNER_ABSENT, "Samsung TCPM9092P" }, 1651 { TUNER_TEMIC_4006FH5_PAL, "Temic 4006FH5" }, 1652 { TUNER_ABSENT, "Samsung TCPN9085D" }, 1653 { TUNER_ABSENT, "Samsung TCPB9085P" }, 1654 { TUNER_ABSENT, "Samsung TCPL9091P" }, 1655 { TUNER_TEMIC_4039FR5_NTSC, "Temic 4039FR5" }, 1656 { TUNER_PHILIPS_FQ1216ME, "Philips FQ1216 ME" }, 1657 { TUNER_TEMIC_4066FY5_PAL_I, "Temic 4066FY5" }, 1658 { TUNER_ABSENT, "Philips TD1536" }, 1659 { TUNER_ABSENT, "Philips TD1536D" }, 1660 { TUNER_PHILIPS_NTSC, "Philips FMR1236" }, /* mono radio */ 1661 { TUNER_ABSENT, "Philips FI1256MP" }, 1662 { TUNER_ABSENT, "Samsung TCPQ9091P" }, 1663 { TUNER_TEMIC_4006FN5_MULTI_PAL, "Temic 4006FN5" }, 1664 { TUNER_TEMIC_4009FR5_PAL, "Temic 4009FR5" }, 1665 { TUNER_TEMIC_4046FM5, "Temic 4046FM5" }, 1666 { TUNER_TEMIC_4009FN5_MULTI_PAL_FM, "Temic 4009FN5" }, 1667 { TUNER_ABSENT, "Philips TD1536D_FH_44"}, 1668 { TUNER_LG_NTSC_FM, "LG TP18NSR01F"}, 1669 { TUNER_LG_PAL_FM, "LG TP18PSB01D"}, 1670 { TUNER_LG_PAL, "LG TP18PSB11D"}, 1671 { TUNER_LG_PAL_I_FM, "LG TAPC-I001D"}, 1672 { TUNER_LG_PAL_I, "LG TAPC-I701D"} 1673}; 1674 1675static void __devinit hauppauge_eeprom(struct bttv *btv) 1676{ 1677 int blk2,tuner,radio,model; 1678 1679 if (eeprom_data[0] != 0x84 || eeprom_data[2] != 0) 1680 printk(KERN_WARNING "bttv%d: Hauppauge eeprom: invalid\n", 1681 btv->nr); 1682 1683 /* Block 2 starts after len+3 bytes header */ 1684 blk2 = eeprom_data[1] + 3; 1685 1686 /* decode + use some config infos */ 1687 model = eeprom_data[12] << 8 | eeprom_data[11]; 1688 tuner = eeprom_data[9]; 1689 radio = eeprom_data[blk2-1] & 0x01; 1690 1691 if (tuner < sizeof(hauppauge_tuner)/sizeof(struct HAUPPAUGE_TUNER)) 1692 btv->tuner_type = hauppauge_tuner[tuner].id; 1693 if (radio) 1694 btv->has_radio = 1; 1695 1696 if (bttv_verbose) 1697 printk(KERN_INFO "bttv%d: Hauppauge eeprom: model=%d, " 1698 "tuner=%s (%d), radio=%s\n", 1699 btv->nr, model, hauppauge_tuner[tuner].name, 1700 btv->tuner_type, radio ? "yes" : "no"); 1701} 1702 1703/* ----------------------------------------------------------------------- */ 1704 1705/* 1706 * minimal bootstrap for the WinTV/PVR -- upload altera firmware. 1707 * 1708 * The hcwamc.rbf firmware file is on the Hauppauge driver CD. Have 1709 * a look at Pvr/pvr45xxx.EXE (self-extracting zip archive, can be 1710 * unpacked with unzip). 1711 */ 1712static char *firm_altera = "/usr/lib/video4linux/hcwamc.rbf"; 1713MODULE_PARM(firm_altera,"s"); 1714MODULE_PARM_DESC(firm_altera,"WinTV/PVR firmware " 1715 "(driver CD => unzip pvr45xxx.exe => hcwamc.rbf)"); 1716 1717/* drivers/sound/sound_firmware.c => soundcore.o */ 1718extern int mod_firmware_load(const char *fn, char **fp); 1719 1720#define PVR_GPIO_DELAY 10 1721 1722#define BTTV_ALT_DATA 0x000001 1723#define BTTV_ALT_DCLK 0x100000 1724#define BTTV_ALT_NCONFIG 0x800000 1725 1726static int __devinit pvr_altera_load(struct bttv *btv, u8 *micro, u32 microlen) 1727{ 1728 u32 n; 1729 u8 bits; 1730 int i; 1731 1732 btwrite(BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG, 1733 BT848_GPIO_OUT_EN); 1734 btwrite(0,BT848_GPIO_DATA); 1735 udelay(PVR_GPIO_DELAY); 1736 1737 btwrite(BTTV_ALT_NCONFIG,BT848_GPIO_DATA); 1738 udelay(PVR_GPIO_DELAY); 1739 1740 for (n = 0; n < microlen; n++) { 1741 bits = micro[n]; 1742 for ( i = 0 ; i < 8 ; i++ ) { 1743 btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA); 1744 if (bits & 0x01) 1745 btor(BTTV_ALT_DATA,BT848_GPIO_DATA); 1746 else 1747 btand(~BTTV_ALT_DATA,BT848_GPIO_DATA); 1748 btor(BTTV_ALT_DCLK,BT848_GPIO_DATA); 1749 bits >>= 1; 1750 } 1751 } 1752 btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA); 1753 udelay(PVR_GPIO_DELAY); 1754 1755 /* begin Altera init loop (Not necessary,but doesn't hurt) */ 1756 for (i = 0 ; i < 30 ; i++) { 1757 btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA); 1758 btor(BTTV_ALT_DCLK,BT848_GPIO_DATA); 1759 } 1760 btand(~BTTV_ALT_DCLK,BT848_GPIO_DATA); 1761 return 0; 1762} 1763 1764int __devinit pvr_boot(struct bttv *btv) 1765{ 1766 u32 microlen; 1767 u8 *micro; 1768 int result; 1769 1770 microlen = mod_firmware_load(firm_altera, (char**) µ); 1771 if (!microlen) 1772 return -1; 1773 1774 printk(KERN_INFO "bttv%d: uploading altera firmware [%s] ...\n", 1775 btv->nr, firm_altera); 1776 result = pvr_altera_load(btv, micro, microlen); 1777 printk(KERN_INFO "bttv%d: ... upload %s\n", 1778 btv->nr, (result < 0) ? "failed" : "ok"); 1779 vfree(micro); 1780 return result; 1781} 1782 1783/* ----------------------------------------------------------------------- */ 1784/* AVermedia specific stuff, from bktr_card.c */ 1785 1786int tuner_0_table[] = { 1787 TUNER_PHILIPS_NTSC, TUNER_PHILIPS_PAL, 1788 TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL, 1789 TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL, 1790 TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM, 1791 TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL}; 1792 1793int tuner_1_table[] = { 1794 TUNER_TEMIC_NTSC, TUNER_TEMIC_PAL, 1795 TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, 1796 TUNER_TEMIC_PAL, TUNER_TEMIC_PAL, 1797 TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5, //TUNER_TEMIC_SECAM 1798 TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL}; 1799 1800static void __devinit avermedia_eeprom(struct bttv *btv) 1801{ 1802 int tuner_make,tuner_tv_fm,tuner_format,tuner=0,remote; 1803 1804 tuner_make = (eeprom_data[0x41] & 0x7); 1805 tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3; 1806 tuner_format = (eeprom_data[0x42] & 0xf0) >> 4; 1807 remote = (eeprom_data[0x42] & 0x01); 1808 1809 if (tuner_make == 0 || tuner_make == 2) 1810 if(tuner_format <=9) 1811 tuner = tuner_0_table[tuner_format]; 1812 if (tuner_make == 1) 1813 if(tuner_format <=9) 1814 tuner = tuner_1_table[tuner_format]; 1815 1816 printk(KERN_INFO "bttv%d: Avermedia eeprom[0x%02x%02x]: tuner=", 1817 btv->nr,eeprom_data[0x41],eeprom_data[0x42]); 1818 if(tuner) { 1819 btv->tuner_type=tuner; 1820 printk("%d",tuner); 1821 } else 1822 printk("Unknown type"); 1823 printk(" radio:%s remote control:%s\n", 1824 tuner_tv_fm?"yes":"no", 1825 remote?"yes":"no"); 1826} 1827 1828/* used on Voodoo TV/FM (Voodoo 200), S0 wired to 0x10000 */ 1829void bttv_tda9880_setnorm(struct bttv *btv, int norm) 1830{ 1831 // fix up our card entry 1832 if(norm==VIDEO_MODE_NTSC) { 1833 bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[0]=0x957fff; 1834 bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[4]=0x957fff; 1835 dprintk("bttv_tda9880_setnorm to NTSC\n"); 1836 } 1837 else { 1838 bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[0]=0x947fff; 1839 bttv_tvcards[BTTV_VOODOOTV_FM].audiomux[4]=0x947fff; 1840 dprintk("bttv_tda9880_setnorm to PAL\n"); 1841 } 1842 // set GPIO according 1843 btaor(bttv_tvcards[btv->type].audiomux[btv->audio], 1844 ~bttv_tvcards[btv->type].gpiomask, BT848_GPIO_DATA); 1845} 1846 1847 1848/* 1849 * reset/enable the MSP on some Hauppauge cards 1850 * Thanks to Ky�sti M�lkki (kmalkki@cc.hut.fi)! 1851 * 1852 * Hauppauge: pin 5 1853 * Voodoo: pin 20 1854 */ 1855static void __devinit boot_msp34xx(struct bttv *btv, int pin) 1856{ 1857 int mask = (1 << pin); 1858 1859 btaor(mask, ~mask, BT848_GPIO_OUT_EN); 1860 btaor(0, ~mask, BT848_GPIO_DATA); 1861 udelay(2500); 1862 btaor(mask, ~mask, BT848_GPIO_DATA); 1863 if (bttv_gpio) 1864 bttv_gpio_tracking(btv,"msp34xx"); 1865 1866 if (bttv_verbose) 1867 printk(KERN_INFO "bttv%d: Hauppauge/Voodoo msp34xx: reset line " 1868 "init [%d]\n", btv->nr, pin); 1869} 1870 1871 1872/* ----------------------------------------------------------------------- */ 1873/* Imagenation L-Model PXC200 Framegrabber */ 1874/* This is basically the same procedure as 1875 * used by Alessandro Rubini in his pxc200 1876 * driver, but using BTTV functions */ 1877 1878static void __devinit init_PXC200(struct bttv *btv) 1879{ 1880 static int vals[] __devinitdata = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d, 1881 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 1882 0x00 }; 1883 int i,tmp; 1884 1885 /* Initialise GPIO-connevted stuff */ 1886 btwrite(1<<13,BT848_GPIO_OUT_EN); /* Reset pin only */ 1887 btwrite(0,BT848_GPIO_DATA); 1888 udelay(3); 1889 btwrite(1<<13,BT848_GPIO_DATA); 1890 /* GPIO inputs are pulled up, so no need to drive 1891 * reset pin any longer */ 1892 btwrite(0,BT848_GPIO_OUT_EN); 1893 if (bttv_gpio) 1894 bttv_gpio_tracking(btv,"pxc200"); 1895 1896 /* we could/should try and reset/control the AD pots? but 1897 right now we simply turned off the crushing. Without 1898 this the AGC drifts drifts 1899 remember the EN is reverse logic --> 1900 setting BT848_ADC_AGC_EN disable the AGC 1901 tboult@eecs.lehigh.edu 1902 */ 1903 btwrite(BT848_ADC_RESERVED|BT848_ADC_AGC_EN, BT848_ADC); 1904 1905 /* Initialise MAX517 DAC */ 1906 printk(KERN_INFO "Setting DAC reference voltage level ...\n"); 1907 bttv_I2CWrite(btv,0x5E,0,0x80,1); 1908 1909 /* Initialise 12C508 PIC */ 1910 /* The I2CWrite and I2CRead commmands are actually to the 1911 * same chips - but the R/W bit is included in the address 1912 * argument so the numbers are different */ 1913 1914 printk(KERN_INFO "Initialising 12C508 PIC chip ...\n"); 1915 1916 for (i = 0; i < sizeof(vals)/sizeof(int); i++) { 1917 tmp=bttv_I2CWrite(btv,0x1E,vals[i],0,1); 1918 printk(KERN_INFO "I2C Write(0x08) = %i\nI2C Read () = %x\n\n", 1919 tmp,bttv_I2CRead(btv,0x1F,NULL)); 1920 } 1921 printk(KERN_INFO "PXC200 Initialised.\n"); 1922} 1923 1924/* ----------------------------------------------------------------------- */ 1925/* Miro Pro radio stuff -- the tea5757 is connected to some GPIO ports */ 1926/* 1927 * Copyright (c) 1999 Csaba Halasz <qgehali@uni-miskolc.hu> 1928 * This code is placed under the terms of the GNU General Public License 1929 * 1930 * Brutally hacked by Dan Sheridan <dan.sheridan@contact.org.uk> djs52 8/3/00 1931 */ 1932 1933 1934#define BUS_LOW(bit) btand(~(bit), BT848_GPIO_DATA) 1935#define BUS_HIGH(bit) btor((bit), BT848_GPIO_DATA) 1936#define BUS_IN(bit) (btread(BT848_GPIO_DATA) & (bit)) 1937 1938/* TEA5757 register bits */ 1939#define TEA_FREQ 0:14 1940#define TEA_BUFFER 15:15 1941 1942#define TEA_SIGNAL_STRENGTH 16:17 1943 1944#define TEA_PORT1 18:18 1945#define TEA_PORT0 19:19 1946 1947#define TEA_BAND 20:21 1948#define TEA_BAND_FM 0 1949#define TEA_BAND_MW 1 1950#define TEA_BAND_LW 2 1951#define TEA_BAND_SW 3 1952 1953#define TEA_MONO 22:22 1954#define TEA_ALLOW_STEREO 0 1955#define TEA_FORCE_MONO 1 1956 1957#define TEA_SEARCH_DIRECTION 23:23 1958#define TEA_SEARCH_DOWN 0 1959#define TEA_SEARCH_UP 1 1960 1961#define TEA_STATUS 24:24 1962#define TEA_STATUS_TUNED 0 1963#define TEA_STATUS_SEARCHING 1 1964 1965/* Low-level stuff */ 1966static int tea5757_read(struct bttv *btv) 1967{ 1968 int value = 0; 1969 long timeout; 1970 int i; 1971 1972 /* better safe than sorry */ 1973 btaor((btv->mbox_clk | btv->mbox_we), 1974 ~btv->mbox_mask, BT848_GPIO_OUT_EN); 1975 if (bttv_gpio) 1976 bttv_gpio_tracking(btv,"tea5757 read"); 1977 1978 BUS_LOW(btv->mbox_we); 1979 BUS_LOW(btv->mbox_clk); 1980 1981 udelay(10); 1982 for(timeout = jiffies + 10 * HZ; 1983 BUS_IN(btv->mbox_data) && time_before(jiffies, timeout); 1984 schedule()); /* 10 s */ 1985 if (BUS_IN(btv->mbox_data)) { 1986 printk(KERN_WARNING "bttv%d: tea5757: read timeout\n",btv->nr); 1987 return -1; 1988 } 1989 for(timeout = jiffies + HZ/5; 1990 BUS_IN(btv->mbox_data) == 1 && time_before(jiffies, timeout); 1991 schedule()); /* 0.2 s */ 1992 dprintk("bttv%d: tea5757:",btv->nr); 1993 for(i = 0; i < 24; i++) 1994 { 1995 udelay(5); 1996 BUS_HIGH(btv->mbox_clk); 1997 udelay(5); 1998 dprintk("%c",(BUS_IN(btv->mbox_most) == 0)?'T':'-'); 1999 BUS_LOW(btv->mbox_clk); 2000 value <<= 1; 2001 value |= (BUS_IN(btv->mbox_data) == 0)?0:1; /* MSB first */ 2002 dprintk("%c", (BUS_IN(btv->mbox_most) == 0)?'S':'M'); 2003 } 2004 dprintk("\nbttv%d: tea5757: read 0x%X\n", btv->nr, value); 2005 return value; 2006} 2007 2008static int tea5757_write(struct bttv *btv, int value) 2009{ 2010 int i; 2011 int reg = value; 2012 2013 btaor(btv->mbox_clk | btv->mbox_we | btv->mbox_data, 2014 ~btv->mbox_mask, BT848_GPIO_OUT_EN); 2015 if (bttv_gpio) 2016 bttv_gpio_tracking(btv,"tea5757 write"); 2017 dprintk("bttv%d: tea5757: write 0x%X\n", btv->nr, value); 2018 BUS_LOW(btv->mbox_clk); 2019 BUS_HIGH(btv->mbox_we); 2020 for(i = 0; i < 25; i++) 2021 { 2022 if (reg & 0x1000000) 2023 BUS_HIGH(btv->mbox_data); 2024 else 2025 BUS_LOW(btv->mbox_data); 2026 reg <<= 1; 2027 BUS_HIGH(btv->mbox_clk); 2028 udelay(10); 2029 BUS_LOW(btv->mbox_clk); 2030 udelay(10); 2031 } 2032 BUS_LOW(btv->mbox_we); /* unmute !!! */ 2033 return 0; 2034} 2035 2036void tea5757_set_freq(struct bttv *btv, unsigned short freq) 2037{ 2038 tea5757_write(btv, 5 * freq + 0x358); /* add 10.7MHz (see docs) */ 2039 if (bttv_debug) 2040 tea5757_read(btv); 2041} 2042 2043 2044/* ----------------------------------------------------------------------- */ 2045/* winview */ 2046 2047void winview_audio(struct bttv *btv, struct video_audio *v, int set) 2048{ 2049 /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */ 2050 int bits_out, loops, vol, data; 2051 2052 if (!set) { 2053 /* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */ 2054 v->flags |= VIDEO_AUDIO_VOLUME; 2055 return; 2056 } 2057 2058 /* 32 levels logarithmic */ 2059 vol = 32 - ((v->volume>>11)); 2060 /* units */ 2061 bits_out = (PT2254_DBS_IN_2>>(vol%5)); 2062 /* tens */ 2063 bits_out |= (PT2254_DBS_IN_10>>(vol/5)); 2064 bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL; 2065 data = btread(BT848_GPIO_DATA); 2066 data &= ~(WINVIEW_PT2254_CLK| WINVIEW_PT2254_DATA| 2067 WINVIEW_PT2254_STROBE); 2068 for (loops = 17; loops >= 0 ; loops--) { 2069 if (bits_out & (1<<loops)) 2070 data |= WINVIEW_PT2254_DATA; 2071 else 2072 data &= ~WINVIEW_PT2254_DATA; 2073 btwrite(data, BT848_GPIO_DATA); 2074 udelay(5); 2075 data |= WINVIEW_PT2254_CLK; 2076 btwrite(data, BT848_GPIO_DATA); 2077 udelay(5); 2078 data &= ~WINVIEW_PT2254_CLK; 2079 btwrite(data, BT848_GPIO_DATA); 2080 } 2081 data |= WINVIEW_PT2254_STROBE; 2082 data &= ~WINVIEW_PT2254_DATA; 2083 btwrite(data, BT848_GPIO_DATA); 2084 udelay(10); 2085 data &= ~WINVIEW_PT2254_STROBE; 2086 btwrite(data, BT848_GPIO_DATA); 2087} 2088 2089/* ----------------------------------------------------------------------- */ 2090/* mono/stereo control for various cards (which don't use i2c chips but */ 2091/* connect something to the GPIO pins */ 2092 2093static void 2094gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set) 2095{ 2096 unsigned int con = 0; 2097 2098 if (set) { 2099 btor(0x300, BT848_GPIO_OUT_EN); 2100 if (v->mode & VIDEO_SOUND_LANG1) 2101 con = 0x000; 2102 if (v->mode & VIDEO_SOUND_LANG2) 2103 con = 0x300; 2104 if (v->mode & VIDEO_SOUND_STEREO) 2105 con = 0x200; 2106// if (v->mode & VIDEO_SOUND_MONO) 2107// con = 0x100; 2108 btaor(con, ~0x300, BT848_GPIO_DATA); 2109 } else { 2110 v->mode = VIDEO_SOUND_STEREO | 2111 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2112 } 2113} 2114 2115/* 2116 * Mario Medina Nussbaum <medisoft@alohabbs.org.mx> 2117 * I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo, 2118 * 0xdde enables mono and 0xccd enables sap 2119 * 2120 * Petr Vandrovec <VANDROVE@vc.cvut.cz> 2121 * P.S.: At least mask in line above is wrong - GPIO pins 3,2 select 2122 * input/output sound connection, so both must be set for output mode. 2123 * 2124 * Looks like it's needed only for the "tvphone", the "tvphone 98" 2125 * handles this with a tda9840 2126 * 2127 */ 2128static void 2129avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, int set) 2130{ 2131 int val = 0; 2132 2133 if (set) { 2134 if (v->mode & VIDEO_SOUND_LANG1) /* SAP */ 2135 val = 0x02; 2136 if (v->mode & VIDEO_SOUND_STEREO) 2137 val = 0x01; 2138 if (val) { 2139 btaor(val, ~0x03, BT848_GPIO_DATA); 2140 if (bttv_gpio) 2141 bttv_gpio_tracking(btv,"avermedia"); 2142 } 2143 } else { 2144 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2145 VIDEO_SOUND_LANG1; 2146 return; 2147 } 2148} 2149 2150/* Lifetec 9415 handling */ 2151static void 2152lt9415_audio(struct bttv *btv, struct video_audio *v, int set) 2153{ 2154 int val = 0; 2155 2156 if (btread(BT848_GPIO_DATA) & 0x4000) { 2157 v->mode = VIDEO_SOUND_MONO; 2158 return; 2159 } 2160 2161 if (set) { 2162 if (v->mode & VIDEO_SOUND_LANG2) /* A2 SAP */ 2163 val = 0x0080; 2164 if (v->mode & VIDEO_SOUND_STEREO) /* A2 stereo */ 2165 val = 0x0880; 2166 if ((v->mode & VIDEO_SOUND_LANG1) || 2167 (v->mode & VIDEO_SOUND_MONO)) 2168 val = 0; 2169 btaor(val, ~0x0880, BT848_GPIO_DATA); 2170 if (bttv_gpio) 2171 bttv_gpio_tracking(btv,"lt9415"); 2172 } else { 2173 /* autodetect doesn't work with this card :-( */ 2174 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2175 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2176 return; 2177 } 2178} 2179 2180 2181static void 2182terratv_audio(struct bttv *btv, struct video_audio *v, int set) 2183{ 2184 unsigned int con = 0; 2185 2186 if (set) { 2187 btor(0x180000, BT848_GPIO_OUT_EN); 2188 if (v->mode & VIDEO_SOUND_LANG2) 2189 con = 0x080000; 2190 if (v->mode & VIDEO_SOUND_STEREO) 2191 con = 0x180000; 2192 btaor(con, ~0x180000, BT848_GPIO_DATA); 2193 if (bttv_gpio) 2194 bttv_gpio_tracking(btv,"terratv"); 2195 } else { 2196 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2197 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2198 } 2199} 2200 2201static void 2202winfast2000_audio(struct bttv *btv, struct video_audio *v, int set) 2203{ 2204 unsigned long val = 0; 2205 2206 if (set) { 2207 /*btor (0xc32000, BT848_GPIO_OUT_EN);*/ 2208 if (v->mode & VIDEO_SOUND_MONO) /* Mono */ 2209 val = 0x420000; 2210 if (v->mode & VIDEO_SOUND_LANG1) /* Mono */ 2211 val = 0x420000; 2212 if (v->mode & VIDEO_SOUND_LANG2) /* SAP */ 2213 val = 0x410000; 2214 if (v->mode & VIDEO_SOUND_STEREO) /* Stereo */ 2215 val = 0x020000; 2216 if (val) { 2217 btaor(val, ~0x430000, BT848_GPIO_DATA); 2218 if (bttv_gpio) 2219 bttv_gpio_tracking(btv,"winfast2000"); 2220 } 2221 } else { 2222 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2223 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2224 } 2225} 2226 2227/* 2228 * Dariusz Kowalewski <darekk@automex.pl> 2229 * sound control for Prolink PV-BT878P+9B (PixelView PlayTV Pro FM+NICAM 2230 * revision 9B has on-board TDA9874A sound decoder). 2231 */ 2232static void 2233pvbt878p9b_audio(struct bttv *btv, struct video_audio *v, int set) 2234{ 2235 unsigned int val = 0; 2236 2237#if BTTV_VERSION_CODE > KERNEL_VERSION(0,8,0) 2238 if (btv->radio_user) 2239 return; 2240#else 2241 if (btv->radio) 2242 return; 2243#endif 2244 2245 if (set) { 2246 if (v->mode & VIDEO_SOUND_MONO) { 2247 val = 0x01; 2248 } 2249 if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2)) 2250 || (v->mode & VIDEO_SOUND_STEREO)) { 2251 val = 0x02; 2252 } 2253 if (val) { 2254 btaor(val, ~0x03, BT848_GPIO_DATA); 2255 if (bttv_gpio) 2256 bttv_gpio_tracking(btv,"pvbt878p9b"); 2257 } 2258 } else { 2259 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2260 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2261 } 2262} 2263 2264/* 2265 * Dariusz Kowalewski <darekk@automex.pl> 2266 * sound control for FlyVideo 2000S (with tda9874 decoder) 2267 * based on pvbt878p9b_audio() - this is not tested, please fix!!! 2268 */ 2269static void 2270fv2000s_audio(struct bttv *btv, struct video_audio *v, int set) 2271{ 2272 unsigned int val = 0xffff; 2273 2274#if BTTV_VERSION_CODE > KERNEL_VERSION(0,8,0) 2275 if (btv->radio_user) 2276 return; 2277#else 2278 if (btv->radio) 2279 return; 2280#endif 2281 if (set) { 2282 if (v->mode & VIDEO_SOUND_MONO) { 2283 val = 0x0000; 2284 } 2285 if ((v->mode & (VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2)) 2286 || (v->mode & VIDEO_SOUND_STEREO)) { 2287 val = 0x1080; //-dk-???: 0x0880, 0x0080, 0x1800 ... 2288 } 2289 if (val != 0xffff) { 2290 btaor(val, ~0x1800, BT848_GPIO_DATA); 2291 if (bttv_gpio) 2292 bttv_gpio_tracking(btv,"fv2000s"); 2293 } 2294 } else { 2295 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2296 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2297 } 2298} 2299 2300/* 2301 * sound control for Canopus WinDVR PCI 2302 * Masaki Suzuki <masaki@btree.org> 2303 */ 2304static void 2305windvr_audio(struct bttv *btv, struct video_audio *v, int set) 2306{ 2307 unsigned long val = 0; 2308 2309 if (set) { 2310 if (v->mode & VIDEO_SOUND_MONO) 2311 val = 0x040000; 2312 if (v->mode & VIDEO_SOUND_LANG1) 2313 val = 0; 2314 if (v->mode & VIDEO_SOUND_LANG2) 2315 val = 0x100000; 2316 if (v->mode & VIDEO_SOUND_STEREO) 2317 val = 0; 2318 if (val) { 2319 btaor(val, ~0x140000, BT848_GPIO_DATA); 2320 if (bttv_gpio) 2321 bttv_gpio_tracking(btv,"windvr"); 2322 } 2323 } else { 2324 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO | 2325 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2; 2326 } 2327} 2328 2329/* RemoteVision MX (rv605) muxsel helper [Miguel Freitas] 2330 * 2331 * This is needed because rv605 don't use a normal multiplex, but a crosspoint 2332 * switch instead (CD22M3494E). This IC can have multiple active connections 2333 * between Xn (input) and Yn (output) pins. We need to clear any existing 2334 * connection prior to establish a new one, pulsing the STROBE pin. 2335 * 2336 * The board hardwire Y0 (xpoint) to MUX1 and MUXOUT to Yin. 2337 * GPIO pins are wired as: 2338 * GPIO[0:3] - AX[0:3] (xpoint) - P1[0:3] (microcontroler) 2339 * GPIO[4:6] - AY[0:2] (xpoint) - P1[4:6] (microcontroler) 2340 * GPIO[7] - DATA (xpoint) - P1[7] (microcontroler) 2341 * GPIO[8] - - P3[5] (microcontroler) 2342 * GPIO[9] - RESET (xpoint) - P3[6] (microcontroler) 2343 * GPIO[10] - STROBE (xpoint) - P3[7] (microcontroler) 2344 * GPINTR - - P3[4] (microcontroler) 2345 * 2346 * The microcontroler is a 80C32 like. It should be possible to change xpoint 2347 * configuration either directly (as we are doing) or using the microcontroler 2348 * which is also wired to I2C interface. I have no further info on the 2349 * microcontroler features, one would need to disassembly the firmware. 2350 * note: the vendor refused to give any information on this product, all 2351 * that stuff was found using a multimeter! :) 2352 */ 2353static void rv605_muxsel(struct bttv *btv, unsigned int input) 2354{ 2355 /* reset all conections */ 2356 btaor(0x200,~0x200, BT848_GPIO_DATA); 2357 mdelay(1); 2358 btaor(0x000,~0x200, BT848_GPIO_DATA); 2359 mdelay(1); 2360 2361 /* create a new conection */ 2362 btaor(0x080,~0x480, BT848_GPIO_DATA); 2363 btaor(0x480,~0x480, BT848_GPIO_DATA); 2364 mdelay(1); 2365 btaor(0x080,~0x480, BT848_GPIO_DATA); 2366 mdelay(1); 2367} 2368 2369 2370/* ----------------------------------------------------------------------- */ 2371/* motherboard chipset specific stuff */ 2372 2373void __devinit bttv_check_chipset(void) 2374{ 2375 int pcipci_fail = 0; 2376 struct pci_dev *dev = NULL; 2377 2378 /* for 2.4.x we'll use the pci quirks (drivers/pci/quirks.c) */ 2379 if (pci_pci_problems & PCIPCI_FAIL) 2380 pcipci_fail = 1; 2381 if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF)) 2382 triton1 = 1; 2383 if (pci_pci_problems & PCIPCI_VSFX) 2384 vsfx = 1; 2385 2386 /* print which chipset we have */ 2387 while ((dev = pci_find_class(PCI_CLASS_BRIDGE_HOST << 8,dev))) 2388 printk(KERN_INFO "bttv: Host bridge is %s\n",dev->name); 2389 2390 /* print warnings about any quirks found */ 2391 if (triton1) 2392 printk(KERN_INFO "bttv: Host bridge needs ETBF enabled.\n"); 2393 if (vsfx) 2394 printk(KERN_INFO "bttv: Host bridge needs VSFX enabled.\n"); 2395 2396 if (pcipci_fail) { 2397 printk(KERN_WARNING "bttv: BT848 and your chipset may not work together.\n"); 2398 if (-1 == no_overlay) { 2399 printk(KERN_WARNING "bttv: going to disable overlay.\n"); 2400 no_overlay = 1; 2401 } 2402 } 2403 2404 while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, 2405 PCI_DEVICE_ID_INTEL_82441, dev))) { 2406 unsigned char b; 2407 pci_read_config_byte(dev, 0x53, &b); 2408 if (bttv_debug) 2409 printk(KERN_INFO "bttv: Host bridge: 82441FX Natoma, " 2410 "bufcon=0x%02x\n",b); 2411 } 2412 2413} 2414 2415int __devinit bttv_handle_chipset(struct bttv *btv) 2416{ 2417 unsigned char command; 2418 2419 if (!triton1 && !vsfx) 2420 return 0; 2421 2422 if (bttv_verbose) { 2423 if (triton1) 2424 printk("bttv%d: enabling ETBF (430FX/VP3 compatibilty)\n",btv->nr); 2425 if (vsfx && btv->id >= 878) 2426 printk("bttv%d: enabling VSFX\n",btv->nr); 2427 } 2428 2429 if (btv->id < 878) { 2430 /* bt848 (mis)uses a bit in the irq mask for etbf */ 2431 if (triton1) 2432 btv->triton1 = BT848_INT_ETBF; 2433 } else { 2434 /* bt878 has a bit in the pci config space for it */ 2435 pci_read_config_byte(btv->dev, BT878_DEVCTRL, &command); 2436 if (triton1) 2437 command |= BT878_EN_TBFX; 2438 if (vsfx) 2439 command |= BT878_EN_VSFX; 2440 pci_write_config_byte(btv->dev, BT878_DEVCTRL, command); 2441 } 2442 return 0; 2443} 2444 2445 2446/* 2447 * Local variables: 2448 * c-basic-offset: 8 2449 * End: 2450 */ 2451