1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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
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 int terratec_active_radio_upgrade(struct bttv *btv);
77static int tea5757_read(struct bttv *btv);
78static int tea5757_write(struct bttv *btv, int value);
79static void identify_by_eeprom(struct bttv *btv,
80 unsigned char eeprom_data[256]);
81static int __devinit pvr_boot(struct bttv *btv);
82
83
84static unsigned int triton1;
85static unsigned int vsfx;
86static unsigned int latency = UNSET;
87int no_overlay=-1;
88
89static unsigned int card[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
90static unsigned int pll[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
91static unsigned int tuner[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
92static unsigned int svhs[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
93static unsigned int remote[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = UNSET };
94static struct bttv *master[BTTV_MAX] = { [ 0 ... (BTTV_MAX-1) ] = NULL };
95#ifdef MODULE
96static unsigned int autoload = 1;
97#else
98static unsigned int autoload;
99#endif
100static unsigned int gpiomask = UNSET;
101static unsigned int audioall = UNSET;
102static unsigned int audiomux[5] = { [ 0 ... 4 ] = UNSET };
103
104
105module_param(triton1, int, 0444);
106module_param(vsfx, int, 0444);
107module_param(no_overlay, int, 0444);
108module_param(latency, int, 0444);
109module_param(gpiomask, int, 0444);
110module_param(audioall, int, 0444);
111module_param(autoload, int, 0444);
112
113module_param_array(card, int, NULL, 0444);
114module_param_array(pll, int, NULL, 0444);
115module_param_array(tuner, int, NULL, 0444);
116module_param_array(svhs, int, NULL, 0444);
117module_param_array(remote, int, NULL, 0444);
118module_param_array(audiomux, int, NULL, 0444);
119
120MODULE_PARM_DESC(triton1,"set ETBF pci config bit "
121 "[enable bug compatibility for triton1 + others]");
122MODULE_PARM_DESC(vsfx,"set VSFX pci config bit "
123 "[yet another chipset flaw workaround]");
124MODULE_PARM_DESC(latency,"pci latency timer");
125MODULE_PARM_DESC(card,"specify TV/grabber card model, see CARDLIST file for a list");
126MODULE_PARM_DESC(pll,"specify installed crystal (0=none, 28=28 MHz, 35=35 MHz)");
127MODULE_PARM_DESC(tuner,"specify installed tuner type");
128MODULE_PARM_DESC(autoload,"automatically load i2c modules like tuner.o, default is 1 (yes)");
129MODULE_PARM_DESC(no_overlay,"allow override overlay default (0 disables, 1 enables)"
130 " [some VIA/SIS chipsets are known to have problem with overlay]");
131
132
133
134
135static struct CARD {
136 unsigned id;
137 int cardnr;
138 char *name;
139} cards[] __devinitdata = {
140 { 0x13eb0070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV" },
141 { 0x39000070, BTTV_BOARD_HAUPPAUGE878, "Hauppauge WinTV-D" },
142 { 0x45000070, BTTV_BOARD_HAUPPAUGEPVR, "Hauppauge WinTV/PVR" },
143 { 0xff000070, BTTV_BOARD_OSPREY1x0, "Osprey-100" },
144 { 0xff010070, BTTV_BOARD_OSPREY2x0_SVID,"Osprey-200" },
145 { 0xff020070, BTTV_BOARD_OSPREY500, "Osprey-500" },
146 { 0xff030070, BTTV_BOARD_OSPREY2000, "Osprey-2000" },
147 { 0xff040070, BTTV_BOARD_OSPREY540, "Osprey-540" },
148 { 0xff070070, BTTV_BOARD_OSPREY440, "Osprey-440" },
149
150 { 0x00011002, BTTV_BOARD_ATI_TVWONDER, "ATI TV Wonder" },
151 { 0x00031002, BTTV_BOARD_ATI_TVWONDERVE,"ATI TV Wonder/VE" },
152
153 { 0x6606107d, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" },
154 { 0x6607107d, BTTV_BOARD_WINFASTVC100, "Leadtek WinFast VC 100" },
155 { 0x6609107d, BTTV_BOARD_WINFAST2000, "Leadtek TV 2000 XP" },
156 { 0x263610b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" },
157 { 0x264510b4, BTTV_BOARD_STB2, "STB TV PCI FM, Gateway P/N 6000704" },
158 { 0x402010fc, BTTV_BOARD_GVBCTV3PCI, "I-O Data Co. GV-BCTV3/PCI" },
159 { 0x405010fc, BTTV_BOARD_GVBCTV4PCI, "I-O Data Co. GV-BCTV4/PCI" },
160 { 0x407010fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" },
161 { 0xd01810fc, BTTV_BOARD_GVBCTV5PCI, "I-O Data Co. GV-BCTV5/PCI" },
162
163 { 0x001211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" },
164
165 { 0x1200bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" },
166 { 0xff00bd11, BTTV_BOARD_PINNACLE, "Pinnacle PCTV [bswap]" },
167
168 { 0xff1211bd, BTTV_BOARD_PINNACLE, "Pinnacle PCTV" },
169
170 { 0x3000121a, BTTV_BOARD_VOODOOTV_200, "3Dfx VoodooTV 200" },
171 { 0x263710b4, BTTV_BOARD_VOODOOTV_FM, "3Dfx VoodooTV FM" },
172 { 0x3060121a, BTTV_BOARD_STB2, "3Dfx VoodooTV 100/ STB OEM" },
173
174 { 0x3000144f, BTTV_BOARD_MAGICTVIEW063, "(Askey Magic/others) TView99 CPH06x" },
175 { 0xa005144f, BTTV_BOARD_MAGICTVIEW063, "CPH06X TView99-Card" },
176 { 0x3002144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH05x" },
177 { 0x3005144f, BTTV_BOARD_MAGICTVIEW061, "(Askey Magic/others) TView99 CPH061/06L (T1/LC)" },
178 { 0x5000144f, BTTV_BOARD_MAGICTVIEW061, "Askey CPH050" },
179 { 0x300014ff, BTTV_BOARD_MAGICTVIEW061, "TView 99 (CPH061)" },
180 { 0x300214ff, BTTV_BOARD_PHOEBE_TVMAS, "Phoebe TV Master (CPH060)" },
181
182 { 0x00011461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" },
183 { 0x00021461, BTTV_BOARD_AVERMEDIA98, "AVermedia TVCapture 98" },
184 { 0x00031461, BTTV_BOARD_AVPHONE98, "AVerMedia TVPhone98" },
185 { 0x00041461, BTTV_BOARD_AVERMEDIA98, "AVerMedia TVCapture 98" },
186 { 0x03001461, BTTV_BOARD_AVERMEDIA98, "VDOMATE TV TUNER CARD" },
187
188 { 0x1117153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL B/G)" },
189 { 0x1118153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL B/G)" },
190 { 0x1119153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Philips PAL I)" },
191 { 0x111a153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (Temic PAL I)" },
192
193 { 0x1123153b, BTTV_BOARD_TERRATVRADIO, "Terratec TV Radio+" },
194 { 0x1127153b, BTTV_BOARD_TERRATV, "Terratec TV+ (V1.05)" },
195
196
197 { 0x1134153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue (LR102)" },
198 { 0x1135153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" },
199 { 0x5018153b, BTTV_BOARD_TERRATVALUE, "Terratec TValue" },
200 { 0xff3b153b, BTTV_BOARD_TERRATVALUER, "Terratec TValue Radio" },
201
202 { 0x400015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
203 { 0x400a15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV" },
204 { 0x400d15b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
205 { 0x401015b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
206 { 0x401615b0, BTTV_BOARD_ZOLTRIX_GENIE, "Zoltrix Genie TV / Radio" },
207
208 { 0x1430aa00, BTTV_BOARD_PV143, "Provideo PV143A" },
209 { 0x1431aa00, BTTV_BOARD_PV143, "Provideo PV143B" },
210 { 0x1432aa00, BTTV_BOARD_PV143, "Provideo PV143C" },
211 { 0x1433aa00, BTTV_BOARD_PV143, "Provideo PV143D" },
212 { 0x1433aa03, BTTV_BOARD_PV143, "Security Eyes" },
213
214 { 0x1460aa00, BTTV_BOARD_PV150, "Provideo PV150A-1" },
215 { 0x1461aa01, BTTV_BOARD_PV150, "Provideo PV150A-2" },
216 { 0x1462aa02, BTTV_BOARD_PV150, "Provideo PV150A-3" },
217 { 0x1463aa03, BTTV_BOARD_PV150, "Provideo PV150A-4" },
218
219 { 0x1464aa04, BTTV_BOARD_PV150, "Provideo PV150B-1" },
220 { 0x1465aa05, BTTV_BOARD_PV150, "Provideo PV150B-2" },
221 { 0x1466aa06, BTTV_BOARD_PV150, "Provideo PV150B-3" },
222 { 0x1467aa07, BTTV_BOARD_PV150, "Provideo PV150B-4" },
223
224 { 0xa132ff00, BTTV_BOARD_IVC100, "IVC-100" },
225 { 0xa1550000, BTTV_BOARD_IVC200, "IVC-200" },
226 { 0xa1550001, BTTV_BOARD_IVC200, "IVC-200" },
227 { 0xa1550002, BTTV_BOARD_IVC200, "IVC-200" },
228 { 0xa1550003, BTTV_BOARD_IVC200, "IVC-200" },
229 { 0xa1550100, BTTV_BOARD_IVC200, "IVC-200G" },
230 { 0xa1550101, BTTV_BOARD_IVC200, "IVC-200G" },
231 { 0xa1550102, BTTV_BOARD_IVC200, "IVC-200G" },
232 { 0xa1550103, BTTV_BOARD_IVC200, "IVC-200G" },
233 { 0xa182ff00, BTTV_BOARD_IVC120, "IVC-120G" },
234 { 0xa182ff01, BTTV_BOARD_IVC120, "IVC-120G" },
235 { 0xa182ff02, BTTV_BOARD_IVC120, "IVC-120G" },
236 { 0xa182ff03, BTTV_BOARD_IVC120, "IVC-120G" },
237 { 0xa182ff04, BTTV_BOARD_IVC120, "IVC-120G" },
238 { 0xa182ff05, BTTV_BOARD_IVC120, "IVC-120G" },
239 { 0xa182ff06, BTTV_BOARD_IVC120, "IVC-120G" },
240 { 0xa182ff07, BTTV_BOARD_IVC120, "IVC-120G" },
241 { 0xa182ff08, BTTV_BOARD_IVC120, "IVC-120G" },
242 { 0xa182ff09, BTTV_BOARD_IVC120, "IVC-120G" },
243 { 0xa182ff0a, BTTV_BOARD_IVC120, "IVC-120G" },
244 { 0xa182ff0b, BTTV_BOARD_IVC120, "IVC-120G" },
245 { 0xa182ff0c, BTTV_BOARD_IVC120, "IVC-120G" },
246 { 0xa182ff0d, BTTV_BOARD_IVC120, "IVC-120G" },
247 { 0xa182ff0e, BTTV_BOARD_IVC120, "IVC-120G" },
248 { 0xa182ff0f, BTTV_BOARD_IVC120, "IVC-120G" },
249
250 { 0x41424344, BTTV_BOARD_GRANDTEC, "GrandTec Multi Capture" },
251 { 0x01020304, BTTV_BOARD_XGUARD, "Grandtec Grand X-Guard" },
252
253 { 0x18501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },
254 { 0xa0501851, BTTV_BOARD_CHRONOS_VS2, "FlyVideo 98 (LR50)/ Chronos Video Shuttle II" },
255 { 0x18511851, BTTV_BOARD_FLYVIDEO98EZ, "FlyVideo 98EZ (LR51)/ CyberMail AV" },
256 { 0x18521852, BTTV_BOARD_TYPHOON_TVIEW, "FlyVideo 98FM (LR50)/ Typhoon TView TV/FM Tuner" },
257 { 0x41a0a051, BTTV_BOARD_FLYVIDEO_98FM, "Lifeview FlyVideo 98 LR50 Rev Q" },
258 { 0x18501f7f, BTTV_BOARD_FLYVIDEO_98, "Lifeview Flyvideo 98" },
259
260 { 0x010115cb, BTTV_BOARD_GMV1, "AG GMV1" },
261 { 0x010114c7, BTTV_BOARD_MODTEC_205, "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV" },
262
263 { 0x10b42636, BTTV_BOARD_HAUPPAUGE878, "STB ???" },
264 { 0x217d6606, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" },
265 { 0xfff6f6ff, BTTV_BOARD_WINFAST2000, "Leadtek WinFast TV 2000" },
266 { 0x03116000, BTTV_BOARD_SENSORAY311, "Sensoray 311" },
267 { 0x00790e11, BTTV_BOARD_WINDVR, "Canopus WinDVR PCI" },
268 { 0xa0fca1a0, BTTV_BOARD_ZOLTRIX, "Face to Face Tvmax" },
269 { 0x82b2aa6a, BTTV_BOARD_SIMUS_GVC1100, "SIMUS GVC1100" },
270 { 0x146caa0c, BTTV_BOARD_PV951, "ituner spectra8" },
271 { 0x200a1295, BTTV_BOARD_PXC200, "ImageNation PXC200A" },
272
273 { 0x40111554, BTTV_BOARD_PV_BT878P_9B, "Prolink Pixelview PV-BT" },
274 { 0x17de0a01, BTTV_BOARD_KWORLD, "Mecer TV/FM/Video Tuner" },
275
276 { 0x01051805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #1" },
277 { 0x01061805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #2" },
278 { 0x01071805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #3" },
279 { 0x01081805, BTTV_BOARD_PICOLO_TETRA_CHIP, "Picolo Tetra Chip #4" },
280
281 { 0x15409511, BTTV_BOARD_ACORP_Y878F, "Acorp Y878F" },
282
283 { 0x53534149, BTTV_BOARD_SSAI_SECURITY, "SSAI Security Video Interface" },
284 { 0x5353414a, BTTV_BOARD_SSAI_ULTRASOUND, "SSAI Ultrasound Video Interface" },
285
286
287
288
289
290
291
292
293 { 0x001c11bd, BTTV_BOARD_PINNACLESAT, "Pinnacle PCTV Sat" },
294 { 0x01010071, BTTV_BOARD_NEBULA_DIGITV, "Nebula Electronics DigiTV" },
295 { 0x20007063, BTTV_BOARD_PC_HDTV, "pcHDTV HD-2000 TV"},
296 { 0x002611bd, BTTV_BOARD_TWINHAN_DST, "Pinnacle PCTV SAT CI" },
297 { 0x00011822, BTTV_BOARD_TWINHAN_DST, "Twinhan VisionPlus DVB" },
298 { 0xfc00270f, BTTV_BOARD_TWINHAN_DST, "ChainTech digitop DST-1000 DVB-S" },
299 { 0x07711461, BTTV_BOARD_AVDVBT_771, "AVermedia AverTV DVB-T 771" },
300 { 0x07611461, BTTV_BOARD_AVDVBT_761, "AverMedia AverTV DVB-T 761" },
301 { 0xdb1018ac, BTTV_BOARD_DVICO_DVBT_LITE, "DViCO FusionHDTV DVB-T Lite" },
302 { 0xdb1118ac, BTTV_BOARD_DVICO_DVBT_LITE, "Ultraview DVB-T Lite" },
303 { 0xd50018ac, BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE, "DViCO FusionHDTV 5 Lite" },
304 { 0x00261822, BTTV_BOARD_TWINHAN_DST, "DNTV Live! Mini "},
305 { 0xd200dbc0, BTTV_BOARD_DVICO_FUSIONHDTV_2, "DViCO FusionHDTV 2" },
306 { 0x763c008a, BTTV_BOARD_GEOVISION_GV600, "GeoVision GV-600" },
307 { 0x18011000, BTTV_BOARD_ENLTV_FM_2, "Encore ENL TV-FM-2" },
308 { 0, -1, NULL }
309};
310
311
312
313
314struct tvcard bttv_tvcards[] = {
315
316 [BTTV_BOARD_UNKNOWN] = {
317 .name = " *** UNKNOWN/GENERIC *** ",
318 .video_inputs = 4,
319 .audio_inputs = 1,
320 .tuner = 0,
321 .svhs = 2,
322 .muxsel = { 2, 3, 1, 0 },
323 .tuner_type = UNSET,
324 .tuner_addr = ADDR_UNSET,
325 .radio_addr = ADDR_UNSET,
326 },
327 [BTTV_BOARD_MIRO] = {
328 .name = "MIRO PCTV",
329 .video_inputs = 4,
330 .audio_inputs = 1,
331 .tuner = 0,
332 .svhs = 2,
333 .gpiomask = 15,
334 .muxsel = { 2, 3, 1, 1 },
335 .gpiomux = { 2, 0, 0, 0 },
336 .gpiomute = 10,
337 .needs_tvaudio = 1,
338 .tuner_type = UNSET,
339 .tuner_addr = ADDR_UNSET,
340 .radio_addr = ADDR_UNSET,
341 },
342 [BTTV_BOARD_HAUPPAUGE] = {
343 .name = "Hauppauge (bt848)",
344 .video_inputs = 4,
345 .audio_inputs = 1,
346 .tuner = 0,
347 .svhs = 2,
348 .gpiomask = 7,
349 .muxsel = { 2, 3, 1, 1 },
350 .gpiomux = { 0, 1, 2, 3 },
351 .gpiomute = 4,
352 .needs_tvaudio = 1,
353 .tuner_type = UNSET,
354 .tuner_addr = ADDR_UNSET,
355 .radio_addr = ADDR_UNSET,
356 },
357 [BTTV_BOARD_STB] = {
358 .name = "STB, Gateway P/N 6000699 (bt848)",
359 .video_inputs = 3,
360 .audio_inputs = 1,
361 .tuner = 0,
362 .svhs = 2,
363 .gpiomask = 7,
364 .muxsel = { 2, 3, 1, 1 },
365 .gpiomux = { 4, 0, 2, 3 },
366 .gpiomute = 1,
367 .no_msp34xx = 1,
368 .needs_tvaudio = 1,
369 .tuner_type = TUNER_PHILIPS_NTSC,
370 .tuner_addr = ADDR_UNSET,
371 .radio_addr = ADDR_UNSET,
372 .pll = PLL_28,
373 .has_radio = 1,
374 },
375
376
377 [BTTV_BOARD_INTEL] = {
378 .name = "Intel Create and Share PCI/ Smart Video Recorder III",
379 .video_inputs = 4,
380 .audio_inputs = 0,
381 .tuner = UNSET,
382 .svhs = 2,
383 .gpiomask = 0,
384 .muxsel = { 2, 3, 1, 1 },
385 .gpiomux = { 0 },
386 .needs_tvaudio = 0,
387 .tuner_type = TUNER_ABSENT,
388 .tuner_addr = ADDR_UNSET,
389 .radio_addr = ADDR_UNSET,
390 },
391 [BTTV_BOARD_DIAMOND] = {
392 .name = "Diamond DTV2000",
393 .video_inputs = 4,
394 .audio_inputs = 1,
395 .tuner = 0,
396 .svhs = 2,
397 .gpiomask = 3,
398 .muxsel = { 2, 3, 1, 0 },
399 .gpiomux = { 0, 1, 0, 1 },
400 .gpiomute = 3,
401 .needs_tvaudio = 1,
402 .tuner_type = UNSET,
403 .tuner_addr = ADDR_UNSET,
404 .radio_addr = ADDR_UNSET,
405 },
406 [BTTV_BOARD_AVERMEDIA] = {
407 .name = "AVerMedia TVPhone",
408 .video_inputs = 3,
409 .audio_inputs = 1,
410 .tuner = 0,
411 .svhs = 3,
412 .muxsel = { 2, 3, 1, 1 },
413 .gpiomask = 0x0f,
414 .gpiomux = { 0x0c, 0x04, 0x08, 0x04 },
415
416 .needs_tvaudio = 1,
417 .tuner_type = UNSET,
418 .tuner_addr = ADDR_UNSET,
419 .radio_addr = ADDR_UNSET,
420 .audio_mode_gpio= avermedia_tvphone_audio,
421 .has_remote = 1,
422 },
423 [BTTV_BOARD_MATRIX_VISION] = {
424 .name = "MATRIX-Vision MV-Delta",
425 .video_inputs = 5,
426 .audio_inputs = 1,
427 .tuner = UNSET,
428 .svhs = 3,
429 .gpiomask = 0,
430 .muxsel = { 2, 3, 1, 0, 0 },
431 .gpiomux = { 0 },
432 .needs_tvaudio = 1,
433 .tuner_type = UNSET,
434 .tuner_addr = ADDR_UNSET,
435 .radio_addr = ADDR_UNSET,
436 },
437
438
439 [BTTV_BOARD_FLYVIDEO] = {
440 .name = "Lifeview FlyVideo II (Bt848) LR26 / MAXI TV Video PCI2 LR26",
441 .video_inputs = 4,
442 .audio_inputs = 1,
443 .tuner = 0,
444 .svhs = 2,
445 .gpiomask = 0xc00,
446 .muxsel = { 2, 3, 1, 1 },
447 .gpiomux = { 0, 0xc00, 0x800, 0x400 },
448 .gpiomute = 0xc00,
449 .needs_tvaudio = 1,
450 .pll = PLL_28,
451 .tuner_type = UNSET,
452 .tuner_addr = ADDR_UNSET,
453 .radio_addr = ADDR_UNSET,
454 },
455 [BTTV_BOARD_TURBOTV] = {
456 .name = "IMS/IXmicro TurboTV",
457 .video_inputs = 3,
458 .audio_inputs = 1,
459 .tuner = 0,
460 .svhs = 2,
461 .gpiomask = 3,
462 .muxsel = { 2, 3, 1, 1 },
463 .gpiomux = { 1, 1, 2, 3 },
464 .needs_tvaudio = 0,
465 .pll = PLL_28,
466 .tuner_type = TUNER_TEMIC_PAL,
467 .tuner_addr = ADDR_UNSET,
468 .radio_addr = ADDR_UNSET,
469 },
470 [BTTV_BOARD_HAUPPAUGE878] = {
471 .name = "Hauppauge (bt878)",
472 .video_inputs = 4,
473 .audio_inputs = 1,
474 .tuner = 0,
475 .svhs = 2,
476 .gpiomask = 0x0f,
477 .muxsel = { 2, 0, 1, 1 },
478 .gpiomux = { 0, 1, 2, 3 },
479 .gpiomute = 4,
480 .needs_tvaudio = 1,
481 .pll = PLL_28,
482 .tuner_type = UNSET,
483 .tuner_addr = ADDR_UNSET,
484 .radio_addr = ADDR_UNSET,
485 },
486 [BTTV_BOARD_MIROPRO] = {
487 .name = "MIRO PCTV pro",
488 .video_inputs = 3,
489 .audio_inputs = 1,
490 .tuner = 0,
491 .svhs = 2,
492 .gpiomask = 0x3014f,
493 .muxsel = { 2, 3, 1, 1 },
494 .gpiomux = { 0x20001,0x10001, 0, 0 },
495 .gpiomute = 10,
496 .needs_tvaudio = 1,
497 .tuner_type = UNSET,
498 .tuner_addr = ADDR_UNSET,
499 .radio_addr = ADDR_UNSET,
500 },
501
502
503 [BTTV_BOARD_ADSTECH_TV] = {
504 .name = "ADS Technologies Channel Surfer TV (bt848)",
505 .video_inputs = 3,
506 .audio_inputs = 1,
507 .tuner = 0,
508 .svhs = 2,
509 .gpiomask = 15,
510 .muxsel = { 2, 3, 1, 1 },
511 .gpiomux = { 13, 14, 11, 7 },
512 .needs_tvaudio = 1,
513 .tuner_type = UNSET,
514 .tuner_addr = ADDR_UNSET,
515 .radio_addr = ADDR_UNSET,
516 },
517 [BTTV_BOARD_AVERMEDIA98] = {
518 .name = "AVerMedia TVCapture 98",
519 .video_inputs = 3,
520 .audio_inputs = 4,
521 .tuner = 0,
522 .svhs = 2,
523 .gpiomask = 15,
524 .muxsel = { 2, 3, 1, 1 },
525 .gpiomux = { 13, 14, 11, 7 },
526 .needs_tvaudio = 1,
527 .msp34xx_alt = 1,
528 .pll = PLL_28,
529 .tuner_type = TUNER_PHILIPS_PAL,
530 .tuner_addr = ADDR_UNSET,
531 .radio_addr = ADDR_UNSET,
532 .audio_mode_gpio= avermedia_tv_stereo_audio,
533 .no_gpioirq = 1,
534 },
535 [BTTV_BOARD_VHX] = {
536 .name = "Aimslab Video Highway Xtreme (VHX)",
537 .video_inputs = 3,
538 .audio_inputs = 1,
539 .tuner = 0,
540 .svhs = 2,
541 .gpiomask = 7,
542 .muxsel = { 2, 3, 1, 1 },
543 .gpiomux = { 0, 2, 1, 3 },
544 .gpiomute = 4,
545 .needs_tvaudio = 1,
546 .pll = PLL_28,
547 .tuner_type = UNSET,
548 .tuner_addr = ADDR_UNSET,
549 .radio_addr = ADDR_UNSET,
550 },
551 [BTTV_BOARD_ZOLTRIX] = {
552 .name = "Zoltrix TV-Max",
553 .video_inputs = 3,
554 .audio_inputs = 1,
555 .tuner = 0,
556 .svhs = 2,
557 .gpiomask = 15,
558 .muxsel = { 2, 3, 1, 1 },
559 .gpiomux = { 0, 0, 1, 0 },
560 .gpiomute = 10,
561 .needs_tvaudio = 1,
562 .tuner_type = UNSET,
563 .tuner_addr = ADDR_UNSET,
564 .radio_addr = ADDR_UNSET,
565 },
566
567
568 [BTTV_BOARD_PIXVIEWPLAYTV] = {
569 .name = "Prolink Pixelview PlayTV (bt878)",
570 .video_inputs = 3,
571 .audio_inputs = 1,
572 .tuner = 0,
573 .svhs = 2,
574 .gpiomask = 0x01fe00,
575 .muxsel = { 2, 3, 1, 1 },
576
577 .gpiomux = { 0x001e00, 0, 0x018000, 0x014000 },
578 .gpiomute = 0x002000,
579 .needs_tvaudio = 1,
580 .pll = PLL_28,
581 .tuner_type = UNSET,
582 .tuner_addr = ADDR_UNSET,
583 .radio_addr = ADDR_UNSET,
584 },
585 [BTTV_BOARD_WINVIEW_601] = {
586 .name = "Leadtek WinView 601",
587 .video_inputs = 3,
588 .audio_inputs = 1,
589 .tuner = 0,
590 .svhs = 2,
591 .gpiomask = 0x8300f8,
592 .muxsel = { 2, 3, 1, 1,0 },
593 .gpiomux = { 0x4fa007,0xcfa007,0xcfa007,0xcfa007 },
594 .gpiomute = 0xcfa007,
595 .needs_tvaudio = 1,
596 .tuner_type = UNSET,
597 .tuner_addr = ADDR_UNSET,
598 .radio_addr = ADDR_UNSET,
599 .volume_gpio = winview_volume,
600 .has_radio = 1,
601 },
602 [BTTV_BOARD_AVEC_INTERCAP] = {
603 .name = "AVEC Intercapture",
604 .video_inputs = 3,
605 .audio_inputs = 2,
606 .tuner = 0,
607 .svhs = 2,
608 .gpiomask = 0,
609 .muxsel = { 2, 3, 1, 1 },
610 .gpiomux = { 1, 0, 0, 0 },
611 .needs_tvaudio = 1,
612 .tuner_type = UNSET,
613 .tuner_addr = ADDR_UNSET,
614 .radio_addr = ADDR_UNSET,
615 },
616 [BTTV_BOARD_LIFE_FLYKIT] = {
617 .name = "Lifeview FlyVideo II EZ /FlyKit LR38 Bt848 (capture only)",
618 .video_inputs = 4,
619 .audio_inputs = 1,
620 .tuner = UNSET,
621 .svhs = UNSET,
622 .gpiomask = 0x8dff00,
623 .muxsel = { 2, 3, 1, 1 },
624 .gpiomux = { 0 },
625 .no_msp34xx = 1,
626 .tuner_type = UNSET,
627 .tuner_addr = ADDR_UNSET,
628 .radio_addr = ADDR_UNSET,
629 },
630
631
632 [BTTV_BOARD_CEI_RAFFLES] = {
633 .name = "CEI Raffles Card",
634 .video_inputs = 3,
635 .audio_inputs = 3,
636 .tuner = 0,
637 .svhs = 2,
638 .muxsel = { 2, 3, 1, 1 },
639 .tuner_type = UNSET,
640 .tuner_addr = ADDR_UNSET,
641 .radio_addr = ADDR_UNSET,
642 },
643 [BTTV_BOARD_CONFERENCETV] = {
644 .name = "Lifeview FlyVideo 98/ Lucky Star Image World ConferenceTV LR50",
645 .video_inputs = 4,
646 .audio_inputs = 2,
647 .tuner = 0,
648 .svhs = 2,
649 .gpiomask = 0x1800,
650 .muxsel = { 2, 3, 1, 1 },
651 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },
652 .gpiomute = 0x1800,
653 .pll = PLL_28,
654 .tuner_type = TUNER_PHILIPS_PAL_I,
655 .tuner_addr = ADDR_UNSET,
656 .radio_addr = ADDR_UNSET,
657 },
658 [BTTV_BOARD_PHOEBE_TVMAS] = {
659 .name = "Askey CPH050/ Phoebe Tv Master + FM",
660 .video_inputs = 3,
661 .audio_inputs = 1,
662 .tuner = 0,
663 .svhs = 2,
664 .gpiomask = 0xc00,
665 .muxsel = { 2, 3, 1, 1 },
666 .gpiomux = { 0, 1, 0x800, 0x400 },
667 .gpiomute = 0xc00,
668 .needs_tvaudio = 1,
669 .pll = PLL_28,
670 .tuner_type = UNSET,
671 .tuner_addr = ADDR_UNSET,
672 .radio_addr = ADDR_UNSET,
673 },
674 [BTTV_BOARD_MODTEC_205] = {
675 .name = "Modular Technology MM201/MM202/MM205/MM210/MM215 PCTV, bt878",
676 .video_inputs = 3,
677 .audio_inputs = 1,
678 .tuner = 0,
679 .svhs = UNSET,
680 .gpiomask = 7,
681 .muxsel = { 2, 3, -1 },
682 .digital_mode = DIGITAL_MODE_CAMERA,
683 .gpiomux = { 0, 0, 0, 0 },
684 .no_msp34xx = 1,
685 .pll = PLL_28,
686 .tuner_type = TUNER_ALPS_TSBB5_PAL_I,
687 .tuner_addr = ADDR_UNSET,
688 .radio_addr = ADDR_UNSET,
689 },
690
691
692 [BTTV_BOARD_MAGICTVIEW061] = {
693 .name = "Askey CPH05X/06X (bt878) [many vendors]",
694 .video_inputs = 3,
695 .audio_inputs = 1,
696 .tuner = 0,
697 .svhs = 2,
698 .gpiomask = 0xe00,
699 .muxsel = { 2, 3, 1, 1 },
700 .gpiomux = {0x400, 0x400, 0x400, 0x400 },
701 .gpiomute = 0xc00,
702 .needs_tvaudio = 1,
703 .pll = PLL_28,
704 .tuner_type = UNSET,
705 .tuner_addr = ADDR_UNSET,
706 .radio_addr = ADDR_UNSET,
707 .has_remote = 1,
708 },
709 [BTTV_BOARD_VOBIS_BOOSTAR] = {
710 .name = "Terratec TerraTV+ Version 1.0 (Bt848)/ Terra TValue Version 1.0/ Vobis TV-Boostar",
711 .video_inputs = 3,
712 .audio_inputs = 1,
713 .tuner = 0,
714 .svhs = 2,
715 .gpiomask = 0x1f0fff,
716 .muxsel = { 2, 3, 1, 1 },
717 .gpiomux = { 0x20000, 0x30000, 0x10000, 0 },
718 .gpiomute = 0x40000,
719 .needs_tvaudio = 0,
720 .tuner_type = TUNER_PHILIPS_PAL,
721 .tuner_addr = ADDR_UNSET,
722 .radio_addr = ADDR_UNSET,
723 .audio_mode_gpio= terratv_audio,
724 },
725 [BTTV_BOARD_HAUPPAUG_WCAM] = {
726 .name = "Hauppauge WinCam newer (bt878)",
727 .video_inputs = 4,
728 .audio_inputs = 1,
729 .tuner = 0,
730 .svhs = 3,
731 .gpiomask = 7,
732 .muxsel = { 2, 0, 1, 1 },
733 .gpiomux = { 0, 1, 2, 3 },
734 .gpiomute = 4,
735 .needs_tvaudio = 1,
736 .tuner_type = UNSET,
737 .tuner_addr = ADDR_UNSET,
738 .radio_addr = ADDR_UNSET,
739 },
740 [BTTV_BOARD_MAXI] = {
741 .name = "Lifeview FlyVideo 98/ MAXI TV Video PCI2 LR50",
742 .video_inputs = 4,
743 .audio_inputs = 2,
744 .tuner = 0,
745 .svhs = 2,
746 .gpiomask = 0x1800,
747 .muxsel = { 2, 3, 1, 1 },
748 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },
749 .gpiomute = 0x1800,
750 .pll = PLL_28,
751 .tuner_type = TUNER_PHILIPS_SECAM,
752 .tuner_addr = ADDR_UNSET,
753 .radio_addr = ADDR_UNSET,
754 },
755
756
757 [BTTV_BOARD_TERRATV] = {
758 .name = "Terratec TerraTV+ Version 1.1 (bt878)",
759 .video_inputs = 3,
760 .audio_inputs = 1,
761 .tuner = 0,
762 .svhs = 2,
763 .gpiomask = 0x1f0fff,
764 .muxsel = { 2, 3, 1, 1 },
765 .gpiomux = { 0x20000, 0x30000, 0x10000, 0x00000 },
766 .gpiomute = 0x40000,
767 .needs_tvaudio = 0,
768 .tuner_type = TUNER_PHILIPS_PAL,
769 .tuner_addr = ADDR_UNSET,
770 .radio_addr = ADDR_UNSET,
771 .audio_mode_gpio= terratv_audio,
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803 },
804 [BTTV_BOARD_PXC200] = {
805
806 .name = "Imagenation PXC200",
807 .video_inputs = 5,
808 .audio_inputs = 1,
809 .tuner = UNSET,
810 .svhs = 1,
811 .gpiomask = 0,
812 .muxsel = { 2, 3, 1, 0, 0},
813 .gpiomux = { 0 },
814 .needs_tvaudio = 1,
815 .tuner_type = UNSET,
816 .tuner_addr = ADDR_UNSET,
817 .radio_addr = ADDR_UNSET,
818 .muxsel_hook = PXC200_muxsel,
819
820 },
821 [BTTV_BOARD_FLYVIDEO_98] = {
822 .name = "Lifeview FlyVideo 98 LR50",
823 .video_inputs = 4,
824 .audio_inputs = 1,
825 .tuner = 0,
826 .svhs = 2,
827 .gpiomask = 0x1800,
828 .muxsel = { 2, 3, 1, 1 },
829 .gpiomux = { 0, 0x0800, 0x1000, 0x1000 },
830 .gpiomute = 0x1800,
831 .pll = PLL_28,
832 .tuner_type = UNSET,
833 .tuner_addr = ADDR_UNSET,
834 .radio_addr = ADDR_UNSET,
835 },
836 [BTTV_BOARD_IPROTV] = {
837 .name = "Formac iProTV, Formac ProTV I (bt848)",
838 .video_inputs = 4,
839 .audio_inputs = 1,
840 .tuner = 0,
841 .svhs = 3,
842 .gpiomask = 1,
843 .muxsel = { 2, 3, 1, 1 },
844 .gpiomux = { 1, 0, 0, 0 },
845 .pll = PLL_28,
846 .tuner_type = TUNER_PHILIPS_PAL,
847 .tuner_addr = ADDR_UNSET,
848 .radio_addr = ADDR_UNSET,
849 },
850
851
852 [BTTV_BOARD_INTEL_C_S_PCI] = {
853 .name = "Intel Create and Share PCI/ Smart Video Recorder III",
854 .video_inputs = 4,
855 .audio_inputs = 0,
856 .tuner = UNSET,
857 .svhs = 2,
858 .gpiomask = 0,
859 .muxsel = { 2, 3, 1, 1 },
860 .gpiomux = { 0 },
861 .needs_tvaudio = 0,
862 .tuner_type = TUNER_ABSENT,
863 .tuner_addr = ADDR_UNSET,
864 .radio_addr = ADDR_UNSET,
865 },
866 [BTTV_BOARD_TERRATVALUE] = {
867 .name = "Terratec TerraTValue Version Bt878",
868 .video_inputs = 3,
869 .audio_inputs = 1,
870 .tuner = 0,
871 .svhs = 2,
872 .gpiomask = 0xffff00,
873 .muxsel = { 2, 3, 1, 1 },
874 .gpiomux = { 0x500, 0, 0x300, 0x900 },
875 .gpiomute = 0x900,
876 .needs_tvaudio = 1,
877 .pll = PLL_28,
878 .tuner_type = TUNER_PHILIPS_PAL,
879 .tuner_addr = ADDR_UNSET,
880 .radio_addr = ADDR_UNSET,
881 },
882 [BTTV_BOARD_WINFAST2000] = {
883 .name = "Leadtek WinFast 2000/ WinFast 2000 XP",
884 .video_inputs = 4,
885 .audio_inputs = 1,
886 .tuner = 0,
887 .svhs = 2,
888 .muxsel = { 2, 3, 1, 1, 0 },
889
890 .gpiomask = 0xb33000,
891 .gpiomux = { 0x122000,0x1000,0x0000,0x620000 },
892 .gpiomute = 0x800000,
893
894
895
896
897
898
899
900
901
902
903
904 .needs_tvaudio = 0,
905 .pll = PLL_28,
906 .has_radio = 1,
907 .tuner_type = TUNER_PHILIPS_PAL,
908 .tuner_addr = ADDR_UNSET,
909 .radio_addr = ADDR_UNSET,
910 .audio_mode_gpio= winfast2000_audio,
911 .has_remote = 1,
912 },
913 [BTTV_BOARD_CHRONOS_VS2] = {
914 .name = "Lifeview FlyVideo 98 LR50 / Chronos Video Shuttle II",
915 .video_inputs = 4,
916 .audio_inputs = 3,
917 .tuner = 0,
918 .svhs = 2,
919 .gpiomask = 0x1800,
920 .muxsel = { 2, 3, 1, 1 },
921 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },
922 .gpiomute = 0x1800,
923 .pll = PLL_28,
924 .tuner_type = UNSET,
925 .tuner_addr = ADDR_UNSET,
926 .radio_addr = ADDR_UNSET,
927 },
928
929
930 [BTTV_BOARD_TYPHOON_TVIEW] = {
931 .name = "Lifeview FlyVideo 98FM LR50 / Typhoon TView TV/FM Tuner",
932 .video_inputs = 4,
933 .audio_inputs = 3,
934 .tuner = 0,
935 .svhs = 2,
936 .gpiomask = 0x1800,
937 .muxsel = { 2, 3, 1, 1 },
938 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },
939 .gpiomute = 0x1800,
940 .pll = PLL_28,
941 .tuner_type = UNSET,
942 .tuner_addr = ADDR_UNSET,
943 .radio_addr = ADDR_UNSET,
944 .has_radio = 1,
945 },
946 [BTTV_BOARD_PXELVWPLTVPRO] = {
947 .name = "Prolink PixelView PlayTV pro",
948 .video_inputs = 3,
949 .audio_inputs = 1,
950 .tuner = 0,
951 .svhs = 2,
952 .gpiomask = 0xff,
953 .muxsel = { 2, 3, 1, 1 },
954 .gpiomux = { 0x21, 0x20, 0x24, 0x2c },
955 .gpiomute = 0x29,
956 .no_msp34xx = 1,
957 .pll = PLL_28,
958 .tuner_type = UNSET,
959 .tuner_addr = ADDR_UNSET,
960 .radio_addr = ADDR_UNSET,
961 },
962 [BTTV_BOARD_MAGICTVIEW063] = {
963 .name = "Askey CPH06X TView99",
964 .video_inputs = 4,
965 .audio_inputs = 1,
966 .tuner = 0,
967 .svhs = 2,
968 .gpiomask = 0x551e00,
969 .muxsel = { 2, 3, 1, 0 },
970 .gpiomux = { 0x551400, 0x551200, 0, 0 },
971 .gpiomute = 0x551c00,
972 .needs_tvaudio = 1,
973 .pll = PLL_28,
974 .tuner_type = TUNER_PHILIPS_PAL_I,
975 .tuner_addr = ADDR_UNSET,
976 .radio_addr = ADDR_UNSET,
977 .has_remote = 1,
978 },
979 [BTTV_BOARD_PINNACLE] = {
980 .name = "Pinnacle PCTV Studio/Rave",
981 .video_inputs = 3,
982 .audio_inputs = 1,
983 .tuner = 0,
984 .svhs = 2,
985 .gpiomask = 0x03000F,
986 .muxsel = { 2, 3, 1, 1 },
987 .gpiomux = { 2, 0xd0001, 0, 0 },
988 .gpiomute = 1,
989 .needs_tvaudio = 0,
990 .pll = PLL_28,
991 .tuner_type = UNSET,
992 .tuner_addr = ADDR_UNSET,
993 .radio_addr = ADDR_UNSET,
994 },
995
996
997 [BTTV_BOARD_STB2] = {
998 .name = "STB TV PCI FM, Gateway P/N 6000704 (bt878), 3Dfx VoodooTV 100",
999 .video_inputs = 3,
1000 .audio_inputs = 1,
1001 .tuner = 0,
1002 .svhs = 2,
1003 .gpiomask = 7,
1004 .muxsel = { 2, 3, 1, 1 },
1005 .gpiomux = { 4, 0, 2, 3 },
1006 .gpiomute = 1,
1007 .no_msp34xx = 1,
1008 .needs_tvaudio = 1,
1009 .tuner_type = TUNER_PHILIPS_NTSC,
1010 .tuner_addr = ADDR_UNSET,
1011 .radio_addr = ADDR_UNSET,
1012 .pll = PLL_28,
1013 .has_radio = 1,
1014 },
1015 [BTTV_BOARD_AVPHONE98] = {
1016 .name = "AVerMedia TVPhone 98",
1017 .video_inputs = 3,
1018 .audio_inputs = 4,
1019 .tuner = 0,
1020 .svhs = 2,
1021 .gpiomask = 15,
1022 .muxsel = { 2, 3, 1, 1 },
1023 .gpiomux = { 13, 4, 11, 7 },
1024 .needs_tvaudio = 1,
1025 .pll = PLL_28,
1026 .tuner_type = UNSET,
1027 .tuner_addr = ADDR_UNSET,
1028 .radio_addr = ADDR_UNSET,
1029 .has_radio = 1,
1030 .audio_mode_gpio= avermedia_tvphone_audio,
1031 },
1032 [BTTV_BOARD_PV951] = {
1033 .name = "ProVideo PV951",
1034 .video_inputs = 3,
1035 .audio_inputs = 1,
1036 .tuner = 0,
1037 .svhs = 2,
1038 .gpiomask = 0,
1039 .muxsel = { 2, 3, 1, 1},
1040 .gpiomux = { 0, 0, 0, 0},
1041 .needs_tvaudio = 1,
1042 .no_msp34xx = 1,
1043 .pll = PLL_28,
1044 .tuner_type = TUNER_PHILIPS_PAL_I,
1045 .tuner_addr = ADDR_UNSET,
1046 .radio_addr = ADDR_UNSET,
1047 },
1048 [BTTV_BOARD_ONAIR_TV] = {
1049 .name = "Little OnAir TV",
1050 .video_inputs = 3,
1051 .audio_inputs = 1,
1052 .tuner = 0,
1053 .svhs = 2,
1054 .gpiomask = 0xe00b,
1055 .muxsel = { 2, 3, 1, 1 },
1056 .gpiomux = { 0xff9ff6, 0xff9ff6, 0xff1ff7, 0 },
1057 .gpiomute = 0xff3ffc,
1058 .no_msp34xx = 1,
1059 .tuner_type = UNSET,
1060 .tuner_addr = ADDR_UNSET,
1061 .radio_addr = ADDR_UNSET,
1062 },
1063
1064
1065 [BTTV_BOARD_SIGMA_TVII_FM] = {
1066 .name = "Sigma TVII-FM",
1067 .video_inputs = 2,
1068 .audio_inputs = 1,
1069 .tuner = 0,
1070 .svhs = UNSET,
1071 .gpiomask = 3,
1072 .muxsel = { 2, 3, 1, 1 },
1073 .gpiomux = { 1, 1, 0, 2 },
1074 .gpiomute = 3,
1075 .no_msp34xx = 1,
1076 .pll = PLL_NONE,
1077 .tuner_type = UNSET,
1078 .tuner_addr = ADDR_UNSET,
1079 .radio_addr = ADDR_UNSET,
1080 },
1081 [BTTV_BOARD_MATRIX_VISION2] = {
1082 .name = "MATRIX-Vision MV-Delta 2",
1083 .video_inputs = 5,
1084 .audio_inputs = 1,
1085 .tuner = UNSET,
1086 .svhs = 3,
1087 .gpiomask = 0,
1088 .muxsel = { 2, 3, 1, 0, 0 },
1089 .gpiomux = { 0 },
1090 .no_msp34xx = 1,
1091 .pll = PLL_28,
1092 .tuner_type = UNSET,
1093 .tuner_addr = ADDR_UNSET,
1094 .radio_addr = ADDR_UNSET,
1095 },
1096 [BTTV_BOARD_ZOLTRIX_GENIE] = {
1097 .name = "Zoltrix Genie TV/FM",
1098 .video_inputs = 3,
1099 .audio_inputs = 1,
1100 .tuner = 0,
1101 .svhs = 2,
1102 .gpiomask = 0xbcf03f,
1103 .muxsel = { 2, 3, 1, 1 },
1104 .gpiomux = { 0xbc803f, 0xbc903f, 0xbcb03f, 0 },
1105 .gpiomute = 0xbcb03f,
1106 .no_msp34xx = 1,
1107 .pll = PLL_28,
1108 .tuner_type = TUNER_TEMIC_4039FR5_NTSC,
1109 .tuner_addr = ADDR_UNSET,
1110 .radio_addr = ADDR_UNSET,
1111 },
1112 [BTTV_BOARD_TERRATVRADIO] = {
1113 .name = "Terratec TV/Radio+",
1114 .video_inputs = 3,
1115 .audio_inputs = 1,
1116 .tuner = 0,
1117 .svhs = 2,
1118 .gpiomask = 0x70000,
1119 .muxsel = { 2, 3, 1, 1 },
1120 .gpiomux = { 0x20000, 0x30000, 0x10000, 0 },
1121 .gpiomute = 0x40000,
1122 .needs_tvaudio = 1,
1123 .no_msp34xx = 1,
1124 .pll = PLL_35,
1125 .tuner_type = TUNER_PHILIPS_PAL_I,
1126 .tuner_addr = ADDR_UNSET,
1127 .radio_addr = ADDR_UNSET,
1128 .has_radio = 1,
1129 },
1130
1131
1132 [BTTV_BOARD_DYNALINK] = {
1133 .name = "Askey CPH03x/ Dynalink Magic TView",
1134 .video_inputs = 3,
1135 .audio_inputs = 1,
1136 .tuner = 0,
1137 .svhs = 2,
1138 .gpiomask = 15,
1139 .muxsel = { 2, 3, 1, 1 },
1140 .gpiomux = {2,0,0,0 },
1141 .gpiomute = 1,
1142 .needs_tvaudio = 1,
1143 .pll = PLL_28,
1144 .tuner_type = UNSET,
1145 .tuner_addr = ADDR_UNSET,
1146 .radio_addr = ADDR_UNSET,
1147 },
1148 [BTTV_BOARD_GVBCTV3PCI] = {
1149 .name = "IODATA GV-BCTV3/PCI",
1150 .video_inputs = 3,
1151 .audio_inputs = 1,
1152 .tuner = 0,
1153 .svhs = 2,
1154 .gpiomask = 0x010f00,
1155 .muxsel = {2, 3, 0, 0 },
1156 .gpiomux = {0x10000, 0, 0x10000, 0 },
1157 .no_msp34xx = 1,
1158 .pll = PLL_28,
1159 .tuner_type = TUNER_ALPS_TSHC6_NTSC,
1160 .tuner_addr = ADDR_UNSET,
1161 .radio_addr = ADDR_UNSET,
1162 .audio_mode_gpio= gvbctv3pci_audio,
1163 },
1164 [BTTV_BOARD_PXELVWPLTVPAK] = {
1165 .name = "Prolink PV-BT878P+4E / PixelView PlayTV PAK / Lenco MXTV-9578 CP",
1166 .video_inputs = 5,
1167 .audio_inputs = 1,
1168 .tuner = 0,
1169 .svhs = 3,
1170 .gpiomask = 0xAA0000,
1171 .muxsel = { 2,3,1,1,-1 },
1172 .digital_mode = DIGITAL_MODE_CAMERA,
1173 .gpiomux = { 0x20000, 0, 0x80000, 0x80000 },
1174 .gpiomute = 0xa8000,
1175 .no_msp34xx = 1,
1176 .pll = PLL_28,
1177 .tuner_type = TUNER_PHILIPS_PAL_I,
1178 .tuner_addr = ADDR_UNSET,
1179 .radio_addr = ADDR_UNSET,
1180 .has_remote = 1,
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190 },
1191 [BTTV_BOARD_EAGLE] = {
1192 .name = "Eagle Wireless Capricorn2 (bt878A)",
1193 .video_inputs = 4,
1194 .audio_inputs = 1,
1195 .tuner = 0,
1196 .svhs = 2,
1197 .gpiomask = 7,
1198 .muxsel = { 2, 0, 1, 1 },
1199 .gpiomux = { 0, 1, 2, 3 },
1200 .gpiomute = 4,
1201 .pll = PLL_28,
1202 .tuner_type = UNSET ,
1203 .tuner_addr = ADDR_UNSET,
1204 .radio_addr = ADDR_UNSET,
1205 },
1206
1207
1208 [BTTV_BOARD_PINNACLEPRO] = {
1209
1210 .name = "Pinnacle PCTV Studio Pro",
1211 .video_inputs = 4,
1212 .audio_inputs = 1,
1213 .tuner = 0,
1214 .svhs = 3,
1215 .gpiomask = 0x03000F,
1216 .muxsel = { 2, 3, 1, 1 },
1217 .gpiomux = { 1, 0xd0001, 0, 0 },
1218 .gpiomute = 10,
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228 .needs_tvaudio = 0,
1229 .pll = PLL_28,
1230 .tuner_type = UNSET,
1231 .tuner_addr = ADDR_UNSET,
1232 .radio_addr = ADDR_UNSET,
1233 },
1234 [BTTV_BOARD_TVIEW_RDS_FM] = {
1235
1236
1237 .name = "Typhoon TView RDS + FM Stereo / KNC1 TV Station RDS",
1238 .video_inputs = 4,
1239 .audio_inputs = 3,
1240 .tuner = 0,
1241 .svhs = 2,
1242 .gpiomask = 0x1c,
1243 .muxsel = { 2, 3, 1, 1 },
1244 .gpiomux = { 0, 0, 0x10, 8 },
1245 .gpiomute = 4,
1246 .needs_tvaudio = 1,
1247 .pll = PLL_28,
1248 .tuner_type = TUNER_PHILIPS_PAL,
1249 .tuner_addr = ADDR_UNSET,
1250 .radio_addr = ADDR_UNSET,
1251 .has_radio = 1,
1252 },
1253 [BTTV_BOARD_LIFETEC_9415] = {
1254
1255
1256
1257
1258
1259 .name = "Lifeview FlyVideo 2000 /FlyVideo A2/ Lifetec LT 9415 TV [LR90]",
1260 .video_inputs = 4,
1261 .audio_inputs = 1,
1262 .tuner = 0,
1263 .svhs = 2,
1264 .gpiomask = 0x18e0,
1265 .muxsel = { 2, 3, 1, 1 },
1266 .gpiomux = { 0x0000,0x0800,0x1000,0x1000 },
1267 .gpiomute = 0x18e0,
1268
1269
1270
1271
1272 .pll = PLL_28,
1273 .tuner_type = UNSET,
1274 .tuner_addr = ADDR_UNSET,
1275 .radio_addr = ADDR_UNSET,
1276 },
1277 [BTTV_BOARD_BESTBUY_EASYTV] = {
1278
1279
1280 .name = "Askey CPH031/ BESTBUY Easy TV",
1281 .video_inputs = 4,
1282 .audio_inputs = 1,
1283 .tuner = 0,
1284 .svhs = 2,
1285 .gpiomask = 0xF,
1286 .muxsel = { 2, 3, 1, 0 },
1287 .gpiomux = { 2, 0, 0, 0 },
1288 .gpiomute = 10,
1289 .needs_tvaudio = 0,
1290 .pll = PLL_28,
1291 .tuner_type = TUNER_TEMIC_PAL,
1292 .tuner_addr = ADDR_UNSET,
1293 .radio_addr = ADDR_UNSET,
1294 },
1295
1296
1297 [BTTV_BOARD_FLYVIDEO_98FM] = {
1298
1299 .name = "Lifeview FlyVideo 98FM LR50",
1300 .video_inputs = 4,
1301 .audio_inputs = 3,
1302 .tuner = 0,
1303 .svhs = 2,
1304 .gpiomask = 0x1800,
1305 .muxsel = { 2, 3, 1, 1 },
1306 .gpiomux = { 0, 0x800, 0x1000, 0x1000 },
1307 .gpiomute = 0x1800,
1308 .pll = PLL_28,
1309 .tuner_type = TUNER_PHILIPS_PAL,
1310 .tuner_addr = ADDR_UNSET,
1311 .radio_addr = ADDR_UNSET,
1312 },
1313
1314
1315
1316 [BTTV_BOARD_GRANDTEC] = {
1317 .name = "GrandTec 'Grand Video Capture' (Bt848)",
1318 .video_inputs = 2,
1319 .audio_inputs = 0,
1320 .tuner = UNSET,
1321 .svhs = 1,
1322 .gpiomask = 0,
1323 .muxsel = { 3, 1 },
1324 .gpiomux = { 0 },
1325 .needs_tvaudio = 0,
1326 .no_msp34xx = 1,
1327 .pll = PLL_35,
1328 .tuner_type = UNSET,
1329 .tuner_addr = ADDR_UNSET,
1330 .radio_addr = ADDR_UNSET,
1331 },
1332 [BTTV_BOARD_ASKEY_CPH060] = {
1333
1334 .name = "Askey CPH060/ Phoebe TV Master Only (No FM)",
1335 .video_inputs = 3,
1336 .audio_inputs = 1,
1337 .tuner = 0,
1338 .svhs = 2,
1339 .gpiomask = 0xe00,
1340 .muxsel = { 2, 3, 1, 1},
1341 .gpiomux = { 0x400, 0x400, 0x400, 0x400 },
1342 .gpiomute = 0x800,
1343 .needs_tvaudio = 1,
1344 .pll = PLL_28,
1345 .tuner_type = TUNER_TEMIC_4036FY5_NTSC,
1346 .tuner_addr = ADDR_UNSET,
1347 .radio_addr = ADDR_UNSET,
1348 },
1349 [BTTV_BOARD_ASKEY_CPH03X] = {
1350
1351 .name = "Askey CPH03x TV Capturer",
1352 .video_inputs = 4,
1353 .audio_inputs = 1,
1354 .tuner = 0,
1355 .svhs = 2,
1356 .gpiomask = 0x03000F,
1357 .muxsel = { 2, 3, 1, 0 },
1358 .gpiomux = { 2, 0, 0, 0 },
1359 .gpiomute = 1,
1360 .pll = PLL_28,
1361 .tuner_type = TUNER_TEMIC_PAL,
1362 .tuner_addr = ADDR_UNSET,
1363 .radio_addr = ADDR_UNSET,
1364 },
1365
1366
1367 [BTTV_BOARD_MM100PCTV] = {
1368
1369 .name = "Modular Technology MM100PCTV",
1370 .video_inputs = 2,
1371 .audio_inputs = 2,
1372 .tuner = 0,
1373 .svhs = UNSET,
1374 .gpiomask = 11,
1375 .muxsel = { 2, 3, 1, 1 },
1376 .gpiomux = { 2, 0, 0, 1 },
1377 .gpiomute = 8,
1378 .pll = PLL_35,
1379 .tuner_type = TUNER_TEMIC_PAL,
1380 .tuner_addr = ADDR_UNSET,
1381 .radio_addr = ADDR_UNSET,
1382 },
1383 [BTTV_BOARD_GMV1] = {
1384
1385 .name = "AG Electronics GMV1",
1386 .video_inputs = 2,
1387 .audio_inputs = 0,
1388 .tuner = UNSET,
1389 .svhs = 1,
1390 .gpiomask = 0xF,
1391 .muxsel = { 2, 2 },
1392 .gpiomux = { },
1393 .no_msp34xx = 1,
1394 .needs_tvaudio = 0,
1395 .pll = PLL_28,
1396 .tuner_type = UNSET,
1397 .tuner_addr = ADDR_UNSET,
1398 .radio_addr = ADDR_UNSET,
1399 },
1400 [BTTV_BOARD_BESTBUY_EASYTV2] = {
1401
1402
1403
1404 .name = "Askey CPH061/ BESTBUY Easy TV (bt878)",
1405 .video_inputs = 3,
1406 .audio_inputs = 2,
1407 .tuner = 0,
1408 .svhs = 2,
1409 .gpiomask = 0xFF,
1410 .muxsel = { 2, 3, 1, 0 },
1411 .gpiomux = { 1, 0, 4, 4 },
1412 .gpiomute = 9,
1413 .needs_tvaudio = 0,
1414 .pll = PLL_28,
1415 .tuner_type = TUNER_PHILIPS_PAL,
1416 .tuner_addr = ADDR_UNSET,
1417 .radio_addr = ADDR_UNSET,
1418 },
1419 [BTTV_BOARD_ATI_TVWONDER] = {
1420
1421 .name = "ATI TV-Wonder",
1422 .video_inputs = 3,
1423 .audio_inputs = 1,
1424 .tuner = 0,
1425 .svhs = 2,
1426 .gpiomask = 0xf03f,
1427 .muxsel = { 2, 3, 1, 0 },
1428 .gpiomux = { 0xbffe, 0, 0xbfff, 0 },
1429 .gpiomute = 0xbffe,
1430 .pll = PLL_28,
1431 .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL,
1432 .tuner_addr = ADDR_UNSET,
1433 .radio_addr = ADDR_UNSET,
1434 },
1435
1436
1437 [BTTV_BOARD_ATI_TVWONDERVE] = {
1438
1439 .name = "ATI TV-Wonder VE",
1440 .video_inputs = 2,
1441 .audio_inputs = 1,
1442 .tuner = 0,
1443 .svhs = UNSET,
1444 .gpiomask = 1,
1445 .muxsel = { 2, 3, 0, 1 },
1446 .gpiomux = { 0, 0, 1, 0 },
1447 .no_msp34xx = 1,
1448 .pll = PLL_28,
1449 .tuner_type = TUNER_TEMIC_4006FN5_MULTI_PAL,
1450 .tuner_addr = ADDR_UNSET,
1451 .radio_addr = ADDR_UNSET,
1452 },
1453 [BTTV_BOARD_FLYVIDEO2000] = {
1454
1455 .name = "Lifeview FlyVideo 2000S LR90",
1456 .video_inputs = 3,
1457 .audio_inputs = 3,
1458 .tuner = 0,
1459 .svhs = 2,
1460 .gpiomask = 0x18e0,
1461 .muxsel = { 2, 3, 0, 1 },
1462
1463
1464
1465 .gpiomux = { 0x0000,0x0800,0x1000,0x1000 },
1466 .gpiomute = 0x1800,
1467 .audio_mode_gpio= fv2000s_audio,
1468 .no_msp34xx = 1,
1469 .no_tda9875 = 1,
1470 .needs_tvaudio = 1,
1471 .pll = PLL_28,
1472 .tuner_type = TUNER_PHILIPS_PAL,
1473 .tuner_addr = ADDR_UNSET,
1474 .radio_addr = ADDR_UNSET,
1475 },
1476 [BTTV_BOARD_TERRATVALUER] = {
1477 .name = "Terratec TValueRadio",
1478 .video_inputs = 3,
1479 .audio_inputs = 1,
1480 .tuner = 0,
1481 .svhs = 2,
1482 .gpiomask = 0xffff00,
1483 .muxsel = { 2, 3, 1, 1 },
1484 .gpiomux = { 0x500, 0x500, 0x300, 0x900 },
1485 .gpiomute = 0x900,
1486 .needs_tvaudio = 1,
1487 .pll = PLL_28,
1488 .tuner_type = TUNER_PHILIPS_PAL,
1489 .tuner_addr = ADDR_UNSET,
1490 .radio_addr = ADDR_UNSET,
1491 .has_radio = 1,
1492 },
1493 [BTTV_BOARD_GVBCTV4PCI] = {
1494
1495 .name = "IODATA GV-BCTV4/PCI",
1496 .video_inputs = 3,
1497 .audio_inputs = 1,
1498 .tuner = 0,
1499 .svhs = 2,
1500 .gpiomask = 0x010f00,
1501 .muxsel = {2, 3, 0, 0 },
1502 .gpiomux = {0x10000, 0, 0x10000, 0 },
1503 .no_msp34xx = 1,
1504 .pll = PLL_28,
1505 .tuner_type = TUNER_SHARP_2U5JF5540_NTSC,
1506 .tuner_addr = ADDR_UNSET,
1507 .radio_addr = ADDR_UNSET,
1508 .audio_mode_gpio= gvbctv3pci_audio,
1509 },
1510
1511
1512 [BTTV_BOARD_VOODOOTV_FM] = {
1513 .name = "3Dfx VoodooTV FM (Euro)",
1514
1515
1516 .video_inputs = 4,
1517 .audio_inputs = 1,
1518 .tuner = 0,
1519 .svhs = UNSET,
1520 .gpiomask = 0x4f8a00,
1521
1522
1523 .gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff },
1524 .gpiomute = 0x947fff,
1525
1526
1527 .muxsel = { 2, 3 ,0 ,1 },
1528 .tuner_type = TUNER_MT2032,
1529 .tuner_addr = ADDR_UNSET,
1530 .radio_addr = ADDR_UNSET,
1531 .pll = PLL_28,
1532 .has_radio = 1,
1533 },
1534 [BTTV_BOARD_VOODOOTV_200] = {
1535 .name = "VoodooTV 200 (USA)",
1536
1537
1538 .video_inputs = 4,
1539 .audio_inputs = 1,
1540 .tuner = 0,
1541 .svhs = UNSET,
1542 .gpiomask = 0x4f8a00,
1543
1544
1545 .gpiomux = {0x947fff, 0x987fff,0x947fff,0x947fff },
1546 .gpiomute = 0x947fff,
1547
1548
1549 .muxsel = { 2, 3 ,0 ,1 },
1550 .tuner_type = TUNER_MT2032,
1551 .tuner_addr = ADDR_UNSET,
1552 .radio_addr = ADDR_UNSET,
1553 .pll = PLL_28,
1554 .has_radio = 1,
1555 },
1556 [BTTV_BOARD_AIMMS] = {
1557
1558 .name = "Active Imaging AIMMS",
1559 .video_inputs = 1,
1560 .audio_inputs = 0,
1561 .tuner = UNSET,
1562 .tuner_type = UNSET,
1563 .tuner_addr = ADDR_UNSET,
1564 .radio_addr = ADDR_UNSET,
1565 .pll = PLL_28,
1566 .muxsel = { 2 },
1567 .gpiomask = 0
1568 },
1569 [BTTV_BOARD_PV_BT878P_PLUS] = {
1570
1571 .name = "Prolink Pixelview PV-BT878P+ (Rev.4C,8E)",
1572 .video_inputs = 3,
1573 .audio_inputs = 4,
1574 .tuner = 0,
1575 .svhs = 2,
1576 .gpiomask = 15,
1577 .muxsel = { 2, 3, 1, 1 },
1578 .gpiomux = { 0, 0, 11, 7 },
1579 .gpiomute = 13,
1580 .needs_tvaudio = 1,
1581 .pll = PLL_28,
1582 .tuner_type = TUNER_LG_PAL_I_FM,
1583 .tuner_addr = ADDR_UNSET,
1584 .radio_addr = ADDR_UNSET,
1585 .has_remote = 1,
1586
1587
1588
1589
1590
1591
1592
1593 },
1594 [BTTV_BOARD_FLYVIDEO98EZ] = {
1595 .name = "Lifeview FlyVideo 98EZ (capture only) LR51",
1596 .video_inputs = 4,
1597 .audio_inputs = 0,
1598 .tuner = UNSET,
1599 .svhs = 2,
1600 .muxsel = { 2, 3, 1, 1 },
1601 .pll = PLL_28,
1602 .no_msp34xx = 1,
1603 .tuner_type = UNSET,
1604 .tuner_addr = ADDR_UNSET,
1605 .radio_addr = ADDR_UNSET,
1606 },
1607
1608
1609 [BTTV_BOARD_PV_BT878P_9B] = {
1610
1611 .name = "Prolink Pixelview PV-BT878P+9B (PlayTV Pro rev.9B FM+NICAM)",
1612 .video_inputs = 4,
1613 .audio_inputs = 1,
1614 .tuner = 0,
1615 .svhs = 2,
1616 .gpiomask = 0x3f,
1617 .muxsel = { 2, 3, 1, 1 },
1618 .gpiomux = { 0x01, 0x00, 0x03, 0x03 },
1619 .gpiomute = 0x09,
1620 .needs_tvaudio = 1,
1621 .no_msp34xx = 1,
1622 .no_tda9875 = 1,
1623 .pll = PLL_28,
1624 .tuner_type = TUNER_PHILIPS_PAL,
1625 .tuner_addr = ADDR_UNSET,
1626 .radio_addr = ADDR_UNSET,
1627 .audio_mode_gpio= pvbt878p9b_audio,
1628 .has_radio = 1,
1629 .has_remote = 1,
1630
1631
1632
1633
1634
1635
1636
1637 },
1638 [BTTV_BOARD_SENSORAY311] = {
1639
1640
1641 .name = "Sensoray 311",
1642 .video_inputs = 5,
1643 .audio_inputs = 0,
1644 .tuner = UNSET,
1645 .svhs = 4,
1646 .gpiomask = 0,
1647 .muxsel = { 2, 3, 1, 0, 0 },
1648 .gpiomux = { 0 },
1649 .needs_tvaudio = 0,
1650 .tuner_type = UNSET,
1651 .tuner_addr = ADDR_UNSET,
1652 .radio_addr = ADDR_UNSET,
1653 },
1654 [BTTV_BOARD_RV605] = {
1655
1656 .name = "RemoteVision MX (RV605)",
1657 .video_inputs = 16,
1658 .audio_inputs = 0,
1659 .tuner = UNSET,
1660 .svhs = UNSET,
1661 .gpiomask = 0x00,
1662 .gpiomask2 = 0x07ff,
1663 .muxsel = { 0x33, 0x13, 0x23, 0x43, 0xf3, 0x73, 0xe3, 0x03,
1664 0xd3, 0xb3, 0xc3, 0x63, 0x93, 0x53, 0x83, 0xa3 },
1665 .no_msp34xx = 1,
1666 .no_tda9875 = 1,
1667 .tuner_type = UNSET,
1668 .tuner_addr = ADDR_UNSET,
1669 .radio_addr = ADDR_UNSET,
1670 .muxsel_hook = rv605_muxsel,
1671 },
1672 [BTTV_BOARD_POWERCLR_MTV878] = {
1673 .name = "Powercolor MTV878/ MTV878R/ MTV878F",
1674 .video_inputs = 3,
1675 .audio_inputs = 2,
1676 .tuner = 0,
1677 .svhs = 2,
1678 .gpiomask = 0x1C800F,
1679 .muxsel = { 2, 1, 1, },
1680 .gpiomux = { 0, 1, 2, 2 },
1681 .gpiomute = 4,
1682 .needs_tvaudio = 0,
1683 .tuner_type = TUNER_PHILIPS_PAL,
1684 .tuner_addr = ADDR_UNSET,
1685 .radio_addr = ADDR_UNSET,
1686 .pll = PLL_28,
1687 .has_radio = 1,
1688 },
1689
1690
1691 [BTTV_BOARD_WINDVR] = {
1692
1693 .name = "Canopus WinDVR PCI (COMPAQ Presario 3524JP, 5112JP)",
1694 .video_inputs = 3,
1695 .audio_inputs = 1,
1696 .tuner = 0,
1697 .svhs = 2,
1698 .gpiomask = 0x140007,
1699 .muxsel = { 2, 3, 1, 1 },
1700 .gpiomux = { 0, 1, 2, 3 },
1701 .gpiomute = 4,
1702 .tuner_type = TUNER_PHILIPS_NTSC,
1703 .tuner_addr = ADDR_UNSET,
1704 .radio_addr = ADDR_UNSET,
1705 .audio_mode_gpio= windvr_audio,
1706 },
1707 [BTTV_BOARD_GRANDTEC_MULTI] = {
1708 .name = "GrandTec Multi Capture Card (Bt878)",
1709 .video_inputs = 4,
1710 .audio_inputs = 0,
1711 .tuner = UNSET,
1712 .svhs = UNSET,
1713 .gpiomask = 0,
1714 .muxsel = { 2, 3, 1, 0 },
1715 .gpiomux = { 0 },
1716 .needs_tvaudio = 0,
1717 .no_msp34xx = 1,
1718 .pll = PLL_28,
1719 .tuner_type = UNSET,
1720 .tuner_addr = ADDR_UNSET,
1721 .radio_addr = ADDR_UNSET,
1722 },
1723 [BTTV_BOARD_KWORLD] = {
1724 .name = "Jetway TV/Capture JW-TV878-FBK, Kworld KW-TV878RF",
1725 .video_inputs = 4,
1726 .audio_inputs = 3,
1727 .tuner = 0,
1728 .svhs = 2,
1729 .gpiomask = 7,
1730 .muxsel = { 2, 3, 1, 1 },
1731 .gpiomux = { 0, 0, 4, 4 },
1732
1733
1734
1735
1736
1737
1738 .gpiomute = 4,
1739 .needs_tvaudio = 0,
1740 .no_msp34xx = 1,
1741 .pll = PLL_28,
1742 .tuner_type = TUNER_PHILIPS_PAL,
1743 .tuner_addr = ADDR_UNSET,
1744 .radio_addr = ADDR_UNSET,
1745
1746
1747 .has_radio = 1,
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757 },
1758 [BTTV_BOARD_DSP_TCVIDEO] = {
1759
1760 .name = "DSP Design TCVIDEO",
1761 .video_inputs = 4,
1762 .svhs = UNSET,
1763 .muxsel = { 2, 3, 1, 0 },
1764 .pll = PLL_28,
1765 .tuner_type = UNSET,
1766 .tuner_addr = ADDR_UNSET,
1767 .radio_addr = ADDR_UNSET,
1768 },
1769
1770
1771 [BTTV_BOARD_HAUPPAUGEPVR] = {
1772 .name = "Hauppauge WinTV PVR",
1773 .video_inputs = 4,
1774 .audio_inputs = 1,
1775 .tuner = 0,
1776 .svhs = 2,
1777 .muxsel = { 2, 0, 1, 1 },
1778 .needs_tvaudio = 1,
1779 .pll = PLL_28,
1780 .tuner_type = UNSET,
1781 .tuner_addr = ADDR_UNSET,
1782 .radio_addr = ADDR_UNSET,
1783
1784 .gpiomask = 7,
1785 .gpiomux = {7},
1786 },
1787 [BTTV_BOARD_GVBCTV5PCI] = {
1788 .name = "IODATA GV-BCTV5/PCI",
1789 .video_inputs = 3,
1790 .audio_inputs = 1,
1791 .tuner = 0,
1792 .svhs = 2,
1793 .gpiomask = 0x0f0f80,
1794 .muxsel = {2, 3, 1, 0 },
1795 .gpiomux = {0x030000, 0x010000, 0, 0 },
1796 .gpiomute = 0x020000,
1797 .no_msp34xx = 1,
1798 .pll = PLL_28,
1799 .tuner_type = TUNER_PHILIPS_NTSC_M,
1800 .tuner_addr = ADDR_UNSET,
1801 .radio_addr = ADDR_UNSET,
1802 .audio_mode_gpio= gvbctv5pci_audio,
1803 .has_radio = 1,
1804 },
1805 [BTTV_BOARD_OSPREY1x0] = {
1806 .name = "Osprey 100/150 (878)",
1807 .video_inputs = 4,
1808 .audio_inputs = 0,
1809 .tuner = UNSET,
1810 .svhs = 3,
1811 .muxsel = { 3, 2, 0, 1 },
1812 .pll = PLL_28,
1813 .tuner_type = UNSET,
1814 .tuner_addr = ADDR_UNSET,
1815 .radio_addr = ADDR_UNSET,
1816 .no_msp34xx = 1,
1817 .no_tda9875 = 1,
1818 .no_tda7432 = 1,
1819 },
1820 [BTTV_BOARD_OSPREY1x0_848] = {
1821 .name = "Osprey 100/150 (848)",
1822 .video_inputs = 3,
1823 .audio_inputs = 0,
1824 .tuner = UNSET,
1825 .svhs = 2,
1826 .muxsel = { 2, 3, 1 },
1827 .pll = PLL_28,
1828 .tuner_type = UNSET,
1829 .tuner_addr = ADDR_UNSET,
1830 .radio_addr = ADDR_UNSET,
1831 .no_msp34xx = 1,
1832 .no_tda9875 = 1,
1833 .no_tda7432 = 1,
1834 },
1835
1836
1837 [BTTV_BOARD_OSPREY101_848] = {
1838 .name = "Osprey 101 (848)",
1839 .video_inputs = 2,
1840 .audio_inputs = 0,
1841 .tuner = UNSET,
1842 .svhs = 1,
1843 .muxsel = { 3, 1 },
1844 .pll = PLL_28,
1845 .tuner_type = UNSET,
1846 .tuner_addr = ADDR_UNSET,
1847 .radio_addr = ADDR_UNSET,
1848 .no_msp34xx = 1,
1849 .no_tda9875 = 1,
1850 .no_tda7432 = 1,
1851 },
1852 [BTTV_BOARD_OSPREY1x1] = {
1853 .name = "Osprey 101/151",
1854 .video_inputs = 1,
1855 .audio_inputs = 0,
1856 .tuner = UNSET,
1857 .svhs = UNSET,
1858 .muxsel = { 0 },
1859 .pll = PLL_28,
1860 .tuner_type = UNSET,
1861 .tuner_addr = ADDR_UNSET,
1862 .radio_addr = ADDR_UNSET,
1863 .no_msp34xx = 1,
1864 .no_tda9875 = 1,
1865 .no_tda7432 = 1,
1866 },
1867 [BTTV_BOARD_OSPREY1x1_SVID] = {
1868 .name = "Osprey 101/151 w/ svid",
1869 .video_inputs = 2,
1870 .audio_inputs = 0,
1871 .tuner = UNSET,
1872 .svhs = 1,
1873 .muxsel = { 0, 1 },
1874 .pll = PLL_28,
1875 .tuner_type = UNSET,
1876 .tuner_addr = ADDR_UNSET,
1877 .radio_addr = ADDR_UNSET,
1878 .no_msp34xx = 1,
1879 .no_tda9875 = 1,
1880 .no_tda7432 = 1,
1881 },
1882 [BTTV_BOARD_OSPREY2xx] = {
1883 .name = "Osprey 200/201/250/251",
1884 .video_inputs = 1,
1885 .audio_inputs = 1,
1886 .tuner = UNSET,
1887 .svhs = UNSET,
1888 .muxsel = { 0 },
1889 .pll = PLL_28,
1890 .tuner_type = UNSET,
1891 .tuner_addr = ADDR_UNSET,
1892 .radio_addr = ADDR_UNSET,
1893 .no_msp34xx = 1,
1894 .no_tda9875 = 1,
1895 .no_tda7432 = 1,
1896 },
1897
1898
1899 [BTTV_BOARD_OSPREY2x0_SVID] = {
1900 .name = "Osprey 200/250",
1901 .video_inputs = 2,
1902 .audio_inputs = 1,
1903 .tuner = UNSET,
1904 .svhs = 1,
1905 .muxsel = { 0, 1 },
1906 .pll = PLL_28,
1907 .tuner_type = UNSET,
1908 .tuner_addr = ADDR_UNSET,
1909 .radio_addr = ADDR_UNSET,
1910 .no_msp34xx = 1,
1911 .no_tda9875 = 1,
1912 .no_tda7432 = 1,
1913 },
1914 [BTTV_BOARD_OSPREY2x0] = {
1915 .name = "Osprey 210/220/230",
1916 .video_inputs = 2,
1917 .audio_inputs = 1,
1918 .tuner = UNSET,
1919 .svhs = 1,
1920 .muxsel = { 2, 3 },
1921 .pll = PLL_28,
1922 .tuner_type = UNSET,
1923 .tuner_addr = ADDR_UNSET,
1924 .radio_addr = ADDR_UNSET,
1925 .no_msp34xx = 1,
1926 .no_tda9875 = 1,
1927 .no_tda7432 = 1,
1928 },
1929 [BTTV_BOARD_OSPREY500] = {
1930 .name = "Osprey 500",
1931 .video_inputs = 2,
1932 .audio_inputs = 1,
1933 .tuner = UNSET,
1934 .svhs = 1,
1935 .muxsel = { 2, 3 },
1936 .pll = PLL_28,
1937 .tuner_type = UNSET,
1938 .tuner_addr = ADDR_UNSET,
1939 .radio_addr = ADDR_UNSET,
1940 .no_msp34xx = 1,
1941 .no_tda9875 = 1,
1942 .no_tda7432 = 1,
1943 },
1944 [BTTV_BOARD_OSPREY540] = {
1945 .name = "Osprey 540",
1946 .video_inputs = 4,
1947 .audio_inputs = 1,
1948 .tuner = UNSET,
1949 .pll = PLL_28,
1950 .tuner_type = UNSET,
1951 .tuner_addr = ADDR_UNSET,
1952 .radio_addr = ADDR_UNSET,
1953 .no_msp34xx = 1,
1954 .no_tda9875 = 1,
1955 .no_tda7432 = 1,
1956 },
1957
1958
1959 [BTTV_BOARD_OSPREY2000] = {
1960 .name = "Osprey 2000",
1961 .video_inputs = 2,
1962 .audio_inputs = 1,
1963 .tuner = UNSET,
1964 .svhs = 1,
1965 .muxsel = { 2, 3 },
1966 .pll = PLL_28,
1967 .tuner_type = UNSET,
1968 .tuner_addr = ADDR_UNSET,
1969 .radio_addr = ADDR_UNSET,
1970 .no_msp34xx = 1,
1971 .no_tda9875 = 1,
1972 .no_tda7432 = 1,
1973 },
1974 [BTTV_BOARD_IDS_EAGLE] = {
1975
1976 .name = "IDS Eagle",
1977 .video_inputs = 4,
1978 .audio_inputs = 0,
1979 .tuner = UNSET,
1980 .tuner_type = UNSET,
1981 .tuner_addr = ADDR_UNSET,
1982 .radio_addr = ADDR_UNSET,
1983 .svhs = UNSET,
1984 .gpiomask = 0,
1985 .muxsel = { 0, 1, 2, 3 },
1986 .muxsel_hook = eagle_muxsel,
1987 .no_msp34xx = 1,
1988 .no_tda9875 = 1,
1989 .pll = PLL_28,
1990 },
1991 [BTTV_BOARD_PINNACLESAT] = {
1992 .name = "Pinnacle PCTV Sat",
1993 .video_inputs = 2,
1994 .audio_inputs = 0,
1995 .svhs = 1,
1996 .tuner = UNSET,
1997 .tuner_type = UNSET,
1998 .tuner_addr = ADDR_UNSET,
1999 .radio_addr = ADDR_UNSET,
2000 .no_msp34xx = 1,
2001 .no_tda9875 = 1,
2002 .no_tda7432 = 1,
2003 .muxsel = { 3, 1 },
2004 .pll = PLL_28,
2005 .no_gpioirq = 1,
2006 .has_dvb = 1,
2007 },
2008 [BTTV_BOARD_FORMAC_PROTV] = {
2009 .name = "Formac ProTV II (bt878)",
2010 .video_inputs = 4,
2011 .audio_inputs = 1,
2012 .tuner = 0,
2013 .svhs = 3,
2014 .gpiomask = 2,
2015
2016 .muxsel = { 2, 3, 1, 1 },
2017 .gpiomux = { 2, 2, 0, 0 },
2018 .pll = PLL_28,
2019 .has_radio = 1,
2020 .tuner_type = TUNER_PHILIPS_PAL,
2021 .tuner_addr = ADDR_UNSET,
2022 .radio_addr = ADDR_UNSET,
2023
2024
2025
2026
2027
2028
2029
2030 },
2031
2032
2033 [BTTV_BOARD_MACHTV] = {
2034 .name = "MachTV",
2035 .video_inputs = 3,
2036 .audio_inputs = 1,
2037 .tuner = 0,
2038 .svhs = UNSET,
2039 .gpiomask = 7,
2040 .muxsel = { 2, 3, 1, 1},
2041 .gpiomux = { 0, 1, 2, 3},
2042 .gpiomute = 4,
2043 .needs_tvaudio = 1,
2044 .tuner_type = TUNER_PHILIPS_PAL,
2045 .tuner_addr = ADDR_UNSET,
2046 .radio_addr = ADDR_UNSET,
2047 .pll = PLL_28,
2048 },
2049 [BTTV_BOARD_EURESYS_PICOLO] = {
2050 .name = "Euresys Picolo",
2051 .video_inputs = 3,
2052 .audio_inputs = 0,
2053 .tuner = UNSET,
2054 .svhs = 2,
2055 .gpiomask = 0,
2056 .no_msp34xx = 1,
2057 .no_tda9875 = 1,
2058 .no_tda7432 = 1,
2059 .muxsel = { 2, 0, 1},
2060 .pll = PLL_28,
2061 .tuner_type = UNSET,
2062 .tuner_addr = ADDR_UNSET,
2063 .radio_addr = ADDR_UNSET,
2064 },
2065 [BTTV_BOARD_PV150] = {
2066
2067 .name = "ProVideo PV150",
2068 .video_inputs = 2,
2069 .audio_inputs = 0,
2070 .tuner = UNSET,
2071 .svhs = UNSET,
2072 .gpiomask = 0,
2073 .muxsel = { 2, 3 },
2074 .gpiomux = { 0 },
2075 .needs_tvaudio = 0,
2076 .no_msp34xx = 1,
2077 .pll = PLL_28,
2078 .tuner_type = UNSET,
2079 .tuner_addr = ADDR_UNSET,
2080 .radio_addr = ADDR_UNSET,
2081 },
2082 [BTTV_BOARD_AD_TVK503] = {
2083
2084
2085 .name = "AD-TVK503",
2086 .video_inputs = 4,
2087 .audio_inputs = 1,
2088 .tuner = 0,
2089 .svhs = 2,
2090 .gpiomask = 0x001e8007,
2091 .muxsel = { 2, 3, 1, 0 },
2092
2093 .gpiomux = { 0x08, 0x0f, 0x0a, 0x08 },
2094 .gpiomute = 0x0f,
2095 .needs_tvaudio = 0,
2096 .no_msp34xx = 1,
2097 .pll = PLL_28,
2098 .tuner_type = TUNER_PHILIPS_NTSC,
2099 .tuner_addr = ADDR_UNSET,
2100 .radio_addr = ADDR_UNSET,
2101 .audio_mode_gpio= adtvk503_audio,
2102 },
2103
2104
2105 [BTTV_BOARD_HERCULES_SM_TV] = {
2106 .name = "Hercules Smart TV Stereo",
2107 .video_inputs = 4,
2108 .audio_inputs = 1,
2109 .tuner = 0,
2110 .svhs = 2,
2111 .gpiomask = 0x00,
2112 .muxsel = { 2, 3, 1, 1 },
2113 .needs_tvaudio = 1,
2114 .no_msp34xx = 1,
2115 .pll = PLL_28,
2116 .tuner_type = TUNER_PHILIPS_PAL,
2117 .tuner_addr = ADDR_UNSET,
2118 .radio_addr = ADDR_UNSET,
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128 },
2129 [BTTV_BOARD_PACETV] = {
2130 .name = "Pace TV & Radio Card",
2131 .video_inputs = 4,
2132 .audio_inputs = 1,
2133 .tuner = 0,
2134 .svhs = 2,
2135 .muxsel = { 2, 3, 1, 1 },
2136 .gpiomask = 0,
2137 .no_tda9875 = 1,
2138 .no_tda7432 = 1,
2139 .tuner_type = TUNER_PHILIPS_PAL_I,
2140 .tuner_addr = ADDR_UNSET,
2141 .radio_addr = ADDR_UNSET,
2142 .has_radio = 1,
2143 .pll = PLL_28,
2144
2145
2146
2147
2148
2149
2150 },
2151 [BTTV_BOARD_IVC200] = {
2152
2153 .name = "IVC-200",
2154 .video_inputs = 1,
2155 .audio_inputs = 0,
2156 .tuner = UNSET,
2157 .tuner_type = UNSET,
2158 .tuner_addr = ADDR_UNSET,
2159 .radio_addr = ADDR_UNSET,
2160 .svhs = UNSET,
2161 .gpiomask = 0xdf,
2162 .muxsel = { 2 },
2163 .pll = PLL_28,
2164 },
2165 [BTTV_BOARD_XGUARD] = {
2166 .name = "Grand X-Guard / Trust 814PCI",
2167 .video_inputs = 16,
2168 .audio_inputs = 0,
2169 .tuner = UNSET,
2170 .svhs = UNSET,
2171 .tuner_type = TUNER_ABSENT,
2172 .tuner_addr = ADDR_UNSET,
2173 .radio_addr = ADDR_UNSET,
2174 .gpiomask2 = 0xff,
2175 .muxsel = { 2,2,2,2, 3,3,3,3, 1,1,1,1, 0,0,0,0 },
2176 .muxsel_hook = xguard_muxsel,
2177 .no_msp34xx = 1,
2178 .no_tda9875 = 1,
2179 .no_tda7432 = 1,
2180 .pll = PLL_28,
2181 },
2182
2183
2184 [BTTV_BOARD_NEBULA_DIGITV] = {
2185 .name = "Nebula Electronics DigiTV",
2186 .video_inputs = 1,
2187 .tuner = UNSET,
2188 .svhs = UNSET,
2189 .muxsel = { 2, 3, 1, 0 },
2190 .no_msp34xx = 1,
2191 .no_tda9875 = 1,
2192 .no_tda7432 = 1,
2193 .pll = PLL_28,
2194 .tuner_type = UNSET,
2195 .tuner_addr = ADDR_UNSET,
2196 .radio_addr = ADDR_UNSET,
2197 .has_dvb = 1,
2198 .has_remote = 1,
2199 .gpiomask = 0x1b,
2200 .no_gpioirq = 1,
2201 },
2202 [BTTV_BOARD_PV143] = {
2203
2204 .name = "ProVideo PV143",
2205 .video_inputs = 4,
2206 .audio_inputs = 0,
2207 .tuner = UNSET,
2208 .svhs = UNSET,
2209 .gpiomask = 0,
2210 .muxsel = { 2, 3, 1, 0 },
2211 .gpiomux = { 0 },
2212 .needs_tvaudio = 0,
2213 .no_msp34xx = 1,
2214 .pll = PLL_28,
2215 .tuner_type = UNSET,
2216 .tuner_addr = ADDR_UNSET,
2217 .radio_addr = ADDR_UNSET,
2218 },
2219 [BTTV_BOARD_VD009X1_VD011_MINIDIN] = {
2220
2221 .name = "PHYTEC VD-009-X1 VD-011 MiniDIN (bt878)",
2222 .video_inputs = 4,
2223 .audio_inputs = 0,
2224 .tuner = UNSET,
2225 .svhs = 3,
2226 .gpiomask = 0x00,
2227 .muxsel = { 2, 3, 1, 0 },
2228 .gpiomux = { 0, 0, 0, 0 },
2229 .needs_tvaudio = 0,
2230 .pll = PLL_28,
2231 .tuner_type = UNSET,
2232 .tuner_addr = ADDR_UNSET,
2233 .radio_addr = ADDR_UNSET,
2234 },
2235 [BTTV_BOARD_VD009X1_VD011_COMBI] = {
2236 .name = "PHYTEC VD-009-X1 VD-011 Combi (bt878)",
2237 .video_inputs = 4,
2238 .audio_inputs = 0,
2239 .tuner = UNSET,
2240 .svhs = 3,
2241 .gpiomask = 0x00,
2242 .muxsel = { 2, 3, 1, 1 },
2243 .gpiomux = { 0, 0, 0, 0 },
2244 .needs_tvaudio = 0,
2245 .pll = PLL_28,
2246 .tuner_type = UNSET,
2247 .tuner_addr = ADDR_UNSET,
2248 .radio_addr = ADDR_UNSET,
2249 },
2250
2251
2252 [BTTV_BOARD_VD009_MINIDIN] = {
2253 .name = "PHYTEC VD-009 MiniDIN (bt878)",
2254 .video_inputs = 10,
2255 .audio_inputs = 0,
2256 .tuner = UNSET,
2257 .svhs = 9,
2258 .gpiomask = 0x00,
2259 .gpiomask2 = 0x03,
2260
2261
2262 .muxsel = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x00 },
2263 .gpiomux = { 0, 0, 0, 0 },
2264 .needs_tvaudio = 1,
2265 .pll = PLL_28,
2266 .tuner_type = UNSET,
2267 .tuner_addr = ADDR_UNSET,
2268 .radio_addr = ADDR_UNSET,
2269 },
2270 [BTTV_BOARD_VD009_COMBI] = {
2271 .name = "PHYTEC VD-009 Combi (bt878)",
2272 .video_inputs = 10,
2273 .audio_inputs = 0,
2274 .tuner = UNSET,
2275 .svhs = 9,
2276 .gpiomask = 0x00,
2277 .gpiomask2 = 0x03,
2278
2279
2280 .muxsel = { 0x02, 0x12, 0x22, 0x32, 0x03, 0x13, 0x23, 0x33, 0x01, 0x01 },
2281 .gpiomux = { 0, 0, 0, 0 },
2282 .needs_tvaudio = 1,
2283 .pll = PLL_28,
2284 .tuner_type = UNSET,
2285 .tuner_addr = ADDR_UNSET,
2286 .radio_addr = ADDR_UNSET,
2287 },
2288 [BTTV_BOARD_IVC100] = {
2289 .name = "IVC-100",
2290 .video_inputs = 4,
2291 .audio_inputs = 0,
2292 .tuner = UNSET,
2293 .tuner_type = UNSET,
2294 .tuner_addr = ADDR_UNSET,
2295 .radio_addr = ADDR_UNSET,
2296 .svhs = UNSET,
2297 .gpiomask = 0xdf,
2298 .muxsel = { 2, 3, 1, 0 },
2299 .pll = PLL_28,
2300 },
2301 [BTTV_BOARD_IVC120] = {
2302
2303 .name = "IVC-120G",
2304 .video_inputs = 16,
2305 .audio_inputs = 0,
2306 .tuner = UNSET,
2307 .tuner_type = UNSET,
2308 .tuner_addr = ADDR_UNSET,
2309 .radio_addr = ADDR_UNSET,
2310 .svhs = UNSET,
2311 .needs_tvaudio = 0,
2312 .no_msp34xx = 1,
2313 .no_tda9875 = 1,
2314 .no_tda7432 = 1,
2315 .gpiomask = 0x00,
2316 .muxsel = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
2317 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10 },
2318 .muxsel_hook = ivc120_muxsel,
2319 .pll = PLL_28,
2320 },
2321
2322
2323 [BTTV_BOARD_PC_HDTV] = {
2324 .name = "pcHDTV HD-2000 TV",
2325 .video_inputs = 4,
2326 .audio_inputs = 1,
2327 .tuner = 0,
2328 .svhs = 2,
2329 .muxsel = { 2, 3, 1, 0 },
2330 .tuner_type = TUNER_PHILIPS_FCV1236D,
2331 .tuner_addr = ADDR_UNSET,
2332 .radio_addr = ADDR_UNSET,
2333 .has_dvb = 1,
2334 },
2335 [BTTV_BOARD_TWINHAN_DST] = {
2336 .name = "Twinhan DST + clones",
2337 .no_msp34xx = 1,
2338 .no_tda9875 = 1,
2339 .no_tda7432 = 1,
2340 .tuner_type = TUNER_ABSENT,
2341 .tuner_addr = ADDR_UNSET,
2342 .radio_addr = ADDR_UNSET,
2343 .no_video = 1,
2344 .has_dvb = 1,
2345 },
2346 [BTTV_BOARD_WINFASTVC100] = {
2347 .name = "Winfast VC100",
2348 .video_inputs = 3,
2349 .audio_inputs = 0,
2350 .svhs = 1,
2351 .tuner = UNSET,
2352 .muxsel = { 3, 1, 1, 3 },
2353 .no_msp34xx = 1,
2354 .no_tda9875 = 1,
2355 .no_tda7432 = 1,
2356 .tuner_type = TUNER_ABSENT,
2357 .tuner_addr = ADDR_UNSET,
2358 .radio_addr = ADDR_UNSET,
2359 .pll = PLL_28,
2360 },
2361 [BTTV_BOARD_TEV560] = {
2362 .name = "Teppro TEV-560/InterVision IV-560",
2363 .video_inputs = 3,
2364 .audio_inputs = 1,
2365 .tuner = 0,
2366 .svhs = 2,
2367 .gpiomask = 3,
2368 .muxsel = { 2, 3, 1, 1 },
2369 .gpiomux = { 1, 1, 1, 1 },
2370 .needs_tvaudio = 1,
2371 .tuner_type = TUNER_PHILIPS_PAL,
2372 .tuner_addr = ADDR_UNSET,
2373 .radio_addr = ADDR_UNSET,
2374 .pll = PLL_35,
2375 },
2376
2377
2378 [BTTV_BOARD_SIMUS_GVC1100] = {
2379 .name = "SIMUS GVC1100",
2380 .video_inputs = 4,
2381 .audio_inputs = 0,
2382 .tuner = UNSET,
2383 .svhs = UNSET,
2384 .tuner_type = UNSET,
2385 .tuner_addr = ADDR_UNSET,
2386 .radio_addr = ADDR_UNSET,
2387 .pll = PLL_28,
2388 .muxsel = { 2, 2, 2, 2 },
2389 .gpiomask = 0x3F,
2390 .muxsel_hook = gvc1100_muxsel,
2391 },
2392 [BTTV_BOARD_NGSTV_PLUS] = {
2393
2394 .name = "NGS NGSTV+",
2395 .video_inputs = 3,
2396 .tuner = 0,
2397 .svhs = 2,
2398 .gpiomask = 0x008007,
2399 .muxsel = { 2, 3, 0, 0 },
2400 .gpiomux = { 0, 0, 0, 0 },
2401 .gpiomute = 0x000003,
2402 .pll = PLL_28,
2403 .tuner_type = TUNER_PHILIPS_PAL,
2404 .tuner_addr = ADDR_UNSET,
2405 .radio_addr = ADDR_UNSET,
2406 .has_remote = 1,
2407 },
2408 [BTTV_BOARD_LMLBT4] = {
2409
2410 .name = "LMLBT4",
2411 .video_inputs = 4,
2412 .audio_inputs = 0,
2413 .tuner = UNSET,
2414 .svhs = UNSET,
2415 .muxsel = { 2, 3, 1, 0 },
2416 .no_msp34xx = 1,
2417 .no_tda9875 = 1,
2418 .no_tda7432 = 1,
2419 .needs_tvaudio = 0,
2420 .tuner_type = UNSET,
2421 .tuner_addr = ADDR_UNSET,
2422 .radio_addr = ADDR_UNSET,
2423 },
2424 [BTTV_BOARD_TEKRAM_M205] = {
2425
2426 .name = "Tekram M205 PRO",
2427 .video_inputs = 3,
2428 .audio_inputs = 1,
2429 .tuner = 0,
2430 .tuner_type = TUNER_PHILIPS_PAL,
2431 .tuner_addr = ADDR_UNSET,
2432 .radio_addr = ADDR_UNSET,
2433 .svhs = 2,
2434 .needs_tvaudio = 0,
2435 .gpiomask = 0x68,
2436 .muxsel = { 2, 3, 1 },
2437 .gpiomux = { 0x68, 0x68, 0x61, 0x61 },
2438 .pll = PLL_28,
2439 },
2440
2441
2442 [BTTV_BOARD_CONTVFMI] = {
2443
2444
2445 .name = "Conceptronic CONTVFMi",
2446 .video_inputs = 3,
2447 .audio_inputs = 1,
2448 .tuner = 0,
2449 .svhs = 2,
2450 .gpiomask = 0x008007,
2451 .muxsel = { 2, 3, 1, 1 },
2452 .gpiomux = { 0, 1, 2, 2 },
2453 .gpiomute = 3,
2454 .needs_tvaudio = 0,
2455 .pll = PLL_28,
2456 .tuner_type = TUNER_PHILIPS_PAL,
2457 .tuner_addr = ADDR_UNSET,
2458 .radio_addr = ADDR_UNSET,
2459 .has_remote = 1,
2460 .has_radio = 1,
2461 },
2462 [BTTV_BOARD_PICOLO_TETRA_CHIP] = {
2463
2464
2465
2466
2467 .name = "Euresys Picolo Tetra",
2468 .video_inputs = 4,
2469 .audio_inputs = 0,
2470 .tuner = UNSET,
2471 .svhs = UNSET,
2472 .gpiomask = 0,
2473 .gpiomask2 = 0x3C<<16,
2474 .no_msp34xx = 1,
2475 .no_tda9875 = 1,
2476 .no_tda7432 = 1,
2477 .muxsel = {2,2,2,2},
2478 .gpiomux = { 0, 0, 0, 0 },
2479 .pll = PLL_28,
2480 .needs_tvaudio = 0,
2481 .muxsel_hook = picolo_tetra_muxsel,
2482 .tuner_type = UNSET,
2483 .tuner_addr = ADDR_UNSET,
2484 .radio_addr = ADDR_UNSET,
2485 },
2486 [BTTV_BOARD_SPIRIT_TV] = {
2487
2488
2489 .name = "Spirit TV Tuner",
2490 .video_inputs = 3,
2491 .audio_inputs = 1,
2492 .tuner = 0,
2493 .svhs = 2,
2494 .gpiomask = 0x0000000f,
2495 .muxsel = { 2, 1, 1 },
2496 .gpiomux = { 0x02, 0x00, 0x00, 0x00 },
2497 .tuner_type = TUNER_TEMIC_PAL,
2498 .tuner_addr = ADDR_UNSET,
2499 .radio_addr = ADDR_UNSET,
2500 .no_msp34xx = 1,
2501 .no_tda9875 = 1,
2502 },
2503 [BTTV_BOARD_AVDVBT_771] = {
2504
2505 .name = "AVerMedia AVerTV DVB-T 771",
2506 .video_inputs = 2,
2507 .svhs = 1,
2508 .tuner = UNSET,
2509 .tuner_type = TUNER_ABSENT,
2510 .tuner_addr = ADDR_UNSET,
2511 .radio_addr = ADDR_UNSET,
2512 .muxsel = { 3 , 3 },
2513 .no_msp34xx = 1,
2514 .no_tda9875 = 1,
2515 .no_tda7432 = 1,
2516 .pll = PLL_28,
2517 .has_dvb = 1,
2518 .no_gpioirq = 1,
2519 .has_remote = 1,
2520 },
2521
2522 [BTTV_BOARD_AVDVBT_761] = {
2523
2524
2525 .name = "AverMedia AverTV DVB-T 761",
2526 .video_inputs = 2,
2527 .tuner = UNSET,
2528 .svhs = 1,
2529 .muxsel = { 3, 1, 2, 0 },
2530 .no_msp34xx = 1,
2531 .no_tda9875 = 1,
2532 .no_tda7432 = 1,
2533 .pll = PLL_28,
2534 .tuner_type = UNSET,
2535 .tuner_addr = ADDR_UNSET,
2536 .radio_addr = ADDR_UNSET,
2537 .has_dvb = 1,
2538 .no_gpioirq = 1,
2539 .has_remote = 1,
2540 },
2541 [BTTV_BOARD_MATRIX_VISIONSQ] = {
2542
2543 .name = "MATRIX Vision Sigma-SQ",
2544 .video_inputs = 16,
2545 .audio_inputs = 0,
2546 .tuner = UNSET,
2547 .svhs = UNSET,
2548 .gpiomask = 0x0,
2549 .muxsel = { 2, 2, 2, 2, 2, 2, 2, 2,
2550 3, 3, 3, 3, 3, 3, 3, 3 },
2551 .muxsel_hook = sigmaSQ_muxsel,
2552 .gpiomux = { 0 },
2553 .no_msp34xx = 1,
2554 .pll = PLL_28,
2555 .tuner_type = UNSET,
2556 .tuner_addr = ADDR_UNSET,
2557 .radio_addr = ADDR_UNSET,
2558 },
2559 [BTTV_BOARD_MATRIX_VISIONSLC] = {
2560
2561 .name = "MATRIX Vision Sigma-SLC",
2562 .video_inputs = 4,
2563 .audio_inputs = 0,
2564 .tuner = UNSET,
2565 .svhs = UNSET,
2566 .gpiomask = 0x0,
2567 .muxsel = { 2, 2, 2, 2 },
2568 .muxsel_hook = sigmaSLC_muxsel,
2569 .gpiomux = { 0 },
2570 .no_msp34xx = 1,
2571 .pll = PLL_28,
2572 .tuner_type = UNSET,
2573 .tuner_addr = ADDR_UNSET,
2574 .radio_addr = ADDR_UNSET,
2575 },
2576
2577 [BTTV_BOARD_APAC_VIEWCOMP] = {
2578
2579
2580 .name = "APAC Viewcomp 878(AMAX)",
2581 .video_inputs = 2,
2582 .audio_inputs = 1,
2583 .tuner = 0,
2584 .svhs = UNSET,
2585 .gpiomask = 0xFF,
2586 .muxsel = { 2, 3, 1, 1 },
2587 .gpiomux = { 2, 0, 0, 0 },
2588 .gpiomute = 10,
2589 .needs_tvaudio = 0,
2590 .pll = PLL_28,
2591 .tuner_type = TUNER_PHILIPS_PAL,
2592 .tuner_addr = ADDR_UNSET,
2593 .radio_addr = ADDR_UNSET,
2594 .has_remote = 1,
2595 .has_radio = 1,
2596 },
2597
2598
2599 [BTTV_BOARD_DVICO_DVBT_LITE] = {
2600
2601 .name = "DViCO FusionHDTV DVB-T Lite",
2602 .tuner = UNSET,
2603 .no_msp34xx = 1,
2604 .no_tda9875 = 1,
2605 .no_tda7432 = 1,
2606 .pll = PLL_28,
2607 .no_video = 1,
2608 .has_dvb = 1,
2609 .tuner_type = UNSET,
2610 .tuner_addr = ADDR_UNSET,
2611 .radio_addr = ADDR_UNSET,
2612 },
2613 [BTTV_BOARD_VGEAR_MYVCD] = {
2614
2615 .name = "V-Gear MyVCD",
2616 .video_inputs = 3,
2617 .audio_inputs = 1,
2618 .tuner = 0,
2619 .svhs = 2,
2620 .gpiomask = 0x3f,
2621 .muxsel = {2, 3, 1, 0 },
2622 .gpiomux = {0x31, 0x31, 0x31, 0x31 },
2623 .gpiomute = 0x31,
2624 .no_msp34xx = 1,
2625 .pll = PLL_28,
2626 .tuner_type = TUNER_PHILIPS_NTSC_M,
2627 .tuner_addr = ADDR_UNSET,
2628 .radio_addr = ADDR_UNSET,
2629 .has_radio = 0,
2630 },
2631 [BTTV_BOARD_SUPER_TV] = {
2632
2633 .name = "Super TV Tuner",
2634 .video_inputs = 4,
2635 .audio_inputs = 1,
2636 .tuner = 0,
2637 .svhs = 2,
2638 .muxsel = { 2, 3, 1, 0 },
2639 .tuner_type = TUNER_PHILIPS_NTSC,
2640 .tuner_addr = ADDR_UNSET,
2641 .radio_addr = ADDR_UNSET,
2642 .gpiomask = 0x008007,
2643 .gpiomux = { 0, 0x000001,0,0 },
2644 .needs_tvaudio = 1,
2645 .has_radio = 1,
2646 },
2647 [BTTV_BOARD_TIBET_CS16] = {
2648
2649 .name = "Tibet Systems 'Progress DVR' CS16",
2650 .video_inputs = 16,
2651 .audio_inputs = 0,
2652 .tuner = UNSET,
2653 .svhs = UNSET,
2654 .muxsel = { 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
2655 .pll = PLL_28,
2656 .no_msp34xx = 1,
2657 .no_tda9875 = 1,
2658 .no_tda7432 = 1,
2659 .tuner_type = UNSET,
2660 .tuner_addr = ADDR_UNSET,
2661 .radio_addr = ADDR_UNSET,
2662 .muxsel_hook = tibetCS16_muxsel,
2663 },
2664 [BTTV_BOARD_KODICOM_4400R] = {
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676 .name = "Kodicom 4400R (master)",
2677 .video_inputs = 16,
2678 .audio_inputs = 0,
2679 .tuner = UNSET,
2680 .tuner_type = UNSET,
2681 .tuner_addr = ADDR_UNSET,
2682 .radio_addr = ADDR_UNSET,
2683 .svhs = UNSET,
2684
2685
2686
2687
2688
2689
2690
2691
2692 .gpiomask = 0x0003ff,
2693 .no_gpioirq = 1,
2694 .muxsel = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
2695 .pll = PLL_28,
2696 .no_msp34xx = 1,
2697 .no_tda7432 = 1,
2698 .no_tda9875 = 1,
2699 .muxsel_hook = kodicom4400r_muxsel,
2700 },
2701 [BTTV_BOARD_KODICOM_4400R_SL] = {
2702
2703
2704
2705
2706
2707
2708 .name = "Kodicom 4400R (slave)",
2709 .video_inputs = 16,
2710 .audio_inputs = 0,
2711 .tuner = UNSET,
2712 .tuner_type = UNSET,
2713 .tuner_addr = ADDR_UNSET,
2714 .radio_addr = ADDR_UNSET,
2715 .svhs = UNSET,
2716 .gpiomask = 0x010000,
2717 .no_gpioirq = 1,
2718 .muxsel = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 },
2719 .pll = PLL_28,
2720 .no_msp34xx = 1,
2721 .no_tda7432 = 1,
2722 .no_tda9875 = 1,
2723 .muxsel_hook = kodicom4400r_muxsel,
2724 },
2725
2726 [BTTV_BOARD_ADLINK_RTV24] = {
2727
2728
2729 .name = "Adlink RTV24",
2730 .video_inputs = 4,
2731 .audio_inputs = 1,
2732 .tuner = 0,
2733 .svhs = 2,
2734 .muxsel = { 2, 3, 1, 0 },
2735 .tuner_type = UNSET,
2736 .tuner_addr = ADDR_UNSET,
2737 .radio_addr = ADDR_UNSET,
2738 .pll = PLL_28,
2739 },
2740
2741 [BTTV_BOARD_DVICO_FUSIONHDTV_5_LITE] = {
2742
2743 .name = "DViCO FusionHDTV 5 Lite",
2744 .tuner = 0,
2745 .tuner_type = TUNER_LG_TDVS_H06XF,
2746 .tuner_addr = ADDR_UNSET,
2747 .radio_addr = ADDR_UNSET,
2748 .video_inputs = 3,
2749 .audio_inputs = 1,
2750 .svhs = 2,
2751 .muxsel = { 2, 3, 1 },
2752 .gpiomask = 0x00e00007,
2753 .gpiomux = { 0x00400005, 0, 0x00000001, 0 },
2754 .gpiomute = 0x00c00007,
2755 .no_msp34xx = 1,
2756 .no_tda9875 = 1,
2757 .no_tda7432 = 1,
2758 .has_dvb = 1,
2759 },
2760
2761 [BTTV_BOARD_ACORP_Y878F] = {
2762
2763 .name = "Acorp Y878F",
2764 .video_inputs = 3,
2765 .audio_inputs = 1,
2766 .tuner = 0,
2767 .svhs = 2,
2768 .gpiomask = 0x01fe00,
2769 .muxsel = { 2, 3, 1, 1 },
2770 .gpiomux = { 0x001e00, 0, 0x018000, 0x014000 },
2771 .gpiomute = 0x002000,
2772 .needs_tvaudio = 1,
2773 .pll = PLL_28,
2774 .tuner_type = TUNER_YMEC_TVF66T5_B_DFF,
2775 .tuner_addr = 0xc1 >>1,
2776 .radio_addr = 0xc1 >>1,
2777 .has_radio = 1,
2778 },
2779
2780 [BTTV_BOARD_CONCEPTRONIC_CTVFMI2] = {
2781 .name = "Conceptronic CTVFMi v2",
2782 .video_inputs = 3,
2783 .audio_inputs = 1,
2784 .tuner = 0,
2785 .svhs = 2,
2786 .gpiomask = 0x001c0007,
2787 .muxsel = { 2, 3, 1, 1 },
2788 .gpiomux = { 0, 1, 2, 2 },
2789 .gpiomute = 3,
2790 .needs_tvaudio = 0,
2791 .pll = PLL_28,
2792 .tuner_type = TUNER_TENA_9533_DI,
2793 .tuner_addr = ADDR_UNSET,
2794 .radio_addr = ADDR_UNSET,
2795 .has_remote = 1,
2796 .has_radio = 1,
2797 },
2798
2799 [BTTV_BOARD_PV_BT878P_2E] = {
2800 .name = "Prolink Pixelview PV-BT878P+ (Rev.2E)",
2801 .video_inputs = 5,
2802 .audio_inputs = 1,
2803 .tuner = 0,
2804 .svhs = 3,
2805 .gpiomask = 0x01fe00,
2806 .muxsel = { 2,3,1,1,-1 },
2807 .digital_mode = DIGITAL_MODE_CAMERA,
2808 .gpiomux = { 0x00400, 0x10400, 0x04400, 0x80000 },
2809 .gpiomute = 0x12400,
2810 .no_msp34xx = 1,
2811 .pll = PLL_28,
2812 .tuner_type = TUNER_LG_PAL_FM,
2813 .tuner_addr = ADDR_UNSET,
2814 .radio_addr = ADDR_UNSET,
2815 .has_remote = 1,
2816 },
2817
2818 [BTTV_BOARD_PV_M4900] = {
2819
2820 .name = "Prolink PixelView PlayTV MPEG2 PV-M4900",
2821 .video_inputs = 3,
2822 .audio_inputs = 1,
2823 .tuner = 0,
2824 .svhs = 2,
2825 .gpiomask = 0x3f,
2826 .muxsel = { 2, 3, 1, 1 },
2827 .gpiomux = { 0x21, 0x20, 0x24, 0x2c },
2828 .gpiomute = 0x29,
2829 .no_msp34xx = 1,
2830 .pll = PLL_28,
2831 .tuner_type = TUNER_YMEC_TVF_5533MF,
2832 .tuner_addr = ADDR_UNSET,
2833 .radio_addr = ADDR_UNSET,
2834 .has_radio = 1,
2835 .has_remote = 1,
2836 },
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850 [BTTV_BOARD_OSPREY440] = {
2851 .name = "Osprey 440",
2852 .video_inputs = 4,
2853 .audio_inputs = 2,
2854 .tuner = UNSET,
2855 .svhs = UNSET,
2856 .muxsel = { 2, 3, 0, 1 },
2857 .gpiomask = 0x303,
2858 .gpiomute = 0x000,
2859 .gpiomux = { 0, 0, 0x000, 0x100},
2860 .pll = PLL_28,
2861 .tuner_type = UNSET,
2862 .tuner_addr = ADDR_UNSET,
2863 .radio_addr = ADDR_UNSET,
2864 .no_msp34xx = 1,
2865 .no_tda9875 = 1,
2866 .no_tda7432 = 1,
2867 },
2868
2869 [BTTV_BOARD_ASOUND_SKYEYE] = {
2870 .name = "Asound Skyeye PCTV",
2871 .video_inputs = 3,
2872 .audio_inputs = 1,
2873 .tuner = 0,
2874 .svhs = 2,
2875 .gpiomask = 15,
2876 .muxsel = { 2, 3, 1, 1 },
2877 .gpiomux = { 2, 0, 0, 0 },
2878 .gpiomute = 1,
2879 .needs_tvaudio = 1,
2880 .pll = PLL_28,
2881 .tuner_type = TUNER_PHILIPS_NTSC,
2882 .tuner_addr = ADDR_UNSET,
2883 .radio_addr = ADDR_UNSET,
2884 },
2885
2886 [BTTV_BOARD_SABRENT_TVFM] = {
2887 .name = "Sabrent TV-FM (bttv version)",
2888 .video_inputs = 3,
2889 .audio_inputs = 1,
2890 .tuner = 0,
2891 .svhs = 2,
2892 .gpiomask = 0x108007,
2893 .muxsel = { 2, 3, 1, 1 },
2894 .gpiomux = { 100000, 100002, 100002, 100000 },
2895 .no_msp34xx = 1,
2896 .no_tda9875 = 1,
2897 .no_tda7432 = 1,
2898 .pll = PLL_28,
2899 .tuner_type = TUNER_TNF_5335MF,
2900 .tuner_addr = ADDR_UNSET,
2901 .has_radio = 1,
2902 },
2903
2904 [BTTV_BOARD_HAUPPAUGE_IMPACTVCB] = {
2905 .name = "Hauppauge ImpactVCB (bt878)",
2906 .video_inputs = 4,
2907 .audio_inputs = 0,
2908 .tuner = UNSET,
2909 .svhs = UNSET,
2910 .gpiomask = 0x0f,
2911 .muxsel = { 0, 1, 3, 2 },
2912 .no_msp34xx = 1,
2913 .no_tda9875 = 1,
2914 .no_tda7432 = 1,
2915 .tuner_type = UNSET,
2916 .tuner_addr = ADDR_UNSET,
2917 .radio_addr = ADDR_UNSET,
2918 },
2919 [BTTV_BOARD_MACHTV_MAGICTV] = {
2920
2921
2922
2923
2924
2925
2926
2927 .name = "MagicTV",
2928 .video_inputs = 3,
2929 .audio_inputs = 1,
2930 .tuner = 0,
2931 .svhs = 2,
2932 .gpiomask = 7,
2933 .muxsel = { 2, 3, 1, 1 },
2934 .gpiomux = { 0, 1, 2, 3 },
2935 .gpiomute = 4,
2936 .tuner_type = TUNER_TEMIC_4009FR5_PAL,
2937 .tuner_addr = ADDR_UNSET,
2938 .radio_addr = ADDR_UNSET,
2939 .pll = PLL_28,
2940 .has_radio = 1,
2941 .has_remote = 1,
2942 },
2943 [BTTV_BOARD_SSAI_SECURITY] = {
2944 .name = "SSAI Security Video Interface",
2945 .video_inputs = 4,
2946 .audio_inputs = 0,
2947 .tuner = UNSET,
2948 .svhs = UNSET,
2949 .muxsel = { 0, 1, 2, 3 },
2950 .tuner_type = UNSET,
2951 .tuner_addr = ADDR_UNSET,
2952 .radio_addr = ADDR_UNSET,
2953 },
2954 [BTTV_BOARD_SSAI_ULTRASOUND] = {
2955 .name = "SSAI Ultrasound Video Interface",
2956 .video_inputs = 2,
2957 .audio_inputs = 0,
2958 .tuner = UNSET,
2959 .svhs = 1,
2960 .muxsel = { 2, 0, 1, 3 },
2961 .tuner_type = UNSET,
2962 .tuner_addr = ADDR_UNSET,
2963 .radio_addr = ADDR_UNSET,
2964 },
2965
2966 [BTTV_BOARD_DVICO_FUSIONHDTV_2] = {
2967 .name = "DViCO FusionHDTV 2",
2968 .tuner = 0,
2969 .tuner_type = TUNER_PHILIPS_FCV1236D,
2970 .tuner_addr = ADDR_UNSET,
2971 .radio_addr = ADDR_UNSET,
2972 .video_inputs = 3,
2973 .audio_inputs = 1,
2974 .svhs = 2,
2975 .muxsel = { 2, 3, 1 },
2976 .gpiomask = 0x00e00007,
2977 .gpiomux = { 0x00400005, 0, 0x00000001, 0 },
2978 .gpiomute = 0x00c00007,
2979 .no_msp34xx = 1,
2980 .no_tda9875 = 1,
2981 .no_tda7432 = 1,
2982 },
2983
2984 [BTTV_BOARD_TYPHOON_TVTUNERPCI] = {
2985 .name = "Typhoon TV-Tuner PCI (50684)",
2986 .video_inputs = 3,
2987 .audio_inputs = 1,
2988 .tuner = 0,
2989 .svhs = 2,
2990 .gpiomask = 0x3014f,
2991 .muxsel = { 2, 3, 1, 1 },
2992 .gpiomux = { 0x20001,0x10001, 0, 0 },
2993 .gpiomute = 10,
2994 .needs_tvaudio = 1,
2995 .pll = PLL_28,
2996 .tuner_type = TUNER_PHILIPS_PAL_I,
2997 .tuner_addr = ADDR_UNSET,
2998 .radio_addr = ADDR_UNSET,
2999 },
3000 [BTTV_BOARD_GEOVISION_GV600] = {
3001
3002 .name = "Geovision GV-600",
3003 .video_inputs = 16,
3004 .audio_inputs = 0,
3005 .tuner = UNSET,
3006 .svhs = UNSET,
3007 .gpiomask = 0x0,
3008 .muxsel = { 2, 2, 2, 2, 2, 2, 2, 2,
3009 2, 2, 2, 2, 2, 2, 2, 2 },
3010 .muxsel_hook = geovision_muxsel,
3011 .gpiomux = { 0 },
3012 .no_msp34xx = 1,
3013 .pll = PLL_28,
3014 .tuner_type = UNSET,
3015 .tuner_addr = ADDR_UNSET,
3016 .radio_addr = ADDR_UNSET,
3017 },
3018 [BTTV_BOARD_KOZUMI_KTV_01C] = {
3019
3020
3021
3022 .name = "Kozumi KTV-01C",
3023 .video_inputs = 3,
3024 .audio_inputs = 1,
3025 .tuner = 0,
3026 .svhs = 2,
3027 .gpiomask = 0x008007,
3028 .muxsel = { 2, 3, 1, 1 },
3029 .gpiomux = { 0, 1, 2, 2 },
3030 .gpiomute = 3,
3031 .needs_tvaudio = 0,
3032 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
3033 .tuner_addr = ADDR_UNSET,
3034 .radio_addr = ADDR_UNSET,
3035 .pll = PLL_28,
3036 .has_radio = 1,
3037 .has_remote = 1,
3038 },
3039 [BTTV_BOARD_ENLTV_FM_2] = {
3040
3041
3042 .name = "Encore ENL TV-FM-2",
3043 .video_inputs = 3,
3044 .audio_inputs = 1,
3045 .tuner = 0,
3046 .svhs = 2,
3047
3048
3049
3050
3051
3052
3053 .gpiomask = 0x060040,
3054 .muxsel = { 2, 3, 3 },
3055 .gpiomux = { 0x60000, 0x60000, 0x20000, 0x20000 },
3056 .gpiomute = 0,
3057 .tuner_type = TUNER_TCL_MF02GIP_5N,
3058 .tuner_addr = ADDR_UNSET,
3059 .radio_addr = ADDR_UNSET,
3060 .pll = PLL_28,
3061 .has_radio = 1,
3062 .has_remote = 1,
3063 },
3064 [BTTV_BOARD_VD012] = {
3065
3066 .name = "PHYTEC VD-012 (bt878)",
3067 .video_inputs = 4,
3068 .audio_inputs = 0,
3069 .tuner = UNSET,
3070 .svhs = UNSET,
3071 .gpiomask = 0x00,
3072 .muxsel = { 0, 2, 3, 1 },
3073 .gpiomux = { 0, 0, 0, 0 },
3074 .needs_tvaudio = 0,
3075 .pll = PLL_28,
3076 .tuner_type = UNSET,
3077 .tuner_addr = ADDR_UNSET,
3078 .radio_addr = ADDR_UNSET,
3079 },
3080 [BTTV_BOARD_VD012_X1] = {
3081
3082 .name = "PHYTEC VD-012-X1 (bt878)",
3083 .video_inputs = 4,
3084 .audio_inputs = 0,
3085 .tuner = UNSET,
3086 .svhs = 3,
3087 .gpiomask = 0x00,
3088 .muxsel = { 2, 3, 1 },
3089 .gpiomux = { 0, 0, 0, 0 },
3090 .needs_tvaudio = 0,
3091 .pll = PLL_28,
3092 .tuner_type = UNSET,
3093 .tuner_addr = ADDR_UNSET,
3094 .radio_addr = ADDR_UNSET,
3095 },
3096 [BTTV_BOARD_VD012_X2] = {
3097
3098 .name = "PHYTEC VD-012-X2 (bt878)",
3099 .video_inputs = 4,
3100 .audio_inputs = 0,
3101 .tuner = UNSET,
3102 .svhs = 3,
3103 .gpiomask = 0x00,
3104 .muxsel = { 3, 2, 1 },
3105 .gpiomux = { 0, 0, 0, 0 },
3106 .needs_tvaudio = 0,
3107 .pll = PLL_28,
3108 .tuner_type = UNSET,
3109 .tuner_addr = ADDR_UNSET,
3110 .radio_addr = ADDR_UNSET,
3111 }
3112};
3113
3114static const unsigned int bttv_num_tvcards = ARRAY_SIZE(bttv_tvcards);
3115
3116
3117
3118static unsigned char eeprom_data[256];
3119
3120
3121
3122
3123void __devinit bttv_idcard(struct bttv *btv)
3124{
3125 unsigned int gpiobits;
3126 int i,type;
3127 unsigned short tmp;
3128
3129
3130 pci_read_config_word(btv->c.pci, PCI_SUBSYSTEM_ID, &tmp);
3131 btv->cardid = tmp << 16;
3132 pci_read_config_word(btv->c.pci, PCI_SUBSYSTEM_VENDOR_ID, &tmp);
3133 btv->cardid |= tmp;
3134
3135 if (0 != btv->cardid && 0xffffffff != btv->cardid) {
3136
3137 for (type = -1, i = 0; cards[i].id != 0; i++)
3138 if (cards[i].id == btv->cardid)
3139 type = i;
3140
3141 if (type != -1) {
3142
3143 printk(KERN_INFO "bttv%d: detected: %s [card=%d], "
3144 "PCI subsystem ID is %04x:%04x\n",
3145 btv->c.nr,cards[type].name,cards[type].cardnr,
3146 btv->cardid & 0xffff,
3147 (btv->cardid >> 16) & 0xffff);
3148 btv->c.type = cards[type].cardnr;
3149 } else {
3150
3151 printk(KERN_INFO "bttv%d: subsystem: %04x:%04x (UNKNOWN)\n",
3152 btv->c.nr, btv->cardid & 0xffff,
3153 (btv->cardid >> 16) & 0xffff);
3154 printk(KERN_DEBUG "please mail id, board name and "
3155 "the correct card= insmod option to video4linux-list@redhat.com\n");
3156 }
3157 }
3158
3159
3160 if (card[btv->c.nr] < bttv_num_tvcards)
3161 btv->c.type=card[btv->c.nr];
3162
3163
3164 printk(KERN_INFO "bttv%d: using: %s [card=%d,%s]\n",btv->c.nr,
3165 bttv_tvcards[btv->c.type].name, btv->c.type,
3166 card[btv->c.nr] < bttv_num_tvcards
3167 ? "insmod option" : "autodetected");
3168
3169
3170 if (UNSET == audioall && UNSET == audiomux[0])
3171 return;
3172
3173 if (UNSET != audiomux[0]) {
3174 gpiobits = 0;
3175 for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {
3176 bttv_tvcards[btv->c.type].gpiomux[i] = audiomux[i];
3177 gpiobits |= audiomux[i];
3178 }
3179 } else {
3180 gpiobits = audioall;
3181 for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {
3182 bttv_tvcards[btv->c.type].gpiomux[i] = audioall;
3183 }
3184 }
3185 bttv_tvcards[btv->c.type].gpiomask = (UNSET != gpiomask) ? gpiomask : gpiobits;
3186 printk(KERN_INFO "bttv%d: gpio config override: mask=0x%x, mux=",
3187 btv->c.nr,bttv_tvcards[btv->c.type].gpiomask);
3188 for (i = 0; i < ARRAY_SIZE(bttv_tvcards->gpiomux); i++) {
3189 printk("%s0x%x", i ? "," : "", bttv_tvcards[btv->c.type].gpiomux[i]);
3190 }
3191 printk("\n");
3192}
3193
3194
3195
3196
3197
3198
3199static void identify_by_eeprom(struct bttv *btv, unsigned char eeprom_data[256])
3200{
3201 int type = -1;
3202
3203 if (0 == strncmp(eeprom_data,"GET MM20xPCTV",13))
3204 type = BTTV_BOARD_MODTEC_205;
3205 else if (0 == strncmp(eeprom_data+20,"Picolo",7))
3206 type = BTTV_BOARD_EURESYS_PICOLO;
3207 else if (eeprom_data[0] == 0x84 && eeprom_data[2]== 0)
3208 type = BTTV_BOARD_HAUPPAUGE;
3209
3210 if (-1 != type) {
3211 btv->c.type = type;
3212 printk("bttv%d: detected by eeprom: %s [card=%d]\n",
3213 btv->c.nr, bttv_tvcards[btv->c.type].name, btv->c.type);
3214 }
3215}
3216
3217static void flyvideo_gpio(struct bttv *btv)
3218{
3219 int gpio, has_remote, has_radio, is_capture_only;
3220 int is_lr90, has_tda9820_tda9821;
3221 int tuner_type = UNSET, ttype;
3222
3223 gpio_inout(0xffffff, 0);
3224 udelay(8);
3225 gpio = gpio_read();
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239 ttype = (gpio & 0x0f0000) >> 16;
3240 switch (ttype) {
3241 case 0x0:
3242 tuner_type = 2;
3243 break;
3244 case 0x2:
3245 tuner_type = 39;
3246 break;
3247 case 0x4:
3248 tuner_type = 5;
3249 break;
3250 case 0x6:
3251 tuner_type = 37;
3252 break;
3253 case 0xC:
3254 tuner_type = 3;
3255 break;
3256 default:
3257 printk(KERN_INFO "bttv%d: FlyVideo_gpio: unknown tuner type.\n", btv->c.nr);
3258 break;
3259 }
3260
3261 has_remote = gpio & 0x800000;
3262 has_radio = gpio & 0x400000;
3263
3264
3265 is_capture_only = !(gpio & 0x008000);
3266 has_tda9820_tda9821 = !(gpio & 0x004000);
3267 is_lr90 = !(gpio & 0x002000);
3268
3269
3270
3271 if (is_capture_only)
3272 tuner_type = TUNER_ABSENT;
3273
3274 printk(KERN_INFO "bttv%d: FlyVideo Radio=%s RemoteControl=%s Tuner=%d gpio=0x%06x\n",
3275 btv->c.nr, has_radio ? "yes" : "no ",
3276 has_remote ? "yes" : "no ", tuner_type, gpio);
3277 printk(KERN_INFO "bttv%d: FlyVideo LR90=%s tda9821/tda9820=%s capture_only=%s\n",
3278 btv->c.nr, is_lr90 ? "yes" : "no ",
3279 has_tda9820_tda9821 ? "yes" : "no ",
3280 is_capture_only ? "yes" : "no ");
3281
3282 if (tuner_type != UNSET)
3283 btv->tuner_type = tuner_type;
3284 btv->has_radio = has_radio;
3285
3286
3287
3288
3289 if (has_tda9820_tda9821)
3290 btv->audio_mode_gpio = lt9415_audio;
3291
3292}
3293
3294static int miro_tunermap[] = { 0,6,2,3, 4,5,6,0, 3,0,4,5, 5,2,16,1,
3295 14,2,17,1, 4,1,4,3, 1,2,16,1, 4,4,4,4 };
3296static int miro_fmtuner[] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1,
3297 1,1,1,1, 1,1,1,0, 0,0,0,0, 0,1,0,0 };
3298
3299static void miro_pinnacle_gpio(struct bttv *btv)
3300{
3301 int id,msp,gpio;
3302 char *info;
3303
3304 gpio_inout(0xffffff, 0);
3305 gpio = gpio_read();
3306 id = ((gpio>>10) & 63) -1;
3307 msp = bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx");
3308 if (id < 32) {
3309 btv->tuner_type = miro_tunermap[id];
3310 if (0 == (gpio & 0x20)) {
3311 btv->has_radio = 1;
3312 if (!miro_fmtuner[id]) {
3313 btv->has_matchbox = 1;
3314 btv->mbox_we = (1<<6);
3315 btv->mbox_most = (1<<7);
3316 btv->mbox_clk = (1<<8);
3317 btv->mbox_data = (1<<9);
3318 btv->mbox_mask = (1<<6)|(1<<7)|(1<<8)|(1<<9);
3319 }
3320 } else {
3321 btv->has_radio = 0;
3322 }
3323 if (-1 != msp) {
3324 if (btv->c.type == BTTV_BOARD_MIRO)
3325 btv->c.type = BTTV_BOARD_MIROPRO;
3326 if (btv->c.type == BTTV_BOARD_PINNACLE)
3327 btv->c.type = BTTV_BOARD_PINNACLEPRO;
3328 }
3329 printk(KERN_INFO
3330 "bttv%d: miro: id=%d tuner=%d radio=%s stereo=%s\n",
3331 btv->c.nr, id+1, btv->tuner_type,
3332 !btv->has_radio ? "no" :
3333 (btv->has_matchbox ? "matchbox" : "fmtuner"),
3334 (-1 == msp) ? "no" : "yes");
3335 } else {
3336
3337 id = 63 - id;
3338 btv->has_radio = 0;
3339 switch (id) {
3340 case 1:
3341 info = "PAL / mono";
3342 btv->tda9887_conf = TDA9887_INTERCARRIER;
3343 break;
3344 case 2:
3345 info = "PAL+SECAM / stereo";
3346 btv->has_radio = 1;
3347 btv->tda9887_conf = TDA9887_QSS;
3348 break;
3349 case 3:
3350 info = "NTSC / stereo";
3351 btv->has_radio = 1;
3352 btv->tda9887_conf = TDA9887_QSS;
3353 break;
3354 case 4:
3355 info = "PAL+SECAM / mono";
3356 btv->tda9887_conf = TDA9887_QSS;
3357 break;
3358 case 5:
3359 info = "NTSC / mono";
3360 btv->tda9887_conf = TDA9887_INTERCARRIER;
3361 break;
3362 case 6:
3363 info = "NTSC / stereo";
3364 btv->tda9887_conf = TDA9887_INTERCARRIER;
3365 break;
3366 case 7:
3367 info = "PAL / stereo";
3368 btv->tda9887_conf = TDA9887_INTERCARRIER;
3369 break;
3370 default:
3371 info = "oops: unknown card";
3372 break;
3373 }
3374 if (-1 != msp)
3375 btv->c.type = BTTV_BOARD_PINNACLEPRO;
3376 printk(KERN_INFO
3377 "bttv%d: pinnacle/mt: id=%d info=\"%s\" radio=%s\n",
3378 btv->c.nr, id, info, btv->has_radio ? "yes" : "no");
3379 btv->tuner_type = TUNER_MT2032;
3380 }
3381}
3382
3383
3384#define LM1882_SYNC_DRIVE 0x200000L
3385
3386static void init_ids_eagle(struct bttv *btv)
3387{
3388 gpio_inout(0xffffff,0xFFFF37);
3389 gpio_write(0x200020);
3390
3391
3392 gpio_write(0x200024);
3393
3394
3395 gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE);
3396
3397
3398 btaor((2)<<5, ~(2<<5), BT848_IFORM);
3399}
3400
3401
3402
3403
3404static void eagle_muxsel(struct bttv *btv, unsigned int input)
3405{
3406 btaor((2)<<5, ~(3<<5), BT848_IFORM);
3407 gpio_bits(3,bttv_tvcards[btv->c.type].muxsel[input&7]);
3408
3409
3410
3411 btor(BT848_ADC_C_SLEEP, BT848_ADC);
3412
3413 btand(~BT848_CONTROL_COMP, BT848_E_CONTROL);
3414 btand(~BT848_CONTROL_COMP, BT848_O_CONTROL);
3415
3416
3417 gpio_bits(LM1882_SYNC_DRIVE,LM1882_SYNC_DRIVE);
3418}
3419
3420static void gvc1100_muxsel(struct bttv *btv, unsigned int input)
3421{
3422 static const int masks[] = {0x30, 0x01, 0x12, 0x23};
3423 gpio_write(masks[input%4]);
3424}
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439static void init_lmlbt4x(struct bttv *btv)
3440{
3441 printk(KERN_DEBUG "LMLBT4x init\n");
3442 btwrite(0x000000, BT848_GPIO_REG_INP);
3443 gpio_inout(0xffffff, 0x0006C0);
3444 gpio_write(0x000000);
3445}
3446
3447static void sigmaSQ_muxsel(struct bttv *btv, unsigned int input)
3448{
3449 unsigned int inmux = input % 8;
3450 gpio_inout( 0xf, 0xf );
3451 gpio_bits( 0xf, inmux );
3452}
3453
3454static void sigmaSLC_muxsel(struct bttv *btv, unsigned int input)
3455{
3456 unsigned int inmux = input % 4;
3457 gpio_inout( 3<<9, 3<<9 );
3458 gpio_bits( 3<<9, inmux<<9 );
3459}
3460
3461static void geovision_muxsel(struct bttv *btv, unsigned int input)
3462{
3463 unsigned int inmux = input % 16;
3464 gpio_inout(0xf, 0xf);
3465 gpio_bits(0xf, inmux);
3466}
3467
3468
3469
3470static void bttv_reset_audio(struct bttv *btv)
3471{
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481 if (btv->id != 878)
3482 return;
3483
3484 if (bttv_debug)
3485 printk("bttv%d: BT878A ARESET\n",btv->c.nr);
3486 btwrite((1<<7), 0x058);
3487 udelay(10);
3488 btwrite( 0, 0x058);
3489}
3490
3491
3492void __devinit bttv_init_card1(struct bttv *btv)
3493{
3494 switch (btv->c.type) {
3495 case BTTV_BOARD_HAUPPAUGE:
3496 case BTTV_BOARD_HAUPPAUGE878:
3497 boot_msp34xx(btv,5);
3498 break;
3499 case BTTV_BOARD_VOODOOTV_200:
3500 case BTTV_BOARD_VOODOOTV_FM:
3501 boot_msp34xx(btv,20);
3502 break;
3503 case BTTV_BOARD_AVERMEDIA98:
3504 boot_msp34xx(btv,11);
3505 break;
3506 case BTTV_BOARD_HAUPPAUGEPVR:
3507 pvr_boot(btv);
3508 break;
3509 case BTTV_BOARD_TWINHAN_DST:
3510 case BTTV_BOARD_AVDVBT_771:
3511 case BTTV_BOARD_PINNACLESAT:
3512 btv->use_i2c_hw = 1;
3513 break;
3514 case BTTV_BOARD_ADLINK_RTV24:
3515 init_RTV24( btv );
3516 break;
3517
3518 }
3519 if (!bttv_tvcards[btv->c.type].has_dvb)
3520 bttv_reset_audio(btv);
3521}
3522
3523
3524void __devinit bttv_init_card2(struct bttv *btv)
3525{
3526 int addr=ADDR_UNSET;
3527
3528 btv->tuner_type = UNSET;
3529
3530 if (BTTV_BOARD_UNKNOWN == btv->c.type) {
3531 bttv_readee(btv,eeprom_data,0xa0);
3532 identify_by_eeprom(btv,eeprom_data);
3533 }
3534
3535 switch (btv->c.type) {
3536 case BTTV_BOARD_MIRO:
3537 case BTTV_BOARD_MIROPRO:
3538 case BTTV_BOARD_PINNACLE:
3539 case BTTV_BOARD_PINNACLEPRO:
3540
3541 miro_pinnacle_gpio(btv);
3542 break;
3543 case BTTV_BOARD_FLYVIDEO_98:
3544 case BTTV_BOARD_MAXI:
3545 case BTTV_BOARD_LIFE_FLYKIT:
3546 case BTTV_BOARD_FLYVIDEO:
3547 case BTTV_BOARD_TYPHOON_TVIEW:
3548 case BTTV_BOARD_CHRONOS_VS2:
3549 case BTTV_BOARD_FLYVIDEO_98FM:
3550 case BTTV_BOARD_FLYVIDEO2000:
3551 case BTTV_BOARD_FLYVIDEO98EZ:
3552 case BTTV_BOARD_CONFERENCETV:
3553 case BTTV_BOARD_LIFETEC_9415:
3554 flyvideo_gpio(btv);
3555 break;
3556 case BTTV_BOARD_HAUPPAUGE:
3557 case BTTV_BOARD_HAUPPAUGE878:
3558 case BTTV_BOARD_HAUPPAUGEPVR:
3559
3560 bttv_readee(btv,eeprom_data,0xa0);
3561 hauppauge_eeprom(btv);
3562 break;
3563 case BTTV_BOARD_AVERMEDIA98:
3564 case BTTV_BOARD_AVPHONE98:
3565 bttv_readee(btv,eeprom_data,0xa0);
3566 avermedia_eeprom(btv);
3567 break;
3568 case BTTV_BOARD_PXC200:
3569 init_PXC200(btv);
3570 break;
3571 case BTTV_BOARD_PICOLO_TETRA_CHIP:
3572 picolo_tetra_init(btv);
3573 break;
3574 case BTTV_BOARD_VHX:
3575 btv->has_radio = 1;
3576 btv->has_matchbox = 1;
3577 btv->mbox_we = 0x20;
3578 btv->mbox_most = 0;
3579 btv->mbox_clk = 0x08;
3580 btv->mbox_data = 0x10;
3581 btv->mbox_mask = 0x38;
3582 break;
3583 case BTTV_BOARD_VOBIS_BOOSTAR:
3584 case BTTV_BOARD_TERRATV:
3585 terratec_active_radio_upgrade(btv);
3586 break;
3587 case BTTV_BOARD_MAGICTVIEW061:
3588 if (btv->cardid == 0x3002144f) {
3589 btv->has_radio=1;
3590 printk("bttv%d: radio detected by subsystem id (CPH05x)\n",btv->c.nr);
3591 }
3592 break;
3593 case BTTV_BOARD_STB2:
3594 if (btv->cardid == 0x3060121a) {
3595
3596
3597 btv->has_radio=0;
3598 btv->tuner_type=TUNER_TEMIC_NTSC;
3599 }
3600 break;
3601 case BTTV_BOARD_OSPREY1x0:
3602 case BTTV_BOARD_OSPREY1x0_848:
3603 case BTTV_BOARD_OSPREY101_848:
3604 case BTTV_BOARD_OSPREY1x1:
3605 case BTTV_BOARD_OSPREY1x1_SVID:
3606 case BTTV_BOARD_OSPREY2xx:
3607 case BTTV_BOARD_OSPREY2x0_SVID:
3608 case BTTV_BOARD_OSPREY2x0:
3609 case BTTV_BOARD_OSPREY440:
3610 case BTTV_BOARD_OSPREY500:
3611 case BTTV_BOARD_OSPREY540:
3612 case BTTV_BOARD_OSPREY2000:
3613 bttv_readee(btv,eeprom_data,0xa0);
3614 osprey_eeprom(btv, eeprom_data);
3615 break;
3616 case BTTV_BOARD_IDS_EAGLE:
3617 init_ids_eagle(btv);
3618 break;
3619 case BTTV_BOARD_MODTEC_205:
3620 bttv_readee(btv,eeprom_data,0xa0);
3621 modtec_eeprom(btv);
3622 break;
3623 case BTTV_BOARD_LMLBT4:
3624 init_lmlbt4x(btv);
3625 break;
3626 case BTTV_BOARD_TIBET_CS16:
3627 tibetCS16_init(btv);
3628 break;
3629 case BTTV_BOARD_KODICOM_4400R:
3630 kodicom4400r_init(btv);
3631 break;
3632 }
3633
3634
3635 if (!(btv->id==848 && btv->revision==0x11)) {
3636
3637 if (PLL_28 == bttv_tvcards[btv->c.type].pll) {
3638 btv->pll.pll_ifreq=28636363;
3639 btv->pll.pll_crystal=BT848_IFORM_XT0;
3640 }
3641 if (PLL_35 == bttv_tvcards[btv->c.type].pll) {
3642 btv->pll.pll_ifreq=35468950;
3643 btv->pll.pll_crystal=BT848_IFORM_XT1;
3644 }
3645
3646 switch (pll[btv->c.nr]) {
3647 case 0:
3648 btv->pll.pll_crystal = 0;
3649 btv->pll.pll_ifreq = 0;
3650 btv->pll.pll_ofreq = 0;
3651 break;
3652 case 1:
3653 case 28:
3654 btv->pll.pll_ifreq = 28636363;
3655 btv->pll.pll_ofreq = 0;
3656 btv->pll.pll_crystal = BT848_IFORM_XT0;
3657 break;
3658 case 2:
3659 case 35:
3660 btv->pll.pll_ifreq = 35468950;
3661 btv->pll.pll_ofreq = 0;
3662 btv->pll.pll_crystal = BT848_IFORM_XT1;
3663 break;
3664 }
3665 }
3666 btv->pll.pll_current = -1;
3667
3668
3669 if (ADDR_UNSET != bttv_tvcards[btv->c.type].tuner_addr)
3670 addr = bttv_tvcards[btv->c.type].tuner_addr;
3671
3672 if (UNSET != bttv_tvcards[btv->c.type].tuner_type)
3673 if(UNSET == btv->tuner_type)
3674 btv->tuner_type = bttv_tvcards[btv->c.type].tuner_type;
3675 if (UNSET != tuner[btv->c.nr])
3676 btv->tuner_type = tuner[btv->c.nr];
3677
3678 if (btv->tuner_type == TUNER_ABSENT ||
3679 bttv_tvcards[btv->c.type].tuner == UNSET)
3680 printk(KERN_INFO "bttv%d: tuner absent\n", btv->c.nr);
3681 else if(btv->tuner_type == UNSET)
3682 printk(KERN_WARNING "bttv%d: tuner type unset\n", btv->c.nr);
3683 else
3684 printk(KERN_INFO "bttv%d: tuner type=%d\n", btv->c.nr,
3685 btv->tuner_type);
3686
3687 if (btv->tuner_type != UNSET) {
3688 struct tuner_setup tun_setup;
3689
3690 tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
3691 tun_setup.type = btv->tuner_type;
3692 tun_setup.addr = addr;
3693
3694 bttv_call_i2c_clients(btv, TUNER_SET_TYPE_ADDR, &tun_setup);
3695 }
3696
3697 if (btv->tda9887_conf) {
3698 struct v4l2_priv_tun_config tda9887_cfg;
3699
3700 tda9887_cfg.tuner = TUNER_TDA9887;
3701 tda9887_cfg.priv = &btv->tda9887_conf;
3702
3703 bttv_call_i2c_clients(btv, TUNER_SET_CONFIG, &tda9887_cfg);
3704 }
3705
3706 btv->svhs = bttv_tvcards[btv->c.type].svhs;
3707 if (svhs[btv->c.nr] != UNSET)
3708 btv->svhs = svhs[btv->c.nr];
3709 if (remote[btv->c.nr] != UNSET)
3710 btv->has_remote = remote[btv->c.nr];
3711
3712 if (bttv_tvcards[btv->c.type].has_radio)
3713 btv->has_radio=1;
3714 if (bttv_tvcards[btv->c.type].has_remote)
3715 btv->has_remote=1;
3716 if (!bttv_tvcards[btv->c.type].no_gpioirq)
3717 btv->gpioirq=1;
3718 if (bttv_tvcards[btv->c.type].volume_gpio)
3719 btv->volume_gpio=bttv_tvcards[btv->c.type].volume_gpio;
3720 if (bttv_tvcards[btv->c.type].audio_mode_gpio)
3721 btv->audio_mode_gpio=bttv_tvcards[btv->c.type].audio_mode_gpio;
3722
3723 if (!autoload)
3724 return;
3725
3726 if (bttv_tvcards[btv->c.type].tuner == UNSET)
3727 return;
3728
3729
3730 if (!bttv_tvcards[btv->c.type].no_msp34xx &&
3731 bttv_I2CRead(btv, I2C_ADDR_MSP3400, "MSP34xx") >=0)
3732 request_module("msp3400");
3733
3734 if (bttv_tvcards[btv->c.type].msp34xx_alt &&
3735 bttv_I2CRead(btv, I2C_ADDR_MSP3400_ALT, "MSP34xx (alternate address)") >=0)
3736 request_module("msp3400");
3737
3738 if (!bttv_tvcards[btv->c.type].no_tda9875 &&
3739 bttv_I2CRead(btv, I2C_ADDR_TDA9875, "TDA9875") >=0)
3740 request_module("tda9875");
3741
3742 if (!bttv_tvcards[btv->c.type].no_tda7432 &&
3743 bttv_I2CRead(btv, I2C_ADDR_TDA7432, "TDA7432") >=0)
3744 request_module("tda7432");
3745
3746 if (bttv_tvcards[btv->c.type].needs_tvaudio)
3747 request_module("tvaudio");
3748
3749 if (btv->tuner_type != UNSET && btv->tuner_type != TUNER_ABSENT)
3750 request_module("tuner");
3751}
3752
3753
3754
3755
3756static void modtec_eeprom(struct bttv *btv)
3757{
3758 if( strncmp(&(eeprom_data[0x1e]),"Temic 4066 FY5",14) ==0) {
3759 btv->tuner_type=TUNER_TEMIC_4066FY5_PAL_I;
3760 printk("bttv%d: Modtec: Tuner autodetected by eeprom: %s\n",
3761 btv->c.nr,&eeprom_data[0x1e]);
3762 } else if (strncmp(&(eeprom_data[0x1e]),"Alps TSBB5",10) ==0) {
3763 btv->tuner_type=TUNER_ALPS_TSBB5_PAL_I;
3764 printk("bttv%d: Modtec: Tuner autodetected by eeprom: %s\n",
3765 btv->c.nr,&eeprom_data[0x1e]);
3766 } else if (strncmp(&(eeprom_data[0x1e]),"Philips FM1246",14) ==0) {
3767 btv->tuner_type=TUNER_PHILIPS_NTSC;
3768 printk("bttv%d: Modtec: Tuner autodetected by eeprom: %s\n",
3769 btv->c.nr,&eeprom_data[0x1e]);
3770 } else {
3771 printk("bttv%d: Modtec: Unknown TunerString: %s\n",
3772 btv->c.nr,&eeprom_data[0x1e]);
3773 }
3774}
3775
3776static void __devinit hauppauge_eeprom(struct bttv *btv)
3777{
3778 struct tveeprom tv;
3779
3780 tveeprom_hauppauge_analog(&btv->i2c_client, &tv, eeprom_data);
3781 btv->tuner_type = tv.tuner_type;
3782 btv->has_radio = tv.has_radio;
3783
3784 printk("bttv%d: Hauppauge eeprom indicates model#%d\n",
3785 btv->c.nr, tv.model);
3786
3787
3788
3789
3790
3791 if(tv.model == 64900) {
3792 printk("bttv%d: Switching board type from %s to %s\n",
3793 btv->c.nr,
3794 bttv_tvcards[btv->c.type].name,
3795 bttv_tvcards[BTTV_BOARD_HAUPPAUGE_IMPACTVCB].name);
3796 btv->c.type = BTTV_BOARD_HAUPPAUGE_IMPACTVCB;
3797 }
3798}
3799
3800static int terratec_active_radio_upgrade(struct bttv *btv)
3801{
3802 int freq;
3803
3804 btv->has_radio = 1;
3805 btv->has_matchbox = 1;
3806 btv->mbox_we = 0x10;
3807 btv->mbox_most = 0x20;
3808 btv->mbox_clk = 0x08;
3809 btv->mbox_data = 0x04;
3810 btv->mbox_mask = 0x3c;
3811
3812 btv->mbox_iow = 1 << 8;
3813 btv->mbox_ior = 1 << 9;
3814 btv->mbox_csel = 1 << 10;
3815
3816 freq=88000/62.5;
3817 tea5757_write(btv, 5 * freq + 0x358);
3818 if (0x1ed8 == tea5757_read(btv)) {
3819 printk("bttv%d: Terratec Active Radio Upgrade found.\n",
3820 btv->c.nr);
3821 btv->has_radio = 1;
3822 btv->has_matchbox = 1;
3823 } else {
3824 btv->has_radio = 0;
3825 btv->has_matchbox = 0;
3826 }
3827 return 0;
3828}
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840#define PVR_GPIO_DELAY 10
3841
3842#define BTTV_ALT_DATA 0x000001
3843#define BTTV_ALT_DCLK 0x100000
3844#define BTTV_ALT_NCONFIG 0x800000
3845
3846static int __devinit pvr_altera_load(struct bttv *btv, const u8 *micro,
3847 u32 microlen)
3848{
3849 u32 n;
3850 u8 bits;
3851 int i;
3852
3853 gpio_inout(0xffffff,BTTV_ALT_DATA|BTTV_ALT_DCLK|BTTV_ALT_NCONFIG);
3854 gpio_write(0);
3855 udelay(PVR_GPIO_DELAY);
3856
3857 gpio_write(BTTV_ALT_NCONFIG);
3858 udelay(PVR_GPIO_DELAY);
3859
3860 for (n = 0; n < microlen; n++) {
3861 bits = micro[n];
3862 for (i = 0 ; i < 8 ; i++) {
3863 gpio_bits(BTTV_ALT_DCLK,0);
3864 if (bits & 0x01)
3865 gpio_bits(BTTV_ALT_DATA,BTTV_ALT_DATA);
3866 else
3867 gpio_bits(BTTV_ALT_DATA,0);
3868 gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK);
3869 bits >>= 1;
3870 }
3871 }
3872 gpio_bits(BTTV_ALT_DCLK,0);
3873 udelay(PVR_GPIO_DELAY);
3874
3875
3876 for (i = 0 ; i < 30 ; i++) {
3877 gpio_bits(BTTV_ALT_DCLK,0);
3878 gpio_bits(BTTV_ALT_DCLK,BTTV_ALT_DCLK);
3879 }
3880 gpio_bits(BTTV_ALT_DCLK,0);
3881 return 0;
3882}
3883
3884static int __devinit pvr_boot(struct bttv *btv)
3885{
3886 const struct firmware *fw_entry;
3887 int rc;
3888
3889 rc = request_firmware(&fw_entry, "hcwamc.rbf", &btv->c.pci->dev);
3890 if (rc != 0) {
3891 printk(KERN_WARNING "bttv%d: no altera firmware [via hotplug]\n",
3892 btv->c.nr);
3893 return rc;
3894 }
3895 rc = pvr_altera_load(btv, fw_entry->data, fw_entry->size);
3896 printk(KERN_INFO "bttv%d: altera firmware upload %s\n",
3897 btv->c.nr, (rc < 0) ? "failed" : "ok");
3898 release_firmware(fw_entry);
3899 return rc;
3900}
3901
3902
3903
3904
3905static void __devinit osprey_eeprom(struct bttv *btv, const u8 ee[256])
3906{
3907 int i;
3908 u32 serial = 0;
3909 int cardid = -1;
3910
3911
3912 if (btv->c.type == BTTV_BOARD_UNKNOWN) {
3913
3914 if (!strncmp(ee, "MMAC", 4)) {
3915 u8 checksum = 0;
3916 for (i = 0; i < 21; i++)
3917 checksum += ee[i];
3918 if (checksum != ee[21])
3919 return;
3920 cardid = BTTV_BOARD_OSPREY1x0_848;
3921 for (i = 12; i < 21; i++)
3922 serial *= 10, serial += ee[i] - '0';
3923 }
3924 } else {
3925 unsigned short type;
3926
3927 for (i = 4*16; i < 8*16; i += 16) {
3928 u16 checksum = ip_compute_csum(ee + i, 16);
3929
3930 if ((checksum&0xff) + (checksum>>8) == 0xff)
3931 break;
3932 }
3933 if (i >= 8*16)
3934 return;
3935 ee += i;
3936
3937
3938 type = get_unaligned_be16((__be16 *)(ee+4));
3939
3940 switch(type) {
3941
3942 case 0x0004:
3943 cardid = BTTV_BOARD_OSPREY1x0_848;
3944 break;
3945 case 0x0005:
3946 cardid = BTTV_BOARD_OSPREY101_848;
3947 break;
3948
3949
3950 case 0x0012:
3951 case 0x0013:
3952 cardid = BTTV_BOARD_OSPREY1x0;
3953 break;
3954 case 0x0014:
3955 case 0x0015:
3956 cardid = BTTV_BOARD_OSPREY1x1;
3957 break;
3958 case 0x0016:
3959 case 0x0017:
3960 case 0x0020:
3961 cardid = BTTV_BOARD_OSPREY1x1_SVID;
3962 break;
3963 case 0x0018:
3964 case 0x0019:
3965 case 0x001E:
3966 case 0x001F:
3967 cardid = BTTV_BOARD_OSPREY2xx;
3968 break;
3969 case 0x001A:
3970 case 0x001B:
3971 cardid = BTTV_BOARD_OSPREY2x0_SVID;
3972 break;
3973 case 0x0040:
3974 cardid = BTTV_BOARD_OSPREY500;
3975 break;
3976 case 0x0050:
3977 case 0x0056:
3978 cardid = BTTV_BOARD_OSPREY540;
3979
3980 break;
3981 case 0x0060:
3982 case 0x0070:
3983 case 0x00A0:
3984 cardid = BTTV_BOARD_OSPREY2x0;
3985
3986 gpio_inout(0xffffff,0x000303);
3987 break;
3988 case 0x00D8:
3989 cardid = BTTV_BOARD_OSPREY440;
3990 break;
3991 default:
3992
3993 printk(KERN_INFO "bttv%d: "
3994 "osprey eeprom: unknown card type 0x%04x\n",
3995 btv->c.nr, type);
3996 break;
3997 }
3998 serial = get_unaligned_be32((__be32 *)(ee+6));
3999 }
4000
4001 printk(KERN_INFO "bttv%d: osprey eeprom: card=%d '%s' serial=%u\n",
4002 btv->c.nr, cardid,
4003 cardid>0 ? bttv_tvcards[cardid].name : "Unknown", serial);
4004
4005 if (cardid<0 || btv->c.type == cardid)
4006 return;
4007
4008
4009 if (card[btv->c.nr] < bttv_num_tvcards) {
4010 printk(KERN_WARNING "bttv%d: osprey eeprom: "
4011 "Not overriding user specified card type\n", btv->c.nr);
4012 } else {
4013 printk(KERN_INFO "bttv%d: osprey eeprom: "
4014 "Changing card type from %d to %d\n", btv->c.nr,
4015 btv->c.type, cardid);
4016 btv->c.type = cardid;
4017 }
4018}
4019
4020
4021
4022
4023static int tuner_0_table[] = {
4024 TUNER_PHILIPS_NTSC, TUNER_PHILIPS_PAL ,
4025 TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL ,
4026 TUNER_PHILIPS_PAL, TUNER_PHILIPS_PAL,
4027 TUNER_PHILIPS_SECAM, TUNER_PHILIPS_SECAM,
4028 TUNER_PHILIPS_SECAM, TUNER_PHILIPS_PAL,
4029 TUNER_PHILIPS_FM1216ME_MK3 };
4030
4031static int tuner_1_table[] = {
4032 TUNER_TEMIC_NTSC, TUNER_TEMIC_PAL,
4033 TUNER_TEMIC_PAL, TUNER_TEMIC_PAL,
4034 TUNER_TEMIC_PAL, TUNER_TEMIC_PAL,
4035 TUNER_TEMIC_4012FY5, TUNER_TEMIC_4012FY5,
4036 TUNER_TEMIC_4012FY5, TUNER_TEMIC_PAL};
4037
4038static void __devinit avermedia_eeprom(struct bttv *btv)
4039{
4040 int tuner_make, tuner_tv_fm, tuner_format, tuner_type = 0;
4041
4042 tuner_make = (eeprom_data[0x41] & 0x7);
4043 tuner_tv_fm = (eeprom_data[0x41] & 0x18) >> 3;
4044 tuner_format = (eeprom_data[0x42] & 0xf0) >> 4;
4045 btv->has_remote = (eeprom_data[0x42] & 0x01);
4046
4047 if (tuner_make == 0 || tuner_make == 2)
4048 if (tuner_format <= 0x0a)
4049 tuner_type = tuner_0_table[tuner_format];
4050 if (tuner_make == 1)
4051 if (tuner_format <= 9)
4052 tuner_type = tuner_1_table[tuner_format];
4053
4054 if (tuner_make == 4)
4055 if (tuner_format == 0x09)
4056 tuner_type = TUNER_LG_NTSC_NEW_TAPC;
4057
4058 printk(KERN_INFO "bttv%d: Avermedia eeprom[0x%02x%02x]: tuner=",
4059 btv->c.nr, eeprom_data[0x41], eeprom_data[0x42]);
4060 if (tuner_type) {
4061 btv->tuner_type = tuner_type;
4062 printk(KERN_CONT "%d", tuner_type);
4063 } else
4064 printk(KERN_CONT "Unknown type");
4065 printk(KERN_CONT " radio:%s remote control:%s\n",
4066 tuner_tv_fm ? "yes" : "no",
4067 btv->has_remote ? "yes" : "no");
4068}
4069
4070
4071void bttv_tda9880_setnorm(struct bttv *btv, int norm)
4072{
4073
4074 if(norm==V4L2_STD_NTSC) {
4075 bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomux[TVAUDIO_INPUT_TUNER]=0x957fff;
4076 bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomute=0x957fff;
4077 bttv_tvcards[BTTV_BOARD_VOODOOTV_200].gpiomux[TVAUDIO_INPUT_TUNER]=0x957fff;
4078 bttv_tvcards[BTTV_BOARD_VOODOOTV_200].gpiomute=0x957fff;
4079 dprintk("bttv_tda9880_setnorm to NTSC\n");
4080 }
4081 else {
4082 bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomux[TVAUDIO_INPUT_TUNER]=0x947fff;
4083 bttv_tvcards[BTTV_BOARD_VOODOOTV_FM].gpiomute=0x947fff;
4084 bttv_tvcards[BTTV_BOARD_VOODOOTV_200].gpiomux[TVAUDIO_INPUT_TUNER]=0x947fff;
4085 bttv_tvcards[BTTV_BOARD_VOODOOTV_200].gpiomute=0x947fff;
4086 dprintk("bttv_tda9880_setnorm to PAL\n");
4087 }
4088
4089 gpio_bits(bttv_tvcards[btv->c.type].gpiomask,
4090 bttv_tvcards[btv->c.type].gpiomux[btv->audio]);
4091}
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101static void __devinit boot_msp34xx(struct bttv *btv, int pin)
4102{
4103 int mask = (1 << pin);
4104
4105 gpio_inout(mask,mask);
4106 gpio_bits(mask,0);
4107 mdelay(2);
4108 udelay(500);
4109 gpio_bits(mask,mask);
4110
4111 if (bttv_gpio)
4112 bttv_gpio_tracking(btv,"msp34xx");
4113 if (bttv_verbose)
4114 printk(KERN_INFO "bttv%d: Hauppauge/Voodoo msp34xx: reset line "
4115 "init [%d]\n", btv->c.nr, pin);
4116}
4117
4118
4119
4120
4121
4122
4123
4124static void __devinit init_PXC200(struct bttv *btv)
4125{
4126 static int vals[] __devinitdata = { 0x08, 0x09, 0x0a, 0x0b, 0x0d, 0x0d,
4127 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,
4128 0x00 };
4129 unsigned int i;
4130 int tmp;
4131 u32 val;
4132
4133
4134 gpio_inout(0xffffff, (1<<13));
4135 gpio_write(0);
4136 udelay(3);
4137 gpio_write(1<<13);
4138
4139
4140 gpio_bits(0xffffff, 0);
4141 if (bttv_gpio)
4142 bttv_gpio_tracking(btv,"pxc200");
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152 btwrite(BT848_ADC_RESERVED|BT848_ADC_AGC_EN, BT848_ADC);
4153
4154
4155 printk(KERN_INFO "Setting DAC reference voltage level ...\n");
4156 bttv_I2CWrite(btv,0x5E,0,0x80,1);
4157
4158
4159
4160
4161
4162
4163
4164 printk(KERN_INFO "Initialising 12C508 PIC chip ...\n");
4165
4166
4167 val = btread(BT848_GPIO_DMA_CTL);
4168 val |= BT848_GPIO_DMA_CTL_GPCLKMODE;
4169 btwrite(val, BT848_GPIO_DMA_CTL);
4170
4171
4172
4173
4174
4175 gpio_inout(0xffffff,(1<<2));
4176 gpio_write(0);
4177 udelay(10);
4178 gpio_write(1<<2);
4179
4180 for (i = 0; i < ARRAY_SIZE(vals); i++) {
4181 tmp=bttv_I2CWrite(btv,0x1E,0,vals[i],1);
4182 if (tmp != -1) {
4183 printk(KERN_INFO
4184 "I2C Write(%2.2x) = %i\nI2C Read () = %2.2x\n\n",
4185 vals[i],tmp,bttv_I2CRead(btv,0x1F,NULL));
4186 }
4187 }
4188
4189 printk(KERN_INFO "PXC200 Initialised.\n");
4190}
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222static void
4223init_RTV24 (struct bttv *btv)
4224{
4225 uint32_t dataRead = 0;
4226 long watchdog_value = 0x0E;
4227
4228 printk (KERN_INFO
4229 "bttv%d: Adlink RTV-24 initialisation in progress ...\n",
4230 btv->c.nr);
4231
4232 btwrite (0x00c3feff, BT848_GPIO_OUT_EN);
4233
4234 btwrite (0 + watchdog_value, BT848_GPIO_DATA);
4235 msleep (1);
4236 btwrite (0x10 + watchdog_value, BT848_GPIO_DATA);
4237 msleep (10);
4238 btwrite (0 + watchdog_value, BT848_GPIO_DATA);
4239
4240 dataRead = btread (BT848_GPIO_DATA);
4241
4242 if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 1)) {
4243 printk (KERN_INFO
4244 "bttv%d: Adlink RTV-24 initialisation(1) ERROR_CPLD_Check_Failed (read %d)\n",
4245 btv->c.nr, dataRead);
4246 }
4247
4248 btwrite (0x4400 + watchdog_value, BT848_GPIO_DATA);
4249 msleep (10);
4250 btwrite (0x4410 + watchdog_value, BT848_GPIO_DATA);
4251 msleep (1);
4252 btwrite (watchdog_value, BT848_GPIO_DATA);
4253 msleep (1);
4254 dataRead = btread (BT848_GPIO_DATA);
4255
4256 if ((((dataRead >> 18) & 0x01) != 0) || (((dataRead >> 19) & 0x01) != 0)) {
4257 printk (KERN_INFO
4258 "bttv%d: Adlink RTV-24 initialisation(2) ERROR_CPLD_Check_Failed (read %d)\n",
4259 btv->c.nr, dataRead);
4260
4261 return;
4262 }
4263
4264 printk (KERN_INFO
4265 "bttv%d: Adlink RTV-24 initialisation complete.\n", btv->c.nr);
4266}
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279static void bus_low(struct bttv *btv, int bit)
4280{
4281 if (btv->mbox_ior) {
4282 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
4283 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
4284 udelay(5);
4285 }
4286
4287 gpio_bits(bit,0);
4288 udelay(5);
4289
4290 if (btv->mbox_ior) {
4291 gpio_bits(btv->mbox_iow | btv->mbox_csel, 0);
4292 udelay(5);
4293 }
4294}
4295
4296static void bus_high(struct bttv *btv, int bit)
4297{
4298 if (btv->mbox_ior) {
4299 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
4300 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
4301 udelay(5);
4302 }
4303
4304 gpio_bits(bit,bit);
4305 udelay(5);
4306
4307 if (btv->mbox_ior) {
4308 gpio_bits(btv->mbox_iow | btv->mbox_csel, 0);
4309 udelay(5);
4310 }
4311}
4312
4313static int bus_in(struct bttv *btv, int bit)
4314{
4315 if (btv->mbox_ior) {
4316 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
4317 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
4318 udelay(5);
4319
4320 gpio_bits(btv->mbox_iow | btv->mbox_csel, 0);
4321 udelay(5);
4322 }
4323 return gpio_read() & (bit);
4324}
4325
4326
4327#define TEA_FREQ 0:14
4328#define TEA_BUFFER 15:15
4329
4330#define TEA_SIGNAL_STRENGTH 16:17
4331
4332#define TEA_PORT1 18:18
4333#define TEA_PORT0 19:19
4334
4335#define TEA_BAND 20:21
4336#define TEA_BAND_FM 0
4337#define TEA_BAND_MW 1
4338#define TEA_BAND_LW 2
4339#define TEA_BAND_SW 3
4340
4341#define TEA_MONO 22:22
4342#define TEA_ALLOW_STEREO 0
4343#define TEA_FORCE_MONO 1
4344
4345#define TEA_SEARCH_DIRECTION 23:23
4346#define TEA_SEARCH_DOWN 0
4347#define TEA_SEARCH_UP 1
4348
4349#define TEA_STATUS 24:24
4350#define TEA_STATUS_TUNED 0
4351#define TEA_STATUS_SEARCHING 1
4352
4353
4354static int tea5757_read(struct bttv *btv)
4355{
4356 unsigned long timeout;
4357 int value = 0;
4358 int i;
4359
4360
4361 gpio_inout(btv->mbox_mask, btv->mbox_clk | btv->mbox_we);
4362
4363 if (btv->mbox_ior) {
4364 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
4365 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
4366 udelay(5);
4367 }
4368
4369 if (bttv_gpio)
4370 bttv_gpio_tracking(btv,"tea5757 read");
4371
4372 bus_low(btv,btv->mbox_we);
4373 bus_low(btv,btv->mbox_clk);
4374
4375 udelay(10);
4376 timeout= jiffies + msecs_to_jiffies(1000);
4377
4378
4379 while (bus_in(btv,btv->mbox_data) && time_before(jiffies, timeout))
4380 schedule();
4381 if (bus_in(btv,btv->mbox_data)) {
4382 printk(KERN_WARNING "bttv%d: tea5757: read timeout\n",btv->c.nr);
4383 return -1;
4384 }
4385
4386 dprintk("bttv%d: tea5757:",btv->c.nr);
4387 for (i = 0; i < 24; i++) {
4388 udelay(5);
4389 bus_high(btv,btv->mbox_clk);
4390 udelay(5);
4391 dprintk("%c",(bus_in(btv,btv->mbox_most) == 0)?'T':'-');
4392 bus_low(btv,btv->mbox_clk);
4393 value <<= 1;
4394 value |= (bus_in(btv,btv->mbox_data) == 0)?0:1;
4395 dprintk("%c", (bus_in(btv,btv->mbox_most) == 0)?'S':'M');
4396 }
4397 dprintk("\nbttv%d: tea5757: read 0x%X\n", btv->c.nr, value);
4398 return value;
4399}
4400
4401static int tea5757_write(struct bttv *btv, int value)
4402{
4403 int i;
4404 int reg = value;
4405
4406 gpio_inout(btv->mbox_mask, btv->mbox_clk | btv->mbox_we | btv->mbox_data);
4407
4408 if (btv->mbox_ior) {
4409 gpio_bits(btv->mbox_ior | btv->mbox_iow | btv->mbox_csel,
4410 btv->mbox_ior | btv->mbox_iow | btv->mbox_csel);
4411 udelay(5);
4412 }
4413 if (bttv_gpio)
4414 bttv_gpio_tracking(btv,"tea5757 write");
4415
4416 dprintk("bttv%d: tea5757: write 0x%X\n", btv->c.nr, value);
4417 bus_low(btv,btv->mbox_clk);
4418 bus_high(btv,btv->mbox_we);
4419 for (i = 0; i < 25; i++) {
4420 if (reg & 0x1000000)
4421 bus_high(btv,btv->mbox_data);
4422 else
4423 bus_low(btv,btv->mbox_data);
4424 reg <<= 1;
4425 bus_high(btv,btv->mbox_clk);
4426 udelay(10);
4427 bus_low(btv,btv->mbox_clk);
4428 udelay(10);
4429 }
4430 bus_low(btv,btv->mbox_we);
4431 return 0;
4432}
4433
4434void tea5757_set_freq(struct bttv *btv, unsigned short freq)
4435{
4436 dprintk("tea5757_set_freq %d\n",freq);
4437 tea5757_write(btv, 5 * freq + 0x358);
4438}
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464static void rv605_muxsel(struct bttv *btv, unsigned int input)
4465{
4466
4467 gpio_bits(0x200,0x200);
4468 mdelay(1);
4469 gpio_bits(0x200,0x000);
4470 mdelay(1);
4471
4472
4473 gpio_bits(0x480,0x080);
4474 gpio_bits(0x480,0x480);
4475 mdelay(1);
4476 gpio_bits(0x480,0x080);
4477 mdelay(1);
4478}
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508static void tibetCS16_muxsel(struct bttv *btv, unsigned int input)
4509{
4510
4511 gpio_bits(0x0f0000, input << 16);
4512}
4513
4514static void tibetCS16_init(struct bttv *btv)
4515{
4516
4517 gpio_inout(0xffffff, 0x0f7fff);
4518 gpio_write(0x0f7fff);
4519}
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550static void kodicom4400r_write(struct bttv *btv,
4551 unsigned char xaddr,
4552 unsigned char yaddr,
4553 unsigned char data) {
4554 unsigned int udata;
4555
4556 udata = (data << 7) | ((yaddr&3) << 4) | (xaddr&0xf);
4557 gpio_bits(0x1ff, udata);
4558 gpio_bits(0x1ff, udata | (1 << 8));
4559 gpio_bits(0x1ff, udata);
4560}
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570static void kodicom4400r_muxsel(struct bttv *btv, unsigned int input)
4571{
4572 char *sw_status;
4573 int xaddr, yaddr;
4574 struct bttv *mctlr;
4575 static unsigned char map[4] = {3, 0, 2, 1};
4576
4577 mctlr = master[btv->c.nr];
4578 if (mctlr == NULL) {
4579 return;
4580 }
4581 yaddr = (btv->c.nr - mctlr->c.nr + 1) & 3;
4582 yaddr = map[yaddr];
4583 sw_status = (char *)(&mctlr->mbox_we);
4584 xaddr = input & 0xf;
4585
4586 if (sw_status[yaddr] != xaddr)
4587 {
4588
4589 kodicom4400r_write(mctlr, sw_status[yaddr], yaddr, 0);
4590 sw_status[yaddr] = xaddr;
4591 kodicom4400r_write(mctlr, xaddr, yaddr, 1);
4592 }
4593}
4594
4595
4596
4597
4598
4599
4600
4601static void kodicom4400r_init(struct bttv *btv)
4602{
4603 char *sw_status = (char *)(&btv->mbox_we);
4604 int ix;
4605
4606 gpio_inout(0x0003ff, 0x0003ff);
4607 gpio_write(1 << 9);
4608 gpio_write(0);
4609
4610 for (ix = 0; ix < 4; ix++) {
4611 sw_status[ix] = ix;
4612 kodicom4400r_write(btv, ix, ix, 1);
4613 }
4614
4615
4616
4617
4618
4619 if ((btv->c.nr<1) || (btv->c.nr>BTTV_MAX-3))
4620 return;
4621 master[btv->c.nr-1] = btv;
4622 master[btv->c.nr] = btv;
4623 master[btv->c.nr+1] = btv;
4624 master[btv->c.nr+2] = btv;
4625}
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635#define ENA0 0x01
4636#define ENB0 0x02
4637#define ENA1 0x04
4638#define ENB1 0x08
4639
4640#define IN10 0x10
4641#define IN00 0x20
4642#define IN11 0x40
4643#define IN01 0x80
4644
4645static void xguard_muxsel(struct bttv *btv, unsigned int input)
4646{
4647 static const int masks[] = {
4648 ENB0, ENB0|IN00, ENB0|IN10, ENB0|IN00|IN10,
4649 ENA0, ENA0|IN00, ENA0|IN10, ENA0|IN00|IN10,
4650 ENB1, ENB1|IN01, ENB1|IN11, ENB1|IN01|IN11,
4651 ENA1, ENA1|IN01, ENA1|IN11, ENA1|IN01|IN11,
4652 };
4653 gpio_write(masks[input%16]);
4654}
4655static void picolo_tetra_init(struct bttv *btv)
4656{
4657
4658 btwrite (0x08<<16,BT848_GPIO_DATA);
4659 btwrite (0x04<<16,BT848_GPIO_DATA);
4660}
4661static void picolo_tetra_muxsel (struct bttv* btv, unsigned int input)
4662{
4663
4664 dprintk (KERN_DEBUG "bttv%d : picolo_tetra_muxsel => input = %d\n",btv->c.nr,input);
4665
4666
4667 btwrite (input<<20,BT848_GPIO_DATA);
4668
4669}
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695#define I2C_TDA8540 0x90
4696#define I2C_TDA8540_ALT1 0x92
4697#define I2C_TDA8540_ALT2 0x94
4698#define I2C_TDA8540_ALT3 0x96
4699#define I2C_TDA8540_ALT4 0x98
4700#define I2C_TDA8540_ALT5 0x9a
4701#define I2C_TDA8540_ALT6 0x9c
4702
4703static void ivc120_muxsel(struct bttv *btv, unsigned int input)
4704{
4705
4706 int key = input % 4;
4707 int matrix = input / 4;
4708
4709 dprintk("bttv%d: ivc120_muxsel: Input - %02d | TDA - %02d | In - %02d\n",
4710 btv->c.nr, input, matrix, key);
4711
4712
4713 bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x00,
4714 ((matrix == 3) ? (key | key << 2) : 0x00), 1);
4715 bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x00,
4716 ((matrix == 0) ? (key | key << 2) : 0x00), 1);
4717 bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x00,
4718 ((matrix == 1) ? (key | key << 2) : 0x00), 1);
4719 bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x00,
4720 ((matrix == 2) ? (key | key << 2) : 0x00), 1);
4721
4722
4723 bttv_I2CWrite(btv, I2C_TDA8540_ALT3, 0x02,
4724 ((matrix == 3) ? 0x03 : 0x00), 1);
4725 bttv_I2CWrite(btv, I2C_TDA8540_ALT4, 0x02,
4726 ((matrix == 0) ? 0x03 : 0x00), 1);
4727 bttv_I2CWrite(btv, I2C_TDA8540_ALT5, 0x02,
4728 ((matrix == 1) ? 0x03 : 0x00), 1);
4729 bttv_I2CWrite(btv, I2C_TDA8540_ALT6, 0x02,
4730 ((matrix == 2) ? 0x03 : 0x00), 1);
4731
4732
4733 btaor((0)<<5, ~(3<<5), BT848_IFORM);
4734}
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748#define PX_CFG_PXC200F 0x01
4749#define PX_FLAG_PXC200A 0x00001000
4750#define PX_I2C_PIC 0x0f
4751#define PX_PXC200A_CARDID 0x200a1295
4752#define PX_I2C_CMD_CFG 0x00
4753
4754static void PXC200_muxsel(struct bttv *btv, unsigned int input)
4755{
4756 int rc;
4757 long mux;
4758 int bitmask;
4759 unsigned char buf[2];
4760
4761
4762
4763 buf[0]=0;
4764 buf[1]=0;
4765 rc=bttv_I2CWrite(btv,(PX_I2C_PIC<<1),buf[0],buf[1],1);
4766 if (rc) {
4767 printk(KERN_DEBUG "bttv%d: PXC200_muxsel: pic cfg write failed:%d\n", btv->c.nr,rc);
4768
4769 return;
4770 }
4771
4772 rc=bttv_I2CRead(btv,(PX_I2C_PIC<<1),NULL);
4773 if (!(rc & PX_CFG_PXC200F)) {
4774 printk(KERN_DEBUG "bttv%d: PXC200_muxsel: not PXC200F rc:%d \n", btv->c.nr,rc);
4775 return;
4776 }
4777
4778
4779
4780
4781
4782
4783 mux = input;
4784
4785
4786
4787 bitmask=0x302;
4788
4789 if (btv->cardid == PX_PXC200A_CARDID) {
4790 bitmask ^= 0x180;
4791 bitmask |= 7<<4;
4792 }
4793 btwrite(bitmask, BT848_GPIO_OUT_EN);
4794
4795 bitmask = btread(BT848_GPIO_DATA);
4796 if (btv->cardid == PX_PXC200A_CARDID)
4797 bitmask = (bitmask & ~0x280) | ((mux & 2) << 8) | ((mux & 1) << 7);
4798 else
4799 bitmask = (bitmask & ~0x300) | ((mux & 3) << 8);
4800 btwrite(bitmask,BT848_GPIO_DATA);
4801
4802
4803
4804
4805
4806
4807
4808
4809 if (btv->cardid == PX_PXC200A_CARDID)
4810 btaor(2<<5, ~BT848_IFORM_MUXSEL, BT848_IFORM);
4811 else
4812 btand(~BT848_IFORM_MUXSEL,BT848_IFORM);
4813
4814 printk(KERN_DEBUG "bttv%d: setting input channel to:%d\n", btv->c.nr,(int)mux);
4815}
4816
4817
4818
4819
4820void __init bttv_check_chipset(void)
4821{
4822 int pcipci_fail = 0;
4823 struct pci_dev *dev = NULL;
4824
4825 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL))
4826 pcipci_fail = 1;
4827 if (pci_pci_problems & (PCIPCI_TRITON|PCIPCI_NATOMA|PCIPCI_VIAETBF))
4828 triton1 = 1;
4829 if (pci_pci_problems & PCIPCI_VSFX)
4830 vsfx = 1;
4831#ifdef PCIPCI_ALIMAGIK
4832 if (pci_pci_problems & PCIPCI_ALIMAGIK)
4833 latency = 0x0A;
4834#endif
4835
4836
4837
4838 if (triton1)
4839 printk(KERN_INFO "bttv: Host bridge needs ETBF enabled.\n");
4840 if (vsfx)
4841 printk(KERN_INFO "bttv: Host bridge needs VSFX enabled.\n");
4842 if (pcipci_fail) {
4843 printk(KERN_INFO "bttv: bttv and your chipset may not work "
4844 "together.\n");
4845 if (!no_overlay) {
4846 printk(KERN_INFO "bttv: overlay will be disabled.\n");
4847 no_overlay = 1;
4848 } else {
4849 printk(KERN_INFO "bttv: overlay forced. Use this "
4850 "option at your own risk.\n");
4851 }
4852 }
4853 if (UNSET != latency)
4854 printk(KERN_INFO "bttv: pci latency fixup [%d]\n",latency);
4855 while ((dev = pci_get_device(PCI_VENDOR_ID_INTEL,
4856 PCI_DEVICE_ID_INTEL_82441, dev))) {
4857 unsigned char b;
4858 pci_read_config_byte(dev, 0x53, &b);
4859 if (bttv_debug)
4860 printk(KERN_INFO "bttv: Host bridge: 82441FX Natoma, "
4861 "bufcon=0x%02x\n",b);
4862 }
4863}
4864
4865int __devinit bttv_handle_chipset(struct bttv *btv)
4866{
4867 unsigned char command;
4868
4869 if (!triton1 && !vsfx && UNSET == latency)
4870 return 0;
4871
4872 if (bttv_verbose) {
4873 if (triton1)
4874 printk(KERN_INFO "bttv%d: enabling ETBF (430FX/VP3 compatibilty)\n",btv->c.nr);
4875 if (vsfx && btv->id >= 878)
4876 printk(KERN_INFO "bttv%d: enabling VSFX\n",btv->c.nr);
4877 if (UNSET != latency)
4878 printk(KERN_INFO "bttv%d: setting pci timer to %d\n",
4879 btv->c.nr,latency);
4880 }
4881
4882 if (btv->id < 878) {
4883
4884 if (triton1)
4885 btv->triton1 = BT848_INT_ETBF;
4886 } else {
4887
4888 pci_read_config_byte(btv->c.pci, BT878_DEVCTRL, &command);
4889 if (triton1)
4890 command |= BT878_EN_TBFX;
4891 if (vsfx)
4892 command |= BT878_EN_VSFX;
4893 pci_write_config_byte(btv->c.pci, BT878_DEVCTRL, command);
4894 }
4895 if (UNSET != latency)
4896 pci_write_config_byte(btv->c.pci, PCI_LATENCY_TIMER, latency);
4897 return 0;
4898}
4899
4900
4901
4902
4903
4904
4905
4906