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