[media] cx88: added XC4000 tuner callback and DVB attach functions
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / media / video / cx88 / cx88-cards.c
blob7ae62cc62cdff1e4f3e9308e299f9fecf47186d2
1 /*
3 * device driver for Conexant 2388x based TV cards
4 * card-specific stuff.
6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <linux/init.h>
24 #include <linux/module.h>
25 #include <linux/pci.h>
26 #include <linux/delay.h>
27 #include <linux/slab.h>
29 #include "cx88.h"
30 #include "tea5767.h"
31 #include "xc4000.h"
33 static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
34 static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
35 static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
37 module_param_array(tuner, int, NULL, 0444);
38 module_param_array(radio, int, NULL, 0444);
39 module_param_array(card, int, NULL, 0444);
41 MODULE_PARM_DESC(tuner,"tuner type");
42 MODULE_PARM_DESC(radio,"radio tuner type");
43 MODULE_PARM_DESC(card,"card type");
45 static unsigned int latency = UNSET;
46 module_param(latency,int,0444);
47 MODULE_PARM_DESC(latency,"pci latency timer");
49 static int disable_ir;
50 module_param(disable_ir, int, 0444);
51 MODULE_PARM_DESC(disable_ir, "Disable IR support");
53 #define info_printk(core, fmt, arg...) \
54 printk(KERN_INFO "%s: " fmt, core->name , ## arg)
56 #define warn_printk(core, fmt, arg...) \
57 printk(KERN_WARNING "%s: " fmt, core->name , ## arg)
59 #define err_printk(core, fmt, arg...) \
60 printk(KERN_ERR "%s: " fmt, core->name , ## arg)
63 /* ------------------------------------------------------------------ */
64 /* board config info */
66 /* If radio_type !=UNSET, radio_addr should be specified
69 static const struct cx88_board cx88_boards[] = {
70 [CX88_BOARD_UNKNOWN] = {
71 .name = "UNKNOWN/GENERIC",
72 .tuner_type = UNSET,
73 .radio_type = UNSET,
74 .tuner_addr = ADDR_UNSET,
75 .radio_addr = ADDR_UNSET,
76 .input = {{
77 .type = CX88_VMUX_COMPOSITE1,
78 .vmux = 0,
79 },{
80 .type = CX88_VMUX_COMPOSITE2,
81 .vmux = 1,
82 },{
83 .type = CX88_VMUX_COMPOSITE3,
84 .vmux = 2,
85 },{
86 .type = CX88_VMUX_COMPOSITE4,
87 .vmux = 3,
88 }},
90 [CX88_BOARD_HAUPPAUGE] = {
91 .name = "Hauppauge WinTV 34xxx models",
92 .tuner_type = UNSET,
93 .radio_type = UNSET,
94 .tuner_addr = ADDR_UNSET,
95 .radio_addr = ADDR_UNSET,
96 .tda9887_conf = TDA9887_PRESENT,
97 .input = {{
98 .type = CX88_VMUX_TELEVISION,
99 .vmux = 0,
100 .gpio0 = 0xff00, // internal decoder
102 .type = CX88_VMUX_DEBUG,
103 .vmux = 0,
104 .gpio0 = 0xff01, // mono from tuner chip
106 .type = CX88_VMUX_COMPOSITE1,
107 .vmux = 1,
108 .gpio0 = 0xff02,
110 .type = CX88_VMUX_SVIDEO,
111 .vmux = 2,
112 .gpio0 = 0xff02,
114 .radio = {
115 .type = CX88_RADIO,
116 .gpio0 = 0xff01,
119 [CX88_BOARD_GDI] = {
120 .name = "GDI Black Gold",
121 .tuner_type = UNSET,
122 .radio_type = UNSET,
123 .tuner_addr = ADDR_UNSET,
124 .radio_addr = ADDR_UNSET,
125 .input = {{
126 .type = CX88_VMUX_TELEVISION,
127 .vmux = 0,
129 .type = CX88_VMUX_SVIDEO,
130 .vmux = 2,
133 [CX88_BOARD_PIXELVIEW] = {
134 .name = "PixelView",
135 .tuner_type = TUNER_PHILIPS_PAL,
136 .radio_type = UNSET,
137 .tuner_addr = ADDR_UNSET,
138 .radio_addr = ADDR_UNSET,
139 .input = {{
140 .type = CX88_VMUX_TELEVISION,
141 .vmux = 0,
142 .gpio0 = 0xff00, // internal decoder
144 .type = CX88_VMUX_COMPOSITE1,
145 .vmux = 1,
147 .type = CX88_VMUX_SVIDEO,
148 .vmux = 2,
150 .radio = {
151 .type = CX88_RADIO,
152 .gpio0 = 0xff10,
155 [CX88_BOARD_ATI_WONDER_PRO] = {
156 .name = "ATI TV Wonder Pro",
157 .tuner_type = TUNER_PHILIPS_4IN1,
158 .radio_type = UNSET,
159 .tuner_addr = ADDR_UNSET,
160 .radio_addr = ADDR_UNSET,
161 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER,
162 .input = {{
163 .type = CX88_VMUX_TELEVISION,
164 .vmux = 0,
165 .gpio0 = 0x03ff,
167 .type = CX88_VMUX_COMPOSITE1,
168 .vmux = 1,
169 .gpio0 = 0x03fe,
171 .type = CX88_VMUX_SVIDEO,
172 .vmux = 2,
173 .gpio0 = 0x03fe,
176 [CX88_BOARD_WINFAST2000XP_EXPERT] = {
177 .name = "Leadtek Winfast 2000XP Expert",
178 .tuner_type = TUNER_PHILIPS_4IN1,
179 .radio_type = UNSET,
180 .tuner_addr = ADDR_UNSET,
181 .radio_addr = ADDR_UNSET,
182 .tda9887_conf = TDA9887_PRESENT,
183 .input = {{
184 .type = CX88_VMUX_TELEVISION,
185 .vmux = 0,
186 .gpio0 = 0x00F5e700,
187 .gpio1 = 0x00003004,
188 .gpio2 = 0x00F5e700,
189 .gpio3 = 0x02000000,
191 .type = CX88_VMUX_COMPOSITE1,
192 .vmux = 1,
193 .gpio0 = 0x00F5c700,
194 .gpio1 = 0x00003004,
195 .gpio2 = 0x00F5c700,
196 .gpio3 = 0x02000000,
198 .type = CX88_VMUX_SVIDEO,
199 .vmux = 2,
200 .gpio0 = 0x00F5c700,
201 .gpio1 = 0x00003004,
202 .gpio2 = 0x00F5c700,
203 .gpio3 = 0x02000000,
205 .radio = {
206 .type = CX88_RADIO,
207 .gpio0 = 0x00F5d700,
208 .gpio1 = 0x00003004,
209 .gpio2 = 0x00F5d700,
210 .gpio3 = 0x02000000,
213 [CX88_BOARD_AVERTV_STUDIO_303] = {
214 .name = "AverTV Studio 303 (M126)",
215 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
216 .radio_type = UNSET,
217 .tuner_addr = ADDR_UNSET,
218 .radio_addr = ADDR_UNSET,
219 .tda9887_conf = TDA9887_PRESENT,
220 .input = {{
221 .type = CX88_VMUX_TELEVISION,
222 .vmux = 0,
223 .gpio1 = 0xe09f,
225 .type = CX88_VMUX_COMPOSITE1,
226 .vmux = 1,
227 .gpio1 = 0xe05f,
229 .type = CX88_VMUX_SVIDEO,
230 .vmux = 2,
231 .gpio1 = 0xe05f,
233 .radio = {
234 .gpio1 = 0xe0df,
235 .type = CX88_RADIO,
238 [CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
239 // added gpio values thanks to Michal
240 // values for PAL from DScaler
241 .name = "MSI TV-@nywhere Master",
242 .tuner_type = TUNER_MT2032,
243 .radio_type = UNSET,
244 .tuner_addr = ADDR_UNSET,
245 .radio_addr = ADDR_UNSET,
246 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
247 .input = {{
248 .type = CX88_VMUX_TELEVISION,
249 .vmux = 0,
250 .gpio0 = 0x000040bf,
251 .gpio1 = 0x000080c0,
252 .gpio2 = 0x0000ff40,
254 .type = CX88_VMUX_COMPOSITE1,
255 .vmux = 1,
256 .gpio0 = 0x000040bf,
257 .gpio1 = 0x000080c0,
258 .gpio2 = 0x0000ff40,
260 .type = CX88_VMUX_SVIDEO,
261 .vmux = 2,
262 .gpio0 = 0x000040bf,
263 .gpio1 = 0x000080c0,
264 .gpio2 = 0x0000ff40,
266 .radio = {
267 .type = CX88_RADIO,
268 .vmux = 3,
269 .gpio0 = 0x000040bf,
270 .gpio1 = 0x000080c0,
271 .gpio2 = 0x0000ff20,
274 [CX88_BOARD_WINFAST_DV2000] = {
275 .name = "Leadtek Winfast DV2000",
276 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
277 .radio_type = UNSET,
278 .tuner_addr = ADDR_UNSET,
279 .radio_addr = ADDR_UNSET,
280 .tda9887_conf = TDA9887_PRESENT,
281 .input = {{
282 .type = CX88_VMUX_TELEVISION,
283 .vmux = 0,
284 .gpio0 = 0x0035e700,
285 .gpio1 = 0x00003004,
286 .gpio2 = 0x0035e700,
287 .gpio3 = 0x02000000,
290 .type = CX88_VMUX_COMPOSITE1,
291 .vmux = 1,
292 .gpio0 = 0x0035c700,
293 .gpio1 = 0x00003004,
294 .gpio2 = 0x0035c700,
295 .gpio3 = 0x02000000,
297 .type = CX88_VMUX_SVIDEO,
298 .vmux = 2,
299 .gpio0 = 0x0035c700,
300 .gpio1 = 0x0035c700,
301 .gpio2 = 0x02000000,
302 .gpio3 = 0x02000000,
304 .radio = {
305 .type = CX88_RADIO,
306 .gpio0 = 0x0035d700,
307 .gpio1 = 0x00007004,
308 .gpio2 = 0x0035d700,
309 .gpio3 = 0x02000000,
312 [CX88_BOARD_LEADTEK_PVR2000] = {
313 // gpio values for PAL version from regspy by DScaler
314 .name = "Leadtek PVR 2000",
315 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
316 .radio_type = UNSET,
317 .tuner_addr = ADDR_UNSET,
318 .radio_addr = ADDR_UNSET,
319 .tda9887_conf = TDA9887_PRESENT,
320 .input = {{
321 .type = CX88_VMUX_TELEVISION,
322 .vmux = 0,
323 .gpio0 = 0x0000bde2,
324 .audioroute = 1,
326 .type = CX88_VMUX_COMPOSITE1,
327 .vmux = 1,
328 .gpio0 = 0x0000bde6,
329 .audioroute = 1,
331 .type = CX88_VMUX_SVIDEO,
332 .vmux = 2,
333 .gpio0 = 0x0000bde6,
334 .audioroute = 1,
336 .radio = {
337 .type = CX88_RADIO,
338 .gpio0 = 0x0000bd62,
339 .audioroute = 1,
341 .mpeg = CX88_MPEG_BLACKBIRD,
343 [CX88_BOARD_IODATA_GVVCP3PCI] = {
344 .name = "IODATA GV-VCP3/PCI",
345 .tuner_type = TUNER_ABSENT,
346 .radio_type = UNSET,
347 .tuner_addr = ADDR_UNSET,
348 .radio_addr = ADDR_UNSET,
349 .input = {{
350 .type = CX88_VMUX_COMPOSITE1,
351 .vmux = 0,
353 .type = CX88_VMUX_COMPOSITE2,
354 .vmux = 1,
356 .type = CX88_VMUX_SVIDEO,
357 .vmux = 2,
360 [CX88_BOARD_PROLINK_PLAYTVPVR] = {
361 .name = "Prolink PlayTV PVR",
362 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
363 .radio_type = UNSET,
364 .tuner_addr = ADDR_UNSET,
365 .radio_addr = ADDR_UNSET,
366 .tda9887_conf = TDA9887_PRESENT,
367 .input = {{
368 .type = CX88_VMUX_TELEVISION,
369 .vmux = 0,
370 .gpio0 = 0xbff0,
372 .type = CX88_VMUX_COMPOSITE1,
373 .vmux = 1,
374 .gpio0 = 0xbff3,
376 .type = CX88_VMUX_SVIDEO,
377 .vmux = 2,
378 .gpio0 = 0xbff3,
380 .radio = {
381 .type = CX88_RADIO,
382 .gpio0 = 0xbff0,
385 [CX88_BOARD_ASUS_PVR_416] = {
386 .name = "ASUS PVR-416",
387 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
388 .radio_type = UNSET,
389 .tuner_addr = ADDR_UNSET,
390 .radio_addr = ADDR_UNSET,
391 .tda9887_conf = TDA9887_PRESENT,
392 .input = {{
393 .type = CX88_VMUX_TELEVISION,
394 .vmux = 0,
395 .gpio0 = 0x0000fde6,
397 .type = CX88_VMUX_SVIDEO,
398 .vmux = 2,
399 .gpio0 = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
400 .audioroute = 1,
402 .radio = {
403 .type = CX88_RADIO,
404 .gpio0 = 0x0000fde2,
406 .mpeg = CX88_MPEG_BLACKBIRD,
408 [CX88_BOARD_MSI_TVANYWHERE] = {
409 .name = "MSI TV-@nywhere",
410 .tuner_type = TUNER_MT2032,
411 .radio_type = UNSET,
412 .tuner_addr = ADDR_UNSET,
413 .radio_addr = ADDR_UNSET,
414 .tda9887_conf = TDA9887_PRESENT,
415 .input = {{
416 .type = CX88_VMUX_TELEVISION,
417 .vmux = 0,
418 .gpio0 = 0x00000fbf,
419 .gpio2 = 0x0000fc08,
421 .type = CX88_VMUX_COMPOSITE1,
422 .vmux = 1,
423 .gpio0 = 0x00000fbf,
424 .gpio2 = 0x0000fc68,
426 .type = CX88_VMUX_SVIDEO,
427 .vmux = 2,
428 .gpio0 = 0x00000fbf,
429 .gpio2 = 0x0000fc68,
432 [CX88_BOARD_KWORLD_DVB_T] = {
433 .name = "KWorld/VStream XPert DVB-T",
434 .tuner_type = TUNER_ABSENT,
435 .radio_type = UNSET,
436 .tuner_addr = ADDR_UNSET,
437 .radio_addr = ADDR_UNSET,
438 .input = {{
439 .type = CX88_VMUX_COMPOSITE1,
440 .vmux = 1,
441 .gpio0 = 0x0700,
442 .gpio2 = 0x0101,
444 .type = CX88_VMUX_SVIDEO,
445 .vmux = 2,
446 .gpio0 = 0x0700,
447 .gpio2 = 0x0101,
449 .mpeg = CX88_MPEG_DVB,
451 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
452 .name = "DViCO FusionHDTV DVB-T1",
453 .tuner_type = TUNER_ABSENT, /* No analog tuner */
454 .radio_type = UNSET,
455 .tuner_addr = ADDR_UNSET,
456 .radio_addr = ADDR_UNSET,
457 .input = {{
458 .type = CX88_VMUX_COMPOSITE1,
459 .vmux = 1,
460 .gpio0 = 0x000027df,
462 .type = CX88_VMUX_SVIDEO,
463 .vmux = 2,
464 .gpio0 = 0x000027df,
466 .mpeg = CX88_MPEG_DVB,
468 [CX88_BOARD_KWORLD_LTV883] = {
469 .name = "KWorld LTV883RF",
470 .tuner_type = TUNER_TNF_8831BGFF,
471 .radio_type = UNSET,
472 .tuner_addr = ADDR_UNSET,
473 .radio_addr = ADDR_UNSET,
474 .input = {{
475 .type = CX88_VMUX_TELEVISION,
476 .vmux = 0,
477 .gpio0 = 0x07f8,
479 .type = CX88_VMUX_DEBUG,
480 .vmux = 0,
481 .gpio0 = 0x07f9, // mono from tuner chip
483 .type = CX88_VMUX_COMPOSITE1,
484 .vmux = 1,
485 .gpio0 = 0x000007fa,
487 .type = CX88_VMUX_SVIDEO,
488 .vmux = 2,
489 .gpio0 = 0x000007fa,
491 .radio = {
492 .type = CX88_RADIO,
493 .gpio0 = 0x000007f8,
496 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
497 .name = "DViCO FusionHDTV 3 Gold-Q",
498 .tuner_type = TUNER_MICROTUNE_4042FI5,
499 .radio_type = UNSET,
500 .tuner_addr = ADDR_UNSET,
501 .radio_addr = ADDR_UNSET,
503 GPIO[0] resets DT3302 DTV receiver
504 0 - reset asserted
505 1 - normal operation
506 GPIO[1] mutes analog audio output connector
507 0 - enable selected source
508 1 - mute
509 GPIO[2] selects source for analog audio output connector
510 0 - analog audio input connector on tab
511 1 - analog DAC output from CX23881 chip
512 GPIO[3] selects RF input connector on tuner module
513 0 - RF connector labeled CABLE
514 1 - RF connector labeled ANT
515 GPIO[4] selects high RF for QAM256 mode
516 0 - normal RF
517 1 - high RF
519 .input = {{
520 .type = CX88_VMUX_TELEVISION,
521 .vmux = 0,
522 .gpio0 = 0x0f0d,
524 .type = CX88_VMUX_CABLE,
525 .vmux = 0,
526 .gpio0 = 0x0f05,
528 .type = CX88_VMUX_COMPOSITE1,
529 .vmux = 1,
530 .gpio0 = 0x0f00,
532 .type = CX88_VMUX_SVIDEO,
533 .vmux = 2,
534 .gpio0 = 0x0f00,
536 .mpeg = CX88_MPEG_DVB,
538 [CX88_BOARD_HAUPPAUGE_DVB_T1] = {
539 .name = "Hauppauge Nova-T DVB-T",
540 .tuner_type = TUNER_ABSENT,
541 .radio_type = UNSET,
542 .tuner_addr = ADDR_UNSET,
543 .radio_addr = ADDR_UNSET,
544 .input = {{
545 .type = CX88_VMUX_DVB,
546 .vmux = 0,
548 .mpeg = CX88_MPEG_DVB,
550 [CX88_BOARD_CONEXANT_DVB_T1] = {
551 .name = "Conexant DVB-T reference design",
552 .tuner_type = TUNER_ABSENT,
553 .radio_type = UNSET,
554 .tuner_addr = ADDR_UNSET,
555 .radio_addr = ADDR_UNSET,
556 .input = {{
557 .type = CX88_VMUX_DVB,
558 .vmux = 0,
560 .mpeg = CX88_MPEG_DVB,
562 [CX88_BOARD_PROVIDEO_PV259] = {
563 .name = "Provideo PV259",
564 .tuner_type = TUNER_PHILIPS_FQ1216ME,
565 .radio_type = UNSET,
566 .tuner_addr = ADDR_UNSET,
567 .radio_addr = ADDR_UNSET,
568 .input = {{
569 .type = CX88_VMUX_TELEVISION,
570 .vmux = 0,
571 .audioroute = 1,
573 .mpeg = CX88_MPEG_BLACKBIRD,
575 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
576 .name = "DViCO FusionHDTV DVB-T Plus",
577 .tuner_type = TUNER_ABSENT, /* No analog tuner */
578 .radio_type = UNSET,
579 .tuner_addr = ADDR_UNSET,
580 .radio_addr = ADDR_UNSET,
581 .input = {{
582 .type = CX88_VMUX_COMPOSITE1,
583 .vmux = 1,
584 .gpio0 = 0x000027df,
586 .type = CX88_VMUX_SVIDEO,
587 .vmux = 2,
588 .gpio0 = 0x000027df,
590 .mpeg = CX88_MPEG_DVB,
592 [CX88_BOARD_DNTV_LIVE_DVB_T] = {
593 .name = "digitalnow DNTV Live! DVB-T",
594 .tuner_type = TUNER_ABSENT,
595 .radio_type = UNSET,
596 .tuner_addr = ADDR_UNSET,
597 .radio_addr = ADDR_UNSET,
598 .input = {{
599 .type = CX88_VMUX_COMPOSITE1,
600 .vmux = 1,
601 .gpio0 = 0x00000700,
602 .gpio2 = 0x00000101,
604 .type = CX88_VMUX_SVIDEO,
605 .vmux = 2,
606 .gpio0 = 0x00000700,
607 .gpio2 = 0x00000101,
609 .mpeg = CX88_MPEG_DVB,
611 [CX88_BOARD_PCHDTV_HD3000] = {
612 .name = "pcHDTV HD3000 HDTV",
613 .tuner_type = TUNER_THOMSON_DTT761X,
614 .radio_type = UNSET,
615 .tuner_addr = ADDR_UNSET,
616 .radio_addr = ADDR_UNSET,
617 .tda9887_conf = TDA9887_PRESENT,
618 /* GPIO[2] = audio source for analog audio out connector
619 * 0 = analog audio input connector
620 * 1 = CX88 audio DACs
622 * GPIO[7] = input to CX88's audio/chroma ADC
623 * 0 = FM 10.7 MHz IF
624 * 1 = Sound 4.5 MHz IF
626 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
628 * GPIO[16] = Remote control input
630 .input = {{
631 .type = CX88_VMUX_TELEVISION,
632 .vmux = 0,
633 .gpio0 = 0x00008484,
635 .type = CX88_VMUX_COMPOSITE1,
636 .vmux = 1,
637 .gpio0 = 0x00008400,
639 .type = CX88_VMUX_SVIDEO,
640 .vmux = 2,
641 .gpio0 = 0x00008400,
643 .radio = {
644 .type = CX88_RADIO,
645 .gpio0 = 0x00008404,
647 .mpeg = CX88_MPEG_DVB,
649 [CX88_BOARD_HAUPPAUGE_ROSLYN] = {
650 // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
651 // GPIO values obtained from regspy, courtesy Sean Covel
652 .name = "Hauppauge WinTV 28xxx (Roslyn) models",
653 .tuner_type = UNSET,
654 .radio_type = UNSET,
655 .tuner_addr = ADDR_UNSET,
656 .radio_addr = ADDR_UNSET,
657 .input = {{
658 .type = CX88_VMUX_TELEVISION,
659 .vmux = 0,
660 .gpio0 = 0xed1a,
661 .gpio2 = 0x00ff,
663 .type = CX88_VMUX_DEBUG,
664 .vmux = 0,
665 .gpio0 = 0xff01,
667 .type = CX88_VMUX_COMPOSITE1,
668 .vmux = 1,
669 .gpio0 = 0xff02,
671 .type = CX88_VMUX_SVIDEO,
672 .vmux = 2,
673 .gpio0 = 0xed92,
674 .gpio2 = 0x00ff,
676 .radio = {
677 .type = CX88_RADIO,
678 .gpio0 = 0xed96,
679 .gpio2 = 0x00ff,
681 .mpeg = CX88_MPEG_BLACKBIRD,
683 [CX88_BOARD_DIGITALLOGIC_MEC] = {
684 .name = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
685 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
686 .radio_type = UNSET,
687 .tuner_addr = ADDR_UNSET,
688 .radio_addr = ADDR_UNSET,
689 .tda9887_conf = TDA9887_PRESENT,
690 .input = {{
691 .type = CX88_VMUX_TELEVISION,
692 .vmux = 0,
693 .gpio0 = 0x00009d80,
694 .audioroute = 1,
696 .type = CX88_VMUX_COMPOSITE1,
697 .vmux = 1,
698 .gpio0 = 0x00009d76,
699 .audioroute = 1,
701 .type = CX88_VMUX_SVIDEO,
702 .vmux = 2,
703 .gpio0 = 0x00009d76,
704 .audioroute = 1,
706 .radio = {
707 .type = CX88_RADIO,
708 .gpio0 = 0x00009d00,
709 .audioroute = 1,
711 .mpeg = CX88_MPEG_BLACKBIRD,
713 [CX88_BOARD_IODATA_GVBCTV7E] = {
714 .name = "IODATA GV/BCTV7E",
715 .tuner_type = TUNER_PHILIPS_FQ1286,
716 .radio_type = UNSET,
717 .tuner_addr = ADDR_UNSET,
718 .radio_addr = ADDR_UNSET,
719 .tda9887_conf = TDA9887_PRESENT,
720 .input = {{
721 .type = CX88_VMUX_TELEVISION,
722 .vmux = 1,
723 .gpio1 = 0x0000e03f,
725 .type = CX88_VMUX_COMPOSITE1,
726 .vmux = 2,
727 .gpio1 = 0x0000e07f,
729 .type = CX88_VMUX_SVIDEO,
730 .vmux = 3,
731 .gpio1 = 0x0000e07f,
734 [CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
735 .name = "PixelView PlayTV Ultra Pro (Stereo)",
736 /* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
737 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
738 .radio_type = UNSET,
739 .tuner_addr = ADDR_UNSET,
740 .radio_addr = ADDR_UNSET,
741 /* Some variants use a tda9874 and so need the tvaudio module. */
742 .audio_chip = V4L2_IDENT_TVAUDIO,
743 .input = {{
744 .type = CX88_VMUX_TELEVISION,
745 .vmux = 0,
746 .gpio0 = 0xbf61, /* internal decoder */
748 .type = CX88_VMUX_COMPOSITE1,
749 .vmux = 1,
750 .gpio0 = 0xbf63,
752 .type = CX88_VMUX_SVIDEO,
753 .vmux = 2,
754 .gpio0 = 0xbf63,
756 .radio = {
757 .type = CX88_RADIO,
758 .gpio0 = 0xbf60,
761 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
762 .name = "DViCO FusionHDTV 3 Gold-T",
763 .tuner_type = TUNER_THOMSON_DTT761X,
764 .radio_type = UNSET,
765 .tuner_addr = ADDR_UNSET,
766 .radio_addr = ADDR_UNSET,
767 .tda9887_conf = TDA9887_PRESENT,
768 .input = {{
769 .type = CX88_VMUX_TELEVISION,
770 .vmux = 0,
771 .gpio0 = 0x97ed,
773 .type = CX88_VMUX_COMPOSITE1,
774 .vmux = 1,
775 .gpio0 = 0x97e9,
777 .type = CX88_VMUX_SVIDEO,
778 .vmux = 2,
779 .gpio0 = 0x97e9,
781 .mpeg = CX88_MPEG_DVB,
783 [CX88_BOARD_ADSTECH_DVB_T_PCI] = {
784 .name = "ADS Tech Instant TV DVB-T PCI",
785 .tuner_type = TUNER_ABSENT,
786 .radio_type = UNSET,
787 .tuner_addr = ADDR_UNSET,
788 .radio_addr = ADDR_UNSET,
789 .input = {{
790 .type = CX88_VMUX_COMPOSITE1,
791 .vmux = 1,
792 .gpio0 = 0x0700,
793 .gpio2 = 0x0101,
795 .type = CX88_VMUX_SVIDEO,
796 .vmux = 2,
797 .gpio0 = 0x0700,
798 .gpio2 = 0x0101,
800 .mpeg = CX88_MPEG_DVB,
802 [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
803 .name = "TerraTec Cinergy 1400 DVB-T",
804 .tuner_type = TUNER_ABSENT,
805 .input = {{
806 .type = CX88_VMUX_DVB,
807 .vmux = 0,
809 .type = CX88_VMUX_COMPOSITE1,
810 .vmux = 2,
812 .type = CX88_VMUX_SVIDEO,
813 .vmux = 2,
815 .mpeg = CX88_MPEG_DVB,
817 [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
818 .name = "DViCO FusionHDTV 5 Gold",
819 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
820 .radio_type = UNSET,
821 .tuner_addr = ADDR_UNSET,
822 .radio_addr = ADDR_UNSET,
823 .tda9887_conf = TDA9887_PRESENT,
824 .input = {{
825 .type = CX88_VMUX_TELEVISION,
826 .vmux = 0,
827 .gpio0 = 0x87fd,
829 .type = CX88_VMUX_COMPOSITE1,
830 .vmux = 1,
831 .gpio0 = 0x87f9,
833 .type = CX88_VMUX_SVIDEO,
834 .vmux = 2,
835 .gpio0 = 0x87f9,
837 .mpeg = CX88_MPEG_DVB,
839 [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
840 .name = "AverMedia UltraTV Media Center PCI 550",
841 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
842 .radio_type = UNSET,
843 .tuner_addr = ADDR_UNSET,
844 .radio_addr = ADDR_UNSET,
845 .tda9887_conf = TDA9887_PRESENT,
846 .input = {{
847 .type = CX88_VMUX_COMPOSITE1,
848 .vmux = 0,
849 .gpio0 = 0x0000cd73,
850 .audioroute = 1,
852 .type = CX88_VMUX_SVIDEO,
853 .vmux = 1,
854 .gpio0 = 0x0000cd73,
855 .audioroute = 1,
857 .type = CX88_VMUX_TELEVISION,
858 .vmux = 3,
859 .gpio0 = 0x0000cdb3,
860 .audioroute = 1,
862 .radio = {
863 .type = CX88_RADIO,
864 .vmux = 2,
865 .gpio0 = 0x0000cdf3,
866 .audioroute = 1,
868 .mpeg = CX88_MPEG_BLACKBIRD,
870 [CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
871 /* Alexander Wold <awold@bigfoot.com> */
872 .name = "Kworld V-Stream Xpert DVD",
873 .tuner_type = UNSET,
874 .input = {{
875 .type = CX88_VMUX_COMPOSITE1,
876 .vmux = 1,
877 .gpio0 = 0x03000000,
878 .gpio1 = 0x01000000,
879 .gpio2 = 0x02000000,
880 .gpio3 = 0x00100000,
882 .type = CX88_VMUX_SVIDEO,
883 .vmux = 2,
884 .gpio0 = 0x03000000,
885 .gpio1 = 0x01000000,
886 .gpio2 = 0x02000000,
887 .gpio3 = 0x00100000,
890 [CX88_BOARD_ATI_HDTVWONDER] = {
891 .name = "ATI HDTV Wonder",
892 .tuner_type = TUNER_PHILIPS_TUV1236D,
893 .radio_type = UNSET,
894 .tuner_addr = ADDR_UNSET,
895 .radio_addr = ADDR_UNSET,
896 .input = {{
897 .type = CX88_VMUX_TELEVISION,
898 .vmux = 0,
899 .gpio0 = 0x00000ff7,
900 .gpio1 = 0x000000ff,
901 .gpio2 = 0x00000001,
902 .gpio3 = 0x00000000,
904 .type = CX88_VMUX_COMPOSITE1,
905 .vmux = 1,
906 .gpio0 = 0x00000ffe,
907 .gpio1 = 0x000000ff,
908 .gpio2 = 0x00000001,
909 .gpio3 = 0x00000000,
911 .type = CX88_VMUX_SVIDEO,
912 .vmux = 2,
913 .gpio0 = 0x00000ffe,
914 .gpio1 = 0x000000ff,
915 .gpio2 = 0x00000001,
916 .gpio3 = 0x00000000,
918 .mpeg = CX88_MPEG_DVB,
920 [CX88_BOARD_WINFAST_DTV1000] = {
921 .name = "WinFast DTV1000-T",
922 .tuner_type = TUNER_ABSENT,
923 .radio_type = UNSET,
924 .tuner_addr = ADDR_UNSET,
925 .radio_addr = ADDR_UNSET,
926 .input = {{
927 .type = CX88_VMUX_DVB,
928 .vmux = 0,
930 .type = CX88_VMUX_COMPOSITE1,
931 .vmux = 1,
933 .type = CX88_VMUX_SVIDEO,
934 .vmux = 2,
936 .mpeg = CX88_MPEG_DVB,
938 [CX88_BOARD_AVERTV_303] = {
939 .name = "AVerTV 303 (M126)",
940 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
941 .radio_type = UNSET,
942 .tuner_addr = ADDR_UNSET,
943 .radio_addr = ADDR_UNSET,
944 .tda9887_conf = TDA9887_PRESENT,
945 .input = {{
946 .type = CX88_VMUX_TELEVISION,
947 .vmux = 0,
948 .gpio0 = 0x00ff,
949 .gpio1 = 0xe09f,
950 .gpio2 = 0x0010,
951 .gpio3 = 0x0000,
953 .type = CX88_VMUX_COMPOSITE1,
954 .vmux = 1,
955 .gpio0 = 0x00ff,
956 .gpio1 = 0xe05f,
957 .gpio2 = 0x0010,
958 .gpio3 = 0x0000,
960 .type = CX88_VMUX_SVIDEO,
961 .vmux = 2,
962 .gpio0 = 0x00ff,
963 .gpio1 = 0xe05f,
964 .gpio2 = 0x0010,
965 .gpio3 = 0x0000,
968 [CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
969 .name = "Hauppauge Nova-S-Plus DVB-S",
970 .tuner_type = TUNER_ABSENT,
971 .radio_type = UNSET,
972 .tuner_addr = ADDR_UNSET,
973 .radio_addr = ADDR_UNSET,
974 .audio_chip = V4L2_IDENT_WM8775,
975 .i2sinputcntl = 2,
976 .input = {{
977 .type = CX88_VMUX_DVB,
978 .vmux = 0,
979 /* 2: Line-In */
980 .audioroute = 2,
982 .type = CX88_VMUX_COMPOSITE1,
983 .vmux = 1,
984 /* 2: Line-In */
985 .audioroute = 2,
987 .type = CX88_VMUX_SVIDEO,
988 .vmux = 2,
989 /* 2: Line-In */
990 .audioroute = 2,
992 .mpeg = CX88_MPEG_DVB,
994 [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
995 .name = "Hauppauge Nova-SE2 DVB-S",
996 .tuner_type = TUNER_ABSENT,
997 .radio_type = UNSET,
998 .tuner_addr = ADDR_UNSET,
999 .radio_addr = ADDR_UNSET,
1000 .input = {{
1001 .type = CX88_VMUX_DVB,
1002 .vmux = 0,
1004 .mpeg = CX88_MPEG_DVB,
1006 [CX88_BOARD_KWORLD_DVBS_100] = {
1007 .name = "KWorld DVB-S 100",
1008 .tuner_type = TUNER_ABSENT,
1009 .radio_type = UNSET,
1010 .tuner_addr = ADDR_UNSET,
1011 .radio_addr = ADDR_UNSET,
1012 .audio_chip = V4L2_IDENT_WM8775,
1013 .input = {{
1014 .type = CX88_VMUX_DVB,
1015 .vmux = 0,
1016 /* 2: Line-In */
1017 .audioroute = 2,
1019 .type = CX88_VMUX_COMPOSITE1,
1020 .vmux = 1,
1021 /* 2: Line-In */
1022 .audioroute = 2,
1024 .type = CX88_VMUX_SVIDEO,
1025 .vmux = 2,
1026 /* 2: Line-In */
1027 .audioroute = 2,
1029 .mpeg = CX88_MPEG_DVB,
1031 [CX88_BOARD_HAUPPAUGE_HVR1100] = {
1032 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
1033 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1034 .radio_type = UNSET,
1035 .tuner_addr = ADDR_UNSET,
1036 .radio_addr = ADDR_UNSET,
1037 .tda9887_conf = TDA9887_PRESENT,
1038 .input = {{
1039 .type = CX88_VMUX_TELEVISION,
1040 .vmux = 0,
1042 .type = CX88_VMUX_COMPOSITE1,
1043 .vmux = 1,
1045 .type = CX88_VMUX_SVIDEO,
1046 .vmux = 2,
1048 /* fixme: Add radio support */
1049 .mpeg = CX88_MPEG_DVB,
1051 [CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
1052 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
1053 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1054 .radio_type = UNSET,
1055 .tuner_addr = ADDR_UNSET,
1056 .radio_addr = ADDR_UNSET,
1057 .tda9887_conf = TDA9887_PRESENT,
1058 .input = {{
1059 .type = CX88_VMUX_TELEVISION,
1060 .vmux = 0,
1062 .type = CX88_VMUX_COMPOSITE1,
1063 .vmux = 1,
1065 /* fixme: Add radio support */
1066 .mpeg = CX88_MPEG_DVB,
1068 [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
1069 .name = "digitalnow DNTV Live! DVB-T Pro",
1070 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1071 .radio_type = UNSET,
1072 .tuner_addr = ADDR_UNSET,
1073 .radio_addr = ADDR_UNSET,
1074 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1075 TDA9887_PORT2_ACTIVE,
1076 .input = {{
1077 .type = CX88_VMUX_TELEVISION,
1078 .vmux = 0,
1079 .gpio0 = 0xf80808,
1081 .type = CX88_VMUX_COMPOSITE1,
1082 .vmux = 1,
1083 .gpio0 = 0xf80808,
1085 .type = CX88_VMUX_SVIDEO,
1086 .vmux = 2,
1087 .gpio0 = 0xf80808,
1089 .radio = {
1090 .type = CX88_RADIO,
1091 .gpio0 = 0xf80808,
1093 .mpeg = CX88_MPEG_DVB,
1095 [CX88_BOARD_KWORLD_DVB_T_CX22702] = {
1096 /* Kworld V-stream Xpert DVB-T with Thomson tuner */
1097 /* DTT 7579 Conexant CX22702-19 Conexant CX2388x */
1098 /* Manenti Marco <marco_manenti@colman.it> */
1099 .name = "KWorld/VStream XPert DVB-T with cx22702",
1100 .tuner_type = TUNER_ABSENT,
1101 .radio_type = UNSET,
1102 .tuner_addr = ADDR_UNSET,
1103 .radio_addr = ADDR_UNSET,
1104 .input = {{
1105 .type = CX88_VMUX_COMPOSITE1,
1106 .vmux = 1,
1107 .gpio0 = 0x0700,
1108 .gpio2 = 0x0101,
1110 .type = CX88_VMUX_SVIDEO,
1111 .vmux = 2,
1112 .gpio0 = 0x0700,
1113 .gpio2 = 0x0101,
1115 .mpeg = CX88_MPEG_DVB,
1117 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
1118 .name = "DViCO FusionHDTV DVB-T Dual Digital",
1119 .tuner_type = TUNER_ABSENT, /* No analog tuner */
1120 .radio_type = UNSET,
1121 .tuner_addr = ADDR_UNSET,
1122 .radio_addr = ADDR_UNSET,
1123 .input = {{
1124 .type = CX88_VMUX_COMPOSITE1,
1125 .vmux = 1,
1126 .gpio0 = 0x000067df,
1128 .type = CX88_VMUX_SVIDEO,
1129 .vmux = 2,
1130 .gpio0 = 0x000067df,
1132 .mpeg = CX88_MPEG_DVB,
1134 [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
1135 .name = "KWorld HardwareMpegTV XPert",
1136 .tuner_type = TUNER_PHILIPS_TDA8290,
1137 .radio_type = UNSET,
1138 .tuner_addr = ADDR_UNSET,
1139 .radio_addr = ADDR_UNSET,
1140 .input = {{
1141 .type = CX88_VMUX_TELEVISION,
1142 .vmux = 0,
1143 .gpio0 = 0x3de2,
1144 .gpio2 = 0x00ff,
1146 .type = CX88_VMUX_COMPOSITE1,
1147 .vmux = 1,
1148 .gpio0 = 0x3de6,
1149 .audioroute = 1,
1151 .type = CX88_VMUX_SVIDEO,
1152 .vmux = 2,
1153 .gpio0 = 0x3de6,
1154 .audioroute = 1,
1156 .radio = {
1157 .type = CX88_RADIO,
1158 .gpio0 = 0x3de6,
1159 .gpio2 = 0x00ff,
1161 .mpeg = CX88_MPEG_BLACKBIRD,
1163 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
1164 .name = "DViCO FusionHDTV DVB-T Hybrid",
1165 .tuner_type = TUNER_THOMSON_FE6600,
1166 .radio_type = UNSET,
1167 .tuner_addr = ADDR_UNSET,
1168 .radio_addr = ADDR_UNSET,
1169 .input = {{
1170 .type = CX88_VMUX_TELEVISION,
1171 .vmux = 0,
1172 .gpio0 = 0x0000a75f,
1174 .type = CX88_VMUX_COMPOSITE1,
1175 .vmux = 1,
1176 .gpio0 = 0x0000a75b,
1178 .type = CX88_VMUX_SVIDEO,
1179 .vmux = 2,
1180 .gpio0 = 0x0000a75b,
1182 .mpeg = CX88_MPEG_DVB,
1184 [CX88_BOARD_PCHDTV_HD5500] = {
1185 .name = "pcHDTV HD5500 HDTV",
1186 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
1187 .radio_type = UNSET,
1188 .tuner_addr = ADDR_UNSET,
1189 .radio_addr = ADDR_UNSET,
1190 .tda9887_conf = TDA9887_PRESENT,
1191 .input = {{
1192 .type = CX88_VMUX_TELEVISION,
1193 .vmux = 0,
1194 .gpio0 = 0x87fd,
1196 .type = CX88_VMUX_COMPOSITE1,
1197 .vmux = 1,
1198 .gpio0 = 0x87f9,
1200 .type = CX88_VMUX_SVIDEO,
1201 .vmux = 2,
1202 .gpio0 = 0x87f9,
1204 .mpeg = CX88_MPEG_DVB,
1206 [CX88_BOARD_KWORLD_MCE200_DELUXE] = {
1207 /* FIXME: tested TV input only, disabled composite,
1208 svideo and radio until they can be tested also. */
1209 .name = "Kworld MCE 200 Deluxe",
1210 .tuner_type = TUNER_TENA_9533_DI,
1211 .radio_type = UNSET,
1212 .tda9887_conf = TDA9887_PRESENT,
1213 .tuner_addr = ADDR_UNSET,
1214 .radio_addr = ADDR_UNSET,
1215 .input = {{
1216 .type = CX88_VMUX_TELEVISION,
1217 .vmux = 0,
1218 .gpio0 = 0x0000BDE6
1220 .mpeg = CX88_MPEG_BLACKBIRD,
1222 [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
1223 /* FIXME: SVideo, Composite and FM inputs are untested */
1224 .name = "PixelView PlayTV P7000",
1225 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
1226 .radio_type = UNSET,
1227 .tuner_addr = ADDR_UNSET,
1228 .radio_addr = ADDR_UNSET,
1229 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1230 TDA9887_PORT2_ACTIVE,
1231 .input = {{
1232 .type = CX88_VMUX_TELEVISION,
1233 .vmux = 0,
1234 .gpio0 = 0x5da6,
1236 .mpeg = CX88_MPEG_BLACKBIRD,
1238 [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
1239 .name = "NPG Tech Real TV FM Top 10",
1240 .tuner_type = TUNER_TNF_5335MF, /* Actually a TNF9535 */
1241 .radio_type = UNSET,
1242 .tuner_addr = ADDR_UNSET,
1243 .radio_addr = ADDR_UNSET,
1244 .input = {{
1245 .type = CX88_VMUX_TELEVISION,
1246 .vmux = 0,
1247 .gpio0 = 0x0788,
1249 .type = CX88_VMUX_COMPOSITE1,
1250 .vmux = 1,
1251 .gpio0 = 0x078b,
1253 .type = CX88_VMUX_SVIDEO,
1254 .vmux = 2,
1255 .gpio0 = 0x078b,
1257 .radio = {
1258 .type = CX88_RADIO,
1259 .gpio0 = 0x074a,
1262 [CX88_BOARD_WINFAST_DTV2000H] = {
1263 .name = "WinFast DTV2000 H",
1264 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1265 .radio_type = UNSET,
1266 .tuner_addr = ADDR_UNSET,
1267 .radio_addr = ADDR_UNSET,
1268 .tda9887_conf = TDA9887_PRESENT,
1269 .input = {{
1270 .type = CX88_VMUX_TELEVISION,
1271 .vmux = 0,
1272 .gpio0 = 0x00017304,
1273 .gpio1 = 0x00008203,
1274 .gpio2 = 0x00017304,
1275 .gpio3 = 0x02000000,
1276 }, {
1277 .type = CX88_VMUX_COMPOSITE1,
1278 .vmux = 1,
1279 .gpio0 = 0x0001d701,
1280 .gpio1 = 0x0000b207,
1281 .gpio2 = 0x0001d701,
1282 .gpio3 = 0x02000000,
1283 }, {
1284 .type = CX88_VMUX_COMPOSITE2,
1285 .vmux = 2,
1286 .gpio0 = 0x0001d503,
1287 .gpio1 = 0x0000b207,
1288 .gpio2 = 0x0001d503,
1289 .gpio3 = 0x02000000,
1290 }, {
1291 .type = CX88_VMUX_SVIDEO,
1292 .vmux = 3,
1293 .gpio0 = 0x0001d701,
1294 .gpio1 = 0x0000b207,
1295 .gpio2 = 0x0001d701,
1296 .gpio3 = 0x02000000,
1298 .radio = {
1299 .type = CX88_RADIO,
1300 .gpio0 = 0x00015702,
1301 .gpio1 = 0x0000f207,
1302 .gpio2 = 0x00015702,
1303 .gpio3 = 0x02000000,
1305 .mpeg = CX88_MPEG_DVB,
1307 [CX88_BOARD_WINFAST_DTV2000H_J] = {
1308 .name = "WinFast DTV2000 H rev. J",
1309 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1310 .radio_type = UNSET,
1311 .tuner_addr = ADDR_UNSET,
1312 .radio_addr = ADDR_UNSET,
1313 .tda9887_conf = TDA9887_PRESENT,
1314 .input = {{
1315 .type = CX88_VMUX_TELEVISION,
1316 .vmux = 0,
1317 .gpio0 = 0x00017300,
1318 .gpio1 = 0x00008207,
1319 .gpio2 = 0x00000000,
1320 .gpio3 = 0x02000000,
1322 .type = CX88_VMUX_TELEVISION,
1323 .vmux = 0,
1324 .gpio0 = 0x00018300,
1325 .gpio1 = 0x0000f207,
1326 .gpio2 = 0x00017304,
1327 .gpio3 = 0x02000000,
1329 .type = CX88_VMUX_COMPOSITE1,
1330 .vmux = 1,
1331 .gpio0 = 0x00018301,
1332 .gpio1 = 0x0000f207,
1333 .gpio2 = 0x00017304,
1334 .gpio3 = 0x02000000,
1336 .type = CX88_VMUX_SVIDEO,
1337 .vmux = 2,
1338 .gpio0 = 0x00018301,
1339 .gpio1 = 0x0000f207,
1340 .gpio2 = 0x00017304,
1341 .gpio3 = 0x02000000,
1343 .radio = {
1344 .type = CX88_RADIO,
1345 .gpio0 = 0x00015702,
1346 .gpio1 = 0x0000f207,
1347 .gpio2 = 0x00015702,
1348 .gpio3 = 0x02000000,
1350 .mpeg = CX88_MPEG_DVB,
1352 [CX88_BOARD_GENIATECH_DVBS] = {
1353 .name = "Geniatech DVB-S",
1354 .tuner_type = TUNER_ABSENT,
1355 .radio_type = UNSET,
1356 .tuner_addr = ADDR_UNSET,
1357 .radio_addr = ADDR_UNSET,
1358 .input = {{
1359 .type = CX88_VMUX_DVB,
1360 .vmux = 0,
1362 .type = CX88_VMUX_COMPOSITE1,
1363 .vmux = 1,
1365 .mpeg = CX88_MPEG_DVB,
1367 [CX88_BOARD_HAUPPAUGE_HVR3000] = {
1368 .name = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
1369 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1370 .radio_type = UNSET,
1371 .tuner_addr = ADDR_UNSET,
1372 .radio_addr = ADDR_UNSET,
1373 .tda9887_conf = TDA9887_PRESENT,
1374 .audio_chip = V4L2_IDENT_WM8775,
1375 .input = {{
1376 .type = CX88_VMUX_TELEVISION,
1377 .vmux = 0,
1378 .gpio0 = 0x84bf,
1379 /* 1: TV Audio / FM Mono */
1380 .audioroute = 1,
1382 .type = CX88_VMUX_COMPOSITE1,
1383 .vmux = 1,
1384 .gpio0 = 0x84bf,
1385 /* 2: Line-In */
1386 .audioroute = 2,
1388 .type = CX88_VMUX_SVIDEO,
1389 .vmux = 2,
1390 .gpio0 = 0x84bf,
1391 /* 2: Line-In */
1392 .audioroute = 2,
1394 .radio = {
1395 .type = CX88_RADIO,
1396 .gpio0 = 0x84bf,
1397 /* 4: FM Stereo (untested) */
1398 .audioroute = 8,
1400 .mpeg = CX88_MPEG_DVB,
1401 .num_frontends = 2,
1403 [CX88_BOARD_NORWOOD_MICRO] = {
1404 .name = "Norwood Micro TV Tuner",
1405 .tuner_type = TUNER_TNF_5335MF,
1406 .radio_type = UNSET,
1407 .tuner_addr = ADDR_UNSET,
1408 .radio_addr = ADDR_UNSET,
1409 .input = {{
1410 .type = CX88_VMUX_TELEVISION,
1411 .vmux = 0,
1412 .gpio0 = 0x0709,
1414 .type = CX88_VMUX_COMPOSITE1,
1415 .vmux = 1,
1416 .gpio0 = 0x070b,
1418 .type = CX88_VMUX_SVIDEO,
1419 .vmux = 2,
1420 .gpio0 = 0x070b,
1423 [CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
1424 .name = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
1425 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
1426 .radio_type = UNSET,
1427 .tuner_addr = ADDR_UNSET,
1428 .radio_addr = ADDR_UNSET,
1429 .input = {{
1430 .type = CX88_VMUX_TELEVISION,
1431 .vmux = 0,
1432 .gpio0 = 0x003fffff,
1433 .gpio1 = 0x00e00000,
1434 .gpio2 = 0x003fffff,
1435 .gpio3 = 0x02000000,
1437 .type = CX88_VMUX_COMPOSITE1,
1438 .vmux = 1,
1439 .gpio0 = 0x003fffff,
1440 .gpio1 = 0x00e00000,
1441 .gpio2 = 0x003fffff,
1442 .gpio3 = 0x02000000,
1444 .type = CX88_VMUX_SVIDEO,
1445 .vmux = 2,
1446 .gpio0 = 0x003fffff,
1447 .gpio1 = 0x00e00000,
1448 .gpio2 = 0x003fffff,
1449 .gpio3 = 0x02000000,
1452 [CX88_BOARD_HAUPPAUGE_HVR1300] = {
1453 .name = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
1454 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1455 .radio_type = UNSET,
1456 .tuner_addr = ADDR_UNSET,
1457 .radio_addr = ADDR_UNSET,
1458 .tda9887_conf = TDA9887_PRESENT,
1459 .audio_chip = V4L2_IDENT_WM8775,
1461 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
1463 .input = {{
1464 .type = CX88_VMUX_TELEVISION,
1465 .vmux = 0,
1466 .gpio0 = 0xef88,
1467 /* 1: TV Audio / FM Mono */
1468 .audioroute = 1,
1470 .type = CX88_VMUX_COMPOSITE1,
1471 .vmux = 1,
1472 .gpio0 = 0xef88,
1473 /* 2: Line-In */
1474 .audioroute = 2,
1476 .type = CX88_VMUX_SVIDEO,
1477 .vmux = 2,
1478 .gpio0 = 0xef88,
1479 /* 2: Line-In */
1480 .audioroute = 2,
1482 .mpeg = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
1483 .radio = {
1484 .type = CX88_RADIO,
1485 .gpio0 = 0xef88,
1486 /* 4: FM Stereo (untested) */
1487 .audioroute = 8,
1490 [CX88_BOARD_SAMSUNG_SMT_7020] = {
1491 .name = "Samsung SMT 7020 DVB-S",
1492 .tuner_type = TUNER_ABSENT,
1493 .radio_type = UNSET,
1494 .tuner_addr = ADDR_UNSET,
1495 .radio_addr = ADDR_UNSET,
1496 .input = { {
1497 .type = CX88_VMUX_DVB,
1498 .vmux = 0,
1499 } },
1500 .mpeg = CX88_MPEG_DVB,
1502 [CX88_BOARD_ADSTECH_PTV_390] = {
1503 .name = "ADS Tech Instant Video PCI",
1504 .tuner_type = TUNER_ABSENT,
1505 .radio_type = UNSET,
1506 .tuner_addr = ADDR_UNSET,
1507 .radio_addr = ADDR_UNSET,
1508 .input = {{
1509 .type = CX88_VMUX_DEBUG,
1510 .vmux = 3,
1511 .gpio0 = 0x04ff,
1513 .type = CX88_VMUX_COMPOSITE1,
1514 .vmux = 1,
1515 .gpio0 = 0x07fa,
1517 .type = CX88_VMUX_SVIDEO,
1518 .vmux = 2,
1519 .gpio0 = 0x07fa,
1522 [CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
1523 .name = "Pinnacle PCTV HD 800i",
1524 .tuner_type = TUNER_XC5000,
1525 .radio_type = UNSET,
1526 .tuner_addr = ADDR_UNSET,
1527 .radio_addr = ADDR_UNSET,
1528 .input = {{
1529 .type = CX88_VMUX_TELEVISION,
1530 .vmux = 0,
1531 .gpio0 = 0x04fb,
1532 .gpio1 = 0x10ff,
1534 .type = CX88_VMUX_COMPOSITE1,
1535 .vmux = 1,
1536 .gpio0 = 0x04fb,
1537 .gpio1 = 0x10ef,
1538 .audioroute = 1,
1540 .type = CX88_VMUX_SVIDEO,
1541 .vmux = 2,
1542 .gpio0 = 0x04fb,
1543 .gpio1 = 0x10ef,
1544 .audioroute = 1,
1546 .mpeg = CX88_MPEG_DVB,
1548 [CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
1549 .name = "DViCO FusionHDTV 5 PCI nano",
1550 /* xc3008 tuner, digital only for now */
1551 .tuner_type = TUNER_ABSENT,
1552 .radio_type = UNSET,
1553 .tuner_addr = ADDR_UNSET,
1554 .radio_addr = ADDR_UNSET,
1555 .input = {{
1556 .type = CX88_VMUX_TELEVISION,
1557 .vmux = 0,
1558 .gpio0 = 0x000027df, /* Unconfirmed */
1559 }, {
1560 .type = CX88_VMUX_COMPOSITE1,
1561 .vmux = 1,
1562 .gpio0 = 0x000027df, /* Unconfirmed */
1563 .audioroute = 1,
1564 }, {
1565 .type = CX88_VMUX_SVIDEO,
1566 .vmux = 2,
1567 .gpio0 = 0x000027df, /* Unconfirmed */
1568 .audioroute = 1,
1569 } },
1570 .mpeg = CX88_MPEG_DVB,
1572 [CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
1573 .name = "Pinnacle Hybrid PCTV",
1574 .tuner_type = TUNER_XC2028,
1575 .tuner_addr = 0x61,
1576 .radio_type = TUNER_XC2028,
1577 .radio_addr = 0x61,
1578 .input = { {
1579 .type = CX88_VMUX_TELEVISION,
1580 .vmux = 0,
1581 .gpio0 = 0x004ff,
1582 .gpio1 = 0x010ff,
1583 .gpio2 = 0x00001,
1584 }, {
1585 .type = CX88_VMUX_COMPOSITE1,
1586 .vmux = 1,
1587 .gpio0 = 0x004fb,
1588 .gpio1 = 0x010ef,
1589 .audioroute = 1,
1590 }, {
1591 .type = CX88_VMUX_SVIDEO,
1592 .vmux = 2,
1593 .gpio0 = 0x004fb,
1594 .gpio1 = 0x010ef,
1595 .audioroute = 1,
1596 } },
1597 .radio = {
1598 .type = CX88_RADIO,
1599 .gpio0 = 0x004ff,
1600 .gpio1 = 0x010ff,
1601 .gpio2 = 0x0ff,
1603 .mpeg = CX88_MPEG_DVB,
1605 /* Terry Wu <terrywu2009@gmail.com> */
1606 /* TV Audio : set GPIO 2, 18, 19 value to 0, 1, 0 */
1607 /* FM Audio : set GPIO 2, 18, 19 value to 0, 0, 0 */
1608 /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
1609 /* Mute Audio : set GPIO 2 value to 1 */
1610 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
1611 .name = "Leadtek TV2000 XP Global",
1612 .tuner_type = TUNER_XC2028,
1613 .tuner_addr = 0x61,
1614 .radio_type = TUNER_XC2028,
1615 .radio_addr = 0x61,
1616 .input = { {
1617 .type = CX88_VMUX_TELEVISION,
1618 .vmux = 0,
1619 .gpio0 = 0x0400, /* pin 2 = 0 */
1620 .gpio1 = 0x0000,
1621 .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */
1622 .gpio3 = 0x0000,
1623 }, {
1624 .type = CX88_VMUX_COMPOSITE1,
1625 .vmux = 1,
1626 .gpio0 = 0x0400, /* pin 2 = 0 */
1627 .gpio1 = 0x0000,
1628 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */
1629 .gpio3 = 0x0000,
1630 }, {
1631 .type = CX88_VMUX_SVIDEO,
1632 .vmux = 2,
1633 .gpio0 = 0x0400, /* pin 2 = 0 */
1634 .gpio1 = 0x0000,
1635 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */
1636 .gpio3 = 0x0000,
1637 } },
1638 .radio = {
1639 .type = CX88_RADIO,
1640 .gpio0 = 0x0400, /* pin 2 = 0 */
1641 .gpio1 = 0x0000,
1642 .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */
1643 .gpio3 = 0x0000,
1646 [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
1647 .name = "PowerColor RA330", /* Long names may confuse LIRC. */
1648 .tuner_type = TUNER_XC2028,
1649 .tuner_addr = 0x61,
1650 .input = { {
1651 .type = CX88_VMUX_DEBUG,
1652 .vmux = 3, /* Due to the way the cx88 driver is written, */
1653 .gpio0 = 0x00ff, /* there is no way to deactivate audio pass- */
1654 .gpio1 = 0xf39d, /* through without this entry. Furthermore, if */
1655 .gpio3 = 0x0000, /* the TV mux entry is first, you get audio */
1656 }, { /* from the tuner on boot for a little while. */
1657 .type = CX88_VMUX_TELEVISION,
1658 .vmux = 0,
1659 .gpio0 = 0x00ff,
1660 .gpio1 = 0xf35d,
1661 .gpio3 = 0x0000,
1662 }, {
1663 .type = CX88_VMUX_COMPOSITE1,
1664 .vmux = 1,
1665 .gpio0 = 0x00ff,
1666 .gpio1 = 0xf37d,
1667 .gpio3 = 0x0000,
1668 }, {
1669 .type = CX88_VMUX_SVIDEO,
1670 .vmux = 2,
1671 .gpio0 = 0x000ff,
1672 .gpio1 = 0x0f37d,
1673 .gpio3 = 0x00000,
1674 } },
1675 .radio = {
1676 .type = CX88_RADIO,
1677 .gpio0 = 0x000ff,
1678 .gpio1 = 0x0f35d,
1679 .gpio3 = 0x00000,
1682 [CX88_BOARD_GENIATECH_X8000_MT] = {
1683 /* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
1684 .name = "Geniatech X8000-MT DVBT",
1685 .tuner_type = TUNER_XC2028,
1686 .tuner_addr = 0x61,
1687 .input = { {
1688 .type = CX88_VMUX_TELEVISION,
1689 .vmux = 0,
1690 .gpio0 = 0x00000000,
1691 .gpio1 = 0x00e3e341,
1692 .gpio2 = 0x00000000,
1693 .gpio3 = 0x00000000,
1694 }, {
1695 .type = CX88_VMUX_COMPOSITE1,
1696 .vmux = 1,
1697 .gpio0 = 0x00000000,
1698 .gpio1 = 0x00e3e361,
1699 .gpio2 = 0x00000000,
1700 .gpio3 = 0x00000000,
1701 }, {
1702 .type = CX88_VMUX_SVIDEO,
1703 .vmux = 2,
1704 .gpio0 = 0x00000000,
1705 .gpio1 = 0x00e3e361,
1706 .gpio2 = 0x00000000,
1707 .gpio3 = 0x00000000,
1708 } },
1709 .radio = {
1710 .type = CX88_RADIO,
1711 .gpio0 = 0x00000000,
1712 .gpio1 = 0x00e3e341,
1713 .gpio2 = 0x00000000,
1714 .gpio3 = 0x00000000,
1716 .mpeg = CX88_MPEG_DVB,
1718 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
1719 .name = "DViCO FusionHDTV DVB-T PRO",
1720 .tuner_type = TUNER_XC2028,
1721 .tuner_addr = 0x61,
1722 .radio_type = UNSET,
1723 .radio_addr = ADDR_UNSET,
1724 .input = { {
1725 .type = CX88_VMUX_COMPOSITE1,
1726 .vmux = 1,
1727 .gpio0 = 0x000067df,
1728 }, {
1729 .type = CX88_VMUX_SVIDEO,
1730 .vmux = 2,
1731 .gpio0 = 0x000067df,
1732 } },
1733 .mpeg = CX88_MPEG_DVB,
1735 [CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
1736 .name = "DViCO FusionHDTV 7 Gold",
1737 .tuner_type = TUNER_XC5000,
1738 .radio_type = UNSET,
1739 .tuner_addr = ADDR_UNSET,
1740 .radio_addr = ADDR_UNSET,
1741 .input = {{
1742 .type = CX88_VMUX_TELEVISION,
1743 .vmux = 0,
1744 .gpio0 = 0x10df,
1746 .type = CX88_VMUX_COMPOSITE1,
1747 .vmux = 1,
1748 .gpio0 = 0x16d9,
1750 .type = CX88_VMUX_SVIDEO,
1751 .vmux = 2,
1752 .gpio0 = 0x16d9,
1754 .mpeg = CX88_MPEG_DVB,
1756 [CX88_BOARD_PROLINK_PV_8000GT] = {
1757 .name = "Prolink Pixelview MPEG 8000GT",
1758 .tuner_type = TUNER_XC2028,
1759 .tuner_addr = 0x61,
1760 .input = { {
1761 .type = CX88_VMUX_TELEVISION,
1762 .vmux = 0,
1763 .gpio0 = 0x0ff,
1764 .gpio2 = 0x0cfb,
1765 }, {
1766 .type = CX88_VMUX_COMPOSITE1,
1767 .vmux = 1,
1768 .gpio2 = 0x0cfb,
1769 }, {
1770 .type = CX88_VMUX_SVIDEO,
1771 .vmux = 2,
1772 .gpio2 = 0x0cfb,
1773 } },
1774 .radio = {
1775 .type = CX88_RADIO,
1776 .gpio2 = 0x0cfb,
1779 [CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
1780 .name = "Prolink Pixelview Global Extreme",
1781 .tuner_type = TUNER_XC2028,
1782 .tuner_addr = 0x61,
1783 .input = { {
1784 .type = CX88_VMUX_TELEVISION,
1785 .vmux = 0,
1786 .gpio0 = 0x04fb,
1787 .gpio1 = 0x04080,
1788 .gpio2 = 0x0cf7,
1789 }, {
1790 .type = CX88_VMUX_COMPOSITE1,
1791 .vmux = 1,
1792 .gpio0 = 0x04fb,
1793 .gpio1 = 0x04080,
1794 .gpio2 = 0x0cfb,
1795 }, {
1796 .type = CX88_VMUX_SVIDEO,
1797 .vmux = 2,
1798 .gpio0 = 0x04fb,
1799 .gpio1 = 0x04080,
1800 .gpio2 = 0x0cfb,
1801 } },
1802 .radio = {
1803 .type = CX88_RADIO,
1804 .gpio0 = 0x04ff,
1805 .gpio1 = 0x04080,
1806 .gpio2 = 0x0cf7,
1809 /* Both radio, analog and ATSC work with this board.
1810 However, for analog to work, s5h1409 gate should be open,
1811 otherwise, tuner-xc3028 won't be detected.
1812 A proper fix require using the newer i2c methods to add
1813 tuner-xc3028 without doing an i2c probe.
1815 [CX88_BOARD_KWORLD_ATSC_120] = {
1816 .name = "Kworld PlusTV HD PCI 120 (ATSC 120)",
1817 .tuner_type = TUNER_XC2028,
1818 .radio_type = UNSET,
1819 .tuner_addr = ADDR_UNSET,
1820 .radio_addr = ADDR_UNSET,
1821 .input = { {
1822 .type = CX88_VMUX_TELEVISION,
1823 .vmux = 0,
1824 .gpio0 = 0x000000ff,
1825 .gpio1 = 0x0000f35d,
1826 .gpio2 = 0x00000000,
1827 }, {
1828 .type = CX88_VMUX_COMPOSITE1,
1829 .vmux = 1,
1830 .gpio0 = 0x000000ff,
1831 .gpio1 = 0x0000f37e,
1832 .gpio2 = 0x00000000,
1833 }, {
1834 .type = CX88_VMUX_SVIDEO,
1835 .vmux = 2,
1836 .gpio0 = 0x000000ff,
1837 .gpio1 = 0x0000f37e,
1838 .gpio2 = 0x00000000,
1839 } },
1840 .radio = {
1841 .type = CX88_RADIO,
1842 .gpio0 = 0x000000ff,
1843 .gpio1 = 0x0000f35d,
1844 .gpio2 = 0x00000000,
1846 .mpeg = CX88_MPEG_DVB,
1848 [CX88_BOARD_HAUPPAUGE_HVR4000] = {
1849 .name = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
1850 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1851 .radio_type = UNSET,
1852 .tuner_addr = ADDR_UNSET,
1853 .radio_addr = ADDR_UNSET,
1854 .tda9887_conf = TDA9887_PRESENT,
1855 .audio_chip = V4L2_IDENT_WM8775,
1857 * GPIO0 (WINTV2000)
1859 * Analogue SAT DVB-T
1860 * Antenna 0xc4bf 0xc4bb
1861 * Composite 0xc4bf 0xc4bb
1862 * S-Video 0xc4bf 0xc4bb
1863 * Composite1 0xc4ff 0xc4fb
1864 * S-Video1 0xc4ff 0xc4fb
1866 * BIT VALUE FUNCTION GP{x}_IO
1867 * 0 1 I:?
1868 * 1 1 I:?
1869 * 2 1 O:MPEG PORT 0=DVB-T 1=DVB-S
1870 * 3 1 I:?
1871 * 4 1 I:?
1872 * 5 1 I:?
1873 * 6 0 O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
1874 * 7 1 O:DVB-T DEMOD RESET LOW
1876 * BIT VALUE FUNCTION GP{x}_OE
1877 * 8 0 I
1878 * 9 0 I
1879 * a 1 O
1880 * b 0 I
1881 * c 0 I
1882 * d 0 I
1883 * e 1 O
1884 * f 1 O
1886 * WM8775 ADC
1888 * 1: TV Audio / FM Mono
1889 * 2: Line-In
1890 * 3: Line-In Expansion
1891 * 4: FM Stereo
1893 .input = {{
1894 .type = CX88_VMUX_TELEVISION,
1895 .vmux = 0,
1896 .gpio0 = 0xc4bf,
1897 /* 1: TV Audio / FM Mono */
1898 .audioroute = 1,
1899 }, {
1900 .type = CX88_VMUX_COMPOSITE1,
1901 .vmux = 1,
1902 .gpio0 = 0xc4bf,
1903 /* 2: Line-In */
1904 .audioroute = 2,
1905 }, {
1906 .type = CX88_VMUX_SVIDEO,
1907 .vmux = 2,
1908 .gpio0 = 0xc4bf,
1909 /* 2: Line-In */
1910 .audioroute = 2,
1911 } },
1912 .radio = {
1913 .type = CX88_RADIO,
1914 .gpio0 = 0xc4bf,
1915 /* 4: FM Stereo */
1916 .audioroute = 8,
1918 .mpeg = CX88_MPEG_DVB,
1919 .num_frontends = 2,
1921 [CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
1922 .name = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
1923 .tuner_type = UNSET,
1924 .radio_type = UNSET,
1925 .tuner_addr = ADDR_UNSET,
1926 .radio_addr = ADDR_UNSET,
1927 .input = {{
1928 .type = CX88_VMUX_DVB,
1929 .vmux = 0,
1930 } },
1931 .mpeg = CX88_MPEG_DVB,
1933 [CX88_BOARD_TEVII_S420] = {
1934 .name = "TeVii S420 DVB-S",
1935 .tuner_type = UNSET,
1936 .radio_type = UNSET,
1937 .tuner_addr = ADDR_UNSET,
1938 .radio_addr = ADDR_UNSET,
1939 .input = {{
1940 .type = CX88_VMUX_DVB,
1941 .vmux = 0,
1942 } },
1943 .mpeg = CX88_MPEG_DVB,
1945 [CX88_BOARD_TEVII_S460] = {
1946 .name = "TeVii S460 DVB-S/S2",
1947 .tuner_type = UNSET,
1948 .radio_type = UNSET,
1949 .tuner_addr = ADDR_UNSET,
1950 .radio_addr = ADDR_UNSET,
1951 .input = {{
1952 .type = CX88_VMUX_DVB,
1953 .vmux = 0,
1954 } },
1955 .mpeg = CX88_MPEG_DVB,
1957 [CX88_BOARD_TEVII_S464] = {
1958 .name = "TeVii S464 DVB-S/S2",
1959 .tuner_type = UNSET,
1960 .radio_type = UNSET,
1961 .tuner_addr = ADDR_UNSET,
1962 .radio_addr = ADDR_UNSET,
1963 .input = {{
1964 .type = CX88_VMUX_DVB,
1965 .vmux = 0,
1966 } },
1967 .mpeg = CX88_MPEG_DVB,
1969 [CX88_BOARD_OMICOM_SS4_PCI] = {
1970 .name = "Omicom SS4 DVB-S/S2 PCI",
1971 .tuner_type = UNSET,
1972 .radio_type = UNSET,
1973 .tuner_addr = ADDR_UNSET,
1974 .radio_addr = ADDR_UNSET,
1975 .input = {{
1976 .type = CX88_VMUX_DVB,
1977 .vmux = 0,
1978 } },
1979 .mpeg = CX88_MPEG_DVB,
1981 [CX88_BOARD_TBS_8910] = {
1982 .name = "TBS 8910 DVB-S",
1983 .tuner_type = UNSET,
1984 .radio_type = UNSET,
1985 .tuner_addr = ADDR_UNSET,
1986 .radio_addr = ADDR_UNSET,
1987 .input = {{
1988 .type = CX88_VMUX_DVB,
1989 .vmux = 0,
1990 } },
1991 .mpeg = CX88_MPEG_DVB,
1993 [CX88_BOARD_TBS_8920] = {
1994 .name = "TBS 8920 DVB-S/S2",
1995 .tuner_type = TUNER_ABSENT,
1996 .radio_type = UNSET,
1997 .tuner_addr = ADDR_UNSET,
1998 .radio_addr = ADDR_UNSET,
1999 .input = {{
2000 .type = CX88_VMUX_DVB,
2001 .vmux = 0,
2002 .gpio0 = 0x8080,
2003 } },
2004 .mpeg = CX88_MPEG_DVB,
2006 [CX88_BOARD_PROF_6200] = {
2007 .name = "Prof 6200 DVB-S",
2008 .tuner_type = UNSET,
2009 .radio_type = UNSET,
2010 .tuner_addr = ADDR_UNSET,
2011 .radio_addr = ADDR_UNSET,
2012 .input = {{
2013 .type = CX88_VMUX_DVB,
2014 .vmux = 0,
2015 } },
2016 .mpeg = CX88_MPEG_DVB,
2018 [CX88_BOARD_PROF_7300] = {
2019 .name = "PROF 7300 DVB-S/S2",
2020 .tuner_type = UNSET,
2021 .radio_type = UNSET,
2022 .tuner_addr = ADDR_UNSET,
2023 .radio_addr = ADDR_UNSET,
2024 .input = {{
2025 .type = CX88_VMUX_DVB,
2026 .vmux = 0,
2027 } },
2028 .mpeg = CX88_MPEG_DVB,
2030 [CX88_BOARD_SATTRADE_ST4200] = {
2031 .name = "SATTRADE ST4200 DVB-S/S2",
2032 .tuner_type = UNSET,
2033 .radio_type = UNSET,
2034 .tuner_addr = ADDR_UNSET,
2035 .radio_addr = ADDR_UNSET,
2036 .input = {{
2037 .type = CX88_VMUX_DVB,
2038 .vmux = 0,
2039 } },
2040 .mpeg = CX88_MPEG_DVB,
2042 [CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
2043 .name = "Terratec Cinergy HT PCI MKII",
2044 .tuner_type = TUNER_XC2028,
2045 .tuner_addr = 0x61,
2046 .radio_type = TUNER_XC2028,
2047 .radio_addr = 0x61,
2048 .input = { {
2049 .type = CX88_VMUX_TELEVISION,
2050 .vmux = 0,
2051 .gpio0 = 0x004ff,
2052 .gpio1 = 0x010ff,
2053 .gpio2 = 0x00001,
2054 }, {
2055 .type = CX88_VMUX_COMPOSITE1,
2056 .vmux = 1,
2057 .gpio0 = 0x004fb,
2058 .gpio1 = 0x010ef,
2059 .audioroute = 1,
2060 }, {
2061 .type = CX88_VMUX_SVIDEO,
2062 .vmux = 2,
2063 .gpio0 = 0x004fb,
2064 .gpio1 = 0x010ef,
2065 .audioroute = 1,
2066 } },
2067 .radio = {
2068 .type = CX88_RADIO,
2069 .gpio0 = 0x004ff,
2070 .gpio1 = 0x010ff,
2071 .gpio2 = 0x0ff,
2073 .mpeg = CX88_MPEG_DVB,
2075 [CX88_BOARD_HAUPPAUGE_IRONLY] = {
2076 .name = "Hauppauge WinTV-IR Only",
2077 .tuner_type = UNSET,
2078 .radio_type = UNSET,
2079 .tuner_addr = ADDR_UNSET,
2080 .radio_addr = ADDR_UNSET,
2082 [CX88_BOARD_WINFAST_DTV1800H] = {
2083 .name = "Leadtek WinFast DTV1800 Hybrid",
2084 .tuner_type = TUNER_XC2028,
2085 .radio_type = TUNER_XC2028,
2086 .tuner_addr = 0x61,
2087 .radio_addr = 0x61,
2089 * GPIO setting
2091 * 2: mute (0=off,1=on)
2092 * 12: tuner reset pin
2093 * 13: audio source (0=tuner audio,1=line in)
2094 * 14: FM (0=on,1=off ???)
2096 .input = {{
2097 .type = CX88_VMUX_TELEVISION,
2098 .vmux = 0,
2099 .gpio0 = 0x0400, /* pin 2 = 0 */
2100 .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */
2101 .gpio2 = 0x0000,
2102 }, {
2103 .type = CX88_VMUX_COMPOSITE1,
2104 .vmux = 1,
2105 .gpio0 = 0x0400, /* pin 2 = 0 */
2106 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */
2107 .gpio2 = 0x0000,
2108 }, {
2109 .type = CX88_VMUX_SVIDEO,
2110 .vmux = 2,
2111 .gpio0 = 0x0400, /* pin 2 = 0 */
2112 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */
2113 .gpio2 = 0x0000,
2114 } },
2115 .radio = {
2116 .type = CX88_RADIO,
2117 .gpio0 = 0x0400, /* pin 2 = 0 */
2118 .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */
2119 .gpio2 = 0x0000,
2121 .mpeg = CX88_MPEG_DVB,
2123 [CX88_BOARD_PROF_7301] = {
2124 .name = "Prof 7301 DVB-S/S2",
2125 .tuner_type = UNSET,
2126 .radio_type = UNSET,
2127 .tuner_addr = ADDR_UNSET,
2128 .radio_addr = ADDR_UNSET,
2129 .input = { {
2130 .type = CX88_VMUX_DVB,
2131 .vmux = 0,
2132 } },
2133 .mpeg = CX88_MPEG_DVB,
2135 [CX88_BOARD_TWINHAN_VP1027_DVBS] = {
2136 .name = "Twinhan VP-1027 DVB-S",
2137 .tuner_type = TUNER_ABSENT,
2138 .radio_type = UNSET,
2139 .tuner_addr = ADDR_UNSET,
2140 .radio_addr = ADDR_UNSET,
2141 .input = {{
2142 .type = CX88_VMUX_DVB,
2143 .vmux = 0,
2144 } },
2145 .mpeg = CX88_MPEG_DVB,
2149 /* ------------------------------------------------------------------ */
2150 /* PCI subsystem IDs */
2152 static const struct cx88_subid cx88_subids[] = {
2154 .subvendor = 0x0070,
2155 .subdevice = 0x3400,
2156 .card = CX88_BOARD_HAUPPAUGE,
2158 .subvendor = 0x0070,
2159 .subdevice = 0x3401,
2160 .card = CX88_BOARD_HAUPPAUGE,
2162 .subvendor = 0x14c7,
2163 .subdevice = 0x0106,
2164 .card = CX88_BOARD_GDI,
2166 .subvendor = 0x14c7,
2167 .subdevice = 0x0107, /* with mpeg encoder */
2168 .card = CX88_BOARD_GDI,
2170 .subvendor = PCI_VENDOR_ID_ATI,
2171 .subdevice = 0x00f8,
2172 .card = CX88_BOARD_ATI_WONDER_PRO,
2173 }, {
2174 .subvendor = PCI_VENDOR_ID_ATI,
2175 .subdevice = 0x00f9,
2176 .card = CX88_BOARD_ATI_WONDER_PRO,
2177 }, {
2178 .subvendor = 0x107d,
2179 .subdevice = 0x6611,
2180 .card = CX88_BOARD_WINFAST2000XP_EXPERT,
2182 .subvendor = 0x107d,
2183 .subdevice = 0x6613, /* NTSC */
2184 .card = CX88_BOARD_WINFAST2000XP_EXPERT,
2186 .subvendor = 0x107d,
2187 .subdevice = 0x6620,
2188 .card = CX88_BOARD_WINFAST_DV2000,
2190 .subvendor = 0x107d,
2191 .subdevice = 0x663b,
2192 .card = CX88_BOARD_LEADTEK_PVR2000,
2194 .subvendor = 0x107d,
2195 .subdevice = 0x663c,
2196 .card = CX88_BOARD_LEADTEK_PVR2000,
2198 .subvendor = 0x1461,
2199 .subdevice = 0x000b,
2200 .card = CX88_BOARD_AVERTV_STUDIO_303,
2202 .subvendor = 0x1462,
2203 .subdevice = 0x8606,
2204 .card = CX88_BOARD_MSI_TVANYWHERE_MASTER,
2206 .subvendor = 0x10fc,
2207 .subdevice = 0xd003,
2208 .card = CX88_BOARD_IODATA_GVVCP3PCI,
2210 .subvendor = 0x1043,
2211 .subdevice = 0x4823, /* with mpeg encoder */
2212 .card = CX88_BOARD_ASUS_PVR_416,
2214 .subvendor = 0x17de,
2215 .subdevice = 0x08a6,
2216 .card = CX88_BOARD_KWORLD_DVB_T,
2218 .subvendor = 0x18ac,
2219 .subdevice = 0xd810,
2220 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
2222 .subvendor = 0x18ac,
2223 .subdevice = 0xd820,
2224 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
2226 .subvendor = 0x18ac,
2227 .subdevice = 0xdb00,
2228 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
2230 .subvendor = 0x0070,
2231 .subdevice = 0x9002,
2232 .card = CX88_BOARD_HAUPPAUGE_DVB_T1,
2234 .subvendor = 0x14f1,
2235 .subdevice = 0x0187,
2236 .card = CX88_BOARD_CONEXANT_DVB_T1,
2238 .subvendor = 0x1540,
2239 .subdevice = 0x2580,
2240 .card = CX88_BOARD_PROVIDEO_PV259,
2242 .subvendor = 0x18ac,
2243 .subdevice = 0xdb10,
2244 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
2246 .subvendor = 0x1554,
2247 .subdevice = 0x4811,
2248 .card = CX88_BOARD_PIXELVIEW,
2250 .subvendor = 0x7063,
2251 .subdevice = 0x3000, /* HD-3000 card */
2252 .card = CX88_BOARD_PCHDTV_HD3000,
2254 .subvendor = 0x17de,
2255 .subdevice = 0xa8a6,
2256 .card = CX88_BOARD_DNTV_LIVE_DVB_T,
2258 .subvendor = 0x0070,
2259 .subdevice = 0x2801,
2260 .card = CX88_BOARD_HAUPPAUGE_ROSLYN,
2262 .subvendor = 0x14f1,
2263 .subdevice = 0x0342,
2264 .card = CX88_BOARD_DIGITALLOGIC_MEC,
2266 .subvendor = 0x10fc,
2267 .subdevice = 0xd035,
2268 .card = CX88_BOARD_IODATA_GVBCTV7E,
2270 .subvendor = 0x1421,
2271 .subdevice = 0x0334,
2272 .card = CX88_BOARD_ADSTECH_DVB_T_PCI,
2274 .subvendor = 0x153b,
2275 .subdevice = 0x1166,
2276 .card = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
2278 .subvendor = 0x18ac,
2279 .subdevice = 0xd500,
2280 .card = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
2282 .subvendor = 0x1461,
2283 .subdevice = 0x8011,
2284 .card = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
2286 .subvendor = PCI_VENDOR_ID_ATI,
2287 .subdevice = 0xa101,
2288 .card = CX88_BOARD_ATI_HDTVWONDER,
2290 .subvendor = 0x107d,
2291 .subdevice = 0x665f,
2292 .card = CX88_BOARD_WINFAST_DTV1000,
2294 .subvendor = 0x1461,
2295 .subdevice = 0x000a,
2296 .card = CX88_BOARD_AVERTV_303,
2298 .subvendor = 0x0070,
2299 .subdevice = 0x9200,
2300 .card = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
2302 .subvendor = 0x0070,
2303 .subdevice = 0x9201,
2304 .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
2306 .subvendor = 0x0070,
2307 .subdevice = 0x9202,
2308 .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
2310 .subvendor = 0x17de,
2311 .subdevice = 0x08b2,
2312 .card = CX88_BOARD_KWORLD_DVBS_100,
2314 .subvendor = 0x0070,
2315 .subdevice = 0x9400,
2316 .card = CX88_BOARD_HAUPPAUGE_HVR1100,
2318 .subvendor = 0x0070,
2319 .subdevice = 0x9402,
2320 .card = CX88_BOARD_HAUPPAUGE_HVR1100,
2322 .subvendor = 0x0070,
2323 .subdevice = 0x9800,
2324 .card = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2326 .subvendor = 0x0070,
2327 .subdevice = 0x9802,
2328 .card = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2330 .subvendor = 0x0070,
2331 .subdevice = 0x9001,
2332 .card = CX88_BOARD_HAUPPAUGE_DVB_T1,
2334 .subvendor = 0x1822,
2335 .subdevice = 0x0025,
2336 .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
2338 .subvendor = 0x17de,
2339 .subdevice = 0x08a1,
2340 .card = CX88_BOARD_KWORLD_DVB_T_CX22702,
2342 .subvendor = 0x18ac,
2343 .subdevice = 0xdb50,
2344 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
2346 .subvendor = 0x18ac,
2347 .subdevice = 0xdb54,
2348 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
2349 /* Re-branded DViCO: DigitalNow DVB-T Dual */
2351 .subvendor = 0x18ac,
2352 .subdevice = 0xdb11,
2353 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
2354 /* Re-branded DViCO: UltraView DVB-T Plus */
2355 }, {
2356 .subvendor = 0x18ac,
2357 .subdevice = 0xdb30,
2358 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
2359 }, {
2360 .subvendor = 0x17de,
2361 .subdevice = 0x0840,
2362 .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
2364 .subvendor = 0x1421,
2365 .subdevice = 0x0305,
2366 .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
2368 .subvendor = 0x18ac,
2369 .subdevice = 0xdb40,
2370 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2372 .subvendor = 0x18ac,
2373 .subdevice = 0xdb44,
2374 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2376 .subvendor = 0x7063,
2377 .subdevice = 0x5500,
2378 .card = CX88_BOARD_PCHDTV_HD5500,
2380 .subvendor = 0x17de,
2381 .subdevice = 0x0841,
2382 .card = CX88_BOARD_KWORLD_MCE200_DELUXE,
2384 .subvendor = 0x1822,
2385 .subdevice = 0x0019,
2386 .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
2388 .subvendor = 0x1554,
2389 .subdevice = 0x4813,
2390 .card = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
2392 .subvendor = 0x14f1,
2393 .subdevice = 0x0842,
2394 .card = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
2396 .subvendor = 0x107d,
2397 .subdevice = 0x665e,
2398 .card = CX88_BOARD_WINFAST_DTV2000H,
2400 .subvendor = 0x107d,
2401 .subdevice = 0x6f2b,
2402 .card = CX88_BOARD_WINFAST_DTV2000H_J,
2404 .subvendor = 0x18ac,
2405 .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
2406 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
2408 .subvendor = 0x14f1,
2409 .subdevice = 0x0084,
2410 .card = CX88_BOARD_GENIATECH_DVBS,
2412 .subvendor = 0x0070,
2413 .subdevice = 0x1404,
2414 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
2415 }, {
2416 .subvendor = 0x18ac,
2417 .subdevice = 0xdc00,
2418 .card = CX88_BOARD_SAMSUNG_SMT_7020,
2419 }, {
2420 .subvendor = 0x18ac,
2421 .subdevice = 0xdccd,
2422 .card = CX88_BOARD_SAMSUNG_SMT_7020,
2424 .subvendor = 0x1461,
2425 .subdevice = 0xc111, /* AverMedia M150-D */
2426 /* This board is known to work with the ASUS PVR416 config */
2427 .card = CX88_BOARD_ASUS_PVR_416,
2429 .subvendor = 0xc180,
2430 .subdevice = 0xc980,
2431 .card = CX88_BOARD_TE_DTV_250_OEM_SWANN,
2433 .subvendor = 0x0070,
2434 .subdevice = 0x9600,
2435 .card = CX88_BOARD_HAUPPAUGE_HVR1300,
2437 .subvendor = 0x0070,
2438 .subdevice = 0x9601,
2439 .card = CX88_BOARD_HAUPPAUGE_HVR1300,
2441 .subvendor = 0x0070,
2442 .subdevice = 0x9602,
2443 .card = CX88_BOARD_HAUPPAUGE_HVR1300,
2445 .subvendor = 0x107d,
2446 .subdevice = 0x6632,
2447 .card = CX88_BOARD_LEADTEK_PVR2000,
2449 .subvendor = 0x12ab,
2450 .subdevice = 0x2300, /* Club3D Zap TV2100 */
2451 .card = CX88_BOARD_KWORLD_DVB_T_CX22702,
2453 .subvendor = 0x0070,
2454 .subdevice = 0x9000,
2455 .card = CX88_BOARD_HAUPPAUGE_DVB_T1,
2457 .subvendor = 0x0070,
2458 .subdevice = 0x1400,
2459 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
2461 .subvendor = 0x0070,
2462 .subdevice = 0x1401,
2463 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
2465 .subvendor = 0x0070,
2466 .subdevice = 0x1402,
2467 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
2469 .subvendor = 0x1421,
2470 .subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
2471 .card = CX88_BOARD_KWORLD_DVBS_100,
2473 .subvendor = 0x1421,
2474 .subdevice = 0x0390,
2475 .card = CX88_BOARD_ADSTECH_PTV_390,
2477 .subvendor = 0x11bd,
2478 .subdevice = 0x0051,
2479 .card = CX88_BOARD_PINNACLE_PCTV_HD_800i,
2480 }, {
2481 .subvendor = 0x18ac,
2482 .subdevice = 0xd530,
2483 .card = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,
2484 }, {
2485 .subvendor = 0x12ab,
2486 .subdevice = 0x1788,
2487 .card = CX88_BOARD_PINNACLE_HYBRID_PCTV,
2488 }, {
2489 .subvendor = 0x14f1,
2490 .subdevice = 0xea3d,
2491 .card = CX88_BOARD_POWERCOLOR_REAL_ANGEL,
2492 }, {
2493 .subvendor = 0x107d,
2494 .subdevice = 0x6f18,
2495 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
2496 }, {
2497 .subvendor = 0x14f1,
2498 .subdevice = 0x8852,
2499 .card = CX88_BOARD_GENIATECH_X8000_MT,
2500 }, {
2501 .subvendor = 0x18ac,
2502 .subdevice = 0xd610,
2503 .card = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,
2504 }, {
2505 .subvendor = 0x1554,
2506 .subdevice = 0x4935,
2507 .card = CX88_BOARD_PROLINK_PV_8000GT,
2508 }, {
2509 .subvendor = 0x1554,
2510 .subdevice = 0x4976,
2511 .card = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,
2512 }, {
2513 .subvendor = 0x17de,
2514 .subdevice = 0x08c1,
2515 .card = CX88_BOARD_KWORLD_ATSC_120,
2516 }, {
2517 .subvendor = 0x0070,
2518 .subdevice = 0x6900,
2519 .card = CX88_BOARD_HAUPPAUGE_HVR4000,
2520 }, {
2521 .subvendor = 0x0070,
2522 .subdevice = 0x6904,
2523 .card = CX88_BOARD_HAUPPAUGE_HVR4000,
2524 }, {
2525 .subvendor = 0x0070,
2526 .subdevice = 0x6902,
2527 .card = CX88_BOARD_HAUPPAUGE_HVR4000,
2528 }, {
2529 .subvendor = 0x0070,
2530 .subdevice = 0x6905,
2531 .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
2532 }, {
2533 .subvendor = 0x0070,
2534 .subdevice = 0x6906,
2535 .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
2536 }, {
2537 .subvendor = 0xd420,
2538 .subdevice = 0x9022,
2539 .card = CX88_BOARD_TEVII_S420,
2540 }, {
2541 .subvendor = 0xd460,
2542 .subdevice = 0x9022,
2543 .card = CX88_BOARD_TEVII_S460,
2544 }, {
2545 .subvendor = 0xd464,
2546 .subdevice = 0x9022,
2547 .card = CX88_BOARD_TEVII_S464,
2548 }, {
2549 .subvendor = 0xA044,
2550 .subdevice = 0x2011,
2551 .card = CX88_BOARD_OMICOM_SS4_PCI,
2552 }, {
2553 .subvendor = 0x8910,
2554 .subdevice = 0x8888,
2555 .card = CX88_BOARD_TBS_8910,
2556 }, {
2557 .subvendor = 0x8920,
2558 .subdevice = 0x8888,
2559 .card = CX88_BOARD_TBS_8920,
2560 }, {
2561 .subvendor = 0xb022,
2562 .subdevice = 0x3022,
2563 .card = CX88_BOARD_PROF_6200,
2564 }, {
2565 .subvendor = 0xB033,
2566 .subdevice = 0x3033,
2567 .card = CX88_BOARD_PROF_7300,
2568 }, {
2569 .subvendor = 0xb200,
2570 .subdevice = 0x4200,
2571 .card = CX88_BOARD_SATTRADE_ST4200,
2572 }, {
2573 .subvendor = 0x153b,
2574 .subdevice = 0x1177,
2575 .card = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,
2576 }, {
2577 .subvendor = 0x0070,
2578 .subdevice = 0x9290,
2579 .card = CX88_BOARD_HAUPPAUGE_IRONLY,
2580 }, {
2581 .subvendor = 0x107d,
2582 .subdevice = 0x6654,
2583 .card = CX88_BOARD_WINFAST_DTV1800H,
2584 }, {
2585 /* PVR2000 PAL Model [107d:6630] */
2586 .subvendor = 0x107d,
2587 .subdevice = 0x6630,
2588 .card = CX88_BOARD_LEADTEK_PVR2000,
2589 }, {
2590 /* PVR2000 PAL Model [107d:6638] */
2591 .subvendor = 0x107d,
2592 .subdevice = 0x6638,
2593 .card = CX88_BOARD_LEADTEK_PVR2000,
2594 }, {
2595 /* PVR2000 NTSC Model [107d:6631] */
2596 .subvendor = 0x107d,
2597 .subdevice = 0x6631,
2598 .card = CX88_BOARD_LEADTEK_PVR2000,
2599 }, {
2600 /* PVR2000 NTSC Model [107d:6637] */
2601 .subvendor = 0x107d,
2602 .subdevice = 0x6637,
2603 .card = CX88_BOARD_LEADTEK_PVR2000,
2604 }, {
2605 /* PVR2000 NTSC Model [107d:663d] */
2606 .subvendor = 0x107d,
2607 .subdevice = 0x663d,
2608 .card = CX88_BOARD_LEADTEK_PVR2000,
2609 }, {
2610 /* DV2000 NTSC Model [107d:6621] */
2611 .subvendor = 0x107d,
2612 .subdevice = 0x6621,
2613 .card = CX88_BOARD_WINFAST_DV2000,
2614 }, {
2615 /* TV2000 XP Global [107d:6618] */
2616 .subvendor = 0x107d,
2617 .subdevice = 0x6618,
2618 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
2619 }, {
2620 .subvendor = 0xb034,
2621 .subdevice = 0x3034,
2622 .card = CX88_BOARD_PROF_7301,
2623 }, {
2624 .subvendor = 0x1822,
2625 .subdevice = 0x0023,
2626 .card = CX88_BOARD_TWINHAN_VP1027_DVBS,
2630 /* ----------------------------------------------------------------------- */
2631 /* some leadtek specific stuff */
2633 static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
2635 if (eeprom_data[4] != 0x7d ||
2636 eeprom_data[5] != 0x10 ||
2637 eeprom_data[7] != 0x66) {
2638 warn_printk(core, "Leadtek eeprom invalid.\n");
2639 return;
2642 /* Terry Wu <terrywu2009@gmail.com> */
2643 switch (eeprom_data[6]) {
2644 case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
2645 case 0x21: /* SSID 6621 for DV2000 NTSC Model */
2646 case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
2647 case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
2648 case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
2649 core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
2650 break;
2651 default:
2652 core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
2653 break;
2656 info_printk(core, "Leadtek Winfast 2000XP Expert config: "
2657 "tuner=%d, eeprom[0]=0x%02x\n",
2658 core->board.tuner_type, eeprom_data[0]);
2661 static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
2663 struct tveeprom tv;
2665 tveeprom_hauppauge_analog(&core->i2c_client, &tv, eeprom_data);
2666 core->board.tuner_type = tv.tuner_type;
2667 core->tuner_formats = tv.tuner_formats;
2668 core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;
2670 /* Make sure we support the board model */
2671 switch (tv.model)
2673 case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
2674 case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
2675 case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
2676 case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
2677 case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
2678 case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
2679 case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
2680 case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
2681 case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
2682 case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
2683 case 34519: /* WinTV-PCI-FM */
2684 case 69009:
2685 /* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
2686 case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
2687 case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
2688 case 69559:
2689 /* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
2690 case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
2691 case 90002: /* Nova-T-PCI (9002) */
2692 case 92001: /* Nova-S-Plus (Video and IR) */
2693 case 92002: /* Nova-S-Plus (Video and IR) */
2694 case 90003: /* Nova-T-PCI (9002 No RF out) */
2695 case 90500: /* Nova-T-PCI (oem) */
2696 case 90501: /* Nova-T-PCI (oem/IR) */
2697 case 92000: /* Nova-SE2 (OEM, No Video or IR) */
2698 case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */
2699 case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
2700 case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
2701 case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
2702 case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
2703 case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
2704 case 96569: /* WinTV-HVR1300 () */
2705 case 96659: /* WinTV-HVR1300 () */
2706 case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
2707 /* known */
2708 break;
2709 case CX88_BOARD_SAMSUNG_SMT_7020:
2710 cx_set(MO_GP0_IO, 0x008989FF);
2711 break;
2712 default:
2713 warn_printk(core, "warning: unknown hauppauge model #%d\n",
2714 tv.model);
2715 break;
2718 info_printk(core, "hauppauge eeprom: model=%d\n", tv.model);
2721 /* ----------------------------------------------------------------------- */
2722 /* some GDI (was: Modular Technology) specific stuff */
2724 static const struct {
2725 int id;
2726 int fm;
2727 const char *name;
2728 } gdi_tuner[] = {
2729 [ 0x01 ] = { .id = TUNER_ABSENT,
2730 .name = "NTSC_M" },
2731 [ 0x02 ] = { .id = TUNER_ABSENT,
2732 .name = "PAL_B" },
2733 [ 0x03 ] = { .id = TUNER_ABSENT,
2734 .name = "PAL_I" },
2735 [ 0x04 ] = { .id = TUNER_ABSENT,
2736 .name = "PAL_D" },
2737 [ 0x05 ] = { .id = TUNER_ABSENT,
2738 .name = "SECAM" },
2740 [ 0x10 ] = { .id = TUNER_ABSENT,
2741 .fm = 1,
2742 .name = "TEMIC_4049" },
2743 [ 0x11 ] = { .id = TUNER_TEMIC_4136FY5,
2744 .name = "TEMIC_4136" },
2745 [ 0x12 ] = { .id = TUNER_ABSENT,
2746 .name = "TEMIC_4146" },
2748 [ 0x20 ] = { .id = TUNER_PHILIPS_FQ1216ME,
2749 .fm = 1,
2750 .name = "PHILIPS_FQ1216_MK3" },
2751 [ 0x21 ] = { .id = TUNER_ABSENT, .fm = 1,
2752 .name = "PHILIPS_FQ1236_MK3" },
2753 [ 0x22 ] = { .id = TUNER_ABSENT,
2754 .name = "PHILIPS_FI1236_MK3" },
2755 [ 0x23 ] = { .id = TUNER_ABSENT,
2756 .name = "PHILIPS_FI1216_MK3" },
2759 static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
2761 const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
2762 ? gdi_tuner[eeprom_data[0x0d]].name : NULL;
2764 info_printk(core, "GDI: tuner=%s\n", name ? name : "unknown");
2765 if (NULL == name)
2766 return;
2767 core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
2768 core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?
2769 CX88_RADIO : 0;
2772 /* ------------------------------------------------------------------- */
2773 /* some Divco specific stuff */
2774 static int cx88_dvico_xc2028_callback(struct cx88_core *core,
2775 int command, int arg)
2777 switch (command) {
2778 case XC2028_TUNER_RESET:
2779 switch (core->boardnr) {
2780 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
2781 /* GPIO-4 xc3028 tuner */
2783 cx_set(MO_GP0_IO, 0x00001000);
2784 cx_clear(MO_GP0_IO, 0x00000010);
2785 msleep(100);
2786 cx_set(MO_GP0_IO, 0x00000010);
2787 msleep(100);
2788 break;
2789 default:
2790 cx_write(MO_GP0_IO, 0x101000);
2791 mdelay(5);
2792 cx_set(MO_GP0_IO, 0x101010);
2794 break;
2795 default:
2796 return -EINVAL;
2799 return 0;
2803 /* ----------------------------------------------------------------------- */
2804 /* some Geniatech specific stuff */
2806 static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
2807 int command, int mode)
2809 switch (command) {
2810 case XC2028_TUNER_RESET:
2811 switch (INPUT(core->input).type) {
2812 case CX88_RADIO:
2813 break;
2814 case CX88_VMUX_DVB:
2815 cx_write(MO_GP1_IO, 0x030302);
2816 mdelay(50);
2817 break;
2818 default:
2819 cx_write(MO_GP1_IO, 0x030301);
2820 mdelay(50);
2822 cx_write(MO_GP1_IO, 0x101010);
2823 mdelay(50);
2824 cx_write(MO_GP1_IO, 0x101000);
2825 mdelay(50);
2826 cx_write(MO_GP1_IO, 0x101010);
2827 mdelay(50);
2828 return 0;
2830 return -EINVAL;
2833 static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
2834 int command, int arg)
2836 switch (command) {
2837 case XC2028_TUNER_RESET:
2838 /* GPIO 12 (xc3028 tuner reset) */
2839 cx_set(MO_GP1_IO, 0x1010);
2840 mdelay(50);
2841 cx_clear(MO_GP1_IO, 0x10);
2842 mdelay(50);
2843 cx_set(MO_GP1_IO, 0x10);
2844 mdelay(50);
2845 return 0;
2847 return -EINVAL;
2850 /* ------------------------------------------------------------------- */
2851 /* some Divco specific stuff */
2852 static int cx88_pv_8000gt_callback(struct cx88_core *core,
2853 int command, int arg)
2855 switch (command) {
2856 case XC2028_TUNER_RESET:
2857 cx_write(MO_GP2_IO, 0xcf7);
2858 mdelay(50);
2859 cx_write(MO_GP2_IO, 0xef5);
2860 mdelay(50);
2861 cx_write(MO_GP2_IO, 0xcf7);
2862 break;
2863 default:
2864 return -EINVAL;
2867 return 0;
2870 /* ----------------------------------------------------------------------- */
2871 /* some DViCO specific stuff */
2873 static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
2875 struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
2876 int i, err;
2877 static u8 init_bufs[13][5] = {
2878 { 0x10, 0x00, 0x20, 0x01, 0x03 },
2879 { 0x10, 0x10, 0x01, 0x00, 0x21 },
2880 { 0x10, 0x10, 0x10, 0x00, 0xCA },
2881 { 0x10, 0x10, 0x12, 0x00, 0x08 },
2882 { 0x10, 0x10, 0x13, 0x00, 0x0A },
2883 { 0x10, 0x10, 0x16, 0x01, 0xC0 },
2884 { 0x10, 0x10, 0x22, 0x01, 0x3D },
2885 { 0x10, 0x10, 0x73, 0x01, 0x2E },
2886 { 0x10, 0x10, 0x72, 0x00, 0xC5 },
2887 { 0x10, 0x10, 0x71, 0x01, 0x97 },
2888 { 0x10, 0x10, 0x70, 0x00, 0x0F },
2889 { 0x10, 0x10, 0xB0, 0x00, 0x01 },
2890 { 0x03, 0x0C },
2893 for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {
2894 msg.buf = init_bufs[i];
2895 msg.len = (i != 12 ? 5 : 2);
2896 err = i2c_transfer(&core->i2c_adap, &msg, 1);
2897 if (err != 1) {
2898 warn_printk(core, "dvico_fusionhdtv_hybrid_init buf %d "
2899 "failed (err = %d)!\n", i, err);
2900 return;
2905 static int cx88_xc2028_tuner_callback(struct cx88_core *core,
2906 int command, int arg)
2908 /* Board-specific callbacks */
2909 switch (core->boardnr) {
2910 case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
2911 case CX88_BOARD_GENIATECH_X8000_MT:
2912 case CX88_BOARD_KWORLD_ATSC_120:
2913 return cx88_xc3028_geniatech_tuner_callback(core,
2914 command, arg);
2915 case CX88_BOARD_PROLINK_PV_8000GT:
2916 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
2917 return cx88_pv_8000gt_callback(core, command, arg);
2918 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
2919 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
2920 return cx88_dvico_xc2028_callback(core, command, arg);
2921 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
2922 case CX88_BOARD_WINFAST_DTV1800H:
2923 return cx88_xc3028_winfast1800h_callback(core, command, arg);
2926 switch (command) {
2927 case XC2028_TUNER_RESET:
2928 switch (INPUT(core->input).type) {
2929 case CX88_RADIO:
2930 info_printk(core, "setting GPIO to radio!\n");
2931 cx_write(MO_GP0_IO, 0x4ff);
2932 mdelay(250);
2933 cx_write(MO_GP2_IO, 0xff);
2934 mdelay(250);
2935 break;
2936 case CX88_VMUX_DVB: /* Digital TV*/
2937 default: /* Analog TV */
2938 info_printk(core, "setting GPIO to TV!\n");
2939 break;
2941 cx_write(MO_GP1_IO, 0x101010);
2942 mdelay(250);
2943 cx_write(MO_GP1_IO, 0x101000);
2944 mdelay(250);
2945 cx_write(MO_GP1_IO, 0x101010);
2946 mdelay(250);
2947 return 0;
2949 return -EINVAL;
2952 static int cx88_xc4000_tuner_callback(struct cx88_core *core,
2953 int command, int arg)
2955 /* Board-specific callbacks */
2956 switch (core->boardnr) {
2958 return -EINVAL;
2961 /* ----------------------------------------------------------------------- */
2962 /* Tuner callback function. Currently only needed for the Pinnacle *
2963 * PCTV HD 800i with an xc5000 sillicon tuner. This is used for both *
2964 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c) */
2966 static int cx88_xc5000_tuner_callback(struct cx88_core *core,
2967 int command, int arg)
2969 switch (core->boardnr) {
2970 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
2971 if (command == 0) { /* This is the reset command from xc5000 */
2973 /* djh - According to the engineer at PCTV Systems,
2974 the xc5000 reset pin is supposed to be on GPIO12.
2975 However, despite three nights of effort, pulling
2976 that GPIO low didn't reset the xc5000. While
2977 pulling MO_SRST_IO low does reset the xc5000, this
2978 also resets in the s5h1409 being reset as well.
2979 This causes tuning to always fail since the internal
2980 state of the s5h1409 does not match the driver's
2981 state. Given that the only two conditions in which
2982 the driver performs a reset is during firmware load
2983 and powering down the chip, I am taking out the
2984 reset. We know that the chip is being reset
2985 when the cx88 comes online, and not being able to
2986 do power management for this board is worse than
2987 not having any tuning at all. */
2988 return 0;
2989 } else {
2990 err_printk(core, "xc5000: unknown tuner "
2991 "callback command.\n");
2992 return -EINVAL;
2994 break;
2995 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
2996 if (command == 0) { /* This is the reset command from xc5000 */
2997 cx_clear(MO_GP0_IO, 0x00000010);
2998 msleep(10);
2999 cx_set(MO_GP0_IO, 0x00000010);
3000 return 0;
3001 } else {
3002 printk(KERN_ERR
3003 "xc5000: unknown tuner callback command.\n");
3004 return -EINVAL;
3006 break;
3008 return 0; /* Should never be here */
3011 int cx88_tuner_callback(void *priv, int component, int command, int arg)
3013 struct i2c_algo_bit_data *i2c_algo = priv;
3014 struct cx88_core *core;
3016 if (!i2c_algo) {
3017 printk(KERN_ERR "cx88: Error - i2c private data undefined.\n");
3018 return -EINVAL;
3021 core = i2c_algo->data;
3023 if (!core) {
3024 printk(KERN_ERR "cx88: Error - device struct undefined.\n");
3025 return -EINVAL;
3028 if (component != DVB_FRONTEND_COMPONENT_TUNER)
3029 return -EINVAL;
3031 switch (core->board.tuner_type) {
3032 case TUNER_XC2028:
3033 info_printk(core, "Calling XC2028/3028 callback\n");
3034 return cx88_xc2028_tuner_callback(core, command, arg);
3035 case TUNER_XC4000:
3036 info_printk(core, "Calling XC4000 callback\n");
3037 return cx88_xc4000_tuner_callback(core, command, arg);
3038 case TUNER_XC5000:
3039 info_printk(core, "Calling XC5000 callback\n");
3040 return cx88_xc5000_tuner_callback(core, command, arg);
3042 err_printk(core, "Error: Calling callback for tuner %d\n",
3043 core->board.tuner_type);
3044 return -EINVAL;
3046 EXPORT_SYMBOL(cx88_tuner_callback);
3048 /* ----------------------------------------------------------------------- */
3050 static void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
3052 int i;
3054 if (0 == pci->subsystem_vendor &&
3055 0 == pci->subsystem_device) {
3056 printk(KERN_ERR
3057 "%s: Your board has no valid PCI Subsystem ID and thus can't\n"
3058 "%s: be autodetected. Please pass card=<n> insmod option to\n"
3059 "%s: workaround that. Redirect complaints to the vendor of\n"
3060 "%s: the TV card. Best regards,\n"
3061 "%s: -- tux\n",
3062 core->name,core->name,core->name,core->name,core->name);
3063 } else {
3064 printk(KERN_ERR
3065 "%s: Your board isn't known (yet) to the driver. You can\n"
3066 "%s: try to pick one of the existing card configs via\n"
3067 "%s: card=<n> insmod option. Updating to the latest\n"
3068 "%s: version might help as well.\n",
3069 core->name,core->name,core->name,core->name);
3071 err_printk(core, "Here is a list of valid choices for the card=<n> "
3072 "insmod option:\n");
3073 for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)
3074 printk(KERN_ERR "%s: card=%d -> %s\n",
3075 core->name, i, cx88_boards[i].name);
3078 static void cx88_card_setup_pre_i2c(struct cx88_core *core)
3080 switch (core->boardnr) {
3081 case CX88_BOARD_HAUPPAUGE_HVR1300:
3083 * Bring the 702 demod up before i2c scanning/attach or devices are hidden
3084 * We leave here with the 702 on the bus
3086 * "reset the IR receiver on GPIO[3]"
3087 * Reported by Mike Crash <mike AT mikecrash.com>
3089 cx_write(MO_GP0_IO, 0x0000ef88);
3090 udelay(1000);
3091 cx_clear(MO_GP0_IO, 0x00000088);
3092 udelay(50);
3093 cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */
3094 udelay(1000);
3095 break;
3097 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
3098 case CX88_BOARD_PROLINK_PV_8000GT:
3099 cx_write(MO_GP2_IO, 0xcf7);
3100 mdelay(50);
3101 cx_write(MO_GP2_IO, 0xef5);
3102 mdelay(50);
3103 cx_write(MO_GP2_IO, 0xcf7);
3104 msleep(10);
3105 break;
3107 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
3108 /* Enable the xc5000 tuner */
3109 cx_set(MO_GP0_IO, 0x00001010);
3110 break;
3112 case CX88_BOARD_HAUPPAUGE_HVR3000:
3113 case CX88_BOARD_HAUPPAUGE_HVR4000:
3114 /* Init GPIO */
3115 cx_write(MO_GP0_IO, core->board.input[0].gpio0);
3116 udelay(1000);
3117 cx_clear(MO_GP0_IO, 0x00000080);
3118 udelay(50);
3119 cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
3120 udelay(1000);
3121 break;
3123 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
3124 case CX88_BOARD_WINFAST_DTV1800H:
3125 /* GPIO 12 (xc3028 tuner reset) */
3126 cx_set(MO_GP1_IO, 0x1010);
3127 mdelay(50);
3128 cx_clear(MO_GP1_IO, 0x10);
3129 mdelay(50);
3130 cx_set(MO_GP1_IO, 0x10);
3131 mdelay(50);
3132 break;
3134 case CX88_BOARD_TWINHAN_VP1027_DVBS:
3135 cx_write(MO_GP0_IO, 0x00003230);
3136 cx_write(MO_GP0_IO, 0x00003210);
3137 msleep(1);
3138 cx_write(MO_GP0_IO, 0x00001230);
3139 break;
3144 * Sets board-dependent xc3028 configuration
3146 void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
3148 memset(ctl, 0, sizeof(*ctl));
3150 ctl->fname = XC2028_DEFAULT_FIRMWARE;
3151 ctl->max_len = 64;
3153 switch (core->boardnr) {
3154 case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
3155 /* Now works with firmware version 2.7 */
3156 if (core->i2c_algo.udelay < 16)
3157 core->i2c_algo.udelay = 16;
3158 break;
3159 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
3160 case CX88_BOARD_WINFAST_DTV1800H:
3161 ctl->demod = XC3028_FE_ZARLINK456;
3162 break;
3163 case CX88_BOARD_KWORLD_ATSC_120:
3164 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
3165 ctl->demod = XC3028_FE_OREN538;
3166 break;
3167 case CX88_BOARD_GENIATECH_X8000_MT:
3168 /* FIXME: For this board, the xc3028 never recovers after being
3169 powered down (the reset GPIO probably is not set properly).
3170 We don't have access to the hardware so we cannot determine
3171 which GPIO is used for xc3028, so just disable power xc3028
3172 power management for now */
3173 ctl->disable_power_mgmt = 1;
3174 break;
3175 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
3176 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
3177 case CX88_BOARD_PROLINK_PV_8000GT:
3179 * Those boards uses non-MTS firmware
3181 break;
3182 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
3183 case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
3184 ctl->demod = XC3028_FE_ZARLINK456;
3185 ctl->mts = 1;
3186 break;
3187 default:
3188 ctl->demod = XC3028_FE_OREN538;
3189 ctl->mts = 1;
3192 EXPORT_SYMBOL_GPL(cx88_setup_xc3028);
3194 static void cx88_card_setup(struct cx88_core *core)
3196 static u8 eeprom[256];
3197 struct tuner_setup tun_setup;
3198 unsigned int mode_mask = T_RADIO | T_ANALOG_TV;
3200 memset(&tun_setup, 0, sizeof(tun_setup));
3202 if (0 == core->i2c_rc) {
3203 core->i2c_client.addr = 0xa0 >> 1;
3204 tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));
3207 switch (core->boardnr) {
3208 case CX88_BOARD_HAUPPAUGE:
3209 case CX88_BOARD_HAUPPAUGE_ROSLYN:
3210 if (0 == core->i2c_rc)
3211 hauppauge_eeprom(core, eeprom+8);
3212 break;
3213 case CX88_BOARD_GDI:
3214 if (0 == core->i2c_rc)
3215 gdi_eeprom(core, eeprom);
3216 break;
3217 case CX88_BOARD_LEADTEK_PVR2000:
3218 case CX88_BOARD_WINFAST_DV2000:
3219 case CX88_BOARD_WINFAST2000XP_EXPERT:
3220 if (0 == core->i2c_rc)
3221 leadtek_eeprom(core, eeprom);
3222 break;
3223 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
3224 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
3225 case CX88_BOARD_HAUPPAUGE_DVB_T1:
3226 case CX88_BOARD_HAUPPAUGE_HVR1100:
3227 case CX88_BOARD_HAUPPAUGE_HVR1100LP:
3228 case CX88_BOARD_HAUPPAUGE_HVR3000:
3229 case CX88_BOARD_HAUPPAUGE_HVR1300:
3230 case CX88_BOARD_HAUPPAUGE_HVR4000:
3231 case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
3232 case CX88_BOARD_HAUPPAUGE_IRONLY:
3233 if (0 == core->i2c_rc)
3234 hauppauge_eeprom(core, eeprom);
3235 break;
3236 case CX88_BOARD_KWORLD_DVBS_100:
3237 cx_write(MO_GP0_IO, 0x000007f8);
3238 cx_write(MO_GP1_IO, 0x00000001);
3239 break;
3240 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
3241 /* GPIO0:0 is hooked to demod reset */
3242 /* GPIO0:4 is hooked to xc3028 reset */
3243 cx_write(MO_GP0_IO, 0x00111100);
3244 msleep(1);
3245 cx_write(MO_GP0_IO, 0x00111111);
3246 break;
3247 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
3248 /* GPIO0:6 is hooked to FX2 reset pin */
3249 cx_set(MO_GP0_IO, 0x00004040);
3250 cx_clear(MO_GP0_IO, 0x00000040);
3251 msleep(1000);
3252 cx_set(MO_GP0_IO, 0x00004040);
3253 /* FALLTHROUGH */
3254 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
3255 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
3256 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
3257 /* GPIO0:0 is hooked to mt352 reset pin */
3258 cx_set(MO_GP0_IO, 0x00000101);
3259 cx_clear(MO_GP0_IO, 0x00000001);
3260 msleep(1);
3261 cx_set(MO_GP0_IO, 0x00000101);
3262 if (0 == core->i2c_rc &&
3263 core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
3264 dvico_fusionhdtv_hybrid_init(core);
3265 break;
3266 case CX88_BOARD_KWORLD_DVB_T:
3267 case CX88_BOARD_DNTV_LIVE_DVB_T:
3268 cx_set(MO_GP0_IO, 0x00000707);
3269 cx_set(MO_GP2_IO, 0x00000101);
3270 cx_clear(MO_GP2_IO, 0x00000001);
3271 msleep(1);
3272 cx_clear(MO_GP0_IO, 0x00000007);
3273 cx_set(MO_GP2_IO, 0x00000101);
3274 break;
3275 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
3276 cx_write(MO_GP0_IO, 0x00080808);
3277 break;
3278 case CX88_BOARD_ATI_HDTVWONDER:
3279 if (0 == core->i2c_rc) {
3280 /* enable tuner */
3281 int i;
3282 static const u8 buffer [][2] = {
3283 {0x10,0x12},
3284 {0x13,0x04},
3285 {0x16,0x00},
3286 {0x14,0x04},
3287 {0x17,0x00}
3289 core->i2c_client.addr = 0x0a;
3291 for (i = 0; i < ARRAY_SIZE(buffer); i++)
3292 if (2 != i2c_master_send(&core->i2c_client,
3293 buffer[i],2))
3294 warn_printk(core, "Unable to enable "
3295 "tuner(%i).\n", i);
3297 break;
3298 case CX88_BOARD_MSI_TVANYWHERE_MASTER:
3300 struct v4l2_priv_tun_config tea5767_cfg;
3301 struct tea5767_ctrl ctl;
3303 memset(&ctl, 0, sizeof(ctl));
3305 ctl.high_cut = 1;
3306 ctl.st_noise = 1;
3307 ctl.deemph_75 = 1;
3308 ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
3310 tea5767_cfg.tuner = TUNER_TEA5767;
3311 tea5767_cfg.priv = &ctl;
3313 call_all(core, tuner, s_config, &tea5767_cfg);
3314 break;
3316 case CX88_BOARD_TEVII_S420:
3317 case CX88_BOARD_TEVII_S460:
3318 case CX88_BOARD_TEVII_S464:
3319 case CX88_BOARD_OMICOM_SS4_PCI:
3320 case CX88_BOARD_TBS_8910:
3321 case CX88_BOARD_TBS_8920:
3322 case CX88_BOARD_PROF_6200:
3323 case CX88_BOARD_PROF_7300:
3324 case CX88_BOARD_PROF_7301:
3325 case CX88_BOARD_SATTRADE_ST4200:
3326 cx_write(MO_GP0_IO, 0x8000);
3327 msleep(100);
3328 cx_write(MO_SRST_IO, 0);
3329 msleep(10);
3330 cx_write(MO_GP0_IO, 0x8080);
3331 msleep(100);
3332 cx_write(MO_SRST_IO, 1);
3333 msleep(100);
3334 break;
3335 } /*end switch() */
3338 /* Setup tuners */
3339 if ((core->board.radio_type != UNSET)) {
3340 tun_setup.mode_mask = T_RADIO;
3341 tun_setup.type = core->board.radio_type;
3342 tun_setup.addr = core->board.radio_addr;
3343 tun_setup.tuner_callback = cx88_tuner_callback;
3344 call_all(core, tuner, s_type_addr, &tun_setup);
3345 mode_mask &= ~T_RADIO;
3348 if (core->board.tuner_type != TUNER_ABSENT) {
3349 tun_setup.mode_mask = mode_mask;
3350 tun_setup.type = core->board.tuner_type;
3351 tun_setup.addr = core->board.tuner_addr;
3352 tun_setup.tuner_callback = cx88_tuner_callback;
3354 call_all(core, tuner, s_type_addr, &tun_setup);
3357 if (core->board.tda9887_conf) {
3358 struct v4l2_priv_tun_config tda9887_cfg;
3360 tda9887_cfg.tuner = TUNER_TDA9887;
3361 tda9887_cfg.priv = &core->board.tda9887_conf;
3363 call_all(core, tuner, s_config, &tda9887_cfg);
3366 if (core->board.tuner_type == TUNER_XC2028) {
3367 struct v4l2_priv_tun_config xc2028_cfg;
3368 struct xc2028_ctrl ctl;
3370 /* Fills device-dependent initialization parameters */
3371 cx88_setup_xc3028(core, &ctl);
3373 /* Sends parameters to xc2028/3028 tuner */
3374 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
3375 xc2028_cfg.tuner = TUNER_XC2028;
3376 xc2028_cfg.priv = &ctl;
3377 info_printk(core, "Asking xc2028/3028 to load firmware %s\n",
3378 ctl.fname);
3379 call_all(core, tuner, s_config, &xc2028_cfg);
3381 call_all(core, core, s_power, 0);
3384 /* ------------------------------------------------------------------ */
3386 static int cx88_pci_quirks(const char *name, struct pci_dev *pci)
3388 unsigned int lat = UNSET;
3389 u8 ctrl = 0;
3390 u8 value;
3392 /* check pci quirks */
3393 if (pci_pci_problems & PCIPCI_TRITON) {
3394 printk(KERN_INFO "%s: quirk: PCIPCI_TRITON -- set TBFX\n",
3395 name);
3396 ctrl |= CX88X_EN_TBFX;
3398 if (pci_pci_problems & PCIPCI_NATOMA) {
3399 printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA -- set TBFX\n",
3400 name);
3401 ctrl |= CX88X_EN_TBFX;
3403 if (pci_pci_problems & PCIPCI_VIAETBF) {
3404 printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF -- set TBFX\n",
3405 name);
3406 ctrl |= CX88X_EN_TBFX;
3408 if (pci_pci_problems & PCIPCI_VSFX) {
3409 printk(KERN_INFO "%s: quirk: PCIPCI_VSFX -- set VSFX\n",
3410 name);
3411 ctrl |= CX88X_EN_VSFX;
3413 #ifdef PCIPCI_ALIMAGIK
3414 if (pci_pci_problems & PCIPCI_ALIMAGIK) {
3415 printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",
3416 name);
3417 lat = 0x0A;
3419 #endif
3421 /* check insmod options */
3422 if (UNSET != latency)
3423 lat = latency;
3425 /* apply stuff */
3426 if (ctrl) {
3427 pci_read_config_byte(pci, CX88X_DEVCTRL, &value);
3428 value |= ctrl;
3429 pci_write_config_byte(pci, CX88X_DEVCTRL, value);
3431 if (UNSET != lat) {
3432 printk(KERN_INFO "%s: setting pci latency timer to %d\n",
3433 name, latency);
3434 pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);
3436 return 0;
3439 int cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)
3441 if (request_mem_region(pci_resource_start(pci,0),
3442 pci_resource_len(pci,0),
3443 core->name))
3444 return 0;
3445 printk(KERN_ERR
3446 "%s/%d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",
3447 core->name, PCI_FUNC(pci->devfn),
3448 (unsigned long long)pci_resource_start(pci, 0),
3449 pci->subsystem_vendor, pci->subsystem_device);
3450 return -EBUSY;
3453 /* Allocate and initialize the cx88 core struct. One should hold the
3454 * devlist mutex before calling this. */
3455 struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
3457 struct cx88_core *core;
3458 int i;
3460 core = kzalloc(sizeof(*core), GFP_KERNEL);
3461 if (core == NULL)
3462 return NULL;
3464 atomic_inc(&core->refcount);
3465 core->pci_bus = pci->bus->number;
3466 core->pci_slot = PCI_SLOT(pci->devfn);
3467 core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |
3468 PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |
3469 PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;
3470 mutex_init(&core->lock);
3472 core->nr = nr;
3473 sprintf(core->name, "cx88[%d]", core->nr);
3475 strcpy(core->v4l2_dev.name, core->name);
3476 if (v4l2_device_register(NULL, &core->v4l2_dev)) {
3477 kfree(core);
3478 return NULL;
3481 if (0 != cx88_get_resources(core, pci)) {
3482 v4l2_device_unregister(&core->v4l2_dev);
3483 kfree(core);
3484 return NULL;
3487 /* PCI stuff */
3488 cx88_pci_quirks(core->name, pci);
3489 core->lmmio = ioremap(pci_resource_start(pci, 0),
3490 pci_resource_len(pci, 0));
3491 core->bmmio = (u8 __iomem *)core->lmmio;
3493 if (core->lmmio == NULL) {
3494 kfree(core);
3495 return NULL;
3498 /* board config */
3499 core->boardnr = UNSET;
3500 if (card[core->nr] < ARRAY_SIZE(cx88_boards))
3501 core->boardnr = card[core->nr];
3502 for (i = 0; UNSET == core->boardnr && i < ARRAY_SIZE(cx88_subids); i++)
3503 if (pci->subsystem_vendor == cx88_subids[i].subvendor &&
3504 pci->subsystem_device == cx88_subids[i].subdevice)
3505 core->boardnr = cx88_subids[i].card;
3506 if (UNSET == core->boardnr) {
3507 core->boardnr = CX88_BOARD_UNKNOWN;
3508 cx88_card_list(core, pci);
3511 memcpy(&core->board, &cx88_boards[core->boardnr], sizeof(core->board));
3513 if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
3514 core->board.num_frontends = 1;
3516 info_printk(core, "subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
3517 pci->subsystem_vendor, pci->subsystem_device, core->board.name,
3518 core->boardnr, card[core->nr] == core->boardnr ?
3519 "insmod option" : "autodetected",
3520 core->board.num_frontends);
3522 if (tuner[core->nr] != UNSET)
3523 core->board.tuner_type = tuner[core->nr];
3524 if (radio[core->nr] != UNSET)
3525 core->board.radio_type = radio[core->nr];
3527 info_printk(core, "TV tuner type %d, Radio tuner type %d\n",
3528 core->board.tuner_type, core->board.radio_type);
3530 /* init hardware */
3531 cx88_reset(core);
3532 cx88_card_setup_pre_i2c(core);
3533 cx88_i2c_init(core, pci);
3535 /* load tuner module, if needed */
3536 if (TUNER_ABSENT != core->board.tuner_type) {
3537 /* Ignore 0x6b and 0x6f on cx88 boards.
3538 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
3539 * and an RTC at 0x6f which can get corrupted if probed. */
3540 static const unsigned short tv_addrs[] = {
3541 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
3542 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
3543 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,
3544 I2C_CLIENT_END
3546 int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);
3548 /* I don't trust the radio_type as is stored in the card
3549 definitions, so we just probe for it.
3550 The radio_type is sometimes missing, or set to UNSET but
3551 later code configures a tea5767.
3553 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
3554 "tuner", 0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));
3555 if (has_demod)
3556 v4l2_i2c_new_subdev(&core->v4l2_dev,
3557 &core->i2c_adap, "tuner",
3558 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
3559 if (core->board.tuner_addr == ADDR_UNSET) {
3560 v4l2_i2c_new_subdev(&core->v4l2_dev,
3561 &core->i2c_adap, "tuner",
3562 0, has_demod ? tv_addrs + 4 : tv_addrs);
3563 } else {
3564 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
3565 "tuner", core->board.tuner_addr, NULL);
3569 cx88_card_setup(core);
3570 if (!disable_ir) {
3571 cx88_i2c_init_ir(core);
3572 cx88_ir_init(core, pci);
3575 return core;