File: /usr/src/linux/drivers/media/video/bttv-cards.c
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 */
42 static void hauppauge_eeprom(struct bttv *btv);
43 static void init_PXC200(struct bttv *btv);
44 #if 0
45 static void init_tea5757(struct bttv *btv);
46 #endif
47
48 static void winview_audio(struct bttv *btv, struct video_audio *v, int set);
49 static void lt9415_audio(struct bttv *btv, struct video_audio *v, int set);
50 static void avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v,
51 int set);
52 static void terratv_audio(struct bttv *btv, struct video_audio *v, int set);
53 static void gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set);
54 static void winfast2000_audio(struct bttv *btv, struct video_audio *v, int set);
55
56 /* config variables */
57 static int triton1=0;
58 static int vsfx=0;
59 int no_overlay=-1;
60 static unsigned int card[4] = { -1, -1, -1, -1 };
61 static unsigned int pll[4] = { -1, -1, -1, -1 };
62 static unsigned int tuner[4] = { -1, -1, -1, -1 };
63 #ifdef MODULE
64 static unsigned int autoload = 1;
65 #else
66 static unsigned int autoload = 0;
67 #endif
68 static unsigned int gpiomask = -1;
69 static unsigned int audioall = -1;
70 static unsigned int audiomux[5] = { -1, -1, -1, -1, -1 };
71
72 /* insmod options */
73 MODULE_PARM(triton1,"i");
74 MODULE_PARM(no_overlay,"i");
75 MODULE_PARM(card,"1-4i");
76 MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list");
77 MODULE_PARM(pll,"1-4i");
78 MODULE_PARM_DESC(pll,"specify installed crystal (0=none, 28=28 MHz, 35=35 MHz)");
79 MODULE_PARM(tuner,"1-4i");
80 MODULE_PARM_DESC(tuner,"specify installed tuner type");
81 MODULE_PARM(autoload,"i");
82 MODULE_PARM_DESC(autoload,"automatically load i2c modules like tuner.o, default is 1 (yes)");
83 MODULE_PARM(gpiomask,"i");
84 MODULE_PARM(audioall,"i");
85 MODULE_PARM(audiomux,"1-5i");
86
87 /* kernel args */
88 #ifndef MODULE
89 static int __init p_card(char *str) { return bttv_parse(str,BTTV_MAX,card); }
90 static int __init p_pll(char *str) { return bttv_parse(str,BTTV_MAX,pll); }
91 static int __init p_tuner(char *str) { return bttv_parse(str,BTTV_MAX,tuner); }
92 __setup("bttv.card=", p_card);
93 __setup("bttv.pll=", p_pll);
94 __setup("bttv.tuner=", p_tuner);
95
96 int __init bttv_parse(char *str, int max, int *vals)
97 {
98 int i,number,res = 2;
99
100 for (i = 0; res == 2 && i < max; i++) {
101 res = get_option(&str,&number);
102 if (res)
103 vals[i] = number;
104 }
105 return 1;
106 }
107 #endif
108
109 /* ----------------------------------------------------------------------- */
110 /* list of card IDs for bt878+ cards */
111
112 static struct CARD {
113 unsigned id;
114 int cardnr;
115 char *name;
116 } cards[] __devinitdata = {
117 { 0x13eb0070, BTTV_HAUPPAUGE878, "Hauppauge WinTV" },
118 { 0x39000070, BTTV_HAUPPAUGE878, "Hauppauge WinTV-D" },
119 { 0x45000070, BTTV_HAUPPAUGE878, "Hauppauge WinTV/PVR" },
120 { 0xff000070, BTTV_HAUPPAUGE878, "Osprey-100" },
121 { 0xff010070, BTTV_HAUPPAUGE878, "Osprey-200" },
122
123 { 0x00011002, BTTV_ATI_TVWONDER, "ATI TV Wonder" },
124 { 0x00031002, BTTV_ATI_TVWONDERVE,"ATI TV Wonder/VE" },
125
126 { 0x6606107d, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" },
127 { 0x263610b4, BTTV_STB2, "STB TV PCI FM, P/N 6000704" },
128 { 0x402010fc, BTTV_GVBCTV3PCI, "I-O Data Co. GV-BCV3/PCI" },
129 { 0x405010fc, BTTV_GVBCTV3PCI, "I-O Data Co. GV-BCV4/PCI" },
130 { 0x001211bd, BTTV_PINNACLE, "Pinnacle PCTV" },
131 { 0x3000121a, 0/* no entry yet */,"VoodooTV 200" },
132
133 { 0x3000144f, BTTV_MAGICTVIEW063, "TView 99 (CPH063)" },
134 { 0x3002144f, BTTV_MAGICTVIEW061, "Askey Magic TView" },
135
136 { 0x00011461, BTTV_AVPHONE98, "AVerMedia TVPhone98" },
137 { 0x00021461, BTTV_AVERMEDIA98, "AVermedia TVCapture 98" },
138 { 0x00031461, BTTV_AVPHONE98, "AVerMedia TVPhone98" },
139 { 0x00041461, BTTV_AVERMEDIA98, "AVerMedia TVCapture 98" },
140
141 { 0x300014ff, BTTV_MAGICTVIEW061, "TView 99 (CPH061)" },
142 { 0x300214ff, BTTV_PHOEBE_TVMAS, "Phoebe TV Master" },
143
144 { 0x1117153b, BTTV_TERRATVALUE, "Terratec TValue" },
145 { 0x1118153b, BTTV_TERRATVALUE, "Terratec TValue" },
146 { 0x1119153b, BTTV_TERRATVALUE, "Terratec TValue" },
147 { 0x111a153b, BTTV_TERRATVALUE, "Terratec TValue" },
148 { 0x1123153b, BTTV_TERRATVRADIO, "Terratec TV Radio+" },
149 { 0x1127153b, BTTV_TERRATV, "Terratec TV+" },
150 { 0x1134153b, BTTV_TERRATVALUE, "Terratec TValue" },
151 { 0x1135153b, BTTV_TERRATVALUER, "Terratec TValue Radio" },
152
153 { 0x400a15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
154 { 0x400d15b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
155 { 0x401015b0, BTTV_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
156
157 { 0x010115cb, BTTV_GMV1, "AG GMV1" },
158 { 0x010114c7, 16 /* FIXME */, "Modular Technology PCTV" },
159 { 0x18501851, BTTV_CHRONOS_VS2, "Chronos Video Shuttle II" },
160 { 0x18511851, 0 /* FIXME */, "CyberMail AV" },
161 { 0x18521852, BTTV_TYPHOON_TVIEW, "Typhoon TView TV/FM Tuner" },
162 { 0x10b42636, BTTV_HAUPPAUGE878, "STB ???" },
163 { 0x217d6606, BTTV_WINFAST2000, "Leadtek WinFast TV 2000" },
164 { 0x1200bd11, BTTV_PINNACLE, "Pinnacle PCTV" },
165
166 { 0, -1, NULL }
167 };
168
169 /* ----------------------------------------------------------------------- */
170 /* array with description for bt848 / bt878 tv/grabber cards */
171
172 struct tvcard bttv_tvcards[] = {
173 {
174 /* ---- card 0x00 ---------------------------------- */
175 name: " *** UNKNOWN *** ",
176 video_inputs: 4,
177 audio_inputs: 1,
178 tuner: 0,
179 svhs: 2,
180 muxsel: { 2, 3, 1, 0},
181 tuner_type: -1,
182 },{
183 name: "MIRO PCTV",
184 video_inputs: 4,
185 audio_inputs: 1,
186 tuner: 0,
187 svhs: 2,
188 gpiomask: 15,
189 muxsel: { 2, 3, 1, 1},
190 audiomux: { 2, 0, 0, 0, 10},
191 needs_tvaudio: 1,
192 tuner_type: -1,
193 },{
194 name: "Hauppauge old",
195 video_inputs: 4,
196 audio_inputs: 1,
197 tuner: 0,
198 svhs: 2,
199 gpiomask: 7,
200 muxsel: { 2, 3, 1, 1},
201 audiomux: { 0, 1, 2, 3, 4},
202 needs_tvaudio: 1,
203 tuner_type: -1,
204 },{
205 name: "STB",
206 video_inputs: 3,
207 audio_inputs: 1,
208 tuner: 0,
209 svhs: 2,
210 gpiomask: 7,
211 muxsel: { 2, 3, 1, 1},
212 audiomux: { 4, 0, 2, 3, 1},
213 no_msp34xx: 1,
214 needs_tvaudio: 1,
215 tuner_type: -1,
216 },{
217
218 /* ---- card 0x04 ---------------------------------- */
219 name: "Intel",
220 video_inputs: 3,
221 audio_inputs: 1,
222 tuner: 0,
223 svhs: -1,
224 gpiomask: 7,
225 muxsel: { 2, 3, 1, 1},
226 audiomux: { 0, 1, 2, 3, 4},
227 needs_tvaudio: 1,
228 tuner_type: -1,
229 },{
230 name: "Diamond DTV2000",
231 video_inputs: 4,
232 audio_inputs: 1,
233 tuner: 0,
234 svhs: 2,
235 gpiomask: 3,
236 muxsel: { 2, 3, 1, 0},
237 audiomux: { 0, 1, 0, 1, 3},
238 needs_tvaudio: 1,
239 tuner_type: -1,
240 },{
241 name: "AVerMedia TVPhone",
242 video_inputs: 3,
243 audio_inputs: 1,
244 tuner: 0,
245 svhs: 3,
246 muxsel: { 2, 3, 1, 1},
247 gpiomask: 0x0f,
248 audiomux: { 0x0c, 0x04, 0x08, 0x04, 0},
249 /* 0x04 for some cards ?? */
250 needs_tvaudio: 1,
251 tuner_type: -1,
252 audio_hook: avermedia_tvphone_audio,
253 },{
254 name: "MATRIX-Vision MV-Delta",
255 video_inputs: 5,
256 audio_inputs: 1,
257 tuner: -1,
258 svhs: 3,
259 gpiomask: 0,
260 muxsel: { 2, 3, 1, 0, 0},
261 audiomux: {0 },
262 needs_tvaudio: 1,
263 tuner_type: -1,
264 },{
265
266 /* ---- card 0x08 ---------------------------------- */
267 name: "Fly Video II",
268 video_inputs: 3,
269 audio_inputs: 1,
270 tuner: 0,
271 svhs: 2,
272 gpiomask: 0xc00,
273 muxsel: { 2, 3, 1, 1},
274 audiomux: { 0, 0xc00, 0x800, 0x400, 0xc00, 0},
275 needs_tvaudio: 1,
276 tuner_type: -1,
277 },{
278 name: "TurboTV",
279 video_inputs: 3,
280 audio_inputs: 1,
281 tuner: 0,
282 svhs: 2,
283 gpiomask: 3,
284 muxsel: { 2, 3, 1, 1},
285 audiomux: { 1, 1, 2, 3, 0},
286 needs_tvaudio: 1,
287 tuner_type: -1,
288 },{
289 name: "Hauppauge new (bt878)",
290 video_inputs: 4,
291 audio_inputs: 1,
292 tuner: 0,
293 svhs: 2,
294 gpiomask: 7,
295 muxsel: { 2, 0, 1, 1},
296 audiomux: { 0, 1, 2, 3, 4},
297 needs_tvaudio: 1,
298 pll: PLL_28,
299 tuner_type: -1,
300 },{
301 name: "MIRO PCTV pro",
302 video_inputs: 3,
303 audio_inputs: 1,
304 tuner: 0,
305 svhs: 2,
306 gpiomask: 0x3014f,
307 muxsel: { 2, 3, 1, 1},
308 audiomux: { 0x20001,0x10001, 0, 0,10},
309 needs_tvaudio: 1,
310 tuner_type: -1,
311 },{
312
313 /* ---- card 0x0c ---------------------------------- */
314 name: "ADS Technologies Channel Surfer TV",
315 video_inputs: 3,
316 audio_inputs: 1,
317 tuner: 0,
318 svhs: 2,
319 gpiomask: 15,
320 muxsel: { 2, 3, 1, 1},
321 audiomux: { 13, 14, 11, 7, 0, 0},
322 needs_tvaudio: 1,
323 tuner_type: -1,
324 },{
325 name: "AVerMedia TVCapture 98",
326 video_inputs: 3,
327 audio_inputs: 4,
328 tuner: 0,
329 svhs: 2,
330 gpiomask: 15,
331 muxsel: { 2, 3, 1, 1},
332 audiomux: { 13, 14, 11, 7, 0, 0},
333 needs_tvaudio: 1,
334 pll: PLL_28,
335 tuner_type: 5,
336 },{
337 name: "Aimslab VHX",
338 video_inputs: 3,
339 audio_inputs: 1,
340 tuner: 0,
341 svhs: 2,
342 gpiomask: 7,
343 muxsel: { 2, 3, 1, 1},
344 audiomux: { 0, 1, 2, 3, 4},
345 needs_tvaudio: 1,
346 tuner_type: -1,
347 },{
348 name: "Zoltrix TV-Max",
349 video_inputs: 3,
350 audio_inputs: 1,
351 tuner: 0,
352 svhs: 2,
353 gpiomask: 15,
354 muxsel: { 2, 3, 1, 1},
355 audiomux: {0 , 0, 1 , 0, 10},
356 needs_tvaudio: 1,
357 tuner_type: -1,
358 },{
359
360 /* ---- card 0x10 ---------------------------------- */
361 name: "Pixelview PlayTV (bt878)",
362 video_inputs: 3,
363 audio_inputs: 1,
364 tuner: 0,
365 svhs: 2,
366 gpiomask: 0x01fe00,
367 muxsel: { 2, 3, 1, 1},
368 audiomux: { 0x01c000, 0, 0x018000, 0x014000, 0x002000, 0 },
369 needs_tvaudio: 1,
370 pll: PLL_28,
371 tuner_type: -1,
372 },{
373 name: "Leadtek WinView 601",
374 video_inputs: 3,
375 audio_inputs: 1,
376 tuner: 0,
377 svhs: 2,
378 gpiomask: 0x8300f8,
379 muxsel: { 2, 3, 1, 1,0},
380 audiomux: { 0x4fa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007,0xcfa007},
381 needs_tvaudio: 1,
382 tuner_type: -1,
383 audio_hook: winview_audio,
384 },{
385 name: "AVEC Intercapture",
386 video_inputs: 3,
387 audio_inputs: 2,
388 tuner: 0,
389 svhs: 2,
390 gpiomask: 0,
391 muxsel: {2, 3, 1, 1},
392 audiomux: {1, 0, 0, 0, 0},
393 needs_tvaudio: 1,
394 tuner_type: -1,
395 },{
396 name: "LifeView FlyKit w/o Tuner",
397 video_inputs: 3,
398 audio_inputs: 1,
399 tuner: -1,
400 svhs: -1,
401 gpiomask: 0x8dff00,
402 muxsel: { 2, 3, 1, 1},
403 audiomux: { 0 },
404 no_msp34xx: 1,
405 tuner_type: -1,
406 },{
407
408 /* ---- card 0x14 ---------------------------------- */
409 name: "CEI Raffles Card",
410 video_inputs: 3,
411 audio_inputs: 3,
412 tuner: 0,
413 svhs: 2,
414 muxsel: {2, 3, 1, 1},
415 tuner_type: -1,
416 },{
417 name: "Lucky Star Image World ConferenceTV",
418 video_inputs: 3,
419 audio_inputs: 1,
420 tuner: 0,
421 svhs: 2,
422 gpiomask: 0x00fffe07,
423 muxsel: { 2, 3, 1, 1},
424 audiomux: { 131072, 1, 1638400, 3, 4},
425 needs_tvaudio: 1,
426 pll: PLL_28,
427 tuner_type: TUNER_PHILIPS_PAL_I,
428 },{
429 name: "Phoebe Tv Master + FM",
430 video_inputs: 3,
431 audio_inputs: 1,
432 tuner: 0,
433 svhs: 2,
434 gpiomask: 0xc00,
435 muxsel: { 2, 3, 1, 1},
436 audiomux: {0, 1, 0x800, 0x400, 0xc00, 0},
437 needs_tvaudio: 1,
438 tuner_type: -1,
439 },{
440 name: "Modular Technology MM205 PCTV, bt878",
441 video_inputs: 2,
442 audio_inputs: 1,
443 tuner: 0,
444 svhs: -1,
445 gpiomask: 7,
446 muxsel: { 2, 3 },
447 audiomux: { 0, 0, 0, 0, 0 },
448 no_msp34xx: 1,
449 pll: PLL_28,
450 tuner_type: TUNER_ALPS_TSBB5_PAL_I,
451 },{
452
453 /* ---- card 0x18 ---------------------------------- */
454 name: "Askey/Typhoon/Anubis Magic TView CPH051/061 (bt878)",
455 video_inputs: 3,
456 audio_inputs: 1,
457 tuner: 0,
458 svhs: 2,
459 gpiomask: 0xe00,
460 muxsel: { 2, 3, 1, 1},
461 audiomux: {0x400, 0x400, 0x400, 0x400, 0},
462 needs_tvaudio: 1,
463 pll: PLL_28,
464 tuner_type: -1,
465 },{
466 name: "Terratec/Vobis TV-Boostar",
467 video_inputs: 3,
468 audio_inputs: 1,
469 tuner: 0,
470 svhs: 2,
471 gpiomask: 16777215,
472 muxsel: { 2, 3, 1, 1},
473 audiomux: { 131072, 1, 1638400, 3,4},
474 needs_tvaudio: 1,
475 tuner_type: -1,
476 },{
477 name: "Newer Hauppauge WinCam (bt878)",
478 video_inputs: 4,
479 audio_inputs: 1,
480 tuner: 0,
481 svhs: 3,
482 gpiomask: 7,
483 muxsel: { 2, 0, 1, 1},
484 audiomux: { 0, 1, 2, 3, 4},
485 needs_tvaudio: 1,
486 tuner_type: -1,
487 },{
488 name: "MAXI TV Video PCI2",
489 video_inputs: 3,
490 audio_inputs: 1,
491 tuner: 0,
492 svhs: 2,
493 gpiomask: 0xffff,
494 muxsel: { 2, 3, 1, 1},
495 audiomux: { 0, 1, 2, 3, 0xc00},
496 needs_tvaudio: 1,
497 tuner_type: TUNER_PHILIPS_SECAM,
498 },{
499
500 /* ---- card 0x1c ---------------------------------- */
501 name: "Terratec TerraTV+",
502 video_inputs: 3,
503 audio_inputs: 1,
504 tuner: 0,
505 svhs: 2,
506 gpiomask: 0x70000,
507 muxsel: { 2, 3, 1, 1},
508 audiomux: { 0x20000, 0x30000, 0x10000, 0x00000, 0x40000},
509 needs_tvaudio: 1,
510 tuner_type: TUNER_PHILIPS_PAL,
511 audio_hook: terratv_audio,
512 },{
513 /* Jannik Fritsch <jannik@techfak.uni-bielefeld.de> */
514 name: "Imagenation PXC200",
515 video_inputs: 5,
516 audio_inputs: 1,
517 tuner: -1,
518 svhs: 1, /* was: 4 */
519 gpiomask: 0,
520 muxsel: { 2, 3, 1, 0, 0},
521 audiomux: { 0 },
522 needs_tvaudio: 1,
523 tuner_type: -1,
524 },{
525 name: "FlyVideo 98",
526 video_inputs: 3,
527 audio_inputs: 1,
528 tuner: 0,
529 svhs: 2,
530 gpiomask: 0x8dfe00,
531 muxsel: {2, 3, 1, 1},
532 audiomux: { 0, 0x8dff00, 0x8df700, 0x8de700, 0x8dff00, 0 },
533 needs_tvaudio: 1,
534 tuner_type: -1,
535 },{
536 name: "iProTV",
537 video_inputs: 3,
538 audio_inputs: 1,
539 tuner: 0,
540 svhs: 2,
541 gpiomask: 1,
542 muxsel: { 2, 3, 1, 1},
543 audiomux: { 1, 0, 0, 0, 0 },
544 tuner_type: -1,
545 },{
546
547 /* ---- card 0x20 ---------------------------------- */
548 name: "Intel Create and Share PCI",
549 video_inputs: 4,
550 audio_inputs: 1,
551 tuner: 0,
552 svhs: 2,
553 gpiomask: 7,
554 muxsel: { 2, 3, 1, 1},
555 audiomux: { 4, 4, 4, 4, 4},
556 needs_tvaudio: 1,
557 tuner_type: -1,
558 },{
559 name: "Terratec TerraTValue",
560 video_inputs: 3,
561 audio_inputs: 1,
562 tuner: 0,
563 svhs: 2,
564 gpiomask: 0xffff00,
565 muxsel: { 2, 3, 1, 1},
566 audiomux: { 0x500, 0, 0x300, 0x900, 0x900},
567 needs_tvaudio: 1,
568 pll: PLL_28,
569 tuner_type: TUNER_PHILIPS_PAL,
570 },{
571 name: "Leadtek WinFast 2000",
572 video_inputs: 3,
573 audio_inputs: 1,
574 tuner: 0,
575 svhs: 2,
576 gpiomask: 0xc33000,
577 muxsel: { 2, 3, 1, 1,0},
578 audiomux: { 0x422000,0x001000,0x621100,0x620000,0x800000,0x620000},
579 needs_tvaudio: 0,
580 pll: PLL_28,
581 tuner_type: -1,
582 audio_hook: winfast2000_audio,
583 },{
584 name: "Chronos Video Shuttle II",
585 video_inputs: 3,
586 audio_inputs: 3,
587 tuner: 0,
588 svhs: 2,
589 gpiomask: 0x1800,
590 muxsel: { 2, 3, 1, 1},
591 audiomux: { 0, 0, 0x1000, 0x1000, 0x0800},
592 needs_tvaudio: 1,
593 pll: PLL_28,
594 tuner_type: -1,
595 },{
596
597 /* ---- card 0x24 ---------------------------------- */
598 name: "Typhoon TView TV/FM Tuner",
599 video_inputs: 3,
600 audio_inputs: 3,
601 tuner: 0,
602 svhs: 2,
603 gpiomask: 0x1800,
604 muxsel: { 2, 3, 1, 1},
605 audiomux: { 0, 0x800, 0, 0, 0x1800, 0 },
606 needs_tvaudio: 1,
607 pll: PLL_28,
608 tuner_type: -1,
609 },{
610 name: "PixelView PlayTV pro",
611 video_inputs: 3,
612 audio_inputs: 1,
613 tuner: 0,
614 svhs: 2,
615 gpiomask: 0xff,
616 muxsel: { 2, 3, 1, 1 },
617 audiomux: { 0x21, 0x20, 0x24, 0x2c, 0x29, 0x29 },
618 no_msp34xx: 1,
619 pll: PLL_28,
620 tuner_type: -1,
621 },{
622 name: "TView99 CPH063",
623 video_inputs: 4,
624 audio_inputs: 1,
625 tuner: 0,
626 svhs: 2,
627 gpiomask: 0x551e00,
628 muxsel: { 2, 3, 1, 0},
629 audiomux: { 0x551400, 0x551200, 0, 0, 0, 0x551200 },
630 needs_tvaudio: 1,
631 pll: PLL_28,
632 tuner_type: -1,
633 },{
634 name: "Pinnacle PCTV Studio/Rave",
635 video_inputs: 3,
636 audio_inputs: 1,
637 tuner: 0,
638 svhs: 2,
639 gpiomask: 0x03000F,
640 muxsel: { 2, 3, 1, 1},
641 audiomux: { 2, 0, 0, 0, 1},
642 needs_tvaudio: 1,
643 pll: PLL_28,
644 tuner_type: -1,
645 },{
646
647 /* ---- card 0x28 ---------------------------------- */
648 name: "STB2",
649 video_inputs: 3,
650 audio_inputs: 1,
651 tuner: 0,
652 svhs: 2,
653 gpiomask: 7,
654 muxsel: { 2, 3, 1, 1},
655 audiomux: { 4, 0, 2, 3, 1},
656 no_msp34xx: 1,
657 needs_tvaudio: 1,
658 tuner_type: -1,
659 },{
660 name: "AVerMedia TVPhone 98",
661 video_inputs: 3,
662 audio_inputs: 4,
663 tuner: 0,
664 svhs: 2,
665 gpiomask: 12,
666 muxsel: { 2, 3, 1, 1},
667 audiomux: { 13, 4, 11, 7, 0, 0},
668 needs_tvaudio: 1,
669 pll: PLL_28,
670 tuner_type: 5,
671 },{
672 name: "ProVideo PV951", /* pic16c54 */
673 video_inputs: 3,
674 audio_inputs: 1,
675 tuner: 0,
676 svhs: 2,
677 gpiomask: 0,
678 muxsel: { 2, 3, 1, 1},
679 audiomux: { 0, 0, 0, 0, 0},
680 no_msp34xx: 1,
681 pll: PLL_28,
682 tuner_type: 1,
683 },{
684 name: "Little OnAir TV",
685 video_inputs: 3,
686 audio_inputs: 1,
687 tuner: 0,
688 svhs: 2,
689 gpiomask: 0xe00b,
690 muxsel: {2, 3, 1, 1},
691 audiomux: {0xff9ff6, 0xff9ff6, 0xff1ff7, 0, 0xff3ffc},
692 no_msp34xx: 1,
693 tuner_type: -1,
694 },{
695
696 /* ---- card 0x2c ---------------------------------- */
697 name: "Sigma TVII-FM",
698 video_inputs: 2,
699 audio_inputs: 1,
700 tuner: 0,
701 svhs: -1,
702 gpiomask: 3,
703 muxsel: {2, 3, 1, 1},
704 audiomux: {1, 1, 0, 2, 3},
705 no_msp34xx: 1,
706 pll: PLL_NONE,
707 tuner_type: -1,
708 },{
709 name: "MATRIX-Vision MV-Delta 2",
710 video_inputs: 5,
711 audio_inputs: 1,
712 tuner: -1,
713 svhs: 3,
714 gpiomask: 0,
715 muxsel: { 2, 3, 1, 0, 0},
716 audiomux: {0 },
717 no_msp34xx: 1,
718 pll: PLL_28,
719 tuner_type: -1,
720 },{
721 name: "Zoltrix Genie TV/FM",
722 video_inputs: 3,
723 audio_inputs: 1,
724 tuner: 0,
725 svhs: 2,
726 gpiomask: 0xbcf03f,
727 muxsel: { 2, 3, 1, 1},
728 audiomux: { 0xbc803f, 0xbc903f, 0xbcb03f, 0, 0xbcb03f},
729 no_msp34xx: 1,
730 pll: PLL_28,
731 tuner_type: 21,
732 },{
733 name: "Terratec TV/Radio+",
734 video_inputs: 3,
735 audio_inputs: 1,
736 tuner: 0,
737 svhs: 2,
738 gpiomask: 0x1f0000,
739 muxsel: { 2, 3, 1, 1},
740 audiomux: { 0xe2ffff, 0xebffff, 0, 0, 0xe0ffff, 0xe2ffff },
741 no_msp34xx: 1,
742 pll: PLL_35,
743 tuner_type: 1,
744 },{
745
746 /* ---- card 0x30 ---------------------------------- */
747 name: "Dynalink Magic TView ",
748 video_inputs: 3,
749 audio_inputs: 1,
750 tuner: 0,
751 svhs: 2,
752 gpiomask: 15,
753 muxsel: { 2, 3, 1, 1},
754 audiomux: {2,0,0,0,1},
755 needs_tvaudio: 1,
756 pll: PLL_28,
757 tuner_type: -1,
758 },{
759 name: "GV-BCTV3",
760 video_inputs: 3,
761 audio_inputs: 1,
762 tuner: 0,
763 svhs: 2,
764 gpiomask: 0x010f00,
765 muxsel: {2, 3, 0, 0},
766 audiomux: {0x10000, 0, 0x10000, 0, 0, 0},
767 no_msp34xx: 1,
768 pll: PLL_28,
769 tuner_type: TUNER_ALPS_TSHC6_NTSC,
770 audio_hook: gvbctv3pci_audio,
771 },{
772 name: "Prolink PV-BT878P+4E (PixelView PlayTV PAK)",
773 video_inputs: 4,
774 audio_inputs: 1,
775 tuner: 0,
776 svhs: 2,
777 gpiomask: 0xAA0000,
778 muxsel: { 2,3,1,1 },
779 audiomux: { 0x20000, 0, 0x80000, 0x80000, 0xa8000, 0x46000 },
780 no_msp34xx: 1,
781 pll: PLL_28,
782 tuner_type: TUNER_PHILIPS_PAL_I,
783 },{
784 name: "Eagle Wireless Capricorn2 (bt878A)",
785 video_inputs: 4,
786 audio_inputs: 1,
787 tuner: 0,
788 svhs: 2,
789 gpiomask: 7,
790 muxsel: { 2, 0, 1, 1},
791 audiomux: { 0, 1, 2, 3, 4},
792 pll: PLL_28,
793 tuner_type: -1 /* TUNER_ALPS_TMDH2_NTSC */,
794 },{
795
796 /* ---- card 0x34 ---------------------------------- */
797 /* David Härdeman <david@2gen.com> */
798 name: "Pinnacle PCTV Studio Pro",
799 video_inputs: 3,
800 audio_inputs: 1,
801 tuner: 0,
802 svhs: 2,
803 gpiomask: 0x03000F,
804 muxsel: { 2, 3, 1, 1},
805 audiomux: { 1, 0x10001, 0, 0, 10},
806 needs_tvaudio: 1,
807 pll: PLL_28,
808 tuner_type: -1,
809 },{
810 /* Claas Langbehn <claas@bigfoot.com>,
811 Sven Grothklags <sven@upb.de> */
812 name: "Typhoon TView RDS / FM Stereo",
813 video_inputs: 3,
814 audio_inputs: 3,
815 tuner: 0,
816 svhs: 2,
817 gpiomask: 0x1c,
818 muxsel: { 2, 3, 1, 1},
819 audiomux: { 0, 0, 0x10, 8, 4 },
820 needs_tvaudio: 1,
821 pll: PLL_28,
822 tuner_type: TUNER_PHILIPS_PAL_I,
823 },{
824 /* Tim Röstermundt <rosterm@uni-muenster.de>
825 in de.comp.os.unix.linux.hardware:
826 options bttv card=0 pll=1 radio=1 gpiomask=0x18e0
827 audiomux=0x44c71f,0x44d71f,0,0x44d71f,0x44dfff
828 options tuner type=5 */
829 name: "Lifetec LT 9415 TV",
830 video_inputs: 4,
831 audio_inputs: 1,
832 tuner: 0,
833 svhs: 2,
834 gpiomask: 0x18e0,
835 muxsel: { 2, 3, 1, 1},
836 audiomux: { 0x0000,0x0800,0x1000,0x1000,0x18e0 },
837 /* 0x0000: Tuner normal stereo
838 0x0080: Tuner A2 SAP (second audio program = Zweikanalton)
839 0x0880: Tuner A2 stereo */
840 pll: PLL_28,
841 tuner_type: TUNER_PHILIPS_PAL,
842 audio_hook: lt9415_audio,
843 },{
844 /* Miguel Angel Alvarez <maacruz@navegalia.com>
845 old Easy TV BT848 version (model CPH031) */
846 name: "BESTBUY Easy TV",
847 video_inputs: 4,
848 audio_inputs: 1,
849 tuner: 0,
850 svhs: 2,
851 gpiomask: 0xF,
852 muxsel: { 2, 3, 1, 0},
853 audiomux: { 2, 0, 0, 0, 10},
854 needs_tvaudio: 0,
855 pll: PLL_28,
856 tuner_type: TUNER_TEMIC_PAL,
857 },{
858
859 /* ---- card 0x38 ---------------------------------- */
860 /* Gordon Heydon <gjheydon@bigfoot.com ('98) */
861 name: "FlyVideo '98/FM",
862 video_inputs: 3,
863 audio_inputs: 3,
864 tuner: 0,
865 svhs: 2,
866 gpiomask: 0x1800,
867 muxsel: { 2, 3, 0, 1},
868 audiomux: { 0, 0x800, 0, 0, 0x1800, 0 },
869 needs_tvaudio: 1,
870 pll: PLL_28,
871 tuner_type: 5,
872 },{
873 /* This is the ultimate cheapo capture card
874 * just a BT848A on a small PCB!
875 * Steve Hosgood <steve@equiinet.com> */
876 name: "GrandTec 'Grand Video Capture'",
877 video_inputs: 2,
878 audio_inputs: 0,
879 tuner: -1,
880 svhs: 1,
881 gpiomask: 0,
882 muxsel: { 3, 1 },
883 audiomux: { 0 },
884 needs_tvaudio: 0,
885 no_msp34xx: 1,
886 pll: PLL_35,
887 tuner_type: -1,
888 },{
889 /* Daniel Herrington <daniel.herrington@home.com> */
890 name: "Phoebe TV Master Only (No FM)",
891 video_inputs: 3,
892 audio_inputs: 1,
893 tuner: 0,
894 svhs: 2,
895 gpiomask: 0x0e00,
896 muxsel: { 2, 3, 1, 1},
897 audiomux: { 0x400, 0x400, 0x400, 0x400, 0x800, 0x400 },
898 needs_tvaudio: 1,
899 pll: PLL_NONE,
900 tuner_type: TUNER_TEMIC_4036FY5_NTSC,
901 },{
902 /* Matti Mottus <mottus@physic.ut.ee> */
903 name: "TV Capturer",
904 video_inputs: 4,
905 audio_inputs: 1,
906 tuner: 0,
907 svhs: 2,
908 gpiomask: 0x03000F,
909 muxsel: { 2, 3, 1, 0},
910 audiomux: { 2,0,0,0,1 },
911 pll: PLL_28,
912 tuner_type: 0,
913 },{
914
915 /* ---- card 0x3c ---------------------------------- */
916 /* Philip Blundell <philb@gnu.org> */
917 name: "MM100PCTV",
918 video_inputs: 2,
919 audio_inputs: 2,
920 gpiomask: 11,
921 muxsel: { 2, 3, 1, 1},
922 audiomux: { 2, 0, 0, 1, 8},
923 pll: PLL_NONE,
924 tuner_type: TUNER_TEMIC_PAL,
925
926 },{
927 /* Adrian Cox <adrian@humboldt.co.uk */
928 name: "AG Electronics GMV1",
929 video_inputs: 2,
930 audio_inputs: 0,
931 tuner: -1,
932 svhs: 1,
933 gpiomask: 0xF,
934 muxsel: { 2, 2},
935 audiomux: { },
936 no_msp34xx: 1,
937 needs_tvaudio: 0,
938 pll: PLL_28,
939 tuner_type: -1,
940 },{
941 /* Miguel Angel Alvarez <maacruz@navegalia.com>
942 new Easy TV BT878 version (model CPH061)
943 special thanks to Informatica Mieres for providing the card */
944 name: "BESTBUY Easy TV (bt878)",
945 video_inputs: 3,
946 audio_inputs: 2,
947 tuner: 0,
948 svhs: 2,
949 gpiomask: 0xFF,
950 muxsel: { 2, 3, 1, 0},
951 audiomux: { 1, 0, 4, 4, 9},
952 needs_tvaudio: 0,
953 pll: PLL_28,
954 tuner_type: TUNER_PHILIPS_PAL,
955 },{
956 /* Lukas Gebauer <geby@volny.cz> */
957 name: "ATI TV-Wonder",
958 video_inputs: 3,
959 audio_inputs: 1,
960 tuner: 0,
961 svhs: 2,
962 gpiomask: 0xf03f,
963 muxsel: { 2, 3, 0, 1},
964 audiomux: { 0xbffe, 0, 0xbfff, 0, 0xbffe},
965 pll: PLL_28,
966 tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL,
967 },{
968
969 /* ---- card 0x40 ---------------------------------- */
970 /* Lukas Gebauer <geby@volny.cz> */
971 name: "ATI TV-Wonder VE",
972 video_inputs: 2,
973 audio_inputs: 1,
974 tuner: 0,
975 svhs: -1,
976 gpiomask: 1,
977 muxsel: { 2, 3, 0, 1},
978 audiomux: { 0, 0, 1, 0, 0},
979 no_msp34xx: 1,
980 pll: PLL_28,
981 tuner_type: TUNER_TEMIC_4006FN5_MULTI_PAL,
982 },{
983 /* DeeJay <deejay@westel900.net (2000S) */
984 name: "FlyVideo 2000S",
985 video_inputs: 3,
986 audio_inputs: 3,
987 tuner: 0,
988 svhs: 2,
989 gpiomask: 0x18e0,
990 muxsel: { 2, 3, 0, 1},
991 audiomux: { 0,0x18e0,0x1000,0x1000,0x1080, 0x1080 },
992 needs_tvaudio: 1,
993 pll: PLL_28,
994 tuner_type: 5,
995 },{
996 name: "Terratec TValueRadio",
997 video_inputs: 3,
998 audio_inputs: 1,
999 tuner: 0,
1000 svhs: 2,
1001 gpiomask: 0xffff00,
1002 muxsel: { 2, 3, 1, 1},
1003 audiomux: { 0x500, 0x500, 0x300, 0x900, 0x900},
1004 needs_tvaudio: 1,
1005 pll: PLL_28,
1006 tuner_type: TUNER_PHILIPS_PAL,
1007 }};
1008
1009 const int bttv_num_tvcards = (sizeof(bttv_tvcards)/sizeof(struct tvcard));
1010
1011 /* ----------------------------------------------------------------------- */
1012
1013 static unsigned char eeprom_data[256];
1014
1015 /*
1016 * identify card
1017 */
1018 void __devinit bttv_idcard(struct bttv *btv)
1019 {
1020 unsigned int gpiobits;
1021 int i,type;
1022 unsigned short tmp;
1023
1024 /* read PCI subsystem ID */
1025 pci_read_config_word(btv->dev, PCI_SUBSYSTEM_ID, &tmp);
1026 btv->cardid = tmp << 16;
1027 pci_read_config_word(btv->dev, PCI_SUBSYSTEM_VENDOR_ID, &tmp);
1028 btv->cardid |= tmp;
1029
1030 if (0 != btv->cardid && 0xffffffff != btv->cardid) {
1031 /* look for the card */
1032 for (type = -1, i = 0; cards[i].id != 0; i++)
1033 if (cards[i].id == btv->cardid)
1034 type = i;
1035
1036 if (type != -1) {
1037 /* found it */
1038 printk(KERN_INFO "bttv%d: subsystem: %04x:%04x => %s => card=%d\n",
1039 btv->nr, btv->cardid & 0xffff, btv->cardid >> 16,
1040 cards[type].name,cards[type].cardnr);
1041 btv->type = cards[type].cardnr;
1042 } else {
1043 /* 404 */
1044 printk(KERN_INFO "bttv%d: subsystem: %04x:%04x (UNKNOWN)\n",
1045 btv->nr, btv->cardid&0xffff, btv->cardid>>16);
1046 printk(KERN_DEBUG "please mail id, board name and "
1047 "the correct card= insmod option to "
1048 "kraxel@goldbach.in-berlin.de\n");
1049 }
1050 }
1051
1052 /* let the user override the autodetected type */
1053 if (card[btv->nr] >= 0 && card[btv->nr] < bttv_num_tvcards)
1054 btv->type=card[btv->nr];
1055
1056 /* print which card config we are using */
1057 sprintf(btv->video_dev.name,"BT%d%s(%.23s)",
1058 btv->id,
1059 (btv->id==848 && btv->revision==0x12) ? "A" : "",
1060 bttv_tvcards[btv->type].name);
1061 printk(KERN_INFO "bttv%d: model: %s [%s]\n",btv->nr,btv->video_dev.name,
1062 (card[btv->nr] >= 0 && card[btv->nr] < bttv_num_tvcards) ?
1063 "insmod option" : "autodetected");
1064
1065 /* overwrite gpio stuff ?? */
1066 if (-1 == audioall && -1 == audiomux[0])
1067 return;
1068
1069 if (-1 != audiomux[0]) {
1070 gpiobits = 0;
1071 for (i = 0; i < 5; i++) {
1072 bttv_tvcards[btv->type].audiomux[i] = audiomux[i];
1073 gpiobits |= audiomux[i];
1074 }
1075 } else {
1076 gpiobits = audioall;
1077 for (i = 0; i < 5; i++) {
1078 bttv_tvcards[btv->type].audiomux[i] = audioall;
1079 }
1080 }
1081 bttv_tvcards[btv->type].gpiomask = (-1 != gpiomask) ? gpiomask : gpiobits;
1082 printk(KERN_INFO "bttv%d: gpio config override: mask=0x%x, mux=",
1083 btv->nr,bttv_tvcards[btv->type].gpiomask);
1084 for (i = 0; i < 5; i++) {
1085 printk("%s0x%x", i ? "," : "", bttv_tvcards[btv->type].audiomux[i]);
1086 }
1087 printk("\n");
1088 }
1089
1090 /*
1091 * (most) board specific initialisations goes here
1092 */
1093
1094 int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1,
1095 14,2,17,1, 4,1,4,3, 1,2,16,1, 4,4,4,4 };
1096 int miro_fmtuner[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1,
1097 1,1,1,1, 1,1,1,0, 0,0,0,0, 0,0,0,0 };
1098
1099 void __devinit bttv_init_card(struct bttv *btv)
1100 {
1101 /* miro/pinnacle */
1102 if (btv->type == BTTV_MIRO ||
1103 btv->type == BTTV_MIROPRO ||
1104 btv->type == BTTV_PINNACLE ||
1105 btv->type == BTTV_PINNACLEPRO) {
1106 int id,msp;
1107 id = ((btread(BT848_GPIO_DATA)>>10) & 31) -1;
1108 msp = bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx");
1109 btv->tuner_type = miro_tunermap[id];
1110 if (0 == (btread(BT848_GPIO_DATA) & 0x20)) {
1111 btv->has_radio = 1;
1112 if (!miro_fmtuner[id]) {
1113 btv->has_matchbox = 1;
1114 btv->mbox_we = (1<<6);
1115 btv->mbox_most = (1<<7);
1116 btv->mbox_clk = (1<<8);
1117 btv->mbox_data = (1<<9);
1118 btv->mbox_mask = (1<<6)|(1<<7)|(1<<8)|(1<<9);
1119 }
1120 } else {
1121 btv->has_radio = 0;
1122 }
1123 if (-1 != msp) {
1124 if (btv->type == BTTV_MIRO)
1125 btv->type = BTTV_MIROPRO;
1126 if (btv->type == BTTV_PINNACLE)
1127 btv->type = BTTV_PINNACLEPRO;
1128 }
1129 if (bttv_verbose)
1130 printk("bttv%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",
1131 btv->nr, id+1, btv->tuner_type,
1132 !btv->has_radio ? "no" :
1133 (btv->has_matchbox ? "matchbox" : "fmtuner"),
1134 (-1 == msp) ? "no" : "yes");
1135 #if 0
1136 if (btv->has_matchbox) {
1137 if (bttv_verbose)
1138 printk(KERN_INFO "Initializing TEA5757...\n");
1139 init_tea5757(btv);
1140 }
1141 #endif
1142 }
1143
1144 if (btv->type == BTTV_HAUPPAUGE || btv->type == BTTV_HAUPPAUGE878) {
1145 /* pick up some config infos from the eeprom */
1146 bttv_readee(btv,eeprom_data,0xa0);
1147 hauppauge_eeprom(btv);
1148 }
1149
1150 if (btv->type == BTTV_PXC200)
1151 init_PXC200(btv);
1152
1153 if (btv->type == BTTV_VHX) {
1154 btv->has_radio = 1;
1155 btv->has_matchbox = 1;
1156 btv->mbox_we = 0x20;
1157 btv->mbox_most = 0;
1158 btv->mbox_clk = 0x08;
1159 btv->mbox_data = 0x10;
1160 btv->mbox_mask = 0x38;
1161 }
1162
1163 if (btv->type == BTTV_LIFETEC_9415) {
1164 if (btread(BT848_GPIO_DATA) & 0x4000)
1165 printk("bttv%d: lifetec: tv mono/fm stereo card\n", btv->nr);
1166 else
1167 printk("bttv%d: lifetec: stereo(TDA9821) card\n",btv->nr);
1168 btv->has_radio=1;
1169 }
1170
1171 /* pll configuration */
1172 if (!(btv->id==848 && btv->revision==0x11)) {
1173 /* defaults from card list */
1174 if (PLL_28 == bttv_tvcards[btv->type].pll) {
1175 btv->pll.pll_ifreq=28636363;
1176 btv->pll.pll_crystal=BT848_IFORM_XT0;
1177 }
1178 if (PLL_35 == bttv_tvcards[btv->type].pll) {
1179 btv->pll.pll_ifreq=35468950;
1180 btv->pll.pll_crystal=BT848_IFORM_XT1;
1181 }
1182 /* insmod options can override */
1183 switch (pll[btv->nr]) {
1184 case 0: /* none */
1185 btv->pll.pll_crystal = 0;
1186 btv->pll.pll_ifreq = 0;
1187 btv->pll.pll_ofreq = 0;
1188 break;
1189 case 1: /* 28 MHz */
1190 case 28:
1191 btv->pll.pll_ifreq = 28636363;
1192 btv->pll.pll_ofreq = 0;
1193 btv->pll.pll_crystal = BT848_IFORM_XT0;
1194 break;
1195 case 2: /* 35 MHz */
1196 case 35:
1197 btv->pll.pll_ifreq = 35468950;
1198 btv->pll.pll_ofreq = 0;
1199 btv->pll.pll_crystal = BT848_IFORM_XT1;
1200 break;
1201 }
1202 }
1203
1204 /* tuner configuration (from card list / insmod option) */
1205 if (-1 != bttv_tvcards[btv->type].tuner_type)
1206 btv->tuner_type = bttv_tvcards[btv->type].tuner_type;
1207 if (-1 != tuner[btv->nr])
1208 btv->tuner_type = tuner[btv->nr];
1209 if (btv->tuner_type != -1)
1210 bttv_call_i2c_clients(btv,TUNER_SET_TYPE,&btv->tuner_type);
1211
1212 /* try to detect audio/fader chips */
1213 if (!bttv_tvcards[btv->type].no_msp34xx &&
1214 bttv_I2CRead(btv, I2C_MSP3400, "MSP34xx") >=0) {
1215 if (autoload)
1216 request_module("msp3400");
1217 }
1218
1219 if (bttv_I2CRead(btv, I2C_TDA9875, "TDA9875") >=0) {
1220 if (autoload)
1221 request_module("tda9875");
1222 }
1223
1224 if (bttv_I2CRead(btv, I2C_TDA7432, "TDA7432") >=0) {
1225 if (autoload)
1226 request_module("tda7432");
1227 }
1228
1229 if (bttv_tvcards[btv->type].needs_tvaudio) {
1230 if (autoload)
1231 request_module("tvaudio");
1232 }
1233
1234 if (bttv_tvcards[btv->type].tuner != -1) {
1235 if (autoload)
1236 request_module("tuner");
1237 }
1238 }
1239
1240
1241 /* ----------------------------------------------------------------------- */
1242 /* some hauppauge specific stuff */
1243
1244 static struct HAUPPAUGE_TUNER
1245 {
1246 int id;
1247 char *name;
1248 }
1249 hauppauge_tuner[] __devinitdata =
1250 {
1251 { TUNER_ABSENT, "" },
1252 { TUNER_ABSENT, "External" },
1253 { TUNER_ABSENT, "Unspecified" },
1254 { TUNER_PHILIPS_PAL, "Philips FI1216" },
1255 { TUNER_PHILIPS_SECAM, "Philips FI1216MF" },
1256 { TUNER_PHILIPS_NTSC, "Philips FI1236" },
1257 { TUNER_PHILIPS_PAL_I, "Philips FI1246" },
1258 { TUNER_PHILIPS_PAL_DK,"Philips FI1256" },
1259 { TUNER_PHILIPS_PAL, "Philips FI1216 MK2" },
1260 { TUNER_PHILIPS_SECAM, "Philips FI1216MF MK2" },
1261 { TUNER_PHILIPS_NTSC, "Philips FI1236 MK2" },
1262 { TUNER_PHILIPS_PAL_I, "Philips FI1246 MK2" },
1263 { TUNER_PHILIPS_PAL_DK,"Philips FI1256 MK2" },
1264 { TUNER_TEMIC_NTSC, "Temic 4032FY5" },
1265 { TUNER_TEMIC_PAL, "Temic 4002FH5" },
1266 { TUNER_TEMIC_PAL_I, "Temic 4062FY5" },
1267 { TUNER_PHILIPS_PAL, "Philips FR1216 MK2" },
1268 { TUNER_PHILIPS_SECAM, "Philips FR1216MF MK2" },
1269 { TUNER_PHILIPS_NTSC, "Philips FR1236 MK2" },
1270 { TUNER_PHILIPS_PAL_I, "Philips FR1246 MK2" },
1271 { TUNER_PHILIPS_PAL_DK,"Philips FR1256 MK2" },
1272 { TUNER_PHILIPS_PAL, "Philips FM1216" },
1273 { TUNER_PHILIPS_SECAM, "Philips FM1216MF" },
1274 { TUNER_PHILIPS_NTSC, "Philips FM1236" },
1275 { TUNER_PHILIPS_PAL_I, "Philips FM1246" },
1276 { TUNER_PHILIPS_PAL_DK,"Philips FM1256" },
1277 { TUNER_TEMIC_4036FY5_NTSC, "Temic 4036FY5" },
1278 { TUNER_ABSENT, "Samsung TCPN9082D" },
1279 { TUNER_ABSENT, "Samsung TCPM9092P" },
1280 { TUNER_TEMIC_4006FH5_PAL, "Temic 4006FH5" },
1281 { TUNER_ABSENT, "Samsung TCPN9085D" },
1282 { TUNER_ABSENT, "Samsung TCPB9085P" },
1283 { TUNER_ABSENT, "Samsung TCPL9091P" },
1284 { TUNER_TEMIC_4039FR5_NTSC, "Temic 4039FR5" },
1285 { TUNER_PHILIPS_FQ1216ME, "Philips FQ1216 ME" },
1286 { TUNER_TEMIC_4066FY5_PAL_I, "Temic 4066FY5" },
1287 { TUNER_ABSENT, "Philips TD1536" },
1288 { TUNER_ABSENT, "Philips TD1536D" },
1289 { TUNER_PHILIPS_NTSC, "Philips FMR1236" }, /* mono radio */
1290 { TUNER_ABSENT, "Philips FI1256MP" },
1291 { TUNER_ABSENT, "Samsung TCPQ9091P" },
1292 { TUNER_TEMIC_4006FN5_MULTI_PAL, "Temic 4006FN5" },
1293 { TUNER_TEMIC_4009FR5_PAL, "Temic 4009FR5" },
1294 { TUNER_TEMIC_4046FM5, "Temic 4046FM5" },
1295 { TUNER_TEMIC_4009FN5_MULTI_PAL_FM, "Temic 4009FN5" },
1296 { TUNER_ABSENT, "Philips TD1536D_FH_44"},
1297 { TUNER_LG_NTSC_FM, "LG TP18NSR01F"},
1298 { TUNER_LG_PAL_FM, "LG TP18PSB01D"},
1299 { TUNER_LG_PAL, "LG TP18PSB11D"},
1300 { TUNER_LG_PAL_I_FM, "LG TAPC-I001D"},
1301 { TUNER_LG_PAL_I, "LG TAPC-I701D"}
1302 };
1303
1304 static void __devinit hauppauge_eeprom(struct bttv *btv)
1305 {
1306 int blk2,tuner,radio,model;
1307
1308 if (eeprom_data[0] != 0x84 || eeprom_data[2] != 0)
1309 printk("bttv%d: Hauppauge eeprom: invalid\n",btv->nr);
1310
1311 /* Block 2 starts after len+3 bytes header */
1312 blk2 = eeprom_data[1] + 3;
1313
1314 /* decode + use some config infos */
1315 model = eeprom_data[12] << 8 | eeprom_data[11];
1316 tuner = eeprom_data[9];
1317 radio = eeprom_data[blk2-1] & 0x01;
1318
1319 if (tuner < sizeof(hauppauge_tuner)/sizeof(struct HAUPPAUGE_TUNER))
1320 btv->tuner_type = hauppauge_tuner[tuner].id;
1321 if (radio)
1322 btv->has_radio = 1;
1323
1324 if (bttv_verbose)
1325 printk("bttv%d: Hauppauge eeprom: model=%d, tuner=%s (%d), radio=%s\n",
1326 btv->nr, model, hauppauge_tuner[tuner].name,
1327 btv->tuner_type, radio ? "yes" : "no");
1328 }
1329
1330 void __devinit bttv_hauppauge_boot_msp34xx(struct bttv *btv)
1331 {
1332 /* reset/enable the MSP on some Hauppauge cards */
1333 /* Thanks to Kyösti Mälkki (kmalkki@cc.hut.fi)! */
1334 btaor(32, ~32, BT848_GPIO_OUT_EN);
1335 btaor(0, ~32, BT848_GPIO_DATA);
1336 udelay(2500);
1337 btaor(32, ~32, BT848_GPIO_DATA);
1338 if (bttv_gpio)
1339 bttv_gpio_tracking(btv,"msp34xx");
1340
1341 if (bttv_verbose)
1342 printk("bttv%d: Hauppauge msp34xx: reset line init\n",btv->nr);
1343 }
1344
1345
1346 /* ----------------------------------------------------------------------- */
1347 /* Imagenation L-Model PXC200 Framegrabber */
1348 /* This is basically the same procedure as
1349 * used by Alessandro Rubini in his pxc200
1350 * driver, but using BTTV functions */
1351
1352 static void __devinit init_PXC200(struct bttv *btv)
1353 {
1354 static const int vals[] = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d,
1355 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
1356 0x00 };
1357 int i,tmp;
1358
1359 /* Initialise GPIO-connevted stuff */
1360 btwrite(1<<13,BT848_GPIO_OUT_EN); /* Reset pin only */
1361 btwrite(0,BT848_GPIO_DATA);
1362 udelay(3);
1363 btwrite(1<<13,BT848_GPIO_DATA);
1364 /* GPIO inputs are pulled up, so no need to drive
1365 * reset pin any longer */
1366 btwrite(0,BT848_GPIO_OUT_EN);
1367 if (bttv_gpio)
1368 bttv_gpio_tracking(btv,"pxc200");
1369
1370 /* we could/should try and reset/control the AD pots? but
1371 right now we simply turned off the crushing. Without
1372 this the AGC drifts drifts
1373 remember the EN is reverse logic -->
1374 setting BT848_ADC_AGC_EN disable the AGC
1375 tboult@eecs.lehigh.edu
1376 */
1377 btwrite(BT848_ADC_RESERVED|BT848_ADC_AGC_EN, BT848_ADC);
1378
1379 /* Initialise MAX517 DAC */
1380 printk(KERN_INFO "Setting DAC reference voltage level ...\n");
1381 bttv_I2CWrite(btv,0x5E,0,0x80,1);
1382
1383 /* Initialise 12C508 PIC */
1384 /* The I2CWrite and I2CRead commmands are actually to the
1385 * same chips - but the R/W bit is included in the address
1386 * argument so the numbers are different */
1387
1388 printk(KERN_INFO "Initialising 12C508 PIC chip ...\n");
1389
1390 for (i = 0; i < sizeof(vals)/sizeof(int); i++) {
1391 tmp=bttv_I2CWrite(btv,0x1E,vals[i],0,1);
1392 printk(KERN_INFO "I2C Write(0x08) = %i\nI2C Read () = %x\n\n",
1393 tmp,bttv_I2CRead(btv,0x1F,NULL));
1394 }
1395 printk(KERN_INFO "PXC200 Initialised.\n");
1396 }
1397
1398 /* ----------------------------------------------------------------------- */
1399 /* Miro Pro radio stuff -- the tea5757 is connected to some GPIO ports */
1400 /*
1401 * Copyright (c) 1999 Csaba Halasz <qgehali@uni-miskolc.hu>
1402 * This code is placed under the terms of the GNU General Public License
1403 *
1404 * Brutally hacked by Dan Sheridan <dan.sheridan@contact.org.uk> djs52 8/3/00
1405 */
1406
1407 #if 0
1408 /* bus bits on the GPIO port */
1409 #define TEA_WE 6
1410 #define TEA_DATA 9
1411 #define TEA_CLK 8
1412 #define TEA_MOST 7
1413 #endif
1414
1415 #define BUS_LOW(bit) btand(~(bit), BT848_GPIO_DATA)
1416 #define BUS_HIGH(bit) btor((bit), BT848_GPIO_DATA)
1417 #define BUS_IN(bit) (btread(BT848_GPIO_DATA) & (bit))
1418
1419 /* TEA5757 register bits */
1420 #define TEA_FREQ 0:14
1421 #define TEA_BUFFER 15:15
1422
1423 #define TEA_SIGNAL_STRENGTH 16:17
1424
1425 #define TEA_PORT1 18:18
1426 #define TEA_PORT0 19:19
1427
1428 #define TEA_BAND 20:21
1429 #define TEA_BAND_FM 0
1430 #define TEA_BAND_MW 1
1431 #define TEA_BAND_LW 2
1432 #define TEA_BAND_SW 3
1433
1434 #define TEA_MONO 22:22
1435 #define TEA_ALLOW_STEREO 0
1436 #define TEA_FORCE_MONO 1
1437
1438 #define TEA_SEARCH_DIRECTION 23:23
1439 #define TEA_SEARCH_DOWN 0
1440 #define TEA_SEARCH_UP 1
1441
1442 #define TEA_STATUS 24:24
1443 #define TEA_STATUS_TUNED 0
1444 #define TEA_STATUS_SEARCHING 1
1445
1446 /* Low-level stuff */
1447 static int tea5757_read(struct bttv *btv)
1448 {
1449 int value = 0;
1450 long timeout;
1451 int i;
1452
1453 /* better safe than sorry */
1454 btaor((btv->mbox_clk | btv->mbox_we),
1455 ~btv->mbox_mask, BT848_GPIO_OUT_EN);
1456 if (bttv_gpio)
1457 bttv_gpio_tracking(btv,"tea5757 read");
1458
1459 BUS_LOW(btv->mbox_we);
1460 BUS_LOW(btv->mbox_clk);
1461
1462 udelay(10);
1463 for(timeout = jiffies + 10 * HZ;
1464 BUS_IN(btv->mbox_data) && time_before(jiffies, timeout);
1465 schedule()); /* 10 s */
1466 if (BUS_IN(btv->mbox_data)) {
1467 printk("bttv%d: tea5757: read timeout\n",btv->nr);
1468 return -1;
1469 }
1470 for(timeout = jiffies + HZ/5;
1471 BUS_IN(btv->mbox_data) == 1 && time_before(jiffies, timeout);
1472 schedule()); /* 0.2 s */
1473 dprintk("bttv%d: tea5757:",btv->nr);
1474 for(i = 0; i < 24; i++)
1475 {
1476 udelay(5);
1477 BUS_HIGH(btv->mbox_clk);
1478 udelay(5);
1479 dprintk("%c",(BUS_IN(btv->mbox_most) == 0)?'T':'-');
1480 BUS_LOW(btv->mbox_clk);
1481 value <<= 1;
1482 value |= (BUS_IN(btv->mbox_data) == 0)?0:1; /* MSB first */
1483 dprintk("%c", (BUS_IN(btv->mbox_most) == 0)?'S':'M');
1484 }
1485 dprintk("\nbttv%d: tea5757: read 0x%X\n", btv->nr, value);
1486 return value;
1487 }
1488
1489 static int tea5757_write(struct bttv *btv, int value)
1490 {
1491 int i;
1492 int reg = value;
1493
1494 btaor(btv->mbox_clk | btv->mbox_we | btv->mbox_data,
1495 ~btv->mbox_mask, BT848_GPIO_OUT_EN);
1496 if (bttv_gpio)
1497 bttv_gpio_tracking(btv,"tea5757 write");
1498 dprintk("bttv%d: tea5757: write 0x%X\n", btv->nr, value);
1499 BUS_LOW(btv->mbox_clk);
1500 BUS_HIGH(btv->mbox_we);
1501 for(i = 0; i < 25; i++)
1502 {
1503 if (reg & 0x1000000)
1504 BUS_HIGH(btv->mbox_data);
1505 else
1506 BUS_LOW(btv->mbox_data);
1507 reg <<= 1;
1508 BUS_HIGH(btv->mbox_clk);
1509 udelay(10);
1510 BUS_LOW(btv->mbox_clk);
1511 udelay(10);
1512 }
1513 BUS_LOW(btv->mbox_we); /* unmute !!! */
1514 return 0;
1515 }
1516
1517 void tea5757_set_freq(struct bttv *btv, unsigned short freq)
1518 {
1519 tea5757_write(btv, 5 * freq + 0x358); /* add 10.7MHz (see docs) */
1520 if (bttv_debug)
1521 tea5757_read(btv);
1522 }
1523
1524
1525 /* ----------------------------------------------------------------------- */
1526 /* winview */
1527
1528 void winview_audio(struct bttv *btv, struct video_audio *v, int set)
1529 {
1530 /* PT2254A programming Jon Tombs, jon@gte.esi.us.es */
1531 int bits_out, loops, vol, data;
1532
1533 if (!set) {
1534 /* Fixed by Leandro Lucarella <luca@linuxmendoza.org.ar (07/31/01) */
1535 v->flags |= VIDEO_AUDIO_VOLUME;
1536 return;
1537 }
1538
1539 /* 32 levels logarithmic */
1540 vol = 32 - ((v->volume>>11));
1541 /* units */
1542 bits_out = (PT2254_DBS_IN_2>>(vol%5));
1543 /* tens */
1544 bits_out |= (PT2254_DBS_IN_10>>(vol/5));
1545 bits_out |= PT2254_L_CHANNEL | PT2254_R_CHANNEL;
1546 data = btread(BT848_GPIO_DATA);
1547 data &= ~(WINVIEW_PT2254_CLK| WINVIEW_PT2254_DATA|
1548 WINVIEW_PT2254_STROBE);
1549 for (loops = 17; loops >= 0 ; loops--) {
1550 if (bits_out & (1<<loops))
1551 data |= WINVIEW_PT2254_DATA;
1552 else
1553 data &= ~WINVIEW_PT2254_DATA;
1554 btwrite(data, BT848_GPIO_DATA);
1555 udelay(5);
1556 data |= WINVIEW_PT2254_CLK;
1557 btwrite(data, BT848_GPIO_DATA);
1558 udelay(5);
1559 data &= ~WINVIEW_PT2254_CLK;
1560 btwrite(data, BT848_GPIO_DATA);
1561 }
1562 data |= WINVIEW_PT2254_STROBE;
1563 data &= ~WINVIEW_PT2254_DATA;
1564 btwrite(data, BT848_GPIO_DATA);
1565 udelay(10);
1566 data &= ~WINVIEW_PT2254_STROBE;
1567 btwrite(data, BT848_GPIO_DATA);
1568 }
1569
1570 /* ----------------------------------------------------------------------- */
1571 /* mono/stereo control for various cards (which don't use i2c chips but */
1572 /* connect something to the GPIO pins */
1573
1574 static void
1575 gvbctv3pci_audio(struct bttv *btv, struct video_audio *v, int set)
1576 {
1577 unsigned int con = 0;
1578
1579 if (set) {
1580 btor(0x300, BT848_GPIO_OUT_EN);
1581 if (v->mode & VIDEO_SOUND_LANG1)
1582 con = 0x000;
1583 if (v->mode & VIDEO_SOUND_LANG2)
1584 con = 0x300;
1585 if (v->mode & VIDEO_SOUND_STEREO)
1586 con = 0x200;
1587 // if (v->mode & VIDEO_SOUND_MONO)
1588 // con = 0x100;
1589 btaor(con, ~0x300, BT848_GPIO_DATA);
1590 } else {
1591 v->mode = VIDEO_SOUND_STEREO |
1592 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
1593 }
1594 }
1595
1596 /*
1597 * Mario Medina Nussbaum <medisoft@alohabbs.org.mx>
1598 * I discover that on BT848_GPIO_DATA address a byte 0xcce enable stereo,
1599 * 0xdde enables mono and 0xccd enables sap
1600 *
1601 * Petr Vandrovec <VANDROVE@vc.cvut.cz>
1602 * P.S.: At least mask in line above is wrong - GPIO pins 3,2 select
1603 * input/output sound connection, so both must be set for output mode.
1604 *
1605 * Looks like it's needed only for the "tvphone", the "tvphone 98"
1606 * handles this with a tda9840
1607 *
1608 */
1609 static void
1610 avermedia_tvphone_audio(struct bttv *btv, struct video_audio *v, int set)
1611 {
1612 int val = 0;
1613
1614 if (set) {
1615 if (v->mode & VIDEO_SOUND_LANG1) /* SAP */
1616 val = 0x02;
1617 if (v->mode & VIDEO_SOUND_STEREO)
1618 val = 0x01;
1619 if (val) {
1620 btaor(val, ~0x03, BT848_GPIO_DATA);
1621 if (bttv_gpio)
1622 bttv_gpio_tracking(btv,"avermedia");
1623 }
1624 } else {
1625 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
1626 VIDEO_SOUND_LANG1;
1627 return;
1628 }
1629 }
1630
1631 /* Lifetec 9415 handling */
1632 static void
1633 lt9415_audio(struct bttv *btv, struct video_audio *v, int set)
1634 {
1635 int val = 0;
1636
1637 if (btread(BT848_GPIO_DATA) & 0x4000) {
1638 v->mode = VIDEO_SOUND_MONO;
1639 return;
1640 }
1641
1642 if (set) {
1643 if (v->mode & VIDEO_SOUND_LANG2) /* A2 SAP */
1644 val = 0x0080;
1645 if (v->mode & VIDEO_SOUND_STEREO) /* A2 stereo */
1646 val = 0x0880;
1647 if ((v->mode & VIDEO_SOUND_LANG1) ||
1648 (v->mode & VIDEO_SOUND_MONO))
1649 val = 0;
1650 btaor(val, ~0x0880, BT848_GPIO_DATA);
1651 if (bttv_gpio)
1652 bttv_gpio_tracking(btv,"lt9415");
1653 } else {
1654 /* autodetect doesn't work with this card :-( */
1655 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
1656 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
1657 return;
1658 }
1659 }
1660
1661
1662 static void
1663 terratv_audio(struct bttv *btv, struct video_audio *v, int set)
1664 {
1665 unsigned int con = 0;
1666
1667 if (set) {
1668 btor(0x180000, BT848_GPIO_OUT_EN);
1669 if (v->mode & VIDEO_SOUND_LANG2)
1670 con = 0x080000;
1671 if (v->mode & VIDEO_SOUND_STEREO)
1672 con = 0x180000;
1673 btaor(con, ~0x180000, BT848_GPIO_DATA);
1674 if (bttv_gpio)
1675 bttv_gpio_tracking(btv,"terratv");
1676 } else {
1677 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
1678 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
1679 }
1680 }
1681
1682 static void
1683 winfast2000_audio(struct bttv *btv, struct video_audio *v, int set)
1684 {
1685 unsigned long val = 0;
1686
1687 if (set) {
1688 /*btor (0xc32000, BT848_GPIO_OUT_EN);*/
1689 if (v->mode & VIDEO_SOUND_MONO) /* Mono */
1690 val = 0x420000;
1691 if (v->mode & VIDEO_SOUND_LANG1) /* Mono */
1692 val = 0x420000;
1693 if (v->mode & VIDEO_SOUND_LANG2) /* SAP */
1694 val = 0x410000;
1695 if (v->mode & VIDEO_SOUND_STEREO) /* Stereo */
1696 val = 0x020000;
1697 if (val) {
1698 btaor(val, ~0x430000, BT848_GPIO_DATA);
1699 if (bttv_gpio)
1700 bttv_gpio_tracking(btv,"winfast2000");
1701 }
1702 } else {
1703 v->mode = VIDEO_SOUND_MONO | VIDEO_SOUND_STEREO |
1704 VIDEO_SOUND_LANG1 | VIDEO_SOUND_LANG2;
1705 }
1706 }
1707
1708 /* ----------------------------------------------------------------------- */
1709 /* motherboard chipset specific stuff */
1710
1711 void __devinit bttv_check_chipset(void)
1712 {
1713 int pcipci_fail = 0;
1714 struct pci_dev *dev = NULL;
1715
1716 /* for 2.4.x we'll use the pci quirks (drivers/pci/quirks.c) */
1717 if (pci_pci_problems & PCIPCI_FAIL)
1718 pcipci_fail = 1;
1719
1720 if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF))
1721 triton1 = 1;
1722 while ((dev = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576, dev)))
1723 vsfx = 1;
1724
1725 /* print warnings about quirks found */
1726 if (triton1)
1727 printk(KERN_INFO "bttv: Host bridge needs ETBF enabled.\n");
1728 if (vsfx)
1729 printk(KERN_INFO "bttv: Host bridge needs VSFX enabled.\n");
1730
1731 if (pcipci_fail) {
1732 printk(KERN_WARNING "bttv: BT848 and your chipset may not work together.\n");
1733 if (-1 == no_overlay) {
1734 printk(KERN_WARNING "bttv: going to disable overlay.\n");
1735 no_overlay = 1;
1736 }
1737 }
1738
1739 while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL,
1740 PCI_DEVICE_ID_INTEL_82441, dev))) {
1741 unsigned char b;
1742 pci_read_config_byte(dev, 0x53, &b);
1743 if (bttv_debug)
1744 printk(KERN_INFO "bttv: Host bridge: 82441FX Natoma, "
1745 "bufcon=0x%02x\n",b);
1746 }
1747
1748 }
1749
1750 int __devinit bttv_handle_chipset(struct bttv *btv)
1751 {
1752 unsigned char command;
1753
1754 if (!triton1 && !vsfx)
1755 return 0;
1756
1757 if (bttv_verbose) {
1758 if (triton1)
1759 printk("bttv%d: enabling ETBF (430FX/VP3 compatibilty)\n",btv->nr);
1760 if (vsfx && btv->id >= 878)
1761 printk("bttv%d: enabling VSFX\n",btv->nr);
1762 }
1763
1764 if (btv->id < 878) {
1765 /* bt848 (mis)uses a bit in the irq mask for etbf */
1766 if (triton1)
1767 btv->triton1 = BT848_INT_ETBF;
1768 } else {
1769 /* bt878 has a bit in the pci config space for it */
1770 pci_read_config_byte(btv->dev, BT878_DEVCTRL, &command);
1771 if (triton1)
1772 command |= BT878_EN_TBFX;
1773 if (vsfx)
1774 command |= BT878_EN_VSFX;
1775 pci_write_config_byte(btv->dev, BT878_DEVCTRL, command);
1776 }
1777 return 0;
1778 }
1779
1780
1781 /*
1782 * Local variables:
1783 * c-basic-offset: 8
1784 * End:
1785 */
1786