diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/media/video/cx88/cx88-cards.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/media/video/cx88/cx88-cards.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-cards.c | 938 |
1 files changed, 938 insertions, 0 deletions
diff --git a/drivers/media/video/cx88/cx88-cards.c b/drivers/media/video/cx88/cx88-cards.c new file mode 100644 index 000000000000..367624822d77 --- /dev/null +++ b/drivers/media/video/cx88/cx88-cards.c | |||
@@ -0,0 +1,938 @@ | |||
1 | /* | ||
2 | * $Id: cx88-cards.c,v 1.66 2005/03/04 09:12:23 kraxel Exp $ | ||
3 | * | ||
4 | * device driver for Conexant 2388x based TV cards | ||
5 | * card-specific stuff. | ||
6 | * | ||
7 | * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs] | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License as published by | ||
11 | * the Free Software Foundation; either version 2 of the License, or | ||
12 | * (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
22 | */ | ||
23 | |||
24 | #include <linux/init.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/pci.h> | ||
27 | #include <linux/delay.h> | ||
28 | |||
29 | #include "cx88.h" | ||
30 | |||
31 | /* ------------------------------------------------------------------ */ | ||
32 | /* board config info */ | ||
33 | |||
34 | struct cx88_board cx88_boards[] = { | ||
35 | [CX88_BOARD_UNKNOWN] = { | ||
36 | .name = "UNKNOWN/GENERIC", | ||
37 | .tuner_type = UNSET, | ||
38 | .input = {{ | ||
39 | .type = CX88_VMUX_COMPOSITE1, | ||
40 | .vmux = 0, | ||
41 | },{ | ||
42 | .type = CX88_VMUX_COMPOSITE2, | ||
43 | .vmux = 1, | ||
44 | },{ | ||
45 | .type = CX88_VMUX_COMPOSITE3, | ||
46 | .vmux = 2, | ||
47 | },{ | ||
48 | .type = CX88_VMUX_COMPOSITE4, | ||
49 | .vmux = 3, | ||
50 | }}, | ||
51 | }, | ||
52 | [CX88_BOARD_HAUPPAUGE] = { | ||
53 | .name = "Hauppauge WinTV 34xxx models", | ||
54 | .tuner_type = UNSET, | ||
55 | .tda9887_conf = TDA9887_PRESENT, | ||
56 | .input = {{ | ||
57 | .type = CX88_VMUX_TELEVISION, | ||
58 | .vmux = 0, | ||
59 | .gpio0 = 0xff00, // internal decoder | ||
60 | },{ | ||
61 | .type = CX88_VMUX_DEBUG, | ||
62 | .vmux = 0, | ||
63 | .gpio0 = 0xff01, // mono from tuner chip | ||
64 | },{ | ||
65 | .type = CX88_VMUX_COMPOSITE1, | ||
66 | .vmux = 1, | ||
67 | .gpio0 = 0xff02, | ||
68 | },{ | ||
69 | .type = CX88_VMUX_SVIDEO, | ||
70 | .vmux = 2, | ||
71 | .gpio0 = 0xff02, | ||
72 | }}, | ||
73 | .radio = { | ||
74 | .type = CX88_RADIO, | ||
75 | .gpio0 = 0xff01, | ||
76 | }, | ||
77 | }, | ||
78 | [CX88_BOARD_GDI] = { | ||
79 | .name = "GDI Black Gold", | ||
80 | .tuner_type = UNSET, | ||
81 | .input = {{ | ||
82 | .type = CX88_VMUX_TELEVISION, | ||
83 | .vmux = 0, | ||
84 | }}, | ||
85 | }, | ||
86 | [CX88_BOARD_PIXELVIEW] = { | ||
87 | .name = "PixelView", | ||
88 | .tuner_type = 5, | ||
89 | .input = {{ | ||
90 | .type = CX88_VMUX_TELEVISION, | ||
91 | .vmux = 0, | ||
92 | .gpio0 = 0xff00, // internal decoder | ||
93 | },{ | ||
94 | .type = CX88_VMUX_COMPOSITE1, | ||
95 | .vmux = 1, | ||
96 | },{ | ||
97 | .type = CX88_VMUX_SVIDEO, | ||
98 | .vmux = 2, | ||
99 | }}, | ||
100 | .radio = { | ||
101 | .type = CX88_RADIO, | ||
102 | .gpio0 = 0xff10, | ||
103 | }, | ||
104 | }, | ||
105 | [CX88_BOARD_ATI_WONDER_PRO] = { | ||
106 | .name = "ATI TV Wonder Pro", | ||
107 | .tuner_type = 44, | ||
108 | .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER, | ||
109 | .input = {{ | ||
110 | .type = CX88_VMUX_TELEVISION, | ||
111 | .vmux = 0, | ||
112 | .gpio0 = 0x03ff, | ||
113 | },{ | ||
114 | .type = CX88_VMUX_COMPOSITE1, | ||
115 | .vmux = 1, | ||
116 | .gpio0 = 0x03fe, | ||
117 | },{ | ||
118 | .type = CX88_VMUX_SVIDEO, | ||
119 | .vmux = 2, | ||
120 | .gpio0 = 0x03fe, | ||
121 | }}, | ||
122 | }, | ||
123 | [CX88_BOARD_WINFAST2000XP_EXPERT] = { | ||
124 | .name = "Leadtek Winfast 2000XP Expert", | ||
125 | .tuner_type = 44, | ||
126 | .tda9887_conf = TDA9887_PRESENT, | ||
127 | .input = {{ | ||
128 | .type = CX88_VMUX_TELEVISION, | ||
129 | .vmux = 0, | ||
130 | .gpio0 = 0x00F5e700, | ||
131 | .gpio1 = 0x00003004, | ||
132 | .gpio2 = 0x00F5e700, | ||
133 | .gpio3 = 0x02000000, | ||
134 | },{ | ||
135 | .type = CX88_VMUX_COMPOSITE1, | ||
136 | .vmux = 1, | ||
137 | .gpio0 = 0x00F5c700, | ||
138 | .gpio1 = 0x00003004, | ||
139 | .gpio2 = 0x00F5c700, | ||
140 | .gpio3 = 0x02000000, | ||
141 | },{ | ||
142 | .type = CX88_VMUX_SVIDEO, | ||
143 | .vmux = 2, | ||
144 | .gpio0 = 0x00F5c700, | ||
145 | .gpio1 = 0x00003004, | ||
146 | .gpio2 = 0x00F5c700, | ||
147 | .gpio3 = 0x02000000, | ||
148 | }}, | ||
149 | .radio = { | ||
150 | .type = CX88_RADIO, | ||
151 | .gpio0 = 0x00F5d700, | ||
152 | .gpio1 = 0x00003004, | ||
153 | .gpio2 = 0x00F5d700, | ||
154 | .gpio3 = 0x02000000, | ||
155 | }, | ||
156 | }, | ||
157 | [CX88_BOARD_AVERTV_303] = { | ||
158 | .name = "AverTV Studio 303 (M126)", | ||
159 | .tuner_type = 38, | ||
160 | .tda9887_conf = TDA9887_PRESENT, | ||
161 | .input = {{ | ||
162 | .type = CX88_VMUX_TELEVISION, | ||
163 | .vmux = 0, | ||
164 | .gpio1 = 0x309f, | ||
165 | },{ | ||
166 | .type = CX88_VMUX_COMPOSITE1, | ||
167 | .vmux = 1, | ||
168 | .gpio1 = 0x305f, | ||
169 | },{ | ||
170 | .type = CX88_VMUX_SVIDEO, | ||
171 | .vmux = 2, | ||
172 | .gpio1 = 0x305f, | ||
173 | }}, | ||
174 | .radio = { | ||
175 | .type = CX88_RADIO, | ||
176 | }, | ||
177 | }, | ||
178 | [CX88_BOARD_MSI_TVANYWHERE_MASTER] = { | ||
179 | // added gpio values thanks to Michal | ||
180 | // values for PAL from DScaler | ||
181 | .name = "MSI TV-@nywhere Master", | ||
182 | .tuner_type = 33, | ||
183 | .tda9887_conf = TDA9887_PRESENT, | ||
184 | .input = {{ | ||
185 | .type = CX88_VMUX_TELEVISION, | ||
186 | .vmux = 0, | ||
187 | .gpio0 = 0x000040bf, | ||
188 | .gpio1 = 0x000080c0, | ||
189 | .gpio2 = 0x0000ff40, | ||
190 | },{ | ||
191 | .type = CX88_VMUX_COMPOSITE1, | ||
192 | .vmux = 1, | ||
193 | .gpio0 = 0x000040bf, | ||
194 | .gpio1 = 0x000080c0, | ||
195 | .gpio2 = 0x0000ff40, | ||
196 | },{ | ||
197 | .type = CX88_VMUX_SVIDEO, | ||
198 | .vmux = 2, | ||
199 | .gpio0 = 0x000040bf, | ||
200 | .gpio1 = 0x000080c0, | ||
201 | .gpio2 = 0x0000ff40, | ||
202 | }}, | ||
203 | .radio = { | ||
204 | .type = CX88_RADIO, | ||
205 | }, | ||
206 | }, | ||
207 | [CX88_BOARD_WINFAST_DV2000] = { | ||
208 | .name = "Leadtek Winfast DV2000", | ||
209 | .tuner_type = 38, | ||
210 | .tda9887_conf = TDA9887_PRESENT, | ||
211 | .input = {{ | ||
212 | .type = CX88_VMUX_TELEVISION, | ||
213 | .vmux = 0, | ||
214 | .gpio0 = 0x0035e700, | ||
215 | .gpio1 = 0x00003004, | ||
216 | .gpio2 = 0x0035e700, | ||
217 | .gpio3 = 0x02000000, | ||
218 | },{ | ||
219 | |||
220 | .type = CX88_VMUX_COMPOSITE1, | ||
221 | .vmux = 1, | ||
222 | .gpio0 = 0x0035c700, | ||
223 | .gpio1 = 0x00003004, | ||
224 | .gpio2 = 0x0035c700, | ||
225 | .gpio3 = 0x02000000, | ||
226 | },{ | ||
227 | .type = CX88_VMUX_SVIDEO, | ||
228 | .vmux = 2, | ||
229 | .gpio0 = 0x0035c700, | ||
230 | .gpio1 = 0x0035c700, | ||
231 | .gpio2 = 0x02000000, | ||
232 | .gpio3 = 0x02000000, | ||
233 | }}, | ||
234 | .radio = { | ||
235 | .type = CX88_RADIO, | ||
236 | .gpio0 = 0x0035d700, | ||
237 | .gpio1 = 0x00007004, | ||
238 | .gpio2 = 0x0035d700, | ||
239 | .gpio3 = 0x02000000, | ||
240 | }, | ||
241 | }, | ||
242 | [CX88_BOARD_LEADTEK_PVR2000] = { | ||
243 | // gpio values for PAL version from regspy by DScaler | ||
244 | .name = "Leadtek PVR 2000", | ||
245 | .tuner_type = 38, | ||
246 | .tda9887_conf = TDA9887_PRESENT, | ||
247 | .input = {{ | ||
248 | .type = CX88_VMUX_TELEVISION, | ||
249 | .vmux = 0, | ||
250 | .gpio0 = 0x0000bde6, | ||
251 | },{ | ||
252 | .type = CX88_VMUX_COMPOSITE1, | ||
253 | .vmux = 1, | ||
254 | .gpio0 = 0x0000bde6, | ||
255 | },{ | ||
256 | .type = CX88_VMUX_SVIDEO, | ||
257 | .vmux = 2, | ||
258 | .gpio0 = 0x0000bde6, | ||
259 | }}, | ||
260 | .radio = { | ||
261 | .type = CX88_RADIO, | ||
262 | .gpio0 = 0x0000bd62, | ||
263 | }, | ||
264 | .blackbird = 1, | ||
265 | }, | ||
266 | [CX88_BOARD_IODATA_GVVCP3PCI] = { | ||
267 | .name = "IODATA GV-VCP3/PCI", | ||
268 | .tuner_type = TUNER_ABSENT, | ||
269 | .input = {{ | ||
270 | .type = CX88_VMUX_COMPOSITE1, | ||
271 | .vmux = 0, | ||
272 | },{ | ||
273 | .type = CX88_VMUX_COMPOSITE2, | ||
274 | .vmux = 1, | ||
275 | },{ | ||
276 | .type = CX88_VMUX_SVIDEO, | ||
277 | .vmux = 2, | ||
278 | }}, | ||
279 | }, | ||
280 | [CX88_BOARD_PROLINK_PLAYTVPVR] = { | ||
281 | .name = "Prolink PlayTV PVR", | ||
282 | .tuner_type = 43, | ||
283 | .tda9887_conf = TDA9887_PRESENT, | ||
284 | .input = {{ | ||
285 | .type = CX88_VMUX_TELEVISION, | ||
286 | .vmux = 0, | ||
287 | .gpio0 = 0xff00, | ||
288 | },{ | ||
289 | .type = CX88_VMUX_COMPOSITE1, | ||
290 | .vmux = 1, | ||
291 | .gpio0 = 0xff03, | ||
292 | },{ | ||
293 | .type = CX88_VMUX_SVIDEO, | ||
294 | .vmux = 2, | ||
295 | .gpio0 = 0xff03, | ||
296 | }}, | ||
297 | .radio = { | ||
298 | .type = CX88_RADIO, | ||
299 | .gpio0 = 0xff00, | ||
300 | }, | ||
301 | }, | ||
302 | [CX88_BOARD_ASUS_PVR_416] = { | ||
303 | .name = "ASUS PVR-416", | ||
304 | .tuner_type = 43, | ||
305 | .tda9887_conf = TDA9887_PRESENT, | ||
306 | .input = {{ | ||
307 | .type = CX88_VMUX_TELEVISION, | ||
308 | .vmux = 0, | ||
309 | .gpio0 = 0x0000fde6, | ||
310 | },{ | ||
311 | .type = CX88_VMUX_SVIDEO, | ||
312 | .vmux = 2, | ||
313 | .gpio0 = 0x0000fde6, // 0x0000fda6 L,R RCA audio in? | ||
314 | }}, | ||
315 | .radio = { | ||
316 | .type = CX88_RADIO, | ||
317 | .gpio0 = 0x0000fde2, | ||
318 | }, | ||
319 | .blackbird = 1, | ||
320 | }, | ||
321 | [CX88_BOARD_MSI_TVANYWHERE] = { | ||
322 | .name = "MSI TV-@nywhere", | ||
323 | .tuner_type = 33, | ||
324 | .tda9887_conf = TDA9887_PRESENT, | ||
325 | .input = {{ | ||
326 | .type = CX88_VMUX_TELEVISION, | ||
327 | .vmux = 0, | ||
328 | .gpio0 = 0x00000fbf, | ||
329 | .gpio2 = 0x0000fc08, | ||
330 | },{ | ||
331 | .type = CX88_VMUX_COMPOSITE1, | ||
332 | .vmux = 1, | ||
333 | .gpio0 = 0x00000fbf, | ||
334 | .gpio2 = 0x0000fc68, | ||
335 | },{ | ||
336 | .type = CX88_VMUX_SVIDEO, | ||
337 | .vmux = 2, | ||
338 | .gpio0 = 0x00000fbf, | ||
339 | .gpio2 = 0x0000fc68, | ||
340 | }}, | ||
341 | }, | ||
342 | [CX88_BOARD_KWORLD_DVB_T] = { | ||
343 | .name = "KWorld/VStream XPert DVB-T", | ||
344 | .tuner_type = TUNER_ABSENT, | ||
345 | .input = {{ | ||
346 | .type = CX88_VMUX_COMPOSITE1, | ||
347 | .vmux = 1, | ||
348 | .gpio0 = 0x0700, | ||
349 | .gpio2 = 0x0101, | ||
350 | },{ | ||
351 | .type = CX88_VMUX_SVIDEO, | ||
352 | .vmux = 2, | ||
353 | .gpio0 = 0x0700, | ||
354 | .gpio2 = 0x0101, | ||
355 | }}, | ||
356 | .dvb = 1, | ||
357 | }, | ||
358 | [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = { | ||
359 | .name = "DVICO FusionHDTV DVB-T1", | ||
360 | .tuner_type = TUNER_ABSENT, /* No analog tuner */ | ||
361 | .input = {{ | ||
362 | .type = CX88_VMUX_COMPOSITE1, | ||
363 | .vmux = 1, | ||
364 | .gpio0 = 0x000027df, | ||
365 | },{ | ||
366 | .type = CX88_VMUX_SVIDEO, | ||
367 | .vmux = 2, | ||
368 | .gpio0 = 0x000027df, | ||
369 | }}, | ||
370 | .dvb = 1, | ||
371 | }, | ||
372 | [CX88_BOARD_KWORLD_LTV883] = { | ||
373 | .name = "KWorld LTV883RF", | ||
374 | .tuner_type = 48, | ||
375 | .input = {{ | ||
376 | .type = CX88_VMUX_TELEVISION, | ||
377 | .vmux = 0, | ||
378 | .gpio0 = 0x07f8, | ||
379 | },{ | ||
380 | .type = CX88_VMUX_DEBUG, | ||
381 | .vmux = 0, | ||
382 | .gpio0 = 0x07f9, // mono from tuner chip | ||
383 | },{ | ||
384 | .type = CX88_VMUX_COMPOSITE1, | ||
385 | .vmux = 1, | ||
386 | .gpio0 = 0x000007fa, | ||
387 | },{ | ||
388 | .type = CX88_VMUX_SVIDEO, | ||
389 | .vmux = 2, | ||
390 | .gpio0 = 0x000007fa, | ||
391 | }}, | ||
392 | .radio = { | ||
393 | .type = CX88_RADIO, | ||
394 | .gpio0 = 0x000007f8, | ||
395 | }, | ||
396 | }, | ||
397 | [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD] = { | ||
398 | .name = "DViCO - FusionHDTV 3 Gold", | ||
399 | .tuner_type = TUNER_MICROTUNE_4042FI5, | ||
400 | /* | ||
401 | GPIO[0] resets DT3302 DTV receiver | ||
402 | 0 - reset asserted | ||
403 | 1 - normal operation | ||
404 | GPIO[1] mutes analog audio output connector | ||
405 | 0 - enable selected source | ||
406 | 1 - mute | ||
407 | GPIO[2] selects source for analog audio output connector | ||
408 | 0 - analog audio input connector on tab | ||
409 | 1 - analog DAC output from CX23881 chip | ||
410 | GPIO[3] selects RF input connector on tuner module | ||
411 | 0 - RF connector labeled CABLE | ||
412 | 1 - RF connector labeled ANT | ||
413 | */ | ||
414 | .input = {{ | ||
415 | .type = CX88_VMUX_TELEVISION, | ||
416 | .vmux = 0, | ||
417 | .gpio0 = 0x0f0d, | ||
418 | },{ | ||
419 | .type = CX88_VMUX_CABLE, | ||
420 | .vmux = 0, | ||
421 | .gpio0 = 0x0f05, | ||
422 | },{ | ||
423 | .type = CX88_VMUX_COMPOSITE1, | ||
424 | .vmux = 1, | ||
425 | .gpio0 = 0x0f00, | ||
426 | },{ | ||
427 | .type = CX88_VMUX_SVIDEO, | ||
428 | .vmux = 2, | ||
429 | .gpio0 = 0x0f00, | ||
430 | }}, | ||
431 | #if 0 | ||
432 | .ts = { | ||
433 | .type = CX88_TS, | ||
434 | .gpio0 = 0x00000f01, /* Hooked to tuner reset bit */ | ||
435 | } | ||
436 | #endif | ||
437 | }, | ||
438 | [CX88_BOARD_HAUPPAUGE_DVB_T1] = { | ||
439 | .name = "Hauppauge Nova-T DVB-T", | ||
440 | .tuner_type = TUNER_ABSENT, | ||
441 | .input = {{ | ||
442 | .type = CX88_VMUX_DVB, | ||
443 | .vmux = 0, | ||
444 | }}, | ||
445 | .dvb = 1, | ||
446 | }, | ||
447 | [CX88_BOARD_CONEXANT_DVB_T1] = { | ||
448 | .name = "Conexant DVB-T reference design", | ||
449 | .tuner_type = TUNER_ABSENT, | ||
450 | .input = {{ | ||
451 | .type = CX88_VMUX_DVB, | ||
452 | .vmux = 0, | ||
453 | }}, | ||
454 | .dvb = 1, | ||
455 | }, | ||
456 | [CX88_BOARD_PROVIDEO_PV259] = { | ||
457 | .name = "Provideo PV259", | ||
458 | .tuner_type = TUNER_PHILIPS_FQ1216ME, | ||
459 | .input = {{ | ||
460 | .type = CX88_VMUX_TELEVISION, | ||
461 | .vmux = 0, | ||
462 | }}, | ||
463 | .blackbird = 1, | ||
464 | }, | ||
465 | [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = { | ||
466 | .name = "DVICO FusionHDTV DVB-T Plus", | ||
467 | .tuner_type = TUNER_ABSENT, /* No analog tuner */ | ||
468 | .input = {{ | ||
469 | .type = CX88_VMUX_COMPOSITE1, | ||
470 | .vmux = 1, | ||
471 | .gpio0 = 0x000027df, | ||
472 | },{ | ||
473 | .type = CX88_VMUX_SVIDEO, | ||
474 | .vmux = 2, | ||
475 | .gpio0 = 0x000027df, | ||
476 | }}, | ||
477 | .dvb = 1, | ||
478 | }, | ||
479 | [CX88_BOARD_DNTV_LIVE_DVB_T] = { | ||
480 | .name = "digitalnow DNTV Live! DVB-T", | ||
481 | .tuner_type = TUNER_ABSENT, | ||
482 | .input = {{ | ||
483 | .type = CX88_VMUX_COMPOSITE1, | ||
484 | .vmux = 1, | ||
485 | .gpio0 = 0x00000700, | ||
486 | .gpio2 = 0x00000101, | ||
487 | },{ | ||
488 | .type = CX88_VMUX_SVIDEO, | ||
489 | .vmux = 2, | ||
490 | .gpio0 = 0x00000700, | ||
491 | .gpio2 = 0x00000101, | ||
492 | }}, | ||
493 | .dvb = 1, | ||
494 | }, | ||
495 | [CX88_BOARD_PCHDTV_HD3000] = { | ||
496 | .name = "pcHDTV HD3000 HDTV", | ||
497 | .tuner_type = TUNER_THOMSON_DTT7610, | ||
498 | .input = {{ | ||
499 | .type = CX88_VMUX_TELEVISION, | ||
500 | .vmux = 0, | ||
501 | .gpio0 = 0x00008484, | ||
502 | .gpio1 = 0x00000000, | ||
503 | .gpio2 = 0x00000000, | ||
504 | .gpio3 = 0x00000000, | ||
505 | },{ | ||
506 | .type = CX88_VMUX_COMPOSITE1, | ||
507 | .vmux = 1, | ||
508 | .gpio0 = 0x00008400, | ||
509 | .gpio1 = 0x00000000, | ||
510 | .gpio2 = 0x00000000, | ||
511 | .gpio3 = 0x00000000, | ||
512 | },{ | ||
513 | .type = CX88_VMUX_SVIDEO, | ||
514 | .vmux = 2, | ||
515 | .gpio0 = 0x00008400, | ||
516 | .gpio1 = 0x00000000, | ||
517 | .gpio2 = 0x00000000, | ||
518 | .gpio3 = 0x00000000, | ||
519 | }}, | ||
520 | .radio = { | ||
521 | .type = CX88_RADIO, | ||
522 | .vmux = 2, | ||
523 | .gpio0 = 0x00008400, | ||
524 | .gpio1 = 0x00000000, | ||
525 | .gpio2 = 0x00000000, | ||
526 | .gpio3 = 0x00000000, | ||
527 | }, | ||
528 | .dvb = 1, | ||
529 | }, | ||
530 | [CX88_BOARD_HAUPPAUGE_ROSLYN] = { | ||
531 | // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu> | ||
532 | // GPIO values obtained from regspy, courtesy Sean Covel | ||
533 | .name = "Hauppauge WinTV 28xxx (Roslyn) models", | ||
534 | .tuner_type = UNSET, | ||
535 | .input = {{ | ||
536 | .type = CX88_VMUX_TELEVISION, | ||
537 | .vmux = 0, | ||
538 | .gpio0 = 0xed12, // internal decoder | ||
539 | .gpio2 = 0x00ff, | ||
540 | },{ | ||
541 | .type = CX88_VMUX_DEBUG, | ||
542 | .vmux = 0, | ||
543 | .gpio0 = 0xff01, // mono from tuner chip | ||
544 | },{ | ||
545 | .type = CX88_VMUX_COMPOSITE1, | ||
546 | .vmux = 1, | ||
547 | .gpio0 = 0xff02, | ||
548 | },{ | ||
549 | .type = CX88_VMUX_SVIDEO, | ||
550 | .vmux = 2, | ||
551 | .gpio0 = 0xed92, | ||
552 | .gpio2 = 0x00ff, | ||
553 | }}, | ||
554 | .radio = { | ||
555 | .type = CX88_RADIO, | ||
556 | .gpio0 = 0xed96, | ||
557 | .gpio2 = 0x00ff, | ||
558 | }, | ||
559 | .blackbird = 1, | ||
560 | }, | ||
561 | [CX88_BOARD_DIGITALLOGIC_MEC] = { | ||
562 | /* params copied over from Leadtek PVR 2000 */ | ||
563 | .name = "Digital-Logic MICROSPACE Entertainment Center (MEC)", | ||
564 | /* not sure yet about the tuner type */ | ||
565 | .tuner_type = 38, | ||
566 | .tda9887_conf = TDA9887_PRESENT, | ||
567 | .input = {{ | ||
568 | .type = CX88_VMUX_TELEVISION, | ||
569 | .vmux = 0, | ||
570 | .gpio0 = 0x0000bde6, | ||
571 | },{ | ||
572 | .type = CX88_VMUX_COMPOSITE1, | ||
573 | .vmux = 1, | ||
574 | .gpio0 = 0x0000bde6, | ||
575 | },{ | ||
576 | .type = CX88_VMUX_SVIDEO, | ||
577 | .vmux = 2, | ||
578 | .gpio0 = 0x0000bde6, | ||
579 | }}, | ||
580 | .radio = { | ||
581 | .type = CX88_RADIO, | ||
582 | .gpio0 = 0x0000bd62, | ||
583 | }, | ||
584 | .blackbird = 1, | ||
585 | }, | ||
586 | [CX88_BOARD_IODATA_GVBCTV7E] = { | ||
587 | .name = "IODATA GV/BCTV7E", | ||
588 | .tuner_type = TUNER_PHILIPS_FQ1286, | ||
589 | .tda9887_conf = TDA9887_PRESENT, | ||
590 | .input = {{ | ||
591 | .type = CX88_VMUX_TELEVISION, | ||
592 | .vmux = 1, | ||
593 | .gpio1 = 0x0000e03f, | ||
594 | },{ | ||
595 | .type = CX88_VMUX_COMPOSITE1, | ||
596 | .vmux = 2, | ||
597 | .gpio1 = 0x0000e07f, | ||
598 | },{ | ||
599 | .type = CX88_VMUX_SVIDEO, | ||
600 | .vmux = 3, | ||
601 | .gpio1 = 0x0000e07f, | ||
602 | }} | ||
603 | }, | ||
604 | }; | ||
605 | const unsigned int cx88_bcount = ARRAY_SIZE(cx88_boards); | ||
606 | |||
607 | /* ------------------------------------------------------------------ */ | ||
608 | /* PCI subsystem IDs */ | ||
609 | |||
610 | struct cx88_subid cx88_subids[] = { | ||
611 | { | ||
612 | .subvendor = 0x0070, | ||
613 | .subdevice = 0x3400, | ||
614 | .card = CX88_BOARD_HAUPPAUGE, | ||
615 | },{ | ||
616 | .subvendor = 0x0070, | ||
617 | .subdevice = 0x3401, | ||
618 | .card = CX88_BOARD_HAUPPAUGE, | ||
619 | },{ | ||
620 | .subvendor = 0x14c7, | ||
621 | .subdevice = 0x0106, | ||
622 | .card = CX88_BOARD_GDI, | ||
623 | },{ | ||
624 | .subvendor = 0x14c7, | ||
625 | .subdevice = 0x0107, /* with mpeg encoder */ | ||
626 | .card = CX88_BOARD_GDI, | ||
627 | },{ | ||
628 | .subvendor = PCI_VENDOR_ID_ATI, | ||
629 | .subdevice = 0x00f8, | ||
630 | .card = CX88_BOARD_ATI_WONDER_PRO, | ||
631 | },{ | ||
632 | .subvendor = 0x107d, | ||
633 | .subdevice = 0x6611, | ||
634 | .card = CX88_BOARD_WINFAST2000XP_EXPERT, | ||
635 | },{ | ||
636 | .subvendor = 0x107d, | ||
637 | .subdevice = 0x6613, /* NTSC */ | ||
638 | .card = CX88_BOARD_WINFAST2000XP_EXPERT, | ||
639 | },{ | ||
640 | .subvendor = 0x107d, | ||
641 | .subdevice = 0x6620, | ||
642 | .card = CX88_BOARD_WINFAST_DV2000, | ||
643 | },{ | ||
644 | .subvendor = 0x107d, | ||
645 | .subdevice = 0x663b, | ||
646 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
647 | },{ | ||
648 | .subvendor = 0x107d, | ||
649 | .subdevice = 0x663C, | ||
650 | .card = CX88_BOARD_LEADTEK_PVR2000, | ||
651 | },{ | ||
652 | .subvendor = 0x1461, | ||
653 | .subdevice = 0x000b, | ||
654 | .card = CX88_BOARD_AVERTV_303, | ||
655 | },{ | ||
656 | .subvendor = 0x1462, | ||
657 | .subdevice = 0x8606, | ||
658 | .card = CX88_BOARD_MSI_TVANYWHERE_MASTER, | ||
659 | },{ | ||
660 | .subvendor = 0x10fc, | ||
661 | .subdevice = 0xd003, | ||
662 | .card = CX88_BOARD_IODATA_GVVCP3PCI, | ||
663 | },{ | ||
664 | .subvendor = 0x1043, | ||
665 | .subdevice = 0x4823, /* with mpeg encoder */ | ||
666 | .card = CX88_BOARD_ASUS_PVR_416, | ||
667 | },{ | ||
668 | .subvendor = 0x17de, | ||
669 | .subdevice = 0x08a6, | ||
670 | .card = CX88_BOARD_KWORLD_DVB_T, | ||
671 | },{ | ||
672 | .subvendor = 0x18ac, | ||
673 | .subdevice = 0xd810, | ||
674 | .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD, | ||
675 | },{ | ||
676 | .subvendor = 0x18AC, | ||
677 | .subdevice = 0xDB00, | ||
678 | .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1, | ||
679 | },{ | ||
680 | .subvendor = 0x0070, | ||
681 | .subdevice = 0x9002, | ||
682 | .card = CX88_BOARD_HAUPPAUGE_DVB_T1, | ||
683 | },{ | ||
684 | .subvendor = 0x14f1, | ||
685 | .subdevice = 0x0187, | ||
686 | .card = CX88_BOARD_CONEXANT_DVB_T1, | ||
687 | },{ | ||
688 | .subvendor = 0x1540, | ||
689 | .subdevice = 0x2580, | ||
690 | .card = CX88_BOARD_PROVIDEO_PV259, | ||
691 | },{ | ||
692 | .subvendor = 0x18AC, | ||
693 | .subdevice = 0xDB10, | ||
694 | .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS, | ||
695 | },{ | ||
696 | .subvendor = 0x1554, | ||
697 | .subdevice = 0x4811, | ||
698 | .card = CX88_BOARD_PIXELVIEW, | ||
699 | },{ | ||
700 | .subvendor = 0x7063, | ||
701 | .subdevice = 0x3000, /* HD-3000 card */ | ||
702 | .card = CX88_BOARD_PCHDTV_HD3000, | ||
703 | },{ | ||
704 | .subvendor = 0x17DE, | ||
705 | .subdevice = 0xA8A6, | ||
706 | .card = CX88_BOARD_DNTV_LIVE_DVB_T, | ||
707 | },{ | ||
708 | .subvendor = 0x0070, | ||
709 | .subdevice = 0x2801, | ||
710 | .card = CX88_BOARD_HAUPPAUGE_ROSLYN, | ||
711 | },{ | ||
712 | .subvendor = 0x14F1, | ||
713 | .subdevice = 0x0342, | ||
714 | .card = CX88_BOARD_DIGITALLOGIC_MEC, | ||
715 | },{ | ||
716 | .subvendor = 0x10fc, | ||
717 | .subdevice = 0xd035, | ||
718 | .card = CX88_BOARD_IODATA_GVBCTV7E, | ||
719 | } | ||
720 | }; | ||
721 | const unsigned int cx88_idcount = ARRAY_SIZE(cx88_subids); | ||
722 | |||
723 | /* ----------------------------------------------------------------------- */ | ||
724 | /* some leadtek specific stuff */ | ||
725 | |||
726 | static void __devinit leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data) | ||
727 | { | ||
728 | /* This is just for the "Winfast 2000XP Expert" board ATM; I don't have data on | ||
729 | * any others. | ||
730 | * | ||
731 | * Byte 0 is 1 on the NTSC board. | ||
732 | */ | ||
733 | |||
734 | if (eeprom_data[4] != 0x7d || | ||
735 | eeprom_data[5] != 0x10 || | ||
736 | eeprom_data[7] != 0x66) { | ||
737 | printk(KERN_WARNING "%s: Leadtek eeprom invalid.\n", | ||
738 | core->name); | ||
739 | return; | ||
740 | } | ||
741 | |||
742 | core->has_radio = 1; | ||
743 | core->tuner_type = (eeprom_data[6] == 0x13) ? 43 : 38; | ||
744 | |||
745 | printk(KERN_INFO "%s: Leadtek Winfast 2000XP Expert config: " | ||
746 | "tuner=%d, eeprom[0]=0x%02x\n", | ||
747 | core->name, core->tuner_type, eeprom_data[0]); | ||
748 | } | ||
749 | |||
750 | |||
751 | /* ----------------------------------------------------------------------- */ | ||
752 | |||
753 | static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data) | ||
754 | { | ||
755 | struct tveeprom tv; | ||
756 | |||
757 | tveeprom_hauppauge_analog(&tv, eeprom_data); | ||
758 | core->tuner_type = tv.tuner_type; | ||
759 | core->has_radio = tv.has_radio; | ||
760 | } | ||
761 | |||
762 | static int hauppauge_eeprom_dvb(struct cx88_core *core, u8 *ee) | ||
763 | { | ||
764 | int model; | ||
765 | int tuner; | ||
766 | |||
767 | /* Make sure we support the board model */ | ||
768 | model = ee[0x1f] << 24 | ee[0x1e] << 16 | ee[0x1d] << 8 | ee[0x1c]; | ||
769 | switch(model) { | ||
770 | case 90002: | ||
771 | case 90500: | ||
772 | case 90501: | ||
773 | /* known */ | ||
774 | break; | ||
775 | default: | ||
776 | printk("%s: warning: unknown hauppauge model #%d\n", | ||
777 | core->name, model); | ||
778 | break; | ||
779 | } | ||
780 | |||
781 | /* Make sure we support the tuner */ | ||
782 | tuner = ee[0x2d]; | ||
783 | switch(tuner) { | ||
784 | case 0x4B: /* dtt 7595 */ | ||
785 | case 0x4C: /* dtt 7592 */ | ||
786 | break; | ||
787 | default: | ||
788 | printk("%s: error: unknown hauppauge tuner 0x%02x\n", | ||
789 | core->name, tuner); | ||
790 | return -ENODEV; | ||
791 | } | ||
792 | printk(KERN_INFO "%s: hauppauge eeprom: model=%d, tuner=%d\n", | ||
793 | core->name, model, tuner); | ||
794 | return 0; | ||
795 | } | ||
796 | |||
797 | /* ----------------------------------------------------------------------- */ | ||
798 | /* some GDI (was: Modular Technology) specific stuff */ | ||
799 | |||
800 | static struct { | ||
801 | int id; | ||
802 | int fm; | ||
803 | char *name; | ||
804 | } gdi_tuner[] = { | ||
805 | [ 0x01 ] = { .id = TUNER_ABSENT, | ||
806 | .name = "NTSC_M" }, | ||
807 | [ 0x02 ] = { .id = TUNER_ABSENT, | ||
808 | .name = "PAL_B" }, | ||
809 | [ 0x03 ] = { .id = TUNER_ABSENT, | ||
810 | .name = "PAL_I" }, | ||
811 | [ 0x04 ] = { .id = TUNER_ABSENT, | ||
812 | .name = "PAL_D" }, | ||
813 | [ 0x05 ] = { .id = TUNER_ABSENT, | ||
814 | .name = "SECAM" }, | ||
815 | |||
816 | [ 0x10 ] = { .id = TUNER_ABSENT, | ||
817 | .fm = 1, | ||
818 | .name = "TEMIC_4049" }, | ||
819 | [ 0x11 ] = { .id = TUNER_TEMIC_4136FY5, | ||
820 | .name = "TEMIC_4136" }, | ||
821 | [ 0x12 ] = { .id = TUNER_ABSENT, | ||
822 | .name = "TEMIC_4146" }, | ||
823 | |||
824 | [ 0x20 ] = { .id = TUNER_PHILIPS_FQ1216ME, | ||
825 | .fm = 1, | ||
826 | .name = "PHILIPS_FQ1216_MK3" }, | ||
827 | [ 0x21 ] = { .id = TUNER_ABSENT, .fm = 1, | ||
828 | .name = "PHILIPS_FQ1236_MK3" }, | ||
829 | [ 0x22 ] = { .id = TUNER_ABSENT, | ||
830 | .name = "PHILIPS_FI1236_MK3" }, | ||
831 | [ 0x23 ] = { .id = TUNER_ABSENT, | ||
832 | .name = "PHILIPS_FI1216_MK3" }, | ||
833 | }; | ||
834 | |||
835 | static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data) | ||
836 | { | ||
837 | char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner)) | ||
838 | ? gdi_tuner[eeprom_data[0x0d]].name : NULL; | ||
839 | |||
840 | printk(KERN_INFO "%s: GDI: tuner=%s\n", core->name, | ||
841 | name ? name : "unknown"); | ||
842 | if (NULL == name) | ||
843 | return; | ||
844 | core->tuner_type = gdi_tuner[eeprom_data[0x0d]].id; | ||
845 | core->has_radio = gdi_tuner[eeprom_data[0x0d]].fm; | ||
846 | } | ||
847 | |||
848 | /* ----------------------------------------------------------------------- */ | ||
849 | |||
850 | void cx88_card_list(struct cx88_core *core, struct pci_dev *pci) | ||
851 | { | ||
852 | int i; | ||
853 | |||
854 | if (0 == pci->subsystem_vendor && | ||
855 | 0 == pci->subsystem_device) { | ||
856 | printk("%s: Your board has no valid PCI Subsystem ID and thus can't\n" | ||
857 | "%s: be autodetected. Please pass card=<n> insmod option to\n" | ||
858 | "%s: workaround that. Redirect complaints to the vendor of\n" | ||
859 | "%s: the TV card. Best regards,\n" | ||
860 | "%s: -- tux\n", | ||
861 | core->name,core->name,core->name,core->name,core->name); | ||
862 | } else { | ||
863 | printk("%s: Your board isn't known (yet) to the driver. You can\n" | ||
864 | "%s: try to pick one of the existing card configs via\n" | ||
865 | "%s: card=<n> insmod option. Updating to the latest\n" | ||
866 | "%s: version might help as well.\n", | ||
867 | core->name,core->name,core->name,core->name); | ||
868 | } | ||
869 | printk("%s: Here is a list of valid choices for the card=<n> insmod option:\n", | ||
870 | core->name); | ||
871 | for (i = 0; i < cx88_bcount; i++) | ||
872 | printk("%s: card=%d -> %s\n", | ||
873 | core->name, i, cx88_boards[i].name); | ||
874 | } | ||
875 | |||
876 | void cx88_card_setup(struct cx88_core *core) | ||
877 | { | ||
878 | static u8 eeprom[128]; | ||
879 | |||
880 | if (0 == core->i2c_rc) { | ||
881 | core->i2c_client.addr = 0xa0 >> 1; | ||
882 | tveeprom_read(&core->i2c_client,eeprom,sizeof(eeprom)); | ||
883 | } | ||
884 | |||
885 | switch (core->board) { | ||
886 | case CX88_BOARD_HAUPPAUGE: | ||
887 | case CX88_BOARD_HAUPPAUGE_ROSLYN: | ||
888 | if (0 == core->i2c_rc) | ||
889 | hauppauge_eeprom(core,eeprom+8); | ||
890 | break; | ||
891 | case CX88_BOARD_GDI: | ||
892 | if (0 == core->i2c_rc) | ||
893 | gdi_eeprom(core,eeprom); | ||
894 | break; | ||
895 | case CX88_BOARD_WINFAST2000XP_EXPERT: | ||
896 | if (0 == core->i2c_rc) | ||
897 | leadtek_eeprom(core,eeprom); | ||
898 | break; | ||
899 | case CX88_BOARD_HAUPPAUGE_DVB_T1: | ||
900 | if (0 == core->i2c_rc) | ||
901 | hauppauge_eeprom_dvb(core,eeprom); | ||
902 | break; | ||
903 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1: | ||
904 | case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS: | ||
905 | /* GPIO0:0 is hooked to mt352 reset pin */ | ||
906 | cx_set(MO_GP0_IO, 0x00000101); | ||
907 | cx_clear(MO_GP0_IO, 0x00000001); | ||
908 | msleep(1); | ||
909 | cx_set(MO_GP0_IO, 0x00000101); | ||
910 | break; | ||
911 | case CX88_BOARD_KWORLD_DVB_T: | ||
912 | case CX88_BOARD_DNTV_LIVE_DVB_T: | ||
913 | cx_set(MO_GP0_IO, 0x00000707); | ||
914 | cx_set(MO_GP2_IO, 0x00000101); | ||
915 | cx_clear(MO_GP2_IO, 0x00000001); | ||
916 | msleep(1); | ||
917 | cx_clear(MO_GP0_IO, 0x00000007); | ||
918 | cx_set(MO_GP2_IO, 0x00000101); | ||
919 | break; | ||
920 | } | ||
921 | if (cx88_boards[core->board].radio.type == CX88_RADIO) | ||
922 | core->has_radio = 1; | ||
923 | } | ||
924 | |||
925 | /* ------------------------------------------------------------------ */ | ||
926 | |||
927 | EXPORT_SYMBOL(cx88_boards); | ||
928 | EXPORT_SYMBOL(cx88_bcount); | ||
929 | EXPORT_SYMBOL(cx88_subids); | ||
930 | EXPORT_SYMBOL(cx88_idcount); | ||
931 | EXPORT_SYMBOL(cx88_card_list); | ||
932 | EXPORT_SYMBOL(cx88_card_setup); | ||
933 | |||
934 | /* | ||
935 | * Local variables: | ||
936 | * c-basic-offset: 8 | ||
937 | * End: | ||
938 | */ | ||