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