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