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