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