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