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