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