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