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