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