xref: /linux/drivers/media/pci/cx88/cx88-cards.c (revision a8d8e38a9337cc6b46ef6c66db65130fb61050dd)
11da177e4SLinus Torvalds /*
21da177e4SLinus Torvalds  * device driver for Conexant 2388x based TV cards
31da177e4SLinus Torvalds  * card-specific stuff.
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  *  This program is free software; you can redistribute it and/or modify
81da177e4SLinus Torvalds  *  it under the terms of the GNU General Public License as published by
91da177e4SLinus Torvalds  *  the Free Software Foundation; either version 2 of the License, or
101da177e4SLinus Torvalds  *  (at your option) any later version.
111da177e4SLinus Torvalds  *
121da177e4SLinus Torvalds  *  This program is distributed in the hope that it will be useful,
131da177e4SLinus Torvalds  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
141da177e4SLinus Torvalds  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
151da177e4SLinus Torvalds  *  GNU General Public License for more details.
161da177e4SLinus Torvalds  */
171da177e4SLinus Torvalds 
1865bc2fe8SMauro Carvalho Chehab #include "cx88.h"
1965bc2fe8SMauro Carvalho Chehab #include "tea5767.h"
2065bc2fe8SMauro Carvalho Chehab #include "xc4000.h"
2165bc2fe8SMauro Carvalho Chehab 
221da177e4SLinus Torvalds #include <linux/init.h>
231da177e4SLinus Torvalds #include <linux/module.h>
241da177e4SLinus Torvalds #include <linux/pci.h>
251da177e4SLinus Torvalds #include <linux/delay.h>
265a0e3ad6STejun Heo #include <linux/slab.h>
271da177e4SLinus Torvalds 
28bbc83597STrent Piepho static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
29bbc83597STrent Piepho static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
30bbc83597STrent Piepho static unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
31bbc83597STrent Piepho 
32bbc83597STrent Piepho module_param_array(tuner, int, NULL, 0444);
33bbc83597STrent Piepho module_param_array(radio, int, NULL, 0444);
34bbc83597STrent Piepho module_param_array(card,  int, NULL, 0444);
35bbc83597STrent Piepho 
36bbc83597STrent Piepho MODULE_PARM_DESC(tuner, "tuner type");
37bbc83597STrent Piepho MODULE_PARM_DESC(radio, "radio tuner type");
38bbc83597STrent Piepho MODULE_PARM_DESC(card, "card type");
39bbc83597STrent Piepho 
40bbc83597STrent Piepho static unsigned int latency = UNSET;
41bbc83597STrent Piepho module_param(latency, int, 0444);
42bbc83597STrent Piepho MODULE_PARM_DESC(latency, "pci latency timer");
43bbc83597STrent Piepho 
4489c3bc78SJean Delvare static int disable_ir;
4589c3bc78SJean Delvare module_param(disable_ir, int, 0444);
4697108cf6SMauro Carvalho Chehab MODULE_PARM_DESC(disable_ir, "Disable IR support");
4789c3bc78SJean Delvare 
4802615ed5SMauro Carvalho Chehab #define dprintk(level, fmt, arg...)	do {				\
4902615ed5SMauro Carvalho Chehab 	if (cx88_core_debug >= level)					\
5065bc2fe8SMauro Carvalho Chehab 		printk(KERN_DEBUG pr_fmt("%s: core:" fmt),		\
5165bc2fe8SMauro Carvalho Chehab 			__func__, ##arg);				\
5202615ed5SMauro Carvalho Chehab } while (0)
5302615ed5SMauro Carvalho Chehab 
541da177e4SLinus Torvalds /* ------------------------------------------------------------------ */
551da177e4SLinus Torvalds /* board config info                                                  */
561da177e4SLinus Torvalds 
574bf1226aSMauro Carvalho Chehab /* If radio_type !=UNSET, radio_addr should be specified
584bf1226aSMauro Carvalho Chehab  */
594bf1226aSMauro Carvalho Chehab 
60bbc83597STrent Piepho static const struct cx88_board cx88_boards[] = {
611da177e4SLinus Torvalds 	[CX88_BOARD_UNKNOWN] = {
621da177e4SLinus Torvalds 		.name		= "UNKNOWN/GENERIC",
631da177e4SLinus Torvalds 		.tuner_type     = UNSET,
64b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
65b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
66b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
671da177e4SLinus Torvalds 		.input          = { {
681da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
691da177e4SLinus Torvalds 			.vmux   = 0,
701da177e4SLinus Torvalds 		}, {
711da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE2,
721da177e4SLinus Torvalds 			.vmux   = 1,
731da177e4SLinus Torvalds 		}, {
741da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE3,
751da177e4SLinus Torvalds 			.vmux   = 2,
761da177e4SLinus Torvalds 		}, {
771da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE4,
781da177e4SLinus Torvalds 			.vmux   = 3,
791da177e4SLinus Torvalds 		} },
801da177e4SLinus Torvalds 	},
811da177e4SLinus Torvalds 	[CX88_BOARD_HAUPPAUGE] = {
821da177e4SLinus Torvalds 		.name		= "Hauppauge WinTV 34xxx models",
831da177e4SLinus Torvalds 		.tuner_type     = UNSET,
84b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
85b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
86b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
871da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
881da177e4SLinus Torvalds 		.input          = { {
891da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
901da177e4SLinus Torvalds 			.vmux   = 0,
911da177e4SLinus Torvalds 			.gpio0  = 0xff00,  // internal decoder
921da177e4SLinus Torvalds 		}, {
931da177e4SLinus Torvalds 			.type   = CX88_VMUX_DEBUG,
941da177e4SLinus Torvalds 			.vmux   = 0,
951da177e4SLinus Torvalds 			.gpio0  = 0xff01,  // mono from tuner chip
961da177e4SLinus Torvalds 		}, {
971da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
981da177e4SLinus Torvalds 			.vmux   = 1,
991da177e4SLinus Torvalds 			.gpio0  = 0xff02,
1001da177e4SLinus Torvalds 		}, {
1011da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1021da177e4SLinus Torvalds 			.vmux   = 2,
1031da177e4SLinus Torvalds 			.gpio0  = 0xff02,
1041da177e4SLinus Torvalds 		} },
1051da177e4SLinus Torvalds 		.radio = {
1061da177e4SLinus Torvalds 			.type   = CX88_RADIO,
1071da177e4SLinus Torvalds 			.gpio0  = 0xff01,
1081da177e4SLinus Torvalds 		},
1091da177e4SLinus Torvalds 	},
1101da177e4SLinus Torvalds 	[CX88_BOARD_GDI] = {
1111da177e4SLinus Torvalds 		.name		= "GDI Black Gold",
1121da177e4SLinus Torvalds 		.tuner_type     = UNSET,
113b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
114b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
115b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1161da177e4SLinus Torvalds 		.input          = { {
1171da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1181da177e4SLinus Torvalds 			.vmux   = 0,
119fd3113e8SMauro Carvalho Chehab 		}, {
120fd3113e8SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
121fd3113e8SMauro Carvalho Chehab 			.vmux   = 2,
1221da177e4SLinus Torvalds 		} },
1231da177e4SLinus Torvalds 	},
1241da177e4SLinus Torvalds 	[CX88_BOARD_PIXELVIEW] = {
1251da177e4SLinus Torvalds 		.name           = "PixelView",
126b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_PAL,
127b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
128b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
129b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1301da177e4SLinus Torvalds 		.input          = { {
1311da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1321da177e4SLinus Torvalds 			.vmux   = 0,
1331da177e4SLinus Torvalds 			.gpio0  = 0xff00,  // internal decoder
1341da177e4SLinus Torvalds 		}, {
1351da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
1361da177e4SLinus Torvalds 			.vmux   = 1,
1371da177e4SLinus Torvalds 		}, {
1381da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1391da177e4SLinus Torvalds 			.vmux   = 2,
1401da177e4SLinus Torvalds 		} },
1411da177e4SLinus Torvalds 		.radio = {
1421da177e4SLinus Torvalds 			 .type  = CX88_RADIO,
1431da177e4SLinus Torvalds 			 .gpio0 = 0xff10,
1441da177e4SLinus Torvalds 		},
1451da177e4SLinus Torvalds 	},
1461da177e4SLinus Torvalds 	[CX88_BOARD_ATI_WONDER_PRO] = {
1471da177e4SLinus Torvalds 		.name           = "ATI TV Wonder Pro",
148b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_4IN1,
149b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
150b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
151b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1521da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
1531da177e4SLinus Torvalds 		.input          = { {
1541da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1551da177e4SLinus Torvalds 			.vmux   = 0,
1561da177e4SLinus Torvalds 			.gpio0  = 0x03ff,
1571da177e4SLinus Torvalds 		}, {
1581da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
1591da177e4SLinus Torvalds 			.vmux   = 1,
1601da177e4SLinus Torvalds 			.gpio0  = 0x03fe,
1611da177e4SLinus Torvalds 		}, {
1621da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1631da177e4SLinus Torvalds 			.vmux   = 2,
1641da177e4SLinus Torvalds 			.gpio0  = 0x03fe,
1651da177e4SLinus Torvalds 		} },
1661da177e4SLinus Torvalds 	},
1671da177e4SLinus Torvalds 	[CX88_BOARD_WINFAST2000XP_EXPERT] = {
1681da177e4SLinus Torvalds 		.name           = "Leadtek Winfast 2000XP Expert",
169b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_4IN1,
170b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
171b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
172b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1731da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
1741da177e4SLinus Torvalds 		.input          = { {
1751da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1761da177e4SLinus Torvalds 			.vmux   = 0,
1771da177e4SLinus Torvalds 			.gpio0	= 0x00F5e700,
1781da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1791da177e4SLinus Torvalds 			.gpio2  = 0x00F5e700,
1801da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1811da177e4SLinus Torvalds 		}, {
1821da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
1831da177e4SLinus Torvalds 			.vmux   = 1,
1841da177e4SLinus Torvalds 			.gpio0	= 0x00F5c700,
1851da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1861da177e4SLinus Torvalds 			.gpio2  = 0x00F5c700,
1871da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1881da177e4SLinus Torvalds 		}, {
1891da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1901da177e4SLinus Torvalds 			.vmux   = 2,
1911da177e4SLinus Torvalds 			.gpio0	= 0x00F5c700,
1921da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1931da177e4SLinus Torvalds 			.gpio2  = 0x00F5c700,
1941da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1951da177e4SLinus Torvalds 		} },
1961da177e4SLinus Torvalds 		.radio = {
1971da177e4SLinus Torvalds 			.type   = CX88_RADIO,
1981da177e4SLinus Torvalds 			.gpio0	= 0x00F5d700,
1991da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
2001da177e4SLinus Torvalds 			.gpio2  = 0x00F5d700,
2011da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2021da177e4SLinus Torvalds 		},
2031da177e4SLinus Torvalds 	},
2047418f346SLubomir Bulej 	[CX88_BOARD_AVERTV_STUDIO_303] = {
2051da177e4SLinus Torvalds 		.name           = "AverTV Studio 303 (M126)",
206b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
207b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
208b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
209b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
2101da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
2111da177e4SLinus Torvalds 		.input          = { {
2121da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
2131da177e4SLinus Torvalds 			.vmux   = 0,
2144aca4831SMarcin Rudowski 			.gpio1  = 0xe09f,
2151da177e4SLinus Torvalds 		}, {
2161da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
2171da177e4SLinus Torvalds 			.vmux   = 1,
2184aca4831SMarcin Rudowski 			.gpio1  = 0xe05f,
2191da177e4SLinus Torvalds 		}, {
2201da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
2211da177e4SLinus Torvalds 			.vmux   = 2,
2224aca4831SMarcin Rudowski 			.gpio1  = 0xe05f,
2231da177e4SLinus Torvalds 		} },
2241da177e4SLinus Torvalds 		.radio = {
2254aca4831SMarcin Rudowski 			.gpio1  = 0xe0df,
2261da177e4SLinus Torvalds 			.type   = CX88_RADIO,
2271da177e4SLinus Torvalds 		},
2281da177e4SLinus Torvalds 	},
2291da177e4SLinus Torvalds 	[CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
2301da177e4SLinus Torvalds 		// added gpio values thanks to Michal
2311da177e4SLinus Torvalds 		// values for PAL from DScaler
2321da177e4SLinus Torvalds 		.name           = "MSI TV-@nywhere Master",
233b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_MT2032,
234b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
235b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
236b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
2373ae1adc6SNickolay V. Shmyrev 		.tda9887_conf	= TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
2381da177e4SLinus Torvalds 		.input          = { {
2391da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
2401da177e4SLinus Torvalds 			.vmux   = 0,
2411da177e4SLinus Torvalds 			.gpio0  = 0x000040bf,
2421da177e4SLinus Torvalds 			.gpio1  = 0x000080c0,
2431da177e4SLinus Torvalds 			.gpio2  = 0x0000ff40,
2441da177e4SLinus Torvalds 		}, {
2451da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
2461da177e4SLinus Torvalds 			.vmux   = 1,
2471da177e4SLinus Torvalds 			.gpio0  = 0x000040bf,
2481da177e4SLinus Torvalds 			.gpio1  = 0x000080c0,
2491da177e4SLinus Torvalds 			.gpio2  = 0x0000ff40,
2501da177e4SLinus Torvalds 		}, {
2511da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
2521da177e4SLinus Torvalds 			.vmux   = 2,
2531da177e4SLinus Torvalds 			.gpio0  = 0x000040bf,
2541da177e4SLinus Torvalds 			.gpio1  = 0x000080c0,
2551da177e4SLinus Torvalds 			.gpio2  = 0x0000ff40,
2561da177e4SLinus Torvalds 		} },
2571da177e4SLinus Torvalds 		.radio = {
2581da177e4SLinus Torvalds 			 .type   = CX88_RADIO,
25955c88610SMauro Carvalho Chehab 			 .vmux   = 3,
26055c88610SMauro Carvalho Chehab 			 .gpio0  = 0x000040bf,
26155c88610SMauro Carvalho Chehab 			 .gpio1  = 0x000080c0,
26255c88610SMauro Carvalho Chehab 			 .gpio2  = 0x0000ff20,
2631da177e4SLinus Torvalds 		},
2641da177e4SLinus Torvalds 	},
2651da177e4SLinus Torvalds 	[CX88_BOARD_WINFAST_DV2000] = {
2661da177e4SLinus Torvalds 		.name           = "Leadtek Winfast DV2000",
267b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
268b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
269b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
270b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
2711da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
2721da177e4SLinus Torvalds 		.input          = { {
2731da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
2741da177e4SLinus Torvalds 			.vmux   = 0,
2751da177e4SLinus Torvalds 			.gpio0  = 0x0035e700,
2761da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
2771da177e4SLinus Torvalds 			.gpio2  = 0x0035e700,
2781da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2791da177e4SLinus Torvalds 		}, {
2801da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
2811da177e4SLinus Torvalds 			.vmux   = 1,
2821da177e4SLinus Torvalds 			.gpio0  = 0x0035c700,
2831da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
2841da177e4SLinus Torvalds 			.gpio2  = 0x0035c700,
2851da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2861da177e4SLinus Torvalds 		}, {
2871da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
2881da177e4SLinus Torvalds 			.vmux   = 2,
2891da177e4SLinus Torvalds 			.gpio0  = 0x0035c700,
2901da177e4SLinus Torvalds 			.gpio1  = 0x0035c700,
2911da177e4SLinus Torvalds 			.gpio2  = 0x02000000,
2921da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2931da177e4SLinus Torvalds 		} },
2941da177e4SLinus Torvalds 		.radio = {
2951da177e4SLinus Torvalds 			.type   = CX88_RADIO,
2961da177e4SLinus Torvalds 			.gpio0  = 0x0035d700,
2971da177e4SLinus Torvalds 			.gpio1  = 0x00007004,
2981da177e4SLinus Torvalds 			.gpio2  = 0x0035d700,
2991da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
3001da177e4SLinus Torvalds 		},
3011da177e4SLinus Torvalds 	},
3021da177e4SLinus Torvalds 	[CX88_BOARD_LEADTEK_PVR2000] = {
3031da177e4SLinus Torvalds 		// gpio values for PAL version from regspy by DScaler
3041da177e4SLinus Torvalds 		.name           = "Leadtek PVR 2000",
305b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
306b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
307b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
308b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3091da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
3101da177e4SLinus Torvalds 		.input          = { {
3111da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3121da177e4SLinus Torvalds 			.vmux   = 0,
313b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x0000bde2,
3147b27d45bSRicardo Cerqueira 			.audioroute = 1,
3151da177e4SLinus Torvalds 		}, {
3161da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
3171da177e4SLinus Torvalds 			.vmux   = 1,
3181da177e4SLinus Torvalds 			.gpio0  = 0x0000bde6,
3197b27d45bSRicardo Cerqueira 			.audioroute = 1,
3201da177e4SLinus Torvalds 		}, {
3211da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3221da177e4SLinus Torvalds 			.vmux   = 2,
3231da177e4SLinus Torvalds 			.gpio0  = 0x0000bde6,
3247b27d45bSRicardo Cerqueira 			.audioroute = 1,
3251da177e4SLinus Torvalds 		} },
3261da177e4SLinus Torvalds 		.radio = {
3271da177e4SLinus Torvalds 			.type   = CX88_RADIO,
3281da177e4SLinus Torvalds 			.gpio0  = 0x0000bd62,
3297b27d45bSRicardo Cerqueira 			.audioroute = 1,
3301da177e4SLinus Torvalds 		},
33148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
3321da177e4SLinus Torvalds 	},
3331da177e4SLinus Torvalds 	[CX88_BOARD_IODATA_GVVCP3PCI] = {
3341da177e4SLinus Torvalds 		.name		= "IODATA GV-VCP3/PCI",
335c39ba330SHans Verkuil 		.tuner_type     = UNSET,
336b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
337b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
338b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3391da177e4SLinus Torvalds 		.input          = { {
3401da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
3411da177e4SLinus Torvalds 			.vmux   = 0,
3421da177e4SLinus Torvalds 		}, {
3431da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE2,
3441da177e4SLinus Torvalds 			.vmux   = 1,
3451da177e4SLinus Torvalds 		}, {
3461da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3471da177e4SLinus Torvalds 			.vmux   = 2,
3481da177e4SLinus Torvalds 		} },
3491da177e4SLinus Torvalds 	},
3501da177e4SLinus Torvalds 	[CX88_BOARD_PROLINK_PLAYTVPVR] = {
3511da177e4SLinus Torvalds 		.name           = "Prolink PlayTV PVR",
352b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
353b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
354b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
355b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3561da177e4SLinus Torvalds 		.tda9887_conf	= TDA9887_PRESENT,
3571da177e4SLinus Torvalds 		.input          = { {
3581da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3591da177e4SLinus Torvalds 			.vmux   = 0,
36049239c35SMatheus Izvekov 			.gpio0  = 0xbff0,
3611da177e4SLinus Torvalds 		}, {
3621da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
3631da177e4SLinus Torvalds 			.vmux   = 1,
36449239c35SMatheus Izvekov 			.gpio0  = 0xbff3,
3651da177e4SLinus Torvalds 		}, {
3661da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3671da177e4SLinus Torvalds 			.vmux   = 2,
36849239c35SMatheus Izvekov 			.gpio0  = 0xbff3,
3691da177e4SLinus Torvalds 		} },
3701da177e4SLinus Torvalds 		.radio = {
3711da177e4SLinus Torvalds 			.type   = CX88_RADIO,
37249239c35SMatheus Izvekov 			.gpio0  = 0xbff0,
3731da177e4SLinus Torvalds 		},
3741da177e4SLinus Torvalds 	},
3751da177e4SLinus Torvalds 	[CX88_BOARD_ASUS_PVR_416] = {
3761da177e4SLinus Torvalds 		.name		= "ASUS PVR-416",
377b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
378b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
379b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
380b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3811da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
3821da177e4SLinus Torvalds 		.input          = { {
3831da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3841da177e4SLinus Torvalds 			.vmux   = 0,
3851da177e4SLinus Torvalds 			.gpio0  = 0x0000fde6,
3861da177e4SLinus Torvalds 		}, {
3871da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3881da177e4SLinus Torvalds 			.vmux   = 2,
3891da177e4SLinus Torvalds 			.gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
3907b27d45bSRicardo Cerqueira 			.audioroute = 1,
3911da177e4SLinus Torvalds 		} },
3921da177e4SLinus Torvalds 		.radio = {
3931da177e4SLinus Torvalds 			.type   = CX88_RADIO,
3941da177e4SLinus Torvalds 			.gpio0  = 0x0000fde2,
3951da177e4SLinus Torvalds 		},
39648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
3971da177e4SLinus Torvalds 	},
3981da177e4SLinus Torvalds 	[CX88_BOARD_MSI_TVANYWHERE] = {
3991da177e4SLinus Torvalds 		.name           = "MSI TV-@nywhere",
400b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_MT2032,
401b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
402b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
403b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4041da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
4051da177e4SLinus Torvalds 		.input          = { {
4061da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
4071da177e4SLinus Torvalds 			.vmux   = 0,
4081da177e4SLinus Torvalds 			.gpio0  = 0x00000fbf,
4091da177e4SLinus Torvalds 			.gpio2  = 0x0000fc08,
4101da177e4SLinus Torvalds 		}, {
4111da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4121da177e4SLinus Torvalds 			.vmux   = 1,
4131da177e4SLinus Torvalds 			.gpio0  = 0x00000fbf,
4141da177e4SLinus Torvalds 			.gpio2  = 0x0000fc68,
4151da177e4SLinus Torvalds 		}, {
4161da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4171da177e4SLinus Torvalds 			.vmux   = 2,
4181da177e4SLinus Torvalds 			.gpio0  = 0x00000fbf,
4191da177e4SLinus Torvalds 			.gpio2  = 0x0000fc68,
4201da177e4SLinus Torvalds 		} },
4211da177e4SLinus Torvalds 	},
4221da177e4SLinus Torvalds 	[CX88_BOARD_KWORLD_DVB_T] = {
4231da177e4SLinus Torvalds 		.name           = "KWorld/VStream XPert DVB-T",
424c39ba330SHans Verkuil 		.tuner_type     = UNSET,
425b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
426b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
427b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4281da177e4SLinus Torvalds 		.input          = { {
4291da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4301da177e4SLinus Torvalds 			.vmux   = 1,
4311da177e4SLinus Torvalds 			.gpio0  = 0x0700,
4321da177e4SLinus Torvalds 			.gpio2  = 0x0101,
4331da177e4SLinus Torvalds 		}, {
4341da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4351da177e4SLinus Torvalds 			.vmux   = 2,
4361da177e4SLinus Torvalds 			.gpio0  = 0x0700,
4371da177e4SLinus Torvalds 			.gpio2  = 0x0101,
4381da177e4SLinus Torvalds 		} },
43948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
4401da177e4SLinus Torvalds 	},
4411da177e4SLinus Torvalds 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
442a82decf6SMauro Carvalho Chehab 		.name           = "DViCO FusionHDTV DVB-T1",
443c39ba330SHans Verkuil 		.tuner_type     = UNSET, /* No analog tuner */
444b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
445b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
446b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4471da177e4SLinus Torvalds 		.input          = { {
4481da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4491da177e4SLinus Torvalds 			.vmux   = 1,
4501da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
4511da177e4SLinus Torvalds 		}, {
4521da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4531da177e4SLinus Torvalds 			.vmux   = 2,
4541da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
4551da177e4SLinus Torvalds 		} },
45648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
4571da177e4SLinus Torvalds 	},
4581da177e4SLinus Torvalds 	[CX88_BOARD_KWORLD_LTV883] = {
4591da177e4SLinus Torvalds 		.name           = "KWorld LTV883RF",
460b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_TNF_8831BGFF,
461b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
462b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
463b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4641da177e4SLinus Torvalds 		.input          = { {
4651da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
4661da177e4SLinus Torvalds 			.vmux   = 0,
4671da177e4SLinus Torvalds 			.gpio0  = 0x07f8,
4681da177e4SLinus Torvalds 		}, {
4691da177e4SLinus Torvalds 			.type   = CX88_VMUX_DEBUG,
4701da177e4SLinus Torvalds 			.vmux   = 0,
4711da177e4SLinus Torvalds 			.gpio0  = 0x07f9,  // mono from tuner chip
4721da177e4SLinus Torvalds 		}, {
4731da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4741da177e4SLinus Torvalds 			.vmux   = 1,
4751da177e4SLinus Torvalds 			.gpio0  = 0x000007fa,
4761da177e4SLinus Torvalds 		}, {
4771da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4781da177e4SLinus Torvalds 			.vmux   = 2,
4791da177e4SLinus Torvalds 			.gpio0  = 0x000007fa,
4801da177e4SLinus Torvalds 		} },
4811da177e4SLinus Torvalds 		.radio = {
4821da177e4SLinus Torvalds 			.type   = CX88_RADIO,
4831da177e4SLinus Torvalds 			.gpio0  = 0x000007f8,
4841da177e4SLinus Torvalds 		},
4851da177e4SLinus Torvalds 	},
486a82decf6SMauro Carvalho Chehab 	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
487a82decf6SMauro Carvalho Chehab 		.name		= "DViCO FusionHDTV 3 Gold-Q",
4881da177e4SLinus Torvalds 		.tuner_type     = TUNER_MICROTUNE_4042FI5,
489b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
490b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
491b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4921da177e4SLinus Torvalds 		/*
493399426caSMauro Carvalho Chehab 		 * GPIO[0] resets DT3302 DTV receiver
494399426caSMauro Carvalho Chehab 		 *     0 - reset asserted
495399426caSMauro Carvalho Chehab 		 *     1 - normal operation
496399426caSMauro Carvalho Chehab 		 * GPIO[1] mutes analog audio output connector
497399426caSMauro Carvalho Chehab 		 *     0 - enable selected source
498399426caSMauro Carvalho Chehab 		 *     1 - mute
499399426caSMauro Carvalho Chehab 		 * GPIO[2] selects source for analog audio output connector
500399426caSMauro Carvalho Chehab 		 *     0 - analog audio input connector on tab
501399426caSMauro Carvalho Chehab 		 *     1 - analog DAC output from CX23881 chip
502399426caSMauro Carvalho Chehab 		 * GPIO[3] selects RF input connector on tuner module
503399426caSMauro Carvalho Chehab 		 *     0 - RF connector labeled CABLE
504399426caSMauro Carvalho Chehab 		 *     1 - RF connector labeled ANT
505399426caSMauro Carvalho Chehab 		 * GPIO[4] selects high RF for QAM256 mode
506399426caSMauro Carvalho Chehab 		 *     0 - normal RF
507399426caSMauro Carvalho Chehab 		 *     1 - high RF
5081da177e4SLinus Torvalds 		 */
5091da177e4SLinus Torvalds 		.input          = { {
5101da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
5111da177e4SLinus Torvalds 			.vmux   = 0,
5121da177e4SLinus Torvalds 			.gpio0	= 0x0f0d,
5131da177e4SLinus Torvalds 		}, {
5141da177e4SLinus Torvalds 			.type   = CX88_VMUX_CABLE,
5151da177e4SLinus Torvalds 			.vmux   = 0,
5161da177e4SLinus Torvalds 			.gpio0	= 0x0f05,
5171da177e4SLinus Torvalds 		}, {
5181da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
5191da177e4SLinus Torvalds 			.vmux   = 1,
5201da177e4SLinus Torvalds 			.gpio0	= 0x0f00,
5211da177e4SLinus Torvalds 		}, {
5221da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
5231da177e4SLinus Torvalds 			.vmux   = 2,
5241da177e4SLinus Torvalds 			.gpio0	= 0x0f00,
5251da177e4SLinus Torvalds 		} },
52648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5271da177e4SLinus Torvalds 	},
5281da177e4SLinus Torvalds 	[CX88_BOARD_HAUPPAUGE_DVB_T1] = {
5291da177e4SLinus Torvalds 		.name           = "Hauppauge Nova-T DVB-T",
530c39ba330SHans Verkuil 		.tuner_type     = UNSET,
531b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
532b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
533b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5341da177e4SLinus Torvalds 		.input          = { {
5351da177e4SLinus Torvalds 			.type   = CX88_VMUX_DVB,
5361da177e4SLinus Torvalds 			.vmux   = 0,
5371da177e4SLinus Torvalds 		} },
53848d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5391da177e4SLinus Torvalds 	},
5401da177e4SLinus Torvalds 	[CX88_BOARD_CONEXANT_DVB_T1] = {
5411da177e4SLinus Torvalds 		.name           = "Conexant DVB-T reference design",
542c39ba330SHans Verkuil 		.tuner_type     = UNSET,
543b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
544b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
545b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5461da177e4SLinus Torvalds 		.input          = { {
5471da177e4SLinus Torvalds 			.type   = CX88_VMUX_DVB,
5481da177e4SLinus Torvalds 			.vmux   = 0,
5491da177e4SLinus Torvalds 		} },
55048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5511da177e4SLinus Torvalds 	},
5521da177e4SLinus Torvalds 	[CX88_BOARD_PROVIDEO_PV259] = {
5531da177e4SLinus Torvalds 		.name		= "Provideo PV259",
5541da177e4SLinus Torvalds 		.tuner_type     = TUNER_PHILIPS_FQ1216ME,
555b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
556b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
557b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5581da177e4SLinus Torvalds 		.input          = { {
5591da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
5601da177e4SLinus Torvalds 			.vmux   = 0,
5617b27d45bSRicardo Cerqueira 			.audioroute = 1,
5621da177e4SLinus Torvalds 		} },
56348d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
5641da177e4SLinus Torvalds 	},
5651da177e4SLinus Torvalds 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
566a82decf6SMauro Carvalho Chehab 		.name           = "DViCO FusionHDTV DVB-T Plus",
567c39ba330SHans Verkuil 		.tuner_type     = UNSET, /* No analog tuner */
568b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
569b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
570b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5711da177e4SLinus Torvalds 		.input          = { {
5721da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
5731da177e4SLinus Torvalds 			.vmux   = 1,
5741da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
5751da177e4SLinus Torvalds 		}, {
5761da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
5771da177e4SLinus Torvalds 			.vmux   = 2,
5781da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
5791da177e4SLinus Torvalds 		} },
58048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5811da177e4SLinus Torvalds 	},
5821da177e4SLinus Torvalds 	[CX88_BOARD_DNTV_LIVE_DVB_T] = {
5831da177e4SLinus Torvalds 		.name		= "digitalnow DNTV Live! DVB-T",
584c39ba330SHans Verkuil 		.tuner_type     = UNSET,
585b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
586b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
587b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5881da177e4SLinus Torvalds 		.input		= { {
5891da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
5901da177e4SLinus Torvalds 			.vmux   = 1,
5911da177e4SLinus Torvalds 			.gpio0  = 0x00000700,
5921da177e4SLinus Torvalds 			.gpio2  = 0x00000101,
5931da177e4SLinus Torvalds 		}, {
5941da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
5951da177e4SLinus Torvalds 			.vmux   = 2,
5961da177e4SLinus Torvalds 			.gpio0  = 0x00000700,
5971da177e4SLinus Torvalds 			.gpio2  = 0x00000101,
5981da177e4SLinus Torvalds 		} },
59948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
6001da177e4SLinus Torvalds 	},
6011da177e4SLinus Torvalds 	[CX88_BOARD_PCHDTV_HD3000] = {
6021da177e4SLinus Torvalds 		.name           = "pcHDTV HD3000 HDTV",
6039175b854STrent Piepho 		.tuner_type     = TUNER_THOMSON_DTT761X,
604b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
605b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
606b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
607e4f5c82aSMauro Carvalho Chehab 		.tda9887_conf   = TDA9887_PRESENT,
60819dc74b7STrent Piepho 		/* GPIO[2] = audio source for analog audio out connector
60919dc74b7STrent Piepho 		 *  0 = analog audio input connector
61019dc74b7STrent Piepho 		 *  1 = CX88 audio DACs
61119dc74b7STrent Piepho 		 *
61219dc74b7STrent Piepho 		 * GPIO[7] = input to CX88's audio/chroma ADC
61319dc74b7STrent Piepho 		 *  0 = FM 10.7 MHz IF
61419dc74b7STrent Piepho 		 *  1 = Sound 4.5 MHz IF
61519dc74b7STrent Piepho 		 *
61619dc74b7STrent Piepho 		 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
61719dc74b7STrent Piepho 		 *
61819dc74b7STrent Piepho 		 * GPIO[16] = Remote control input
61919dc74b7STrent Piepho 		 */
6201da177e4SLinus Torvalds 		.input          = { {
6211da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
6221da177e4SLinus Torvalds 			.vmux   = 0,
6231da177e4SLinus Torvalds 			.gpio0  = 0x00008484,
6241da177e4SLinus Torvalds 		}, {
6251da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
6261da177e4SLinus Torvalds 			.vmux   = 1,
6271da177e4SLinus Torvalds 			.gpio0  = 0x00008400,
6281da177e4SLinus Torvalds 		}, {
6291da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
6301da177e4SLinus Torvalds 			.vmux   = 2,
6311da177e4SLinus Torvalds 			.gpio0  = 0x00008400,
6321da177e4SLinus Torvalds 		} },
6331da177e4SLinus Torvalds 		.radio = {
6341da177e4SLinus Torvalds 			.type   = CX88_RADIO,
63519dc74b7STrent Piepho 			.gpio0  = 0x00008404,
6361da177e4SLinus Torvalds 		},
63748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
6381da177e4SLinus Torvalds 	},
6391da177e4SLinus Torvalds 	[CX88_BOARD_HAUPPAUGE_ROSLYN] = {
6401da177e4SLinus Torvalds 		// entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
6411da177e4SLinus Torvalds 		// GPIO values obtained from regspy, courtesy Sean Covel
6421da177e4SLinus Torvalds 		.name           = "Hauppauge WinTV 28xxx (Roslyn) models",
6431da177e4SLinus Torvalds 		.tuner_type     = UNSET,
644b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
645b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
646b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
6471da177e4SLinus Torvalds 		.input          = { {
6481da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
6491da177e4SLinus Torvalds 			.vmux   = 0,
6500345c387SSteven Toth 			.gpio0  = 0xed1a,
6511da177e4SLinus Torvalds 			.gpio2  = 0x00ff,
6521da177e4SLinus Torvalds 		}, {
6531da177e4SLinus Torvalds 			.type   = CX88_VMUX_DEBUG,
6541da177e4SLinus Torvalds 			.vmux   = 0,
6550345c387SSteven Toth 			.gpio0  = 0xff01,
6561da177e4SLinus Torvalds 		}, {
6571da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
6581da177e4SLinus Torvalds 			.vmux   = 1,
6591da177e4SLinus Torvalds 			.gpio0  = 0xff02,
6601da177e4SLinus Torvalds 		}, {
6611da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
6621da177e4SLinus Torvalds 			.vmux   = 2,
6631da177e4SLinus Torvalds 			.gpio0  = 0xed92,
6641da177e4SLinus Torvalds 			.gpio2  = 0x00ff,
6651da177e4SLinus Torvalds 		} },
6661da177e4SLinus Torvalds 		.radio = {
6671da177e4SLinus Torvalds 			 .type   = CX88_RADIO,
6681da177e4SLinus Torvalds 			 .gpio0  = 0xed96,
6691da177e4SLinus Torvalds 			 .gpio2  = 0x00ff,
6701da177e4SLinus Torvalds 		 },
67148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
6721da177e4SLinus Torvalds 	},
6731da177e4SLinus Torvalds 	[CX88_BOARD_DIGITALLOGIC_MEC] = {
6741da177e4SLinus Torvalds 		.name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
675b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
676b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
677b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
678b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
6791da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
6801da177e4SLinus Torvalds 		.input          = { {
6811da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
6821da177e4SLinus Torvalds 			.vmux   = 0,
683b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d80,
6847b27d45bSRicardo Cerqueira 			.audioroute = 1,
6851da177e4SLinus Torvalds 		}, {
6861da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
6871da177e4SLinus Torvalds 			.vmux   = 1,
688b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d76,
6897b27d45bSRicardo Cerqueira 			.audioroute = 1,
6901da177e4SLinus Torvalds 		}, {
6911da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
6921da177e4SLinus Torvalds 			.vmux   = 2,
693b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d76,
6947b27d45bSRicardo Cerqueira 			.audioroute = 1,
6951da177e4SLinus Torvalds 		} },
6961da177e4SLinus Torvalds 		.radio = {
6971da177e4SLinus Torvalds 			.type   = CX88_RADIO,
698b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d00,
6997b27d45bSRicardo Cerqueira 			.audioroute = 1,
7001da177e4SLinus Torvalds 		},
70148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
7021da177e4SLinus Torvalds 	},
7031da177e4SLinus Torvalds 	[CX88_BOARD_IODATA_GVBCTV7E] = {
7041da177e4SLinus Torvalds 		.name           = "IODATA GV/BCTV7E",
7051da177e4SLinus Torvalds 		.tuner_type     = TUNER_PHILIPS_FQ1286,
706b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
707b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
708b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
7091da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
7101da177e4SLinus Torvalds 		.input          = { {
7111da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
7121da177e4SLinus Torvalds 			.vmux   = 1,
7131da177e4SLinus Torvalds 			.gpio1  = 0x0000e03f,
7141da177e4SLinus Torvalds 		}, {
7151da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
7161da177e4SLinus Torvalds 			.vmux   = 2,
7171da177e4SLinus Torvalds 			.gpio1  = 0x0000e07f,
7181da177e4SLinus Torvalds 		}, {
7191da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
7201da177e4SLinus Torvalds 			.vmux   = 3,
7211da177e4SLinus Torvalds 			.gpio1  = 0x0000e07f,
7221da177e4SLinus Torvalds 		} }
7231da177e4SLinus Torvalds 	},
724239df2e2SManuel Capinha 	[CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
725239df2e2SManuel Capinha 		.name           = "PixelView PlayTV Ultra Pro (Stereo)",
726b45009b0SMauro Carvalho Chehab 		/* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
727b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
728c5287ba1SMauro Carvalho Chehab 		.radio_type     = UNSET,
729c5287ba1SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
730c5287ba1SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
731399426caSMauro Carvalho Chehab 		/*
732399426caSMauro Carvalho Chehab 		 * Some variants use a tda9874 and so need the
733399426caSMauro Carvalho Chehab 		 * tvaudio module.
734399426caSMauro Carvalho Chehab 		 */
735facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_TVAUDIO,
736239df2e2SManuel Capinha 		.input          = { {
737239df2e2SManuel Capinha 			.type   = CX88_VMUX_TELEVISION,
738239df2e2SManuel Capinha 			.vmux   = 0,
739b45009b0SMauro Carvalho Chehab 			.gpio0  = 0xbf61,  /* internal decoder */
740239df2e2SManuel Capinha 		}, {
741239df2e2SManuel Capinha 			.type   = CX88_VMUX_COMPOSITE1,
742239df2e2SManuel Capinha 			.vmux   = 1,
743239df2e2SManuel Capinha 			.gpio0	= 0xbf63,
744239df2e2SManuel Capinha 		}, {
745239df2e2SManuel Capinha 			.type   = CX88_VMUX_SVIDEO,
746239df2e2SManuel Capinha 			.vmux   = 2,
747239df2e2SManuel Capinha 			.gpio0	= 0xbf63,
748239df2e2SManuel Capinha 		} },
749239df2e2SManuel Capinha 		.radio = {
750239df2e2SManuel Capinha 			 .type  = CX88_RADIO,
751239df2e2SManuel Capinha 			 .gpio0 = 0xbf60,
752239df2e2SManuel Capinha 		 },
753239df2e2SManuel Capinha 	},
754b45009b0SMauro Carvalho Chehab 	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
755a82decf6SMauro Carvalho Chehab 		.name           = "DViCO FusionHDTV 3 Gold-T",
75683ac8722SMichael Krufky 		.tuner_type     = TUNER_THOMSON_DTT761X,
757b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
758b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
759b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
760e4f5c82aSMauro Carvalho Chehab 		.tda9887_conf   = TDA9887_PRESENT,
761b45009b0SMauro Carvalho Chehab 		.input          = { {
762b45009b0SMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
763b45009b0SMauro Carvalho Chehab 			.vmux   = 0,
764e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x97ed,
765b45009b0SMauro Carvalho Chehab 		}, {
766b45009b0SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
767b45009b0SMauro Carvalho Chehab 			.vmux   = 1,
768e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x97e9,
769b45009b0SMauro Carvalho Chehab 		}, {
770b45009b0SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
771b45009b0SMauro Carvalho Chehab 			.vmux   = 2,
772e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x97e9,
773b45009b0SMauro Carvalho Chehab 		} },
77448d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
775b45009b0SMauro Carvalho Chehab 	},
776a82decf6SMauro Carvalho Chehab 	[CX88_BOARD_ADSTECH_DVB_T_PCI] = {
777a82decf6SMauro Carvalho Chehab 		.name           = "ADS Tech Instant TV DVB-T PCI",
778c39ba330SHans Verkuil 		.tuner_type     = UNSET,
779a82decf6SMauro Carvalho Chehab 		.radio_type     = UNSET,
780a82decf6SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
781a82decf6SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
782a82decf6SMauro Carvalho Chehab 		.input          = { {
783a82decf6SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
784a82decf6SMauro Carvalho Chehab 			.vmux   = 1,
785a82decf6SMauro Carvalho Chehab 			.gpio0  = 0x0700,
786a82decf6SMauro Carvalho Chehab 			.gpio2  = 0x0101,
787a82decf6SMauro Carvalho Chehab 		}, {
788a82decf6SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
789a82decf6SMauro Carvalho Chehab 			.vmux   = 2,
790a82decf6SMauro Carvalho Chehab 			.gpio0  = 0x0700,
791a82decf6SMauro Carvalho Chehab 			.gpio2  = 0x0101,
792a82decf6SMauro Carvalho Chehab 		} },
79348d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
794a82decf6SMauro Carvalho Chehab 	},
795e057ee11SMichael Krufky 	[CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
796e057ee11SMichael Krufky 		.name           = "TerraTec Cinergy 1400 DVB-T",
797c39ba330SHans Verkuil 		.tuner_type     = UNSET,
798e057ee11SMichael Krufky 		.input          = { {
799e057ee11SMichael Krufky 			.type   = CX88_VMUX_DVB,
800e057ee11SMichael Krufky 			.vmux   = 0,
80105eda249SHeiko Baums 		}, {
80205eda249SHeiko Baums 			.type   = CX88_VMUX_COMPOSITE1,
80305eda249SHeiko Baums 			.vmux   = 2,
80405eda249SHeiko Baums 		}, {
80505eda249SHeiko Baums 			.type   = CX88_VMUX_SVIDEO,
80605eda249SHeiko Baums 			.vmux   = 2,
807e057ee11SMichael Krufky 		} },
80848d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
809e057ee11SMichael Krufky 	},
8109fef07caSMichael Krufky 	[CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
8119fef07caSMichael Krufky 		.name           = "DViCO FusionHDTV 5 Gold",
8129c26c8b1SMichael Krufky 		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
8139fef07caSMichael Krufky 		.radio_type     = UNSET,
8149fef07caSMichael Krufky 		.tuner_addr	= ADDR_UNSET,
8159fef07caSMichael Krufky 		.radio_addr	= ADDR_UNSET,
816e52e98a7SMauro Carvalho Chehab 		.tda9887_conf   = TDA9887_PRESENT,
8179fef07caSMichael Krufky 		.input          = { {
8189fef07caSMichael Krufky 			.type   = CX88_VMUX_TELEVISION,
8199fef07caSMichael Krufky 			.vmux   = 0,
820e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x87fd,
8219fef07caSMichael Krufky 		}, {
8229fef07caSMichael Krufky 			.type   = CX88_VMUX_COMPOSITE1,
8239fef07caSMichael Krufky 			.vmux   = 1,
824e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x87f9,
8259fef07caSMichael Krufky 		}, {
8269fef07caSMichael Krufky 			.type   = CX88_VMUX_SVIDEO,
8279fef07caSMichael Krufky 			.vmux   = 2,
828e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x87f9,
8299fef07caSMichael Krufky 		} },
83048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
8319fef07caSMichael Krufky 	},
832d45170edSNickolay V. Shmyrev 	[CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
833d45170edSNickolay V. Shmyrev 		.name           = "AverMedia UltraTV Media Center PCI 550",
834d45170edSNickolay V. Shmyrev 		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
835d45170edSNickolay V. Shmyrev 		.radio_type     = UNSET,
836d45170edSNickolay V. Shmyrev 		.tuner_addr     = ADDR_UNSET,
837d45170edSNickolay V. Shmyrev 		.radio_addr     = ADDR_UNSET,
838d45170edSNickolay V. Shmyrev 		.tda9887_conf   = TDA9887_PRESENT,
839d45170edSNickolay V. Shmyrev 		.input          = { {
840d45170edSNickolay V. Shmyrev 			.type   = CX88_VMUX_COMPOSITE1,
841d45170edSNickolay V. Shmyrev 			.vmux   = 0,
842d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cd73,
8437b27d45bSRicardo Cerqueira 			.audioroute = 1,
844d45170edSNickolay V. Shmyrev 		}, {
845d45170edSNickolay V. Shmyrev 			.type   = CX88_VMUX_SVIDEO,
846d45170edSNickolay V. Shmyrev 			.vmux   = 1,
847d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cd73,
8487b27d45bSRicardo Cerqueira 			.audioroute = 1,
849d45170edSNickolay V. Shmyrev 		}, {
850d45170edSNickolay V. Shmyrev 			.type   = CX88_VMUX_TELEVISION,
851d45170edSNickolay V. Shmyrev 			.vmux   = 3,
852d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cdb3,
8537b27d45bSRicardo Cerqueira 			.audioroute = 1,
854d45170edSNickolay V. Shmyrev 		} },
855d45170edSNickolay V. Shmyrev 		.radio = {
856d45170edSNickolay V. Shmyrev 			.type   = CX88_RADIO,
857d45170edSNickolay V. Shmyrev 			.vmux   = 2,
858d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cdf3,
8597b27d45bSRicardo Cerqueira 			.audioroute = 1,
860d45170edSNickolay V. Shmyrev 		},
8615b26c82fSMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
862d45170edSNickolay V. Shmyrev 	},
8630bcc37c3SAlexander Wold 	[CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
8640bcc37c3SAlexander Wold 		 /* Alexander Wold <awold@bigfoot.com> */
8650bcc37c3SAlexander Wold 		 .name           = "Kworld V-Stream Xpert DVD",
8660bcc37c3SAlexander Wold 		 .tuner_type     = UNSET,
8670bcc37c3SAlexander Wold 		 .input          = { {
8680bcc37c3SAlexander Wold 			 .type   = CX88_VMUX_COMPOSITE1,
8690bcc37c3SAlexander Wold 			 .vmux   = 1,
8700bcc37c3SAlexander Wold 			 .gpio0  = 0x03000000,
8710bcc37c3SAlexander Wold 			 .gpio1  = 0x01000000,
8720bcc37c3SAlexander Wold 			 .gpio2  = 0x02000000,
8730bcc37c3SAlexander Wold 			 .gpio3  = 0x00100000,
8740bcc37c3SAlexander Wold 		 }, {
8750bcc37c3SAlexander Wold 			 .type   = CX88_VMUX_SVIDEO,
8760bcc37c3SAlexander Wold 			 .vmux   = 2,
8770bcc37c3SAlexander Wold 			 .gpio0  = 0x03000000,
8780bcc37c3SAlexander Wold 			 .gpio1  = 0x01000000,
8790bcc37c3SAlexander Wold 			 .gpio2  = 0x02000000,
8800bcc37c3SAlexander Wold 			 .gpio3  = 0x00100000,
8810bcc37c3SAlexander Wold 		 } },
8820bcc37c3SAlexander Wold 	},
883e976f937SKirk Lapray 	[CX88_BOARD_ATI_HDTVWONDER] = {
884e976f937SKirk Lapray 		.name           = "ATI HDTV Wonder",
885e976f937SKirk Lapray 		.tuner_type     = TUNER_PHILIPS_TUV1236D,
886e976f937SKirk Lapray 		.radio_type     = UNSET,
887e976f937SKirk Lapray 		.tuner_addr	= ADDR_UNSET,
888e976f937SKirk Lapray 		.radio_addr	= ADDR_UNSET,
889e976f937SKirk Lapray 		.input          = { {
890e976f937SKirk Lapray 			.type   = CX88_VMUX_TELEVISION,
891e976f937SKirk Lapray 			.vmux   = 0,
892e976f937SKirk Lapray 			.gpio0  = 0x00000ff7,
893e976f937SKirk Lapray 			.gpio1  = 0x000000ff,
894e976f937SKirk Lapray 			.gpio2  = 0x00000001,
895e976f937SKirk Lapray 			.gpio3  = 0x00000000,
896e976f937SKirk Lapray 		}, {
897e976f937SKirk Lapray 			.type   = CX88_VMUX_COMPOSITE1,
898e976f937SKirk Lapray 			.vmux   = 1,
899e976f937SKirk Lapray 			.gpio0  = 0x00000ffe,
900e976f937SKirk Lapray 			.gpio1  = 0x000000ff,
901e976f937SKirk Lapray 			.gpio2  = 0x00000001,
902e976f937SKirk Lapray 			.gpio3  = 0x00000000,
903e976f937SKirk Lapray 		}, {
904e976f937SKirk Lapray 			.type   = CX88_VMUX_SVIDEO,
905e976f937SKirk Lapray 			.vmux   = 2,
906e976f937SKirk Lapray 			.gpio0  = 0x00000ffe,
907e976f937SKirk Lapray 			.gpio1  = 0x000000ff,
908e976f937SKirk Lapray 			.gpio2  = 0x00000001,
909e976f937SKirk Lapray 			.gpio3  = 0x00000000,
910e976f937SKirk Lapray 		} },
91148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
912e976f937SKirk Lapray 	},
9132b5200a7SDavid Shirley 	[CX88_BOARD_WINFAST_DTV1000] = {
9142b5200a7SDavid Shirley 		.name           = "WinFast DTV1000-T",
915c39ba330SHans Verkuil 		.tuner_type     = UNSET,
9162b5200a7SDavid Shirley 		.radio_type     = UNSET,
9172b5200a7SDavid Shirley 		.tuner_addr	= ADDR_UNSET,
9182b5200a7SDavid Shirley 		.radio_addr	= ADDR_UNSET,
9192b5200a7SDavid Shirley 		.input          = { {
9202b5200a7SDavid Shirley 			.type   = CX88_VMUX_DVB,
9212b5200a7SDavid Shirley 			.vmux   = 0,
922e8f4e752SJean Delvare 		}, {
923e8f4e752SJean Delvare 			.type   = CX88_VMUX_COMPOSITE1,
924e8f4e752SJean Delvare 			.vmux   = 1,
925e8f4e752SJean Delvare 		}, {
926e8f4e752SJean Delvare 			.type   = CX88_VMUX_SVIDEO,
927e8f4e752SJean Delvare 			.vmux   = 2,
9282b5200a7SDavid Shirley 		} },
92948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
9302b5200a7SDavid Shirley 	},
9317418f346SLubomir Bulej 	[CX88_BOARD_AVERTV_303] = {
9327418f346SLubomir Bulej 		.name           = "AVerTV 303 (M126)",
9337418f346SLubomir Bulej 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
9347418f346SLubomir Bulej 		.radio_type     = UNSET,
9357418f346SLubomir Bulej 		.tuner_addr	= ADDR_UNSET,
9367418f346SLubomir Bulej 		.radio_addr	= ADDR_UNSET,
9377418f346SLubomir Bulej 		.tda9887_conf   = TDA9887_PRESENT,
9387418f346SLubomir Bulej 		.input          = { {
9397418f346SLubomir Bulej 			.type   = CX88_VMUX_TELEVISION,
9407418f346SLubomir Bulej 			.vmux   = 0,
9417418f346SLubomir Bulej 			.gpio0  = 0x00ff,
9427418f346SLubomir Bulej 			.gpio1  = 0xe09f,
9437418f346SLubomir Bulej 			.gpio2  = 0x0010,
9447418f346SLubomir Bulej 			.gpio3  = 0x0000,
9457418f346SLubomir Bulej 		}, {
9467418f346SLubomir Bulej 			.type   = CX88_VMUX_COMPOSITE1,
9477418f346SLubomir Bulej 			.vmux   = 1,
9487418f346SLubomir Bulej 			.gpio0  = 0x00ff,
9497418f346SLubomir Bulej 			.gpio1  = 0xe05f,
9507418f346SLubomir Bulej 			.gpio2  = 0x0010,
9517418f346SLubomir Bulej 			.gpio3  = 0x0000,
9527418f346SLubomir Bulej 		}, {
9537418f346SLubomir Bulej 			.type   = CX88_VMUX_SVIDEO,
9547418f346SLubomir Bulej 			.vmux   = 2,
9557418f346SLubomir Bulej 			.gpio0  = 0x00ff,
9567418f346SLubomir Bulej 			.gpio1  = 0xe05f,
9577418f346SLubomir Bulej 			.gpio2  = 0x0010,
9587418f346SLubomir Bulej 			.gpio3  = 0x0000,
9597418f346SLubomir Bulej 		} },
9607418f346SLubomir Bulej 	},
9610fa14aa6SSteven Toth 	[CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
9620fa14aa6SSteven Toth 		.name		= "Hauppauge Nova-S-Plus DVB-S",
963c39ba330SHans Verkuil 		.tuner_type	= UNSET,
9640fa14aa6SSteven Toth 		.radio_type	= UNSET,
9650fa14aa6SSteven Toth 		.tuner_addr	= ADDR_UNSET,
9660fa14aa6SSteven Toth 		.radio_addr	= ADDR_UNSET,
967facd2366SHans Verkuil 		.audio_chip	= CX88_AUDIO_WM8775,
9686951803cSLawrence Rust 		.i2sinputcntl   = 2,
9690fa14aa6SSteven Toth 		.input		= { {
9700fa14aa6SSteven Toth 			.type	= CX88_VMUX_DVB,
9710fa14aa6SSteven Toth 			.vmux	= 0,
972fcb97573Slawrence rust 			/* 2: Line-In */
973fcb97573Slawrence rust 			.audioroute = 2,
9740fa14aa6SSteven Toth 		}, {
9750fa14aa6SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
9760fa14aa6SSteven Toth 			.vmux	= 1,
977fcb97573Slawrence rust 			/* 2: Line-In */
978fcb97573Slawrence rust 			.audioroute = 2,
9790fa14aa6SSteven Toth 		}, {
9800fa14aa6SSteven Toth 			.type	= CX88_VMUX_SVIDEO,
9810fa14aa6SSteven Toth 			.vmux	= 2,
982fcb97573Slawrence rust 			/* 2: Line-In */
983fcb97573Slawrence rust 			.audioroute = 2,
9840fa14aa6SSteven Toth 		} },
98548d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
9860fa14aa6SSteven Toth 	},
9870fa14aa6SSteven Toth 	[CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
9880fa14aa6SSteven Toth 		.name		= "Hauppauge Nova-SE2 DVB-S",
989c39ba330SHans Verkuil 		.tuner_type	= UNSET,
9900fa14aa6SSteven Toth 		.radio_type	= UNSET,
9910fa14aa6SSteven Toth 		.tuner_addr	= ADDR_UNSET,
9920fa14aa6SSteven Toth 		.radio_addr	= ADDR_UNSET,
9930fa14aa6SSteven Toth 		.input		= { {
9940fa14aa6SSteven Toth 			.type	= CX88_VMUX_DVB,
9950fa14aa6SSteven Toth 			.vmux	= 0,
9960fa14aa6SSteven Toth 		} },
99748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
9980fa14aa6SSteven Toth 	},
9990e0351e3SVadim Catana 	[CX88_BOARD_KWORLD_DVBS_100] = {
10000e0351e3SVadim Catana 		.name		= "KWorld DVB-S 100",
1001c39ba330SHans Verkuil 		.tuner_type	= UNSET,
10020e0351e3SVadim Catana 		.radio_type	= UNSET,
10030e0351e3SVadim Catana 		.tuner_addr	= ADDR_UNSET,
10040e0351e3SVadim Catana 		.radio_addr	= ADDR_UNSET,
1005facd2366SHans Verkuil 		.audio_chip = CX88_AUDIO_WM8775,
10060e0351e3SVadim Catana 		.input		= { {
10070e0351e3SVadim Catana 			.type	= CX88_VMUX_DVB,
10080e0351e3SVadim Catana 			.vmux	= 0,
100946e67acdSMauro Carvalho Chehab 			/* 2: Line-In */
101046e67acdSMauro Carvalho Chehab 			.audioroute = 2,
10110e0351e3SVadim Catana 		}, {
10120e0351e3SVadim Catana 			.type	= CX88_VMUX_COMPOSITE1,
10130e0351e3SVadim Catana 			.vmux	= 1,
101446e67acdSMauro Carvalho Chehab 			/* 2: Line-In */
101546e67acdSMauro Carvalho Chehab 			.audioroute = 2,
10160e0351e3SVadim Catana 		}, {
10170e0351e3SVadim Catana 			.type	= CX88_VMUX_SVIDEO,
10180e0351e3SVadim Catana 			.vmux	= 2,
101946e67acdSMauro Carvalho Chehab 			/* 2: Line-In */
102046e67acdSMauro Carvalho Chehab 			.audioroute = 2,
10210e0351e3SVadim Catana 		} },
102248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
10230e0351e3SVadim Catana 	},
1024611900c1SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR1100] = {
1025611900c1SSteven Toth 		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
1026611900c1SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1027611900c1SSteven Toth 		.radio_type	= UNSET,
1028611900c1SSteven Toth 		.tuner_addr	= ADDR_UNSET,
1029611900c1SSteven Toth 		.radio_addr	= ADDR_UNSET,
1030611900c1SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1031611900c1SSteven Toth 		.input		= { {
1032611900c1SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
1033611900c1SSteven Toth 			.vmux   = 0,
1034611900c1SSteven Toth 		}, {
1035611900c1SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
1036611900c1SSteven Toth 			.vmux	= 1,
1037611900c1SSteven Toth 		}, {
1038611900c1SSteven Toth 			.type	= CX88_VMUX_SVIDEO,
1039611900c1SSteven Toth 			.vmux	= 2,
1040611900c1SSteven Toth 		} },
1041611900c1SSteven Toth 		/* fixme: Add radio support */
104248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1043611900c1SSteven Toth 	},
1044611900c1SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
1045611900c1SSteven Toth 		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
1046611900c1SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1047611900c1SSteven Toth 		.radio_type	= UNSET,
1048611900c1SSteven Toth 		.tuner_addr	= ADDR_UNSET,
1049611900c1SSteven Toth 		.radio_addr	= ADDR_UNSET,
1050611900c1SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1051611900c1SSteven Toth 		.input		= { {
1052611900c1SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
1053611900c1SSteven Toth 			.vmux   = 0,
1054611900c1SSteven Toth 		}, {
1055611900c1SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
1056611900c1SSteven Toth 			.vmux	= 1,
1057611900c1SSteven Toth 		} },
1058611900c1SSteven Toth 		/* fixme: Add radio support */
105948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1060611900c1SSteven Toth 	},
1061fc40b261SChris Pascoe 	[CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
1062fc40b261SChris Pascoe 		.name           = "digitalnow DNTV Live! DVB-T Pro",
1063fc40b261SChris Pascoe 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1064fc40b261SChris Pascoe 		.radio_type     = UNSET,
1065fc40b261SChris Pascoe 		.tuner_addr	= ADDR_UNSET,
1066fc40b261SChris Pascoe 		.radio_addr	= ADDR_UNSET,
1067fc40b261SChris Pascoe 		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1068fc40b261SChris Pascoe 				  TDA9887_PORT2_ACTIVE,
1069fc40b261SChris Pascoe 		.input          = { {
1070fc40b261SChris Pascoe 			.type   = CX88_VMUX_TELEVISION,
1071fc40b261SChris Pascoe 			.vmux   = 0,
1072fc40b261SChris Pascoe 			.gpio0  = 0xf80808,
1073fc40b261SChris Pascoe 		}, {
1074fc40b261SChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
1075fc40b261SChris Pascoe 			.vmux   = 1,
1076fc40b261SChris Pascoe 			.gpio0	= 0xf80808,
1077fc40b261SChris Pascoe 		}, {
1078fc40b261SChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
1079fc40b261SChris Pascoe 			.vmux   = 2,
1080fc40b261SChris Pascoe 			.gpio0	= 0xf80808,
1081fc40b261SChris Pascoe 		} },
1082fc40b261SChris Pascoe 		.radio = {
1083fc40b261SChris Pascoe 			 .type  = CX88_RADIO,
1084fc40b261SChris Pascoe 			 .gpio0 = 0xf80808,
1085fc40b261SChris Pascoe 		},
108648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1087fc40b261SChris Pascoe 	},
1088f39624fdSManenti Marco 	[CX88_BOARD_KWORLD_DVB_T_CX22702] = {
1089f39624fdSManenti Marco 		/* Kworld V-stream Xpert DVB-T with Thomson tuner */
1090f39624fdSManenti Marco 		/* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */
1091f39624fdSManenti Marco 		/* Manenti Marco <marco_manenti@colman.it> */
1092f39624fdSManenti Marco 		.name           = "KWorld/VStream XPert DVB-T with cx22702",
1093c39ba330SHans Verkuil 		.tuner_type     = UNSET,
1094f39624fdSManenti Marco 		.radio_type     = UNSET,
1095f39624fdSManenti Marco 		.tuner_addr	= ADDR_UNSET,
1096f39624fdSManenti Marco 		.radio_addr	= ADDR_UNSET,
1097f39624fdSManenti Marco 		.input          = { {
1098f39624fdSManenti Marco 			.type   = CX88_VMUX_COMPOSITE1,
1099f39624fdSManenti Marco 			.vmux   = 1,
1100f39624fdSManenti Marco 			.gpio0  = 0x0700,
1101f39624fdSManenti Marco 			.gpio2  = 0x0101,
1102f39624fdSManenti Marco 		}, {
1103f39624fdSManenti Marco 			.type   = CX88_VMUX_SVIDEO,
1104f39624fdSManenti Marco 			.vmux   = 2,
1105f39624fdSManenti Marco 			.gpio0  = 0x0700,
1106f39624fdSManenti Marco 			.gpio2  = 0x0101,
1107f39624fdSManenti Marco 		} },
110848d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1109f39624fdSManenti Marco 	},
111043eabb4eSChris Pascoe 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
111143eabb4eSChris Pascoe 		.name           = "DViCO FusionHDTV DVB-T Dual Digital",
1112c39ba330SHans Verkuil 		.tuner_type     = UNSET, /* No analog tuner */
111343eabb4eSChris Pascoe 		.radio_type     = UNSET,
111443eabb4eSChris Pascoe 		.tuner_addr	= ADDR_UNSET,
111543eabb4eSChris Pascoe 		.radio_addr	= ADDR_UNSET,
111643eabb4eSChris Pascoe 		.input          = { {
111743eabb4eSChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
111843eabb4eSChris Pascoe 			.vmux   = 1,
1119d536e9c4SChris Pascoe 			.gpio0  = 0x000067df,
112043eabb4eSChris Pascoe 		 }, {
112143eabb4eSChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
112243eabb4eSChris Pascoe 			.vmux   = 2,
1123d536e9c4SChris Pascoe 			.gpio0  = 0x000067df,
112443eabb4eSChris Pascoe 		} },
112548d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
112643eabb4eSChris Pascoe 	},
112744256de1SMichael Krufky 	[CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
112844256de1SMichael Krufky 		.name           = "KWorld HardwareMpegTV XPert",
112944256de1SMichael Krufky 		.tuner_type     = TUNER_PHILIPS_TDA8290,
113044256de1SMichael Krufky 		.radio_type     = UNSET,
113144256de1SMichael Krufky 		.tuner_addr	= ADDR_UNSET,
113244256de1SMichael Krufky 		.radio_addr	= ADDR_UNSET,
113344256de1SMichael Krufky 		.input          = { {
113444256de1SMichael Krufky 			.type   = CX88_VMUX_TELEVISION,
113544256de1SMichael Krufky 			.vmux   = 0,
1136e2798212SMichael Krufky 			.gpio0  = 0x3de2,
113724da4e4bSMichael Krufky 			.gpio2  = 0x00ff,
1138bc53f783SMichael Krufky 		}, {
1139bc53f783SMichael Krufky 			.type   = CX88_VMUX_COMPOSITE1,
1140bc53f783SMichael Krufky 			.vmux   = 1,
1141bc53f783SMichael Krufky 			.gpio0  = 0x3de6,
11427b27d45bSRicardo Cerqueira 			.audioroute = 1,
1143bc53f783SMichael Krufky 		}, {
1144bc53f783SMichael Krufky 			.type   = CX88_VMUX_SVIDEO,
1145bc53f783SMichael Krufky 			.vmux   = 2,
1146bc53f783SMichael Krufky 			.gpio0  = 0x3de6,
11477b27d45bSRicardo Cerqueira 			.audioroute = 1,
114844256de1SMichael Krufky 		} },
1149e2798212SMichael Krufky 		.radio = {
1150e2798212SMichael Krufky 			.type   = CX88_RADIO,
1151e2798212SMichael Krufky 			.gpio0  = 0x3de6,
115224da4e4bSMichael Krufky 			.gpio2  = 0x00ff,
1153e2798212SMichael Krufky 		},
115448d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
115544256de1SMichael Krufky 	},
1156780dfef3SChris Pascoe 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
1157780dfef3SChris Pascoe 		.name           = "DViCO FusionHDTV DVB-T Hybrid",
115891ae3299SMichael Krufky 		.tuner_type     = TUNER_THOMSON_FE6600,
1159780dfef3SChris Pascoe 		.radio_type     = UNSET,
1160780dfef3SChris Pascoe 		.tuner_addr	= ADDR_UNSET,
1161780dfef3SChris Pascoe 		.radio_addr	= ADDR_UNSET,
1162780dfef3SChris Pascoe 		.input          = { {
1163780dfef3SChris Pascoe 			.type   = CX88_VMUX_TELEVISION,
1164780dfef3SChris Pascoe 			.vmux   = 0,
1165780dfef3SChris Pascoe 			.gpio0  = 0x0000a75f,
1166780dfef3SChris Pascoe 		}, {
1167780dfef3SChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
1168780dfef3SChris Pascoe 			.vmux   = 1,
1169780dfef3SChris Pascoe 			.gpio0  = 0x0000a75b,
1170780dfef3SChris Pascoe 		}, {
1171780dfef3SChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
1172780dfef3SChris Pascoe 			.vmux   = 2,
1173780dfef3SChris Pascoe 			.gpio0  = 0x0000a75b,
1174780dfef3SChris Pascoe 		} },
117548d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1176780dfef3SChris Pascoe 	},
1177e142e7c4SMichael Krufky 	[CX88_BOARD_PCHDTV_HD5500] = {
1178e142e7c4SMichael Krufky 		.name           = "pcHDTV HD5500 HDTV",
11799c26c8b1SMichael Krufky 		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
1180e142e7c4SMichael Krufky 		.radio_type     = UNSET,
1181e142e7c4SMichael Krufky 		.tuner_addr	= ADDR_UNSET,
1182e142e7c4SMichael Krufky 		.radio_addr	= ADDR_UNSET,
1183e142e7c4SMichael Krufky 		.tda9887_conf   = TDA9887_PRESENT,
1184e142e7c4SMichael Krufky 		.input          = { {
1185e142e7c4SMichael Krufky 			.type   = CX88_VMUX_TELEVISION,
1186e142e7c4SMichael Krufky 			.vmux   = 0,
1187e142e7c4SMichael Krufky 			.gpio0  = 0x87fd,
1188e142e7c4SMichael Krufky 		}, {
1189e142e7c4SMichael Krufky 			.type   = CX88_VMUX_COMPOSITE1,
1190e142e7c4SMichael Krufky 			.vmux   = 1,
1191e142e7c4SMichael Krufky 			.gpio0  = 0x87f9,
1192e142e7c4SMichael Krufky 		}, {
1193e142e7c4SMichael Krufky 			.type   = CX88_VMUX_SVIDEO,
1194e142e7c4SMichael Krufky 			.vmux   = 2,
1195e142e7c4SMichael Krufky 			.gpio0  = 0x87f9,
1196e142e7c4SMichael Krufky 		} },
119748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1198e142e7c4SMichael Krufky 	},
1199b3038304SValentin Zagura 	[CX88_BOARD_KWORLD_MCE200_DELUXE] = {
1200399426caSMauro Carvalho Chehab 		/*
1201399426caSMauro Carvalho Chehab 		 * FIXME: tested TV input only, disabled composite,
1202399426caSMauro Carvalho Chehab 		 * svideo and radio until they can be tested also.
1203399426caSMauro Carvalho Chehab 		 */
1204b3038304SValentin Zagura 		.name           = "Kworld MCE 200 Deluxe",
1205b3038304SValentin Zagura 		.tuner_type     = TUNER_TENA_9533_DI,
1206b3038304SValentin Zagura 		.radio_type     = UNSET,
1207b3038304SValentin Zagura 		.tda9887_conf   = TDA9887_PRESENT,
1208b3038304SValentin Zagura 		.tuner_addr     = ADDR_UNSET,
1209b3038304SValentin Zagura 		.radio_addr     = ADDR_UNSET,
1210b3038304SValentin Zagura 		.input          = { {
1211b3038304SValentin Zagura 			.type   = CX88_VMUX_TELEVISION,
1212b3038304SValentin Zagura 			.vmux   = 0,
1213b3038304SValentin Zagura 			.gpio0  = 0x0000BDE6
1214b3038304SValentin Zagura 		} },
121548d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
1216b3038304SValentin Zagura 	},
1217a3124622SAngelo Marconi 	[CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
1218a3124622SAngelo Marconi 		/* FIXME: SVideo, Composite and FM inputs are untested */
1219a3124622SAngelo Marconi 		.name           = "PixelView PlayTV P7000",
1220a3124622SAngelo Marconi 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
1221a3124622SAngelo Marconi 		.radio_type     = UNSET,
1222a3124622SAngelo Marconi 		.tuner_addr	= ADDR_UNSET,
1223a3124622SAngelo Marconi 		.radio_addr	= ADDR_UNSET,
1224a3124622SAngelo Marconi 		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1225a3124622SAngelo Marconi 				  TDA9887_PORT2_ACTIVE,
1226a3124622SAngelo Marconi 		.input          = { {
1227a3124622SAngelo Marconi 			.type   = CX88_VMUX_TELEVISION,
1228a3124622SAngelo Marconi 			.vmux   = 0,
1229a3124622SAngelo Marconi 			.gpio0  = 0x5da6,
1230a3124622SAngelo Marconi 		} },
123148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
1232a3124622SAngelo Marconi 	},
1233be4f4519SRicardo Cerqueira 	[CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
1234be4f4519SRicardo Cerqueira 		.name           = "NPG Tech Real TV FM Top 10",
1235be4f4519SRicardo Cerqueira 		.tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */
1236680543c5SRicardo Cerqueira 		.radio_type     = UNSET,
1237680543c5SRicardo Cerqueira 		.tuner_addr	= ADDR_UNSET,
1238680543c5SRicardo Cerqueira 		.radio_addr	= ADDR_UNSET,
1239680543c5SRicardo Cerqueira 		.input          = { {
1240680543c5SRicardo Cerqueira 			.type   = CX88_VMUX_TELEVISION,
1241680543c5SRicardo Cerqueira 			.vmux   = 0,
1242680543c5SRicardo Cerqueira 			.gpio0	= 0x0788,
1243680543c5SRicardo Cerqueira 		}, {
1244680543c5SRicardo Cerqueira 			.type   = CX88_VMUX_COMPOSITE1,
1245680543c5SRicardo Cerqueira 			.vmux   = 1,
1246680543c5SRicardo Cerqueira 			.gpio0	= 0x078b,
1247680543c5SRicardo Cerqueira 		}, {
1248680543c5SRicardo Cerqueira 			.type   = CX88_VMUX_SVIDEO,
1249680543c5SRicardo Cerqueira 			.vmux   = 2,
1250be4f4519SRicardo Cerqueira 			.gpio0	= 0x078b,
1251680543c5SRicardo Cerqueira 		} },
1252680543c5SRicardo Cerqueira 		.radio = {
1253680543c5SRicardo Cerqueira 			 .type  = CX88_RADIO,
1254680543c5SRicardo Cerqueira 			 .gpio0 = 0x074a,
1255680543c5SRicardo Cerqueira 		},
1256680543c5SRicardo Cerqueira 	},
12574bd6e9d9SMalcolm Valentine 	[CX88_BOARD_WINFAST_DTV2000H] = {
12584bd6e9d9SMalcolm Valentine 		.name           = "WinFast DTV2000 H",
12594bd6e9d9SMalcolm Valentine 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
12604bd6e9d9SMalcolm Valentine 		.radio_type     = UNSET,
12614bd6e9d9SMalcolm Valentine 		.tuner_addr     = ADDR_UNSET,
12624bd6e9d9SMalcolm Valentine 		.radio_addr     = ADDR_UNSET,
12634bd6e9d9SMalcolm Valentine 		.tda9887_conf   = TDA9887_PRESENT,
12644bd6e9d9SMalcolm Valentine 		.input          = { {
12654bd6e9d9SMalcolm Valentine 			.type   = CX88_VMUX_TELEVISION,
12664bd6e9d9SMalcolm Valentine 			.vmux   = 0,
12674bd6e9d9SMalcolm Valentine 			.gpio0  = 0x00017304,
12684bd6e9d9SMalcolm Valentine 			.gpio1  = 0x00008203,
12694bd6e9d9SMalcolm Valentine 			.gpio2  = 0x00017304,
12704bd6e9d9SMalcolm Valentine 			.gpio3  = 0x02000000,
12715cff91a0SVincent Pelletier 		}, {
12725cff91a0SVincent Pelletier 			.type   = CX88_VMUX_COMPOSITE1,
12735cff91a0SVincent Pelletier 			.vmux   = 1,
12745cff91a0SVincent Pelletier 			.gpio0  = 0x0001d701,
12755cff91a0SVincent Pelletier 			.gpio1  = 0x0000b207,
12765cff91a0SVincent Pelletier 			.gpio2  = 0x0001d701,
12775cff91a0SVincent Pelletier 			.gpio3  = 0x02000000,
12785cff91a0SVincent Pelletier 		}, {
12795cff91a0SVincent Pelletier 			.type   = CX88_VMUX_COMPOSITE2,
12805cff91a0SVincent Pelletier 			.vmux   = 2,
12815cff91a0SVincent Pelletier 			.gpio0  = 0x0001d503,
12825cff91a0SVincent Pelletier 			.gpio1  = 0x0000b207,
12835cff91a0SVincent Pelletier 			.gpio2  = 0x0001d503,
12845cff91a0SVincent Pelletier 			.gpio3  = 0x02000000,
12855cff91a0SVincent Pelletier 		}, {
12865cff91a0SVincent Pelletier 			.type   = CX88_VMUX_SVIDEO,
12875cff91a0SVincent Pelletier 			.vmux   = 3,
12885cff91a0SVincent Pelletier 			.gpio0  = 0x0001d701,
12895cff91a0SVincent Pelletier 			.gpio1  = 0x0000b207,
12905cff91a0SVincent Pelletier 			.gpio2  = 0x0001d701,
12915cff91a0SVincent Pelletier 			.gpio3  = 0x02000000,
12924bd6e9d9SMalcolm Valentine 		} },
12935cff91a0SVincent Pelletier 		.radio = {
12945cff91a0SVincent Pelletier 			 .type  = CX88_RADIO,
12955cff91a0SVincent Pelletier 			 .gpio0 = 0x00015702,
12965cff91a0SVincent Pelletier 			 .gpio1 = 0x0000f207,
12975cff91a0SVincent Pelletier 			 .gpio2 = 0x00015702,
12985cff91a0SVincent Pelletier 			 .gpio3 = 0x02000000,
12995cff91a0SVincent Pelletier 		},
130048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
13014bd6e9d9SMalcolm Valentine 	},
13024d14c833SVlastimil Labsky 	[CX88_BOARD_WINFAST_DTV2000H_J] = {
13034d14c833SVlastimil Labsky 		.name           = "WinFast DTV2000 H rev. J",
130427b93d8aSMiroslav Slugen 		.tuner_type     = TUNER_PHILIPS_FMD1216MEX_MK3,
13054d14c833SVlastimil Labsky 		.radio_type     = UNSET,
13064d14c833SVlastimil Labsky 		.tuner_addr     = ADDR_UNSET,
13074d14c833SVlastimil Labsky 		.radio_addr     = ADDR_UNSET,
13084d14c833SVlastimil Labsky 		.tda9887_conf   = TDA9887_PRESENT,
13094d14c833SVlastimil Labsky 		.input          = { {
13104d14c833SVlastimil Labsky 			.type   = CX88_VMUX_TELEVISION,
13114d14c833SVlastimil Labsky 			.vmux   = 0,
13124d14c833SVlastimil Labsky 			.gpio0  = 0x00017300,
13134d14c833SVlastimil Labsky 			.gpio1  = 0x00008207,
13144d14c833SVlastimil Labsky 			.gpio2	= 0x00000000,
13154d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13164d14c833SVlastimil Labsky 		}, {
13174d14c833SVlastimil Labsky 			.type   = CX88_VMUX_TELEVISION,
13184d14c833SVlastimil Labsky 			.vmux   = 0,
13194d14c833SVlastimil Labsky 			.gpio0  = 0x00018300,
13204d14c833SVlastimil Labsky 			.gpio1  = 0x0000f207,
13214d14c833SVlastimil Labsky 			.gpio2	= 0x00017304,
13224d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13234d14c833SVlastimil Labsky 		}, {
13244d14c833SVlastimil Labsky 			.type   = CX88_VMUX_COMPOSITE1,
13254d14c833SVlastimil Labsky 			.vmux   = 1,
13264d14c833SVlastimil Labsky 			.gpio0  = 0x00018301,
13274d14c833SVlastimil Labsky 			.gpio1  = 0x0000f207,
13284d14c833SVlastimil Labsky 			.gpio2	= 0x00017304,
13294d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13304d14c833SVlastimil Labsky 		}, {
13314d14c833SVlastimil Labsky 			.type   = CX88_VMUX_SVIDEO,
13324d14c833SVlastimil Labsky 			.vmux   = 2,
13334d14c833SVlastimil Labsky 			.gpio0  = 0x00018301,
13344d14c833SVlastimil Labsky 			.gpio1  = 0x0000f207,
13354d14c833SVlastimil Labsky 			.gpio2	= 0x00017304,
13364d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13374d14c833SVlastimil Labsky 		} },
13384d14c833SVlastimil Labsky 		.radio = {
13394d14c833SVlastimil Labsky 			 .type  = CX88_RADIO,
13404d14c833SVlastimil Labsky 			 .gpio0 = 0x00015702,
13414d14c833SVlastimil Labsky 			 .gpio1 = 0x0000f207,
13424d14c833SVlastimil Labsky 			 .gpio2 = 0x00015702,
13434d14c833SVlastimil Labsky 			 .gpio3 = 0x02000000,
13444d14c833SVlastimil Labsky 		},
13454d14c833SVlastimil Labsky 		.mpeg           = CX88_MPEG_DVB,
13464d14c833SVlastimil Labsky 	},
1347c02a34f4SSaqeb Akhter 	[CX88_BOARD_GENIATECH_DVBS] = {
1348c02a34f4SSaqeb Akhter 		.name          = "Geniatech DVB-S",
1349c39ba330SHans Verkuil 		.tuner_type    = UNSET,
1350c02a34f4SSaqeb Akhter 		.radio_type    = UNSET,
1351c02a34f4SSaqeb Akhter 		.tuner_addr    = ADDR_UNSET,
1352c02a34f4SSaqeb Akhter 		.radio_addr    = ADDR_UNSET,
1353c02a34f4SSaqeb Akhter 		.input  = { {
1354c02a34f4SSaqeb Akhter 			.type  = CX88_VMUX_DVB,
1355c02a34f4SSaqeb Akhter 			.vmux  = 0,
1356c02a34f4SSaqeb Akhter 		}, {
1357c02a34f4SSaqeb Akhter 			.type  = CX88_VMUX_COMPOSITE1,
1358c02a34f4SSaqeb Akhter 			.vmux  = 1,
1359c02a34f4SSaqeb Akhter 		} },
136048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1361c02a34f4SSaqeb Akhter 	},
1362ad10c930SEric Thomas 	[CX88_BOARD_HAUPPAUGE_HVR3000] = {
1363ad10c930SEric Thomas 		.name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
1364ad10c930SEric Thomas 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1365ad10c930SEric Thomas 		.radio_type     = UNSET,
1366ad10c930SEric Thomas 		.tuner_addr     = ADDR_UNSET,
1367ad10c930SEric Thomas 		.radio_addr     = ADDR_UNSET,
1368ad10c930SEric Thomas 		.tda9887_conf   = TDA9887_PRESENT,
1369facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_WM8775,
1370ad10c930SEric Thomas 		.input          = { {
1371ad10c930SEric Thomas 			.type   = CX88_VMUX_TELEVISION,
1372ad10c930SEric Thomas 			.vmux   = 0,
1373ad10c930SEric Thomas 			.gpio0  = 0x84bf,
1374649e13a9SDarron Broad 			/* 1: TV Audio / FM Mono */
1375923ac7f7SDarron Broad 			.audioroute = 1,
1376ad10c930SEric Thomas 		}, {
1377ad10c930SEric Thomas 			.type   = CX88_VMUX_COMPOSITE1,
1378ad10c930SEric Thomas 			.vmux   = 1,
1379ad10c930SEric Thomas 			.gpio0  = 0x84bf,
1380649e13a9SDarron Broad 			/* 2: Line-In */
1381923ac7f7SDarron Broad 			.audioroute = 2,
1382ad10c930SEric Thomas 		}, {
1383ad10c930SEric Thomas 			.type   = CX88_VMUX_SVIDEO,
1384ad10c930SEric Thomas 			.vmux   = 2,
1385ad10c930SEric Thomas 			.gpio0  = 0x84bf,
1386649e13a9SDarron Broad 			/* 2: Line-In */
1387923ac7f7SDarron Broad 			.audioroute = 2,
1388ad10c930SEric Thomas 		} },
138963248f26SDarron Broad 		.radio = {
139063248f26SDarron Broad 			.type   = CX88_RADIO,
139163248f26SDarron Broad 			.gpio0	= 0x84bf,
1392649e13a9SDarron Broad 			/* 4: FM Stereo (untested) */
1393649e13a9SDarron Broad 			.audioroute = 8,
139463248f26SDarron Broad 		},
139576dc82abSSteven Toth 		.mpeg           = CX88_MPEG_DVB,
1396363c35fcSSteven Toth 		.num_frontends	= 2,
1397ad10c930SEric Thomas 	},
1398d1009bd7SPeter Naulls 	[CX88_BOARD_NORWOOD_MICRO] = {
1399d1009bd7SPeter Naulls 		.name           = "Norwood Micro TV Tuner",
1400d1009bd7SPeter Naulls 		.tuner_type     = TUNER_TNF_5335MF,
1401d1009bd7SPeter Naulls 		.radio_type     = UNSET,
1402d1009bd7SPeter Naulls 		.tuner_addr     = ADDR_UNSET,
1403d1009bd7SPeter Naulls 		.radio_addr     = ADDR_UNSET,
1404d1009bd7SPeter Naulls 		.input          = { {
1405d1009bd7SPeter Naulls 			.type   = CX88_VMUX_TELEVISION,
1406d1009bd7SPeter Naulls 			.vmux   = 0,
1407d1009bd7SPeter Naulls 			.gpio0  = 0x0709,
1408d1009bd7SPeter Naulls 		}, {
1409d1009bd7SPeter Naulls 			.type   = CX88_VMUX_COMPOSITE1,
1410d1009bd7SPeter Naulls 			.vmux   = 1,
1411d1009bd7SPeter Naulls 			.gpio0  = 0x070b,
1412d1009bd7SPeter Naulls 		}, {
1413d1009bd7SPeter Naulls 			.type   = CX88_VMUX_SVIDEO,
1414d1009bd7SPeter Naulls 			.vmux   = 2,
1415d1009bd7SPeter Naulls 			.gpio0  = 0x070b,
1416d1009bd7SPeter Naulls 		} },
1417d1009bd7SPeter Naulls 	},
14182acadefaSDavid Bussenschutt 	[CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
14192acadefaSDavid Bussenschutt 		.name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
14202acadefaSDavid Bussenschutt 		.tuner_type     = TUNER_LG_PAL_NEW_TAPC,
14212acadefaSDavid Bussenschutt 		.radio_type     = UNSET,
14222acadefaSDavid Bussenschutt 		.tuner_addr     = ADDR_UNSET,
14232acadefaSDavid Bussenschutt 		.radio_addr     = ADDR_UNSET,
14242acadefaSDavid Bussenschutt 		.input          = { {
14252acadefaSDavid Bussenschutt 			.type   = CX88_VMUX_TELEVISION,
14262acadefaSDavid Bussenschutt 			.vmux   = 0,
14272acadefaSDavid Bussenschutt 			.gpio0  = 0x003fffff,
14282acadefaSDavid Bussenschutt 			.gpio1  = 0x00e00000,
14292acadefaSDavid Bussenschutt 			.gpio2  = 0x003fffff,
14302acadefaSDavid Bussenschutt 			.gpio3  = 0x02000000,
14312acadefaSDavid Bussenschutt 		}, {
14322acadefaSDavid Bussenschutt 			.type   = CX88_VMUX_COMPOSITE1,
14332acadefaSDavid Bussenschutt 			.vmux   = 1,
14342acadefaSDavid Bussenschutt 			.gpio0  = 0x003fffff,
14352acadefaSDavid Bussenschutt 			.gpio1  = 0x00e00000,
14362acadefaSDavid Bussenschutt 			.gpio2  = 0x003fffff,
14372acadefaSDavid Bussenschutt 			.gpio3  = 0x02000000,
14382acadefaSDavid Bussenschutt 		}, {
14392acadefaSDavid Bussenschutt 			.type   = CX88_VMUX_SVIDEO,
14402acadefaSDavid Bussenschutt 			.vmux   = 2,
14412acadefaSDavid Bussenschutt 			.gpio0  = 0x003fffff,
14422acadefaSDavid Bussenschutt 			.gpio1  = 0x00e00000,
14432acadefaSDavid Bussenschutt 			.gpio2  = 0x003fffff,
14442acadefaSDavid Bussenschutt 			.gpio3  = 0x02000000,
14452acadefaSDavid Bussenschutt 		} },
14462acadefaSDavid Bussenschutt 	},
1447aa481a65SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR1300] = {
1448aa481a65SSteven Toth 		.name		= "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
1449aa481a65SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1450aa481a65SSteven Toth 		.radio_type	= UNSET,
1451aa481a65SSteven Toth 		.tuner_addr	= ADDR_UNSET,
1452aa481a65SSteven Toth 		.radio_addr	= ADDR_UNSET,
1453aa481a65SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1454facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_WM8775,
14552491fbb7SSteven Toth 		/*
14562491fbb7SSteven Toth 		 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
14572491fbb7SSteven Toth 		 */
1458aa481a65SSteven Toth 		.input		= { {
1459aa481a65SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
1460aa481a65SSteven Toth 			.vmux   = 0,
14612491fbb7SSteven Toth 			.gpio0	= 0xef88,
1462649e13a9SDarron Broad 			/* 1: TV Audio / FM Mono */
14637b27d45bSRicardo Cerqueira 			.audioroute = 1,
1464aa481a65SSteven Toth 		}, {
1465aa481a65SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
1466aa481a65SSteven Toth 			.vmux	= 1,
14672491fbb7SSteven Toth 			.gpio0	= 0xef88,
1468649e13a9SDarron Broad 			/* 2: Line-In */
14697b27d45bSRicardo Cerqueira 			.audioroute = 2,
1470aa481a65SSteven Toth 		}, {
1471aa481a65SSteven Toth 			.type	= CX88_VMUX_SVIDEO,
1472aa481a65SSteven Toth 			.vmux	= 2,
14732491fbb7SSteven Toth 			.gpio0	= 0xef88,
1474649e13a9SDarron Broad 			/* 2: Line-In */
14757b27d45bSRicardo Cerqueira 			.audioroute = 2,
1476aa481a65SSteven Toth 		} },
14776c5be74cSSteven Toth 		.mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
14786b92b3bdSSteven Toth 		.radio = {
14796b92b3bdSSteven Toth 			.type   = CX88_RADIO,
14802491fbb7SSteven Toth 			.gpio0	= 0xef88,
1481649e13a9SDarron Broad 			/* 4: FM Stereo (untested) */
1482649e13a9SDarron Broad 			.audioroute = 8,
14836b92b3bdSSteven Toth 		},
1484aa481a65SSteven Toth 	},
14854f3ca2f1SDirk Herrendoerfer 	[CX88_BOARD_SAMSUNG_SMT_7020] = {
14864f3ca2f1SDirk Herrendoerfer 		.name		= "Samsung SMT 7020 DVB-S",
1487c39ba330SHans Verkuil 		.tuner_type	= UNSET,
14884f3ca2f1SDirk Herrendoerfer 		.radio_type	= UNSET,
14894f3ca2f1SDirk Herrendoerfer 		.tuner_addr	= ADDR_UNSET,
14904f3ca2f1SDirk Herrendoerfer 		.radio_addr	= ADDR_UNSET,
14914f3ca2f1SDirk Herrendoerfer 		.input		= { {
14924f3ca2f1SDirk Herrendoerfer 			.type	= CX88_VMUX_DVB,
14934f3ca2f1SDirk Herrendoerfer 			.vmux	= 0,
14944f3ca2f1SDirk Herrendoerfer 		} },
14954f3ca2f1SDirk Herrendoerfer 		.mpeg           = CX88_MPEG_DVB,
14964f3ca2f1SDirk Herrendoerfer 	},
14977cb47a14SDaniel Gimpelevich 	[CX88_BOARD_ADSTECH_PTV_390] = {
14987cb47a14SDaniel Gimpelevich 		.name           = "ADS Tech Instant Video PCI",
1499c39ba330SHans Verkuil 		.tuner_type     = UNSET,
15007cb47a14SDaniel Gimpelevich 		.radio_type     = UNSET,
15017cb47a14SDaniel Gimpelevich 		.tuner_addr     = ADDR_UNSET,
15027cb47a14SDaniel Gimpelevich 		.radio_addr     = ADDR_UNSET,
15037cb47a14SDaniel Gimpelevich 		.input          = { {
15047cb47a14SDaniel Gimpelevich 			.type   = CX88_VMUX_DEBUG,
15057cb47a14SDaniel Gimpelevich 			.vmux   = 3,
15067cb47a14SDaniel Gimpelevich 			.gpio0  = 0x04ff,
15077cb47a14SDaniel Gimpelevich 		}, {
15087cb47a14SDaniel Gimpelevich 			.type   = CX88_VMUX_COMPOSITE1,
15097cb47a14SDaniel Gimpelevich 			.vmux   = 1,
15107cb47a14SDaniel Gimpelevich 			.gpio0  = 0x07fa,
15117cb47a14SDaniel Gimpelevich 		}, {
15127cb47a14SDaniel Gimpelevich 			.type   = CX88_VMUX_SVIDEO,
15137cb47a14SDaniel Gimpelevich 			.vmux   = 2,
15147cb47a14SDaniel Gimpelevich 			.gpio0  = 0x07fa,
15157cb47a14SDaniel Gimpelevich 		} },
15167cb47a14SDaniel Gimpelevich 	},
151760464da8SSteven Toth 	[CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
151860464da8SSteven Toth 		.name           = "Pinnacle PCTV HD 800i",
151960464da8SSteven Toth 		.tuner_type     = TUNER_XC5000,
152060464da8SSteven Toth 		.radio_type     = UNSET,
152160464da8SSteven Toth 		.tuner_addr	= ADDR_UNSET,
152260464da8SSteven Toth 		.radio_addr	= ADDR_UNSET,
152360464da8SSteven Toth 		.input          = { {
152460464da8SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
152560464da8SSteven Toth 			.vmux   = 0,
152660464da8SSteven Toth 			.gpio0  = 0x04fb,
152760464da8SSteven Toth 			.gpio1  = 0x10ff,
152860464da8SSteven Toth 		}, {
152960464da8SSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
153060464da8SSteven Toth 			.vmux   = 1,
153160464da8SSteven Toth 			.gpio0  = 0x04fb,
153260464da8SSteven Toth 			.gpio1  = 0x10ef,
153360464da8SSteven Toth 			.audioroute = 1,
153460464da8SSteven Toth 		}, {
153560464da8SSteven Toth 			.type   = CX88_VMUX_SVIDEO,
153660464da8SSteven Toth 			.vmux   = 2,
153760464da8SSteven Toth 			.gpio0  = 0x04fb,
153860464da8SSteven Toth 			.gpio1  = 0x10ef,
153960464da8SSteven Toth 			.audioroute = 1,
154060464da8SSteven Toth 		} },
154160464da8SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
154260464da8SSteven Toth 	},
15435c00fac0SSteven Toth 	[CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
15448efd2e28SMichael Krufky 		.name           = "DViCO FusionHDTV 5 PCI nano",
15458efd2e28SMichael Krufky 		/* xc3008 tuner, digital only for now */
1546c39ba330SHans Verkuil 		.tuner_type     = UNSET,
15475c00fac0SSteven Toth 		.radio_type     = UNSET,
15485c00fac0SSteven Toth 		.tuner_addr	= ADDR_UNSET,
15495c00fac0SSteven Toth 		.radio_addr	= ADDR_UNSET,
15505c00fac0SSteven Toth 		.input          = { {
15515c00fac0SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
15525c00fac0SSteven Toth 			.vmux   = 0,
15535c00fac0SSteven Toth 			.gpio0  = 0x000027df, /* Unconfirmed */
15545c00fac0SSteven Toth 		}, {
15555c00fac0SSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
15565c00fac0SSteven Toth 			.vmux   = 1,
15575c00fac0SSteven Toth 			.gpio0  = 0x000027df, /* Unconfirmed */
15585c00fac0SSteven Toth 			.audioroute = 1,
15595c00fac0SSteven Toth 		}, {
15605c00fac0SSteven Toth 			.type   = CX88_VMUX_SVIDEO,
15615c00fac0SSteven Toth 			.vmux   = 2,
15625c00fac0SSteven Toth 			.gpio0  = 0x000027df, /* Unconfirmed */
15635c00fac0SSteven Toth 			.audioroute = 1,
15645c00fac0SSteven Toth 		} },
15655c00fac0SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
15665c00fac0SSteven Toth 	},
15679507901eSMauro Carvalho Chehab 	[CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
15689507901eSMauro Carvalho Chehab 		.name           = "Pinnacle Hybrid PCTV",
15699507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
15709507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
1571b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
1572b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
15739507901eSMauro Carvalho Chehab 		.input          = { {
15749507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
15759507901eSMauro Carvalho Chehab 			.vmux   = 0,
15763f6014fcSStéphane Voltz 			.gpio0  = 0x004ff,
15773f6014fcSStéphane Voltz 			.gpio1  = 0x010ff,
15783f6014fcSStéphane Voltz 			.gpio2  = 0x00001,
15799507901eSMauro Carvalho Chehab 		}, {
15809507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
15819507901eSMauro Carvalho Chehab 			.vmux   = 1,
15823f6014fcSStéphane Voltz 			.gpio0  = 0x004fb,
15833f6014fcSStéphane Voltz 			.gpio1  = 0x010ef,
15843f6014fcSStéphane Voltz 			.audioroute = 1,
15859507901eSMauro Carvalho Chehab 		}, {
15869507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
15879507901eSMauro Carvalho Chehab 			.vmux   = 2,
15883f6014fcSStéphane Voltz 			.gpio0  = 0x004fb,
15893f6014fcSStéphane Voltz 			.gpio1  = 0x010ef,
15903f6014fcSStéphane Voltz 			.audioroute = 1,
15919507901eSMauro Carvalho Chehab 		} },
15929507901eSMauro Carvalho Chehab 		.radio = {
15939507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
15949507901eSMauro Carvalho Chehab 			.gpio0  = 0x004ff,
15959507901eSMauro Carvalho Chehab 			.gpio1  = 0x010ff,
15969507901eSMauro Carvalho Chehab 			.gpio2  = 0x0ff,
15979507901eSMauro Carvalho Chehab 		},
15983f6014fcSStéphane Voltz 		.mpeg           = CX88_MPEG_DVB,
15999507901eSMauro Carvalho Chehab 	},
160014422f9dSMauro Carvalho Chehab 	/* Terry Wu <terrywu2009@gmail.com> */
160114422f9dSMauro Carvalho Chehab 	/* TV Audio :      set GPIO 2, 18, 19 value to 0, 1, 0 */
160214422f9dSMauro Carvalho Chehab 	/* FM Audio :      set GPIO 2, 18, 19 value to 0, 0, 0 */
160314422f9dSMauro Carvalho Chehab 	/* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
160414422f9dSMauro Carvalho Chehab 	/* Mute Audio :    set GPIO 2 value to 1               */
16059507901eSMauro Carvalho Chehab 	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
160614422f9dSMauro Carvalho Chehab 		.name           = "Leadtek TV2000 XP Global",
16079507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
16089507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
1609b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
1610b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
16119507901eSMauro Carvalho Chehab 		.input          = { {
16129507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
16139507901eSMauro Carvalho Chehab 			.vmux   = 0,
161414422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,       /* pin 2 = 0 */
16159507901eSMauro Carvalho Chehab 			.gpio1  = 0x0000,
161614422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
161714422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16189507901eSMauro Carvalho Chehab 		}, {
16199507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
16209507901eSMauro Carvalho Chehab 			.vmux   = 1,
162114422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,       /* pin 2 = 0 */
16229507901eSMauro Carvalho Chehab 			.gpio1  = 0x0000,
162314422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
162414422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16259507901eSMauro Carvalho Chehab 		}, {
16269507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
16279507901eSMauro Carvalho Chehab 			.vmux   = 2,
162814422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,       /* pin 2 = 0 */
162914422f9dSMauro Carvalho Chehab 			.gpio1  = 0x0000,
163014422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
163114422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16329507901eSMauro Carvalho Chehab 		} },
16339507901eSMauro Carvalho Chehab 		.radio = {
16349507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
163514422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,        /* pin 2 = 0 */
163614422f9dSMauro Carvalho Chehab 			.gpio1  = 0x0000,
163714422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
163814422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16399507901eSMauro Carvalho Chehab 		},
16409507901eSMauro Carvalho Chehab 	},
164184463d5fSIstvan Varga 	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = {
164284463d5fSIstvan Varga 		.name           = "Leadtek TV2000 XP Global (SC4100)",
164384463d5fSIstvan Varga 		.tuner_type     = TUNER_XC4000,
164484463d5fSIstvan Varga 		.tuner_addr     = 0x61,
164584463d5fSIstvan Varga 		.radio_type     = UNSET,
164684463d5fSIstvan Varga 		.radio_addr     = ADDR_UNSET,
164784463d5fSIstvan Varga 		.input          = { {
164884463d5fSIstvan Varga 			.type   = CX88_VMUX_TELEVISION,
164984463d5fSIstvan Varga 			.vmux   = 0,
165084463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
165184463d5fSIstvan Varga 			.gpio1  = 0x0000,
165284463d5fSIstvan Varga 			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
165384463d5fSIstvan Varga 			.gpio3  = 0x0000,
165484463d5fSIstvan Varga 		}, {
165584463d5fSIstvan Varga 			.type   = CX88_VMUX_COMPOSITE1,
165684463d5fSIstvan Varga 			.vmux   = 1,
165784463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
165884463d5fSIstvan Varga 			.gpio1  = 0x0000,
165984463d5fSIstvan Varga 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
166084463d5fSIstvan Varga 			.gpio3  = 0x0000,
166184463d5fSIstvan Varga 		}, {
166284463d5fSIstvan Varga 			.type   = CX88_VMUX_SVIDEO,
166384463d5fSIstvan Varga 			.vmux   = 2,
166484463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
166584463d5fSIstvan Varga 			.gpio1  = 0x0000,
166684463d5fSIstvan Varga 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
166784463d5fSIstvan Varga 			.gpio3  = 0x0000,
166884463d5fSIstvan Varga 		} },
166984463d5fSIstvan Varga 		.radio = {
167084463d5fSIstvan Varga 			.type   = CX88_RADIO,
167184463d5fSIstvan Varga 			.gpio0  = 0x0400,        /* pin 2 = 0 */
167284463d5fSIstvan Varga 			.gpio1  = 0x0000,
167384463d5fSIstvan Varga 			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
167484463d5fSIstvan Varga 			.gpio3  = 0x0000,
167584463d5fSIstvan Varga 		},
167684463d5fSIstvan Varga 	},
167784463d5fSIstvan Varga 	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = {
167884463d5fSIstvan Varga 		.name           = "Leadtek TV2000 XP Global (XC4100)",
167984463d5fSIstvan Varga 		.tuner_type     = TUNER_XC4000,
168084463d5fSIstvan Varga 		.tuner_addr     = 0x61,
168184463d5fSIstvan Varga 		.radio_type     = UNSET,
168284463d5fSIstvan Varga 		.radio_addr     = ADDR_UNSET,
168384463d5fSIstvan Varga 		.input          = { {
168484463d5fSIstvan Varga 			.type   = CX88_VMUX_TELEVISION,
168584463d5fSIstvan Varga 			.vmux   = 0,
168684463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
168784463d5fSIstvan Varga 			.gpio1  = 0x6040,       /* pin 14 = 1, pin 13 = 0 */
168884463d5fSIstvan Varga 			.gpio2  = 0x0000,
168984463d5fSIstvan Varga 			.gpio3  = 0x0000,
169084463d5fSIstvan Varga 		}, {
169184463d5fSIstvan Varga 			.type   = CX88_VMUX_COMPOSITE1,
169284463d5fSIstvan Varga 			.vmux   = 1,
169384463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
169484463d5fSIstvan Varga 			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
169584463d5fSIstvan Varga 			.gpio2  = 0x0000,
169684463d5fSIstvan Varga 			.gpio3  = 0x0000,
169784463d5fSIstvan Varga 		}, {
169884463d5fSIstvan Varga 			.type   = CX88_VMUX_SVIDEO,
169984463d5fSIstvan Varga 			.vmux   = 2,
170084463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
170184463d5fSIstvan Varga 			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
170284463d5fSIstvan Varga 			.gpio2  = 0x0000,
170384463d5fSIstvan Varga 			.gpio3  = 0x0000,
170484463d5fSIstvan Varga 		} },
170584463d5fSIstvan Varga 		.radio = {
170684463d5fSIstvan Varga 			.type   = CX88_RADIO,
170784463d5fSIstvan Varga 			.gpio0  = 0x0400,        /* pin 2 = 0 */
170884463d5fSIstvan Varga 			.gpio1  = 0x6000,        /* pin 14 = 1, pin 13 = 0 */
170984463d5fSIstvan Varga 			.gpio2  = 0x0000,
171084463d5fSIstvan Varga 			.gpio3  = 0x0000,
171184463d5fSIstvan Varga 		},
171284463d5fSIstvan Varga 	},
17139507901eSMauro Carvalho Chehab 	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
1714399426caSMauro Carvalho Chehab 		/* Long names may confuse LIRC. */
1715399426caSMauro Carvalho Chehab 		.name           = "PowerColor RA330",
17169507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
17179507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
17189507901eSMauro Carvalho Chehab 		.input          = { {
1719399426caSMauro Carvalho Chehab 			/*
1720399426caSMauro Carvalho Chehab 			 * Due to the way the cx88 driver is written,
1721399426caSMauro Carvalho Chehab 			 * there is no way to deactivate audio pass-
1722399426caSMauro Carvalho Chehab 			 * through without this entry. Furthermore, if
1723399426caSMauro Carvalho Chehab 			 * the TV mux entry is first, you get audio
1724399426caSMauro Carvalho Chehab 			 * from the tuner on boot for a little while.
1725399426caSMauro Carvalho Chehab 			 */
1726a9606ce6SDaniel Gimpelevich 			.type   = CX88_VMUX_DEBUG,
1727399426caSMauro Carvalho Chehab 			.vmux   = 3,
1728399426caSMauro Carvalho Chehab 			.gpio0 = 0x00ff,
1729399426caSMauro Carvalho Chehab 			.gpio1 = 0xf39d,
1730399426caSMauro Carvalho Chehab 			.gpio3 = 0x0000,
1731399426caSMauro Carvalho Chehab 		}, {
17329507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
17339507901eSMauro Carvalho Chehab 			.vmux   = 0,
1734ab364983SDâniel Fraga 			.gpio0 = 0x00ff,
1735b573ea0aSMauro Carvalho Chehab 			.gpio1 = 0xf35d,
1736ab364983SDâniel Fraga 			.gpio3 = 0x0000,
17379507901eSMauro Carvalho Chehab 		}, {
17389507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
17399507901eSMauro Carvalho Chehab 			.vmux   = 1,
1740ab364983SDâniel Fraga 			.gpio0 = 0x00ff,
1741ab364983SDâniel Fraga 			.gpio1 = 0xf37d,
1742ab364983SDâniel Fraga 			.gpio3 = 0x0000,
17439507901eSMauro Carvalho Chehab 		}, {
17449507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
17459507901eSMauro Carvalho Chehab 			.vmux   = 2,
17469507901eSMauro Carvalho Chehab 			.gpio0  = 0x000ff,
17479507901eSMauro Carvalho Chehab 			.gpio1  = 0x0f37d,
17489507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000,
17499507901eSMauro Carvalho Chehab 		} },
17509507901eSMauro Carvalho Chehab 		.radio = {
17519507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
17529507901eSMauro Carvalho Chehab 			.gpio0  = 0x000ff,
17539507901eSMauro Carvalho Chehab 			.gpio1  = 0x0f35d,
17549507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000,
17559507901eSMauro Carvalho Chehab 		},
17569507901eSMauro Carvalho Chehab 	},
17579507901eSMauro Carvalho Chehab 	[CX88_BOARD_GENIATECH_X8000_MT] = {
17589507901eSMauro Carvalho Chehab 		/* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
17599507901eSMauro Carvalho Chehab 		.name           = "Geniatech X8000-MT DVBT",
17609507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
17619507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
17629507901eSMauro Carvalho Chehab 		.input          = { {
17639507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
17649507901eSMauro Carvalho Chehab 			.vmux   = 0,
17659507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17669507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e341,
17679507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17689507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17699507901eSMauro Carvalho Chehab 		}, {
17709507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
17719507901eSMauro Carvalho Chehab 			.vmux   = 1,
17729507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17739507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e361,
17749507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17759507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17769507901eSMauro Carvalho Chehab 		}, {
17779507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
17789507901eSMauro Carvalho Chehab 			.vmux   = 2,
17799507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17809507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e361,
17819507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17829507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17839507901eSMauro Carvalho Chehab 		} },
17849507901eSMauro Carvalho Chehab 		.radio = {
17859507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
17869507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17879507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e341,
17889507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17899507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17909507901eSMauro Carvalho Chehab 		},
17919507901eSMauro Carvalho Chehab 		.mpeg           = CX88_MPEG_DVB,
1792b3fb91d2SChris Pascoe 	},
1793b3fb91d2SChris Pascoe 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
1794b3fb91d2SChris Pascoe 		.name           = "DViCO FusionHDTV DVB-T PRO",
179519c309e3STim Farrington 		.tuner_type     = TUNER_XC2028,
179619c309e3STim Farrington 		.tuner_addr     = 0x61,
1797b3fb91d2SChris Pascoe 		.radio_type     = UNSET,
1798b3fb91d2SChris Pascoe 		.radio_addr     = ADDR_UNSET,
1799b3fb91d2SChris Pascoe 		.input          = { {
1800b3fb91d2SChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
1801b3fb91d2SChris Pascoe 			.vmux   = 1,
1802b3fb91d2SChris Pascoe 			.gpio0  = 0x000067df,
1803b3fb91d2SChris Pascoe 		}, {
1804b3fb91d2SChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
1805b3fb91d2SChris Pascoe 			.vmux   = 2,
1806b3fb91d2SChris Pascoe 			.gpio0  = 0x000067df,
1807b3fb91d2SChris Pascoe 		} },
1808b3fb91d2SChris Pascoe 		.mpeg           = CX88_MPEG_DVB,
1809b3fb91d2SChris Pascoe 	},
18101117d6baSSteven Toth 	[CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
181176464d41SMichael Krufky 		.name           = "DViCO FusionHDTV 7 Gold",
18121117d6baSSteven Toth 		.tuner_type     = TUNER_XC5000,
18131117d6baSSteven Toth 		.radio_type     = UNSET,
18141117d6baSSteven Toth 		.tuner_addr	= ADDR_UNSET,
18151117d6baSSteven Toth 		.radio_addr	= ADDR_UNSET,
18161117d6baSSteven Toth 		.input          = { {
18171117d6baSSteven Toth 			.type   = CX88_VMUX_TELEVISION,
18181117d6baSSteven Toth 			.vmux   = 0,
181976464d41SMichael Krufky 			.gpio0  = 0x10df,
18201117d6baSSteven Toth 		}, {
18211117d6baSSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
18221117d6baSSteven Toth 			.vmux   = 1,
182376464d41SMichael Krufky 			.gpio0  = 0x16d9,
18241117d6baSSteven Toth 		}, {
18251117d6baSSteven Toth 			.type   = CX88_VMUX_SVIDEO,
18261117d6baSSteven Toth 			.vmux   = 2,
182776464d41SMichael Krufky 			.gpio0  = 0x16d9,
18281117d6baSSteven Toth 		} },
1829d893d5dcSSteven Toth 		.mpeg           = CX88_MPEG_DVB,
18301117d6baSSteven Toth 	},
18312422a9b3SMauro Carvalho Chehab 	[CX88_BOARD_PROLINK_PV_8000GT] = {
18322422a9b3SMauro Carvalho Chehab 		.name           = "Prolink Pixelview MPEG 8000GT",
18332422a9b3SMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
18342422a9b3SMauro Carvalho Chehab 		.tuner_addr     = 0x61,
18352422a9b3SMauro Carvalho Chehab 		.input          = { {
18362422a9b3SMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
18372422a9b3SMauro Carvalho Chehab 			.vmux   = 0,
18382422a9b3SMauro Carvalho Chehab 			.gpio0 = 0x0ff,
18392422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18402422a9b3SMauro Carvalho Chehab 		}, {
18412422a9b3SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
18422422a9b3SMauro Carvalho Chehab 			.vmux   = 1,
18432422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18442422a9b3SMauro Carvalho Chehab 		}, {
18452422a9b3SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
18462422a9b3SMauro Carvalho Chehab 			.vmux   = 2,
18472422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18482422a9b3SMauro Carvalho Chehab 		} },
18492422a9b3SMauro Carvalho Chehab 		.radio = {
18502422a9b3SMauro Carvalho Chehab 			.type   = CX88_RADIO,
18512422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18522422a9b3SMauro Carvalho Chehab 		},
18532422a9b3SMauro Carvalho Chehab 	},
1854a31d2bb7SMauro Carvalho Chehab 	[CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
1855a31d2bb7SMauro Carvalho Chehab 		.name           = "Prolink Pixelview Global Extreme",
1856a31d2bb7SMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
1857a31d2bb7SMauro Carvalho Chehab 		.tuner_addr     = 0x61,
1858a31d2bb7SMauro Carvalho Chehab 		.input          = { {
1859a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
1860a31d2bb7SMauro Carvalho Chehab 			.vmux   = 0,
1861a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04fb,
1862a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1863a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cf7,
1864a31d2bb7SMauro Carvalho Chehab 		}, {
1865a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
1866a31d2bb7SMauro Carvalho Chehab 			.vmux   = 1,
1867a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04fb,
1868a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1869a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
1870a31d2bb7SMauro Carvalho Chehab 		}, {
1871a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
1872a31d2bb7SMauro Carvalho Chehab 			.vmux   = 2,
1873a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04fb,
1874a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1875a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
1876a31d2bb7SMauro Carvalho Chehab 		} },
1877a31d2bb7SMauro Carvalho Chehab 		.radio = {
1878a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_RADIO,
1879a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04ff,
1880a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1881a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cf7,
1882a31d2bb7SMauro Carvalho Chehab 		},
1883a31d2bb7SMauro Carvalho Chehab 	},
1884399426caSMauro Carvalho Chehab 	/*
1885399426caSMauro Carvalho Chehab 	 * Both radio, analog and ATSC work with this board.
1886399426caSMauro Carvalho Chehab 	 * However, for analog to work, s5h1409 gate should be open,
1887399426caSMauro Carvalho Chehab 	 * otherwise, tuner-xc3028 won't be detected.
1888399426caSMauro Carvalho Chehab 	 * A proper fix require using the newer i2c methods to add
1889399426caSMauro Carvalho Chehab 	 * tuner-xc3028 without doing an i2c probe.
189099e09eacSMauro Carvalho Chehab 	 */
189199e09eacSMauro Carvalho Chehab 	[CX88_BOARD_KWORLD_ATSC_120] = {
189299e09eacSMauro Carvalho Chehab 		.name           = "Kworld PlusTV HD PCI 120 (ATSC 120)",
189399e09eacSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
189499e09eacSMauro Carvalho Chehab 		.radio_type     = UNSET,
189599e09eacSMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
189699e09eacSMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
189799e09eacSMauro Carvalho Chehab 		.input          = { {
189899e09eacSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
189999e09eacSMauro Carvalho Chehab 			.vmux   = 0,
190099e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
190199e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f35d,
190299e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
190399e09eacSMauro Carvalho Chehab 		}, {
190499e09eacSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
190599e09eacSMauro Carvalho Chehab 			.vmux   = 1,
190699e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
190799e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f37e,
190899e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
190999e09eacSMauro Carvalho Chehab 		}, {
191099e09eacSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
191199e09eacSMauro Carvalho Chehab 			.vmux   = 2,
191299e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
191399e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f37e,
191499e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
191599e09eacSMauro Carvalho Chehab 		} },
191699e09eacSMauro Carvalho Chehab 		.radio = {
191799e09eacSMauro Carvalho Chehab 			.type   = CX88_RADIO,
191899e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
191999e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f35d,
192099e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
192199e09eacSMauro Carvalho Chehab 		},
192299e09eacSMauro Carvalho Chehab 		.mpeg           = CX88_MPEG_DVB,
192399e09eacSMauro Carvalho Chehab 	},
19245bd1b663SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR4000] = {
19255bd1b663SSteven Toth 		.name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
19265bd1b663SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
19275bd1b663SSteven Toth 		.radio_type     = UNSET,
19285bd1b663SSteven Toth 		.tuner_addr     = ADDR_UNSET,
19295bd1b663SSteven Toth 		.radio_addr     = ADDR_UNSET,
19305bd1b663SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1931facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_WM8775,
19325bd1b663SSteven Toth 		/*
19335bd1b663SSteven Toth 		 * GPIO0 (WINTV2000)
19345bd1b663SSteven Toth 		 *
19355bd1b663SSteven Toth 		 * Analogue     SAT     DVB-T
19365bd1b663SSteven Toth 		 * Antenna      0xc4bf  0xc4bb
19375bd1b663SSteven Toth 		 * Composite    0xc4bf  0xc4bb
19385bd1b663SSteven Toth 		 * S-Video      0xc4bf  0xc4bb
19395bd1b663SSteven Toth 		 * Composite1   0xc4ff  0xc4fb
19405bd1b663SSteven Toth 		 * S-Video1     0xc4ff  0xc4fb
19412491fbb7SSteven Toth 		 *
19422491fbb7SSteven Toth 		 * BIT  VALUE   FUNCTION GP{x}_IO
19432491fbb7SSteven Toth 		 * 0    1       I:?
19442491fbb7SSteven Toth 		 * 1    1       I:?
194563248f26SDarron Broad 		 * 2    1       O:MPEG PORT 0=DVB-T 1=DVB-S
19462491fbb7SSteven Toth 		 * 3    1       I:?
19472491fbb7SSteven Toth 		 * 4    1       I:?
19482491fbb7SSteven Toth 		 * 5    1       I:?
19492491fbb7SSteven Toth 		 * 6    0       O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
19502491fbb7SSteven Toth 		 * 7    1       O:DVB-T DEMOD RESET LOW
19512491fbb7SSteven Toth 		 *
19522491fbb7SSteven Toth 		 * BIT  VALUE   FUNCTION GP{x}_OE
19532491fbb7SSteven Toth 		 * 8    0       I
19542491fbb7SSteven Toth 		 * 9    0       I
19552491fbb7SSteven Toth 		 * a    1       O
19562491fbb7SSteven Toth 		 * b    0       I
19572491fbb7SSteven Toth 		 * c    0       I
19582491fbb7SSteven Toth 		 * d    0       I
19592491fbb7SSteven Toth 		 * e    1       O
19602491fbb7SSteven Toth 		 * f    1       O
1961649e13a9SDarron Broad 		 *
1962649e13a9SDarron Broad 		 * WM8775 ADC
1963649e13a9SDarron Broad 		 *
1964649e13a9SDarron Broad 		 * 1: TV Audio / FM Mono
1965649e13a9SDarron Broad 		 * 2: Line-In
1966649e13a9SDarron Broad 		 * 3: Line-In Expansion
1967649e13a9SDarron Broad 		 * 4: FM Stereo
19685bd1b663SSteven Toth 		 */
19695bd1b663SSteven Toth 		.input          = { {
19705bd1b663SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
19715bd1b663SSteven Toth 			.vmux   = 0,
19725bd1b663SSteven Toth 			.gpio0  = 0xc4bf,
1973649e13a9SDarron Broad 			/* 1: TV Audio / FM Mono */
1974923ac7f7SDarron Broad 			.audioroute = 1,
19755bd1b663SSteven Toth 		}, {
19765bd1b663SSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
19775bd1b663SSteven Toth 			.vmux   = 1,
19785bd1b663SSteven Toth 			.gpio0  = 0xc4bf,
1979649e13a9SDarron Broad 			/* 2: Line-In */
1980923ac7f7SDarron Broad 			.audioroute = 2,
19815bd1b663SSteven Toth 		}, {
19825bd1b663SSteven Toth 			.type   = CX88_VMUX_SVIDEO,
19835bd1b663SSteven Toth 			.vmux   = 2,
19845bd1b663SSteven Toth 			.gpio0  = 0xc4bf,
1985649e13a9SDarron Broad 			/* 2: Line-In */
1986923ac7f7SDarron Broad 			.audioroute = 2,
19875bd1b663SSteven Toth 		} },
198863248f26SDarron Broad 		.radio = {
198963248f26SDarron Broad 			.type   = CX88_RADIO,
199063248f26SDarron Broad 			.gpio0	= 0xc4bf,
1991649e13a9SDarron Broad 			/* 4: FM Stereo */
1992649e13a9SDarron Broad 			.audioroute = 8,
199363248f26SDarron Broad 		},
19945bd1b663SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
1995363c35fcSSteven Toth 		.num_frontends	= 2,
19965bd1b663SSteven Toth 	},
19975bd1b663SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
19985bd1b663SSteven Toth 		.name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
19995bd1b663SSteven Toth 		.tuner_type     = UNSET,
20005bd1b663SSteven Toth 		.radio_type     = UNSET,
20015bd1b663SSteven Toth 		.tuner_addr     = ADDR_UNSET,
20025bd1b663SSteven Toth 		.radio_addr     = ADDR_UNSET,
20035bd1b663SSteven Toth 		.input          = { {
20045bd1b663SSteven Toth 			.type   = CX88_VMUX_DVB,
20055bd1b663SSteven Toth 			.vmux   = 0,
20065bd1b663SSteven Toth 		} },
20075bd1b663SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
20085bd1b663SSteven Toth 	},
2009e4aab64cSIgor M. Liplianin 	[CX88_BOARD_TEVII_S420] = {
2010e4aab64cSIgor M. Liplianin 		.name           = "TeVii S420 DVB-S",
2011e4aab64cSIgor M. Liplianin 		.tuner_type     = UNSET,
2012e4aab64cSIgor M. Liplianin 		.radio_type     = UNSET,
2013e4aab64cSIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2014e4aab64cSIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2015e4aab64cSIgor M. Liplianin 		.input          = { {
2016e4aab64cSIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2017e4aab64cSIgor M. Liplianin 			.vmux   = 0,
2018e4aab64cSIgor M. Liplianin 		} },
2019e4aab64cSIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2020e4aab64cSIgor M. Liplianin 	},
2021af832623SIgor M. Liplianin 	[CX88_BOARD_TEVII_S460] = {
2022af832623SIgor M. Liplianin 		.name           = "TeVii S460 DVB-S/S2",
2023af832623SIgor M. Liplianin 		.tuner_type     = UNSET,
2024af832623SIgor M. Liplianin 		.radio_type     = UNSET,
2025af832623SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2026af832623SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2027af832623SIgor M. Liplianin 		.input          = { {
2028af832623SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2029af832623SIgor M. Liplianin 			.vmux   = 0,
2030af832623SIgor M. Liplianin 		} },
2031af832623SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2032af832623SIgor M. Liplianin 	},
20330cb73639SIgor M. Liplianin 	[CX88_BOARD_TEVII_S464] = {
20340cb73639SIgor M. Liplianin 		.name           = "TeVii S464 DVB-S/S2",
20350cb73639SIgor M. Liplianin 		.tuner_type     = UNSET,
20360cb73639SIgor M. Liplianin 		.radio_type     = UNSET,
20370cb73639SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
20380cb73639SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
20390cb73639SIgor M. Liplianin 		.input          = { {
20400cb73639SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
20410cb73639SIgor M. Liplianin 			.vmux   = 0,
20420cb73639SIgor M. Liplianin 		} },
20430cb73639SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
20440cb73639SIgor M. Liplianin 	},
20454cd7fb87SOleg Roitburd 	[CX88_BOARD_OMICOM_SS4_PCI] = {
20464cd7fb87SOleg Roitburd 		.name           = "Omicom SS4 DVB-S/S2 PCI",
20474cd7fb87SOleg Roitburd 		.tuner_type     = UNSET,
20484cd7fb87SOleg Roitburd 		.radio_type     = UNSET,
20494cd7fb87SOleg Roitburd 		.tuner_addr     = ADDR_UNSET,
20504cd7fb87SOleg Roitburd 		.radio_addr     = ADDR_UNSET,
20514cd7fb87SOleg Roitburd 		.input          = { {
20524cd7fb87SOleg Roitburd 			.type   = CX88_VMUX_DVB,
20534cd7fb87SOleg Roitburd 			.vmux   = 0,
20544cd7fb87SOleg Roitburd 		} },
20554cd7fb87SOleg Roitburd 		.mpeg           = CX88_MPEG_DVB,
20564cd7fb87SOleg Roitburd 	},
20574b29631dSIgor M. Liplianin 	[CX88_BOARD_TBS_8910] = {
20584b29631dSIgor M. Liplianin 		.name           = "TBS 8910 DVB-S",
20594b29631dSIgor M. Liplianin 		.tuner_type     = UNSET,
20604b29631dSIgor M. Liplianin 		.radio_type     = UNSET,
20614b29631dSIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
20624b29631dSIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
20634b29631dSIgor M. Liplianin 		.input          = { {
20644b29631dSIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
20654b29631dSIgor M. Liplianin 			.vmux   = 0,
20664b29631dSIgor M. Liplianin 		} },
20674b29631dSIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
20684b29631dSIgor M. Liplianin 	},
2069ee73042cSOleg Roitburd 	[CX88_BOARD_TBS_8920] = {
2070ee73042cSOleg Roitburd 		.name           = "TBS 8920 DVB-S/S2",
2071c39ba330SHans Verkuil 		.tuner_type     = UNSET,
2072ee73042cSOleg Roitburd 		.radio_type     = UNSET,
2073ee73042cSOleg Roitburd 		.tuner_addr     = ADDR_UNSET,
2074ee73042cSOleg Roitburd 		.radio_addr     = ADDR_UNSET,
2075ee73042cSOleg Roitburd 		.input          = { {
2076ee73042cSOleg Roitburd 			.type   = CX88_VMUX_DVB,
2077ad5f74c0SIgor M. Liplianin 			.vmux   = 0,
2078ad5f74c0SIgor M. Liplianin 			.gpio0  = 0x8080,
2079ee73042cSOleg Roitburd 		} },
2080ee73042cSOleg Roitburd 		.mpeg           = CX88_MPEG_DVB,
2081ee73042cSOleg Roitburd 	},
2082cd3cde12SIgor M. Liplianin 	[CX88_BOARD_PROF_6200] = {
2083cd3cde12SIgor M. Liplianin 		.name           = "Prof 6200 DVB-S",
2084cd3cde12SIgor M. Liplianin 		.tuner_type     = UNSET,
2085cd3cde12SIgor M. Liplianin 		.radio_type     = UNSET,
2086cd3cde12SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2087cd3cde12SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2088cd3cde12SIgor M. Liplianin 		.input          = { {
2089cd3cde12SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2090cd3cde12SIgor M. Liplianin 			.vmux   = 0,
2091cd3cde12SIgor M. Liplianin 		} },
2092cd3cde12SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2093cd3cde12SIgor M. Liplianin 	},
209457f51dbcSOleg Roitburd 	[CX88_BOARD_PROF_7300] = {
209557f51dbcSOleg Roitburd 		.name           = "PROF 7300 DVB-S/S2",
209657f51dbcSOleg Roitburd 		.tuner_type     = UNSET,
209757f51dbcSOleg Roitburd 		.radio_type     = UNSET,
209857f51dbcSOleg Roitburd 		.tuner_addr     = ADDR_UNSET,
209957f51dbcSOleg Roitburd 		.radio_addr     = ADDR_UNSET,
210057f51dbcSOleg Roitburd 		.input          = { {
210157f51dbcSOleg Roitburd 			.type   = CX88_VMUX_DVB,
210257f51dbcSOleg Roitburd 			.vmux   = 0,
210357f51dbcSOleg Roitburd 		} },
210457f51dbcSOleg Roitburd 		.mpeg           = CX88_MPEG_DVB,
210557f51dbcSOleg Roitburd 	},
21064b29631dSIgor M. Liplianin 	[CX88_BOARD_SATTRADE_ST4200] = {
21074b29631dSIgor M. Liplianin 		.name           = "SATTRADE ST4200 DVB-S/S2",
21084b29631dSIgor M. Liplianin 		.tuner_type     = UNSET,
21094b29631dSIgor M. Liplianin 		.radio_type     = UNSET,
21104b29631dSIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
21114b29631dSIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
21124b29631dSIgor M. Liplianin 		.input          = { {
21134b29631dSIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
21144b29631dSIgor M. Liplianin 			.vmux   = 0,
21154b29631dSIgor M. Liplianin 		} },
21164b29631dSIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
21174b29631dSIgor M. Liplianin 	},
211870101a27SStephan Wienczny 	[CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
211970101a27SStephan Wienczny 		.name           = "Terratec Cinergy HT PCI MKII",
212070101a27SStephan Wienczny 		.tuner_type     = TUNER_XC2028,
212170101a27SStephan Wienczny 		.tuner_addr     = 0x61,
2122b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
2123b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
212470101a27SStephan Wienczny 		.input          = { {
212570101a27SStephan Wienczny 			.type   = CX88_VMUX_TELEVISION,
212670101a27SStephan Wienczny 			.vmux   = 0,
212770101a27SStephan Wienczny 			.gpio0  = 0x004ff,
212870101a27SStephan Wienczny 			.gpio1  = 0x010ff,
212970101a27SStephan Wienczny 			.gpio2  = 0x00001,
213070101a27SStephan Wienczny 		}, {
213170101a27SStephan Wienczny 			.type   = CX88_VMUX_COMPOSITE1,
213270101a27SStephan Wienczny 			.vmux   = 1,
213370101a27SStephan Wienczny 			.gpio0  = 0x004fb,
213470101a27SStephan Wienczny 			.gpio1  = 0x010ef,
213570101a27SStephan Wienczny 			.audioroute = 1,
213670101a27SStephan Wienczny 		}, {
213770101a27SStephan Wienczny 			.type   = CX88_VMUX_SVIDEO,
213870101a27SStephan Wienczny 			.vmux   = 2,
213970101a27SStephan Wienczny 			.gpio0  = 0x004fb,
214070101a27SStephan Wienczny 			.gpio1  = 0x010ef,
214170101a27SStephan Wienczny 			.audioroute = 1,
214270101a27SStephan Wienczny 		} },
214370101a27SStephan Wienczny 		.radio = {
214470101a27SStephan Wienczny 			.type   = CX88_RADIO,
214570101a27SStephan Wienczny 			.gpio0  = 0x004ff,
214670101a27SStephan Wienczny 			.gpio1  = 0x010ff,
214770101a27SStephan Wienczny 			.gpio2  = 0x0ff,
214870101a27SStephan Wienczny 		},
214970101a27SStephan Wienczny 		.mpeg           = CX88_MPEG_DVB,
215070101a27SStephan Wienczny 	},
2151501d8cd4SSteven Toth 	[CX88_BOARD_HAUPPAUGE_IRONLY] = {
2152501d8cd4SSteven Toth 		.name           = "Hauppauge WinTV-IR Only",
2153501d8cd4SSteven Toth 		.tuner_type     = UNSET,
2154501d8cd4SSteven Toth 		.radio_type     = UNSET,
2155501d8cd4SSteven Toth 		.tuner_addr	= ADDR_UNSET,
2156501d8cd4SSteven Toth 		.radio_addr	= ADDR_UNSET,
2157501d8cd4SSteven Toth 	},
21583047a176SMiroslav Sustek 	[CX88_BOARD_WINFAST_DTV1800H] = {
21593047a176SMiroslav Sustek 		.name           = "Leadtek WinFast DTV1800 Hybrid",
21603047a176SMiroslav Sustek 		.tuner_type     = TUNER_XC2028,
2161b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
21623047a176SMiroslav Sustek 		.tuner_addr     = 0x61,
2163b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
21643047a176SMiroslav Sustek 		/*
21653047a176SMiroslav Sustek 		 * GPIO setting
21663047a176SMiroslav Sustek 		 *
21673047a176SMiroslav Sustek 		 *  2: mute (0=off,1=on)
21683047a176SMiroslav Sustek 		 * 12: tuner reset pin
21693047a176SMiroslav Sustek 		 * 13: audio source (0=tuner audio,1=line in)
21703047a176SMiroslav Sustek 		 * 14: FM (0=on,1=off ???)
21713047a176SMiroslav Sustek 		 */
21723047a176SMiroslav Sustek 		.input          = { {
21733047a176SMiroslav Sustek 			.type   = CX88_VMUX_TELEVISION,
21743047a176SMiroslav Sustek 			.vmux   = 0,
21753047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
21763047a176SMiroslav Sustek 			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
21773047a176SMiroslav Sustek 			.gpio2  = 0x0000,
21783047a176SMiroslav Sustek 		}, {
21793047a176SMiroslav Sustek 			.type   = CX88_VMUX_COMPOSITE1,
21803047a176SMiroslav Sustek 			.vmux   = 1,
21813047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
21823047a176SMiroslav Sustek 			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
21833047a176SMiroslav Sustek 			.gpio2  = 0x0000,
21843047a176SMiroslav Sustek 		}, {
21853047a176SMiroslav Sustek 			.type   = CX88_VMUX_SVIDEO,
21863047a176SMiroslav Sustek 			.vmux   = 2,
21873047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
21883047a176SMiroslav Sustek 			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
21893047a176SMiroslav Sustek 			.gpio2  = 0x0000,
21903047a176SMiroslav Sustek 		} },
21913047a176SMiroslav Sustek 		.radio = {
21923047a176SMiroslav Sustek 			.type   = CX88_RADIO,
21933047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
21943047a176SMiroslav Sustek 			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
21953047a176SMiroslav Sustek 			.gpio2  = 0x0000,
21963047a176SMiroslav Sustek 		},
21973047a176SMiroslav Sustek 		.mpeg           = CX88_MPEG_DVB,
21983047a176SMiroslav Sustek 	},
21998eb79c0bSistvan_v@mailbox.hu 	[CX88_BOARD_WINFAST_DTV1800H_XC4000] = {
22008eb79c0bSistvan_v@mailbox.hu 		.name		= "Leadtek WinFast DTV1800 H (XC4000)",
22018eb79c0bSistvan_v@mailbox.hu 		.tuner_type	= TUNER_XC4000,
2202b6854e3fSMiroslav Slugen 		.radio_type	= UNSET,
22038eb79c0bSistvan_v@mailbox.hu 		.tuner_addr	= 0x61,
2204b6854e3fSMiroslav Slugen 		.radio_addr	= ADDR_UNSET,
22058eb79c0bSistvan_v@mailbox.hu 		/*
22068eb79c0bSistvan_v@mailbox.hu 		 * GPIO setting
22078eb79c0bSistvan_v@mailbox.hu 		 *
22088eb79c0bSistvan_v@mailbox.hu 		 *  2: mute (0=off,1=on)
22098eb79c0bSistvan_v@mailbox.hu 		 * 12: tuner reset pin
22108eb79c0bSistvan_v@mailbox.hu 		 * 13: audio source (0=tuner audio,1=line in)
22118eb79c0bSistvan_v@mailbox.hu 		 * 14: FM (0=on,1=off ???)
22128eb79c0bSistvan_v@mailbox.hu 		 */
22138eb79c0bSistvan_v@mailbox.hu 		.input		= { {
22148eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_VMUX_TELEVISION,
22158eb79c0bSistvan_v@mailbox.hu 			.vmux	= 0,
22168eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22178eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6040,	/* pin 13 = 0, pin 14 = 1 */
22188eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22198eb79c0bSistvan_v@mailbox.hu 		}, {
22208eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_VMUX_COMPOSITE1,
22218eb79c0bSistvan_v@mailbox.hu 			.vmux	= 1,
22228eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22238eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
22248eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22258eb79c0bSistvan_v@mailbox.hu 		}, {
22268eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_VMUX_SVIDEO,
22278eb79c0bSistvan_v@mailbox.hu 			.vmux	= 2,
22288eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22298eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
22308eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22318eb79c0bSistvan_v@mailbox.hu 		} },
22328eb79c0bSistvan_v@mailbox.hu 		.radio = {
22338eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_RADIO,
22348eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22358eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6000,	/* pin 13 = 0, pin 14 = 0 */
22368eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22378eb79c0bSistvan_v@mailbox.hu 		},
22388eb79c0bSistvan_v@mailbox.hu 		.mpeg		= CX88_MPEG_DVB,
22398eb79c0bSistvan_v@mailbox.hu 	},
2240f271a3afSistvan_v@mailbox.hu 	[CX88_BOARD_WINFAST_DTV2000H_PLUS] = {
2241f271a3afSistvan_v@mailbox.hu 		.name		= "Leadtek WinFast DTV2000 H PLUS",
2242f271a3afSistvan_v@mailbox.hu 		.tuner_type	= TUNER_XC4000,
2243b6854e3fSMiroslav Slugen 		.radio_type	= UNSET,
2244f271a3afSistvan_v@mailbox.hu 		.tuner_addr	= 0x61,
2245b6854e3fSMiroslav Slugen 		.radio_addr	= ADDR_UNSET,
2246f271a3afSistvan_v@mailbox.hu 		/*
2247f271a3afSistvan_v@mailbox.hu 		 * GPIO
2248f271a3afSistvan_v@mailbox.hu 		 *   2: 1: mute audio
2249f271a3afSistvan_v@mailbox.hu 		 *  12: 0: reset XC4000
2250f271a3afSistvan_v@mailbox.hu 		 *  13: 1: audio input is line in (0: tuner)
2251f271a3afSistvan_v@mailbox.hu 		 *  14: 0: FM radio
2252f271a3afSistvan_v@mailbox.hu 		 *  16: 0: RF input is cable
2253f271a3afSistvan_v@mailbox.hu 		 */
2254f271a3afSistvan_v@mailbox.hu 		.input		= { {
2255f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_TELEVISION,
2256f271a3afSistvan_v@mailbox.hu 			.vmux	= 0,
2257f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,
2258f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0D7,
2259f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0101,
2260f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2261f271a3afSistvan_v@mailbox.hu 		}, {
2262f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_CABLE,
2263f271a3afSistvan_v@mailbox.hu 			.vmux	= 0,
2264f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,
2265f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0D7,
2266f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0100,
2267f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2268f271a3afSistvan_v@mailbox.hu 		}, {
2269f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_COMPOSITE1,
2270f271a3afSistvan_v@mailbox.hu 			.vmux	= 1,
2271f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,	/* was 0x0407 */
2272f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0F7,
2273f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0101,
2274f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2275f271a3afSistvan_v@mailbox.hu 		}, {
2276f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_SVIDEO,
2277f271a3afSistvan_v@mailbox.hu 			.vmux	= 2,
2278f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,	/* was 0x0407 */
2279f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0F7,
2280f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0101,
2281f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2282f271a3afSistvan_v@mailbox.hu 		} },
2283f271a3afSistvan_v@mailbox.hu 		.radio = {
2284f271a3afSistvan_v@mailbox.hu 			.type	= CX88_RADIO,
2285f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,
2286f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF097,
2287f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0100,
2288f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2289f271a3afSistvan_v@mailbox.hu 		},
2290f271a3afSistvan_v@mailbox.hu 		.mpeg		= CX88_MPEG_DVB,
2291f271a3afSistvan_v@mailbox.hu 	},
2292b699c271SIgor M. Liplianin 	[CX88_BOARD_PROF_7301] = {
2293b699c271SIgor M. Liplianin 		.name           = "Prof 7301 DVB-S/S2",
2294b699c271SIgor M. Liplianin 		.tuner_type     = UNSET,
2295b699c271SIgor M. Liplianin 		.radio_type     = UNSET,
2296b699c271SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2297b699c271SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2298b699c271SIgor M. Liplianin 		.input          = { {
2299b699c271SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2300b699c271SIgor M. Liplianin 			.vmux   = 0,
2301b699c271SIgor M. Liplianin 		} },
2302b699c271SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2303b699c271SIgor M. Liplianin 	},
2304111ac84aSSergey Ivanov 	[CX88_BOARD_TWINHAN_VP1027_DVBS] = {
2305111ac84aSSergey Ivanov 		.name		= "Twinhan VP-1027 DVB-S",
2306c39ba330SHans Verkuil 		.tuner_type     = UNSET,
2307111ac84aSSergey Ivanov 		.radio_type     = UNSET,
2308111ac84aSSergey Ivanov 		.tuner_addr     = ADDR_UNSET,
2309111ac84aSSergey Ivanov 		.radio_addr     = ADDR_UNSET,
2310111ac84aSSergey Ivanov 		.input          = { {
2311111ac84aSSergey Ivanov 		       .type   = CX88_VMUX_DVB,
2312111ac84aSSergey Ivanov 		       .vmux   = 0,
2313111ac84aSSergey Ivanov 		} },
2314111ac84aSSergey Ivanov 		.mpeg           = CX88_MPEG_DVB,
2315111ac84aSSergey Ivanov 	},
23161da177e4SLinus Torvalds };
23171da177e4SLinus Torvalds 
23181da177e4SLinus Torvalds /* ------------------------------------------------------------------ */
23191da177e4SLinus Torvalds /* PCI subsystem IDs                                                  */
23201da177e4SLinus Torvalds 
2321bbc83597STrent Piepho static const struct cx88_subid cx88_subids[] = {
23221da177e4SLinus Torvalds 	{
23231da177e4SLinus Torvalds 		.subvendor = 0x0070,
23241da177e4SLinus Torvalds 		.subdevice = 0x3400,
23251da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE,
23261da177e4SLinus Torvalds 	}, {
23271da177e4SLinus Torvalds 		.subvendor = 0x0070,
23281da177e4SLinus Torvalds 		.subdevice = 0x3401,
23291da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE,
23301da177e4SLinus Torvalds 	}, {
23311da177e4SLinus Torvalds 		.subvendor = 0x14c7,
23321da177e4SLinus Torvalds 		.subdevice = 0x0106,
23331da177e4SLinus Torvalds 		.card      = CX88_BOARD_GDI,
23341da177e4SLinus Torvalds 	}, {
23351da177e4SLinus Torvalds 		.subvendor = 0x14c7,
23361da177e4SLinus Torvalds 		.subdevice = 0x0107, /* with mpeg encoder */
23371da177e4SLinus Torvalds 		.card      = CX88_BOARD_GDI,
23381da177e4SLinus Torvalds 	}, {
23391da177e4SLinus Torvalds 		.subvendor = PCI_VENDOR_ID_ATI,
23401da177e4SLinus Torvalds 		.subdevice = 0x00f8,
23411da177e4SLinus Torvalds 		.card      = CX88_BOARD_ATI_WONDER_PRO,
23421da177e4SLinus Torvalds 	}, {
2343bc13ae11SPatrice Levesque 		.subvendor = PCI_VENDOR_ID_ATI,
2344bc13ae11SPatrice Levesque 		.subdevice = 0x00f9,
2345bc13ae11SPatrice Levesque 		.card      = CX88_BOARD_ATI_WONDER_PRO,
2346bc13ae11SPatrice Levesque 	}, {
23471da177e4SLinus Torvalds 		.subvendor = 0x107d,
23481da177e4SLinus Torvalds 		.subdevice = 0x6611,
23491da177e4SLinus Torvalds 		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
23501da177e4SLinus Torvalds 	}, {
23511da177e4SLinus Torvalds 		.subvendor = 0x107d,
23521da177e4SLinus Torvalds 		.subdevice = 0x6613,	/* NTSC */
23531da177e4SLinus Torvalds 		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
23541da177e4SLinus Torvalds 	}, {
23551da177e4SLinus Torvalds 		.subvendor = 0x107d,
23561da177e4SLinus Torvalds 		.subdevice = 0x6620,
23571da177e4SLinus Torvalds 		.card      = CX88_BOARD_WINFAST_DV2000,
23581da177e4SLinus Torvalds 	}, {
23591da177e4SLinus Torvalds 		.subvendor = 0x107d,
23601da177e4SLinus Torvalds 		.subdevice = 0x663b,
23611da177e4SLinus Torvalds 		.card      = CX88_BOARD_LEADTEK_PVR2000,
23621da177e4SLinus Torvalds 	}, {
23631da177e4SLinus Torvalds 		.subvendor = 0x107d,
23648dd86eebSMichael Krufky 		.subdevice = 0x663c,
23651da177e4SLinus Torvalds 		.card      = CX88_BOARD_LEADTEK_PVR2000,
23661da177e4SLinus Torvalds 	}, {
23671da177e4SLinus Torvalds 		.subvendor = 0x1461,
23681da177e4SLinus Torvalds 		.subdevice = 0x000b,
23697418f346SLubomir Bulej 		.card      = CX88_BOARD_AVERTV_STUDIO_303,
23701da177e4SLinus Torvalds 	}, {
23711da177e4SLinus Torvalds 		.subvendor = 0x1462,
23721da177e4SLinus Torvalds 		.subdevice = 0x8606,
23731da177e4SLinus Torvalds 		.card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,
23741da177e4SLinus Torvalds 	}, {
23751da177e4SLinus Torvalds 		.subvendor = 0x10fc,
23761da177e4SLinus Torvalds 		.subdevice = 0xd003,
23771da177e4SLinus Torvalds 		.card      = CX88_BOARD_IODATA_GVVCP3PCI,
23781da177e4SLinus Torvalds 	}, {
23791da177e4SLinus Torvalds 		.subvendor = 0x1043,
23801da177e4SLinus Torvalds 		.subdevice = 0x4823,  /* with mpeg encoder */
23811da177e4SLinus Torvalds 		.card      = CX88_BOARD_ASUS_PVR_416,
23821da177e4SLinus Torvalds 	}, {
23831da177e4SLinus Torvalds 		.subvendor = 0x17de,
23841da177e4SLinus Torvalds 		.subdevice = 0x08a6,
23851da177e4SLinus Torvalds 		.card      = CX88_BOARD_KWORLD_DVB_T,
23861da177e4SLinus Torvalds 	}, {
23871da177e4SLinus Torvalds 		.subvendor = 0x18ac,
23881da177e4SLinus Torvalds 		.subdevice = 0xd810,
2389a82decf6SMauro Carvalho Chehab 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
23901da177e4SLinus Torvalds 	}, {
2391097b750eSMichael Krufky 		.subvendor = 0x18ac,
2392097b750eSMichael Krufky 		.subdevice = 0xd820,
239380d34362SMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
2394097b750eSMichael Krufky 	}, {
23957df64e8cSMichael Krufky 		.subvendor = 0x18ac,
23967df64e8cSMichael Krufky 		.subdevice = 0xdb00,
23971da177e4SLinus Torvalds 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
23981da177e4SLinus Torvalds 	}, {
23991da177e4SLinus Torvalds 		.subvendor = 0x0070,
24001da177e4SLinus Torvalds 		.subdevice = 0x9002,
24011da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
24021da177e4SLinus Torvalds 	}, {
24031da177e4SLinus Torvalds 		.subvendor = 0x14f1,
24041da177e4SLinus Torvalds 		.subdevice = 0x0187,
24051da177e4SLinus Torvalds 		.card      = CX88_BOARD_CONEXANT_DVB_T1,
24061da177e4SLinus Torvalds 	}, {
24071da177e4SLinus Torvalds 		.subvendor = 0x1540,
24081da177e4SLinus Torvalds 		.subdevice = 0x2580,
24091da177e4SLinus Torvalds 		.card      = CX88_BOARD_PROVIDEO_PV259,
24101da177e4SLinus Torvalds 	}, {
24117df64e8cSMichael Krufky 		.subvendor = 0x18ac,
24127df64e8cSMichael Krufky 		.subdevice = 0xdb10,
24131da177e4SLinus Torvalds 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
24141da177e4SLinus Torvalds 	}, {
24151da177e4SLinus Torvalds 		.subvendor = 0x1554,
24161da177e4SLinus Torvalds 		.subdevice = 0x4811,
24171da177e4SLinus Torvalds 		.card      = CX88_BOARD_PIXELVIEW,
24181da177e4SLinus Torvalds 	}, {
24191da177e4SLinus Torvalds 		.subvendor = 0x7063,
24201da177e4SLinus Torvalds 		.subdevice = 0x3000, /* HD-3000 card */
24211da177e4SLinus Torvalds 		.card      = CX88_BOARD_PCHDTV_HD3000,
24221da177e4SLinus Torvalds 	}, {
24237df64e8cSMichael Krufky 		.subvendor = 0x17de,
24247df64e8cSMichael Krufky 		.subdevice = 0xa8a6,
24251da177e4SLinus Torvalds 		.card      = CX88_BOARD_DNTV_LIVE_DVB_T,
24261da177e4SLinus Torvalds 	}, {
24271da177e4SLinus Torvalds 		.subvendor = 0x0070,
24281da177e4SLinus Torvalds 		.subdevice = 0x2801,
24291da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE_ROSLYN,
24301da177e4SLinus Torvalds 	}, {
24317df64e8cSMichael Krufky 		.subvendor = 0x14f1,
24321da177e4SLinus Torvalds 		.subdevice = 0x0342,
24331da177e4SLinus Torvalds 		.card      = CX88_BOARD_DIGITALLOGIC_MEC,
24341da177e4SLinus Torvalds 	}, {
24351da177e4SLinus Torvalds 		.subvendor = 0x10fc,
24361da177e4SLinus Torvalds 		.subdevice = 0xd035,
24371da177e4SLinus Torvalds 		.card      = CX88_BOARD_IODATA_GVBCTV7E,
2438a82decf6SMauro Carvalho Chehab 	}, {
2439a82decf6SMauro Carvalho Chehab 		.subvendor = 0x1421,
2440a82decf6SMauro Carvalho Chehab 		.subdevice = 0x0334,
2441a82decf6SMauro Carvalho Chehab 		.card      = CX88_BOARD_ADSTECH_DVB_T_PCI,
2442e057ee11SMichael Krufky 	}, {
2443e057ee11SMichael Krufky 		.subvendor = 0x153b,
2444e057ee11SMichael Krufky 		.subdevice = 0x1166,
2445e057ee11SMichael Krufky 		.card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
24469fef07caSMichael Krufky 	}, {
24479fef07caSMichael Krufky 		.subvendor = 0x18ac,
24489fef07caSMichael Krufky 		.subdevice = 0xd500,
24499fef07caSMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
2450d45170edSNickolay V. Shmyrev 	}, {
2451d45170edSNickolay V. Shmyrev 		.subvendor = 0x1461,
2452d45170edSNickolay V. Shmyrev 		.subdevice = 0x8011,
2453d45170edSNickolay V. Shmyrev 		.card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
2454e976f937SKirk Lapray 	}, {
2455e976f937SKirk Lapray 		.subvendor = PCI_VENDOR_ID_ATI,
2456e976f937SKirk Lapray 		.subdevice = 0xa101,
2457e976f937SKirk Lapray 		.card      = CX88_BOARD_ATI_HDTVWONDER,
24582b5200a7SDavid Shirley 	}, {
24592b5200a7SDavid Shirley 		.subvendor = 0x107d,
24602b5200a7SDavid Shirley 		.subdevice = 0x665f,
24612b5200a7SDavid Shirley 		.card      = CX88_BOARD_WINFAST_DTV1000,
24627418f346SLubomir Bulej 	}, {
24637418f346SLubomir Bulej 		.subvendor = 0x1461,
24647418f346SLubomir Bulej 		.subdevice = 0x000a,
24657418f346SLubomir Bulej 		.card      = CX88_BOARD_AVERTV_303,
24660fa14aa6SSteven Toth 	}, {
24670fa14aa6SSteven Toth 		.subvendor = 0x0070,
24680fa14aa6SSteven Toth 		.subdevice = 0x9200,
2469fb56cb65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
2470fb56cb65SSteven Toth 	}, {
2471fb56cb65SSteven Toth 		.subvendor = 0x0070,
2472fb56cb65SSteven Toth 		.subdevice = 0x9201,
24730fa14aa6SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
24740fa14aa6SSteven Toth 	}, {
24750fa14aa6SSteven Toth 		.subvendor = 0x0070,
24760fa14aa6SSteven Toth 		.subdevice = 0x9202,
2477fb56cb65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
24780e0351e3SVadim Catana 	}, {
24790e0351e3SVadim Catana 		.subvendor = 0x17de,
24800e0351e3SVadim Catana 		.subdevice = 0x08b2,
24810e0351e3SVadim Catana 		.card      = CX88_BOARD_KWORLD_DVBS_100,
2482611900c1SSteven Toth 	}, {
2483611900c1SSteven Toth 		.subvendor = 0x0070,
2484611900c1SSteven Toth 		.subdevice = 0x9400,
2485611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
2486611900c1SSteven Toth 	}, {
2487611900c1SSteven Toth 		.subvendor = 0x0070,
2488611900c1SSteven Toth 		.subdevice = 0x9402,
2489611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
2490611900c1SSteven Toth 	}, {
2491611900c1SSteven Toth 		.subvendor = 0x0070,
2492611900c1SSteven Toth 		.subdevice = 0x9800,
2493611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2494611900c1SSteven Toth 	}, {
2495611900c1SSteven Toth 		.subvendor = 0x0070,
2496611900c1SSteven Toth 		.subdevice = 0x9802,
2497611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2498c432a072SSteven Toth 	}, {
2499c432a072SSteven Toth 		.subvendor = 0x0070,
2500c432a072SSteven Toth 		.subdevice = 0x9001,
2501c432a072SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
2502fc40b261SChris Pascoe 	}, {
2503fc40b261SChris Pascoe 		.subvendor = 0x1822,
2504fc40b261SChris Pascoe 		.subdevice = 0x0025,
2505fc40b261SChris Pascoe 		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
2506f39624fdSManenti Marco 	}, {
2507f39624fdSManenti Marco 		.subvendor = 0x17de,
2508f39624fdSManenti Marco 		.subdevice = 0x08a1,
2509f39624fdSManenti Marco 		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
251043eabb4eSChris Pascoe 	}, {
251143eabb4eSChris Pascoe 		.subvendor = 0x18ac,
251243eabb4eSChris Pascoe 		.subdevice = 0xdb50,
251343eabb4eSChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
25146bfb2e1fSMichael Krufky 	}, {
25156bfb2e1fSMichael Krufky 		.subvendor = 0x18ac,
2516f74a6b39SMichael Krufky 		.subdevice = 0xdb54,
2517f74a6b39SMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
2518f74a6b39SMichael Krufky 		/* Re-branded DViCO: DigitalNow DVB-T Dual */
2519f74a6b39SMichael Krufky 	}, {
2520f74a6b39SMichael Krufky 		.subvendor = 0x18ac,
25216bfb2e1fSMichael Krufky 		.subdevice = 0xdb11,
25226bfb2e1fSMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
25236bfb2e1fSMichael Krufky 		/* Re-branded DViCO: UltraView DVB-T Plus */
252444256de1SMichael Krufky 	}, {
2525b3fb91d2SChris Pascoe 		.subvendor = 0x18ac,
2526b3fb91d2SChris Pascoe 		.subdevice = 0xdb30,
2527b3fb91d2SChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
2528b3fb91d2SChris Pascoe 	}, {
252944256de1SMichael Krufky 		.subvendor = 0x17de,
253044256de1SMichael Krufky 		.subdevice = 0x0840,
253144256de1SMichael Krufky 		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
25322d90fa44SJelle Foks 	}, {
25332d90fa44SJelle Foks 		.subvendor = 0x1421,
25342d90fa44SJelle Foks 		.subdevice = 0x0305,
25352d90fa44SJelle Foks 		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
2536780dfef3SChris Pascoe 	}, {
2537780dfef3SChris Pascoe 		.subvendor = 0x18ac,
2538780dfef3SChris Pascoe 		.subdevice = 0xdb40,
2539780dfef3SChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2540780dfef3SChris Pascoe 	}, {
2541780dfef3SChris Pascoe 		.subvendor = 0x18ac,
2542780dfef3SChris Pascoe 		.subdevice = 0xdb44,
2543780dfef3SChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2544da215d22SRusty Scott 	}, {
2545da215d22SRusty Scott 		.subvendor = 0x7063,
2546da215d22SRusty Scott 		.subdevice = 0x5500,
2547da215d22SRusty Scott 		.card      = CX88_BOARD_PCHDTV_HD5500,
2548b3038304SValentin Zagura 	}, {
2549b3038304SValentin Zagura 		.subvendor = 0x17de,
2550b3038304SValentin Zagura 		.subdevice = 0x0841,
2551b3038304SValentin Zagura 		.card      = CX88_BOARD_KWORLD_MCE200_DELUXE,
2552fc066478SMichael Krufky 	}, {
2553fc066478SMichael Krufky 		.subvendor = 0x1822,
2554fc066478SMichael Krufky 		.subdevice = 0x0019,
2555fc066478SMichael Krufky 		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
2556a3124622SAngelo Marconi 	}, {
2557a3124622SAngelo Marconi 		.subvendor = 0x1554,
2558a3124622SAngelo Marconi 		.subdevice = 0x4813,
2559a3124622SAngelo Marconi 		.card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
2560680543c5SRicardo Cerqueira 	}, {
2561680543c5SRicardo Cerqueira 		.subvendor = 0x14f1,
2562680543c5SRicardo Cerqueira 		.subdevice = 0x0842,
2563be4f4519SRicardo Cerqueira 		.card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
25644bd6e9d9SMalcolm Valentine 	}, {
25654bd6e9d9SMalcolm Valentine 		.subvendor = 0x107d,
25664bd6e9d9SMalcolm Valentine 		.subdevice = 0x665e,
25674bd6e9d9SMalcolm Valentine 		.card      = CX88_BOARD_WINFAST_DTV2000H,
256865271bffSMichael Krufky 	}, {
25694d14c833SVlastimil Labsky 		.subvendor = 0x107d,
25704d14c833SVlastimil Labsky 		.subdevice = 0x6f2b,
25714d14c833SVlastimil Labsky 		.card      = CX88_BOARD_WINFAST_DTV2000H_J,
25724d14c833SVlastimil Labsky 	}, {
257365271bffSMichael Krufky 		.subvendor = 0x18ac,
257465271bffSMichael Krufky 		.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
257565271bffSMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
2576c02a34f4SSaqeb Akhter 	}, {
2577c02a34f4SSaqeb Akhter 		.subvendor = 0x14f1,
2578c02a34f4SSaqeb Akhter 		.subdevice = 0x0084,
2579c02a34f4SSaqeb Akhter 		.card      = CX88_BOARD_GENIATECH_DVBS,
2580ad10c930SEric Thomas 	}, {
2581ad10c930SEric Thomas 		.subvendor = 0x0070,
2582ad10c930SEric Thomas 		.subdevice = 0x1404,
2583ad10c930SEric Thomas 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
25845dbaa2cbSMichael Krufky 	}, {
25854f3ca2f1SDirk Herrendoerfer 		.subvendor = 0x18ac,
25864f3ca2f1SDirk Herrendoerfer 		.subdevice = 0xdc00,
25874f3ca2f1SDirk Herrendoerfer 		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
25884f3ca2f1SDirk Herrendoerfer 	}, {
25894f3ca2f1SDirk Herrendoerfer 		.subvendor = 0x18ac,
25904f3ca2f1SDirk Herrendoerfer 		.subdevice = 0xdccd,
25914f3ca2f1SDirk Herrendoerfer 		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
25924f3ca2f1SDirk Herrendoerfer 	}, {
25935dbaa2cbSMichael Krufky 		.subvendor = 0x1461,
25945dbaa2cbSMichael Krufky 		.subdevice = 0xc111, /* AverMedia M150-D */
25955dbaa2cbSMichael Krufky 		/* This board is known to work with the ASUS PVR416 config */
25965dbaa2cbSMichael Krufky 		.card      = CX88_BOARD_ASUS_PVR_416,
25972acadefaSDavid Bussenschutt 	}, {
25982acadefaSDavid Bussenschutt 		.subvendor = 0xc180,
25992acadefaSDavid Bussenschutt 		.subdevice = 0xc980,
26002acadefaSDavid Bussenschutt 		.card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,
2601aa481a65SSteven Toth 	}, {
2602aa481a65SSteven Toth 		.subvendor = 0x0070,
2603aa481a65SSteven Toth 		.subdevice = 0x9600,
2604aa481a65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
2605aa481a65SSteven Toth 	}, {
2606aa481a65SSteven Toth 		.subvendor = 0x0070,
2607aa481a65SSteven Toth 		.subdevice = 0x9601,
2608aa481a65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
2609aa481a65SSteven Toth 	}, {
2610aa481a65SSteven Toth 		.subvendor = 0x0070,
2611aa481a65SSteven Toth 		.subdevice = 0x9602,
2612aa481a65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
2613dab489dfSMichael Krufky 	}, {
2614dab489dfSMichael Krufky 		.subvendor = 0x107d,
2615dab489dfSMichael Krufky 		.subdevice = 0x6632,
2616dab489dfSMichael Krufky 		.card      = CX88_BOARD_LEADTEK_PVR2000,
26174508f598SMichael Krufky 	}, {
26184508f598SMichael Krufky 		.subvendor = 0x12ab,
26194508f598SMichael Krufky 		.subdevice = 0x2300, /* Club3D Zap TV2100 */
26204508f598SMichael Krufky 		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
26213979ecc7SSteven Toth 	}, {
26223979ecc7SSteven Toth 		.subvendor = 0x0070,
26233979ecc7SSteven Toth 		.subdevice = 0x9000,
26243979ecc7SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
262576dc82abSSteven Toth 	}, {
262676dc82abSSteven Toth 		.subvendor = 0x0070,
262776dc82abSSteven Toth 		.subdevice = 0x1400,
262876dc82abSSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
262976dc82abSSteven Toth 	}, {
263076dc82abSSteven Toth 		.subvendor = 0x0070,
263176dc82abSSteven Toth 		.subdevice = 0x1401,
263276dc82abSSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
263376dc82abSSteven Toth 	}, {
263476dc82abSSteven Toth 		.subvendor = 0x0070,
263576dc82abSSteven Toth 		.subdevice = 0x1402,
263676dc82abSSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
2637733aeaf4SMichael Krufky 	}, {
2638733aeaf4SMichael Krufky 		.subvendor = 0x1421,
2639733aeaf4SMichael Krufky 		.subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
2640733aeaf4SMichael Krufky 		.card      = CX88_BOARD_KWORLD_DVBS_100,
26417cb47a14SDaniel Gimpelevich 	}, {
26427cb47a14SDaniel Gimpelevich 		.subvendor = 0x1421,
26437cb47a14SDaniel Gimpelevich 		.subdevice = 0x0390,
26447cb47a14SDaniel Gimpelevich 		.card      = CX88_BOARD_ADSTECH_PTV_390,
264560464da8SSteven Toth 	}, {
264660464da8SSteven Toth 		.subvendor = 0x11bd,
264760464da8SSteven Toth 		.subdevice = 0x0051,
264860464da8SSteven Toth 		.card      = CX88_BOARD_PINNACLE_PCTV_HD_800i,
26495c00fac0SSteven Toth 	}, {
26505c00fac0SSteven Toth 		.subvendor = 0x18ac,
26515c00fac0SSteven Toth 		.subdevice = 0xd530,
26525c00fac0SSteven Toth 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,
26539507901eSMauro Carvalho Chehab 	}, {
26549507901eSMauro Carvalho Chehab 		.subvendor = 0x12ab,
26559507901eSMauro Carvalho Chehab 		.subdevice = 0x1788,
26569507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_PINNACLE_HYBRID_PCTV,
26579507901eSMauro Carvalho Chehab 	}, {
26589507901eSMauro Carvalho Chehab 		.subvendor = 0x14f1,
26599507901eSMauro Carvalho Chehab 		.subdevice = 0xea3d,
26609507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_POWERCOLOR_REAL_ANGEL,
26619507901eSMauro Carvalho Chehab 	}, {
26629507901eSMauro Carvalho Chehab 		.subvendor = 0x107d,
26639507901eSMauro Carvalho Chehab 		.subdevice = 0x6f18,
26649507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
26659507901eSMauro Carvalho Chehab 	}, {
26669507901eSMauro Carvalho Chehab 		.subvendor = 0x14f1,
26679507901eSMauro Carvalho Chehab 		.subdevice = 0x8852,
26689507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_GENIATECH_X8000_MT,
26691117d6baSSteven Toth 	}, {
26701117d6baSSteven Toth 		.subvendor = 0x18ac,
26711117d6baSSteven Toth 		.subdevice = 0xd610,
26721117d6baSSteven Toth 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,
26732422a9b3SMauro Carvalho Chehab 	}, {
26742422a9b3SMauro Carvalho Chehab 		.subvendor = 0x1554,
26752422a9b3SMauro Carvalho Chehab 		.subdevice = 0x4935,
26762422a9b3SMauro Carvalho Chehab 		.card      = CX88_BOARD_PROLINK_PV_8000GT,
267799e09eacSMauro Carvalho Chehab 	}, {
2678a31d2bb7SMauro Carvalho Chehab 		.subvendor = 0x1554,
2679a31d2bb7SMauro Carvalho Chehab 		.subdevice = 0x4976,
2680a31d2bb7SMauro Carvalho Chehab 		.card      = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,
2681a31d2bb7SMauro Carvalho Chehab 	}, {
268299e09eacSMauro Carvalho Chehab 		.subvendor = 0x17de,
268399e09eacSMauro Carvalho Chehab 		.subdevice = 0x08c1,
268499e09eacSMauro Carvalho Chehab 		.card      = CX88_BOARD_KWORLD_ATSC_120,
26855bd1b663SSteven Toth 	}, {
26865bd1b663SSteven Toth 		.subvendor = 0x0070,
26875bd1b663SSteven Toth 		.subdevice = 0x6900,
26885bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
26895bd1b663SSteven Toth 	}, {
26905bd1b663SSteven Toth 		.subvendor = 0x0070,
26915bd1b663SSteven Toth 		.subdevice = 0x6904,
26925bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
26935bd1b663SSteven Toth 	}, {
26945bd1b663SSteven Toth 		.subvendor = 0x0070,
26955bd1b663SSteven Toth 		.subdevice = 0x6902,
26965bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
26975bd1b663SSteven Toth 	}, {
26985bd1b663SSteven Toth 		.subvendor = 0x0070,
26995bd1b663SSteven Toth 		.subdevice = 0x6905,
27005bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
27015bd1b663SSteven Toth 	}, {
27025bd1b663SSteven Toth 		.subvendor = 0x0070,
27035bd1b663SSteven Toth 		.subdevice = 0x6906,
27045bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
2705af832623SIgor M. Liplianin 	}, {
2706e4aab64cSIgor M. Liplianin 		.subvendor = 0xd420,
2707e4aab64cSIgor M. Liplianin 		.subdevice = 0x9022,
2708e4aab64cSIgor M. Liplianin 		.card      = CX88_BOARD_TEVII_S420,
2709e4aab64cSIgor M. Liplianin 	}, {
2710e4aab64cSIgor M. Liplianin 		.subvendor = 0xd460,
2711af832623SIgor M. Liplianin 		.subdevice = 0x9022,
2712af832623SIgor M. Liplianin 		.card      = CX88_BOARD_TEVII_S460,
27134cd7fb87SOleg Roitburd 	}, {
27140cb73639SIgor M. Liplianin 		.subvendor = 0xd464,
27150cb73639SIgor M. Liplianin 		.subdevice = 0x9022,
27160cb73639SIgor M. Liplianin 		.card      = CX88_BOARD_TEVII_S464,
27170cb73639SIgor M. Liplianin 	}, {
27184cd7fb87SOleg Roitburd 		.subvendor = 0xA044,
27194cd7fb87SOleg Roitburd 		.subdevice = 0x2011,
27204cd7fb87SOleg Roitburd 		.card      = CX88_BOARD_OMICOM_SS4_PCI,
2721ee73042cSOleg Roitburd 	}, {
27224b29631dSIgor M. Liplianin 		.subvendor = 0x8910,
27234b29631dSIgor M. Liplianin 		.subdevice = 0x8888,
27244b29631dSIgor M. Liplianin 		.card      = CX88_BOARD_TBS_8910,
27254b29631dSIgor M. Liplianin 	}, {
2726ee73042cSOleg Roitburd 		.subvendor = 0x8920,
2727ee73042cSOleg Roitburd 		.subdevice = 0x8888,
2728ee73042cSOleg Roitburd 		.card      = CX88_BOARD_TBS_8920,
272957f51dbcSOleg Roitburd 	}, {
2730cd3cde12SIgor M. Liplianin 		.subvendor = 0xb022,
2731cd3cde12SIgor M. Liplianin 		.subdevice = 0x3022,
2732cd3cde12SIgor M. Liplianin 		.card      = CX88_BOARD_PROF_6200,
2733cd3cde12SIgor M. Liplianin 	}, {
273457f51dbcSOleg Roitburd 		.subvendor = 0xB033,
273557f51dbcSOleg Roitburd 		.subdevice = 0x3033,
273657f51dbcSOleg Roitburd 		.card      = CX88_BOARD_PROF_7300,
27374b29631dSIgor M. Liplianin 	}, {
27384b29631dSIgor M. Liplianin 		.subvendor = 0xb200,
27394b29631dSIgor M. Liplianin 		.subdevice = 0x4200,
27404b29631dSIgor M. Liplianin 		.card      = CX88_BOARD_SATTRADE_ST4200,
274170101a27SStephan Wienczny 	}, {
274270101a27SStephan Wienczny 		.subvendor = 0x153b,
274370101a27SStephan Wienczny 		.subdevice = 0x1177,
274470101a27SStephan Wienczny 		.card      = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,
2745501d8cd4SSteven Toth 	}, {
2746501d8cd4SSteven Toth 		.subvendor = 0x0070,
2747501d8cd4SSteven Toth 		.subdevice = 0x9290,
2748501d8cd4SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_IRONLY,
27493047a176SMiroslav Sustek 	}, {
27503047a176SMiroslav Sustek 		.subvendor = 0x107d,
27513047a176SMiroslav Sustek 		.subdevice = 0x6654,
27523047a176SMiroslav Sustek 		.card      = CX88_BOARD_WINFAST_DTV1800H,
275314422f9dSMauro Carvalho Chehab 	}, {
27548eb79c0bSistvan_v@mailbox.hu 		/* WinFast DTV1800 H with XC4000 tuner */
27558eb79c0bSistvan_v@mailbox.hu 		.subvendor = 0x107d,
27568eb79c0bSistvan_v@mailbox.hu 		.subdevice = 0x6f38,
27578eb79c0bSistvan_v@mailbox.hu 		.card      = CX88_BOARD_WINFAST_DTV1800H_XC4000,
27588eb79c0bSistvan_v@mailbox.hu 	}, {
2759f271a3afSistvan_v@mailbox.hu 		.subvendor = 0x107d,
2760f271a3afSistvan_v@mailbox.hu 		.subdevice = 0x6f42,
2761f271a3afSistvan_v@mailbox.hu 		.card      = CX88_BOARD_WINFAST_DTV2000H_PLUS,
2762f271a3afSistvan_v@mailbox.hu 	}, {
276314422f9dSMauro Carvalho Chehab 		/* PVR2000 PAL Model [107d:6630] */
276414422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
276514422f9dSMauro Carvalho Chehab 		.subdevice = 0x6630,
276614422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
276714422f9dSMauro Carvalho Chehab 	}, {
276814422f9dSMauro Carvalho Chehab 		/* PVR2000 PAL Model [107d:6638] */
276914422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
277014422f9dSMauro Carvalho Chehab 		.subdevice = 0x6638,
277114422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
277214422f9dSMauro Carvalho Chehab 	}, {
277314422f9dSMauro Carvalho Chehab 		/* PVR2000 NTSC Model [107d:6631] */
277414422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
277514422f9dSMauro Carvalho Chehab 		.subdevice = 0x6631,
277614422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
277714422f9dSMauro Carvalho Chehab 	}, {
277814422f9dSMauro Carvalho Chehab 		/* PVR2000 NTSC Model [107d:6637] */
277914422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
278014422f9dSMauro Carvalho Chehab 		.subdevice = 0x6637,
278114422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
278214422f9dSMauro Carvalho Chehab 	}, {
278314422f9dSMauro Carvalho Chehab 		/* PVR2000 NTSC Model [107d:663d] */
278414422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
278514422f9dSMauro Carvalho Chehab 		.subdevice = 0x663d,
278614422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
278714422f9dSMauro Carvalho Chehab 	}, {
278814422f9dSMauro Carvalho Chehab 		/* DV2000 NTSC Model [107d:6621] */
278914422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
279014422f9dSMauro Carvalho Chehab 		.subdevice = 0x6621,
279114422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_WINFAST_DV2000,
279214422f9dSMauro Carvalho Chehab 	}, {
279314422f9dSMauro Carvalho Chehab 		/* TV2000 XP Global [107d:6618]  */
279414422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
279514422f9dSMauro Carvalho Chehab 		.subdevice = 0x6618,
279614422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
2797b699c271SIgor M. Liplianin 	}, {
279884463d5fSIstvan Varga 		/* TV2000 XP Global [107d:6618] */
279984463d5fSIstvan Varga 		.subvendor = 0x107d,
280084463d5fSIstvan Varga 		.subdevice = 0x6619,
280184463d5fSIstvan Varga 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
280284463d5fSIstvan Varga 	}, {
280384463d5fSIstvan Varga 		/* WinFast TV2000 XP Global with XC4000 tuner */
280484463d5fSIstvan Varga 		.subvendor = 0x107d,
280584463d5fSIstvan Varga 		.subdevice = 0x6f36,
280684463d5fSIstvan Varga 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36,
280784463d5fSIstvan Varga 	}, {
280884463d5fSIstvan Varga 		/* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */
280984463d5fSIstvan Varga 		.subvendor = 0x107d,
281084463d5fSIstvan Varga 		.subdevice = 0x6f43,
281184463d5fSIstvan Varga 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43,
281284463d5fSIstvan Varga 	}, {
2813b699c271SIgor M. Liplianin 		.subvendor = 0xb034,
2814b699c271SIgor M. Liplianin 		.subdevice = 0x3034,
2815b699c271SIgor M. Liplianin 		.card      = CX88_BOARD_PROF_7301,
2816111ac84aSSergey Ivanov 	}, {
2817111ac84aSSergey Ivanov 		.subvendor = 0x1822,
2818111ac84aSSergey Ivanov 		.subdevice = 0x0023,
2819111ac84aSSergey Ivanov 		.card      = CX88_BOARD_TWINHAN_VP1027_DVBS,
28202422a9b3SMauro Carvalho Chehab 	},
28211da177e4SLinus Torvalds };
28221da177e4SLinus Torvalds 
2823399426caSMauro Carvalho Chehab /*
2824399426caSMauro Carvalho Chehab  * some leadtek specific stuff
2825399426caSMauro Carvalho Chehab  */
282669f7e75aSJean Delvare static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
28271da177e4SLinus Torvalds {
28281da177e4SLinus Torvalds 	if (eeprom_data[4] != 0x7d ||
28291da177e4SLinus Torvalds 	    eeprom_data[5] != 0x10 ||
28301da177e4SLinus Torvalds 	    eeprom_data[7] != 0x66) {
283165bc2fe8SMauro Carvalho Chehab 		pr_warn("Leadtek eeprom invalid.\n");
28321da177e4SLinus Torvalds 		return;
28331da177e4SLinus Torvalds 	}
28341da177e4SLinus Torvalds 
283514422f9dSMauro Carvalho Chehab 	/* Terry Wu <terrywu2009@gmail.com> */
283614422f9dSMauro Carvalho Chehab 	switch (eeprom_data[6]) {
283714422f9dSMauro Carvalho Chehab 	case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
283814422f9dSMauro Carvalho Chehab 	case 0x21: /* SSID 6621 for DV2000 NTSC Model */
283914422f9dSMauro Carvalho Chehab 	case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
284014422f9dSMauro Carvalho Chehab 	case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
284114422f9dSMauro Carvalho Chehab 	case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
284214422f9dSMauro Carvalho Chehab 		core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
284314422f9dSMauro Carvalho Chehab 		break;
284414422f9dSMauro Carvalho Chehab 	default:
284514422f9dSMauro Carvalho Chehab 		core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
284614422f9dSMauro Carvalho Chehab 		break;
284714422f9dSMauro Carvalho Chehab 	}
28481da177e4SLinus Torvalds 
284965bc2fe8SMauro Carvalho Chehab 	pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n",
28500f19e65bSMauro Carvalho Chehab 		core->board.tuner_type, eeprom_data[0]);
28511da177e4SLinus Torvalds }
28521da177e4SLinus Torvalds 
28531da177e4SLinus Torvalds static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
28541da177e4SLinus Torvalds {
28551da177e4SLinus Torvalds 	struct tveeprom tv;
28561da177e4SLinus Torvalds 
2857446aba66SMauro Carvalho Chehab 	tveeprom_hauppauge_analog(&tv, eeprom_data);
28586a59d64cSTrent Piepho 	core->board.tuner_type = tv.tuner_type;
28590345c387SSteven Toth 	core->tuner_formats = tv.tuner_formats;
28606a59d64cSTrent Piepho 	core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;
286148a8a03bSMauro Carvalho Chehab 	core->model = tv.model;
28621da177e4SLinus Torvalds 
28631da177e4SLinus Torvalds 	/* Make sure we support the board model */
2864399426caSMauro Carvalho Chehab 	switch (tv.model) {
286576dc82abSSteven Toth 	case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
286676dc82abSSteven Toth 	case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
286776dc82abSSteven Toth 	case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
286876dc82abSSteven Toth 	case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
286976dc82abSSteven Toth 	case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
287076dc82abSSteven Toth 	case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
2871ad10c930SEric Thomas 	case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
287276dc82abSSteven Toth 	case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
287376dc82abSSteven Toth 	case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
28740345c387SSteven Toth 	case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
287542d2b6efSIan Pickworth 	case 34519: /* WinTV-PCI-FM */
28765bd1b663SSteven Toth 	case 69009:
28775bd1b663SSteven Toth 		/* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
28785bd1b663SSteven Toth 	case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
28795bd1b663SSteven Toth 	case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
28805bd1b663SSteven Toth 	case 69559:
28815bd1b663SSteven Toth 		/* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
28825bd1b663SSteven Toth 	case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
2883759324c3SSteven Toth 	case 90002: /* Nova-T-PCI (9002) */
28840fe22865SSteven Toth 	case 92001: /* Nova-S-Plus (Video and IR) */
28850fe22865SSteven Toth 	case 92002: /* Nova-S-Plus (Video and IR) */
28860fe22865SSteven Toth 	case 90003: /* Nova-T-PCI (9002 No RF out) */
2887759324c3SSteven Toth 	case 90500: /* Nova-T-PCI (oem) */
2888759324c3SSteven Toth 	case 90501: /* Nova-T-PCI (oem/IR) */
28893ca0ea98SSteven Toth 	case 92000: /* Nova-SE2 (OEM, No Video or IR) */
2890501d8cd4SSteven Toth 	case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */
2891611900c1SSteven Toth 	case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
2892611900c1SSteven Toth 	case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
2893aa481a65SSteven Toth 	case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
2894aa481a65SSteven Toth 	case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
2895aa481a65SSteven Toth 	case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
2896aa481a65SSteven Toth 	case 96569: /* WinTV-HVR1300 () */
2897aa481a65SSteven Toth 	case 96659: /* WinTV-HVR1300 () */
2898611900c1SSteven Toth 	case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
28991da177e4SLinus Torvalds 		/* known */
29001da177e4SLinus Torvalds 		break;
29014f3ca2f1SDirk Herrendoerfer 	case CX88_BOARD_SAMSUNG_SMT_7020:
29024f3ca2f1SDirk Herrendoerfer 		cx_set(MO_GP0_IO, 0x008989FF);
29034f3ca2f1SDirk Herrendoerfer 		break;
29041da177e4SLinus Torvalds 	default:
290565bc2fe8SMauro Carvalho Chehab 		pr_warn("warning: unknown hauppauge model #%d\n", tv.model);
29061da177e4SLinus Torvalds 		break;
29071da177e4SLinus Torvalds 	}
29081da177e4SLinus Torvalds 
290965bc2fe8SMauro Carvalho Chehab 	pr_info("hauppauge eeprom: model=%d\n", tv.model);
29101da177e4SLinus Torvalds }
29111da177e4SLinus Torvalds 
2912399426caSMauro Carvalho Chehab /*
2913399426caSMauro Carvalho Chehab  * some GDI (was: Modular Technology) specific stuff
2914399426caSMauro Carvalho Chehab  */
29151da177e4SLinus Torvalds 
29162e4e98e7Slawrence rust static const struct {
29171da177e4SLinus Torvalds 	int  id;
29181da177e4SLinus Torvalds 	int  fm;
29192e4e98e7Slawrence rust 	const char *name;
29201da177e4SLinus Torvalds } gdi_tuner[] = {
2921c39ba330SHans Verkuil 	[0x01] = { .id   = UNSET,
29221da177e4SLinus Torvalds 		   .name = "NTSC_M" },
2923c39ba330SHans Verkuil 	[0x02] = { .id   = UNSET,
29241da177e4SLinus Torvalds 		   .name = "PAL_B" },
2925c39ba330SHans Verkuil 	[0x03] = { .id   = UNSET,
29261da177e4SLinus Torvalds 		   .name = "PAL_I" },
2927c39ba330SHans Verkuil 	[0x04] = { .id   = UNSET,
29281da177e4SLinus Torvalds 		   .name = "PAL_D" },
2929c39ba330SHans Verkuil 	[0x05] = { .id   = UNSET,
29301da177e4SLinus Torvalds 		   .name = "SECAM" },
29311da177e4SLinus Torvalds 
2932c39ba330SHans Verkuil 	[0x10] = { .id   = UNSET,
29331da177e4SLinus Torvalds 		   .fm   = 1,
29341da177e4SLinus Torvalds 		   .name = "TEMIC_4049" },
29351da177e4SLinus Torvalds 	[0x11] = { .id   = TUNER_TEMIC_4136FY5,
29361da177e4SLinus Torvalds 		   .name = "TEMIC_4136" },
2937c39ba330SHans Verkuil 	[0x12] = { .id   = UNSET,
29381da177e4SLinus Torvalds 		   .name = "TEMIC_4146" },
29391da177e4SLinus Torvalds 
29401da177e4SLinus Torvalds 	[0x20] = { .id   = TUNER_PHILIPS_FQ1216ME,
29411da177e4SLinus Torvalds 		   .fm   = 1,
29421da177e4SLinus Torvalds 		   .name = "PHILIPS_FQ1216_MK3" },
2943c39ba330SHans Verkuil 	[0x21] = { .id   = UNSET, .fm = 1,
29441da177e4SLinus Torvalds 		   .name = "PHILIPS_FQ1236_MK3" },
2945c39ba330SHans Verkuil 	[0x22] = { .id   = UNSET,
29461da177e4SLinus Torvalds 		   .name = "PHILIPS_FI1236_MK3" },
2947c39ba330SHans Verkuil 	[0x23] = { .id   = UNSET,
29481da177e4SLinus Torvalds 		   .name = "PHILIPS_FI1216_MK3" },
29491da177e4SLinus Torvalds };
29501da177e4SLinus Torvalds 
29511da177e4SLinus Torvalds static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
29521da177e4SLinus Torvalds {
29532e4e98e7Slawrence rust 	const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
29541da177e4SLinus Torvalds 		? gdi_tuner[eeprom_data[0x0d]].name : NULL;
29551da177e4SLinus Torvalds 
295665bc2fe8SMauro Carvalho Chehab 	pr_info("GDI: tuner=%s\n", name ? name : "unknown");
2957399426caSMauro Carvalho Chehab 	if (!name)
29581da177e4SLinus Torvalds 		return;
29596a59d64cSTrent Piepho 	core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
29606a59d64cSTrent Piepho 	core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?
29616a59d64cSTrent Piepho 		CX88_RADIO : 0;
29621da177e4SLinus Torvalds }
29631da177e4SLinus Torvalds 
2964399426caSMauro Carvalho Chehab /*
2965399426caSMauro Carvalho Chehab  * some Divco specific stuff
2966399426caSMauro Carvalho Chehab  */
29670be51b46SMauro Carvalho Chehab static int cx88_dvico_xc2028_callback(struct cx88_core *core,
29680be51b46SMauro Carvalho Chehab 				      int command, int arg)
2969b3fb91d2SChris Pascoe {
2970b3fb91d2SChris Pascoe 	switch (command) {
2971b3fb91d2SChris Pascoe 	case XC2028_TUNER_RESET:
2972d7cba043SMichael Krufky 		switch (core->boardnr) {
2973d7cba043SMichael Krufky 		case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
2974d7cba043SMichael Krufky 			/* GPIO-4 xc3028 tuner */
2975d7cba043SMichael Krufky 
2976d7cba043SMichael Krufky 			cx_set(MO_GP0_IO, 0x00001000);
2977d7cba043SMichael Krufky 			cx_clear(MO_GP0_IO, 0x00000010);
2978d7cba043SMichael Krufky 			msleep(100);
2979d7cba043SMichael Krufky 			cx_set(MO_GP0_IO, 0x00000010);
2980d7cba043SMichael Krufky 			msleep(100);
2981d7cba043SMichael Krufky 			break;
2982d7cba043SMichael Krufky 		default:
29838765561fSChris Pascoe 			cx_write(MO_GP0_IO, 0x101000);
29848765561fSChris Pascoe 			mdelay(5);
29858765561fSChris Pascoe 			cx_set(MO_GP0_IO, 0x101010);
2986d7cba043SMichael Krufky 		}
2987b3fb91d2SChris Pascoe 		break;
2988b3fb91d2SChris Pascoe 	default:
2989b3fb91d2SChris Pascoe 		return -EINVAL;
2990b3fb91d2SChris Pascoe 	}
2991b3fb91d2SChris Pascoe 
2992b3fb91d2SChris Pascoe 	return 0;
2993b3fb91d2SChris Pascoe }
2994b3fb91d2SChris Pascoe 
2995399426caSMauro Carvalho Chehab /*
2996399426caSMauro Carvalho Chehab  * some Geniatech specific stuff
2997399426caSMauro Carvalho Chehab  */
29989507901eSMauro Carvalho Chehab 
29990be51b46SMauro Carvalho Chehab static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
30000be51b46SMauro Carvalho Chehab 						int command, int mode)
30019507901eSMauro Carvalho Chehab {
30029507901eSMauro Carvalho Chehab 	switch (command) {
30039507901eSMauro Carvalho Chehab 	case XC2028_TUNER_RESET:
30049507901eSMauro Carvalho Chehab 		switch (INPUT(core->input).type) {
30059507901eSMauro Carvalho Chehab 		case CX88_RADIO:
3006c450e50eSMauro Carvalho Chehab 			break;
30079507901eSMauro Carvalho Chehab 		case CX88_VMUX_DVB:
30089507901eSMauro Carvalho Chehab 			cx_write(MO_GP1_IO, 0x030302);
30099507901eSMauro Carvalho Chehab 			mdelay(50);
3010c450e50eSMauro Carvalho Chehab 			break;
30119507901eSMauro Carvalho Chehab 		default:
30129507901eSMauro Carvalho Chehab 			cx_write(MO_GP1_IO, 0x030301);
30139507901eSMauro Carvalho Chehab 			mdelay(50);
3014c450e50eSMauro Carvalho Chehab 		}
30159507901eSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
30169507901eSMauro Carvalho Chehab 		mdelay(50);
30179507901eSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101000);
30189507901eSMauro Carvalho Chehab 		mdelay(50);
30199507901eSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
30209507901eSMauro Carvalho Chehab 		mdelay(50);
30219507901eSMauro Carvalho Chehab 		return 0;
30229507901eSMauro Carvalho Chehab 	}
30239507901eSMauro Carvalho Chehab 	return -EINVAL;
30249507901eSMauro Carvalho Chehab }
30259507901eSMauro Carvalho Chehab 
30263047a176SMiroslav Sustek static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
30273047a176SMiroslav Sustek 					     int command, int arg)
30283047a176SMiroslav Sustek {
30293047a176SMiroslav Sustek 	switch (command) {
30303047a176SMiroslav Sustek 	case XC2028_TUNER_RESET:
30313047a176SMiroslav Sustek 		/* GPIO 12 (xc3028 tuner reset) */
30323047a176SMiroslav Sustek 		cx_set(MO_GP1_IO, 0x1010);
30333047a176SMiroslav Sustek 		mdelay(50);
30343047a176SMiroslav Sustek 		cx_clear(MO_GP1_IO, 0x10);
30354699903eSAlan Cox 		mdelay(75);
30363047a176SMiroslav Sustek 		cx_set(MO_GP1_IO, 0x10);
30374699903eSAlan Cox 		mdelay(75);
30383047a176SMiroslav Sustek 		return 0;
30393047a176SMiroslav Sustek 	}
30403047a176SMiroslav Sustek 	return -EINVAL;
30413047a176SMiroslav Sustek }
30423047a176SMiroslav Sustek 
3043f271a3afSistvan_v@mailbox.hu static int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core,
3044f271a3afSistvan_v@mailbox.hu 						  int command, int arg)
3045f271a3afSistvan_v@mailbox.hu {
3046f271a3afSistvan_v@mailbox.hu 	switch (command) {
3047f271a3afSistvan_v@mailbox.hu 	case XC4000_TUNER_RESET:
3048f271a3afSistvan_v@mailbox.hu 		/* GPIO 12 (xc4000 tuner reset) */
3049f271a3afSistvan_v@mailbox.hu 		cx_set(MO_GP1_IO, 0x1010);
3050f271a3afSistvan_v@mailbox.hu 		mdelay(50);
3051f271a3afSistvan_v@mailbox.hu 		cx_clear(MO_GP1_IO, 0x10);
3052f271a3afSistvan_v@mailbox.hu 		mdelay(75);
3053f271a3afSistvan_v@mailbox.hu 		cx_set(MO_GP1_IO, 0x10);
3054f271a3afSistvan_v@mailbox.hu 		mdelay(75);
3055f271a3afSistvan_v@mailbox.hu 		return 0;
3056f271a3afSistvan_v@mailbox.hu 	}
3057f271a3afSistvan_v@mailbox.hu 	return -EINVAL;
3058f271a3afSistvan_v@mailbox.hu }
3059f271a3afSistvan_v@mailbox.hu 
3060399426caSMauro Carvalho Chehab /*
3061399426caSMauro Carvalho Chehab  * some Divco specific stuff
3062399426caSMauro Carvalho Chehab  */
30630be51b46SMauro Carvalho Chehab static int cx88_pv_8000gt_callback(struct cx88_core *core,
30640be51b46SMauro Carvalho Chehab 				   int command, int arg)
30652422a9b3SMauro Carvalho Chehab {
30662422a9b3SMauro Carvalho Chehab 	switch (command) {
30672422a9b3SMauro Carvalho Chehab 	case XC2028_TUNER_RESET:
30682422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
30692422a9b3SMauro Carvalho Chehab 		mdelay(50);
30702422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xef5);
30712422a9b3SMauro Carvalho Chehab 		mdelay(50);
30722422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
30732422a9b3SMauro Carvalho Chehab 		break;
30742422a9b3SMauro Carvalho Chehab 	default:
30752422a9b3SMauro Carvalho Chehab 		return -EINVAL;
30762422a9b3SMauro Carvalho Chehab 	}
30772422a9b3SMauro Carvalho Chehab 
30782422a9b3SMauro Carvalho Chehab 	return 0;
30792422a9b3SMauro Carvalho Chehab }
30802422a9b3SMauro Carvalho Chehab 
3081399426caSMauro Carvalho Chehab /*
3082399426caSMauro Carvalho Chehab  * some DViCO specific stuff
3083399426caSMauro Carvalho Chehab  */
3084780dfef3SChris Pascoe 
3085780dfef3SChris Pascoe static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
3086780dfef3SChris Pascoe {
3087780dfef3SChris Pascoe 	struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
3088780dfef3SChris Pascoe 	int i, err;
308969b27e3dSChris Pascoe 	static u8 init_bufs[13][5] = {
3090780dfef3SChris Pascoe 		{ 0x10, 0x00, 0x20, 0x01, 0x03 },
3091780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x01, 0x00, 0x21 },
3092780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x10, 0x00, 0xCA },
3093780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x12, 0x00, 0x08 },
3094780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x13, 0x00, 0x0A },
3095780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x16, 0x01, 0xC0 },
3096780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x22, 0x01, 0x3D },
3097780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x73, 0x01, 0x2E },
3098780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x72, 0x00, 0xC5 },
3099780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x71, 0x01, 0x97 },
3100780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x70, 0x00, 0x0F },
3101780dfef3SChris Pascoe 		{ 0x10, 0x10, 0xB0, 0x00, 0x01 },
3102780dfef3SChris Pascoe 		{ 0x03, 0x0C },
3103780dfef3SChris Pascoe 	};
3104780dfef3SChris Pascoe 
31055b9c4e6dSMauro Carvalho Chehab 	for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {
3106780dfef3SChris Pascoe 		msg.buf = init_bufs[i];
3107780dfef3SChris Pascoe 		msg.len = (i != 12 ? 5 : 2);
3108780dfef3SChris Pascoe 		err = i2c_transfer(&core->i2c_adap, &msg, 1);
3109780dfef3SChris Pascoe 		if (err != 1) {
311065bc2fe8SMauro Carvalho Chehab 			pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n",
3111e318e584SMauro Carvalho Chehab 				i, err);
3112780dfef3SChris Pascoe 			return;
3113780dfef3SChris Pascoe 		}
3114780dfef3SChris Pascoe 	}
3115780dfef3SChris Pascoe }
3116780dfef3SChris Pascoe 
31170be51b46SMauro Carvalho Chehab static int cx88_xc2028_tuner_callback(struct cx88_core *core,
31180be51b46SMauro Carvalho Chehab 				      int command, int arg)
3119c2cb8fccSMauro Carvalho Chehab {
31209507901eSMauro Carvalho Chehab 	/* Board-specific callbacks */
31219507901eSMauro Carvalho Chehab 	switch (core->boardnr) {
31229507901eSMauro Carvalho Chehab 	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
31239507901eSMauro Carvalho Chehab 	case CX88_BOARD_GENIATECH_X8000_MT:
312499e09eacSMauro Carvalho Chehab 	case CX88_BOARD_KWORLD_ATSC_120:
31250be51b46SMauro Carvalho Chehab 		return cx88_xc3028_geniatech_tuner_callback(core,
31260be51b46SMauro Carvalho Chehab 							command, arg);
31272422a9b3SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_8000GT:
3128a31d2bb7SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
31290be51b46SMauro Carvalho Chehab 		return cx88_pv_8000gt_callback(core, command, arg);
3130b3fb91d2SChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
3131d7cba043SMichael Krufky 	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
31320be51b46SMauro Carvalho Chehab 		return cx88_dvico_xc2028_callback(core, command, arg);
313314422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
31343047a176SMiroslav Sustek 	case CX88_BOARD_WINFAST_DTV1800H:
31353047a176SMiroslav Sustek 		return cx88_xc3028_winfast1800h_callback(core, command, arg);
31369507901eSMauro Carvalho Chehab 	}
31379507901eSMauro Carvalho Chehab 
3138c2cb8fccSMauro Carvalho Chehab 	switch (command) {
3139c2cb8fccSMauro Carvalho Chehab 	case XC2028_TUNER_RESET:
3140c2cb8fccSMauro Carvalho Chehab 		switch (INPUT(core->input).type) {
3141c2cb8fccSMauro Carvalho Chehab 		case CX88_RADIO:
314202615ed5SMauro Carvalho Chehab 			dprintk(1, "setting GPIO to radio!\n");
3143c2cb8fccSMauro Carvalho Chehab 			cx_write(MO_GP0_IO, 0x4ff);
3144c2cb8fccSMauro Carvalho Chehab 			mdelay(250);
3145c2cb8fccSMauro Carvalho Chehab 			cx_write(MO_GP2_IO, 0xff);
3146c2cb8fccSMauro Carvalho Chehab 			mdelay(250);
3147c450e50eSMauro Carvalho Chehab 			break;
3148c2cb8fccSMauro Carvalho Chehab 		case CX88_VMUX_DVB:	/* Digital TV*/
3149c2cb8fccSMauro Carvalho Chehab 		default:		/* Analog TV */
315002615ed5SMauro Carvalho Chehab 			dprintk(1, "setting GPIO to TV!\n");
3151c450e50eSMauro Carvalho Chehab 			break;
3152c450e50eSMauro Carvalho Chehab 		}
3153c2cb8fccSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
3154c2cb8fccSMauro Carvalho Chehab 		mdelay(250);
3155c2cb8fccSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101000);
3156c2cb8fccSMauro Carvalho Chehab 		mdelay(250);
3157c2cb8fccSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
3158c2cb8fccSMauro Carvalho Chehab 		mdelay(250);
3159c2cb8fccSMauro Carvalho Chehab 		return 0;
3160c2cb8fccSMauro Carvalho Chehab 	}
3161c2cb8fccSMauro Carvalho Chehab 	return -EINVAL;
3162c2cb8fccSMauro Carvalho Chehab }
3163c2cb8fccSMauro Carvalho Chehab 
3164c21973e8Sistvan_v@mailbox.hu static int cx88_xc4000_tuner_callback(struct cx88_core *core,
3165c21973e8Sistvan_v@mailbox.hu 				      int command, int arg)
3166c21973e8Sistvan_v@mailbox.hu {
3167c21973e8Sistvan_v@mailbox.hu 	/* Board-specific callbacks */
3168c21973e8Sistvan_v@mailbox.hu 	switch (core->boardnr) {
31698eb79c0bSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
3170f271a3afSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
317184463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
317284463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
3173f271a3afSistvan_v@mailbox.hu 		return cx88_xc4000_winfast2000h_plus_callback(core,
3174f271a3afSistvan_v@mailbox.hu 							      command, arg);
3175c21973e8Sistvan_v@mailbox.hu 	}
3176c21973e8Sistvan_v@mailbox.hu 	return -EINVAL;
3177c21973e8Sistvan_v@mailbox.hu }
3178c21973e8Sistvan_v@mailbox.hu 
3179399426caSMauro Carvalho Chehab /*
3180399426caSMauro Carvalho Chehab  * Tuner callback function. Currently only needed for the Pinnacle
3181399426caSMauro Carvalho Chehab  * PCTV HD 800i with an xc5000 sillicon tuner. This is used for both
3182399426caSMauro Carvalho Chehab  * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c)
3183399426caSMauro Carvalho Chehab  */
31840be51b46SMauro Carvalho Chehab static int cx88_xc5000_tuner_callback(struct cx88_core *core,
31850be51b46SMauro Carvalho Chehab 				      int command, int arg)
318660464da8SSteven Toth {
318760464da8SSteven Toth 	switch (core->boardnr) {
318860464da8SSteven Toth 	case CX88_BOARD_PINNACLE_PCTV_HD_800i:
318960464da8SSteven Toth 		if (command == 0) { /* This is the reset command from xc5000 */
3190b8d91986SDevin Heitmueller 
3191399426caSMauro Carvalho Chehab 			/*
3192399426caSMauro Carvalho Chehab 			 * djh - According to the engineer at PCTV Systems,
3193399426caSMauro Carvalho Chehab 			 * the xc5000 reset pin is supposed to be on GPIO12.
3194399426caSMauro Carvalho Chehab 			 * However, despite three nights of effort, pulling
3195399426caSMauro Carvalho Chehab 			 * that GPIO low didn't reset the xc5000.  While
3196399426caSMauro Carvalho Chehab 			 * pulling MO_SRST_IO low does reset the xc5000, this
3197399426caSMauro Carvalho Chehab 			 * also resets in the s5h1409 being reset as well.
3198399426caSMauro Carvalho Chehab 			 * This causes tuning to always fail since the internal
3199399426caSMauro Carvalho Chehab 			 * state of the s5h1409 does not match the driver's
3200399426caSMauro Carvalho Chehab 			 * state.  Given that the only two conditions in which
3201399426caSMauro Carvalho Chehab 			 * the driver performs a reset is during firmware load
3202399426caSMauro Carvalho Chehab 			 * and powering down the chip, I am taking out the
3203399426caSMauro Carvalho Chehab 			 * reset.  We know that the chip is being reset
3204399426caSMauro Carvalho Chehab 			 * when the cx88 comes online, and not being able to
3205399426caSMauro Carvalho Chehab 			 * do power management for this board is worse than
3206399426caSMauro Carvalho Chehab 			 * not having any tuning at all.
3207399426caSMauro Carvalho Chehab 			 */
320860464da8SSteven Toth 			return 0;
3209399426caSMauro Carvalho Chehab 		}
3210399426caSMauro Carvalho Chehab 
321102615ed5SMauro Carvalho Chehab 		dprintk(1, "xc5000: unknown tuner callback command.\n");
321260464da8SSteven Toth 		return -EINVAL;
32131117d6baSSteven Toth 	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
32141117d6baSSteven Toth 		if (command == 0) { /* This is the reset command from xc5000 */
32151117d6baSSteven Toth 			cx_clear(MO_GP0_IO, 0x00000010);
3216399426caSMauro Carvalho Chehab 			usleep_range(10000, 20000);
32171117d6baSSteven Toth 			cx_set(MO_GP0_IO, 0x00000010);
32181117d6baSSteven Toth 			return 0;
3219399426caSMauro Carvalho Chehab 		}
3220399426caSMauro Carvalho Chehab 
322102615ed5SMauro Carvalho Chehab 		dprintk(1, "xc5000: unknown tuner callback command.\n");
32221117d6baSSteven Toth 		return -EINVAL;
32231117d6baSSteven Toth 	}
322460464da8SSteven Toth 	return 0; /* Should never be here */
322560464da8SSteven Toth }
3226c2cb8fccSMauro Carvalho Chehab 
3227d7cba043SMichael Krufky int cx88_tuner_callback(void *priv, int component, int command, int arg)
3228c2cb8fccSMauro Carvalho Chehab {
3229c2cb8fccSMauro Carvalho Chehab 	struct i2c_algo_bit_data *i2c_algo = priv;
32300be51b46SMauro Carvalho Chehab 	struct cx88_core *core;
32310be51b46SMauro Carvalho Chehab 
32320be51b46SMauro Carvalho Chehab 	if (!i2c_algo) {
323365bc2fe8SMauro Carvalho Chehab 		pr_err("Error - i2c private data undefined.\n");
32340be51b46SMauro Carvalho Chehab 		return -EINVAL;
32350be51b46SMauro Carvalho Chehab 	}
32360be51b46SMauro Carvalho Chehab 
32370be51b46SMauro Carvalho Chehab 	core = i2c_algo->data;
32380be51b46SMauro Carvalho Chehab 
32390be51b46SMauro Carvalho Chehab 	if (!core) {
324065bc2fe8SMauro Carvalho Chehab 		pr_err("Error - device struct undefined.\n");
32410be51b46SMauro Carvalho Chehab 		return -EINVAL;
32420be51b46SMauro Carvalho Chehab 	}
3243c2cb8fccSMauro Carvalho Chehab 
3244d7cba043SMichael Krufky 	if (component != DVB_FRONTEND_COMPONENT_TUNER)
3245d7cba043SMichael Krufky 		return -EINVAL;
3246d7cba043SMichael Krufky 
3247c2cb8fccSMauro Carvalho Chehab 	switch (core->board.tuner_type) {
3248c2cb8fccSMauro Carvalho Chehab 	case TUNER_XC2028:
324902615ed5SMauro Carvalho Chehab 		dprintk(1, "Calling XC2028/3028 callback\n");
32500be51b46SMauro Carvalho Chehab 		return cx88_xc2028_tuner_callback(core, command, arg);
3251c21973e8Sistvan_v@mailbox.hu 	case TUNER_XC4000:
325202615ed5SMauro Carvalho Chehab 		dprintk(1, "Calling XC4000 callback\n");
3253c21973e8Sistvan_v@mailbox.hu 		return cx88_xc4000_tuner_callback(core, command, arg);
3254c2cb8fccSMauro Carvalho Chehab 	case TUNER_XC5000:
325502615ed5SMauro Carvalho Chehab 		dprintk(1, "Calling XC5000 callback\n");
32560be51b46SMauro Carvalho Chehab 		return cx88_xc5000_tuner_callback(core, command, arg);
3257c2cb8fccSMauro Carvalho Chehab 	}
325865bc2fe8SMauro Carvalho Chehab 	pr_err("Error: Calling callback for tuner %d\n",
32590f19e65bSMauro Carvalho Chehab 	       core->board.tuner_type);
3260c2cb8fccSMauro Carvalho Chehab 	return -EINVAL;
3261c2cb8fccSMauro Carvalho Chehab }
326260464da8SSteven Toth EXPORT_SYMBOL(cx88_tuner_callback);
326360464da8SSteven Toth 
326460464da8SSteven Toth /* ----------------------------------------------------------------------- */
32651da177e4SLinus Torvalds 
3266bbc83597STrent Piepho static void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
32671da177e4SLinus Torvalds {
32681da177e4SLinus Torvalds 	int i;
32691da177e4SLinus Torvalds 
3270399426caSMauro Carvalho Chehab 	if (!pci->subsystem_vendor && !pci->subsystem_device) {
327165bc2fe8SMauro Carvalho Chehab 		pr_err("Your board has no valid PCI Subsystem ID and thus can't\n");
327265bc2fe8SMauro Carvalho Chehab 		pr_err("be autodetected.  Please pass card=<n> insmod option to\n");
327365bc2fe8SMauro Carvalho Chehab 		pr_err("workaround that.  Redirect complaints to the vendor of\n");
327465bc2fe8SMauro Carvalho Chehab 		pr_err("the TV card\n");
32751da177e4SLinus Torvalds 	} else {
327665bc2fe8SMauro Carvalho Chehab 		pr_err("Your board isn't known (yet) to the driver.  You can\n");
327765bc2fe8SMauro Carvalho Chehab 		pr_err("try to pick one of the existing card configs via\n");
327865bc2fe8SMauro Carvalho Chehab 		pr_err("card=<n> insmod option.  Updating to the latest\n");
327965bc2fe8SMauro Carvalho Chehab 		pr_err("version might help as well.\n");
32801da177e4SLinus Torvalds 	}
328165bc2fe8SMauro Carvalho Chehab 	pr_err("Here is a list of valid choices for the card=<n> insmod option:\n");
3282bbc83597STrent Piepho 	for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)
328365bc2fe8SMauro Carvalho Chehab 		pr_err("    card=%d -> %s\n", i, cx88_boards[i].name);
32841da177e4SLinus Torvalds }
32851da177e4SLinus Torvalds 
3286bbc83597STrent Piepho static void cx88_card_setup_pre_i2c(struct cx88_core *core)
3287aa481a65SSteven Toth {
32886a59d64cSTrent Piepho 	switch (core->boardnr) {
3289aa481a65SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1300:
32902491fbb7SSteven Toth 		/*
3291399426caSMauro Carvalho Chehab 		 * Bring the 702 demod up before i2c scanning/attach or
3292399426caSMauro Carvalho Chehab 		 * devices are hidden.
3293399426caSMauro Carvalho Chehab 		 *
32942491fbb7SSteven Toth 		 * We leave here with the 702 on the bus
32952491fbb7SSteven Toth 		 *
32962491fbb7SSteven Toth 		 * "reset the IR receiver on GPIO[3]"
32972491fbb7SSteven Toth 		 * Reported by Mike Crash <mike AT mikecrash.com>
32982491fbb7SSteven Toth 		 */
32992491fbb7SSteven Toth 		cx_write(MO_GP0_IO, 0x0000ef88);
3300aa481a65SSteven Toth 		udelay(1000);
33012491fbb7SSteven Toth 		cx_clear(MO_GP0_IO, 0x00000088);
3302aa481a65SSteven Toth 		udelay(50);
33032491fbb7SSteven Toth 		cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */
3304aa481a65SSteven Toth 		udelay(1000);
3305aa481a65SSteven Toth 		break;
33062422a9b3SMauro Carvalho Chehab 
3307a31d2bb7SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
33082422a9b3SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_8000GT:
33092422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
33102422a9b3SMauro Carvalho Chehab 		mdelay(50);
33112422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xef5);
33122422a9b3SMauro Carvalho Chehab 		mdelay(50);
33132422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
3314399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
33152422a9b3SMauro Carvalho Chehab 		break;
33162422a9b3SMauro Carvalho Chehab 
33171117d6baSSteven Toth 	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
33181117d6baSSteven Toth 		/* Enable the xc5000 tuner */
33191117d6baSSteven Toth 		cx_set(MO_GP0_IO, 0x00001010);
33201117d6baSSteven Toth 		break;
33212491fbb7SSteven Toth 
332227b93d8aSMiroslav Slugen 	case CX88_BOARD_WINFAST_DTV2000H_J:
33232491fbb7SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR3000:
33245bd1b663SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR4000:
33252491fbb7SSteven Toth 		/* Init GPIO */
33262491fbb7SSteven Toth 		cx_write(MO_GP0_IO, core->board.input[0].gpio0);
33275bd1b663SSteven Toth 		udelay(1000);
33282f3af9e6SDarron Broad 		cx_clear(MO_GP0_IO, 0x00000080);
33292f3af9e6SDarron Broad 		udelay(50);
33302f3af9e6SDarron Broad 		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
33312f3af9e6SDarron Broad 		udelay(1000);
33322491fbb7SSteven Toth 		break;
33333047a176SMiroslav Sustek 
333414422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
33353047a176SMiroslav Sustek 	case CX88_BOARD_WINFAST_DTV1800H:
333679a5b9a2Sistvan_v@mailbox.hu 		cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0);
33373047a176SMiroslav Sustek 		break;
3338111ac84aSSergey Ivanov 
33398eb79c0bSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
3340f271a3afSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
334184463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
334284463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
3343f271a3afSistvan_v@mailbox.hu 		cx88_xc4000_winfast2000h_plus_callback(core,
3344f271a3afSistvan_v@mailbox.hu 						       XC4000_TUNER_RESET, 0);
3345f271a3afSistvan_v@mailbox.hu 		break;
3346f271a3afSistvan_v@mailbox.hu 
3347111ac84aSSergey Ivanov 	case CX88_BOARD_TWINHAN_VP1027_DVBS:
3348111ac84aSSergey Ivanov 		cx_write(MO_GP0_IO, 0x00003230);
3349111ac84aSSergey Ivanov 		cx_write(MO_GP0_IO, 0x00003210);
3350399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
3351111ac84aSSergey Ivanov 		cx_write(MO_GP0_IO, 0x00001230);
3352111ac84aSSergey Ivanov 		break;
3353aa481a65SSteven Toth 	}
3354aa481a65SSteven Toth }
3355aa481a65SSteven Toth 
335699e09eacSMauro Carvalho Chehab /*
335799e09eacSMauro Carvalho Chehab  * Sets board-dependent xc3028 configuration
335899e09eacSMauro Carvalho Chehab  */
335999e09eacSMauro Carvalho Chehab void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
336099e09eacSMauro Carvalho Chehab {
336199e09eacSMauro Carvalho Chehab 	memset(ctl, 0, sizeof(*ctl));
336299e09eacSMauro Carvalho Chehab 
336399e09eacSMauro Carvalho Chehab 	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
336499e09eacSMauro Carvalho Chehab 	ctl->max_len = 64;
336599e09eacSMauro Carvalho Chehab 
336699e09eacSMauro Carvalho Chehab 	switch (core->boardnr) {
336799e09eacSMauro Carvalho Chehab 	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
3368a9606ce6SDaniel Gimpelevich 		/* Now works with firmware version 2.7 */
3369a9606ce6SDaniel Gimpelevich 		if (core->i2c_algo.udelay < 16)
3370a9606ce6SDaniel Gimpelevich 			core->i2c_algo.udelay = 16;
337199e09eacSMauro Carvalho Chehab 		break;
337299e09eacSMauro Carvalho Chehab 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
33733047a176SMiroslav Sustek 	case CX88_BOARD_WINFAST_DTV1800H:
337419c309e3STim Farrington 		ctl->demod = XC3028_FE_ZARLINK456;
337599e09eacSMauro Carvalho Chehab 		break;
337699e09eacSMauro Carvalho Chehab 	case CX88_BOARD_KWORLD_ATSC_120:
337799e09eacSMauro Carvalho Chehab 	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
337899e09eacSMauro Carvalho Chehab 		ctl->demod = XC3028_FE_OREN538;
337999e09eacSMauro Carvalho Chehab 		break;
338093b99923SDevin Heitmueller 	case CX88_BOARD_GENIATECH_X8000_MT:
3381399426caSMauro Carvalho Chehab 		/*
3382399426caSMauro Carvalho Chehab 		 * FIXME: For this board, the xc3028 never recovers after being
3383399426caSMauro Carvalho Chehab 		 * powered down (the reset GPIO probably is not set properly).
3384399426caSMauro Carvalho Chehab 		 * We don't have access to the hardware so we cannot determine
3385399426caSMauro Carvalho Chehab 		 * which GPIO is used for xc3028, so just disable power xc3028
3386399426caSMauro Carvalho Chehab 		 * power management for now
3387399426caSMauro Carvalho Chehab 		 */
338893b99923SDevin Heitmueller 		ctl->disable_power_mgmt = 1;
338993b99923SDevin Heitmueller 		break;
339014422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
3391a31d2bb7SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
339299e09eacSMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_8000GT:
339399e09eacSMauro Carvalho Chehab 		/*
3394a31d2bb7SMauro Carvalho Chehab 		 * Those boards uses non-MTS firmware
339599e09eacSMauro Carvalho Chehab 		 */
339699e09eacSMauro Carvalho Chehab 		break;
33973f6014fcSStéphane Voltz 	case CX88_BOARD_PINNACLE_HYBRID_PCTV:
339870101a27SStephan Wienczny 	case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
33993f6014fcSStéphane Voltz 		ctl->demod = XC3028_FE_ZARLINK456;
34003f6014fcSStéphane Voltz 		ctl->mts = 1;
34013f6014fcSStéphane Voltz 		break;
340299e09eacSMauro Carvalho Chehab 	default:
340399e09eacSMauro Carvalho Chehab 		ctl->demod = XC3028_FE_OREN538;
340499e09eacSMauro Carvalho Chehab 		ctl->mts = 1;
340599e09eacSMauro Carvalho Chehab 	}
340699e09eacSMauro Carvalho Chehab }
340799e09eacSMauro Carvalho Chehab EXPORT_SYMBOL_GPL(cx88_setup_xc3028);
340899e09eacSMauro Carvalho Chehab 
3409bbc83597STrent Piepho static void cx88_card_setup(struct cx88_core *core)
34101da177e4SLinus Torvalds {
34113ca0ea98SSteven Toth 	static u8 eeprom[256];
34124bf1226aSMauro Carvalho Chehab 	struct tuner_setup tun_setup;
3413ad020dc2SMauro Carvalho Chehab 	unsigned int mode_mask = T_RADIO | T_ANALOG_TV;
34144bf1226aSMauro Carvalho Chehab 
34154bf1226aSMauro Carvalho Chehab 	memset(&tun_setup, 0, sizeof(tun_setup));
34161da177e4SLinus Torvalds 
3417399426caSMauro Carvalho Chehab 	if (!core->i2c_rc) {
34181da177e4SLinus Torvalds 		core->i2c_client.addr = 0xa0 >> 1;
34191da177e4SLinus Torvalds 		tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));
34201da177e4SLinus Torvalds 	}
34211da177e4SLinus Torvalds 
34226a59d64cSTrent Piepho 	switch (core->boardnr) {
34231da177e4SLinus Torvalds 	case CX88_BOARD_HAUPPAUGE:
34241da177e4SLinus Torvalds 	case CX88_BOARD_HAUPPAUGE_ROSLYN:
3425399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34261da177e4SLinus Torvalds 			hauppauge_eeprom(core, eeprom + 8);
34271da177e4SLinus Torvalds 		break;
34281da177e4SLinus Torvalds 	case CX88_BOARD_GDI:
3429399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34301da177e4SLinus Torvalds 			gdi_eeprom(core, eeprom);
34311da177e4SLinus Torvalds 		break;
343214422f9dSMauro Carvalho Chehab 	case CX88_BOARD_LEADTEK_PVR2000:
343314422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_DV2000:
34341da177e4SLinus Torvalds 	case CX88_BOARD_WINFAST2000XP_EXPERT:
3435399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34361da177e4SLinus Torvalds 			leadtek_eeprom(core, eeprom);
34371da177e4SLinus Torvalds 		break;
34380fa14aa6SSteven Toth 	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
34390fa14aa6SSteven Toth 	case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
34401da177e4SLinus Torvalds 	case CX88_BOARD_HAUPPAUGE_DVB_T1:
3441611900c1SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1100:
3442611900c1SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1100LP:
3443ad10c930SEric Thomas 	case CX88_BOARD_HAUPPAUGE_HVR3000:
3444aa481a65SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1300:
34455bd1b663SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR4000:
34465bd1b663SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
3447501d8cd4SSteven Toth 	case CX88_BOARD_HAUPPAUGE_IRONLY:
3448399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34493ca0ea98SSteven Toth 			hauppauge_eeprom(core, eeprom);
34501da177e4SLinus Torvalds 		break;
34510e0351e3SVadim Catana 	case CX88_BOARD_KWORLD_DVBS_100:
34520e0351e3SVadim Catana 		cx_write(MO_GP0_IO, 0x000007f8);
34530e0351e3SVadim Catana 		cx_write(MO_GP1_IO, 0x00000001);
34540e0351e3SVadim Catana 		break;
34558765561fSChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
34568765561fSChris Pascoe 		/* GPIO0:0 is hooked to demod reset */
34578765561fSChris Pascoe 		/* GPIO0:4 is hooked to xc3028 reset */
34588765561fSChris Pascoe 		cx_write(MO_GP0_IO, 0x00111100);
3459399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
34608765561fSChris Pascoe 		cx_write(MO_GP0_IO, 0x00111111);
34618765561fSChris Pascoe 		break;
3462d536e9c4SChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
3463d536e9c4SChris Pascoe 		/* GPIO0:6 is hooked to FX2 reset pin */
3464d536e9c4SChris Pascoe 		cx_set(MO_GP0_IO, 0x00004040);
3465d536e9c4SChris Pascoe 		cx_clear(MO_GP0_IO, 0x00000040);
3466d536e9c4SChris Pascoe 		msleep(1000);
3467d536e9c4SChris Pascoe 		cx_set(MO_GP0_IO, 0x00004040);
3468d536e9c4SChris Pascoe 		/* FALLTHROUGH */
34691da177e4SLinus Torvalds 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
34701da177e4SLinus Torvalds 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
3471780dfef3SChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
34721da177e4SLinus Torvalds 		/* GPIO0:0 is hooked to mt352 reset pin */
34731da177e4SLinus Torvalds 		cx_set(MO_GP0_IO, 0x00000101);
34741da177e4SLinus Torvalds 		cx_clear(MO_GP0_IO, 0x00000001);
3475399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
34761da177e4SLinus Torvalds 		cx_set(MO_GP0_IO, 0x00000101);
3477399426caSMauro Carvalho Chehab 		if (!core->i2c_rc &&
34786a59d64cSTrent Piepho 		    core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
3479780dfef3SChris Pascoe 			dvico_fusionhdtv_hybrid_init(core);
34801da177e4SLinus Torvalds 		break;
34811da177e4SLinus Torvalds 	case CX88_BOARD_KWORLD_DVB_T:
34821da177e4SLinus Torvalds 	case CX88_BOARD_DNTV_LIVE_DVB_T:
34831da177e4SLinus Torvalds 		cx_set(MO_GP0_IO, 0x00000707);
34841da177e4SLinus Torvalds 		cx_set(MO_GP2_IO, 0x00000101);
34851da177e4SLinus Torvalds 		cx_clear(MO_GP2_IO, 0x00000001);
3486399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
34871da177e4SLinus Torvalds 		cx_clear(MO_GP0_IO, 0x00000007);
34881da177e4SLinus Torvalds 		cx_set(MO_GP2_IO, 0x00000101);
34891da177e4SLinus Torvalds 		break;
3490fc40b261SChris Pascoe 	case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
3491fc40b261SChris Pascoe 		cx_write(MO_GP0_IO, 0x00080808);
3492fc40b261SChris Pascoe 		break;
3493e976f937SKirk Lapray 	case CX88_BOARD_ATI_HDTVWONDER:
3494399426caSMauro Carvalho Chehab 		if (!core->i2c_rc) {
3495e976f937SKirk Lapray 			/* enable tuner */
3496e976f937SKirk Lapray 			int i;
34975b9c4e6dSMauro Carvalho Chehab 			static const u8 buffer[][2] = {
34985b9c4e6dSMauro Carvalho Chehab 				{0x10, 0x12},
34995b9c4e6dSMauro Carvalho Chehab 				{0x13, 0x04},
35005b9c4e6dSMauro Carvalho Chehab 				{0x16, 0x00},
35015b9c4e6dSMauro Carvalho Chehab 				{0x14, 0x04},
35025b9c4e6dSMauro Carvalho Chehab 				{0x17, 0x00}
35035b9c4e6dSMauro Carvalho Chehab 			};
3504e976f937SKirk Lapray 			core->i2c_client.addr = 0x0a;
3505e976f937SKirk Lapray 
35065b9c4e6dSMauro Carvalho Chehab 			for (i = 0; i < ARRAY_SIZE(buffer); i++)
3507399426caSMauro Carvalho Chehab 				if (i2c_master_send(&core->i2c_client,
3508399426caSMauro Carvalho Chehab 						    buffer[i], 2) != 2)
350965bc2fe8SMauro Carvalho Chehab 					pr_warn("Unable to enable tuner(%i).\n",
3510e318e584SMauro Carvalho Chehab 						i);
3511e976f937SKirk Lapray 		}
3512e976f937SKirk Lapray 		break;
351355c88610SMauro Carvalho Chehab 	case CX88_BOARD_MSI_TVANYWHERE_MASTER:
351455c88610SMauro Carvalho Chehab 	{
351555c88610SMauro Carvalho Chehab 		struct v4l2_priv_tun_config tea5767_cfg;
351655c88610SMauro Carvalho Chehab 		struct tea5767_ctrl ctl;
351755c88610SMauro Carvalho Chehab 
351855c88610SMauro Carvalho Chehab 		memset(&ctl, 0, sizeof(ctl));
351955c88610SMauro Carvalho Chehab 
352055c88610SMauro Carvalho Chehab 		ctl.high_cut  = 1;
352155c88610SMauro Carvalho Chehab 		ctl.st_noise  = 1;
352255c88610SMauro Carvalho Chehab 		ctl.deemph_75 = 1;
352355c88610SMauro Carvalho Chehab 		ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
352455c88610SMauro Carvalho Chehab 
352555c88610SMauro Carvalho Chehab 		tea5767_cfg.tuner = TUNER_TEA5767;
352655c88610SMauro Carvalho Chehab 		tea5767_cfg.priv  = &ctl;
352755c88610SMauro Carvalho Chehab 
3528b8341e1dSHans Verkuil 		call_all(core, tuner, s_config, &tea5767_cfg);
3529af832623SIgor M. Liplianin 		break;
353055c88610SMauro Carvalho Chehab 	}
3531e4aab64cSIgor M. Liplianin 	case  CX88_BOARD_TEVII_S420:
3532af832623SIgor M. Liplianin 	case  CX88_BOARD_TEVII_S460:
35330cb73639SIgor M. Liplianin 	case  CX88_BOARD_TEVII_S464:
35344cd7fb87SOleg Roitburd 	case  CX88_BOARD_OMICOM_SS4_PCI:
35354b29631dSIgor M. Liplianin 	case  CX88_BOARD_TBS_8910:
3536ee73042cSOleg Roitburd 	case  CX88_BOARD_TBS_8920:
3537cd3cde12SIgor M. Liplianin 	case  CX88_BOARD_PROF_6200:
353857f51dbcSOleg Roitburd 	case  CX88_BOARD_PROF_7300:
3539b699c271SIgor M. Liplianin 	case  CX88_BOARD_PROF_7301:
35404b29631dSIgor M. Liplianin 	case  CX88_BOARD_SATTRADE_ST4200:
3541ad5f74c0SIgor M. Liplianin 		cx_write(MO_GP0_IO, 0x8000);
3542ad5f74c0SIgor M. Liplianin 		msleep(100);
3543ee73042cSOleg Roitburd 		cx_write(MO_SRST_IO, 0);
3544399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
3545ad5f74c0SIgor M. Liplianin 		cx_write(MO_GP0_IO, 0x8080);
3546ee73042cSOleg Roitburd 		msleep(100);
3547ee73042cSOleg Roitburd 		cx_write(MO_SRST_IO, 1);
3548ee73042cSOleg Roitburd 		msleep(100);
3549ee73042cSOleg Roitburd 		break;
35504bf1226aSMauro Carvalho Chehab 	} /*end switch() */
35514bf1226aSMauro Carvalho Chehab 
35524bf1226aSMauro Carvalho Chehab 	/* Setup tuners */
3553399426caSMauro Carvalho Chehab 	if (core->board.radio_type != UNSET) {
35544bf1226aSMauro Carvalho Chehab 		tun_setup.mode_mask      = T_RADIO;
35554bf1226aSMauro Carvalho Chehab 		tun_setup.type           = core->board.radio_type;
35564bf1226aSMauro Carvalho Chehab 		tun_setup.addr           = core->board.radio_addr;
35574bf1226aSMauro Carvalho Chehab 		tun_setup.tuner_callback = cx88_tuner_callback;
3558b8341e1dSHans Verkuil 		call_all(core, tuner, s_type_addr, &tun_setup);
35594bf1226aSMauro Carvalho Chehab 		mode_mask &= ~T_RADIO;
35604bf1226aSMauro Carvalho Chehab 	}
35614bf1226aSMauro Carvalho Chehab 
3562c39ba330SHans Verkuil 	if (core->board.tuner_type != UNSET) {
35634bf1226aSMauro Carvalho Chehab 		tun_setup.mode_mask      = mode_mask;
35644bf1226aSMauro Carvalho Chehab 		tun_setup.type           = core->board.tuner_type;
35654bf1226aSMauro Carvalho Chehab 		tun_setup.addr           = core->board.tuner_addr;
35664bf1226aSMauro Carvalho Chehab 		tun_setup.tuner_callback = cx88_tuner_callback;
35674bf1226aSMauro Carvalho Chehab 
3568b8341e1dSHans Verkuil 		call_all(core, tuner, s_type_addr, &tun_setup);
35694bf1226aSMauro Carvalho Chehab 	}
35704bf1226aSMauro Carvalho Chehab 
35714bf1226aSMauro Carvalho Chehab 	if (core->board.tda9887_conf) {
35724bf1226aSMauro Carvalho Chehab 		struct v4l2_priv_tun_config tda9887_cfg;
35734bf1226aSMauro Carvalho Chehab 
35744bf1226aSMauro Carvalho Chehab 		tda9887_cfg.tuner = TUNER_TDA9887;
35754bf1226aSMauro Carvalho Chehab 		tda9887_cfg.priv  = &core->board.tda9887_conf;
35764bf1226aSMauro Carvalho Chehab 
3577b8341e1dSHans Verkuil 		call_all(core, tuner, s_config, &tda9887_cfg);
35781da177e4SLinus Torvalds 	}
3579c2cb8fccSMauro Carvalho Chehab 
3580c2cb8fccSMauro Carvalho Chehab 	if (core->board.tuner_type == TUNER_XC2028) {
3581c2cb8fccSMauro Carvalho Chehab 		struct v4l2_priv_tun_config  xc2028_cfg;
3582c2cb8fccSMauro Carvalho Chehab 		struct xc2028_ctrl           ctl;
3583c2cb8fccSMauro Carvalho Chehab 
358499e09eacSMauro Carvalho Chehab 		/* Fills device-dependent initialization parameters */
358599e09eacSMauro Carvalho Chehab 		cx88_setup_xc3028(core, &ctl);
358699e09eacSMauro Carvalho Chehab 
358799e09eacSMauro Carvalho Chehab 		/* Sends parameters to xc2028/3028 tuner */
3588a9317abfSMauro Carvalho Chehab 		memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
3589c2cb8fccSMauro Carvalho Chehab 		xc2028_cfg.tuner = TUNER_XC2028;
3590c2cb8fccSMauro Carvalho Chehab 		xc2028_cfg.priv  = &ctl;
359102615ed5SMauro Carvalho Chehab 		dprintk(1, "Asking xc2028/3028 to load firmware %s\n",
359264016330SMauro Carvalho Chehab 			ctl.fname);
3593b8341e1dSHans Verkuil 		call_all(core, tuner, s_config, &xc2028_cfg);
3594c2cb8fccSMauro Carvalho Chehab 	}
3595622b828aSLaurent Pinchart 	call_all(core, core, s_power, 0);
35961da177e4SLinus Torvalds }
35971da177e4SLinus Torvalds 
35981da177e4SLinus Torvalds /* ------------------------------------------------------------------ */
35991da177e4SLinus Torvalds 
3600bbc83597STrent Piepho static int cx88_pci_quirks(const char *name, struct pci_dev *pci)
3601bbc83597STrent Piepho {
3602bbc83597STrent Piepho 	unsigned int lat = UNSET;
3603bbc83597STrent Piepho 	u8 ctrl = 0;
3604bbc83597STrent Piepho 	u8 value;
3605bbc83597STrent Piepho 
3606bbc83597STrent Piepho 	/* check pci quirks */
3607bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_TRITON) {
360865bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_TRITON -- set TBFX\n");
3609bbc83597STrent Piepho 		ctrl |= CX88X_EN_TBFX;
3610bbc83597STrent Piepho 	}
3611bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_NATOMA) {
361265bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n");
3613bbc83597STrent Piepho 		ctrl |= CX88X_EN_TBFX;
3614bbc83597STrent Piepho 	}
3615bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_VIAETBF) {
361665bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n");
3617bbc83597STrent Piepho 		ctrl |= CX88X_EN_TBFX;
3618bbc83597STrent Piepho 	}
3619bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_VSFX) {
362065bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_VSFX -- set VSFX\n");
3621bbc83597STrent Piepho 		ctrl |= CX88X_EN_VSFX;
3622bbc83597STrent Piepho 	}
3623bbc83597STrent Piepho #ifdef PCIPCI_ALIMAGIK
3624bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_ALIMAGIK) {
362565bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n");
3626bbc83597STrent Piepho 		lat = 0x0A;
3627bbc83597STrent Piepho 	}
3628bbc83597STrent Piepho #endif
3629bbc83597STrent Piepho 
3630bbc83597STrent Piepho 	/* check insmod options */
36317b61ba8fSMauro Carvalho Chehab 	if (latency != UNSET)
3632bbc83597STrent Piepho 		lat = latency;
3633bbc83597STrent Piepho 
3634bbc83597STrent Piepho 	/* apply stuff */
3635bbc83597STrent Piepho 	if (ctrl) {
3636bbc83597STrent Piepho 		pci_read_config_byte(pci, CX88X_DEVCTRL, &value);
3637bbc83597STrent Piepho 		value |= ctrl;
3638bbc83597STrent Piepho 		pci_write_config_byte(pci, CX88X_DEVCTRL, value);
3639bbc83597STrent Piepho 	}
36407b61ba8fSMauro Carvalho Chehab 	if (lat != UNSET) {
3641399426caSMauro Carvalho Chehab 		pr_info("setting pci latency timer to %d\n", latency);
3642bbc83597STrent Piepho 		pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);
3643bbc83597STrent Piepho 	}
3644bbc83597STrent Piepho 	return 0;
3645bbc83597STrent Piepho }
3646bbc83597STrent Piepho 
3647bbc83597STrent Piepho int cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)
3648bbc83597STrent Piepho {
3649bbc83597STrent Piepho 	if (request_mem_region(pci_resource_start(pci, 0),
3650bbc83597STrent Piepho 			       pci_resource_len(pci, 0),
3651bbc83597STrent Piepho 			       core->name))
3652bbc83597STrent Piepho 		return 0;
365365bc2fe8SMauro Carvalho Chehab 	pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",
365465bc2fe8SMauro Carvalho Chehab 	       PCI_FUNC(pci->devfn),
3655bbc83597STrent Piepho 	       (unsigned long long)pci_resource_start(pci, 0),
3656bbc83597STrent Piepho 	       pci->subsystem_vendor, pci->subsystem_device);
3657bbc83597STrent Piepho 	return -EBUSY;
3658bbc83597STrent Piepho }
3659bbc83597STrent Piepho 
3660399426caSMauro Carvalho Chehab /*
3661399426caSMauro Carvalho Chehab  * Allocate and initialize the cx88 core struct.  One should hold the
3662399426caSMauro Carvalho Chehab  * devlist mutex before calling this.
3663399426caSMauro Carvalho Chehab  */
3664bbc83597STrent Piepho struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
3665bbc83597STrent Piepho {
3666bbc83597STrent Piepho 	struct cx88_core *core;
3667bbc83597STrent Piepho 	int i;
3668bbc83597STrent Piepho 
3669bbc83597STrent Piepho 	core = kzalloc(sizeof(*core), GFP_KERNEL);
3670399426caSMauro Carvalho Chehab 	if (!core)
3671fbc0ae20SAlan Cox 		return NULL;
3672bbc83597STrent Piepho 
3673*a8d8e38aSElena Reshetova 	refcount_set(&core->refcount, 1);
3674bbc83597STrent Piepho 	core->pci_bus  = pci->bus->number;
3675bbc83597STrent Piepho 	core->pci_slot = PCI_SLOT(pci->devfn);
36768ddac9eeSTrent Piepho 	core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |
36778ddac9eeSTrent Piepho 			    PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |
36788ddac9eeSTrent Piepho 			    PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;
3679bbc83597STrent Piepho 	mutex_init(&core->lock);
3680bbc83597STrent Piepho 
3681bbc83597STrent Piepho 	core->nr = nr;
3682bbc83597STrent Piepho 	sprintf(core->name, "cx88[%d]", core->nr);
36839467fe12SHans Verkuil 
3684ccd6f1d4SHans Verkuil 	core->tvnorm = V4L2_STD_NTSC_M;
3685ccd6f1d4SHans Verkuil 	core->width   = 320;
3686ccd6f1d4SHans Verkuil 	core->height  = 240;
3687ccd6f1d4SHans Verkuil 	core->field   = V4L2_FIELD_INTERLACED;
3688ccd6f1d4SHans Verkuil 
36899467fe12SHans Verkuil 	strcpy(core->v4l2_dev.name, core->name);
36909467fe12SHans Verkuil 	if (v4l2_device_register(NULL, &core->v4l2_dev)) {
36919467fe12SHans Verkuil 		kfree(core);
36929467fe12SHans Verkuil 		return NULL;
36939467fe12SHans Verkuil 	}
36949467fe12SHans Verkuil 
36958c7cb12aSHans Verkuil 	if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) {
36968c7cb12aSHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
36978c7cb12aSHans Verkuil 		kfree(core);
36988c7cb12aSHans Verkuil 		return NULL;
36998c7cb12aSHans Verkuil 	}
37008c7cb12aSHans Verkuil 
37018c7cb12aSHans Verkuil 	if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) {
37028c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->video_hdl);
3703bac63981SHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
3704bac63981SHans Verkuil 		kfree(core);
3705bac63981SHans Verkuil 		return NULL;
3706bac63981SHans Verkuil 	}
3707bac63981SHans Verkuil 
37087b61ba8fSMauro Carvalho Chehab 	if (cx88_get_resources(core, pci) != 0) {
37098c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->video_hdl);
37108c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->audio_hdl);
37119467fe12SHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
3712bbc83597STrent Piepho 		kfree(core);
3713bbc83597STrent Piepho 		return NULL;
3714bbc83597STrent Piepho 	}
3715bbc83597STrent Piepho 
3716bbc83597STrent Piepho 	/* PCI stuff */
3717bbc83597STrent Piepho 	cx88_pci_quirks(core->name, pci);
3718bbc83597STrent Piepho 	core->lmmio = ioremap(pci_resource_start(pci, 0),
3719bbc83597STrent Piepho 			      pci_resource_len(pci, 0));
3720bbc83597STrent Piepho 	core->bmmio = (u8 __iomem *)core->lmmio;
3721bbc83597STrent Piepho 
3722399426caSMauro Carvalho Chehab 	if (!core->lmmio) {
3723bac63981SHans Verkuil 		release_mem_region(pci_resource_start(pci, 0),
3724bac63981SHans Verkuil 				   pci_resource_len(pci, 0));
37258c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->video_hdl);
37268c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->audio_hdl);
3727bac63981SHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
3728fbc0ae20SAlan Cox 		kfree(core);
3729fbc0ae20SAlan Cox 		return NULL;
3730fbc0ae20SAlan Cox 	}
3731fbc0ae20SAlan Cox 
3732bbc83597STrent Piepho 	/* board config */
3733bbc83597STrent Piepho 	core->boardnr = UNSET;
3734bbc83597STrent Piepho 	if (card[core->nr] < ARRAY_SIZE(cx88_boards))
3735bbc83597STrent Piepho 		core->boardnr = card[core->nr];
3736399426caSMauro Carvalho Chehab 	for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++)
3737bbc83597STrent Piepho 		if (pci->subsystem_vendor == cx88_subids[i].subvendor &&
3738bbc83597STrent Piepho 		    pci->subsystem_device == cx88_subids[i].subdevice)
3739bbc83597STrent Piepho 			core->boardnr = cx88_subids[i].card;
37407b61ba8fSMauro Carvalho Chehab 	if (core->boardnr == UNSET) {
3741bbc83597STrent Piepho 		core->boardnr = CX88_BOARD_UNKNOWN;
3742bbc83597STrent Piepho 		cx88_card_list(core, pci);
3743bbc83597STrent Piepho 	}
3744bbc83597STrent Piepho 
3745b5237747SEzequiel Garcia 	core->board = cx88_boards[core->boardnr];
3746bbc83597STrent Piepho 
37473007703dSMauro Carvalho Chehab 	if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
3748363c35fcSSteven Toth 		core->board.num_frontends = 1;
3749363c35fcSSteven Toth 
375065bc2fe8SMauro Carvalho Chehab 	pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
37510f19e65bSMauro Carvalho Chehab 		pci->subsystem_vendor, pci->subsystem_device, core->board.name,
3752bbc83597STrent Piepho 		core->boardnr, card[core->nr] == core->boardnr ?
3753363c35fcSSteven Toth 		"insmod option" : "autodetected",
3754363c35fcSSteven Toth 		core->board.num_frontends);
3755bbc83597STrent Piepho 
3756bbc83597STrent Piepho 	if (tuner[core->nr] != UNSET)
3757bbc83597STrent Piepho 		core->board.tuner_type = tuner[core->nr];
3758bbc83597STrent Piepho 	if (radio[core->nr] != UNSET)
3759bbc83597STrent Piepho 		core->board.radio_type = radio[core->nr];
3760bbc83597STrent Piepho 
376102615ed5SMauro Carvalho Chehab 	dprintk(1, "TV tuner type %d, Radio tuner type %d\n",
37620f19e65bSMauro Carvalho Chehab 		core->board.tuner_type, core->board.radio_type);
3763bbc83597STrent Piepho 
3764bbc83597STrent Piepho 	/* init hardware */
3765bbc83597STrent Piepho 	cx88_reset(core);
3766bbc83597STrent Piepho 	cx88_card_setup_pre_i2c(core);
3767bbc83597STrent Piepho 	cx88_i2c_init(core, pci);
3768189bf5f0SMauro Carvalho Chehab 
3769189bf5f0SMauro Carvalho Chehab 	/* load tuner module, if needed */
37707b61ba8fSMauro Carvalho Chehab 	if (core->board.tuner_type != UNSET) {
3771399426caSMauro Carvalho Chehab 		/*
3772399426caSMauro Carvalho Chehab 		 * Ignore 0x6b and 0x6f on cx88 boards.
377343d5eab7SHans Verkuil 		 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
3774399426caSMauro Carvalho Chehab 		 * and an RTC at 0x6f which can get corrupted if probed.
3775399426caSMauro Carvalho Chehab 		 */
377643d5eab7SHans Verkuil 		static const unsigned short tv_addrs[] = {
377743d5eab7SHans Verkuil 			0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
377843d5eab7SHans Verkuil 			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
377943d5eab7SHans Verkuil 			0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,
378043d5eab7SHans Verkuil 			I2C_CLIENT_END
378143d5eab7SHans Verkuil 		};
3782b8341e1dSHans Verkuil 		int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);
3783b8341e1dSHans Verkuil 
3784399426caSMauro Carvalho Chehab 		/*
3785399426caSMauro Carvalho Chehab 		 * I don't trust the radio_type as is stored in the card
3786399426caSMauro Carvalho Chehab 		 * definitions, so we just probe for it.
3787399426caSMauro Carvalho Chehab 		 * The radio_type is sometimes missing, or set to UNSET but
3788399426caSMauro Carvalho Chehab 		 * later code configures a tea5767.
3789b8341e1dSHans Verkuil 		 */
379053dacb15SHans Verkuil 		v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
3791399426caSMauro Carvalho Chehab 				    "tuner", 0,
3792399426caSMauro Carvalho Chehab 				    v4l2_i2c_tuner_addrs(ADDRS_RADIO));
3793b8341e1dSHans Verkuil 		if (has_demod)
379453dacb15SHans Verkuil 			v4l2_i2c_new_subdev(&core->v4l2_dev,
37959a1f8b34SLaurent Pinchart 					    &core->i2c_adap, "tuner",
379653dacb15SHans Verkuil 				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
3797b8341e1dSHans Verkuil 		if (core->board.tuner_addr == ADDR_UNSET) {
379853dacb15SHans Verkuil 			v4l2_i2c_new_subdev(&core->v4l2_dev,
37999a1f8b34SLaurent Pinchart 					    &core->i2c_adap, "tuner",
380053dacb15SHans Verkuil 				0, has_demod ? tv_addrs + 4 : tv_addrs);
3801b8341e1dSHans Verkuil 		} else {
3802e6574f2fSHans Verkuil 			v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
3803399426caSMauro Carvalho Chehab 					    "tuner", core->board.tuner_addr,
3804399426caSMauro Carvalho Chehab 					    NULL);
3805b8341e1dSHans Verkuil 		}
3806b8341e1dSHans Verkuil 	}
3807189bf5f0SMauro Carvalho Chehab 
3808bbc83597STrent Piepho 	cx88_card_setup(core);
380989c3bc78SJean Delvare 	if (!disable_ir) {
381015ceb6b1SJean Delvare 		cx88_i2c_init_ir(core);
3811bbc83597STrent Piepho 		cx88_ir_init(core, pci);
381289c3bc78SJean Delvare 	}
3813bbc83597STrent Piepho 
3814bbc83597STrent Piepho 	return core;
3815bbc83597STrent Piepho }
3816