blob: d844f2aaa01d1597c34da2fa17d8251177420796 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 *
3 * device driver for Conexant 2388x based TV cards
4 * card-specific stuff.
5 *
6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/module.h>
25#include <linux/pci.h>
26#include <linux/delay.h>
27
28#include "cx88.h"
Mauro Carvalho Chehab55c88612007-10-19 06:59:33 -030029#include "tea5767.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070030
Trent Piephobbc83592007-08-15 14:41:58 -030031static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
32static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
33static unsigned int card[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
34
35module_param_array(tuner, int, NULL, 0444);
36module_param_array(radio, int, NULL, 0444);
37module_param_array(card, int, NULL, 0444);
38
39MODULE_PARM_DESC(tuner,"tuner type");
40MODULE_PARM_DESC(radio,"radio tuner type");
41MODULE_PARM_DESC(card,"card type");
42
43static unsigned int latency = UNSET;
44module_param(latency,int,0444);
45MODULE_PARM_DESC(latency,"pci latency timer");
46
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -030047#define info_printk(core, fmt, arg...) \
48 printk(KERN_INFO "%s: " fmt, core->name , ## arg)
49
50#define warn_printk(core, fmt, arg...) \
51 printk(KERN_WARNING "%s: " fmt, core->name , ## arg)
52
53#define err_printk(core, fmt, arg...) \
54 printk(KERN_ERR "%s: " fmt, core->name , ## arg)
55
56
Linus Torvalds1da177e2005-04-16 15:20:36 -070057/* ------------------------------------------------------------------ */
58/* board config info */
59
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -030060/* If radio_type !=UNSET, radio_addr should be specified
61 */
62
Trent Piephobbc83592007-08-15 14:41:58 -030063static const struct cx88_board cx88_boards[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070064 [CX88_BOARD_UNKNOWN] = {
65 .name = "UNKNOWN/GENERIC",
66 .tuner_type = UNSET,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -070067 .radio_type = UNSET,
68 .tuner_addr = ADDR_UNSET,
69 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -070070 .input = {{
71 .type = CX88_VMUX_COMPOSITE1,
72 .vmux = 0,
73 },{
74 .type = CX88_VMUX_COMPOSITE2,
75 .vmux = 1,
76 },{
77 .type = CX88_VMUX_COMPOSITE3,
78 .vmux = 2,
79 },{
80 .type = CX88_VMUX_COMPOSITE4,
81 .vmux = 3,
82 }},
83 },
84 [CX88_BOARD_HAUPPAUGE] = {
85 .name = "Hauppauge WinTV 34xxx models",
86 .tuner_type = UNSET,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -070087 .radio_type = UNSET,
88 .tuner_addr = ADDR_UNSET,
89 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -070090 .tda9887_conf = TDA9887_PRESENT,
91 .input = {{
92 .type = CX88_VMUX_TELEVISION,
93 .vmux = 0,
94 .gpio0 = 0xff00, // internal decoder
95 },{
96 .type = CX88_VMUX_DEBUG,
97 .vmux = 0,
98 .gpio0 = 0xff01, // mono from tuner chip
99 },{
100 .type = CX88_VMUX_COMPOSITE1,
101 .vmux = 1,
102 .gpio0 = 0xff02,
103 },{
104 .type = CX88_VMUX_SVIDEO,
105 .vmux = 2,
106 .gpio0 = 0xff02,
107 }},
108 .radio = {
109 .type = CX88_RADIO,
110 .gpio0 = 0xff01,
111 },
112 },
113 [CX88_BOARD_GDI] = {
114 .name = "GDI Black Gold",
115 .tuner_type = UNSET,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700116 .radio_type = UNSET,
117 .tuner_addr = ADDR_UNSET,
118 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700119 .input = {{
120 .type = CX88_VMUX_TELEVISION,
121 .vmux = 0,
Mauro Carvalho Chehabfd3113e2005-07-31 22:34:43 -0700122 },{
123 .type = CX88_VMUX_SVIDEO,
124 .vmux = 2,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700125 }},
126 },
127 [CX88_BOARD_PIXELVIEW] = {
128 .name = "PixelView",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700129 .tuner_type = TUNER_PHILIPS_PAL,
130 .radio_type = UNSET,
131 .tuner_addr = ADDR_UNSET,
132 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700133 .input = {{
134 .type = CX88_VMUX_TELEVISION,
135 .vmux = 0,
136 .gpio0 = 0xff00, // internal decoder
137 },{
138 .type = CX88_VMUX_COMPOSITE1,
139 .vmux = 1,
140 },{
141 .type = CX88_VMUX_SVIDEO,
142 .vmux = 2,
143 }},
144 .radio = {
145 .type = CX88_RADIO,
146 .gpio0 = 0xff10,
Michael Krufky47ee2f32006-06-06 15:51:38 -0300147 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148 },
149 [CX88_BOARD_ATI_WONDER_PRO] = {
150 .name = "ATI TV Wonder Pro",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700151 .tuner_type = TUNER_PHILIPS_4IN1,
152 .radio_type = UNSET,
153 .tuner_addr = ADDR_UNSET,
154 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700155 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER,
156 .input = {{
157 .type = CX88_VMUX_TELEVISION,
158 .vmux = 0,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800159 .gpio0 = 0x03ff,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160 },{
161 .type = CX88_VMUX_COMPOSITE1,
162 .vmux = 1,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800163 .gpio0 = 0x03fe,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700164 },{
165 .type = CX88_VMUX_SVIDEO,
166 .vmux = 2,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800167 .gpio0 = 0x03fe,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700168 }},
169 },
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800170 [CX88_BOARD_WINFAST2000XP_EXPERT] = {
171 .name = "Leadtek Winfast 2000XP Expert",
172 .tuner_type = TUNER_PHILIPS_4IN1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700173 .radio_type = UNSET,
174 .tuner_addr = ADDR_UNSET,
175 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700176 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800177 .input = {{
178 .type = CX88_VMUX_TELEVISION,
179 .vmux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700180 .gpio0 = 0x00F5e700,
181 .gpio1 = 0x00003004,
182 .gpio2 = 0x00F5e700,
183 .gpio3 = 0x02000000,
184 },{
185 .type = CX88_VMUX_COMPOSITE1,
186 .vmux = 1,
187 .gpio0 = 0x00F5c700,
188 .gpio1 = 0x00003004,
189 .gpio2 = 0x00F5c700,
190 .gpio3 = 0x02000000,
191 },{
192 .type = CX88_VMUX_SVIDEO,
193 .vmux = 2,
194 .gpio0 = 0x00F5c700,
195 .gpio1 = 0x00003004,
196 .gpio2 = 0x00F5c700,
197 .gpio3 = 0x02000000,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800198 }},
199 .radio = {
200 .type = CX88_RADIO,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700201 .gpio0 = 0x00F5d700,
202 .gpio1 = 0x00003004,
203 .gpio2 = 0x00F5d700,
204 .gpio3 = 0x02000000,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800205 },
206 },
Lubomir Bulej7418f342005-11-08 21:38:34 -0800207 [CX88_BOARD_AVERTV_STUDIO_303] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700208 .name = "AverTV Studio 303 (M126)",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700209 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
210 .radio_type = UNSET,
211 .tuner_addr = ADDR_UNSET,
212 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700213 .tda9887_conf = TDA9887_PRESENT,
214 .input = {{
215 .type = CX88_VMUX_TELEVISION,
216 .vmux = 0,
Marcin Rudowski4aca4832006-03-09 16:09:51 -0300217 .gpio1 = 0xe09f,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700218 },{
219 .type = CX88_VMUX_COMPOSITE1,
220 .vmux = 1,
Marcin Rudowski4aca4832006-03-09 16:09:51 -0300221 .gpio1 = 0xe05f,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700222 },{
223 .type = CX88_VMUX_SVIDEO,
224 .vmux = 2,
Marcin Rudowski4aca4832006-03-09 16:09:51 -0300225 .gpio1 = 0xe05f,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700226 }},
227 .radio = {
Marcin Rudowski4aca4832006-03-09 16:09:51 -0300228 .gpio1 = 0xe0df,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700229 .type = CX88_RADIO,
230 },
231 },
232 [CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
233 // added gpio values thanks to Michal
234 // values for PAL from DScaler
235 .name = "MSI TV-@nywhere Master",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700236 .tuner_type = TUNER_MT2032,
237 .radio_type = UNSET,
238 .tuner_addr = ADDR_UNSET,
239 .radio_addr = ADDR_UNSET,
Nickolay V. Shmyrev3ae1adc2005-11-08 21:37:39 -0800240 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700241 .input = {{
242 .type = CX88_VMUX_TELEVISION,
243 .vmux = 0,
244 .gpio0 = 0x000040bf,
245 .gpio1 = 0x000080c0,
246 .gpio2 = 0x0000ff40,
247 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800248 .type = CX88_VMUX_COMPOSITE1,
249 .vmux = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700250 .gpio0 = 0x000040bf,
251 .gpio1 = 0x000080c0,
252 .gpio2 = 0x0000ff40,
253 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800254 .type = CX88_VMUX_SVIDEO,
255 .vmux = 2,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 .gpio0 = 0x000040bf,
257 .gpio1 = 0x000080c0,
258 .gpio2 = 0x0000ff40,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800259 }},
260 .radio = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261 .type = CX88_RADIO,
Mauro Carvalho Chehab55c88612007-10-19 06:59:33 -0300262 .vmux = 3,
263 .gpio0 = 0x000040bf,
264 .gpio1 = 0x000080c0,
265 .gpio2 = 0x0000ff20,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800266 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700267 },
268 [CX88_BOARD_WINFAST_DV2000] = {
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800269 .name = "Leadtek Winfast DV2000",
270 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700271 .radio_type = UNSET,
272 .tuner_addr = ADDR_UNSET,
273 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700274 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800275 .input = {{
276 .type = CX88_VMUX_TELEVISION,
277 .vmux = 0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700278 .gpio0 = 0x0035e700,
279 .gpio1 = 0x00003004,
280 .gpio2 = 0x0035e700,
281 .gpio3 = 0x02000000,
282 },{
283
284 .type = CX88_VMUX_COMPOSITE1,
285 .vmux = 1,
286 .gpio0 = 0x0035c700,
287 .gpio1 = 0x00003004,
288 .gpio2 = 0x0035c700,
289 .gpio3 = 0x02000000,
290 },{
291 .type = CX88_VMUX_SVIDEO,
292 .vmux = 2,
293 .gpio0 = 0x0035c700,
294 .gpio1 = 0x0035c700,
295 .gpio2 = 0x02000000,
296 .gpio3 = 0x02000000,
297 }},
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800298 .radio = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700299 .type = CX88_RADIO,
300 .gpio0 = 0x0035d700,
301 .gpio1 = 0x00007004,
302 .gpio2 = 0x0035d700,
303 .gpio3 = 0x02000000,
Michael Krufky47ee2f32006-06-06 15:51:38 -0300304 },
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800305 },
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700306 [CX88_BOARD_LEADTEK_PVR2000] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700307 // gpio values for PAL version from regspy by DScaler
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700308 .name = "Leadtek PVR 2000",
309 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
310 .radio_type = UNSET,
311 .tuner_addr = ADDR_UNSET,
312 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700313 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700314 .input = {{
315 .type = CX88_VMUX_TELEVISION,
316 .vmux = 0,
317 .gpio0 = 0x0000bde2,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300318 .audioroute = 1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700319 },{
320 .type = CX88_VMUX_COMPOSITE1,
321 .vmux = 1,
322 .gpio0 = 0x0000bde6,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300323 .audioroute = 1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700324 },{
325 .type = CX88_VMUX_SVIDEO,
326 .vmux = 2,
327 .gpio0 = 0x0000bde6,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300328 .audioroute = 1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700329 }},
330 .radio = {
331 .type = CX88_RADIO,
332 .gpio0 = 0x0000bd62,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300333 .audioroute = 1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700334 },
Michael Krufky48d5e802006-09-25 14:09:10 -0300335 .mpeg = CX88_MPEG_BLACKBIRD,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700336 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700337 [CX88_BOARD_IODATA_GVVCP3PCI] = {
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800338 .name = "IODATA GV-VCP3/PCI",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700339 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800340 .radio_type = UNSET,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700341 .tuner_addr = ADDR_UNSET,
342 .radio_addr = ADDR_UNSET,
343 .input = {{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800344 .type = CX88_VMUX_COMPOSITE1,
345 .vmux = 0,
346 },{
347 .type = CX88_VMUX_COMPOSITE2,
348 .vmux = 1,
349 },{
350 .type = CX88_VMUX_SVIDEO,
351 .vmux = 2,
352 }},
353 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700354 [CX88_BOARD_PROLINK_PLAYTVPVR] = {
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800355 .name = "Prolink PlayTV PVR",
356 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700357 .radio_type = UNSET,
358 .tuner_addr = ADDR_UNSET,
359 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700360 .tda9887_conf = TDA9887_PRESENT,
361 .input = {{
362 .type = CX88_VMUX_TELEVISION,
363 .vmux = 0,
Michael Krufkyfc34f162006-03-13 03:41:44 -0300364 .gpio0 = 0xbff0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700365 },{
366 .type = CX88_VMUX_COMPOSITE1,
367 .vmux = 1,
Michael Krufkyfc34f162006-03-13 03:41:44 -0300368 .gpio0 = 0xbff3,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700369 },{
370 .type = CX88_VMUX_SVIDEO,
371 .vmux = 2,
Michael Krufkyfc34f162006-03-13 03:41:44 -0300372 .gpio0 = 0xbff3,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 }},
374 .radio = {
375 .type = CX88_RADIO,
Michael Krufkyfc34f162006-03-13 03:41:44 -0300376 .gpio0 = 0xbff0,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700377 },
378 },
379 [CX88_BOARD_ASUS_PVR_416] = {
380 .name = "ASUS PVR-416",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700381 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
382 .radio_type = UNSET,
383 .tuner_addr = ADDR_UNSET,
384 .radio_addr = ADDR_UNSET,
385 .tda9887_conf = TDA9887_PRESENT,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700386 .input = {{
387 .type = CX88_VMUX_TELEVISION,
388 .vmux = 0,
389 .gpio0 = 0x0000fde6,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800390 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700391 .type = CX88_VMUX_SVIDEO,
392 .vmux = 2,
393 .gpio0 = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300394 .audioroute = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700395 }},
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800396 .radio = {
397 .type = CX88_RADIO,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700398 .gpio0 = 0x0000fde2,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800399 },
Michael Krufky48d5e802006-09-25 14:09:10 -0300400 .mpeg = CX88_MPEG_BLACKBIRD,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700401 },
402 [CX88_BOARD_MSI_TVANYWHERE] = {
403 .name = "MSI TV-@nywhere",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700404 .tuner_type = TUNER_MT2032,
405 .radio_type = UNSET,
406 .tuner_addr = ADDR_UNSET,
407 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700408 .tda9887_conf = TDA9887_PRESENT,
409 .input = {{
410 .type = CX88_VMUX_TELEVISION,
411 .vmux = 0,
412 .gpio0 = 0x00000fbf,
413 .gpio2 = 0x0000fc08,
414 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800415 .type = CX88_VMUX_COMPOSITE1,
416 .vmux = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700417 .gpio0 = 0x00000fbf,
418 .gpio2 = 0x0000fc68,
419 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800420 .type = CX88_VMUX_SVIDEO,
421 .vmux = 2,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700422 .gpio0 = 0x00000fbf,
423 .gpio2 = 0x0000fc68,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800424 }},
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425 },
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800426 [CX88_BOARD_KWORLD_DVB_T] = {
427 .name = "KWorld/VStream XPert DVB-T",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700428 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700429 .radio_type = UNSET,
430 .tuner_addr = ADDR_UNSET,
431 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800432 .input = {{
433 .type = CX88_VMUX_COMPOSITE1,
434 .vmux = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700435 .gpio0 = 0x0700,
436 .gpio2 = 0x0101,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800437 },{
438 .type = CX88_VMUX_SVIDEO,
439 .vmux = 2,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700440 .gpio0 = 0x0700,
441 .gpio2 = 0x0101,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800442 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300443 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700444 },
445 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700446 .name = "DViCO FusionHDTV DVB-T1",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700447 .tuner_type = TUNER_ABSENT, /* No analog tuner */
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700448 .radio_type = UNSET,
449 .tuner_addr = ADDR_UNSET,
450 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 .input = {{
452 .type = CX88_VMUX_COMPOSITE1,
453 .vmux = 1,
454 .gpio0 = 0x000027df,
Michael Krufky47ee2f32006-06-06 15:51:38 -0300455 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700456 .type = CX88_VMUX_SVIDEO,
457 .vmux = 2,
458 .gpio0 = 0x000027df,
459 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300460 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700461 },
462 [CX88_BOARD_KWORLD_LTV883] = {
463 .name = "KWorld LTV883RF",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700464 .tuner_type = TUNER_TNF_8831BGFF,
465 .radio_type = UNSET,
466 .tuner_addr = ADDR_UNSET,
467 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800468 .input = {{
469 .type = CX88_VMUX_TELEVISION,
470 .vmux = 0,
471 .gpio0 = 0x07f8,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700472 },{
473 .type = CX88_VMUX_DEBUG,
474 .vmux = 0,
475 .gpio0 = 0x07f9, // mono from tuner chip
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800476 },{
477 .type = CX88_VMUX_COMPOSITE1,
478 .vmux = 1,
479 .gpio0 = 0x000007fa,
480 },{
481 .type = CX88_VMUX_SVIDEO,
482 .vmux = 2,
483 .gpio0 = 0x000007fa,
484 }},
485 .radio = {
486 .type = CX88_RADIO,
487 .gpio0 = 0x000007f8,
488 },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700489 },
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700490 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
491 .name = "DViCO FusionHDTV 3 Gold-Q",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492 .tuner_type = TUNER_MICROTUNE_4042FI5,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700493 .radio_type = UNSET,
494 .tuner_addr = ADDR_UNSET,
495 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496 /*
497 GPIO[0] resets DT3302 DTV receiver
498 0 - reset asserted
499 1 - normal operation
500 GPIO[1] mutes analog audio output connector
501 0 - enable selected source
502 1 - mute
503 GPIO[2] selects source for analog audio output connector
504 0 - analog audio input connector on tab
505 1 - analog DAC output from CX23881 chip
506 GPIO[3] selects RF input connector on tuner module
507 0 - RF connector labeled CABLE
508 1 - RF connector labeled ANT
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700509 GPIO[4] selects high RF for QAM256 mode
510 0 - normal RF
511 1 - high RF
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512 */
513 .input = {{
514 .type = CX88_VMUX_TELEVISION,
515 .vmux = 0,
516 .gpio0 = 0x0f0d,
517 },{
518 .type = CX88_VMUX_CABLE,
519 .vmux = 0,
520 .gpio0 = 0x0f05,
521 },{
522 .type = CX88_VMUX_COMPOSITE1,
523 .vmux = 1,
524 .gpio0 = 0x0f00,
525 },{
526 .type = CX88_VMUX_SVIDEO,
527 .vmux = 2,
528 .gpio0 = 0x0f00,
529 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300530 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700531 },
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800532 [CX88_BOARD_HAUPPAUGE_DVB_T1] = {
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700533 .name = "Hauppauge Nova-T DVB-T",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700535 .radio_type = UNSET,
536 .tuner_addr = ADDR_UNSET,
537 .radio_addr = ADDR_UNSET,
538 .input = {{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800539 .type = CX88_VMUX_DVB,
540 .vmux = 0,
541 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300542 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700543 },
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800544 [CX88_BOARD_CONEXANT_DVB_T1] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545 .name = "Conexant DVB-T reference design",
546 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700547 .radio_type = UNSET,
548 .tuner_addr = ADDR_UNSET,
549 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800550 .input = {{
551 .type = CX88_VMUX_DVB,
552 .vmux = 0,
553 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300554 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555 },
556 [CX88_BOARD_PROVIDEO_PV259] = {
557 .name = "Provideo PV259",
558 .tuner_type = TUNER_PHILIPS_FQ1216ME,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700559 .radio_type = UNSET,
560 .tuner_addr = ADDR_UNSET,
561 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700562 .input = {{
563 .type = CX88_VMUX_TELEVISION,
564 .vmux = 0,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300565 .audioroute = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700566 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300567 .mpeg = CX88_MPEG_BLACKBIRD,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700568 },
569 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700570 .name = "DViCO FusionHDTV DVB-T Plus",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571 .tuner_type = TUNER_ABSENT, /* No analog tuner */
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700572 .radio_type = UNSET,
573 .tuner_addr = ADDR_UNSET,
574 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 .input = {{
576 .type = CX88_VMUX_COMPOSITE1,
577 .vmux = 1,
578 .gpio0 = 0x000027df,
Michael Krufky47ee2f32006-06-06 15:51:38 -0300579 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580 .type = CX88_VMUX_SVIDEO,
581 .vmux = 2,
582 .gpio0 = 0x000027df,
583 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300584 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700585 },
586 [CX88_BOARD_DNTV_LIVE_DVB_T] = {
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800587 .name = "digitalnow DNTV Live! DVB-T",
Linus Torvalds1da177e2005-04-16 15:20:36 -0700588 .tuner_type = TUNER_ABSENT,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700589 .radio_type = UNSET,
590 .tuner_addr = ADDR_UNSET,
591 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800592 .input = {{
Linus Torvalds1da177e2005-04-16 15:20:36 -0700593 .type = CX88_VMUX_COMPOSITE1,
594 .vmux = 1,
595 .gpio0 = 0x00000700,
596 .gpio2 = 0x00000101,
597 },{
598 .type = CX88_VMUX_SVIDEO,
599 .vmux = 2,
600 .gpio0 = 0x00000700,
601 .gpio2 = 0x00000101,
602 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300603 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700604 },
605 [CX88_BOARD_PCHDTV_HD3000] = {
606 .name = "pcHDTV HD3000 HDTV",
Trent Piepho9175b852006-04-10 09:40:37 -0300607 .tuner_type = TUNER_THOMSON_DTT761X,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700608 .radio_type = UNSET,
609 .tuner_addr = ADDR_UNSET,
610 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehabe4f5c82a2005-12-04 12:41:54 -0200611 .tda9887_conf = TDA9887_PRESENT,
Trent Piepho19dc74b2007-07-31 23:06:50 -0300612 /* GPIO[2] = audio source for analog audio out connector
613 * 0 = analog audio input connector
614 * 1 = CX88 audio DACs
615 *
616 * GPIO[7] = input to CX88's audio/chroma ADC
617 * 0 = FM 10.7 MHz IF
618 * 1 = Sound 4.5 MHz IF
619 *
620 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
621 *
622 * GPIO[16] = Remote control input
623 */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624 .input = {{
625 .type = CX88_VMUX_TELEVISION,
626 .vmux = 0,
627 .gpio0 = 0x00008484,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628 },{
629 .type = CX88_VMUX_COMPOSITE1,
630 .vmux = 1,
631 .gpio0 = 0x00008400,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700632 },{
633 .type = CX88_VMUX_SVIDEO,
634 .vmux = 2,
635 .gpio0 = 0x00008400,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700636 }},
637 .radio = {
638 .type = CX88_RADIO,
Trent Piepho19dc74b2007-07-31 23:06:50 -0300639 .gpio0 = 0x00008404,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 },
Michael Krufky48d5e802006-09-25 14:09:10 -0300641 .mpeg = CX88_MPEG_DVB,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700642 },
643 [CX88_BOARD_HAUPPAUGE_ROSLYN] = {
644 // entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
645 // GPIO values obtained from regspy, courtesy Sean Covel
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700646 .name = "Hauppauge WinTV 28xxx (Roslyn) models",
647 .tuner_type = UNSET,
648 .radio_type = UNSET,
649 .tuner_addr = ADDR_UNSET,
650 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651 .input = {{
652 .type = CX88_VMUX_TELEVISION,
653 .vmux = 0,
Steven Toth0345c382006-01-09 15:25:17 -0200654 .gpio0 = 0xed1a,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700655 .gpio2 = 0x00ff,
656 },{
657 .type = CX88_VMUX_DEBUG,
658 .vmux = 0,
Steven Toth0345c382006-01-09 15:25:17 -0200659 .gpio0 = 0xff01,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660 },{
661 .type = CX88_VMUX_COMPOSITE1,
662 .vmux = 1,
663 .gpio0 = 0xff02,
664 },{
665 .type = CX88_VMUX_SVIDEO,
666 .vmux = 2,
667 .gpio0 = 0xed92,
668 .gpio2 = 0x00ff,
669 }},
670 .radio = {
671 .type = CX88_RADIO,
672 .gpio0 = 0xed96,
673 .gpio2 = 0x00ff,
674 },
Michael Krufky48d5e802006-09-25 14:09:10 -0300675 .mpeg = CX88_MPEG_BLACKBIRD,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676 },
677 [CX88_BOARD_DIGITALLOGIC_MEC] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 .name = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700679 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
680 .radio_type = UNSET,
681 .tuner_addr = ADDR_UNSET,
682 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700683 .tda9887_conf = TDA9887_PRESENT,
684 .input = {{
685 .type = CX88_VMUX_TELEVISION,
686 .vmux = 0,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700687 .gpio0 = 0x00009d80,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300688 .audioroute = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 },{
690 .type = CX88_VMUX_COMPOSITE1,
691 .vmux = 1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700692 .gpio0 = 0x00009d76,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300693 .audioroute = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700694 },{
695 .type = CX88_VMUX_SVIDEO,
696 .vmux = 2,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700697 .gpio0 = 0x00009d76,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300698 .audioroute = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700699 }},
700 .radio = {
701 .type = CX88_RADIO,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700702 .gpio0 = 0x00009d00,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300703 .audioroute = 1,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704 },
Michael Krufky48d5e802006-09-25 14:09:10 -0300705 .mpeg = CX88_MPEG_BLACKBIRD,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700706 },
707 [CX88_BOARD_IODATA_GVBCTV7E] = {
708 .name = "IODATA GV/BCTV7E",
709 .tuner_type = TUNER_PHILIPS_FQ1286,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700710 .radio_type = UNSET,
711 .tuner_addr = ADDR_UNSET,
712 .radio_addr = ADDR_UNSET,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700713 .tda9887_conf = TDA9887_PRESENT,
714 .input = {{
715 .type = CX88_VMUX_TELEVISION,
716 .vmux = 1,
717 .gpio1 = 0x0000e03f,
718 },{
719 .type = CX88_VMUX_COMPOSITE1,
720 .vmux = 2,
721 .gpio1 = 0x0000e07f,
722 },{
723 .type = CX88_VMUX_SVIDEO,
724 .vmux = 3,
725 .gpio1 = 0x0000e07f,
726 }}
727 },
Manuel Capinha239df2e2005-06-23 22:04:53 -0700728 [CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
729 .name = "PixelView PlayTV Ultra Pro (Stereo)",
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700730 /* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
731 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
Mauro Carvalho Chehabc5287ba2005-07-15 03:56:28 -0700732 .radio_type = UNSET,
733 .tuner_addr = ADDR_UNSET,
734 .radio_addr = ADDR_UNSET,
Hans Verkuilb8341e12009-03-29 08:26:01 -0300735 /* Some variants use a tda9874 and so need the tvaudio module. */
736 .audio_chip = V4L2_IDENT_TVAUDIO,
Manuel Capinha239df2e2005-06-23 22:04:53 -0700737 .input = {{
738 .type = CX88_VMUX_TELEVISION,
739 .vmux = 0,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700740 .gpio0 = 0xbf61, /* internal decoder */
Manuel Capinha239df2e2005-06-23 22:04:53 -0700741 },{
742 .type = CX88_VMUX_COMPOSITE1,
743 .vmux = 1,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700744 .gpio0 = 0xbf63,
Manuel Capinha239df2e2005-06-23 22:04:53 -0700745 },{
746 .type = CX88_VMUX_SVIDEO,
747 .vmux = 2,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700748 .gpio0 = 0xbf63,
Manuel Capinha239df2e2005-06-23 22:04:53 -0700749 }},
750 .radio = {
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700751 .type = CX88_RADIO,
752 .gpio0 = 0xbf60,
753 },
Manuel Capinha239df2e2005-06-23 22:04:53 -0700754 },
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800755 [CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700756 .name = "DViCO FusionHDTV 3 Gold-T",
Michael Krufky83ac87222006-01-09 15:25:29 -0200757 .tuner_type = TUNER_THOMSON_DTT761X,
Mauro Carvalho Chehabb45009b2005-06-23 22:05:03 -0700758 .radio_type = UNSET,
759 .tuner_addr = ADDR_UNSET,
760 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehabe4f5c82a2005-12-04 12:41:54 -0200761 .tda9887_conf = TDA9887_PRESENT,
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700762 .input = {{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800763 .type = CX88_VMUX_TELEVISION,
764 .vmux = 0,
765 .gpio0 = 0x97ed,
766 },{
767 .type = CX88_VMUX_COMPOSITE1,
768 .vmux = 1,
769 .gpio0 = 0x97e9,
770 },{
771 .type = CX88_VMUX_SVIDEO,
772 .vmux = 2,
773 .gpio0 = 0x97e9,
774 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300775 .mpeg = CX88_MPEG_DVB,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800776 },
777 [CX88_BOARD_ADSTECH_DVB_T_PCI] = {
778 .name = "ADS Tech Instant TV DVB-T PCI",
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700779 .tuner_type = TUNER_ABSENT,
780 .radio_type = UNSET,
781 .tuner_addr = ADDR_UNSET,
782 .radio_addr = ADDR_UNSET,
783 .input = {{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800784 .type = CX88_VMUX_COMPOSITE1,
785 .vmux = 1,
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700786 .gpio0 = 0x0700,
787 .gpio2 = 0x0101,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800788 },{
789 .type = CX88_VMUX_SVIDEO,
790 .vmux = 2,
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700791 .gpio0 = 0x0700,
792 .gpio2 = 0x0101,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800793 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300794 .mpeg = CX88_MPEG_DVB,
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -0700795 },
Michael Krufkye057ee12005-07-07 17:58:40 -0700796 [CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
797 .name = "TerraTec Cinergy 1400 DVB-T",
798 .tuner_type = TUNER_ABSENT,
799 .input = {{
800 .type = CX88_VMUX_DVB,
801 .vmux = 0,
Heiko Baums05eda242007-01-21 05:58:19 -0300802 },{
803 .type = CX88_VMUX_COMPOSITE1,
804 .vmux = 2,
805 },{
806 .type = CX88_VMUX_SVIDEO,
807 .vmux = 2,
Michael Krufkye057ee12005-07-07 17:58:40 -0700808 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300809 .mpeg = CX88_MPEG_DVB,
Michael Krufkye057ee12005-07-07 17:58:40 -0700810 },
Michael Krufky9fef07c2005-07-31 22:34:46 -0700811 [CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
812 .name = "DViCO FusionHDTV 5 Gold",
Michael Krufky9c26c8b2006-04-27 01:29:17 -0300813 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
Michael Krufky9fef07c2005-07-31 22:34:46 -0700814 .radio_type = UNSET,
815 .tuner_addr = ADDR_UNSET,
816 .radio_addr = ADDR_UNSET,
Mauro Carvalho Chehabe52e98a2005-09-09 13:03:41 -0700817 .tda9887_conf = TDA9887_PRESENT,
Michael Krufky9fef07c2005-07-31 22:34:46 -0700818 .input = {{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800819 .type = CX88_VMUX_TELEVISION,
820 .vmux = 0,
821 .gpio0 = 0x87fd,
822 },{
823 .type = CX88_VMUX_COMPOSITE1,
824 .vmux = 1,
825 .gpio0 = 0x87f9,
826 },{
827 .type = CX88_VMUX_SVIDEO,
828 .vmux = 2,
829 .gpio0 = 0x87f9,
830 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300831 .mpeg = CX88_MPEG_DVB,
Michael Krufky9fef07c2005-07-31 22:34:46 -0700832 },
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800833 [CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
834 .name = "AverMedia UltraTV Media Center PCI 550",
835 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
836 .radio_type = UNSET,
837 .tuner_addr = ADDR_UNSET,
838 .radio_addr = ADDR_UNSET,
839 .tda9887_conf = TDA9887_PRESENT,
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800840 .input = {{
841 .type = CX88_VMUX_COMPOSITE1,
842 .vmux = 0,
843 .gpio0 = 0x0000cd73,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300844 .audioroute = 1,
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800845 },{
846 .type = CX88_VMUX_SVIDEO,
847 .vmux = 1,
848 .gpio0 = 0x0000cd73,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300849 .audioroute = 1,
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800850 },{
851 .type = CX88_VMUX_TELEVISION,
852 .vmux = 3,
853 .gpio0 = 0x0000cdb3,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300854 .audioroute = 1,
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800855 }},
856 .radio = {
857 .type = CX88_RADIO,
858 .vmux = 2,
859 .gpio0 = 0x0000cdf3,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -0300860 .audioroute = 1,
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800861 },
Michael Krufky5b26c822006-10-16 16:07:51 -0300862 .mpeg = CX88_MPEG_BLACKBIRD,
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -0800863 },
Alexander Wold0bcc37c2005-11-08 21:36:58 -0800864 [CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
865 /* Alexander Wold <awold@bigfoot.com> */
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800866 .name = "Kworld V-Stream Xpert DVD",
867 .tuner_type = UNSET,
868 .input = {{
869 .type = CX88_VMUX_COMPOSITE1,
870 .vmux = 1,
871 .gpio0 = 0x03000000,
Alexander Wold0bcc37c2005-11-08 21:36:58 -0800872 .gpio1 = 0x01000000,
873 .gpio2 = 0x02000000,
874 .gpio3 = 0x00100000,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -0800875 },{
876 .type = CX88_VMUX_SVIDEO,
877 .vmux = 2,
878 .gpio0 = 0x03000000,
879 .gpio1 = 0x01000000,
880 .gpio2 = 0x02000000,
881 .gpio3 = 0x00100000,
882 }},
Alexander Wold0bcc37c2005-11-08 21:36:58 -0800883 },
Kirk Lapraye976f9372005-11-08 21:37:04 -0800884 [CX88_BOARD_ATI_HDTVWONDER] = {
885 .name = "ATI HDTV Wonder",
886 .tuner_type = TUNER_PHILIPS_TUV1236D,
887 .radio_type = UNSET,
888 .tuner_addr = ADDR_UNSET,
889 .radio_addr = ADDR_UNSET,
890 .input = {{
891 .type = CX88_VMUX_TELEVISION,
892 .vmux = 0,
893 .gpio0 = 0x00000ff7,
894 .gpio1 = 0x000000ff,
895 .gpio2 = 0x00000001,
896 .gpio3 = 0x00000000,
897 },{
898 .type = CX88_VMUX_COMPOSITE1,
899 .vmux = 1,
900 .gpio0 = 0x00000ffe,
901 .gpio1 = 0x000000ff,
902 .gpio2 = 0x00000001,
903 .gpio3 = 0x00000000,
904 },{
905 .type = CX88_VMUX_SVIDEO,
906 .vmux = 2,
907 .gpio0 = 0x00000ffe,
908 .gpio1 = 0x000000ff,
909 .gpio2 = 0x00000001,
910 .gpio3 = 0x00000000,
911 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300912 .mpeg = CX88_MPEG_DVB,
Kirk Lapraye976f9372005-11-08 21:37:04 -0800913 },
David Shirley2b5200a72005-11-08 21:37:22 -0800914 [CX88_BOARD_WINFAST_DTV1000] = {
915 .name = "WinFast DTV1000-T",
916 .tuner_type = TUNER_ABSENT,
917 .radio_type = UNSET,
918 .tuner_addr = ADDR_UNSET,
919 .radio_addr = ADDR_UNSET,
920 .input = {{
921 .type = CX88_VMUX_DVB,
922 .vmux = 0,
Jean Delvaree8f4e752007-03-31 10:34:59 -0300923 },{
924 .type = CX88_VMUX_COMPOSITE1,
925 .vmux = 1,
926 },{
927 .type = CX88_VMUX_SVIDEO,
928 .vmux = 2,
David Shirley2b5200a72005-11-08 21:37:22 -0800929 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300930 .mpeg = CX88_MPEG_DVB,
David Shirley2b5200a72005-11-08 21:37:22 -0800931 },
Lubomir Bulej7418f342005-11-08 21:38:34 -0800932 [CX88_BOARD_AVERTV_303] = {
933 .name = "AVerTV 303 (M126)",
934 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
935 .radio_type = UNSET,
936 .tuner_addr = ADDR_UNSET,
937 .radio_addr = ADDR_UNSET,
938 .tda9887_conf = TDA9887_PRESENT,
939 .input = {{
940 .type = CX88_VMUX_TELEVISION,
941 .vmux = 0,
942 .gpio0 = 0x00ff,
943 .gpio1 = 0xe09f,
944 .gpio2 = 0x0010,
945 .gpio3 = 0x0000,
946 },{
947 .type = CX88_VMUX_COMPOSITE1,
948 .vmux = 1,
949 .gpio0 = 0x00ff,
950 .gpio1 = 0xe05f,
951 .gpio2 = 0x0010,
952 .gpio3 = 0x0000,
953 },{
954 .type = CX88_VMUX_SVIDEO,
955 .vmux = 2,
956 .gpio0 = 0x00ff,
957 .gpio1 = 0xe05f,
958 .gpio2 = 0x0010,
959 .gpio3 = 0x0000,
960 }},
961 },
Steven Toth0fa14aa2006-01-09 15:25:02 -0200962 [CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
963 .name = "Hauppauge Nova-S-Plus DVB-S",
964 .tuner_type = TUNER_ABSENT,
965 .radio_type = UNSET,
966 .tuner_addr = ADDR_UNSET,
967 .radio_addr = ADDR_UNSET,
Steven Toth0fa14aa2006-01-09 15:25:02 -0200968 .input = {{
969 .type = CX88_VMUX_DVB,
970 .vmux = 0,
971 },{
972 .type = CX88_VMUX_COMPOSITE1,
973 .vmux = 1,
974 },{
975 .type = CX88_VMUX_SVIDEO,
976 .vmux = 2,
977 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300978 .mpeg = CX88_MPEG_DVB,
Steven Toth0fa14aa2006-01-09 15:25:02 -0200979 },
980 [CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
981 .name = "Hauppauge Nova-SE2 DVB-S",
982 .tuner_type = TUNER_ABSENT,
983 .radio_type = UNSET,
984 .tuner_addr = ADDR_UNSET,
985 .radio_addr = ADDR_UNSET,
986 .input = {{
987 .type = CX88_VMUX_DVB,
988 .vmux = 0,
989 }},
Michael Krufky48d5e802006-09-25 14:09:10 -0300990 .mpeg = CX88_MPEG_DVB,
Steven Toth0fa14aa2006-01-09 15:25:02 -0200991 },
Vadim Catana0e0351e2006-01-09 15:25:02 -0200992 [CX88_BOARD_KWORLD_DVBS_100] = {
993 .name = "KWorld DVB-S 100",
994 .tuner_type = TUNER_ABSENT,
995 .radio_type = UNSET,
996 .tuner_addr = ADDR_UNSET,
997 .radio_addr = ADDR_UNSET,
998 .input = {{
999 .type = CX88_VMUX_DVB,
1000 .vmux = 0,
1001 },{
1002 .type = CX88_VMUX_COMPOSITE1,
1003 .vmux = 1,
1004 },{
1005 .type = CX88_VMUX_SVIDEO,
1006 .vmux = 2,
1007 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001008 .mpeg = CX88_MPEG_DVB,
Vadim Catana0e0351e2006-01-09 15:25:02 -02001009 },
Steven Toth611900c2006-01-09 15:25:12 -02001010 [CX88_BOARD_HAUPPAUGE_HVR1100] = {
1011 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
1012 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1013 .radio_type = UNSET,
1014 .tuner_addr = ADDR_UNSET,
1015 .radio_addr = ADDR_UNSET,
1016 .tda9887_conf = TDA9887_PRESENT,
1017 .input = {{
1018 .type = CX88_VMUX_TELEVISION,
1019 .vmux = 0,
1020 },{
1021 .type = CX88_VMUX_COMPOSITE1,
1022 .vmux = 1,
1023 },{
1024 .type = CX88_VMUX_SVIDEO,
1025 .vmux = 2,
1026 }},
1027 /* fixme: Add radio support */
Michael Krufky48d5e802006-09-25 14:09:10 -03001028 .mpeg = CX88_MPEG_DVB,
Steven Toth611900c2006-01-09 15:25:12 -02001029 },
1030 [CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
1031 .name = "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
1032 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1033 .radio_type = UNSET,
1034 .tuner_addr = ADDR_UNSET,
1035 .radio_addr = ADDR_UNSET,
1036 .tda9887_conf = TDA9887_PRESENT,
1037 .input = {{
1038 .type = CX88_VMUX_TELEVISION,
1039 .vmux = 0,
1040 },{
1041 .type = CX88_VMUX_COMPOSITE1,
1042 .vmux = 1,
1043 }},
1044 /* fixme: Add radio support */
Michael Krufky48d5e802006-09-25 14:09:10 -03001045 .mpeg = CX88_MPEG_DVB,
Steven Toth611900c2006-01-09 15:25:12 -02001046 },
Chris Pascoefc40b262006-01-09 15:25:35 -02001047 [CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
1048 .name = "digitalnow DNTV Live! DVB-T Pro",
1049 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1050 .radio_type = UNSET,
1051 .tuner_addr = ADDR_UNSET,
1052 .radio_addr = ADDR_UNSET,
1053 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1054 TDA9887_PORT2_ACTIVE,
1055 .input = {{
1056 .type = CX88_VMUX_TELEVISION,
1057 .vmux = 0,
1058 .gpio0 = 0xf80808,
1059 },{
1060 .type = CX88_VMUX_COMPOSITE1,
1061 .vmux = 1,
1062 .gpio0 = 0xf80808,
1063 },{
1064 .type = CX88_VMUX_SVIDEO,
1065 .vmux = 2,
1066 .gpio0 = 0xf80808,
1067 }},
1068 .radio = {
1069 .type = CX88_RADIO,
1070 .gpio0 = 0xf80808,
1071 },
Michael Krufky48d5e802006-09-25 14:09:10 -03001072 .mpeg = CX88_MPEG_DVB,
Chris Pascoefc40b262006-01-09 15:25:35 -02001073 },
Manenti Marcof39624f2006-01-09 15:32:45 -02001074 [CX88_BOARD_KWORLD_DVB_T_CX22702] = {
1075 /* Kworld V-stream Xpert DVB-T with Thomson tuner */
1076 /* DTT 7579 Conexant CX22702-19 Conexant CX2388x */
1077 /* Manenti Marco <marco_manenti@colman.it> */
1078 .name = "KWorld/VStream XPert DVB-T with cx22702",
1079 .tuner_type = TUNER_ABSENT,
1080 .radio_type = UNSET,
1081 .tuner_addr = ADDR_UNSET,
1082 .radio_addr = ADDR_UNSET,
1083 .input = {{
1084 .type = CX88_VMUX_COMPOSITE1,
1085 .vmux = 1,
1086 .gpio0 = 0x0700,
1087 .gpio2 = 0x0101,
1088 },{
1089 .type = CX88_VMUX_SVIDEO,
1090 .vmux = 2,
1091 .gpio0 = 0x0700,
1092 .gpio2 = 0x0101,
1093 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001094 .mpeg = CX88_MPEG_DVB,
Manenti Marcof39624f2006-01-09 15:32:45 -02001095 },
Chris Pascoe43eabb42006-01-09 18:21:28 -02001096 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
1097 .name = "DViCO FusionHDTV DVB-T Dual Digital",
1098 .tuner_type = TUNER_ABSENT, /* No analog tuner */
1099 .radio_type = UNSET,
1100 .tuner_addr = ADDR_UNSET,
1101 .radio_addr = ADDR_UNSET,
1102 .input = {{
1103 .type = CX88_VMUX_COMPOSITE1,
1104 .vmux = 1,
Chris Pascoed536e9c2006-08-10 03:22:21 -03001105 .gpio0 = 0x000067df,
Chris Pascoe43eabb42006-01-09 18:21:28 -02001106 },{
1107 .type = CX88_VMUX_SVIDEO,
1108 .vmux = 2,
Chris Pascoed536e9c2006-08-10 03:22:21 -03001109 .gpio0 = 0x000067df,
Chris Pascoe43eabb42006-01-09 18:21:28 -02001110 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001111 .mpeg = CX88_MPEG_DVB,
Chris Pascoe43eabb42006-01-09 18:21:28 -02001112 },
Michael Krufky44256de2006-02-07 06:49:14 -02001113 [CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
Michael Krufky44256de2006-02-07 06:49:14 -02001114 .name = "KWorld HardwareMpegTV XPert",
1115 .tuner_type = TUNER_PHILIPS_TDA8290,
1116 .radio_type = UNSET,
1117 .tuner_addr = ADDR_UNSET,
1118 .radio_addr = ADDR_UNSET,
1119 .input = {{
1120 .type = CX88_VMUX_TELEVISION,
1121 .vmux = 0,
Michael Krufkye2798212006-02-27 00:07:58 -03001122 .gpio0 = 0x3de2,
Michael Krufky24da4e42006-02-27 00:08:01 -03001123 .gpio2 = 0x00ff,
Michael Krufkybc53f782006-05-28 01:43:35 -03001124 },{
1125 .type = CX88_VMUX_COMPOSITE1,
1126 .vmux = 1,
1127 .gpio0 = 0x3de6,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -03001128 .audioroute = 1,
Michael Krufkybc53f782006-05-28 01:43:35 -03001129 },{
1130 .type = CX88_VMUX_SVIDEO,
1131 .vmux = 2,
1132 .gpio0 = 0x3de6,
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -03001133 .audioroute = 1,
Michael Krufky44256de2006-02-07 06:49:14 -02001134 }},
Michael Krufkye2798212006-02-27 00:07:58 -03001135 .radio = {
1136 .type = CX88_RADIO,
1137 .gpio0 = 0x3de6,
Michael Krufky24da4e42006-02-27 00:08:01 -03001138 .gpio2 = 0x00ff,
Michael Krufkye2798212006-02-27 00:07:58 -03001139 },
Michael Krufky48d5e802006-09-25 14:09:10 -03001140 .mpeg = CX88_MPEG_BLACKBIRD,
Michael Krufky44256de2006-02-07 06:49:14 -02001141 },
Chris Pascoe780dfef2006-02-28 08:34:59 -03001142 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
1143 .name = "DViCO FusionHDTV DVB-T Hybrid",
Michael Krufky91ae3292006-03-01 00:04:42 -03001144 .tuner_type = TUNER_THOMSON_FE6600,
Chris Pascoe780dfef2006-02-28 08:34:59 -03001145 .radio_type = UNSET,
1146 .tuner_addr = ADDR_UNSET,
1147 .radio_addr = ADDR_UNSET,
1148 .input = {{
1149 .type = CX88_VMUX_TELEVISION,
1150 .vmux = 0,
1151 .gpio0 = 0x0000a75f,
1152 },{
1153 .type = CX88_VMUX_COMPOSITE1,
1154 .vmux = 1,
1155 .gpio0 = 0x0000a75b,
1156 },{
1157 .type = CX88_VMUX_SVIDEO,
1158 .vmux = 2,
1159 .gpio0 = 0x0000a75b,
1160 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001161 .mpeg = CX88_MPEG_DVB,
Chris Pascoe780dfef2006-02-28 08:34:59 -03001162 },
Michael Krufkye142e7c2006-04-07 03:24:54 -03001163 [CX88_BOARD_PCHDTV_HD5500] = {
1164 .name = "pcHDTV HD5500 HDTV",
Michael Krufky9c26c8b2006-04-27 01:29:17 -03001165 .tuner_type = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
Michael Krufkye142e7c2006-04-07 03:24:54 -03001166 .radio_type = UNSET,
1167 .tuner_addr = ADDR_UNSET,
1168 .radio_addr = ADDR_UNSET,
1169 .tda9887_conf = TDA9887_PRESENT,
1170 .input = {{
1171 .type = CX88_VMUX_TELEVISION,
1172 .vmux = 0,
1173 .gpio0 = 0x87fd,
1174 },{
1175 .type = CX88_VMUX_COMPOSITE1,
1176 .vmux = 1,
1177 .gpio0 = 0x87f9,
1178 },{
1179 .type = CX88_VMUX_SVIDEO,
1180 .vmux = 2,
1181 .gpio0 = 0x87f9,
1182 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001183 .mpeg = CX88_MPEG_DVB,
Michael Krufkye142e7c2006-04-07 03:24:54 -03001184 },
Valentin Zagurab3038302006-04-13 12:41:43 -03001185 [CX88_BOARD_KWORLD_MCE200_DELUXE] = {
1186 /* FIXME: tested TV input only, disabled composite,
1187 svideo and radio until they can be tested also. */
1188 .name = "Kworld MCE 200 Deluxe",
1189 .tuner_type = TUNER_TENA_9533_DI,
1190 .radio_type = UNSET,
1191 .tda9887_conf = TDA9887_PRESENT,
1192 .tuner_addr = ADDR_UNSET,
1193 .radio_addr = ADDR_UNSET,
1194 .input = {{
1195 .type = CX88_VMUX_TELEVISION,
1196 .vmux = 0,
1197 .gpio0 = 0x0000BDE6
1198 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001199 .mpeg = CX88_MPEG_BLACKBIRD,
Valentin Zagurab3038302006-04-13 12:41:43 -03001200 },
Angelo Marconia3124622006-05-09 18:27:48 -03001201 [CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
1202 /* FIXME: SVideo, Composite and FM inputs are untested */
1203 .name = "PixelView PlayTV P7000",
1204 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
1205 .radio_type = UNSET,
1206 .tuner_addr = ADDR_UNSET,
1207 .radio_addr = ADDR_UNSET,
1208 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1209 TDA9887_PORT2_ACTIVE,
1210 .input = {{
1211 .type = CX88_VMUX_TELEVISION,
1212 .vmux = 0,
1213 .gpio0 = 0x5da6,
1214 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001215 .mpeg = CX88_MPEG_BLACKBIRD,
Angelo Marconia3124622006-05-09 18:27:48 -03001216 },
Ricardo Cerqueirabe4f4512006-06-08 17:36:17 -03001217 [CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
1218 .name = "NPG Tech Real TV FM Top 10",
1219 .tuner_type = TUNER_TNF_5335MF, /* Actually a TNF9535 */
Ricardo Cerqueira680543c2006-05-22 07:44:02 -03001220 .radio_type = UNSET,
1221 .tuner_addr = ADDR_UNSET,
1222 .radio_addr = ADDR_UNSET,
1223 .input = {{
1224 .type = CX88_VMUX_TELEVISION,
1225 .vmux = 0,
1226 .gpio0 = 0x0788,
1227 },{
1228 .type = CX88_VMUX_COMPOSITE1,
1229 .vmux = 1,
1230 .gpio0 = 0x078b,
1231 },{
1232 .type = CX88_VMUX_SVIDEO,
1233 .vmux = 2,
Ricardo Cerqueirabe4f4512006-06-08 17:36:17 -03001234 .gpio0 = 0x078b,
Ricardo Cerqueira680543c2006-05-22 07:44:02 -03001235 }},
1236 .radio = {
1237 .type = CX88_RADIO,
1238 .gpio0 = 0x074a,
1239 },
1240 },
Malcolm Valentine4bd6e9d2006-05-29 13:51:59 -03001241 [CX88_BOARD_WINFAST_DTV2000H] = {
Malcolm Valentine4bd6e9d2006-05-29 13:51:59 -03001242 .name = "WinFast DTV2000 H",
1243 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1244 .radio_type = UNSET,
1245 .tuner_addr = ADDR_UNSET,
1246 .radio_addr = ADDR_UNSET,
1247 .tda9887_conf = TDA9887_PRESENT,
1248 .input = {{
1249 .type = CX88_VMUX_TELEVISION,
1250 .vmux = 0,
1251 .gpio0 = 0x00017304,
1252 .gpio1 = 0x00008203,
1253 .gpio2 = 0x00017304,
1254 .gpio3 = 0x02000000,
Vincent Pelletier5cff91a2008-11-09 13:50:07 -03001255 }, {
1256 .type = CX88_VMUX_COMPOSITE1,
1257 .vmux = 1,
1258 .gpio0 = 0x0001d701,
1259 .gpio1 = 0x0000b207,
1260 .gpio2 = 0x0001d701,
1261 .gpio3 = 0x02000000,
1262 }, {
1263 .type = CX88_VMUX_COMPOSITE2,
1264 .vmux = 2,
1265 .gpio0 = 0x0001d503,
1266 .gpio1 = 0x0000b207,
1267 .gpio2 = 0x0001d503,
1268 .gpio3 = 0x02000000,
1269 }, {
1270 .type = CX88_VMUX_SVIDEO,
1271 .vmux = 3,
1272 .gpio0 = 0x0001d701,
1273 .gpio1 = 0x0000b207,
1274 .gpio2 = 0x0001d701,
1275 .gpio3 = 0x02000000,
Malcolm Valentine4bd6e9d2006-05-29 13:51:59 -03001276 }},
Vincent Pelletier5cff91a2008-11-09 13:50:07 -03001277 .radio = {
1278 .type = CX88_RADIO,
1279 .gpio0 = 0x00015702,
1280 .gpio1 = 0x0000f207,
1281 .gpio2 = 0x00015702,
1282 .gpio3 = 0x02000000,
1283 },
Michael Krufky48d5e802006-09-25 14:09:10 -03001284 .mpeg = CX88_MPEG_DVB,
Malcolm Valentine4bd6e9d2006-05-29 13:51:59 -03001285 },
Vlastimil Labsky4d14c832009-08-10 22:15:54 -03001286 [CX88_BOARD_WINFAST_DTV2000H_J] = {
1287 .name = "WinFast DTV2000 H rev. J",
1288 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1289 .radio_type = UNSET,
1290 .tuner_addr = ADDR_UNSET,
1291 .radio_addr = ADDR_UNSET,
1292 .tda9887_conf = TDA9887_PRESENT,
1293 .input = {{
1294 .type = CX88_VMUX_TELEVISION,
1295 .vmux = 0,
1296 .gpio0 = 0x00017300,
1297 .gpio1 = 0x00008207,
1298 .gpio2 = 0x00000000,
1299 .gpio3 = 0x02000000,
1300 },{
1301 .type = CX88_VMUX_TELEVISION,
1302 .vmux = 0,
1303 .gpio0 = 0x00018300,
1304 .gpio1 = 0x0000f207,
1305 .gpio2 = 0x00017304,
1306 .gpio3 = 0x02000000,
1307 },{
1308 .type = CX88_VMUX_COMPOSITE1,
1309 .vmux = 1,
1310 .gpio0 = 0x00018301,
1311 .gpio1 = 0x0000f207,
1312 .gpio2 = 0x00017304,
1313 .gpio3 = 0x02000000,
1314 },{
1315 .type = CX88_VMUX_SVIDEO,
1316 .vmux = 2,
1317 .gpio0 = 0x00018301,
1318 .gpio1 = 0x0000f207,
1319 .gpio2 = 0x00017304,
1320 .gpio3 = 0x02000000,
1321 }},
1322 .radio = {
1323 .type = CX88_RADIO,
1324 .gpio0 = 0x00015702,
1325 .gpio1 = 0x0000f207,
1326 .gpio2 = 0x00015702,
1327 .gpio3 = 0x02000000,
1328 },
1329 .mpeg = CX88_MPEG_DVB,
1330 },
Saqeb Akhterc02a34f2006-06-29 20:29:33 -03001331 [CX88_BOARD_GENIATECH_DVBS] = {
1332 .name = "Geniatech DVB-S",
1333 .tuner_type = TUNER_ABSENT,
1334 .radio_type = UNSET,
1335 .tuner_addr = ADDR_UNSET,
1336 .radio_addr = ADDR_UNSET,
1337 .input = {{
1338 .type = CX88_VMUX_DVB,
1339 .vmux = 0,
1340 },{
1341 .type = CX88_VMUX_COMPOSITE1,
1342 .vmux = 1,
1343 }},
Michael Krufky48d5e802006-09-25 14:09:10 -03001344 .mpeg = CX88_MPEG_DVB,
Saqeb Akhterc02a34f2006-06-29 20:29:33 -03001345 },
Eric Thomasad10c932006-08-08 09:10:04 -03001346 [CX88_BOARD_HAUPPAUGE_HVR3000] = {
Eric Thomasad10c932006-08-08 09:10:04 -03001347 .name = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
1348 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1349 .radio_type = UNSET,
1350 .tuner_addr = ADDR_UNSET,
1351 .radio_addr = ADDR_UNSET,
1352 .tda9887_conf = TDA9887_PRESENT,
Darron Broad923ac7f2008-10-11 11:49:30 -03001353 .audio_chip = V4L2_IDENT_WM8775,
Eric Thomasad10c932006-08-08 09:10:04 -03001354 .input = {{
1355 .type = CX88_VMUX_TELEVISION,
1356 .vmux = 0,
1357 .gpio0 = 0x84bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001358 /* 1: TV Audio / FM Mono */
Darron Broad923ac7f2008-10-11 11:49:30 -03001359 .audioroute = 1,
Eric Thomasad10c932006-08-08 09:10:04 -03001360 },{
1361 .type = CX88_VMUX_COMPOSITE1,
1362 .vmux = 1,
1363 .gpio0 = 0x84bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001364 /* 2: Line-In */
Darron Broad923ac7f2008-10-11 11:49:30 -03001365 .audioroute = 2,
Eric Thomasad10c932006-08-08 09:10:04 -03001366 },{
1367 .type = CX88_VMUX_SVIDEO,
1368 .vmux = 2,
1369 .gpio0 = 0x84bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001370 /* 2: Line-In */
Darron Broad923ac7f2008-10-11 11:49:30 -03001371 .audioroute = 2,
Eric Thomasad10c932006-08-08 09:10:04 -03001372 }},
Darron Broad63248f22008-10-11 11:57:59 -03001373 .radio = {
1374 .type = CX88_RADIO,
1375 .gpio0 = 0x84bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001376 /* 4: FM Stereo (untested) */
1377 .audioroute = 8,
Darron Broad63248f22008-10-11 11:57:59 -03001378 },
Steven Toth76dc82a2006-09-30 00:43:58 -03001379 .mpeg = CX88_MPEG_DVB,
Steven Toth363c35f2008-10-11 11:05:50 -03001380 .num_frontends = 2,
Eric Thomasad10c932006-08-08 09:10:04 -03001381 },
Peter Naullsd1009bd2006-08-08 09:10:05 -03001382 [CX88_BOARD_NORWOOD_MICRO] = {
1383 .name = "Norwood Micro TV Tuner",
1384 .tuner_type = TUNER_TNF_5335MF,
1385 .radio_type = UNSET,
1386 .tuner_addr = ADDR_UNSET,
1387 .radio_addr = ADDR_UNSET,
1388 .input = {{
1389 .type = CX88_VMUX_TELEVISION,
1390 .vmux = 0,
1391 .gpio0 = 0x0709,
1392 },{
1393 .type = CX88_VMUX_COMPOSITE1,
1394 .vmux = 1,
1395 .gpio0 = 0x070b,
1396 },{
1397 .type = CX88_VMUX_SVIDEO,
1398 .vmux = 2,
1399 .gpio0 = 0x070b,
1400 }},
1401 },
Michael Krufky5b26c822006-10-16 16:07:51 -03001402 [CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
1403 .name = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
1404 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
1405 .radio_type = UNSET,
1406 .tuner_addr = ADDR_UNSET,
1407 .radio_addr = ADDR_UNSET,
1408 .input = {{
1409 .type = CX88_VMUX_TELEVISION,
1410 .vmux = 0,
1411 .gpio0 = 0x003fffff,
1412 .gpio1 = 0x00e00000,
1413 .gpio2 = 0x003fffff,
1414 .gpio3 = 0x02000000,
David Bussenschutt2acadef2006-08-08 09:10:05 -03001415 },{
Michael Krufky5b26c822006-10-16 16:07:51 -03001416 .type = CX88_VMUX_COMPOSITE1,
1417 .vmux = 1,
1418 .gpio0 = 0x003fffff,
1419 .gpio1 = 0x00e00000,
1420 .gpio2 = 0x003fffff,
1421 .gpio3 = 0x02000000,
1422 },{
1423 .type = CX88_VMUX_SVIDEO,
1424 .vmux = 2,
1425 .gpio0 = 0x003fffff,
1426 .gpio1 = 0x00e00000,
1427 .gpio2 = 0x003fffff,
1428 .gpio3 = 0x02000000,
1429 }},
1430 },
Steven Tothaa481a62006-09-14 15:41:13 -03001431 [CX88_BOARD_HAUPPAUGE_HVR1300] = {
1432 .name = "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
1433 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1434 .radio_type = UNSET,
1435 .tuner_addr = ADDR_UNSET,
1436 .radio_addr = ADDR_UNSET,
1437 .tda9887_conf = TDA9887_PRESENT,
Hans Verkuil38f9d302008-07-23 05:09:15 -03001438 .audio_chip = V4L2_IDENT_WM8775,
Steven Toth2491fbb2008-09-22 01:48:13 -03001439 /*
1440 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
1441 */
Steven Tothaa481a62006-09-14 15:41:13 -03001442 .input = {{
1443 .type = CX88_VMUX_TELEVISION,
1444 .vmux = 0,
Steven Toth2491fbb2008-09-22 01:48:13 -03001445 .gpio0 = 0xef88,
Darron Broad649e13a2008-10-15 14:12:30 -03001446 /* 1: TV Audio / FM Mono */
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -03001447 .audioroute = 1,
Steven Tothaa481a62006-09-14 15:41:13 -03001448 },{
1449 .type = CX88_VMUX_COMPOSITE1,
1450 .vmux = 1,
Steven Toth2491fbb2008-09-22 01:48:13 -03001451 .gpio0 = 0xef88,
Darron Broad649e13a2008-10-15 14:12:30 -03001452 /* 2: Line-In */
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -03001453 .audioroute = 2,
Steven Tothaa481a62006-09-14 15:41:13 -03001454 },{
1455 .type = CX88_VMUX_SVIDEO,
1456 .vmux = 2,
Steven Toth2491fbb2008-09-22 01:48:13 -03001457 .gpio0 = 0xef88,
Darron Broad649e13a2008-10-15 14:12:30 -03001458 /* 2: Line-In */
Ricardo Cerqueira7b27d452007-09-30 13:02:49 -03001459 .audioroute = 2,
Steven Tothaa481a62006-09-14 15:41:13 -03001460 }},
Steven Toth6c5be742006-12-02 21:15:51 -02001461 .mpeg = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
Steven Toth6b92b3b2008-04-05 16:45:57 -03001462 .radio = {
1463 .type = CX88_RADIO,
Steven Toth2491fbb2008-09-22 01:48:13 -03001464 .gpio0 = 0xef88,
Darron Broad649e13a2008-10-15 14:12:30 -03001465 /* 4: FM Stereo (untested) */
1466 .audioroute = 8,
Steven Toth6b92b3b2008-04-05 16:45:57 -03001467 },
Steven Tothaa481a62006-09-14 15:41:13 -03001468 },
Daniel Gimpelevich7cb47a142007-05-17 18:10:17 -03001469 [CX88_BOARD_ADSTECH_PTV_390] = {
1470 .name = "ADS Tech Instant Video PCI",
1471 .tuner_type = TUNER_ABSENT,
1472 .radio_type = UNSET,
1473 .tuner_addr = ADDR_UNSET,
1474 .radio_addr = ADDR_UNSET,
1475 .input = {{
1476 .type = CX88_VMUX_DEBUG,
1477 .vmux = 3,
1478 .gpio0 = 0x04ff,
1479 },{
1480 .type = CX88_VMUX_COMPOSITE1,
1481 .vmux = 1,
1482 .gpio0 = 0x07fa,
1483 },{
1484 .type = CX88_VMUX_SVIDEO,
1485 .vmux = 2,
1486 .gpio0 = 0x07fa,
1487 }},
1488 },
Steven Toth60464da2008-01-05 16:53:01 -03001489 [CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
1490 .name = "Pinnacle PCTV HD 800i",
1491 .tuner_type = TUNER_XC5000,
1492 .radio_type = UNSET,
1493 .tuner_addr = ADDR_UNSET,
1494 .radio_addr = ADDR_UNSET,
1495 .input = {{
1496 .type = CX88_VMUX_TELEVISION,
1497 .vmux = 0,
1498 .gpio0 = 0x04fb,
1499 .gpio1 = 0x10ff,
1500 },{
1501 .type = CX88_VMUX_COMPOSITE1,
1502 .vmux = 1,
1503 .gpio0 = 0x04fb,
1504 .gpio1 = 0x10ef,
1505 .audioroute = 1,
1506 },{
1507 .type = CX88_VMUX_SVIDEO,
1508 .vmux = 2,
1509 .gpio0 = 0x04fb,
1510 .gpio1 = 0x10ef,
1511 .audioroute = 1,
1512 }},
1513 .mpeg = CX88_MPEG_DVB,
1514 },
Steven Toth5c00fac2008-04-22 14:45:14 -03001515 [CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
Michael Krufky8efd2e22008-04-22 14:45:14 -03001516 .name = "DViCO FusionHDTV 5 PCI nano",
1517 /* xc3008 tuner, digital only for now */
Steven Toth5c00fac2008-04-22 14:45:14 -03001518 .tuner_type = TUNER_ABSENT,
1519 .radio_type = UNSET,
1520 .tuner_addr = ADDR_UNSET,
1521 .radio_addr = ADDR_UNSET,
1522 .input = {{
1523 .type = CX88_VMUX_TELEVISION,
1524 .vmux = 0,
1525 .gpio0 = 0x000027df, /* Unconfirmed */
1526 }, {
1527 .type = CX88_VMUX_COMPOSITE1,
1528 .vmux = 1,
1529 .gpio0 = 0x000027df, /* Unconfirmed */
1530 .audioroute = 1,
1531 }, {
1532 .type = CX88_VMUX_SVIDEO,
1533 .vmux = 2,
1534 .gpio0 = 0x000027df, /* Unconfirmed */
1535 .audioroute = 1,
1536 } },
1537 .mpeg = CX88_MPEG_DVB,
1538 },
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03001539 [CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001540 .name = "Pinnacle Hybrid PCTV",
1541 .tuner_type = TUNER_XC2028,
1542 .tuner_addr = 0x61,
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001543 .radio_type = TUNER_XC2028,
1544 .radio_addr = 0x61,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001545 .input = { {
1546 .type = CX88_VMUX_TELEVISION,
1547 .vmux = 0,
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001548 .gpio0 = 0x004ff,
1549 .gpio1 = 0x010ff,
1550 .gpio2 = 0x00001,
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03001551 }, {
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001552 .type = CX88_VMUX_COMPOSITE1,
1553 .vmux = 1,
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001554 .gpio0 = 0x004fb,
1555 .gpio1 = 0x010ef,
1556 .audioroute = 1,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001557 }, {
1558 .type = CX88_VMUX_SVIDEO,
1559 .vmux = 2,
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001560 .gpio0 = 0x004fb,
1561 .gpio1 = 0x010ef,
1562 .audioroute = 1,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001563 } },
1564 .radio = {
1565 .type = CX88_RADIO,
1566 .gpio0 = 0x004ff,
1567 .gpio1 = 0x010ff,
1568 .gpio2 = 0x0ff,
1569 },
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03001570 .mpeg = CX88_MPEG_DVB,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001571 },
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001572 /* Terry Wu <terrywu2009@gmail.com> */
1573 /* TV Audio : set GPIO 2, 18, 19 value to 0, 1, 0 */
1574 /* FM Audio : set GPIO 2, 18, 19 value to 0, 0, 0 */
1575 /* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
1576 /* Mute Audio : set GPIO 2 value to 1 */
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001577 [CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001578 .name = "Leadtek TV2000 XP Global",
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001579 .tuner_type = TUNER_XC2028,
1580 .tuner_addr = 0x61,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001581 .radio_type = TUNER_XC2028,
1582 .radio_addr = 0x61,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001583 .input = { {
1584 .type = CX88_VMUX_TELEVISION,
1585 .vmux = 0,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001586 .gpio0 = 0x0400, /* pin 2 = 0 */
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001587 .gpio1 = 0x0000,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001588 .gpio2 = 0x0C04, /* pin 18 = 1, pin 19 = 0 */
1589 .gpio3 = 0x0000,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001590 }, {
1591 .type = CX88_VMUX_COMPOSITE1,
1592 .vmux = 1,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001593 .gpio0 = 0x0400, /* pin 2 = 0 */
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001594 .gpio1 = 0x0000,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001595 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */
1596 .gpio3 = 0x0000,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001597 }, {
1598 .type = CX88_VMUX_SVIDEO,
1599 .vmux = 2,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001600 .gpio0 = 0x0400, /* pin 2 = 0 */
1601 .gpio1 = 0x0000,
1602 .gpio2 = 0x0C0C, /* pin 18 = 1, pin 19 = 1 */
1603 .gpio3 = 0x0000,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001604 } },
1605 .radio = {
1606 .type = CX88_RADIO,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03001607 .gpio0 = 0x0400, /* pin 2 = 0 */
1608 .gpio1 = 0x0000,
1609 .gpio2 = 0x0C00, /* pin 18 = 0, pin 19 = 0 */
1610 .gpio3 = 0x0000,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001611 },
1612 },
1613 [CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
Daniel Gimpelevicha9606ce2008-06-03 21:29:45 -03001614 .name = "PowerColor RA330", /* Long names may confuse LIRC. */
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001615 .tuner_type = TUNER_XC2028,
1616 .tuner_addr = 0x61,
1617 .input = { {
Daniel Gimpelevicha9606ce2008-06-03 21:29:45 -03001618 .type = CX88_VMUX_DEBUG,
1619 .vmux = 3, /* Due to the way the cx88 driver is written, */
1620 .gpio0 = 0x00ff, /* there is no way to deactivate audio pass- */
1621 .gpio1 = 0xf39d, /* through without this entry. Furthermore, if */
1622 .gpio3 = 0x0000, /* the TV mux entry is first, you get audio */
1623 }, { /* from the tuner on boot for a little while. */
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001624 .type = CX88_VMUX_TELEVISION,
1625 .vmux = 0,
Dâniel Fragaab364982008-04-08 19:54:49 -03001626 .gpio0 = 0x00ff,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001627 .gpio1 = 0xf35d,
Dâniel Fragaab364982008-04-08 19:54:49 -03001628 .gpio3 = 0x0000,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001629 }, {
1630 .type = CX88_VMUX_COMPOSITE1,
1631 .vmux = 1,
Dâniel Fragaab364982008-04-08 19:54:49 -03001632 .gpio0 = 0x00ff,
1633 .gpio1 = 0xf37d,
1634 .gpio3 = 0x0000,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001635 }, {
1636 .type = CX88_VMUX_SVIDEO,
1637 .vmux = 2,
1638 .gpio0 = 0x000ff,
1639 .gpio1 = 0x0f37d,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001640 .gpio3 = 0x00000,
1641 } },
1642 .radio = {
1643 .type = CX88_RADIO,
1644 .gpio0 = 0x000ff,
1645 .gpio1 = 0x0f35d,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001646 .gpio3 = 0x00000,
1647 },
1648 },
1649 [CX88_BOARD_GENIATECH_X8000_MT] = {
1650 /* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
1651 .name = "Geniatech X8000-MT DVBT",
1652 .tuner_type = TUNER_XC2028,
1653 .tuner_addr = 0x61,
1654 .input = { {
1655 .type = CX88_VMUX_TELEVISION,
1656 .vmux = 0,
1657 .gpio0 = 0x00000000,
1658 .gpio1 = 0x00e3e341,
1659 .gpio2 = 0x00000000,
1660 .gpio3 = 0x00000000,
1661 }, {
1662 .type = CX88_VMUX_COMPOSITE1,
1663 .vmux = 1,
1664 .gpio0 = 0x00000000,
1665 .gpio1 = 0x00e3e361,
1666 .gpio2 = 0x00000000,
1667 .gpio3 = 0x00000000,
1668 }, {
1669 .type = CX88_VMUX_SVIDEO,
1670 .vmux = 2,
1671 .gpio0 = 0x00000000,
1672 .gpio1 = 0x00e3e361,
1673 .gpio2 = 0x00000000,
1674 .gpio3 = 0x00000000,
1675 } },
1676 .radio = {
1677 .type = CX88_RADIO,
1678 .gpio0 = 0x00000000,
1679 .gpio1 = 0x00e3e341,
1680 .gpio2 = 0x00000000,
1681 .gpio3 = 0x00000000,
1682 },
1683 .mpeg = CX88_MPEG_DVB,
1684 },
1685 [CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
1686 .name = "DViCO FusionHDTV DVB-T PRO",
Tim Farrington19c309e2008-10-11 12:44:38 -03001687 .tuner_type = TUNER_XC2028,
1688 .tuner_addr = 0x61,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001689 .radio_type = UNSET,
Mauro Carvalho Chehab000e27a2008-04-22 14:45:46 -03001690 .radio_addr = ADDR_UNSET,
1691 .input = { {
1692 .type = CX88_VMUX_COMPOSITE1,
1693 .vmux = 1,
1694 .gpio0 = 0x000067df,
1695 }, {
1696 .type = CX88_VMUX_SVIDEO,
1697 .vmux = 2,
1698 .gpio0 = 0x000067df,
1699 } },
1700 .mpeg = CX88_MPEG_DVB,
1701 },
Steven Toth1117d6b2008-04-22 14:45:34 -03001702 [CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
Michael Krufky76464d42008-04-22 14:45:35 -03001703 .name = "DViCO FusionHDTV 7 Gold",
Steven Toth1117d6b2008-04-22 14:45:34 -03001704 .tuner_type = TUNER_XC5000,
1705 .radio_type = UNSET,
1706 .tuner_addr = ADDR_UNSET,
1707 .radio_addr = ADDR_UNSET,
1708 .input = {{
1709 .type = CX88_VMUX_TELEVISION,
1710 .vmux = 0,
Michael Krufky76464d42008-04-22 14:45:35 -03001711 .gpio0 = 0x10df,
Steven Toth1117d6b2008-04-22 14:45:34 -03001712 },{
1713 .type = CX88_VMUX_COMPOSITE1,
1714 .vmux = 1,
Michael Krufky76464d42008-04-22 14:45:35 -03001715 .gpio0 = 0x16d9,
Steven Toth1117d6b2008-04-22 14:45:34 -03001716 },{
1717 .type = CX88_VMUX_SVIDEO,
1718 .vmux = 2,
Michael Krufky76464d42008-04-22 14:45:35 -03001719 .gpio0 = 0x16d9,
Steven Toth1117d6b2008-04-22 14:45:34 -03001720 }},
Steven Tothd893d5d2008-04-25 03:46:43 -03001721 .mpeg = CX88_MPEG_DVB,
Steven Toth1117d6b2008-04-22 14:45:34 -03001722 },
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03001723 [CX88_BOARD_PROLINK_PV_8000GT] = {
1724 .name = "Prolink Pixelview MPEG 8000GT",
1725 .tuner_type = TUNER_XC2028,
1726 .tuner_addr = 0x61,
1727 .input = { {
1728 .type = CX88_VMUX_TELEVISION,
1729 .vmux = 0,
1730 .gpio0 = 0x0ff,
1731 .gpio2 = 0x0cfb,
1732 }, {
1733 .type = CX88_VMUX_COMPOSITE1,
1734 .vmux = 1,
1735 .gpio2 = 0x0cfb,
1736 }, {
1737 .type = CX88_VMUX_SVIDEO,
1738 .vmux = 2,
1739 .gpio2 = 0x0cfb,
1740 } },
1741 .radio = {
1742 .type = CX88_RADIO,
1743 .gpio2 = 0x0cfb,
1744 },
1745 },
Mauro Carvalho Chehaba31d2bb2008-09-29 12:08:29 -03001746 [CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
1747 .name = "Prolink Pixelview Global Extreme",
1748 .tuner_type = TUNER_XC2028,
1749 .tuner_addr = 0x61,
1750 .input = { {
1751 .type = CX88_VMUX_TELEVISION,
1752 .vmux = 0,
1753 .gpio0 = 0x04fb,
1754 .gpio1 = 0x04080,
1755 .gpio2 = 0x0cf7,
1756 }, {
1757 .type = CX88_VMUX_COMPOSITE1,
1758 .vmux = 1,
1759 .gpio0 = 0x04fb,
1760 .gpio1 = 0x04080,
1761 .gpio2 = 0x0cfb,
1762 }, {
1763 .type = CX88_VMUX_SVIDEO,
1764 .vmux = 2,
1765 .gpio0 = 0x04fb,
1766 .gpio1 = 0x04080,
1767 .gpio2 = 0x0cfb,
1768 } },
1769 .radio = {
1770 .type = CX88_RADIO,
1771 .gpio0 = 0x04ff,
1772 .gpio1 = 0x04080,
1773 .gpio2 = 0x0cf7,
1774 },
1775 },
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03001776 /* Both radio, analog and ATSC work with this board.
1777 However, for analog to work, s5h1409 gate should be open,
1778 otherwise, tuner-xc3028 won't be detected.
1779 A proper fix require using the newer i2c methods to add
1780 tuner-xc3028 without doing an i2c probe.
1781 */
1782 [CX88_BOARD_KWORLD_ATSC_120] = {
1783 .name = "Kworld PlusTV HD PCI 120 (ATSC 120)",
1784 .tuner_type = TUNER_XC2028,
1785 .radio_type = UNSET,
1786 .tuner_addr = ADDR_UNSET,
1787 .radio_addr = ADDR_UNSET,
1788 .input = { {
1789 .type = CX88_VMUX_TELEVISION,
1790 .vmux = 0,
1791 .gpio0 = 0x000000ff,
1792 .gpio1 = 0x0000f35d,
1793 .gpio2 = 0x00000000,
1794 }, {
1795 .type = CX88_VMUX_COMPOSITE1,
1796 .vmux = 1,
1797 .gpio0 = 0x000000ff,
1798 .gpio1 = 0x0000f37e,
1799 .gpio2 = 0x00000000,
1800 }, {
1801 .type = CX88_VMUX_SVIDEO,
1802 .vmux = 2,
1803 .gpio0 = 0x000000ff,
1804 .gpio1 = 0x0000f37e,
1805 .gpio2 = 0x00000000,
1806 } },
1807 .radio = {
1808 .type = CX88_RADIO,
1809 .gpio0 = 0x000000ff,
1810 .gpio1 = 0x0000f35d,
1811 .gpio2 = 0x00000000,
1812 },
1813 .mpeg = CX88_MPEG_DVB,
1814 },
Steven Toth5bd1b662008-09-04 01:17:33 -03001815 [CX88_BOARD_HAUPPAUGE_HVR4000] = {
1816 .name = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
1817 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
1818 .radio_type = UNSET,
1819 .tuner_addr = ADDR_UNSET,
1820 .radio_addr = ADDR_UNSET,
1821 .tda9887_conf = TDA9887_PRESENT,
Darron Broad923ac7f2008-10-11 11:49:30 -03001822 .audio_chip = V4L2_IDENT_WM8775,
Steven Toth5bd1b662008-09-04 01:17:33 -03001823 /*
1824 * GPIO0 (WINTV2000)
1825 *
1826 * Analogue SAT DVB-T
1827 * Antenna 0xc4bf 0xc4bb
1828 * Composite 0xc4bf 0xc4bb
1829 * S-Video 0xc4bf 0xc4bb
1830 * Composite1 0xc4ff 0xc4fb
1831 * S-Video1 0xc4ff 0xc4fb
Steven Toth2491fbb2008-09-22 01:48:13 -03001832 *
1833 * BIT VALUE FUNCTION GP{x}_IO
1834 * 0 1 I:?
1835 * 1 1 I:?
Darron Broad63248f22008-10-11 11:57:59 -03001836 * 2 1 O:MPEG PORT 0=DVB-T 1=DVB-S
Steven Toth2491fbb2008-09-22 01:48:13 -03001837 * 3 1 I:?
1838 * 4 1 I:?
1839 * 5 1 I:?
1840 * 6 0 O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
1841 * 7 1 O:DVB-T DEMOD RESET LOW
1842 *
1843 * BIT VALUE FUNCTION GP{x}_OE
1844 * 8 0 I
1845 * 9 0 I
1846 * a 1 O
1847 * b 0 I
1848 * c 0 I
1849 * d 0 I
1850 * e 1 O
1851 * f 1 O
Darron Broad649e13a2008-10-15 14:12:30 -03001852 *
1853 * WM8775 ADC
1854 *
1855 * 1: TV Audio / FM Mono
1856 * 2: Line-In
1857 * 3: Line-In Expansion
1858 * 4: FM Stereo
Steven Toth5bd1b662008-09-04 01:17:33 -03001859 */
1860 .input = {{
1861 .type = CX88_VMUX_TELEVISION,
1862 .vmux = 0,
1863 .gpio0 = 0xc4bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001864 /* 1: TV Audio / FM Mono */
Darron Broad923ac7f2008-10-11 11:49:30 -03001865 .audioroute = 1,
Steven Toth5bd1b662008-09-04 01:17:33 -03001866 }, {
1867 .type = CX88_VMUX_COMPOSITE1,
1868 .vmux = 1,
1869 .gpio0 = 0xc4bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001870 /* 2: Line-In */
Darron Broad923ac7f2008-10-11 11:49:30 -03001871 .audioroute = 2,
Steven Toth5bd1b662008-09-04 01:17:33 -03001872 }, {
1873 .type = CX88_VMUX_SVIDEO,
1874 .vmux = 2,
1875 .gpio0 = 0xc4bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001876 /* 2: Line-In */
Darron Broad923ac7f2008-10-11 11:49:30 -03001877 .audioroute = 2,
Steven Toth5bd1b662008-09-04 01:17:33 -03001878 } },
Darron Broad63248f22008-10-11 11:57:59 -03001879 .radio = {
1880 .type = CX88_RADIO,
1881 .gpio0 = 0xc4bf,
Darron Broad649e13a2008-10-15 14:12:30 -03001882 /* 4: FM Stereo */
1883 .audioroute = 8,
Darron Broad63248f22008-10-11 11:57:59 -03001884 },
Steven Toth5bd1b662008-09-04 01:17:33 -03001885 .mpeg = CX88_MPEG_DVB,
Steven Toth363c35f2008-10-11 11:05:50 -03001886 .num_frontends = 2,
Steven Toth5bd1b662008-09-04 01:17:33 -03001887 },
1888 [CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
1889 .name = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
1890 .tuner_type = UNSET,
1891 .radio_type = UNSET,
1892 .tuner_addr = ADDR_UNSET,
1893 .radio_addr = ADDR_UNSET,
1894 .input = {{
1895 .type = CX88_VMUX_DVB,
1896 .vmux = 0,
1897 } },
1898 .mpeg = CX88_MPEG_DVB,
1899 },
Igor M. Liplianine4aab642008-09-23 15:43:57 -03001900 [CX88_BOARD_TEVII_S420] = {
1901 .name = "TeVii S420 DVB-S",
1902 .tuner_type = UNSET,
1903 .radio_type = UNSET,
1904 .tuner_addr = ADDR_UNSET,
1905 .radio_addr = ADDR_UNSET,
1906 .input = {{
1907 .type = CX88_VMUX_DVB,
1908 .vmux = 0,
1909 } },
1910 .mpeg = CX88_MPEG_DVB,
1911 },
Igor M. Liplianinaf832622008-09-04 17:24:14 -03001912 [CX88_BOARD_TEVII_S460] = {
1913 .name = "TeVii S460 DVB-S/S2",
1914 .tuner_type = UNSET,
1915 .radio_type = UNSET,
1916 .tuner_addr = ADDR_UNSET,
1917 .radio_addr = ADDR_UNSET,
1918 .input = {{
1919 .type = CX88_VMUX_DVB,
1920 .vmux = 0,
1921 } },
1922 .mpeg = CX88_MPEG_DVB,
1923 },
Oleg Roitburd4cd7fb82008-09-17 11:30:21 -03001924 [CX88_BOARD_OMICOM_SS4_PCI] = {
1925 .name = "Omicom SS4 DVB-S/S2 PCI",
1926 .tuner_type = UNSET,
1927 .radio_type = UNSET,
1928 .tuner_addr = ADDR_UNSET,
1929 .radio_addr = ADDR_UNSET,
1930 .input = {{
1931 .type = CX88_VMUX_DVB,
1932 .vmux = 0,
1933 } },
1934 .mpeg = CX88_MPEG_DVB,
1935 },
Igor M. Liplianin4b296312008-11-09 15:25:31 -03001936 [CX88_BOARD_TBS_8910] = {
1937 .name = "TBS 8910 DVB-S",
1938 .tuner_type = UNSET,
1939 .radio_type = UNSET,
1940 .tuner_addr = ADDR_UNSET,
1941 .radio_addr = ADDR_UNSET,
1942 .input = {{
1943 .type = CX88_VMUX_DVB,
1944 .vmux = 0,
1945 } },
1946 .mpeg = CX88_MPEG_DVB,
1947 },
Oleg Roitburdee730422008-09-17 11:58:33 -03001948 [CX88_BOARD_TBS_8920] = {
1949 .name = "TBS 8920 DVB-S/S2",
1950 .tuner_type = TUNER_ABSENT,
1951 .radio_type = UNSET,
1952 .tuner_addr = ADDR_UNSET,
1953 .radio_addr = ADDR_UNSET,
1954 .input = {{
1955 .type = CX88_VMUX_DVB,
Igor M. Liplianinad5f74c2009-07-29 19:18:28 -03001956 .vmux = 0,
1957 .gpio0 = 0x8080,
Oleg Roitburdee730422008-09-17 11:58:33 -03001958 } },
1959 .mpeg = CX88_MPEG_DVB,
1960 },
Igor M. Liplianincd3cde12008-11-09 15:26:25 -03001961 [CX88_BOARD_PROF_6200] = {
1962 .name = "Prof 6200 DVB-S",
1963 .tuner_type = UNSET,
1964 .radio_type = UNSET,
1965 .tuner_addr = ADDR_UNSET,
1966 .radio_addr = ADDR_UNSET,
1967 .input = {{
1968 .type = CX88_VMUX_DVB,
1969 .vmux = 0,
1970 } },
1971 .mpeg = CX88_MPEG_DVB,
1972 },
Oleg Roitburd57f51db2008-10-08 06:48:08 -03001973 [CX88_BOARD_PROF_7300] = {
1974 .name = "PROF 7300 DVB-S/S2",
1975 .tuner_type = UNSET,
1976 .radio_type = UNSET,
1977 .tuner_addr = ADDR_UNSET,
1978 .radio_addr = ADDR_UNSET,
1979 .input = {{
1980 .type = CX88_VMUX_DVB,
1981 .vmux = 0,
1982 } },
1983 .mpeg = CX88_MPEG_DVB,
1984 },
Igor M. Liplianin4b296312008-11-09 15:25:31 -03001985 [CX88_BOARD_SATTRADE_ST4200] = {
1986 .name = "SATTRADE ST4200 DVB-S/S2",
1987 .tuner_type = UNSET,
1988 .radio_type = UNSET,
1989 .tuner_addr = ADDR_UNSET,
1990 .radio_addr = ADDR_UNSET,
1991 .input = {{
1992 .type = CX88_VMUX_DVB,
1993 .vmux = 0,
1994 } },
1995 .mpeg = CX88_MPEG_DVB,
1996 },
Stephan Wienczny70101a22009-03-10 19:08:06 -03001997 [CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
1998 .name = "Terratec Cinergy HT PCI MKII",
1999 .tuner_type = TUNER_XC2028,
2000 .tuner_addr = 0x61,
2001 .radio_type = TUNER_XC2028,
2002 .radio_addr = 0x61,
2003 .input = { {
2004 .type = CX88_VMUX_TELEVISION,
2005 .vmux = 0,
2006 .gpio0 = 0x004ff,
2007 .gpio1 = 0x010ff,
2008 .gpio2 = 0x00001,
2009 }, {
2010 .type = CX88_VMUX_COMPOSITE1,
2011 .vmux = 1,
2012 .gpio0 = 0x004fb,
2013 .gpio1 = 0x010ef,
2014 .audioroute = 1,
2015 }, {
2016 .type = CX88_VMUX_SVIDEO,
2017 .vmux = 2,
2018 .gpio0 = 0x004fb,
2019 .gpio1 = 0x010ef,
2020 .audioroute = 1,
2021 } },
2022 .radio = {
2023 .type = CX88_RADIO,
2024 .gpio0 = 0x004ff,
2025 .gpio1 = 0x010ff,
2026 .gpio2 = 0x0ff,
2027 },
2028 .mpeg = CX88_MPEG_DVB,
2029 },
Steven Toth501d8cd2009-03-28 14:22:21 -03002030 [CX88_BOARD_HAUPPAUGE_IRONLY] = {
2031 .name = "Hauppauge WinTV-IR Only",
2032 .tuner_type = UNSET,
2033 .radio_type = UNSET,
2034 .tuner_addr = ADDR_UNSET,
2035 .radio_addr = ADDR_UNSET,
2036 },
Miroslav Sustek3047a172009-05-31 16:47:28 -03002037 [CX88_BOARD_WINFAST_DTV1800H] = {
2038 .name = "Leadtek WinFast DTV1800 Hybrid",
2039 .tuner_type = TUNER_XC2028,
2040 .radio_type = TUNER_XC2028,
2041 .tuner_addr = 0x61,
2042 .radio_addr = 0x61,
2043 /*
2044 * GPIO setting
2045 *
2046 * 2: mute (0=off,1=on)
2047 * 12: tuner reset pin
2048 * 13: audio source (0=tuner audio,1=line in)
2049 * 14: FM (0=on,1=off ???)
2050 */
2051 .input = {{
2052 .type = CX88_VMUX_TELEVISION,
2053 .vmux = 0,
2054 .gpio0 = 0x0400, /* pin 2 = 0 */
2055 .gpio1 = 0x6040, /* pin 13 = 0, pin 14 = 1 */
2056 .gpio2 = 0x0000,
2057 }, {
2058 .type = CX88_VMUX_COMPOSITE1,
2059 .vmux = 1,
2060 .gpio0 = 0x0400, /* pin 2 = 0 */
2061 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */
2062 .gpio2 = 0x0000,
2063 }, {
2064 .type = CX88_VMUX_SVIDEO,
2065 .vmux = 2,
2066 .gpio0 = 0x0400, /* pin 2 = 0 */
2067 .gpio1 = 0x6060, /* pin 13 = 1, pin 14 = 1 */
2068 .gpio2 = 0x0000,
2069 } },
2070 .radio = {
2071 .type = CX88_RADIO,
2072 .gpio0 = 0x0400, /* pin 2 = 0 */
2073 .gpio1 = 0x6000, /* pin 13 = 0, pin 14 = 0 */
2074 .gpio2 = 0x0000,
2075 },
2076 .mpeg = CX88_MPEG_DVB,
2077 },
Igor M. Liplianinb699c272009-11-16 22:22:32 -03002078 [CX88_BOARD_PROF_7301] = {
2079 .name = "Prof 7301 DVB-S/S2",
2080 .tuner_type = UNSET,
2081 .radio_type = UNSET,
2082 .tuner_addr = ADDR_UNSET,
2083 .radio_addr = ADDR_UNSET,
2084 .input = { {
2085 .type = CX88_VMUX_DVB,
2086 .vmux = 0,
2087 } },
2088 .mpeg = CX88_MPEG_DVB,
2089 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07002090};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002091
2092/* ------------------------------------------------------------------ */
2093/* PCI subsystem IDs */
2094
Trent Piephobbc83592007-08-15 14:41:58 -03002095static const struct cx88_subid cx88_subids[] = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07002096 {
2097 .subvendor = 0x0070,
2098 .subdevice = 0x3400,
2099 .card = CX88_BOARD_HAUPPAUGE,
2100 },{
2101 .subvendor = 0x0070,
2102 .subdevice = 0x3401,
2103 .card = CX88_BOARD_HAUPPAUGE,
2104 },{
2105 .subvendor = 0x14c7,
2106 .subdevice = 0x0106,
2107 .card = CX88_BOARD_GDI,
2108 },{
2109 .subvendor = 0x14c7,
2110 .subdevice = 0x0107, /* with mpeg encoder */
2111 .card = CX88_BOARD_GDI,
2112 },{
2113 .subvendor = PCI_VENDOR_ID_ATI,
2114 .subdevice = 0x00f8,
2115 .card = CX88_BOARD_ATI_WONDER_PRO,
Patrice Levesquebc13ae12008-11-02 16:37:35 -03002116 }, {
2117 .subvendor = PCI_VENDOR_ID_ATI,
2118 .subdevice = 0x00f9,
2119 .card = CX88_BOARD_ATI_WONDER_PRO,
2120 }, {
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002121 .subvendor = 0x107d,
2122 .subdevice = 0x6611,
2123 .card = CX88_BOARD_WINFAST2000XP_EXPERT,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002124 },{
2125 .subvendor = 0x107d,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002126 .subdevice = 0x6613, /* NTSC */
2127 .card = CX88_BOARD_WINFAST2000XP_EXPERT,
2128 },{
2129 .subvendor = 0x107d,
2130 .subdevice = 0x6620,
2131 .card = CX88_BOARD_WINFAST_DV2000,
2132 },{
2133 .subvendor = 0x107d,
2134 .subdevice = 0x663b,
2135 .card = CX88_BOARD_LEADTEK_PVR2000,
2136 },{
2137 .subvendor = 0x107d,
Michael Krufky8dd86ee2006-09-16 19:09:38 -03002138 .subdevice = 0x663c,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002139 .card = CX88_BOARD_LEADTEK_PVR2000,
2140 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002141 .subvendor = 0x1461,
2142 .subdevice = 0x000b,
Lubomir Bulej7418f342005-11-08 21:38:34 -08002143 .card = CX88_BOARD_AVERTV_STUDIO_303,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002144 },{
2145 .subvendor = 0x1462,
2146 .subdevice = 0x8606,
2147 .card = CX88_BOARD_MSI_TVANYWHERE_MASTER,
2148 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002149 .subvendor = 0x10fc,
2150 .subdevice = 0xd003,
2151 .card = CX88_BOARD_IODATA_GVVCP3PCI,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002152 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002153 .subvendor = 0x1043,
2154 .subdevice = 0x4823, /* with mpeg encoder */
2155 .card = CX88_BOARD_ASUS_PVR_416,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002156 },{
2157 .subvendor = 0x17de,
2158 .subdevice = 0x08a6,
2159 .card = CX88_BOARD_KWORLD_DVB_T,
2160 },{
2161 .subvendor = 0x18ac,
2162 .subdevice = 0xd810,
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -07002163 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002164 },{
Michael Krufky097b7502005-06-23 22:04:43 -07002165 .subvendor = 0x18ac,
2166 .subdevice = 0xd820,
Michael Krufky80d34362005-06-23 22:04:55 -07002167 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
Michael Krufky097b7502005-06-23 22:04:43 -07002168 },{
Michael Krufky7df64e82005-11-08 21:36:16 -08002169 .subvendor = 0x18ac,
2170 .subdevice = 0xdb00,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002171 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002172 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002173 .subvendor = 0x0070,
2174 .subdevice = 0x9002,
2175 .card = CX88_BOARD_HAUPPAUGE_DVB_T1,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002176 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002177 .subvendor = 0x14f1,
2178 .subdevice = 0x0187,
2179 .card = CX88_BOARD_CONEXANT_DVB_T1,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002180 },{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002181 .subvendor = 0x1540,
2182 .subdevice = 0x2580,
2183 .card = CX88_BOARD_PROVIDEO_PV259,
2184 },{
Michael Krufky7df64e82005-11-08 21:36:16 -08002185 .subvendor = 0x18ac,
2186 .subdevice = 0xdb10,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002187 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
2188 },{
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002189 .subvendor = 0x1554,
2190 .subdevice = 0x4811,
2191 .card = CX88_BOARD_PIXELVIEW,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002192 },{
2193 .subvendor = 0x7063,
2194 .subdevice = 0x3000, /* HD-3000 card */
2195 .card = CX88_BOARD_PCHDTV_HD3000,
2196 },{
Michael Krufky7df64e82005-11-08 21:36:16 -08002197 .subvendor = 0x17de,
2198 .subdevice = 0xa8a6,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002199 .card = CX88_BOARD_DNTV_LIVE_DVB_T,
2200 },{
2201 .subvendor = 0x0070,
2202 .subdevice = 0x2801,
2203 .card = CX88_BOARD_HAUPPAUGE_ROSLYN,
2204 },{
Michael Krufky7df64e82005-11-08 21:36:16 -08002205 .subvendor = 0x14f1,
Linus Torvalds1da177e2005-04-16 15:20:36 -07002206 .subdevice = 0x0342,
2207 .card = CX88_BOARD_DIGITALLOGIC_MEC,
2208 },{
2209 .subvendor = 0x10fc,
2210 .subdevice = 0xd035,
2211 .card = CX88_BOARD_IODATA_GVBCTV7E,
Mauro Carvalho Chehaba82decf2005-07-07 17:58:36 -07002212 },{
2213 .subvendor = 0x1421,
2214 .subdevice = 0x0334,
2215 .card = CX88_BOARD_ADSTECH_DVB_T_PCI,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002216 },{
Michael Krufkye057ee12005-07-07 17:58:40 -07002217 .subvendor = 0x153b,
2218 .subdevice = 0x1166,
2219 .card = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002220 },{
Michael Krufky9fef07c2005-07-31 22:34:46 -07002221 .subvendor = 0x18ac,
2222 .subdevice = 0xd500,
2223 .card = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002224 },{
Nickolay V. Shmyrevd45170e2005-11-08 21:36:15 -08002225 .subvendor = 0x1461,
2226 .subdevice = 0x8011,
2227 .card = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002228 },{
Kirk Lapraye976f9372005-11-08 21:37:04 -08002229 .subvendor = PCI_VENDOR_ID_ATI,
2230 .subdevice = 0xa101,
2231 .card = CX88_BOARD_ATI_HDTVWONDER,
Mauro Carvalho Chehab4ac97912005-11-08 21:37:43 -08002232 },{
David Shirley2b5200a72005-11-08 21:37:22 -08002233 .subvendor = 0x107d,
2234 .subdevice = 0x665f,
2235 .card = CX88_BOARD_WINFAST_DTV1000,
Lubomir Bulej7418f342005-11-08 21:38:34 -08002236 },{
2237 .subvendor = 0x1461,
2238 .subdevice = 0x000a,
2239 .card = CX88_BOARD_AVERTV_303,
Steven Toth0fa14aa2006-01-09 15:25:02 -02002240 },{
2241 .subvendor = 0x0070,
2242 .subdevice = 0x9200,
Steven Tothfb56cb62006-01-09 15:25:02 -02002243 .card = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
2244 },{
2245 .subvendor = 0x0070,
2246 .subdevice = 0x9201,
Steven Toth0fa14aa2006-01-09 15:25:02 -02002247 .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
2248 },{
2249 .subvendor = 0x0070,
2250 .subdevice = 0x9202,
Steven Tothfb56cb62006-01-09 15:25:02 -02002251 .card = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
Vadim Catana0e0351e2006-01-09 15:25:02 -02002252 },{
2253 .subvendor = 0x17de,
2254 .subdevice = 0x08b2,
2255 .card = CX88_BOARD_KWORLD_DVBS_100,
Steven Toth611900c2006-01-09 15:25:12 -02002256 },{
2257 .subvendor = 0x0070,
2258 .subdevice = 0x9400,
2259 .card = CX88_BOARD_HAUPPAUGE_HVR1100,
2260 },{
2261 .subvendor = 0x0070,
2262 .subdevice = 0x9402,
2263 .card = CX88_BOARD_HAUPPAUGE_HVR1100,
2264 },{
2265 .subvendor = 0x0070,
2266 .subdevice = 0x9800,
2267 .card = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2268 },{
2269 .subvendor = 0x0070,
2270 .subdevice = 0x9802,
2271 .card = CX88_BOARD_HAUPPAUGE_HVR1100LP,
Steven Tothc432a072006-01-09 15:25:13 -02002272 },{
2273 .subvendor = 0x0070,
2274 .subdevice = 0x9001,
2275 .card = CX88_BOARD_HAUPPAUGE_DVB_T1,
Chris Pascoefc40b262006-01-09 15:25:35 -02002276 },{
2277 .subvendor = 0x1822,
2278 .subdevice = 0x0025,
2279 .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
Manenti Marcof39624f2006-01-09 15:32:45 -02002280 },{
Chris Pascoeb9f4ad52006-01-09 18:21:39 -02002281 .subvendor = 0x17de,
2282 .subdevice = 0x08a1,
2283 .card = CX88_BOARD_KWORLD_DVB_T_CX22702,
Chris Pascoe43eabb42006-01-09 18:21:28 -02002284 },{
2285 .subvendor = 0x18ac,
2286 .subdevice = 0xdb50,
2287 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
Michael Krufky6bfb2e12006-01-11 22:52:28 -02002288 },{
2289 .subvendor = 0x18ac,
Michael Krufkyf74a6b32006-01-17 03:50:23 -02002290 .subdevice = 0xdb54,
2291 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
2292 /* Re-branded DViCO: DigitalNow DVB-T Dual */
2293 },{
2294 .subvendor = 0x18ac,
Michael Krufky6bfb2e12006-01-11 22:52:28 -02002295 .subdevice = 0xdb11,
2296 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
2297 /* Re-branded DViCO: UltraView DVB-T Plus */
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03002298 }, {
2299 .subvendor = 0x18ac,
2300 .subdevice = 0xdb30,
2301 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
2302 }, {
Michael Krufky44256de2006-02-07 06:49:14 -02002303 .subvendor = 0x17de,
2304 .subdevice = 0x0840,
Michael Krufky923da8a2007-03-11 12:52:48 -03002305 .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
2306 },{
2307 .subvendor = 0x1421,
2308 .subdevice = 0x0305,
Michael Krufky44256de2006-02-07 06:49:14 -02002309 .card = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
Chris Pascoe780dfef2006-02-28 08:34:59 -03002310 },{
2311 .subvendor = 0x18ac,
2312 .subdevice = 0xdb40,
2313 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2314 },{
2315 .subvendor = 0x18ac,
2316 .subdevice = 0xdb44,
2317 .card = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
Rusty Scottda215d22006-04-07 02:21:31 -03002318 },{
2319 .subvendor = 0x7063,
2320 .subdevice = 0x5500,
2321 .card = CX88_BOARD_PCHDTV_HD5500,
Valentin Zagurab3038302006-04-13 12:41:43 -03002322 },{
2323 .subvendor = 0x17de,
2324 .subdevice = 0x0841,
2325 .card = CX88_BOARD_KWORLD_MCE200_DELUXE,
Michael Krufkyfc066472006-05-22 10:32:05 -03002326 },{
2327 .subvendor = 0x1822,
2328 .subdevice = 0x0019,
2329 .card = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
Angelo Marconia3124622006-05-09 18:27:48 -03002330 },{
2331 .subvendor = 0x1554,
2332 .subdevice = 0x4813,
2333 .card = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
Ricardo Cerqueira680543c2006-05-22 07:44:02 -03002334 },{
2335 .subvendor = 0x14f1,
2336 .subdevice = 0x0842,
Ricardo Cerqueirabe4f4512006-06-08 17:36:17 -03002337 .card = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
Malcolm Valentine4bd6e9d2006-05-29 13:51:59 -03002338 },{
2339 .subvendor = 0x107d,
2340 .subdevice = 0x665e,
2341 .card = CX88_BOARD_WINFAST_DTV2000H,
Michael Krufky65271bf2006-06-21 16:04:33 -03002342 },{
Vlastimil Labsky4d14c832009-08-10 22:15:54 -03002343 .subvendor = 0x107d,
2344 .subdevice = 0x6f2b,
2345 .card = CX88_BOARD_WINFAST_DTV2000H_J,
2346 },{
Michael Krufky65271bf2006-06-21 16:04:33 -03002347 .subvendor = 0x18ac,
2348 .subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
2349 .card = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
Saqeb Akhterc02a34f2006-06-29 20:29:33 -03002350 },{
2351 .subvendor = 0x14f1,
2352 .subdevice = 0x0084,
2353 .card = CX88_BOARD_GENIATECH_DVBS,
Eric Thomasad10c932006-08-08 09:10:04 -03002354 },{
2355 .subvendor = 0x0070,
2356 .subdevice = 0x1404,
2357 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
Michael Krufky5dbaa2c2006-08-08 09:10:04 -03002358 },{
2359 .subvendor = 0x1461,
2360 .subdevice = 0xc111, /* AverMedia M150-D */
2361 /* This board is known to work with the ASUS PVR416 config */
2362 .card = CX88_BOARD_ASUS_PVR_416,
David Bussenschutt2acadef2006-08-08 09:10:05 -03002363 },{
2364 .subvendor = 0xc180,
2365 .subdevice = 0xc980,
2366 .card = CX88_BOARD_TE_DTV_250_OEM_SWANN,
Steven Tothaa481a62006-09-14 15:41:13 -03002367 },{
2368 .subvendor = 0x0070,
2369 .subdevice = 0x9600,
2370 .card = CX88_BOARD_HAUPPAUGE_HVR1300,
2371 },{
2372 .subvendor = 0x0070,
2373 .subdevice = 0x9601,
2374 .card = CX88_BOARD_HAUPPAUGE_HVR1300,
2375 },{
2376 .subvendor = 0x0070,
2377 .subdevice = 0x9602,
2378 .card = CX88_BOARD_HAUPPAUGE_HVR1300,
Michael Krufkydab489d2006-09-15 15:41:23 -03002379 },{
2380 .subvendor = 0x107d,
2381 .subdevice = 0x6632,
2382 .card = CX88_BOARD_LEADTEK_PVR2000,
Michael Krufky4508f592006-09-25 14:14:24 -03002383 },{
2384 .subvendor = 0x12ab,
2385 .subdevice = 0x2300, /* Club3D Zap TV2100 */
2386 .card = CX88_BOARD_KWORLD_DVB_T_CX22702,
Steven Toth3979ecc2006-09-29 22:37:07 -03002387 },{
2388 .subvendor = 0x0070,
2389 .subdevice = 0x9000,
2390 .card = CX88_BOARD_HAUPPAUGE_DVB_T1,
Steven Toth76dc82a2006-09-30 00:43:58 -03002391 },{
2392 .subvendor = 0x0070,
2393 .subdevice = 0x1400,
2394 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
2395 },{
2396 .subvendor = 0x0070,
2397 .subdevice = 0x1401,
2398 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
2399 },{
2400 .subvendor = 0x0070,
2401 .subdevice = 0x1402,
2402 .card = CX88_BOARD_HAUPPAUGE_HVR3000,
Michael Krufky733aeaf2007-03-11 12:48:04 -03002403 },{
2404 .subvendor = 0x1421,
2405 .subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
2406 .card = CX88_BOARD_KWORLD_DVBS_100,
Daniel Gimpelevich7cb47a142007-05-17 18:10:17 -03002407 },{
2408 .subvendor = 0x1421,
2409 .subdevice = 0x0390,
2410 .card = CX88_BOARD_ADSTECH_PTV_390,
Steven Toth60464da2008-01-05 16:53:01 -03002411 },{
2412 .subvendor = 0x11bd,
2413 .subdevice = 0x0051,
2414 .card = CX88_BOARD_PINNACLE_PCTV_HD_800i,
Steven Toth5c00fac2008-04-22 14:45:14 -03002415 }, {
2416 .subvendor = 0x18ac,
2417 .subdevice = 0xd530,
2418 .card = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002419 }, {
2420 .subvendor = 0x12ab,
2421 .subdevice = 0x1788,
2422 .card = CX88_BOARD_PINNACLE_HYBRID_PCTV,
2423 }, {
2424 .subvendor = 0x14f1,
2425 .subdevice = 0xea3d,
2426 .card = CX88_BOARD_POWERCOLOR_REAL_ANGEL,
2427 }, {
2428 .subvendor = 0x107d,
2429 .subdevice = 0x6f18,
2430 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
2431 }, {
2432 .subvendor = 0x14f1,
2433 .subdevice = 0x8852,
2434 .card = CX88_BOARD_GENIATECH_X8000_MT,
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002435 }, {
Steven Toth1117d6b2008-04-22 14:45:34 -03002436 .subvendor = 0x18ac,
2437 .subdevice = 0xd610,
2438 .card = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002439 }, {
2440 .subvendor = 0x1554,
2441 .subdevice = 0x4935,
2442 .card = CX88_BOARD_PROLINK_PV_8000GT,
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03002443 }, {
Mauro Carvalho Chehaba31d2bb2008-09-29 12:08:29 -03002444 .subvendor = 0x1554,
2445 .subdevice = 0x4976,
2446 .card = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,
2447 }, {
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03002448 .subvendor = 0x17de,
2449 .subdevice = 0x08c1,
2450 .card = CX88_BOARD_KWORLD_ATSC_120,
Steven Toth5bd1b662008-09-04 01:17:33 -03002451 }, {
2452 .subvendor = 0x0070,
2453 .subdevice = 0x6900,
2454 .card = CX88_BOARD_HAUPPAUGE_HVR4000,
2455 }, {
2456 .subvendor = 0x0070,
2457 .subdevice = 0x6904,
2458 .card = CX88_BOARD_HAUPPAUGE_HVR4000,
2459 }, {
2460 .subvendor = 0x0070,
2461 .subdevice = 0x6902,
2462 .card = CX88_BOARD_HAUPPAUGE_HVR4000,
2463 }, {
2464 .subvendor = 0x0070,
2465 .subdevice = 0x6905,
2466 .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
2467 }, {
2468 .subvendor = 0x0070,
2469 .subdevice = 0x6906,
2470 .card = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
Igor M. Liplianinaf832622008-09-04 17:24:14 -03002471 }, {
Igor M. Liplianine4aab642008-09-23 15:43:57 -03002472 .subvendor = 0xd420,
2473 .subdevice = 0x9022,
2474 .card = CX88_BOARD_TEVII_S420,
2475 }, {
2476 .subvendor = 0xd460,
Igor M. Liplianinaf832622008-09-04 17:24:14 -03002477 .subdevice = 0x9022,
2478 .card = CX88_BOARD_TEVII_S460,
Oleg Roitburd4cd7fb82008-09-17 11:30:21 -03002479 }, {
2480 .subvendor = 0xA044,
2481 .subdevice = 0x2011,
2482 .card = CX88_BOARD_OMICOM_SS4_PCI,
Oleg Roitburdee730422008-09-17 11:58:33 -03002483 }, {
Igor M. Liplianin4b296312008-11-09 15:25:31 -03002484 .subvendor = 0x8910,
2485 .subdevice = 0x8888,
2486 .card = CX88_BOARD_TBS_8910,
2487 }, {
Oleg Roitburdee730422008-09-17 11:58:33 -03002488 .subvendor = 0x8920,
2489 .subdevice = 0x8888,
2490 .card = CX88_BOARD_TBS_8920,
Oleg Roitburd57f51db2008-10-08 06:48:08 -03002491 }, {
Igor M. Liplianincd3cde12008-11-09 15:26:25 -03002492 .subvendor = 0xb022,
2493 .subdevice = 0x3022,
2494 .card = CX88_BOARD_PROF_6200,
2495 }, {
Oleg Roitburd57f51db2008-10-08 06:48:08 -03002496 .subvendor = 0xB033,
2497 .subdevice = 0x3033,
2498 .card = CX88_BOARD_PROF_7300,
Igor M. Liplianin4b296312008-11-09 15:25:31 -03002499 }, {
2500 .subvendor = 0xb200,
2501 .subdevice = 0x4200,
2502 .card = CX88_BOARD_SATTRADE_ST4200,
Stephan Wienczny70101a22009-03-10 19:08:06 -03002503 }, {
2504 .subvendor = 0x153b,
2505 .subdevice = 0x1177,
2506 .card = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,
Steven Toth501d8cd2009-03-28 14:22:21 -03002507 }, {
2508 .subvendor = 0x0070,
2509 .subdevice = 0x9290,
2510 .card = CX88_BOARD_HAUPPAUGE_IRONLY,
Miroslav Sustek3047a172009-05-31 16:47:28 -03002511 }, {
2512 .subvendor = 0x107d,
2513 .subdevice = 0x6654,
2514 .card = CX88_BOARD_WINFAST_DTV1800H,
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03002515 }, {
2516 /* PVR2000 PAL Model [107d:6630] */
2517 .subvendor = 0x107d,
2518 .subdevice = 0x6630,
2519 .card = CX88_BOARD_LEADTEK_PVR2000,
2520 }, {
2521 /* PVR2000 PAL Model [107d:6638] */
2522 .subvendor = 0x107d,
2523 .subdevice = 0x6638,
2524 .card = CX88_BOARD_LEADTEK_PVR2000,
2525 }, {
2526 /* PVR2000 NTSC Model [107d:6631] */
2527 .subvendor = 0x107d,
2528 .subdevice = 0x6631,
2529 .card = CX88_BOARD_LEADTEK_PVR2000,
2530 }, {
2531 /* PVR2000 NTSC Model [107d:6637] */
2532 .subvendor = 0x107d,
2533 .subdevice = 0x6637,
2534 .card = CX88_BOARD_LEADTEK_PVR2000,
2535 }, {
2536 /* PVR2000 NTSC Model [107d:663d] */
2537 .subvendor = 0x107d,
2538 .subdevice = 0x663d,
2539 .card = CX88_BOARD_LEADTEK_PVR2000,
2540 }, {
2541 /* DV2000 NTSC Model [107d:6621] */
2542 .subvendor = 0x107d,
2543 .subdevice = 0x6621,
2544 .card = CX88_BOARD_WINFAST_DV2000,
2545 }, {
2546 /* TV2000 XP Global [107d:6618] */
2547 .subvendor = 0x107d,
2548 .subdevice = 0x6618,
2549 .card = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
Igor M. Liplianinb699c272009-11-16 22:22:32 -03002550 }, {
2551 .subvendor = 0xb034,
2552 .subdevice = 0x3034,
2553 .card = CX88_BOARD_PROF_7301,
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002554 },
Linus Torvalds1da177e2005-04-16 15:20:36 -07002555};
Linus Torvalds1da177e2005-04-16 15:20:36 -07002556
2557/* ----------------------------------------------------------------------- */
2558/* some leadtek specific stuff */
2559
Jean Delvare69f7e75a92006-12-23 14:11:03 -03002560static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002561{
Linus Torvalds1da177e2005-04-16 15:20:36 -07002562 if (eeprom_data[4] != 0x7d ||
2563 eeprom_data[5] != 0x10 ||
2564 eeprom_data[7] != 0x66) {
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002565 warn_printk(core, "Leadtek eeprom invalid.\n");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002566 return;
2567 }
2568
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03002569 /* Terry Wu <terrywu2009@gmail.com> */
2570 switch (eeprom_data[6]) {
2571 case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
2572 case 0x21: /* SSID 6621 for DV2000 NTSC Model */
2573 case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
2574 case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
2575 case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
2576 core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
2577 break;
2578 default:
2579 core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
2580 break;
2581 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07002582
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002583 info_printk(core, "Leadtek Winfast 2000XP Expert config: "
2584 "tuner=%d, eeprom[0]=0x%02x\n",
2585 core->board.tuner_type, eeprom_data[0]);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002586}
2587
Linus Torvalds1da177e2005-04-16 15:20:36 -07002588static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
2589{
2590 struct tveeprom tv;
2591
Mauro Carvalho Chehab0f97a932005-09-09 13:04:05 -07002592 tveeprom_hauppauge_analog(&core->i2c_client, &tv, eeprom_data);
Trent Piepho6a59d642007-08-15 14:41:57 -03002593 core->board.tuner_type = tv.tuner_type;
Steven Toth0345c382006-01-09 15:25:17 -02002594 core->tuner_formats = tv.tuner_formats;
Trent Piepho6a59d642007-08-15 14:41:57 -03002595 core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002596
2597 /* Make sure we support the board model */
Steven Toth3ca0ea92005-12-01 00:51:27 -08002598 switch (tv.model)
2599 {
Steven Toth76dc82a2006-09-30 00:43:58 -03002600 case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
2601 case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
2602 case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
2603 case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
2604 case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
2605 case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
Eric Thomasad10c932006-08-08 09:10:04 -03002606 case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
Steven Toth76dc82a2006-09-30 00:43:58 -03002607 case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
2608 case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
Steven Toth0345c382006-01-09 15:25:17 -02002609 case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
Ian Pickworth42d2b6e2006-01-23 17:11:07 -02002610 case 34519: /* WinTV-PCI-FM */
Steven Toth5bd1b662008-09-04 01:17:33 -03002611 case 69009:
2612 /* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
2613 case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
2614 case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
2615 case 69559:
2616 /* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
2617 case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
Steven Toth759324c2005-12-01 00:51:26 -08002618 case 90002: /* Nova-T-PCI (9002) */
Steven Toth0fe22862005-12-01 00:51:41 -08002619 case 92001: /* Nova-S-Plus (Video and IR) */
2620 case 92002: /* Nova-S-Plus (Video and IR) */
2621 case 90003: /* Nova-T-PCI (9002 No RF out) */
Steven Toth759324c2005-12-01 00:51:26 -08002622 case 90500: /* Nova-T-PCI (oem) */
2623 case 90501: /* Nova-T-PCI (oem/IR) */
Steven Toth3ca0ea92005-12-01 00:51:27 -08002624 case 92000: /* Nova-SE2 (OEM, No Video or IR) */
Steven Toth501d8cd2009-03-28 14:22:21 -03002625 case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */
Steven Toth611900c2006-01-09 15:25:12 -02002626 case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
2627 case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
Steven Tothaa481a62006-09-14 15:41:13 -03002628 case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
2629 case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
2630 case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
2631 case 96569: /* WinTV-HVR1300 () */
2632 case 96659: /* WinTV-HVR1300 () */
Steven Toth611900c2006-01-09 15:25:12 -02002633 case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002634 /* known */
2635 break;
2636 default:
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002637 warn_printk(core, "warning: unknown hauppauge model #%d\n",
2638 tv.model);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002639 break;
2640 }
2641
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002642 info_printk(core, "hauppauge eeprom: model=%d\n", tv.model);
Linus Torvalds1da177e2005-04-16 15:20:36 -07002643}
2644
2645/* ----------------------------------------------------------------------- */
2646/* some GDI (was: Modular Technology) specific stuff */
2647
2648static struct {
2649 int id;
2650 int fm;
2651 char *name;
2652} gdi_tuner[] = {
2653 [ 0x01 ] = { .id = TUNER_ABSENT,
2654 .name = "NTSC_M" },
2655 [ 0x02 ] = { .id = TUNER_ABSENT,
2656 .name = "PAL_B" },
2657 [ 0x03 ] = { .id = TUNER_ABSENT,
2658 .name = "PAL_I" },
2659 [ 0x04 ] = { .id = TUNER_ABSENT,
2660 .name = "PAL_D" },
2661 [ 0x05 ] = { .id = TUNER_ABSENT,
2662 .name = "SECAM" },
2663
2664 [ 0x10 ] = { .id = TUNER_ABSENT,
2665 .fm = 1,
2666 .name = "TEMIC_4049" },
2667 [ 0x11 ] = { .id = TUNER_TEMIC_4136FY5,
2668 .name = "TEMIC_4136" },
2669 [ 0x12 ] = { .id = TUNER_ABSENT,
2670 .name = "TEMIC_4146" },
2671
2672 [ 0x20 ] = { .id = TUNER_PHILIPS_FQ1216ME,
2673 .fm = 1,
2674 .name = "PHILIPS_FQ1216_MK3" },
2675 [ 0x21 ] = { .id = TUNER_ABSENT, .fm = 1,
2676 .name = "PHILIPS_FQ1236_MK3" },
2677 [ 0x22 ] = { .id = TUNER_ABSENT,
2678 .name = "PHILIPS_FI1236_MK3" },
2679 [ 0x23 ] = { .id = TUNER_ABSENT,
2680 .name = "PHILIPS_FI1216_MK3" },
2681};
2682
2683static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
2684{
2685 char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
2686 ? gdi_tuner[eeprom_data[0x0d]].name : NULL;
2687
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002688 info_printk(core, "GDI: tuner=%s\n", name ? name : "unknown");
Linus Torvalds1da177e2005-04-16 15:20:36 -07002689 if (NULL == name)
2690 return;
Trent Piepho6a59d642007-08-15 14:41:57 -03002691 core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
2692 core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?
2693 CX88_RADIO : 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -07002694}
2695
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03002696/* ------------------------------------------------------------------- */
2697/* some Divco specific stuff */
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002698static int cx88_dvico_xc2028_callback(struct cx88_core *core,
2699 int command, int arg)
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03002700{
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03002701 switch (command) {
2702 case XC2028_TUNER_RESET:
Michael Krufkyd7cba042008-09-12 13:31:45 -03002703 switch (core->boardnr) {
2704 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
2705 /* GPIO-4 xc3028 tuner */
2706
2707 cx_set(MO_GP0_IO, 0x00001000);
2708 cx_clear(MO_GP0_IO, 0x00000010);
2709 msleep(100);
2710 cx_set(MO_GP0_IO, 0x00000010);
2711 msleep(100);
2712 break;
2713 default:
2714 cx_write(MO_GP0_IO, 0x101000);
2715 mdelay(5);
2716 cx_set(MO_GP0_IO, 0x101010);
2717 }
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03002718 break;
2719 default:
2720 return -EINVAL;
2721 }
2722
2723 return 0;
2724}
2725
2726
Linus Torvalds1da177e2005-04-16 15:20:36 -07002727/* ----------------------------------------------------------------------- */
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002728/* some Geniatech specific stuff */
2729
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002730static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
2731 int command, int mode)
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002732{
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002733 switch (command) {
2734 case XC2028_TUNER_RESET:
2735 switch (INPUT(core->input).type) {
2736 case CX88_RADIO:
Mauro Carvalho Chehabc450e502008-04-22 14:45:28 -03002737 break;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002738 case CX88_VMUX_DVB:
2739 cx_write(MO_GP1_IO, 0x030302);
2740 mdelay(50);
Mauro Carvalho Chehabc450e502008-04-22 14:45:28 -03002741 break;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002742 default:
2743 cx_write(MO_GP1_IO, 0x030301);
2744 mdelay(50);
Mauro Carvalho Chehabc450e502008-04-22 14:45:28 -03002745 }
2746 cx_write(MO_GP1_IO, 0x101010);
2747 mdelay(50);
2748 cx_write(MO_GP1_IO, 0x101000);
2749 mdelay(50);
2750 cx_write(MO_GP1_IO, 0x101010);
2751 mdelay(50);
2752 return 0;
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002753 }
2754 return -EINVAL;
2755}
2756
Miroslav Sustek3047a172009-05-31 16:47:28 -03002757static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
2758 int command, int arg)
2759{
2760 switch (command) {
2761 case XC2028_TUNER_RESET:
2762 /* GPIO 12 (xc3028 tuner reset) */
2763 cx_set(MO_GP1_IO, 0x1010);
2764 mdelay(50);
2765 cx_clear(MO_GP1_IO, 0x10);
2766 mdelay(50);
2767 cx_set(MO_GP1_IO, 0x10);
2768 mdelay(50);
2769 return 0;
2770 }
2771 return -EINVAL;
2772}
2773
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002774/* ------------------------------------------------------------------- */
2775/* some Divco specific stuff */
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002776static int cx88_pv_8000gt_callback(struct cx88_core *core,
2777 int command, int arg)
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002778{
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002779 switch (command) {
2780 case XC2028_TUNER_RESET:
2781 cx_write(MO_GP2_IO, 0xcf7);
2782 mdelay(50);
2783 cx_write(MO_GP2_IO, 0xef5);
2784 mdelay(50);
2785 cx_write(MO_GP2_IO, 0xcf7);
2786 break;
2787 default:
2788 return -EINVAL;
2789 }
2790
2791 return 0;
2792}
2793
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002794/* ----------------------------------------------------------------------- */
Chris Pascoe780dfef2006-02-28 08:34:59 -03002795/* some DViCO specific stuff */
2796
2797static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
2798{
2799 struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
2800 int i, err;
Chris Pascoe69b27e32006-02-28 20:23:11 -03002801 static u8 init_bufs[13][5] = {
Chris Pascoe780dfef2006-02-28 08:34:59 -03002802 { 0x10, 0x00, 0x20, 0x01, 0x03 },
2803 { 0x10, 0x10, 0x01, 0x00, 0x21 },
2804 { 0x10, 0x10, 0x10, 0x00, 0xCA },
2805 { 0x10, 0x10, 0x12, 0x00, 0x08 },
2806 { 0x10, 0x10, 0x13, 0x00, 0x0A },
2807 { 0x10, 0x10, 0x16, 0x01, 0xC0 },
2808 { 0x10, 0x10, 0x22, 0x01, 0x3D },
2809 { 0x10, 0x10, 0x73, 0x01, 0x2E },
2810 { 0x10, 0x10, 0x72, 0x00, 0xC5 },
2811 { 0x10, 0x10, 0x71, 0x01, 0x97 },
2812 { 0x10, 0x10, 0x70, 0x00, 0x0F },
2813 { 0x10, 0x10, 0xB0, 0x00, 0x01 },
2814 { 0x03, 0x0C },
2815 };
2816
Mauro Carvalho Chehab5b9c4e62007-03-28 22:37:26 -03002817 for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {
Chris Pascoe780dfef2006-02-28 08:34:59 -03002818 msg.buf = init_bufs[i];
2819 msg.len = (i != 12 ? 5 : 2);
2820 err = i2c_transfer(&core->i2c_adap, &msg, 1);
2821 if (err != 1) {
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002822 warn_printk(core, "dvico_fusionhdtv_hybrid_init buf %d "
2823 "failed (err = %d)!\n", i, err);
Chris Pascoe780dfef2006-02-28 08:34:59 -03002824 return;
2825 }
2826 }
2827}
2828
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002829static int cx88_xc2028_tuner_callback(struct cx88_core *core,
2830 int command, int arg)
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002831{
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002832 /* Board-specific callbacks */
2833 switch (core->boardnr) {
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002834 case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
2835 case CX88_BOARD_GENIATECH_X8000_MT:
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03002836 case CX88_BOARD_KWORLD_ATSC_120:
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002837 return cx88_xc3028_geniatech_tuner_callback(core,
2838 command, arg);
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03002839 case CX88_BOARD_PROLINK_PV_8000GT:
Mauro Carvalho Chehaba31d2bb2008-09-29 12:08:29 -03002840 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002841 return cx88_pv_8000gt_callback(core, command, arg);
Chris Pascoeb3fb91d2008-04-22 14:45:15 -03002842 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
Michael Krufkyd7cba042008-09-12 13:31:45 -03002843 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002844 return cx88_dvico_xc2028_callback(core, command, arg);
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03002845 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
Miroslav Sustek3047a172009-05-31 16:47:28 -03002846 case CX88_BOARD_WINFAST_DTV1800H:
2847 return cx88_xc3028_winfast1800h_callback(core, command, arg);
Mauro Carvalho Chehab95079012008-04-22 14:45:15 -03002848 }
2849
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002850 switch (command) {
2851 case XC2028_TUNER_RESET:
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002852 switch (INPUT(core->input).type) {
2853 case CX88_RADIO:
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002854 info_printk(core, "setting GPIO to radio!\n");
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002855 cx_write(MO_GP0_IO, 0x4ff);
2856 mdelay(250);
2857 cx_write(MO_GP2_IO, 0xff);
2858 mdelay(250);
Mauro Carvalho Chehabc450e502008-04-22 14:45:28 -03002859 break;
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002860 case CX88_VMUX_DVB: /* Digital TV*/
2861 default: /* Analog TV */
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002862 info_printk(core, "setting GPIO to TV!\n");
Mauro Carvalho Chehabc450e502008-04-22 14:45:28 -03002863 break;
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002864 }
Mauro Carvalho Chehabc450e502008-04-22 14:45:28 -03002865 cx_write(MO_GP1_IO, 0x101010);
2866 mdelay(250);
2867 cx_write(MO_GP1_IO, 0x101000);
2868 mdelay(250);
2869 cx_write(MO_GP1_IO, 0x101010);
2870 mdelay(250);
2871 return 0;
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002872 }
2873 return -EINVAL;
2874}
2875
Chris Pascoe780dfef2006-02-28 08:34:59 -03002876/* ----------------------------------------------------------------------- */
Steven Toth60464da2008-01-05 16:53:01 -03002877/* Tuner callback function. Currently only needed for the Pinnacle *
2878 * PCTV HD 800i with an xc5000 sillicon tuner. This is used for both *
2879 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c) */
2880
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002881static int cx88_xc5000_tuner_callback(struct cx88_core *core,
2882 int command, int arg)
Steven Toth60464da2008-01-05 16:53:01 -03002883{
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002884 switch (core->boardnr) {
Steven Toth60464da2008-01-05 16:53:01 -03002885 case CX88_BOARD_PINNACLE_PCTV_HD_800i:
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002886 if (command == 0) { /* This is the reset command from xc5000 */
Devin Heitmuellerb8d91982009-05-14 21:50:36 -03002887
2888 /* djh - According to the engineer at PCTV Systems,
2889 the xc5000 reset pin is supposed to be on GPIO12.
2890 However, despite three nights of effort, pulling
2891 that GPIO low didn't reset the xc5000. While
2892 pulling MO_SRST_IO low does reset the xc5000, this
2893 also resets in the s5h1409 being reset as well.
2894 This causes tuning to always fail since the internal
2895 state of the s5h1409 does not match the driver's
2896 state. Given that the only two conditions in which
2897 the driver performs a reset is during firmware load
2898 and powering down the chip, I am taking out the
2899 reset. We know that the chip is being reset
2900 when the cx88 comes online, and not being able to
2901 do power management for this board is worse than
2902 not having any tuning at all. */
Steven Toth60464da2008-01-05 16:53:01 -03002903 return 0;
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002904 } else {
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002905 err_printk(core, "xc5000: unknown tuner "
2906 "callback command.\n");
Steven Toth60464da2008-01-05 16:53:01 -03002907 return -EINVAL;
2908 }
2909 break;
Steven Toth1117d6b2008-04-22 14:45:34 -03002910 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
2911 if (command == 0) { /* This is the reset command from xc5000 */
2912 cx_clear(MO_GP0_IO, 0x00000010);
2913 msleep(10);
2914 cx_set(MO_GP0_IO, 0x00000010);
2915 return 0;
2916 } else {
2917 printk(KERN_ERR
2918 "xc5000: unknown tuner callback command.\n");
2919 return -EINVAL;
2920 }
2921 break;
Steven Toth60464da2008-01-05 16:53:01 -03002922 }
2923 return 0; /* Should never be here */
2924}
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002925
Michael Krufkyd7cba042008-09-12 13:31:45 -03002926int cx88_tuner_callback(void *priv, int component, int command, int arg)
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002927{
2928 struct i2c_algo_bit_data *i2c_algo = priv;
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002929 struct cx88_core *core;
2930
2931 if (!i2c_algo) {
2932 printk(KERN_ERR "cx88: Error - i2c private data undefined.\n");
2933 return -EINVAL;
2934 }
2935
2936 core = i2c_algo->data;
2937
2938 if (!core) {
2939 printk(KERN_ERR "cx88: Error - device struct undefined.\n");
2940 return -EINVAL;
2941 }
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002942
Michael Krufkyd7cba042008-09-12 13:31:45 -03002943 if (component != DVB_FRONTEND_COMPONENT_TUNER)
2944 return -EINVAL;
2945
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002946 switch (core->board.tuner_type) {
2947 case TUNER_XC2028:
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002948 info_printk(core, "Calling XC2028/3028 callback\n");
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002949 return cx88_xc2028_tuner_callback(core, command, arg);
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002950 case TUNER_XC5000:
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002951 info_printk(core, "Calling XC5000 callback\n");
Mauro Carvalho Chehab0be51b42008-04-22 14:46:10 -03002952 return cx88_xc5000_tuner_callback(core, command, arg);
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002953 }
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002954 err_printk(core, "Error: Calling callback for tuner %d\n",
2955 core->board.tuner_type);
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03002956 return -EINVAL;
2957}
Steven Toth60464da2008-01-05 16:53:01 -03002958EXPORT_SYMBOL(cx88_tuner_callback);
2959
2960/* ----------------------------------------------------------------------- */
Linus Torvalds1da177e2005-04-16 15:20:36 -07002961
Trent Piephobbc83592007-08-15 14:41:58 -03002962static void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
Linus Torvalds1da177e2005-04-16 15:20:36 -07002963{
2964 int i;
2965
2966 if (0 == pci->subsystem_vendor &&
2967 0 == pci->subsystem_device) {
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002968 printk(KERN_ERR
2969 "%s: Your board has no valid PCI Subsystem ID and thus can't\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -07002970 "%s: be autodetected. Please pass card=<n> insmod option to\n"
2971 "%s: workaround that. Redirect complaints to the vendor of\n"
2972 "%s: the TV card. Best regards,\n"
2973 "%s: -- tux\n",
2974 core->name,core->name,core->name,core->name,core->name);
2975 } else {
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002976 printk(KERN_ERR
2977 "%s: Your board isn't known (yet) to the driver. You can\n"
Linus Torvalds1da177e2005-04-16 15:20:36 -07002978 "%s: try to pick one of the existing card configs via\n"
2979 "%s: card=<n> insmod option. Updating to the latest\n"
2980 "%s: version might help as well.\n",
2981 core->name,core->name,core->name,core->name);
2982 }
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002983 err_printk(core, "Here is a list of valid choices for the card=<n> "
2984 "insmod option:\n");
Trent Piephobbc83592007-08-15 14:41:58 -03002985 for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03002986 printk(KERN_ERR "%s: card=%d -> %s\n",
Linus Torvalds1da177e2005-04-16 15:20:36 -07002987 core->name, i, cx88_boards[i].name);
2988}
2989
Trent Piephobbc83592007-08-15 14:41:58 -03002990static void cx88_card_setup_pre_i2c(struct cx88_core *core)
Steven Tothaa481a62006-09-14 15:41:13 -03002991{
Trent Piepho6a59d642007-08-15 14:41:57 -03002992 switch (core->boardnr) {
Steven Tothaa481a62006-09-14 15:41:13 -03002993 case CX88_BOARD_HAUPPAUGE_HVR1300:
Steven Toth2491fbb2008-09-22 01:48:13 -03002994 /*
2995 * Bring the 702 demod up before i2c scanning/attach or devices are hidden
2996 * We leave here with the 702 on the bus
2997 *
2998 * "reset the IR receiver on GPIO[3]"
2999 * Reported by Mike Crash <mike AT mikecrash.com>
3000 */
3001 cx_write(MO_GP0_IO, 0x0000ef88);
Steven Tothaa481a62006-09-14 15:41:13 -03003002 udelay(1000);
Steven Toth2491fbb2008-09-22 01:48:13 -03003003 cx_clear(MO_GP0_IO, 0x00000088);
Steven Tothaa481a62006-09-14 15:41:13 -03003004 udelay(50);
Steven Toth2491fbb2008-09-22 01:48:13 -03003005 cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */
Steven Tothaa481a62006-09-14 15:41:13 -03003006 udelay(1000);
3007 break;
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03003008
Mauro Carvalho Chehaba31d2bb2008-09-29 12:08:29 -03003009 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
Mauro Carvalho Chehab2422a9b2008-04-22 14:46:00 -03003010 case CX88_BOARD_PROLINK_PV_8000GT:
3011 cx_write(MO_GP2_IO, 0xcf7);
3012 mdelay(50);
3013 cx_write(MO_GP2_IO, 0xef5);
3014 mdelay(50);
3015 cx_write(MO_GP2_IO, 0xcf7);
3016 msleep(10);
3017 break;
3018
Steven Toth2491fbb2008-09-22 01:48:13 -03003019 case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
Steven Toth1117d6b2008-04-22 14:45:34 -03003020 /* Enable the xc5000 tuner */
3021 cx_set(MO_GP0_IO, 0x00001010);
3022 break;
Steven Toth2491fbb2008-09-22 01:48:13 -03003023
3024 case CX88_BOARD_HAUPPAUGE_HVR3000:
Steven Toth5bd1b662008-09-04 01:17:33 -03003025 case CX88_BOARD_HAUPPAUGE_HVR4000:
Steven Toth2491fbb2008-09-22 01:48:13 -03003026 /* Init GPIO */
3027 cx_write(MO_GP0_IO, core->board.input[0].gpio0);
Steven Toth5bd1b662008-09-04 01:17:33 -03003028 udelay(1000);
Darron Broad2f3af9e2008-10-11 11:35:56 -03003029 cx_clear(MO_GP0_IO, 0x00000080);
3030 udelay(50);
3031 cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
3032 udelay(1000);
Steven Toth2491fbb2008-09-22 01:48:13 -03003033 break;
Miroslav Sustek3047a172009-05-31 16:47:28 -03003034
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03003035 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
Miroslav Sustek3047a172009-05-31 16:47:28 -03003036 case CX88_BOARD_WINFAST_DTV1800H:
3037 /* GPIO 12 (xc3028 tuner reset) */
3038 cx_set(MO_GP1_IO, 0x1010);
3039 mdelay(50);
3040 cx_clear(MO_GP1_IO, 0x10);
3041 mdelay(50);
3042 cx_set(MO_GP1_IO, 0x10);
3043 mdelay(50);
3044 break;
Steven Tothaa481a62006-09-14 15:41:13 -03003045 }
3046}
3047
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003048/*
3049 * Sets board-dependent xc3028 configuration
3050 */
3051void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
3052{
3053 memset(ctl, 0, sizeof(*ctl));
3054
3055 ctl->fname = XC2028_DEFAULT_FIRMWARE;
3056 ctl->max_len = 64;
3057
3058 switch (core->boardnr) {
3059 case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
Daniel Gimpelevicha9606ce2008-06-03 21:29:45 -03003060 /* Now works with firmware version 2.7 */
3061 if (core->i2c_algo.udelay < 16)
3062 core->i2c_algo.udelay = 16;
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003063 break;
3064 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
Miroslav Sustek3047a172009-05-31 16:47:28 -03003065 case CX88_BOARD_WINFAST_DTV1800H:
Tim Farrington19c309e2008-10-11 12:44:38 -03003066 ctl->demod = XC3028_FE_ZARLINK456;
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003067 break;
3068 case CX88_BOARD_KWORLD_ATSC_120:
3069 case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
3070 ctl->demod = XC3028_FE_OREN538;
3071 break;
Devin Heitmueller93b99922009-08-03 22:52:59 -03003072 case CX88_BOARD_GENIATECH_X8000_MT:
3073 /* FIXME: For this board, the xc3028 never recovers after being
3074 powered down (the reset GPIO probably is not set properly).
3075 We don't have access to the hardware so we cannot determine
3076 which GPIO is used for xc3028, so just disable power xc3028
3077 power management for now */
3078 ctl->disable_power_mgmt = 1;
3079 break;
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03003080 case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
Mauro Carvalho Chehaba31d2bb2008-09-29 12:08:29 -03003081 case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003082 case CX88_BOARD_PROLINK_PV_8000GT:
3083 /*
Mauro Carvalho Chehaba31d2bb2008-09-29 12:08:29 -03003084 * Those boards uses non-MTS firmware
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003085 */
3086 break;
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03003087 case CX88_BOARD_PINNACLE_HYBRID_PCTV:
Stephan Wienczny70101a22009-03-10 19:08:06 -03003088 case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
Stéphane Voltz3f6014f2008-09-05 14:33:54 -03003089 ctl->demod = XC3028_FE_ZARLINK456;
3090 ctl->mts = 1;
3091 break;
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003092 default:
3093 ctl->demod = XC3028_FE_OREN538;
3094 ctl->mts = 1;
3095 }
3096}
3097EXPORT_SYMBOL_GPL(cx88_setup_xc3028);
3098
Trent Piephobbc83592007-08-15 14:41:58 -03003099static void cx88_card_setup(struct cx88_core *core)
Linus Torvalds1da177e2005-04-16 15:20:36 -07003100{
Steven Toth3ca0ea92005-12-01 00:51:27 -08003101 static u8 eeprom[256];
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003102 struct tuner_setup tun_setup;
3103 unsigned int mode_mask = T_RADIO |
3104 T_ANALOG_TV |
3105 T_DIGITAL_TV;
3106
3107 memset(&tun_setup, 0, sizeof(tun_setup));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003108
3109 if (0 == core->i2c_rc) {
3110 core->i2c_client.addr = 0xa0 >> 1;
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003111 tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));
Linus Torvalds1da177e2005-04-16 15:20:36 -07003112 }
3113
Trent Piepho6a59d642007-08-15 14:41:57 -03003114 switch (core->boardnr) {
Linus Torvalds1da177e2005-04-16 15:20:36 -07003115 case CX88_BOARD_HAUPPAUGE:
3116 case CX88_BOARD_HAUPPAUGE_ROSLYN:
3117 if (0 == core->i2c_rc)
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003118 hauppauge_eeprom(core, eeprom+8);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003119 break;
3120 case CX88_BOARD_GDI:
3121 if (0 == core->i2c_rc)
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003122 gdi_eeprom(core, eeprom);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003123 break;
Mauro Carvalho Chehab14422f92009-06-16 23:55:44 -03003124 case CX88_BOARD_LEADTEK_PVR2000:
3125 case CX88_BOARD_WINFAST_DV2000:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003126 case CX88_BOARD_WINFAST2000XP_EXPERT:
3127 if (0 == core->i2c_rc)
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003128 leadtek_eeprom(core, eeprom);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003129 break;
Steven Toth0fa14aa2006-01-09 15:25:02 -02003130 case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
3131 case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003132 case CX88_BOARD_HAUPPAUGE_DVB_T1:
Steven Toth611900c2006-01-09 15:25:12 -02003133 case CX88_BOARD_HAUPPAUGE_HVR1100:
3134 case CX88_BOARD_HAUPPAUGE_HVR1100LP:
Eric Thomasad10c932006-08-08 09:10:04 -03003135 case CX88_BOARD_HAUPPAUGE_HVR3000:
Steven Tothaa481a62006-09-14 15:41:13 -03003136 case CX88_BOARD_HAUPPAUGE_HVR1300:
Steven Toth5bd1b662008-09-04 01:17:33 -03003137 case CX88_BOARD_HAUPPAUGE_HVR4000:
3138 case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
Steven Toth501d8cd2009-03-28 14:22:21 -03003139 case CX88_BOARD_HAUPPAUGE_IRONLY:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003140 if (0 == core->i2c_rc)
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003141 hauppauge_eeprom(core, eeprom);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003142 break;
Vadim Catana0e0351e2006-01-09 15:25:02 -02003143 case CX88_BOARD_KWORLD_DVBS_100:
3144 cx_write(MO_GP0_IO, 0x000007f8);
3145 cx_write(MO_GP1_IO, 0x00000001);
3146 break;
Chris Pascoe87655612008-04-22 14:45:15 -03003147 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
3148 /* GPIO0:0 is hooked to demod reset */
3149 /* GPIO0:4 is hooked to xc3028 reset */
3150 cx_write(MO_GP0_IO, 0x00111100);
3151 msleep(1);
3152 cx_write(MO_GP0_IO, 0x00111111);
3153 break;
Chris Pascoed536e9c2006-08-10 03:22:21 -03003154 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
3155 /* GPIO0:6 is hooked to FX2 reset pin */
3156 cx_set(MO_GP0_IO, 0x00004040);
3157 cx_clear(MO_GP0_IO, 0x00000040);
3158 msleep(1000);
3159 cx_set(MO_GP0_IO, 0x00004040);
3160 /* FALLTHROUGH */
Linus Torvalds1da177e2005-04-16 15:20:36 -07003161 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
3162 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
Chris Pascoe780dfef2006-02-28 08:34:59 -03003163 case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
Linus Torvalds1da177e2005-04-16 15:20:36 -07003164 /* GPIO0:0 is hooked to mt352 reset pin */
3165 cx_set(MO_GP0_IO, 0x00000101);
3166 cx_clear(MO_GP0_IO, 0x00000001);
3167 msleep(1);
3168 cx_set(MO_GP0_IO, 0x00000101);
Chris Pascoe780dfef2006-02-28 08:34:59 -03003169 if (0 == core->i2c_rc &&
Trent Piepho6a59d642007-08-15 14:41:57 -03003170 core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
Chris Pascoe780dfef2006-02-28 08:34:59 -03003171 dvico_fusionhdtv_hybrid_init(core);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003172 break;
3173 case CX88_BOARD_KWORLD_DVB_T:
3174 case CX88_BOARD_DNTV_LIVE_DVB_T:
3175 cx_set(MO_GP0_IO, 0x00000707);
3176 cx_set(MO_GP2_IO, 0x00000101);
3177 cx_clear(MO_GP2_IO, 0x00000001);
3178 msleep(1);
3179 cx_clear(MO_GP0_IO, 0x00000007);
3180 cx_set(MO_GP2_IO, 0x00000101);
3181 break;
Chris Pascoefc40b262006-01-09 15:25:35 -02003182 case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
3183 cx_write(MO_GP0_IO, 0x00080808);
3184 break;
Kirk Lapraye976f9372005-11-08 21:37:04 -08003185 case CX88_BOARD_ATI_HDTVWONDER:
3186 if (0 == core->i2c_rc) {
3187 /* enable tuner */
3188 int i;
Mauro Carvalho Chehab5b9c4e62007-03-28 22:37:26 -03003189 static const u8 buffer [][2] = {
3190 {0x10,0x12},
3191 {0x13,0x04},
3192 {0x16,0x00},
3193 {0x14,0x04},
3194 {0x17,0x00}
3195 };
Kirk Lapraye976f9372005-11-08 21:37:04 -08003196 core->i2c_client.addr = 0x0a;
Kirk Lapraye976f9372005-11-08 21:37:04 -08003197
Mauro Carvalho Chehab5b9c4e62007-03-28 22:37:26 -03003198 for (i = 0; i < ARRAY_SIZE(buffer); i++)
3199 if (2 != i2c_master_send(&core->i2c_client,
3200 buffer[i],2))
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03003201 warn_printk(core, "Unable to enable "
3202 "tuner(%i).\n", i);
Kirk Lapraye976f9372005-11-08 21:37:04 -08003203 }
3204 break;
Mauro Carvalho Chehab55c88612007-10-19 06:59:33 -03003205 case CX88_BOARD_MSI_TVANYWHERE_MASTER:
3206 {
3207 struct v4l2_priv_tun_config tea5767_cfg;
3208 struct tea5767_ctrl ctl;
3209
3210 memset(&ctl, 0, sizeof(ctl));
3211
3212 ctl.high_cut = 1;
3213 ctl.st_noise = 1;
3214 ctl.deemph_75 = 1;
3215 ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
3216
3217 tea5767_cfg.tuner = TUNER_TEA5767;
3218 tea5767_cfg.priv = &ctl;
3219
Hans Verkuilb8341e12009-03-29 08:26:01 -03003220 call_all(core, tuner, s_config, &tea5767_cfg);
Igor M. Liplianinaf832622008-09-04 17:24:14 -03003221 break;
Mauro Carvalho Chehab55c88612007-10-19 06:59:33 -03003222 }
Igor M. Liplianine4aab642008-09-23 15:43:57 -03003223 case CX88_BOARD_TEVII_S420:
Igor M. Liplianinaf832622008-09-04 17:24:14 -03003224 case CX88_BOARD_TEVII_S460:
Oleg Roitburd4cd7fb82008-09-17 11:30:21 -03003225 case CX88_BOARD_OMICOM_SS4_PCI:
Igor M. Liplianin4b296312008-11-09 15:25:31 -03003226 case CX88_BOARD_TBS_8910:
Oleg Roitburdee730422008-09-17 11:58:33 -03003227 case CX88_BOARD_TBS_8920:
Igor M. Liplianincd3cde12008-11-09 15:26:25 -03003228 case CX88_BOARD_PROF_6200:
Oleg Roitburd57f51db2008-10-08 06:48:08 -03003229 case CX88_BOARD_PROF_7300:
Igor M. Liplianinb699c272009-11-16 22:22:32 -03003230 case CX88_BOARD_PROF_7301:
Igor M. Liplianin4b296312008-11-09 15:25:31 -03003231 case CX88_BOARD_SATTRADE_ST4200:
Igor M. Liplianinad5f74c2009-07-29 19:18:28 -03003232 cx_write(MO_GP0_IO, 0x8000);
3233 msleep(100);
Oleg Roitburdee730422008-09-17 11:58:33 -03003234 cx_write(MO_SRST_IO, 0);
Igor M. Liplianinad5f74c2009-07-29 19:18:28 -03003235 msleep(10);
3236 cx_write(MO_GP0_IO, 0x8080);
Oleg Roitburdee730422008-09-17 11:58:33 -03003237 msleep(100);
3238 cx_write(MO_SRST_IO, 1);
3239 msleep(100);
3240 break;
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003241 } /*end switch() */
3242
3243
3244 /* Setup tuners */
3245 if ((core->board.radio_type != UNSET)) {
3246 tun_setup.mode_mask = T_RADIO;
3247 tun_setup.type = core->board.radio_type;
3248 tun_setup.addr = core->board.radio_addr;
3249 tun_setup.tuner_callback = cx88_tuner_callback;
Hans Verkuilb8341e12009-03-29 08:26:01 -03003250 call_all(core, tuner, s_type_addr, &tun_setup);
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003251 mode_mask &= ~T_RADIO;
3252 }
3253
3254 if (core->board.tuner_type != TUNER_ABSENT) {
3255 tun_setup.mode_mask = mode_mask;
3256 tun_setup.type = core->board.tuner_type;
3257 tun_setup.addr = core->board.tuner_addr;
3258 tun_setup.tuner_callback = cx88_tuner_callback;
3259
Hans Verkuilb8341e12009-03-29 08:26:01 -03003260 call_all(core, tuner, s_type_addr, &tun_setup);
Mauro Carvalho Chehab4bf12262008-04-26 11:55:09 -03003261 }
3262
3263 if (core->board.tda9887_conf) {
3264 struct v4l2_priv_tun_config tda9887_cfg;
3265
3266 tda9887_cfg.tuner = TUNER_TDA9887;
3267 tda9887_cfg.priv = &core->board.tda9887_conf;
3268
Hans Verkuilb8341e12009-03-29 08:26:01 -03003269 call_all(core, tuner, s_config, &tda9887_cfg);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003270 }
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03003271
3272 if (core->board.tuner_type == TUNER_XC2028) {
3273 struct v4l2_priv_tun_config xc2028_cfg;
3274 struct xc2028_ctrl ctl;
3275
Mauro Carvalho Chehab99e09ea2008-03-27 23:18:30 -03003276 /* Fills device-dependent initialization parameters */
3277 cx88_setup_xc3028(core, &ctl);
3278
3279 /* Sends parameters to xc2028/3028 tuner */
Mauro Carvalho Chehaba9317ab2008-04-22 14:45:46 -03003280 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03003281 xc2028_cfg.tuner = TUNER_XC2028;
3282 xc2028_cfg.priv = &ctl;
Mauro Carvalho Chehab64016332008-04-22 14:45:30 -03003283 info_printk(core, "Asking xc2028/3028 to load firmware %s\n",
3284 ctl.fname);
Hans Verkuilb8341e12009-03-29 08:26:01 -03003285 call_all(core, tuner, s_config, &xc2028_cfg);
Mauro Carvalho Chehabc2cb8fc2008-04-22 14:45:14 -03003286 }
Laurent Pinchart622b8282009-10-05 10:48:17 -03003287 call_all(core, core, s_power, 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -07003288}
3289
3290/* ------------------------------------------------------------------ */
3291
Trent Piephobbc83592007-08-15 14:41:58 -03003292static int cx88_pci_quirks(const char *name, struct pci_dev *pci)
3293{
3294 unsigned int lat = UNSET;
3295 u8 ctrl = 0;
3296 u8 value;
3297
3298 /* check pci quirks */
3299 if (pci_pci_problems & PCIPCI_TRITON) {
3300 printk(KERN_INFO "%s: quirk: PCIPCI_TRITON -- set TBFX\n",
3301 name);
3302 ctrl |= CX88X_EN_TBFX;
3303 }
3304 if (pci_pci_problems & PCIPCI_NATOMA) {
3305 printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA -- set TBFX\n",
3306 name);
3307 ctrl |= CX88X_EN_TBFX;
3308 }
3309 if (pci_pci_problems & PCIPCI_VIAETBF) {
3310 printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF -- set TBFX\n",
3311 name);
3312 ctrl |= CX88X_EN_TBFX;
3313 }
3314 if (pci_pci_problems & PCIPCI_VSFX) {
3315 printk(KERN_INFO "%s: quirk: PCIPCI_VSFX -- set VSFX\n",
3316 name);
3317 ctrl |= CX88X_EN_VSFX;
3318 }
3319#ifdef PCIPCI_ALIMAGIK
3320 if (pci_pci_problems & PCIPCI_ALIMAGIK) {
3321 printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",
3322 name);
3323 lat = 0x0A;
3324 }
3325#endif
3326
3327 /* check insmod options */
3328 if (UNSET != latency)
3329 lat = latency;
3330
3331 /* apply stuff */
3332 if (ctrl) {
3333 pci_read_config_byte(pci, CX88X_DEVCTRL, &value);
3334 value |= ctrl;
3335 pci_write_config_byte(pci, CX88X_DEVCTRL, value);
3336 }
3337 if (UNSET != lat) {
3338 printk(KERN_INFO "%s: setting pci latency timer to %d\n",
3339 name, latency);
3340 pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);
3341 }
3342 return 0;
3343}
3344
3345int cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)
3346{
3347 if (request_mem_region(pci_resource_start(pci,0),
3348 pci_resource_len(pci,0),
3349 core->name))
3350 return 0;
3351 printk(KERN_ERR
3352 "%s/%d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",
3353 core->name, PCI_FUNC(pci->devfn),
3354 (unsigned long long)pci_resource_start(pci, 0),
3355 pci->subsystem_vendor, pci->subsystem_device);
3356 return -EBUSY;
3357}
3358
3359/* Allocate and initialize the cx88 core struct. One should hold the
3360 * devlist mutex before calling this. */
3361struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
3362{
3363 struct cx88_core *core;
3364 int i;
3365
3366 core = kzalloc(sizeof(*core), GFP_KERNEL);
Alan Coxfbc0ae22009-03-26 17:44:38 -03003367 if (core == NULL)
3368 return NULL;
Trent Piephobbc83592007-08-15 14:41:58 -03003369
3370 atomic_inc(&core->refcount);
3371 core->pci_bus = pci->bus->number;
3372 core->pci_slot = PCI_SLOT(pci->devfn);
Trent Piepho8ddac9e2007-08-18 06:57:55 -03003373 core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |
3374 PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |
3375 PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;
Trent Piephobbc83592007-08-15 14:41:58 -03003376 mutex_init(&core->lock);
3377
3378 core->nr = nr;
3379 sprintf(core->name, "cx88[%d]", core->nr);
Hans Verkuil9467fe12009-03-14 12:40:51 -03003380
3381 strcpy(core->v4l2_dev.name, core->name);
3382 if (v4l2_device_register(NULL, &core->v4l2_dev)) {
3383 kfree(core);
3384 return NULL;
3385 }
3386
Trent Piephobbc83592007-08-15 14:41:58 -03003387 if (0 != cx88_get_resources(core, pci)) {
Hans Verkuil9467fe12009-03-14 12:40:51 -03003388 v4l2_device_unregister(&core->v4l2_dev);
Trent Piephobbc83592007-08-15 14:41:58 -03003389 kfree(core);
3390 return NULL;
3391 }
3392
3393 /* PCI stuff */
3394 cx88_pci_quirks(core->name, pci);
3395 core->lmmio = ioremap(pci_resource_start(pci, 0),
3396 pci_resource_len(pci, 0));
3397 core->bmmio = (u8 __iomem *)core->lmmio;
3398
Alan Coxfbc0ae22009-03-26 17:44:38 -03003399 if (core->lmmio == NULL) {
3400 kfree(core);
3401 return NULL;
3402 }
3403
Trent Piephobbc83592007-08-15 14:41:58 -03003404 /* board config */
3405 core->boardnr = UNSET;
3406 if (card[core->nr] < ARRAY_SIZE(cx88_boards))
3407 core->boardnr = card[core->nr];
3408 for (i = 0; UNSET == core->boardnr && i < ARRAY_SIZE(cx88_subids); i++)
3409 if (pci->subsystem_vendor == cx88_subids[i].subvendor &&
3410 pci->subsystem_device == cx88_subids[i].subdevice)
3411 core->boardnr = cx88_subids[i].card;
3412 if (UNSET == core->boardnr) {
3413 core->boardnr = CX88_BOARD_UNKNOWN;
3414 cx88_card_list(core, pci);
3415 }
3416
3417 memcpy(&core->board, &cx88_boards[core->boardnr], sizeof(core->board));
3418
Mauro Carvalho Chehab30077032008-10-21 10:43:10 -03003419 if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
3420 core->board.num_frontends = 1;
Steven Toth363c35f2008-10-11 11:05:50 -03003421
3422 info_printk(core, "subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03003423 pci->subsystem_vendor, pci->subsystem_device, core->board.name,
Trent Piephobbc83592007-08-15 14:41:58 -03003424 core->boardnr, card[core->nr] == core->boardnr ?
Steven Toth363c35f2008-10-11 11:05:50 -03003425 "insmod option" : "autodetected",
3426 core->board.num_frontends);
Trent Piephobbc83592007-08-15 14:41:58 -03003427
3428 if (tuner[core->nr] != UNSET)
3429 core->board.tuner_type = tuner[core->nr];
3430 if (radio[core->nr] != UNSET)
3431 core->board.radio_type = radio[core->nr];
3432
Mauro Carvalho Chehab0f19e652008-04-22 14:45:29 -03003433 info_printk(core, "TV tuner type %d, Radio tuner type %d\n",
3434 core->board.tuner_type, core->board.radio_type);
Trent Piephobbc83592007-08-15 14:41:58 -03003435
3436 /* init hardware */
3437 cx88_reset(core);
3438 cx88_card_setup_pre_i2c(core);
3439 cx88_i2c_init(core, pci);
Mauro Carvalho Chehab189bf5f2008-02-19 16:22:25 -03003440
3441 /* load tuner module, if needed */
Hans Verkuilb8341e12009-03-29 08:26:01 -03003442 if (TUNER_ABSENT != core->board.tuner_type) {
Hans Verkuil43d5eab2009-03-29 17:47:30 -03003443 /* Ignore 0x6b and 0x6f on cx88 boards.
3444 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
3445 * and an RTC at 0x6f which can get corrupted if probed. */
3446 static const unsigned short tv_addrs[] = {
3447 0x42, 0x43, 0x4a, 0x4b, /* tda8290 */
3448 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
3449 0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,
3450 I2C_CLIENT_END
3451 };
Hans Verkuilb8341e12009-03-29 08:26:01 -03003452 int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);
3453
3454 /* I don't trust the radio_type as is stored in the card
3455 definitions, so we just probe for it.
3456 The radio_type is sometimes missing, or set to UNSET but
3457 later code configures a tea5767.
3458 */
Hans Verkuil53dacb12009-08-10 02:49:08 -03003459 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
Hans Verkuile6574f22009-04-01 03:57:53 -03003460 "tuner", "tuner",
Hans Verkuil53dacb12009-08-10 02:49:08 -03003461 0, v4l2_i2c_tuner_addrs(ADDRS_RADIO));
Hans Verkuilb8341e12009-03-29 08:26:01 -03003462 if (has_demod)
Hans Verkuil53dacb12009-08-10 02:49:08 -03003463 v4l2_i2c_new_subdev(&core->v4l2_dev,
Hans Verkuile6574f22009-04-01 03:57:53 -03003464 &core->i2c_adap, "tuner", "tuner",
Hans Verkuil53dacb12009-08-10 02:49:08 -03003465 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
Hans Verkuilb8341e12009-03-29 08:26:01 -03003466 if (core->board.tuner_addr == ADDR_UNSET) {
Hans Verkuil53dacb12009-08-10 02:49:08 -03003467 v4l2_i2c_new_subdev(&core->v4l2_dev,
Hans Verkuile6574f22009-04-01 03:57:53 -03003468 &core->i2c_adap, "tuner", "tuner",
Hans Verkuil53dacb12009-08-10 02:49:08 -03003469 0, has_demod ? tv_addrs + 4 : tv_addrs);
Hans Verkuilb8341e12009-03-29 08:26:01 -03003470 } else {
Hans Verkuile6574f22009-04-01 03:57:53 -03003471 v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
Hans Verkuil53dacb12009-08-10 02:49:08 -03003472 "tuner", "tuner", core->board.tuner_addr, NULL);
Hans Verkuilb8341e12009-03-29 08:26:01 -03003473 }
3474 }
Mauro Carvalho Chehab189bf5f2008-02-19 16:22:25 -03003475
Trent Piephobbc83592007-08-15 14:41:58 -03003476 cx88_card_setup(core);
3477 cx88_ir_init(core, pci);
3478
3479 return core;
3480}