xref: /linux/drivers/media/pci/cx88/cx88-cards.c (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1c942fddfSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * device driver for Conexant 2388x based TV cards
41da177e4SLinus Torvalds  * card-specific stuff.
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
71da177e4SLinus Torvalds  */
81da177e4SLinus Torvalds 
965bc2fe8SMauro Carvalho Chehab #include "cx88.h"
1065bc2fe8SMauro Carvalho Chehab #include "tea5767.h"
1165bc2fe8SMauro Carvalho Chehab #include "xc4000.h"
1265bc2fe8SMauro Carvalho Chehab 
131da177e4SLinus Torvalds #include <linux/init.h>
141da177e4SLinus Torvalds #include <linux/module.h>
151da177e4SLinus Torvalds #include <linux/pci.h>
161da177e4SLinus Torvalds #include <linux/delay.h>
175a0e3ad6STejun Heo #include <linux/slab.h>
181da177e4SLinus Torvalds 
19bbc83597STrent Piepho static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
20bbc83597STrent Piepho static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
21bbc83597STrent Piepho static unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
22bbc83597STrent Piepho 
23bbc83597STrent Piepho module_param_array(tuner, int, NULL, 0444);
24bbc83597STrent Piepho module_param_array(radio, int, NULL, 0444);
25bbc83597STrent Piepho module_param_array(card,  int, NULL, 0444);
26bbc83597STrent Piepho 
27bbc83597STrent Piepho MODULE_PARM_DESC(tuner, "tuner type");
28bbc83597STrent Piepho MODULE_PARM_DESC(radio, "radio tuner type");
29bbc83597STrent Piepho MODULE_PARM_DESC(card, "card type");
30bbc83597STrent Piepho 
31bbc83597STrent Piepho static unsigned int latency = UNSET;
32bbc83597STrent Piepho module_param(latency, int, 0444);
33bbc83597STrent Piepho MODULE_PARM_DESC(latency, "pci latency timer");
34bbc83597STrent Piepho 
3589c3bc78SJean Delvare static int disable_ir;
3689c3bc78SJean Delvare module_param(disable_ir, int, 0444);
3797108cf6SMauro Carvalho Chehab MODULE_PARM_DESC(disable_ir, "Disable IR support");
3889c3bc78SJean Delvare 
3902615ed5SMauro Carvalho Chehab #define dprintk(level, fmt, arg...)	do {				\
4002615ed5SMauro Carvalho Chehab 	if (cx88_core_debug >= level)					\
4165bc2fe8SMauro Carvalho Chehab 		printk(KERN_DEBUG pr_fmt("%s: core:" fmt),		\
4265bc2fe8SMauro Carvalho Chehab 			__func__, ##arg);				\
4302615ed5SMauro Carvalho Chehab } while (0)
4402615ed5SMauro Carvalho Chehab 
451da177e4SLinus Torvalds /* ------------------------------------------------------------------ */
461da177e4SLinus Torvalds /* board config info                                                  */
471da177e4SLinus Torvalds 
484bf1226aSMauro Carvalho Chehab /* If radio_type !=UNSET, radio_addr should be specified
494bf1226aSMauro Carvalho Chehab  */
504bf1226aSMauro Carvalho Chehab 
51bbc83597STrent Piepho static const struct cx88_board cx88_boards[] = {
521da177e4SLinus Torvalds 	[CX88_BOARD_UNKNOWN] = {
531da177e4SLinus Torvalds 		.name		= "UNKNOWN/GENERIC",
541da177e4SLinus Torvalds 		.tuner_type     = UNSET,
55b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
56b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
57b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
581da177e4SLinus Torvalds 		.input          = { {
591da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
601da177e4SLinus Torvalds 			.vmux   = 0,
611da177e4SLinus Torvalds 		}, {
621da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE2,
631da177e4SLinus Torvalds 			.vmux   = 1,
641da177e4SLinus Torvalds 		}, {
651da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE3,
661da177e4SLinus Torvalds 			.vmux   = 2,
671da177e4SLinus Torvalds 		}, {
681da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE4,
691da177e4SLinus Torvalds 			.vmux   = 3,
701da177e4SLinus Torvalds 		} },
711da177e4SLinus Torvalds 	},
721da177e4SLinus Torvalds 	[CX88_BOARD_HAUPPAUGE] = {
731da177e4SLinus Torvalds 		.name		= "Hauppauge WinTV 34xxx models",
741da177e4SLinus Torvalds 		.tuner_type     = UNSET,
75b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
76b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
77b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
781da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
791da177e4SLinus Torvalds 		.input          = { {
801da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
811da177e4SLinus Torvalds 			.vmux   = 0,
821da177e4SLinus Torvalds 			.gpio0  = 0xff00,  // internal decoder
831da177e4SLinus Torvalds 		}, {
841da177e4SLinus Torvalds 			.type   = CX88_VMUX_DEBUG,
851da177e4SLinus Torvalds 			.vmux   = 0,
861da177e4SLinus Torvalds 			.gpio0  = 0xff01,  // mono from tuner chip
871da177e4SLinus Torvalds 		}, {
881da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
891da177e4SLinus Torvalds 			.vmux   = 1,
901da177e4SLinus Torvalds 			.gpio0  = 0xff02,
911da177e4SLinus Torvalds 		}, {
921da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
931da177e4SLinus Torvalds 			.vmux   = 2,
941da177e4SLinus Torvalds 			.gpio0  = 0xff02,
951da177e4SLinus Torvalds 		} },
961da177e4SLinus Torvalds 		.radio = {
971da177e4SLinus Torvalds 			.type   = CX88_RADIO,
981da177e4SLinus Torvalds 			.gpio0  = 0xff01,
991da177e4SLinus Torvalds 		},
1001da177e4SLinus Torvalds 	},
1011da177e4SLinus Torvalds 	[CX88_BOARD_GDI] = {
1021da177e4SLinus Torvalds 		.name		= "GDI Black Gold",
1031da177e4SLinus Torvalds 		.tuner_type     = UNSET,
104b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
105b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
106b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1071da177e4SLinus Torvalds 		.input          = { {
1081da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1091da177e4SLinus Torvalds 			.vmux   = 0,
110fd3113e8SMauro Carvalho Chehab 		}, {
111fd3113e8SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
112fd3113e8SMauro Carvalho Chehab 			.vmux   = 2,
1131da177e4SLinus Torvalds 		} },
1141da177e4SLinus Torvalds 	},
1151da177e4SLinus Torvalds 	[CX88_BOARD_PIXELVIEW] = {
1161da177e4SLinus Torvalds 		.name           = "PixelView",
117b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_PAL,
118b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
119b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
120b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1211da177e4SLinus Torvalds 		.input          = { {
1221da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1231da177e4SLinus Torvalds 			.vmux   = 0,
1241da177e4SLinus Torvalds 			.gpio0  = 0xff00,  // internal decoder
1251da177e4SLinus Torvalds 		}, {
1261da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
1271da177e4SLinus Torvalds 			.vmux   = 1,
1281da177e4SLinus Torvalds 		}, {
1291da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1301da177e4SLinus Torvalds 			.vmux   = 2,
1311da177e4SLinus Torvalds 		} },
1321da177e4SLinus Torvalds 		.radio = {
1331da177e4SLinus Torvalds 			 .type  = CX88_RADIO,
1341da177e4SLinus Torvalds 			 .gpio0 = 0xff10,
1351da177e4SLinus Torvalds 		},
1361da177e4SLinus Torvalds 	},
1371da177e4SLinus Torvalds 	[CX88_BOARD_ATI_WONDER_PRO] = {
1381da177e4SLinus Torvalds 		.name           = "ATI TV Wonder Pro",
139b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_4IN1,
140b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
141b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
142b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1431da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
1441da177e4SLinus Torvalds 		.input          = { {
1451da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1461da177e4SLinus Torvalds 			.vmux   = 0,
1471da177e4SLinus Torvalds 			.gpio0  = 0x03ff,
1481da177e4SLinus Torvalds 		}, {
1491da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
1501da177e4SLinus Torvalds 			.vmux   = 1,
1511da177e4SLinus Torvalds 			.gpio0  = 0x03fe,
1521da177e4SLinus Torvalds 		}, {
1531da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1541da177e4SLinus Torvalds 			.vmux   = 2,
1551da177e4SLinus Torvalds 			.gpio0  = 0x03fe,
1561da177e4SLinus Torvalds 		} },
1571da177e4SLinus Torvalds 	},
1581da177e4SLinus Torvalds 	[CX88_BOARD_WINFAST2000XP_EXPERT] = {
1591da177e4SLinus Torvalds 		.name           = "Leadtek Winfast 2000XP Expert",
160b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_4IN1,
161b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
162b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
163b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
1641da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
1651da177e4SLinus Torvalds 		.input          = { {
1661da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
1671da177e4SLinus Torvalds 			.vmux   = 0,
1681da177e4SLinus Torvalds 			.gpio0	= 0x00F5e700,
1691da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1701da177e4SLinus Torvalds 			.gpio2  = 0x00F5e700,
1711da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1721da177e4SLinus Torvalds 		}, {
1731da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
1741da177e4SLinus Torvalds 			.vmux   = 1,
1751da177e4SLinus Torvalds 			.gpio0	= 0x00F5c700,
1761da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1771da177e4SLinus Torvalds 			.gpio2  = 0x00F5c700,
1781da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1791da177e4SLinus Torvalds 		}, {
1801da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
1811da177e4SLinus Torvalds 			.vmux   = 2,
1821da177e4SLinus Torvalds 			.gpio0	= 0x00F5c700,
1831da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1841da177e4SLinus Torvalds 			.gpio2  = 0x00F5c700,
1851da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1861da177e4SLinus Torvalds 		} },
1871da177e4SLinus Torvalds 		.radio = {
1881da177e4SLinus Torvalds 			.type   = CX88_RADIO,
1891da177e4SLinus Torvalds 			.gpio0	= 0x00F5d700,
1901da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
1911da177e4SLinus Torvalds 			.gpio2  = 0x00F5d700,
1921da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
1931da177e4SLinus Torvalds 		},
1941da177e4SLinus Torvalds 	},
1957418f346SLubomir Bulej 	[CX88_BOARD_AVERTV_STUDIO_303] = {
1961da177e4SLinus Torvalds 		.name           = "AverTV Studio 303 (M126)",
197b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
198b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
199b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
200b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
2011da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
2021da177e4SLinus Torvalds 		.input          = { {
2031da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
2041da177e4SLinus Torvalds 			.vmux   = 0,
2054aca4831SMarcin Rudowski 			.gpio1  = 0xe09f,
2061da177e4SLinus Torvalds 		}, {
2071da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
2081da177e4SLinus Torvalds 			.vmux   = 1,
2094aca4831SMarcin Rudowski 			.gpio1  = 0xe05f,
2101da177e4SLinus Torvalds 		}, {
2111da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
2121da177e4SLinus Torvalds 			.vmux   = 2,
2134aca4831SMarcin Rudowski 			.gpio1  = 0xe05f,
2141da177e4SLinus Torvalds 		} },
2151da177e4SLinus Torvalds 		.radio = {
2164aca4831SMarcin Rudowski 			.gpio1  = 0xe0df,
2171da177e4SLinus Torvalds 			.type   = CX88_RADIO,
2181da177e4SLinus Torvalds 		},
2191da177e4SLinus Torvalds 	},
2201da177e4SLinus Torvalds 	[CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
2211da177e4SLinus Torvalds 		// added gpio values thanks to Michal
2221da177e4SLinus Torvalds 		// values for PAL from DScaler
2231da177e4SLinus Torvalds 		.name           = "MSI TV-@nywhere Master",
224b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_MT2032,
225b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
226b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
227b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
2283ae1adc6SNickolay V. Shmyrev 		.tda9887_conf	= TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
2291da177e4SLinus Torvalds 		.input          = { {
2301da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
2311da177e4SLinus Torvalds 			.vmux   = 0,
2321da177e4SLinus Torvalds 			.gpio0  = 0x000040bf,
2331da177e4SLinus Torvalds 			.gpio1  = 0x000080c0,
2341da177e4SLinus Torvalds 			.gpio2  = 0x0000ff40,
2351da177e4SLinus Torvalds 		}, {
2361da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
2371da177e4SLinus Torvalds 			.vmux   = 1,
2381da177e4SLinus Torvalds 			.gpio0  = 0x000040bf,
2391da177e4SLinus Torvalds 			.gpio1  = 0x000080c0,
2401da177e4SLinus Torvalds 			.gpio2  = 0x0000ff40,
2411da177e4SLinus Torvalds 		}, {
2421da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
2431da177e4SLinus Torvalds 			.vmux   = 2,
2441da177e4SLinus Torvalds 			.gpio0  = 0x000040bf,
2451da177e4SLinus Torvalds 			.gpio1  = 0x000080c0,
2461da177e4SLinus Torvalds 			.gpio2  = 0x0000ff40,
2471da177e4SLinus Torvalds 		} },
2481da177e4SLinus Torvalds 		.radio = {
2491da177e4SLinus Torvalds 			 .type   = CX88_RADIO,
25055c88610SMauro Carvalho Chehab 			 .vmux   = 3,
25155c88610SMauro Carvalho Chehab 			 .gpio0  = 0x000040bf,
25255c88610SMauro Carvalho Chehab 			 .gpio1  = 0x000080c0,
25355c88610SMauro Carvalho Chehab 			 .gpio2  = 0x0000ff20,
2541da177e4SLinus Torvalds 		},
2551da177e4SLinus Torvalds 	},
2561da177e4SLinus Torvalds 	[CX88_BOARD_WINFAST_DV2000] = {
2571da177e4SLinus Torvalds 		.name           = "Leadtek Winfast DV2000",
258b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
259b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
260b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
261b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
2621da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
2631da177e4SLinus Torvalds 		.input          = { {
2641da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
2651da177e4SLinus Torvalds 			.vmux   = 0,
2661da177e4SLinus Torvalds 			.gpio0  = 0x0035e700,
2671da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
2681da177e4SLinus Torvalds 			.gpio2  = 0x0035e700,
2691da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2701da177e4SLinus Torvalds 		}, {
2711da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
2721da177e4SLinus Torvalds 			.vmux   = 1,
2731da177e4SLinus Torvalds 			.gpio0  = 0x0035c700,
2741da177e4SLinus Torvalds 			.gpio1  = 0x00003004,
2751da177e4SLinus Torvalds 			.gpio2  = 0x0035c700,
2761da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2771da177e4SLinus Torvalds 		}, {
2781da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
2791da177e4SLinus Torvalds 			.vmux   = 2,
2801da177e4SLinus Torvalds 			.gpio0  = 0x0035c700,
2811da177e4SLinus Torvalds 			.gpio1  = 0x0035c700,
2821da177e4SLinus Torvalds 			.gpio2  = 0x02000000,
2831da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2841da177e4SLinus Torvalds 		} },
2851da177e4SLinus Torvalds 		.radio = {
2861da177e4SLinus Torvalds 			.type   = CX88_RADIO,
2871da177e4SLinus Torvalds 			.gpio0  = 0x0035d700,
2881da177e4SLinus Torvalds 			.gpio1  = 0x00007004,
2891da177e4SLinus Torvalds 			.gpio2  = 0x0035d700,
2901da177e4SLinus Torvalds 			.gpio3  = 0x02000000,
2911da177e4SLinus Torvalds 		},
2921da177e4SLinus Torvalds 	},
2931da177e4SLinus Torvalds 	[CX88_BOARD_LEADTEK_PVR2000] = {
2941da177e4SLinus Torvalds 		// gpio values for PAL version from regspy by DScaler
2951da177e4SLinus Torvalds 		.name           = "Leadtek PVR 2000",
296b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
297b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
298b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
299b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3001da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
3011da177e4SLinus Torvalds 		.input          = { {
3021da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3031da177e4SLinus Torvalds 			.vmux   = 0,
304b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x0000bde2,
3057b27d45bSRicardo Cerqueira 			.audioroute = 1,
3061da177e4SLinus Torvalds 		}, {
3071da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
3081da177e4SLinus Torvalds 			.vmux   = 1,
3091da177e4SLinus Torvalds 			.gpio0  = 0x0000bde6,
3107b27d45bSRicardo Cerqueira 			.audioroute = 1,
3111da177e4SLinus Torvalds 		}, {
3121da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3131da177e4SLinus Torvalds 			.vmux   = 2,
3141da177e4SLinus Torvalds 			.gpio0  = 0x0000bde6,
3157b27d45bSRicardo Cerqueira 			.audioroute = 1,
3161da177e4SLinus Torvalds 		} },
3171da177e4SLinus Torvalds 		.radio = {
3181da177e4SLinus Torvalds 			.type   = CX88_RADIO,
3191da177e4SLinus Torvalds 			.gpio0  = 0x0000bd62,
3207b27d45bSRicardo Cerqueira 			.audioroute = 1,
3211da177e4SLinus Torvalds 		},
32248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
3231da177e4SLinus Torvalds 	},
3241da177e4SLinus Torvalds 	[CX88_BOARD_IODATA_GVVCP3PCI] = {
3251da177e4SLinus Torvalds 		.name		= "IODATA GV-VCP3/PCI",
326c39ba330SHans Verkuil 		.tuner_type     = UNSET,
327b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
328b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
329b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3301da177e4SLinus Torvalds 		.input          = { {
3311da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
3321da177e4SLinus Torvalds 			.vmux   = 0,
3331da177e4SLinus Torvalds 		}, {
3341da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE2,
3351da177e4SLinus Torvalds 			.vmux   = 1,
3361da177e4SLinus Torvalds 		}, {
3371da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3381da177e4SLinus Torvalds 			.vmux   = 2,
3391da177e4SLinus Torvalds 		} },
3401da177e4SLinus Torvalds 	},
3411da177e4SLinus Torvalds 	[CX88_BOARD_PROLINK_PLAYTVPVR] = {
3421da177e4SLinus Torvalds 		.name           = "Prolink PlayTV PVR",
343b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
344b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
345b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
346b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3471da177e4SLinus Torvalds 		.tda9887_conf	= TDA9887_PRESENT,
3481da177e4SLinus Torvalds 		.input          = { {
3491da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3501da177e4SLinus Torvalds 			.vmux   = 0,
35149239c35SMatheus Izvekov 			.gpio0  = 0xbff0,
3521da177e4SLinus Torvalds 		}, {
3531da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
3541da177e4SLinus Torvalds 			.vmux   = 1,
35549239c35SMatheus Izvekov 			.gpio0  = 0xbff3,
3561da177e4SLinus Torvalds 		}, {
3571da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3581da177e4SLinus Torvalds 			.vmux   = 2,
35949239c35SMatheus Izvekov 			.gpio0  = 0xbff3,
3601da177e4SLinus Torvalds 		} },
3611da177e4SLinus Torvalds 		.radio = {
3621da177e4SLinus Torvalds 			.type   = CX88_RADIO,
36349239c35SMatheus Izvekov 			.gpio0  = 0xbff0,
3641da177e4SLinus Torvalds 		},
3651da177e4SLinus Torvalds 	},
3661da177e4SLinus Torvalds 	[CX88_BOARD_ASUS_PVR_416] = {
3671da177e4SLinus Torvalds 		.name		= "ASUS PVR-416",
368b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
369b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
370b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
371b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3721da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
3731da177e4SLinus Torvalds 		.input          = { {
3741da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3751da177e4SLinus Torvalds 			.vmux   = 0,
3761da177e4SLinus Torvalds 			.gpio0  = 0x0000fde6,
3771da177e4SLinus Torvalds 		}, {
3781da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
3791da177e4SLinus Torvalds 			.vmux   = 2,
3801da177e4SLinus Torvalds 			.gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
3817b27d45bSRicardo Cerqueira 			.audioroute = 1,
3821da177e4SLinus Torvalds 		} },
3831da177e4SLinus Torvalds 		.radio = {
3841da177e4SLinus Torvalds 			.type   = CX88_RADIO,
3851da177e4SLinus Torvalds 			.gpio0  = 0x0000fde2,
3861da177e4SLinus Torvalds 		},
38748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
3881da177e4SLinus Torvalds 	},
3891da177e4SLinus Torvalds 	[CX88_BOARD_MSI_TVANYWHERE] = {
3901da177e4SLinus Torvalds 		.name           = "MSI TV-@nywhere",
391b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_MT2032,
392b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
393b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
394b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
3951da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
3961da177e4SLinus Torvalds 		.input          = { {
3971da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
3981da177e4SLinus Torvalds 			.vmux   = 0,
3991da177e4SLinus Torvalds 			.gpio0  = 0x00000fbf,
4001da177e4SLinus Torvalds 			.gpio2  = 0x0000fc08,
4011da177e4SLinus Torvalds 		}, {
4021da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4031da177e4SLinus Torvalds 			.vmux   = 1,
4041da177e4SLinus Torvalds 			.gpio0  = 0x00000fbf,
4051da177e4SLinus Torvalds 			.gpio2  = 0x0000fc68,
4061da177e4SLinus Torvalds 		}, {
4071da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4081da177e4SLinus Torvalds 			.vmux   = 2,
4091da177e4SLinus Torvalds 			.gpio0  = 0x00000fbf,
4101da177e4SLinus Torvalds 			.gpio2  = 0x0000fc68,
4111da177e4SLinus Torvalds 		} },
4121da177e4SLinus Torvalds 	},
4131da177e4SLinus Torvalds 	[CX88_BOARD_KWORLD_DVB_T] = {
4141da177e4SLinus Torvalds 		.name           = "KWorld/VStream XPert DVB-T",
415c39ba330SHans Verkuil 		.tuner_type     = UNSET,
416b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
417b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
418b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4191da177e4SLinus Torvalds 		.input          = { {
4201da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4211da177e4SLinus Torvalds 			.vmux   = 1,
4221da177e4SLinus Torvalds 			.gpio0  = 0x0700,
4231da177e4SLinus Torvalds 			.gpio2  = 0x0101,
4241da177e4SLinus Torvalds 		}, {
4251da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4261da177e4SLinus Torvalds 			.vmux   = 2,
4271da177e4SLinus Torvalds 			.gpio0  = 0x0700,
4281da177e4SLinus Torvalds 			.gpio2  = 0x0101,
4291da177e4SLinus Torvalds 		} },
43048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
4311da177e4SLinus Torvalds 	},
4321da177e4SLinus Torvalds 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
433a82decf6SMauro Carvalho Chehab 		.name           = "DViCO FusionHDTV DVB-T1",
434c39ba330SHans Verkuil 		.tuner_type     = UNSET, /* No analog tuner */
435b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
436b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
437b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4381da177e4SLinus Torvalds 		.input          = { {
4391da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4401da177e4SLinus Torvalds 			.vmux   = 1,
4411da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
4421da177e4SLinus Torvalds 		}, {
4431da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4441da177e4SLinus Torvalds 			.vmux   = 2,
4451da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
4461da177e4SLinus Torvalds 		} },
44748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
4481da177e4SLinus Torvalds 	},
4491da177e4SLinus Torvalds 	[CX88_BOARD_KWORLD_LTV883] = {
4501da177e4SLinus Torvalds 		.name           = "KWorld LTV883RF",
451b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_TNF_8831BGFF,
452b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
453b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
454b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4551da177e4SLinus Torvalds 		.input          = { {
4561da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
4571da177e4SLinus Torvalds 			.vmux   = 0,
4581da177e4SLinus Torvalds 			.gpio0  = 0x07f8,
4591da177e4SLinus Torvalds 		}, {
4601da177e4SLinus Torvalds 			.type   = CX88_VMUX_DEBUG,
4611da177e4SLinus Torvalds 			.vmux   = 0,
4621da177e4SLinus Torvalds 			.gpio0  = 0x07f9,  // mono from tuner chip
4631da177e4SLinus Torvalds 		}, {
4641da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
4651da177e4SLinus Torvalds 			.vmux   = 1,
4661da177e4SLinus Torvalds 			.gpio0  = 0x000007fa,
4671da177e4SLinus Torvalds 		}, {
4681da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
4691da177e4SLinus Torvalds 			.vmux   = 2,
4701da177e4SLinus Torvalds 			.gpio0  = 0x000007fa,
4711da177e4SLinus Torvalds 		} },
4721da177e4SLinus Torvalds 		.radio = {
4731da177e4SLinus Torvalds 			.type   = CX88_RADIO,
4741da177e4SLinus Torvalds 			.gpio0  = 0x000007f8,
4751da177e4SLinus Torvalds 		},
4761da177e4SLinus Torvalds 	},
477a82decf6SMauro Carvalho Chehab 	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
478a82decf6SMauro Carvalho Chehab 		.name		= "DViCO FusionHDTV 3 Gold-Q",
4791da177e4SLinus Torvalds 		.tuner_type     = TUNER_MICROTUNE_4042FI5,
480b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
481b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
482b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
4831da177e4SLinus Torvalds 		/*
484399426caSMauro Carvalho Chehab 		 * GPIO[0] resets DT3302 DTV receiver
485399426caSMauro Carvalho Chehab 		 *     0 - reset asserted
486399426caSMauro Carvalho Chehab 		 *     1 - normal operation
487399426caSMauro Carvalho Chehab 		 * GPIO[1] mutes analog audio output connector
488399426caSMauro Carvalho Chehab 		 *     0 - enable selected source
489399426caSMauro Carvalho Chehab 		 *     1 - mute
490399426caSMauro Carvalho Chehab 		 * GPIO[2] selects source for analog audio output connector
491399426caSMauro Carvalho Chehab 		 *     0 - analog audio input connector on tab
492399426caSMauro Carvalho Chehab 		 *     1 - analog DAC output from CX23881 chip
493399426caSMauro Carvalho Chehab 		 * GPIO[3] selects RF input connector on tuner module
494399426caSMauro Carvalho Chehab 		 *     0 - RF connector labeled CABLE
495399426caSMauro Carvalho Chehab 		 *     1 - RF connector labeled ANT
496399426caSMauro Carvalho Chehab 		 * GPIO[4] selects high RF for QAM256 mode
497399426caSMauro Carvalho Chehab 		 *     0 - normal RF
498399426caSMauro Carvalho Chehab 		 *     1 - high RF
4991da177e4SLinus Torvalds 		 */
5001da177e4SLinus Torvalds 		.input          = { {
5011da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
5021da177e4SLinus Torvalds 			.vmux   = 0,
5031da177e4SLinus Torvalds 			.gpio0	= 0x0f0d,
5041da177e4SLinus Torvalds 		}, {
5051da177e4SLinus Torvalds 			.type   = CX88_VMUX_CABLE,
5061da177e4SLinus Torvalds 			.vmux   = 0,
5071da177e4SLinus Torvalds 			.gpio0	= 0x0f05,
5081da177e4SLinus Torvalds 		}, {
5091da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
5101da177e4SLinus Torvalds 			.vmux   = 1,
5111da177e4SLinus Torvalds 			.gpio0	= 0x0f00,
5121da177e4SLinus Torvalds 		}, {
5131da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
5141da177e4SLinus Torvalds 			.vmux   = 2,
5151da177e4SLinus Torvalds 			.gpio0	= 0x0f00,
5161da177e4SLinus Torvalds 		} },
51748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5181da177e4SLinus Torvalds 	},
5191da177e4SLinus Torvalds 	[CX88_BOARD_HAUPPAUGE_DVB_T1] = {
5201da177e4SLinus Torvalds 		.name           = "Hauppauge Nova-T DVB-T",
521c39ba330SHans Verkuil 		.tuner_type     = UNSET,
522b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
523b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
524b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5251da177e4SLinus Torvalds 		.input          = { {
5261da177e4SLinus Torvalds 			.type   = CX88_VMUX_DVB,
5271da177e4SLinus Torvalds 			.vmux   = 0,
5281da177e4SLinus Torvalds 		} },
52948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5301da177e4SLinus Torvalds 	},
5311da177e4SLinus Torvalds 	[CX88_BOARD_CONEXANT_DVB_T1] = {
5321da177e4SLinus Torvalds 		.name           = "Conexant DVB-T reference design",
533c39ba330SHans Verkuil 		.tuner_type     = UNSET,
534b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
535b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
536b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5371da177e4SLinus Torvalds 		.input          = { {
5381da177e4SLinus Torvalds 			.type   = CX88_VMUX_DVB,
5391da177e4SLinus Torvalds 			.vmux   = 0,
5401da177e4SLinus Torvalds 		} },
54148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5421da177e4SLinus Torvalds 	},
5431da177e4SLinus Torvalds 	[CX88_BOARD_PROVIDEO_PV259] = {
5441da177e4SLinus Torvalds 		.name		= "Provideo PV259",
5451da177e4SLinus Torvalds 		.tuner_type     = TUNER_PHILIPS_FQ1216ME,
546b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
547b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
548b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5491da177e4SLinus Torvalds 		.input          = { {
5501da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
5511da177e4SLinus Torvalds 			.vmux   = 0,
5527b27d45bSRicardo Cerqueira 			.audioroute = 1,
5531da177e4SLinus Torvalds 		} },
55448d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
5551da177e4SLinus Torvalds 	},
5561da177e4SLinus Torvalds 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
557a82decf6SMauro Carvalho Chehab 		.name           = "DViCO FusionHDTV DVB-T Plus",
558c39ba330SHans Verkuil 		.tuner_type     = UNSET, /* No analog tuner */
559b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
560b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
561b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5621da177e4SLinus Torvalds 		.input          = { {
5631da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
5641da177e4SLinus Torvalds 			.vmux   = 1,
5651da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
5661da177e4SLinus Torvalds 		}, {
5671da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
5681da177e4SLinus Torvalds 			.vmux   = 2,
5691da177e4SLinus Torvalds 			.gpio0  = 0x000027df,
5701da177e4SLinus Torvalds 		} },
57148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5721da177e4SLinus Torvalds 	},
5731da177e4SLinus Torvalds 	[CX88_BOARD_DNTV_LIVE_DVB_T] = {
5741da177e4SLinus Torvalds 		.name		= "digitalnow DNTV Live! DVB-T",
575c39ba330SHans Verkuil 		.tuner_type     = UNSET,
576b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
577b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
578b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
5791da177e4SLinus Torvalds 		.input		= { {
5801da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
5811da177e4SLinus Torvalds 			.vmux   = 1,
5821da177e4SLinus Torvalds 			.gpio0  = 0x00000700,
5831da177e4SLinus Torvalds 			.gpio2  = 0x00000101,
5841da177e4SLinus Torvalds 		}, {
5851da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
5861da177e4SLinus Torvalds 			.vmux   = 2,
5871da177e4SLinus Torvalds 			.gpio0  = 0x00000700,
5881da177e4SLinus Torvalds 			.gpio2  = 0x00000101,
5891da177e4SLinus Torvalds 		} },
59048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
5911da177e4SLinus Torvalds 	},
5921da177e4SLinus Torvalds 	[CX88_BOARD_PCHDTV_HD3000] = {
5931da177e4SLinus Torvalds 		.name           = "pcHDTV HD3000 HDTV",
5949175b854STrent Piepho 		.tuner_type     = TUNER_THOMSON_DTT761X,
595b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
596b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
597b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
598e4f5c82aSMauro Carvalho Chehab 		.tda9887_conf   = TDA9887_PRESENT,
59919dc74b7STrent Piepho 		/* GPIO[2] = audio source for analog audio out connector
60019dc74b7STrent Piepho 		 *  0 = analog audio input connector
60119dc74b7STrent Piepho 		 *  1 = CX88 audio DACs
60219dc74b7STrent Piepho 		 *
60319dc74b7STrent Piepho 		 * GPIO[7] = input to CX88's audio/chroma ADC
60419dc74b7STrent Piepho 		 *  0 = FM 10.7 MHz IF
60519dc74b7STrent Piepho 		 *  1 = Sound 4.5 MHz IF
60619dc74b7STrent Piepho 		 *
60719dc74b7STrent Piepho 		 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
60819dc74b7STrent Piepho 		 *
60919dc74b7STrent Piepho 		 * GPIO[16] = Remote control input
61019dc74b7STrent Piepho 		 */
6111da177e4SLinus Torvalds 		.input          = { {
6121da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
6131da177e4SLinus Torvalds 			.vmux   = 0,
6141da177e4SLinus Torvalds 			.gpio0  = 0x00008484,
6151da177e4SLinus Torvalds 		}, {
6161da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
6171da177e4SLinus Torvalds 			.vmux   = 1,
6181da177e4SLinus Torvalds 			.gpio0  = 0x00008400,
6191da177e4SLinus Torvalds 		}, {
6201da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
6211da177e4SLinus Torvalds 			.vmux   = 2,
6221da177e4SLinus Torvalds 			.gpio0  = 0x00008400,
6231da177e4SLinus Torvalds 		} },
6241da177e4SLinus Torvalds 		.radio = {
6251da177e4SLinus Torvalds 			.type   = CX88_RADIO,
62619dc74b7STrent Piepho 			.gpio0  = 0x00008404,
6271da177e4SLinus Torvalds 		},
62848d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
6291da177e4SLinus Torvalds 	},
6301da177e4SLinus Torvalds 	[CX88_BOARD_HAUPPAUGE_ROSLYN] = {
6311da177e4SLinus Torvalds 		// entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
6321da177e4SLinus Torvalds 		// GPIO values obtained from regspy, courtesy Sean Covel
6331da177e4SLinus Torvalds 		.name           = "Hauppauge WinTV 28xxx (Roslyn) models",
6341da177e4SLinus Torvalds 		.tuner_type     = UNSET,
635b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
636b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
637b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
6381da177e4SLinus Torvalds 		.input          = { {
6391da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
6401da177e4SLinus Torvalds 			.vmux   = 0,
6410345c387SSteven Toth 			.gpio0  = 0xed1a,
6421da177e4SLinus Torvalds 			.gpio2  = 0x00ff,
6431da177e4SLinus Torvalds 		}, {
6441da177e4SLinus Torvalds 			.type   = CX88_VMUX_DEBUG,
6451da177e4SLinus Torvalds 			.vmux   = 0,
6460345c387SSteven Toth 			.gpio0  = 0xff01,
6471da177e4SLinus Torvalds 		}, {
6481da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
6491da177e4SLinus Torvalds 			.vmux   = 1,
6501da177e4SLinus Torvalds 			.gpio0  = 0xff02,
6511da177e4SLinus Torvalds 		}, {
6521da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
6531da177e4SLinus Torvalds 			.vmux   = 2,
6541da177e4SLinus Torvalds 			.gpio0  = 0xed92,
6551da177e4SLinus Torvalds 			.gpio2  = 0x00ff,
6561da177e4SLinus Torvalds 		} },
6571da177e4SLinus Torvalds 		.radio = {
6581da177e4SLinus Torvalds 			 .type   = CX88_RADIO,
6591da177e4SLinus Torvalds 			 .gpio0  = 0xed96,
6601da177e4SLinus Torvalds 			 .gpio2  = 0x00ff,
6611da177e4SLinus Torvalds 		 },
66248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
6631da177e4SLinus Torvalds 	},
6641da177e4SLinus Torvalds 	[CX88_BOARD_DIGITALLOGIC_MEC] = {
6651da177e4SLinus Torvalds 		.name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
666b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
667b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
668b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
669b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
6701da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
6711da177e4SLinus Torvalds 		.input          = { {
6721da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
6731da177e4SLinus Torvalds 			.vmux   = 0,
674b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d80,
6757b27d45bSRicardo Cerqueira 			.audioroute = 1,
6761da177e4SLinus Torvalds 		}, {
6771da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
6781da177e4SLinus Torvalds 			.vmux   = 1,
679b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d76,
6807b27d45bSRicardo Cerqueira 			.audioroute = 1,
6811da177e4SLinus Torvalds 		}, {
6821da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
6831da177e4SLinus Torvalds 			.vmux   = 2,
684b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d76,
6857b27d45bSRicardo Cerqueira 			.audioroute = 1,
6861da177e4SLinus Torvalds 		} },
6871da177e4SLinus Torvalds 		.radio = {
6881da177e4SLinus Torvalds 			.type   = CX88_RADIO,
689b45009b0SMauro Carvalho Chehab 			.gpio0  = 0x00009d00,
6907b27d45bSRicardo Cerqueira 			.audioroute = 1,
6911da177e4SLinus Torvalds 		},
69248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
6931da177e4SLinus Torvalds 	},
6941da177e4SLinus Torvalds 	[CX88_BOARD_IODATA_GVBCTV7E] = {
6951da177e4SLinus Torvalds 		.name           = "IODATA GV/BCTV7E",
6961da177e4SLinus Torvalds 		.tuner_type     = TUNER_PHILIPS_FQ1286,
697b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
698b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
699b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
7001da177e4SLinus Torvalds 		.tda9887_conf   = TDA9887_PRESENT,
7011da177e4SLinus Torvalds 		.input          = { {
7021da177e4SLinus Torvalds 			.type   = CX88_VMUX_TELEVISION,
7031da177e4SLinus Torvalds 			.vmux   = 1,
7041da177e4SLinus Torvalds 			.gpio1  = 0x0000e03f,
7051da177e4SLinus Torvalds 		}, {
7061da177e4SLinus Torvalds 			.type   = CX88_VMUX_COMPOSITE1,
7071da177e4SLinus Torvalds 			.vmux   = 2,
7081da177e4SLinus Torvalds 			.gpio1  = 0x0000e07f,
7091da177e4SLinus Torvalds 		}, {
7101da177e4SLinus Torvalds 			.type   = CX88_VMUX_SVIDEO,
7111da177e4SLinus Torvalds 			.vmux   = 3,
7121da177e4SLinus Torvalds 			.gpio1  = 0x0000e07f,
7131da177e4SLinus Torvalds 		} }
7141da177e4SLinus Torvalds 	},
715239df2e2SManuel Capinha 	[CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
716239df2e2SManuel Capinha 		.name           = "PixelView PlayTV Ultra Pro (Stereo)",
717b45009b0SMauro Carvalho Chehab 		/* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
718b45009b0SMauro Carvalho Chehab 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
719c5287ba1SMauro Carvalho Chehab 		.radio_type     = UNSET,
720c5287ba1SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
721c5287ba1SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
722399426caSMauro Carvalho Chehab 		/*
723399426caSMauro Carvalho Chehab 		 * Some variants use a tda9874 and so need the
724399426caSMauro Carvalho Chehab 		 * tvaudio module.
725399426caSMauro Carvalho Chehab 		 */
726facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_TVAUDIO,
727239df2e2SManuel Capinha 		.input          = { {
728239df2e2SManuel Capinha 			.type   = CX88_VMUX_TELEVISION,
729239df2e2SManuel Capinha 			.vmux   = 0,
730b45009b0SMauro Carvalho Chehab 			.gpio0  = 0xbf61,  /* internal decoder */
731239df2e2SManuel Capinha 		}, {
732239df2e2SManuel Capinha 			.type   = CX88_VMUX_COMPOSITE1,
733239df2e2SManuel Capinha 			.vmux   = 1,
734239df2e2SManuel Capinha 			.gpio0	= 0xbf63,
735239df2e2SManuel Capinha 		}, {
736239df2e2SManuel Capinha 			.type   = CX88_VMUX_SVIDEO,
737239df2e2SManuel Capinha 			.vmux   = 2,
738239df2e2SManuel Capinha 			.gpio0	= 0xbf63,
739239df2e2SManuel Capinha 		} },
740239df2e2SManuel Capinha 		.radio = {
741239df2e2SManuel Capinha 			 .type  = CX88_RADIO,
742239df2e2SManuel Capinha 			 .gpio0 = 0xbf60,
743239df2e2SManuel Capinha 		 },
744239df2e2SManuel Capinha 	},
745b45009b0SMauro Carvalho Chehab 	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
746a82decf6SMauro Carvalho Chehab 		.name           = "DViCO FusionHDTV 3 Gold-T",
74783ac8722SMichael Krufky 		.tuner_type     = TUNER_THOMSON_DTT761X,
748b45009b0SMauro Carvalho Chehab 		.radio_type     = UNSET,
749b45009b0SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
750b45009b0SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
751e4f5c82aSMauro Carvalho Chehab 		.tda9887_conf   = TDA9887_PRESENT,
752b45009b0SMauro Carvalho Chehab 		.input          = { {
753b45009b0SMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
754b45009b0SMauro Carvalho Chehab 			.vmux   = 0,
755e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x97ed,
756b45009b0SMauro Carvalho Chehab 		}, {
757b45009b0SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
758b45009b0SMauro Carvalho Chehab 			.vmux   = 1,
759e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x97e9,
760b45009b0SMauro Carvalho Chehab 		}, {
761b45009b0SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
762b45009b0SMauro Carvalho Chehab 			.vmux   = 2,
763e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x97e9,
764b45009b0SMauro Carvalho Chehab 		} },
76548d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
766b45009b0SMauro Carvalho Chehab 	},
767a82decf6SMauro Carvalho Chehab 	[CX88_BOARD_ADSTECH_DVB_T_PCI] = {
768a82decf6SMauro Carvalho Chehab 		.name           = "ADS Tech Instant TV DVB-T PCI",
769c39ba330SHans Verkuil 		.tuner_type     = UNSET,
770a82decf6SMauro Carvalho Chehab 		.radio_type     = UNSET,
771a82decf6SMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
772a82decf6SMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
773a82decf6SMauro Carvalho Chehab 		.input          = { {
774a82decf6SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
775a82decf6SMauro Carvalho Chehab 			.vmux   = 1,
776a82decf6SMauro Carvalho Chehab 			.gpio0  = 0x0700,
777a82decf6SMauro Carvalho Chehab 			.gpio2  = 0x0101,
778a82decf6SMauro Carvalho Chehab 		}, {
779a82decf6SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
780a82decf6SMauro Carvalho Chehab 			.vmux   = 2,
781a82decf6SMauro Carvalho Chehab 			.gpio0  = 0x0700,
782a82decf6SMauro Carvalho Chehab 			.gpio2  = 0x0101,
783a82decf6SMauro Carvalho Chehab 		} },
78448d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
785a82decf6SMauro Carvalho Chehab 	},
786e057ee11SMichael Krufky 	[CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
787e057ee11SMichael Krufky 		.name           = "TerraTec Cinergy 1400 DVB-T",
788c39ba330SHans Verkuil 		.tuner_type     = UNSET,
789e057ee11SMichael Krufky 		.input          = { {
790e057ee11SMichael Krufky 			.type   = CX88_VMUX_DVB,
791e057ee11SMichael Krufky 			.vmux   = 0,
79205eda249SHeiko Baums 		}, {
79305eda249SHeiko Baums 			.type   = CX88_VMUX_COMPOSITE1,
79405eda249SHeiko Baums 			.vmux   = 2,
79505eda249SHeiko Baums 		}, {
79605eda249SHeiko Baums 			.type   = CX88_VMUX_SVIDEO,
79705eda249SHeiko Baums 			.vmux   = 2,
798e057ee11SMichael Krufky 		} },
79948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
800e057ee11SMichael Krufky 	},
8019fef07caSMichael Krufky 	[CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
8029fef07caSMichael Krufky 		.name           = "DViCO FusionHDTV 5 Gold",
8039c26c8b1SMichael Krufky 		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
8049fef07caSMichael Krufky 		.radio_type     = UNSET,
8059fef07caSMichael Krufky 		.tuner_addr	= ADDR_UNSET,
8069fef07caSMichael Krufky 		.radio_addr	= ADDR_UNSET,
807e52e98a7SMauro Carvalho Chehab 		.tda9887_conf   = TDA9887_PRESENT,
8089fef07caSMichael Krufky 		.input          = { {
8099fef07caSMichael Krufky 			.type   = CX88_VMUX_TELEVISION,
8109fef07caSMichael Krufky 			.vmux   = 0,
811e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x87fd,
8129fef07caSMichael Krufky 		}, {
8139fef07caSMichael Krufky 			.type   = CX88_VMUX_COMPOSITE1,
8149fef07caSMichael Krufky 			.vmux   = 1,
815e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x87f9,
8169fef07caSMichael Krufky 		}, {
8179fef07caSMichael Krufky 			.type   = CX88_VMUX_SVIDEO,
8189fef07caSMichael Krufky 			.vmux   = 2,
819e52e98a7SMauro Carvalho Chehab 			.gpio0  = 0x87f9,
8209fef07caSMichael Krufky 		} },
82148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
8229fef07caSMichael Krufky 	},
823d45170edSNickolay V. Shmyrev 	[CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
824d45170edSNickolay V. Shmyrev 		.name           = "AverMedia UltraTV Media Center PCI 550",
825d45170edSNickolay V. Shmyrev 		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
826d45170edSNickolay V. Shmyrev 		.radio_type     = UNSET,
827d45170edSNickolay V. Shmyrev 		.tuner_addr     = ADDR_UNSET,
828d45170edSNickolay V. Shmyrev 		.radio_addr     = ADDR_UNSET,
829d45170edSNickolay V. Shmyrev 		.tda9887_conf   = TDA9887_PRESENT,
830d45170edSNickolay V. Shmyrev 		.input          = { {
831d45170edSNickolay V. Shmyrev 			.type   = CX88_VMUX_COMPOSITE1,
832d45170edSNickolay V. Shmyrev 			.vmux   = 0,
833d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cd73,
8347b27d45bSRicardo Cerqueira 			.audioroute = 1,
835d45170edSNickolay V. Shmyrev 		}, {
836d45170edSNickolay V. Shmyrev 			.type   = CX88_VMUX_SVIDEO,
837d45170edSNickolay V. Shmyrev 			.vmux   = 1,
838d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cd73,
8397b27d45bSRicardo Cerqueira 			.audioroute = 1,
840d45170edSNickolay V. Shmyrev 		}, {
841d45170edSNickolay V. Shmyrev 			.type   = CX88_VMUX_TELEVISION,
842d45170edSNickolay V. Shmyrev 			.vmux   = 3,
843d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cdb3,
8447b27d45bSRicardo Cerqueira 			.audioroute = 1,
845d45170edSNickolay V. Shmyrev 		} },
846d45170edSNickolay V. Shmyrev 		.radio = {
847d45170edSNickolay V. Shmyrev 			.type   = CX88_RADIO,
848d45170edSNickolay V. Shmyrev 			.vmux   = 2,
849d45170edSNickolay V. Shmyrev 			.gpio0  = 0x0000cdf3,
8507b27d45bSRicardo Cerqueira 			.audioroute = 1,
851d45170edSNickolay V. Shmyrev 		},
8525b26c82fSMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
853d45170edSNickolay V. Shmyrev 	},
8540bcc37c3SAlexander Wold 	[CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
8550bcc37c3SAlexander Wold 		 /* Alexander Wold <awold@bigfoot.com> */
8560bcc37c3SAlexander Wold 		 .name           = "Kworld V-Stream Xpert DVD",
8570bcc37c3SAlexander Wold 		 .tuner_type     = UNSET,
8580bcc37c3SAlexander Wold 		 .input          = { {
8590bcc37c3SAlexander Wold 			 .type   = CX88_VMUX_COMPOSITE1,
8600bcc37c3SAlexander Wold 			 .vmux   = 1,
8610bcc37c3SAlexander Wold 			 .gpio0  = 0x03000000,
8620bcc37c3SAlexander Wold 			 .gpio1  = 0x01000000,
8630bcc37c3SAlexander Wold 			 .gpio2  = 0x02000000,
8640bcc37c3SAlexander Wold 			 .gpio3  = 0x00100000,
8650bcc37c3SAlexander Wold 		 }, {
8660bcc37c3SAlexander Wold 			 .type   = CX88_VMUX_SVIDEO,
8670bcc37c3SAlexander Wold 			 .vmux   = 2,
8680bcc37c3SAlexander Wold 			 .gpio0  = 0x03000000,
8690bcc37c3SAlexander Wold 			 .gpio1  = 0x01000000,
8700bcc37c3SAlexander Wold 			 .gpio2  = 0x02000000,
8710bcc37c3SAlexander Wold 			 .gpio3  = 0x00100000,
8720bcc37c3SAlexander Wold 		 } },
8730bcc37c3SAlexander Wold 	},
874e976f937SKirk Lapray 	[CX88_BOARD_ATI_HDTVWONDER] = {
875e976f937SKirk Lapray 		.name           = "ATI HDTV Wonder",
876e976f937SKirk Lapray 		.tuner_type     = TUNER_PHILIPS_TUV1236D,
877e976f937SKirk Lapray 		.radio_type     = UNSET,
878e976f937SKirk Lapray 		.tuner_addr	= ADDR_UNSET,
879e976f937SKirk Lapray 		.radio_addr	= ADDR_UNSET,
880e976f937SKirk Lapray 		.input          = { {
881e976f937SKirk Lapray 			.type   = CX88_VMUX_TELEVISION,
882e976f937SKirk Lapray 			.vmux   = 0,
883e976f937SKirk Lapray 			.gpio0  = 0x00000ff7,
884e976f937SKirk Lapray 			.gpio1  = 0x000000ff,
885e976f937SKirk Lapray 			.gpio2  = 0x00000001,
886e976f937SKirk Lapray 			.gpio3  = 0x00000000,
887e976f937SKirk Lapray 		}, {
888e976f937SKirk Lapray 			.type   = CX88_VMUX_COMPOSITE1,
889e976f937SKirk Lapray 			.vmux   = 1,
890e976f937SKirk Lapray 			.gpio0  = 0x00000ffe,
891e976f937SKirk Lapray 			.gpio1  = 0x000000ff,
892e976f937SKirk Lapray 			.gpio2  = 0x00000001,
893e976f937SKirk Lapray 			.gpio3  = 0x00000000,
894e976f937SKirk Lapray 		}, {
895e976f937SKirk Lapray 			.type   = CX88_VMUX_SVIDEO,
896e976f937SKirk Lapray 			.vmux   = 2,
897e976f937SKirk Lapray 			.gpio0  = 0x00000ffe,
898e976f937SKirk Lapray 			.gpio1  = 0x000000ff,
899e976f937SKirk Lapray 			.gpio2  = 0x00000001,
900e976f937SKirk Lapray 			.gpio3  = 0x00000000,
901e976f937SKirk Lapray 		} },
90248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
903e976f937SKirk Lapray 	},
9042b5200a7SDavid Shirley 	[CX88_BOARD_WINFAST_DTV1000] = {
9052b5200a7SDavid Shirley 		.name           = "WinFast DTV1000-T",
906c39ba330SHans Verkuil 		.tuner_type     = UNSET,
9072b5200a7SDavid Shirley 		.radio_type     = UNSET,
9082b5200a7SDavid Shirley 		.tuner_addr	= ADDR_UNSET,
9092b5200a7SDavid Shirley 		.radio_addr	= ADDR_UNSET,
9102b5200a7SDavid Shirley 		.input          = { {
9112b5200a7SDavid Shirley 			.type   = CX88_VMUX_DVB,
9122b5200a7SDavid Shirley 			.vmux   = 0,
913e8f4e752SJean Delvare 		}, {
914e8f4e752SJean Delvare 			.type   = CX88_VMUX_COMPOSITE1,
915e8f4e752SJean Delvare 			.vmux   = 1,
916e8f4e752SJean Delvare 		}, {
917e8f4e752SJean Delvare 			.type   = CX88_VMUX_SVIDEO,
918e8f4e752SJean Delvare 			.vmux   = 2,
9192b5200a7SDavid Shirley 		} },
92048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
9212b5200a7SDavid Shirley 	},
9227418f346SLubomir Bulej 	[CX88_BOARD_AVERTV_303] = {
9237418f346SLubomir Bulej 		.name           = "AVerTV 303 (M126)",
9247418f346SLubomir Bulej 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
9257418f346SLubomir Bulej 		.radio_type     = UNSET,
9267418f346SLubomir Bulej 		.tuner_addr	= ADDR_UNSET,
9277418f346SLubomir Bulej 		.radio_addr	= ADDR_UNSET,
9287418f346SLubomir Bulej 		.tda9887_conf   = TDA9887_PRESENT,
9297418f346SLubomir Bulej 		.input          = { {
9307418f346SLubomir Bulej 			.type   = CX88_VMUX_TELEVISION,
9317418f346SLubomir Bulej 			.vmux   = 0,
9327418f346SLubomir Bulej 			.gpio0  = 0x00ff,
9337418f346SLubomir Bulej 			.gpio1  = 0xe09f,
9347418f346SLubomir Bulej 			.gpio2  = 0x0010,
9357418f346SLubomir Bulej 			.gpio3  = 0x0000,
9367418f346SLubomir Bulej 		}, {
9377418f346SLubomir Bulej 			.type   = CX88_VMUX_COMPOSITE1,
9387418f346SLubomir Bulej 			.vmux   = 1,
9397418f346SLubomir Bulej 			.gpio0  = 0x00ff,
9407418f346SLubomir Bulej 			.gpio1  = 0xe05f,
9417418f346SLubomir Bulej 			.gpio2  = 0x0010,
9427418f346SLubomir Bulej 			.gpio3  = 0x0000,
9437418f346SLubomir Bulej 		}, {
9447418f346SLubomir Bulej 			.type   = CX88_VMUX_SVIDEO,
9457418f346SLubomir Bulej 			.vmux   = 2,
9467418f346SLubomir Bulej 			.gpio0  = 0x00ff,
9477418f346SLubomir Bulej 			.gpio1  = 0xe05f,
9487418f346SLubomir Bulej 			.gpio2  = 0x0010,
9497418f346SLubomir Bulej 			.gpio3  = 0x0000,
9507418f346SLubomir Bulej 		} },
9517418f346SLubomir Bulej 	},
9520fa14aa6SSteven Toth 	[CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
9530fa14aa6SSteven Toth 		.name		= "Hauppauge Nova-S-Plus DVB-S",
954c39ba330SHans Verkuil 		.tuner_type	= UNSET,
9550fa14aa6SSteven Toth 		.radio_type	= UNSET,
9560fa14aa6SSteven Toth 		.tuner_addr	= ADDR_UNSET,
9570fa14aa6SSteven Toth 		.radio_addr	= ADDR_UNSET,
958facd2366SHans Verkuil 		.audio_chip	= CX88_AUDIO_WM8775,
9596951803cSLawrence Rust 		.i2sinputcntl   = 2,
9600fa14aa6SSteven Toth 		.input		= { {
9610fa14aa6SSteven Toth 			.type	= CX88_VMUX_DVB,
9620fa14aa6SSteven Toth 			.vmux	= 0,
963fcb97573Slawrence rust 			/* 2: Line-In */
964fcb97573Slawrence rust 			.audioroute = 2,
9650fa14aa6SSteven Toth 		}, {
9660fa14aa6SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
9670fa14aa6SSteven Toth 			.vmux	= 1,
968fcb97573Slawrence rust 			/* 2: Line-In */
969fcb97573Slawrence rust 			.audioroute = 2,
9700fa14aa6SSteven Toth 		}, {
9710fa14aa6SSteven Toth 			.type	= CX88_VMUX_SVIDEO,
9720fa14aa6SSteven Toth 			.vmux	= 2,
973fcb97573Slawrence rust 			/* 2: Line-In */
974fcb97573Slawrence rust 			.audioroute = 2,
9750fa14aa6SSteven Toth 		} },
97648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
9770fa14aa6SSteven Toth 	},
9780fa14aa6SSteven Toth 	[CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
9790fa14aa6SSteven Toth 		.name		= "Hauppauge Nova-SE2 DVB-S",
980c39ba330SHans Verkuil 		.tuner_type	= UNSET,
9810fa14aa6SSteven Toth 		.radio_type	= UNSET,
9820fa14aa6SSteven Toth 		.tuner_addr	= ADDR_UNSET,
9830fa14aa6SSteven Toth 		.radio_addr	= ADDR_UNSET,
9840fa14aa6SSteven Toth 		.input		= { {
9850fa14aa6SSteven Toth 			.type	= CX88_VMUX_DVB,
9860fa14aa6SSteven Toth 			.vmux	= 0,
9870fa14aa6SSteven Toth 		} },
98848d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
9890fa14aa6SSteven Toth 	},
9900e0351e3SVadim Catana 	[CX88_BOARD_KWORLD_DVBS_100] = {
9910e0351e3SVadim Catana 		.name		= "KWorld DVB-S 100",
992c39ba330SHans Verkuil 		.tuner_type	= UNSET,
9930e0351e3SVadim Catana 		.radio_type	= UNSET,
9940e0351e3SVadim Catana 		.tuner_addr	= ADDR_UNSET,
9950e0351e3SVadim Catana 		.radio_addr	= ADDR_UNSET,
996facd2366SHans Verkuil 		.audio_chip = CX88_AUDIO_WM8775,
9970e0351e3SVadim Catana 		.input		= { {
9980e0351e3SVadim Catana 			.type	= CX88_VMUX_DVB,
9990e0351e3SVadim Catana 			.vmux	= 0,
100046e67acdSMauro Carvalho Chehab 			/* 2: Line-In */
100146e67acdSMauro Carvalho Chehab 			.audioroute = 2,
10020e0351e3SVadim Catana 		}, {
10030e0351e3SVadim Catana 			.type	= CX88_VMUX_COMPOSITE1,
10040e0351e3SVadim Catana 			.vmux	= 1,
100546e67acdSMauro Carvalho Chehab 			/* 2: Line-In */
100646e67acdSMauro Carvalho Chehab 			.audioroute = 2,
10070e0351e3SVadim Catana 		}, {
10080e0351e3SVadim Catana 			.type	= CX88_VMUX_SVIDEO,
10090e0351e3SVadim Catana 			.vmux	= 2,
101046e67acdSMauro Carvalho Chehab 			/* 2: Line-In */
101146e67acdSMauro Carvalho Chehab 			.audioroute = 2,
10120e0351e3SVadim Catana 		} },
101348d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
10140e0351e3SVadim Catana 	},
1015611900c1SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR1100] = {
1016611900c1SSteven Toth 		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
1017611900c1SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1018611900c1SSteven Toth 		.radio_type	= UNSET,
1019611900c1SSteven Toth 		.tuner_addr	= ADDR_UNSET,
1020611900c1SSteven Toth 		.radio_addr	= ADDR_UNSET,
1021611900c1SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1022611900c1SSteven Toth 		.input		= { {
1023611900c1SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
1024611900c1SSteven Toth 			.vmux   = 0,
1025611900c1SSteven Toth 		}, {
1026611900c1SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
1027611900c1SSteven Toth 			.vmux	= 1,
1028611900c1SSteven Toth 		}, {
1029611900c1SSteven Toth 			.type	= CX88_VMUX_SVIDEO,
1030611900c1SSteven Toth 			.vmux	= 2,
1031611900c1SSteven Toth 		} },
1032611900c1SSteven Toth 		/* fixme: Add radio support */
103348d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1034611900c1SSteven Toth 	},
1035611900c1SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
1036611900c1SSteven Toth 		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
1037611900c1SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1038611900c1SSteven Toth 		.radio_type	= UNSET,
1039611900c1SSteven Toth 		.tuner_addr	= ADDR_UNSET,
1040611900c1SSteven Toth 		.radio_addr	= ADDR_UNSET,
1041611900c1SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1042611900c1SSteven Toth 		.input		= { {
1043611900c1SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
1044611900c1SSteven Toth 			.vmux   = 0,
1045611900c1SSteven Toth 		}, {
1046611900c1SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
1047611900c1SSteven Toth 			.vmux	= 1,
1048611900c1SSteven Toth 		} },
1049611900c1SSteven Toth 		/* fixme: Add radio support */
105048d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1051611900c1SSteven Toth 	},
1052fc40b261SChris Pascoe 	[CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
1053fc40b261SChris Pascoe 		.name           = "digitalnow DNTV Live! DVB-T Pro",
1054fc40b261SChris Pascoe 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1055fc40b261SChris Pascoe 		.radio_type     = UNSET,
1056fc40b261SChris Pascoe 		.tuner_addr	= ADDR_UNSET,
1057fc40b261SChris Pascoe 		.radio_addr	= ADDR_UNSET,
1058fc40b261SChris Pascoe 		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1059fc40b261SChris Pascoe 				  TDA9887_PORT2_ACTIVE,
1060fc40b261SChris Pascoe 		.input          = { {
1061fc40b261SChris Pascoe 			.type   = CX88_VMUX_TELEVISION,
1062fc40b261SChris Pascoe 			.vmux   = 0,
1063fc40b261SChris Pascoe 			.gpio0  = 0xf80808,
1064fc40b261SChris Pascoe 		}, {
1065fc40b261SChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
1066fc40b261SChris Pascoe 			.vmux   = 1,
1067fc40b261SChris Pascoe 			.gpio0	= 0xf80808,
1068fc40b261SChris Pascoe 		}, {
1069fc40b261SChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
1070fc40b261SChris Pascoe 			.vmux   = 2,
1071fc40b261SChris Pascoe 			.gpio0	= 0xf80808,
1072fc40b261SChris Pascoe 		} },
1073fc40b261SChris Pascoe 		.radio = {
1074fc40b261SChris Pascoe 			 .type  = CX88_RADIO,
1075fc40b261SChris Pascoe 			 .gpio0 = 0xf80808,
1076fc40b261SChris Pascoe 		},
107748d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1078fc40b261SChris Pascoe 	},
1079f39624fdSManenti Marco 	[CX88_BOARD_KWORLD_DVB_T_CX22702] = {
1080f39624fdSManenti Marco 		/* Kworld V-stream Xpert DVB-T with Thomson tuner */
1081f39624fdSManenti Marco 		/* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */
1082f39624fdSManenti Marco 		/* Manenti Marco <marco_manenti@colman.it> */
1083f39624fdSManenti Marco 		.name           = "KWorld/VStream XPert DVB-T with cx22702",
1084c39ba330SHans Verkuil 		.tuner_type     = UNSET,
1085f39624fdSManenti Marco 		.radio_type     = UNSET,
1086f39624fdSManenti Marco 		.tuner_addr	= ADDR_UNSET,
1087f39624fdSManenti Marco 		.radio_addr	= ADDR_UNSET,
1088f39624fdSManenti Marco 		.input          = { {
1089f39624fdSManenti Marco 			.type   = CX88_VMUX_COMPOSITE1,
1090f39624fdSManenti Marco 			.vmux   = 1,
1091f39624fdSManenti Marco 			.gpio0  = 0x0700,
1092f39624fdSManenti Marco 			.gpio2  = 0x0101,
1093f39624fdSManenti Marco 		}, {
1094f39624fdSManenti Marco 			.type   = CX88_VMUX_SVIDEO,
1095f39624fdSManenti Marco 			.vmux   = 2,
1096f39624fdSManenti Marco 			.gpio0  = 0x0700,
1097f39624fdSManenti Marco 			.gpio2  = 0x0101,
1098f39624fdSManenti Marco 		} },
109948d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1100f39624fdSManenti Marco 	},
110143eabb4eSChris Pascoe 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
110243eabb4eSChris Pascoe 		.name           = "DViCO FusionHDTV DVB-T Dual Digital",
1103c39ba330SHans Verkuil 		.tuner_type     = UNSET, /* No analog tuner */
110443eabb4eSChris Pascoe 		.radio_type     = UNSET,
110543eabb4eSChris Pascoe 		.tuner_addr	= ADDR_UNSET,
110643eabb4eSChris Pascoe 		.radio_addr	= ADDR_UNSET,
110743eabb4eSChris Pascoe 		.input          = { {
110843eabb4eSChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
110943eabb4eSChris Pascoe 			.vmux   = 1,
1110d536e9c4SChris Pascoe 			.gpio0  = 0x000067df,
111143eabb4eSChris Pascoe 		 }, {
111243eabb4eSChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
111343eabb4eSChris Pascoe 			.vmux   = 2,
1114d536e9c4SChris Pascoe 			.gpio0  = 0x000067df,
111543eabb4eSChris Pascoe 		} },
111648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
111743eabb4eSChris Pascoe 	},
111844256de1SMichael Krufky 	[CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
111944256de1SMichael Krufky 		.name           = "KWorld HardwareMpegTV XPert",
112044256de1SMichael Krufky 		.tuner_type     = TUNER_PHILIPS_TDA8290,
112144256de1SMichael Krufky 		.radio_type     = UNSET,
112244256de1SMichael Krufky 		.tuner_addr	= ADDR_UNSET,
112344256de1SMichael Krufky 		.radio_addr	= ADDR_UNSET,
112444256de1SMichael Krufky 		.input          = { {
112544256de1SMichael Krufky 			.type   = CX88_VMUX_TELEVISION,
112644256de1SMichael Krufky 			.vmux   = 0,
1127e2798212SMichael Krufky 			.gpio0  = 0x3de2,
112824da4e4bSMichael Krufky 			.gpio2  = 0x00ff,
1129bc53f783SMichael Krufky 		}, {
1130bc53f783SMichael Krufky 			.type   = CX88_VMUX_COMPOSITE1,
1131bc53f783SMichael Krufky 			.vmux   = 1,
1132bc53f783SMichael Krufky 			.gpio0  = 0x3de6,
11337b27d45bSRicardo Cerqueira 			.audioroute = 1,
1134bc53f783SMichael Krufky 		}, {
1135bc53f783SMichael Krufky 			.type   = CX88_VMUX_SVIDEO,
1136bc53f783SMichael Krufky 			.vmux   = 2,
1137bc53f783SMichael Krufky 			.gpio0  = 0x3de6,
11387b27d45bSRicardo Cerqueira 			.audioroute = 1,
113944256de1SMichael Krufky 		} },
1140e2798212SMichael Krufky 		.radio = {
1141e2798212SMichael Krufky 			.type   = CX88_RADIO,
1142e2798212SMichael Krufky 			.gpio0  = 0x3de6,
114324da4e4bSMichael Krufky 			.gpio2  = 0x00ff,
1144e2798212SMichael Krufky 		},
114548d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
114644256de1SMichael Krufky 	},
1147780dfef3SChris Pascoe 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
1148780dfef3SChris Pascoe 		.name           = "DViCO FusionHDTV DVB-T Hybrid",
114991ae3299SMichael Krufky 		.tuner_type     = TUNER_THOMSON_FE6600,
1150780dfef3SChris Pascoe 		.radio_type     = UNSET,
1151780dfef3SChris Pascoe 		.tuner_addr	= ADDR_UNSET,
1152780dfef3SChris Pascoe 		.radio_addr	= ADDR_UNSET,
1153780dfef3SChris Pascoe 		.input          = { {
1154780dfef3SChris Pascoe 			.type   = CX88_VMUX_TELEVISION,
1155780dfef3SChris Pascoe 			.vmux   = 0,
1156780dfef3SChris Pascoe 			.gpio0  = 0x0000a75f,
1157780dfef3SChris Pascoe 		}, {
1158780dfef3SChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
1159780dfef3SChris Pascoe 			.vmux   = 1,
1160780dfef3SChris Pascoe 			.gpio0  = 0x0000a75b,
1161780dfef3SChris Pascoe 		}, {
1162780dfef3SChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
1163780dfef3SChris Pascoe 			.vmux   = 2,
1164780dfef3SChris Pascoe 			.gpio0  = 0x0000a75b,
1165780dfef3SChris Pascoe 		} },
116648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1167780dfef3SChris Pascoe 	},
1168e142e7c4SMichael Krufky 	[CX88_BOARD_PCHDTV_HD5500] = {
1169e142e7c4SMichael Krufky 		.name           = "pcHDTV HD5500 HDTV",
11709c26c8b1SMichael Krufky 		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
1171e142e7c4SMichael Krufky 		.radio_type     = UNSET,
1172e142e7c4SMichael Krufky 		.tuner_addr	= ADDR_UNSET,
1173e142e7c4SMichael Krufky 		.radio_addr	= ADDR_UNSET,
1174e142e7c4SMichael Krufky 		.tda9887_conf   = TDA9887_PRESENT,
1175e142e7c4SMichael Krufky 		.input          = { {
1176e142e7c4SMichael Krufky 			.type   = CX88_VMUX_TELEVISION,
1177e142e7c4SMichael Krufky 			.vmux   = 0,
1178e142e7c4SMichael Krufky 			.gpio0  = 0x87fd,
1179e142e7c4SMichael Krufky 		}, {
1180e142e7c4SMichael Krufky 			.type   = CX88_VMUX_COMPOSITE1,
1181e142e7c4SMichael Krufky 			.vmux   = 1,
1182e142e7c4SMichael Krufky 			.gpio0  = 0x87f9,
1183e142e7c4SMichael Krufky 		}, {
1184e142e7c4SMichael Krufky 			.type   = CX88_VMUX_SVIDEO,
1185e142e7c4SMichael Krufky 			.vmux   = 2,
1186e142e7c4SMichael Krufky 			.gpio0  = 0x87f9,
1187e142e7c4SMichael Krufky 		} },
118848d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1189e142e7c4SMichael Krufky 	},
1190b3038304SValentin Zagura 	[CX88_BOARD_KWORLD_MCE200_DELUXE] = {
1191399426caSMauro Carvalho Chehab 		/*
1192399426caSMauro Carvalho Chehab 		 * FIXME: tested TV input only, disabled composite,
1193399426caSMauro Carvalho Chehab 		 * svideo and radio until they can be tested also.
1194399426caSMauro Carvalho Chehab 		 */
1195b3038304SValentin Zagura 		.name           = "Kworld MCE 200 Deluxe",
1196b3038304SValentin Zagura 		.tuner_type     = TUNER_TENA_9533_DI,
1197b3038304SValentin Zagura 		.radio_type     = UNSET,
1198b3038304SValentin Zagura 		.tda9887_conf   = TDA9887_PRESENT,
1199b3038304SValentin Zagura 		.tuner_addr     = ADDR_UNSET,
1200b3038304SValentin Zagura 		.radio_addr     = ADDR_UNSET,
1201b3038304SValentin Zagura 		.input          = { {
1202b3038304SValentin Zagura 			.type   = CX88_VMUX_TELEVISION,
1203b3038304SValentin Zagura 			.vmux   = 0,
1204b3038304SValentin Zagura 			.gpio0  = 0x0000BDE6
1205b3038304SValentin Zagura 		} },
120648d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
1207b3038304SValentin Zagura 	},
1208a3124622SAngelo Marconi 	[CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
1209a3124622SAngelo Marconi 		/* FIXME: SVideo, Composite and FM inputs are untested */
1210a3124622SAngelo Marconi 		.name           = "PixelView PlayTV P7000",
1211a3124622SAngelo Marconi 		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
1212a3124622SAngelo Marconi 		.radio_type     = UNSET,
1213a3124622SAngelo Marconi 		.tuner_addr	= ADDR_UNSET,
1214a3124622SAngelo Marconi 		.radio_addr	= ADDR_UNSET,
1215a3124622SAngelo Marconi 		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
1216a3124622SAngelo Marconi 				  TDA9887_PORT2_ACTIVE,
1217a3124622SAngelo Marconi 		.input          = { {
1218a3124622SAngelo Marconi 			.type   = CX88_VMUX_TELEVISION,
1219a3124622SAngelo Marconi 			.vmux   = 0,
1220a3124622SAngelo Marconi 			.gpio0  = 0x5da6,
1221a3124622SAngelo Marconi 		} },
122248d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_BLACKBIRD,
1223a3124622SAngelo Marconi 	},
1224be4f4519SRicardo Cerqueira 	[CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
1225be4f4519SRicardo Cerqueira 		.name           = "NPG Tech Real TV FM Top 10",
1226be4f4519SRicardo Cerqueira 		.tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */
1227680543c5SRicardo Cerqueira 		.radio_type     = UNSET,
1228680543c5SRicardo Cerqueira 		.tuner_addr	= ADDR_UNSET,
1229680543c5SRicardo Cerqueira 		.radio_addr	= ADDR_UNSET,
1230680543c5SRicardo Cerqueira 		.input          = { {
1231680543c5SRicardo Cerqueira 			.type   = CX88_VMUX_TELEVISION,
1232680543c5SRicardo Cerqueira 			.vmux   = 0,
1233680543c5SRicardo Cerqueira 			.gpio0	= 0x0788,
1234680543c5SRicardo Cerqueira 		}, {
1235680543c5SRicardo Cerqueira 			.type   = CX88_VMUX_COMPOSITE1,
1236680543c5SRicardo Cerqueira 			.vmux   = 1,
1237680543c5SRicardo Cerqueira 			.gpio0	= 0x078b,
1238680543c5SRicardo Cerqueira 		}, {
1239680543c5SRicardo Cerqueira 			.type   = CX88_VMUX_SVIDEO,
1240680543c5SRicardo Cerqueira 			.vmux   = 2,
1241be4f4519SRicardo Cerqueira 			.gpio0	= 0x078b,
1242680543c5SRicardo Cerqueira 		} },
1243680543c5SRicardo Cerqueira 		.radio = {
1244680543c5SRicardo Cerqueira 			 .type  = CX88_RADIO,
1245680543c5SRicardo Cerqueira 			 .gpio0 = 0x074a,
1246680543c5SRicardo Cerqueira 		},
1247680543c5SRicardo Cerqueira 	},
12484bd6e9d9SMalcolm Valentine 	[CX88_BOARD_WINFAST_DTV2000H] = {
12494bd6e9d9SMalcolm Valentine 		.name           = "WinFast DTV2000 H",
12504bd6e9d9SMalcolm Valentine 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
12514bd6e9d9SMalcolm Valentine 		.radio_type     = UNSET,
12524bd6e9d9SMalcolm Valentine 		.tuner_addr     = ADDR_UNSET,
12534bd6e9d9SMalcolm Valentine 		.radio_addr     = ADDR_UNSET,
12544bd6e9d9SMalcolm Valentine 		.tda9887_conf   = TDA9887_PRESENT,
12554bd6e9d9SMalcolm Valentine 		.input          = { {
12564bd6e9d9SMalcolm Valentine 			.type   = CX88_VMUX_TELEVISION,
12574bd6e9d9SMalcolm Valentine 			.vmux   = 0,
12584bd6e9d9SMalcolm Valentine 			.gpio0  = 0x00017304,
12594bd6e9d9SMalcolm Valentine 			.gpio1  = 0x00008203,
12604bd6e9d9SMalcolm Valentine 			.gpio2  = 0x00017304,
12614bd6e9d9SMalcolm Valentine 			.gpio3  = 0x02000000,
12625cff91a0SVincent Pelletier 		}, {
12635cff91a0SVincent Pelletier 			.type   = CX88_VMUX_COMPOSITE1,
12645cff91a0SVincent Pelletier 			.vmux   = 1,
12655cff91a0SVincent Pelletier 			.gpio0  = 0x0001d701,
12665cff91a0SVincent Pelletier 			.gpio1  = 0x0000b207,
12675cff91a0SVincent Pelletier 			.gpio2  = 0x0001d701,
12685cff91a0SVincent Pelletier 			.gpio3  = 0x02000000,
12695cff91a0SVincent Pelletier 		}, {
12705cff91a0SVincent Pelletier 			.type   = CX88_VMUX_COMPOSITE2,
12715cff91a0SVincent Pelletier 			.vmux   = 2,
12725cff91a0SVincent Pelletier 			.gpio0  = 0x0001d503,
12735cff91a0SVincent Pelletier 			.gpio1  = 0x0000b207,
12745cff91a0SVincent Pelletier 			.gpio2  = 0x0001d503,
12755cff91a0SVincent Pelletier 			.gpio3  = 0x02000000,
12765cff91a0SVincent Pelletier 		}, {
12775cff91a0SVincent Pelletier 			.type   = CX88_VMUX_SVIDEO,
12785cff91a0SVincent Pelletier 			.vmux   = 3,
12795cff91a0SVincent Pelletier 			.gpio0  = 0x0001d701,
12805cff91a0SVincent Pelletier 			.gpio1  = 0x0000b207,
12815cff91a0SVincent Pelletier 			.gpio2  = 0x0001d701,
12825cff91a0SVincent Pelletier 			.gpio3  = 0x02000000,
12834bd6e9d9SMalcolm Valentine 		} },
12845cff91a0SVincent Pelletier 		.radio = {
12855cff91a0SVincent Pelletier 			 .type  = CX88_RADIO,
12865cff91a0SVincent Pelletier 			 .gpio0 = 0x00015702,
12875cff91a0SVincent Pelletier 			 .gpio1 = 0x0000f207,
12885cff91a0SVincent Pelletier 			 .gpio2 = 0x00015702,
12895cff91a0SVincent Pelletier 			 .gpio3 = 0x02000000,
12905cff91a0SVincent Pelletier 		},
129148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
12924bd6e9d9SMalcolm Valentine 	},
12934d14c833SVlastimil Labsky 	[CX88_BOARD_WINFAST_DTV2000H_J] = {
12944d14c833SVlastimil Labsky 		.name           = "WinFast DTV2000 H rev. J",
129527b93d8aSMiroslav Slugen 		.tuner_type     = TUNER_PHILIPS_FMD1216MEX_MK3,
12964d14c833SVlastimil Labsky 		.radio_type     = UNSET,
12974d14c833SVlastimil Labsky 		.tuner_addr     = ADDR_UNSET,
12984d14c833SVlastimil Labsky 		.radio_addr     = ADDR_UNSET,
12994d14c833SVlastimil Labsky 		.tda9887_conf   = TDA9887_PRESENT,
13004d14c833SVlastimil Labsky 		.input          = { {
13014d14c833SVlastimil Labsky 			.type   = CX88_VMUX_TELEVISION,
13024d14c833SVlastimil Labsky 			.vmux   = 0,
13034d14c833SVlastimil Labsky 			.gpio0  = 0x00017300,
13044d14c833SVlastimil Labsky 			.gpio1  = 0x00008207,
13054d14c833SVlastimil Labsky 			.gpio2	= 0x00000000,
13064d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13074d14c833SVlastimil Labsky 		}, {
13084d14c833SVlastimil Labsky 			.type   = CX88_VMUX_TELEVISION,
13094d14c833SVlastimil Labsky 			.vmux   = 0,
13104d14c833SVlastimil Labsky 			.gpio0  = 0x00018300,
13114d14c833SVlastimil Labsky 			.gpio1  = 0x0000f207,
13124d14c833SVlastimil Labsky 			.gpio2	= 0x00017304,
13134d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13144d14c833SVlastimil Labsky 		}, {
13154d14c833SVlastimil Labsky 			.type   = CX88_VMUX_COMPOSITE1,
13164d14c833SVlastimil Labsky 			.vmux   = 1,
13174d14c833SVlastimil Labsky 			.gpio0  = 0x00018301,
13184d14c833SVlastimil Labsky 			.gpio1  = 0x0000f207,
13194d14c833SVlastimil Labsky 			.gpio2	= 0x00017304,
13204d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13214d14c833SVlastimil Labsky 		}, {
13224d14c833SVlastimil Labsky 			.type   = CX88_VMUX_SVIDEO,
13234d14c833SVlastimil Labsky 			.vmux   = 2,
13244d14c833SVlastimil Labsky 			.gpio0  = 0x00018301,
13254d14c833SVlastimil Labsky 			.gpio1  = 0x0000f207,
13264d14c833SVlastimil Labsky 			.gpio2	= 0x00017304,
13274d14c833SVlastimil Labsky 			.gpio3  = 0x02000000,
13284d14c833SVlastimil Labsky 		} },
13294d14c833SVlastimil Labsky 		.radio = {
13304d14c833SVlastimil Labsky 			 .type  = CX88_RADIO,
13314d14c833SVlastimil Labsky 			 .gpio0 = 0x00015702,
13324d14c833SVlastimil Labsky 			 .gpio1 = 0x0000f207,
13334d14c833SVlastimil Labsky 			 .gpio2 = 0x00015702,
13344d14c833SVlastimil Labsky 			 .gpio3 = 0x02000000,
13354d14c833SVlastimil Labsky 		},
13364d14c833SVlastimil Labsky 		.mpeg           = CX88_MPEG_DVB,
13374d14c833SVlastimil Labsky 	},
1338c02a34f4SSaqeb Akhter 	[CX88_BOARD_GENIATECH_DVBS] = {
1339c02a34f4SSaqeb Akhter 		.name          = "Geniatech DVB-S",
1340c39ba330SHans Verkuil 		.tuner_type    = UNSET,
1341c02a34f4SSaqeb Akhter 		.radio_type    = UNSET,
1342c02a34f4SSaqeb Akhter 		.tuner_addr    = ADDR_UNSET,
1343c02a34f4SSaqeb Akhter 		.radio_addr    = ADDR_UNSET,
1344c02a34f4SSaqeb Akhter 		.input  = { {
1345c02a34f4SSaqeb Akhter 			.type  = CX88_VMUX_DVB,
1346c02a34f4SSaqeb Akhter 			.vmux  = 0,
1347c02a34f4SSaqeb Akhter 		}, {
1348c02a34f4SSaqeb Akhter 			.type  = CX88_VMUX_COMPOSITE1,
1349c02a34f4SSaqeb Akhter 			.vmux  = 1,
1350c02a34f4SSaqeb Akhter 		} },
135148d5e803SMichael Krufky 		.mpeg           = CX88_MPEG_DVB,
1352c02a34f4SSaqeb Akhter 	},
1353ad10c930SEric Thomas 	[CX88_BOARD_HAUPPAUGE_HVR3000] = {
1354ad10c930SEric Thomas 		.name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
1355ad10c930SEric Thomas 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1356ad10c930SEric Thomas 		.radio_type     = UNSET,
1357ad10c930SEric Thomas 		.tuner_addr     = ADDR_UNSET,
1358ad10c930SEric Thomas 		.radio_addr     = ADDR_UNSET,
1359ad10c930SEric Thomas 		.tda9887_conf   = TDA9887_PRESENT,
1360facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_WM8775,
1361ad10c930SEric Thomas 		.input          = { {
1362ad10c930SEric Thomas 			.type   = CX88_VMUX_TELEVISION,
1363ad10c930SEric Thomas 			.vmux   = 0,
1364ad10c930SEric Thomas 			.gpio0  = 0x84bf,
1365649e13a9SDarron Broad 			/* 1: TV Audio / FM Mono */
1366923ac7f7SDarron Broad 			.audioroute = 1,
1367ad10c930SEric Thomas 		}, {
1368ad10c930SEric Thomas 			.type   = CX88_VMUX_COMPOSITE1,
1369ad10c930SEric Thomas 			.vmux   = 1,
1370ad10c930SEric Thomas 			.gpio0  = 0x84bf,
1371649e13a9SDarron Broad 			/* 2: Line-In */
1372923ac7f7SDarron Broad 			.audioroute = 2,
1373ad10c930SEric Thomas 		}, {
1374ad10c930SEric Thomas 			.type   = CX88_VMUX_SVIDEO,
1375ad10c930SEric Thomas 			.vmux   = 2,
1376ad10c930SEric Thomas 			.gpio0  = 0x84bf,
1377649e13a9SDarron Broad 			/* 2: Line-In */
1378923ac7f7SDarron Broad 			.audioroute = 2,
1379ad10c930SEric Thomas 		} },
138063248f26SDarron Broad 		.radio = {
138163248f26SDarron Broad 			.type   = CX88_RADIO,
138263248f26SDarron Broad 			.gpio0	= 0x84bf,
1383649e13a9SDarron Broad 			/* 4: FM Stereo (untested) */
1384649e13a9SDarron Broad 			.audioroute = 8,
138563248f26SDarron Broad 		},
138676dc82abSSteven Toth 		.mpeg           = CX88_MPEG_DVB,
1387363c35fcSSteven Toth 		.num_frontends	= 2,
1388ad10c930SEric Thomas 	},
1389d1009bd7SPeter Naulls 	[CX88_BOARD_NORWOOD_MICRO] = {
1390d1009bd7SPeter Naulls 		.name           = "Norwood Micro TV Tuner",
1391d1009bd7SPeter Naulls 		.tuner_type     = TUNER_TNF_5335MF,
1392d1009bd7SPeter Naulls 		.radio_type     = UNSET,
1393d1009bd7SPeter Naulls 		.tuner_addr     = ADDR_UNSET,
1394d1009bd7SPeter Naulls 		.radio_addr     = ADDR_UNSET,
1395d1009bd7SPeter Naulls 		.input          = { {
1396d1009bd7SPeter Naulls 			.type   = CX88_VMUX_TELEVISION,
1397d1009bd7SPeter Naulls 			.vmux   = 0,
1398d1009bd7SPeter Naulls 			.gpio0  = 0x0709,
1399d1009bd7SPeter Naulls 		}, {
1400d1009bd7SPeter Naulls 			.type   = CX88_VMUX_COMPOSITE1,
1401d1009bd7SPeter Naulls 			.vmux   = 1,
1402d1009bd7SPeter Naulls 			.gpio0  = 0x070b,
1403d1009bd7SPeter Naulls 		}, {
1404d1009bd7SPeter Naulls 			.type   = CX88_VMUX_SVIDEO,
1405d1009bd7SPeter Naulls 			.vmux   = 2,
1406d1009bd7SPeter Naulls 			.gpio0  = 0x070b,
1407d1009bd7SPeter Naulls 		} },
1408d1009bd7SPeter Naulls 	},
14092acadefaSDavid Bussenschutt 	[CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
14102acadefaSDavid Bussenschutt 		.name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
14112acadefaSDavid Bussenschutt 		.tuner_type     = TUNER_LG_PAL_NEW_TAPC,
14122acadefaSDavid Bussenschutt 		.radio_type     = UNSET,
14132acadefaSDavid Bussenschutt 		.tuner_addr     = ADDR_UNSET,
14142acadefaSDavid Bussenschutt 		.radio_addr     = ADDR_UNSET,
14152acadefaSDavid Bussenschutt 		.input          = { {
14162acadefaSDavid Bussenschutt 			.type   = CX88_VMUX_TELEVISION,
14172acadefaSDavid Bussenschutt 			.vmux   = 0,
14182acadefaSDavid Bussenschutt 			.gpio0  = 0x003fffff,
14192acadefaSDavid Bussenschutt 			.gpio1  = 0x00e00000,
14202acadefaSDavid Bussenschutt 			.gpio2  = 0x003fffff,
14212acadefaSDavid Bussenschutt 			.gpio3  = 0x02000000,
14222acadefaSDavid Bussenschutt 		}, {
14232acadefaSDavid Bussenschutt 			.type   = CX88_VMUX_COMPOSITE1,
14242acadefaSDavid Bussenschutt 			.vmux   = 1,
14252acadefaSDavid Bussenschutt 			.gpio0  = 0x003fffff,
14262acadefaSDavid Bussenschutt 			.gpio1  = 0x00e00000,
14272acadefaSDavid Bussenschutt 			.gpio2  = 0x003fffff,
14282acadefaSDavid Bussenschutt 			.gpio3  = 0x02000000,
14292acadefaSDavid Bussenschutt 		}, {
14302acadefaSDavid Bussenschutt 			.type   = CX88_VMUX_SVIDEO,
14312acadefaSDavid Bussenschutt 			.vmux   = 2,
14322acadefaSDavid Bussenschutt 			.gpio0  = 0x003fffff,
14332acadefaSDavid Bussenschutt 			.gpio1  = 0x00e00000,
14342acadefaSDavid Bussenschutt 			.gpio2  = 0x003fffff,
14352acadefaSDavid Bussenschutt 			.gpio3  = 0x02000000,
14362acadefaSDavid Bussenschutt 		} },
14372acadefaSDavid Bussenschutt 	},
1438aa481a65SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR1300] = {
1439aa481a65SSteven Toth 		.name		= "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
1440aa481a65SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
1441aa481a65SSteven Toth 		.radio_type	= UNSET,
1442aa481a65SSteven Toth 		.tuner_addr	= ADDR_UNSET,
1443aa481a65SSteven Toth 		.radio_addr	= ADDR_UNSET,
1444aa481a65SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1445facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_WM8775,
14462491fbb7SSteven Toth 		/*
14472491fbb7SSteven Toth 		 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
14482491fbb7SSteven Toth 		 */
1449aa481a65SSteven Toth 		.input		= { {
1450aa481a65SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
1451aa481a65SSteven Toth 			.vmux   = 0,
14522491fbb7SSteven Toth 			.gpio0	= 0xef88,
1453649e13a9SDarron Broad 			/* 1: TV Audio / FM Mono */
14547b27d45bSRicardo Cerqueira 			.audioroute = 1,
1455aa481a65SSteven Toth 		}, {
1456aa481a65SSteven Toth 			.type	= CX88_VMUX_COMPOSITE1,
1457aa481a65SSteven Toth 			.vmux	= 1,
14582491fbb7SSteven Toth 			.gpio0	= 0xef88,
1459649e13a9SDarron Broad 			/* 2: Line-In */
14607b27d45bSRicardo Cerqueira 			.audioroute = 2,
1461aa481a65SSteven Toth 		}, {
1462aa481a65SSteven Toth 			.type	= CX88_VMUX_SVIDEO,
1463aa481a65SSteven Toth 			.vmux	= 2,
14642491fbb7SSteven Toth 			.gpio0	= 0xef88,
1465649e13a9SDarron Broad 			/* 2: Line-In */
14667b27d45bSRicardo Cerqueira 			.audioroute = 2,
1467aa481a65SSteven Toth 		} },
14686c5be74cSSteven Toth 		.mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
14696b92b3bdSSteven Toth 		.radio = {
14706b92b3bdSSteven Toth 			.type   = CX88_RADIO,
14712491fbb7SSteven Toth 			.gpio0	= 0xef88,
1472649e13a9SDarron Broad 			/* 4: FM Stereo (untested) */
1473649e13a9SDarron Broad 			.audioroute = 8,
14746b92b3bdSSteven Toth 		},
1475aa481a65SSteven Toth 	},
14764f3ca2f1SDirk Herrendoerfer 	[CX88_BOARD_SAMSUNG_SMT_7020] = {
14774f3ca2f1SDirk Herrendoerfer 		.name		= "Samsung SMT 7020 DVB-S",
1478c39ba330SHans Verkuil 		.tuner_type	= UNSET,
14794f3ca2f1SDirk Herrendoerfer 		.radio_type	= UNSET,
14804f3ca2f1SDirk Herrendoerfer 		.tuner_addr	= ADDR_UNSET,
14814f3ca2f1SDirk Herrendoerfer 		.radio_addr	= ADDR_UNSET,
14824f3ca2f1SDirk Herrendoerfer 		.input		= { {
14834f3ca2f1SDirk Herrendoerfer 			.type	= CX88_VMUX_DVB,
14844f3ca2f1SDirk Herrendoerfer 			.vmux	= 0,
14854f3ca2f1SDirk Herrendoerfer 		} },
14864f3ca2f1SDirk Herrendoerfer 		.mpeg           = CX88_MPEG_DVB,
14874f3ca2f1SDirk Herrendoerfer 	},
14887cb47a14SDaniel Gimpelevich 	[CX88_BOARD_ADSTECH_PTV_390] = {
14897cb47a14SDaniel Gimpelevich 		.name           = "ADS Tech Instant Video PCI",
1490c39ba330SHans Verkuil 		.tuner_type     = UNSET,
14917cb47a14SDaniel Gimpelevich 		.radio_type     = UNSET,
14927cb47a14SDaniel Gimpelevich 		.tuner_addr     = ADDR_UNSET,
14937cb47a14SDaniel Gimpelevich 		.radio_addr     = ADDR_UNSET,
14947cb47a14SDaniel Gimpelevich 		.input          = { {
14957cb47a14SDaniel Gimpelevich 			.type   = CX88_VMUX_DEBUG,
14967cb47a14SDaniel Gimpelevich 			.vmux   = 3,
14977cb47a14SDaniel Gimpelevich 			.gpio0  = 0x04ff,
14987cb47a14SDaniel Gimpelevich 		}, {
14997cb47a14SDaniel Gimpelevich 			.type   = CX88_VMUX_COMPOSITE1,
15007cb47a14SDaniel Gimpelevich 			.vmux   = 1,
15017cb47a14SDaniel Gimpelevich 			.gpio0  = 0x07fa,
15027cb47a14SDaniel Gimpelevich 		}, {
15037cb47a14SDaniel Gimpelevich 			.type   = CX88_VMUX_SVIDEO,
15047cb47a14SDaniel Gimpelevich 			.vmux   = 2,
15057cb47a14SDaniel Gimpelevich 			.gpio0  = 0x07fa,
15067cb47a14SDaniel Gimpelevich 		} },
15077cb47a14SDaniel Gimpelevich 	},
150860464da8SSteven Toth 	[CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
150960464da8SSteven Toth 		.name           = "Pinnacle PCTV HD 800i",
151060464da8SSteven Toth 		.tuner_type     = TUNER_XC5000,
151160464da8SSteven Toth 		.radio_type     = UNSET,
151260464da8SSteven Toth 		.tuner_addr	= ADDR_UNSET,
151360464da8SSteven Toth 		.radio_addr	= ADDR_UNSET,
151460464da8SSteven Toth 		.input          = { {
151560464da8SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
151660464da8SSteven Toth 			.vmux   = 0,
151760464da8SSteven Toth 			.gpio0  = 0x04fb,
151860464da8SSteven Toth 			.gpio1  = 0x10ff,
151960464da8SSteven Toth 		}, {
152060464da8SSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
152160464da8SSteven Toth 			.vmux   = 1,
152260464da8SSteven Toth 			.gpio0  = 0x04fb,
152360464da8SSteven Toth 			.gpio1  = 0x10ef,
152460464da8SSteven Toth 			.audioroute = 1,
152560464da8SSteven Toth 		}, {
152660464da8SSteven Toth 			.type   = CX88_VMUX_SVIDEO,
152760464da8SSteven Toth 			.vmux   = 2,
152860464da8SSteven Toth 			.gpio0  = 0x04fb,
152960464da8SSteven Toth 			.gpio1  = 0x10ef,
153060464da8SSteven Toth 			.audioroute = 1,
153160464da8SSteven Toth 		} },
153260464da8SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
153360464da8SSteven Toth 	},
15345c00fac0SSteven Toth 	[CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
15358efd2e28SMichael Krufky 		.name           = "DViCO FusionHDTV 5 PCI nano",
15368efd2e28SMichael Krufky 		/* xc3008 tuner, digital only for now */
1537c39ba330SHans Verkuil 		.tuner_type     = UNSET,
15385c00fac0SSteven Toth 		.radio_type     = UNSET,
15395c00fac0SSteven Toth 		.tuner_addr	= ADDR_UNSET,
15405c00fac0SSteven Toth 		.radio_addr	= ADDR_UNSET,
15415c00fac0SSteven Toth 		.input          = { {
15425c00fac0SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
15435c00fac0SSteven Toth 			.vmux   = 0,
15445c00fac0SSteven Toth 			.gpio0  = 0x000027df, /* Unconfirmed */
15455c00fac0SSteven Toth 		}, {
15465c00fac0SSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
15475c00fac0SSteven Toth 			.vmux   = 1,
15485c00fac0SSteven Toth 			.gpio0  = 0x000027df, /* Unconfirmed */
15495c00fac0SSteven Toth 			.audioroute = 1,
15505c00fac0SSteven Toth 		}, {
15515c00fac0SSteven Toth 			.type   = CX88_VMUX_SVIDEO,
15525c00fac0SSteven Toth 			.vmux   = 2,
15535c00fac0SSteven Toth 			.gpio0  = 0x000027df, /* Unconfirmed */
15545c00fac0SSteven Toth 			.audioroute = 1,
15555c00fac0SSteven Toth 		} },
15565c00fac0SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
15575c00fac0SSteven Toth 	},
15589507901eSMauro Carvalho Chehab 	[CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
15599507901eSMauro Carvalho Chehab 		.name           = "Pinnacle Hybrid PCTV",
15609507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
15619507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
1562b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
1563b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
15649507901eSMauro Carvalho Chehab 		.input          = { {
15659507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
15669507901eSMauro Carvalho Chehab 			.vmux   = 0,
15673f6014fcSStéphane Voltz 			.gpio0  = 0x004ff,
15683f6014fcSStéphane Voltz 			.gpio1  = 0x010ff,
15693f6014fcSStéphane Voltz 			.gpio2  = 0x00001,
15709507901eSMauro Carvalho Chehab 		}, {
15719507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
15729507901eSMauro Carvalho Chehab 			.vmux   = 1,
15733f6014fcSStéphane Voltz 			.gpio0  = 0x004fb,
15743f6014fcSStéphane Voltz 			.gpio1  = 0x010ef,
15753f6014fcSStéphane Voltz 			.audioroute = 1,
15769507901eSMauro Carvalho Chehab 		}, {
15779507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
15789507901eSMauro Carvalho Chehab 			.vmux   = 2,
15793f6014fcSStéphane Voltz 			.gpio0  = 0x004fb,
15803f6014fcSStéphane Voltz 			.gpio1  = 0x010ef,
15813f6014fcSStéphane Voltz 			.audioroute = 1,
15829507901eSMauro Carvalho Chehab 		} },
15839507901eSMauro Carvalho Chehab 		.radio = {
15849507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
15859507901eSMauro Carvalho Chehab 			.gpio0  = 0x004ff,
15869507901eSMauro Carvalho Chehab 			.gpio1  = 0x010ff,
15879507901eSMauro Carvalho Chehab 			.gpio2  = 0x0ff,
15889507901eSMauro Carvalho Chehab 		},
15893f6014fcSStéphane Voltz 		.mpeg           = CX88_MPEG_DVB,
15909507901eSMauro Carvalho Chehab 	},
159114422f9dSMauro Carvalho Chehab 	/* Terry Wu <terrywu2009@gmail.com> */
159214422f9dSMauro Carvalho Chehab 	/* TV Audio :      set GPIO 2, 18, 19 value to 0, 1, 0 */
159314422f9dSMauro Carvalho Chehab 	/* FM Audio :      set GPIO 2, 18, 19 value to 0, 0, 0 */
159414422f9dSMauro Carvalho Chehab 	/* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
159514422f9dSMauro Carvalho Chehab 	/* Mute Audio :    set GPIO 2 value to 1               */
15969507901eSMauro Carvalho Chehab 	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
159714422f9dSMauro Carvalho Chehab 		.name           = "Leadtek TV2000 XP Global",
15989507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
15999507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
1600b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
1601b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
16029507901eSMauro Carvalho Chehab 		.input          = { {
16039507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
16049507901eSMauro Carvalho Chehab 			.vmux   = 0,
160514422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,       /* pin 2 = 0 */
16069507901eSMauro Carvalho Chehab 			.gpio1  = 0x0000,
160714422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
160814422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16099507901eSMauro Carvalho Chehab 		}, {
16109507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
16119507901eSMauro Carvalho Chehab 			.vmux   = 1,
161214422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,       /* pin 2 = 0 */
16139507901eSMauro Carvalho Chehab 			.gpio1  = 0x0000,
161414422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
161514422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16169507901eSMauro Carvalho Chehab 		}, {
16179507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
16189507901eSMauro Carvalho Chehab 			.vmux   = 2,
161914422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,       /* pin 2 = 0 */
162014422f9dSMauro Carvalho Chehab 			.gpio1  = 0x0000,
162114422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
162214422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16239507901eSMauro Carvalho Chehab 		} },
16249507901eSMauro Carvalho Chehab 		.radio = {
16259507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
162614422f9dSMauro Carvalho Chehab 			.gpio0  = 0x0400,        /* pin 2 = 0 */
162714422f9dSMauro Carvalho Chehab 			.gpio1  = 0x0000,
162814422f9dSMauro Carvalho Chehab 			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
162914422f9dSMauro Carvalho Chehab 			.gpio3  = 0x0000,
16309507901eSMauro Carvalho Chehab 		},
16319507901eSMauro Carvalho Chehab 	},
163284463d5fSIstvan Varga 	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = {
163384463d5fSIstvan Varga 		.name           = "Leadtek TV2000 XP Global (SC4100)",
163484463d5fSIstvan Varga 		.tuner_type     = TUNER_XC4000,
163584463d5fSIstvan Varga 		.tuner_addr     = 0x61,
163684463d5fSIstvan Varga 		.radio_type     = UNSET,
163784463d5fSIstvan Varga 		.radio_addr     = ADDR_UNSET,
163884463d5fSIstvan Varga 		.input          = { {
163984463d5fSIstvan Varga 			.type   = CX88_VMUX_TELEVISION,
164084463d5fSIstvan Varga 			.vmux   = 0,
164184463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
164284463d5fSIstvan Varga 			.gpio1  = 0x0000,
164384463d5fSIstvan Varga 			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
164484463d5fSIstvan Varga 			.gpio3  = 0x0000,
164584463d5fSIstvan Varga 		}, {
164684463d5fSIstvan Varga 			.type   = CX88_VMUX_COMPOSITE1,
164784463d5fSIstvan Varga 			.vmux   = 1,
164884463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
164984463d5fSIstvan Varga 			.gpio1  = 0x0000,
165084463d5fSIstvan Varga 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
165184463d5fSIstvan Varga 			.gpio3  = 0x0000,
165284463d5fSIstvan Varga 		}, {
165384463d5fSIstvan Varga 			.type   = CX88_VMUX_SVIDEO,
165484463d5fSIstvan Varga 			.vmux   = 2,
165584463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
165684463d5fSIstvan Varga 			.gpio1  = 0x0000,
165784463d5fSIstvan Varga 			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
165884463d5fSIstvan Varga 			.gpio3  = 0x0000,
165984463d5fSIstvan Varga 		} },
166084463d5fSIstvan Varga 		.radio = {
166184463d5fSIstvan Varga 			.type   = CX88_RADIO,
166284463d5fSIstvan Varga 			.gpio0  = 0x0400,        /* pin 2 = 0 */
166384463d5fSIstvan Varga 			.gpio1  = 0x0000,
166484463d5fSIstvan Varga 			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
166584463d5fSIstvan Varga 			.gpio3  = 0x0000,
166684463d5fSIstvan Varga 		},
166784463d5fSIstvan Varga 	},
166884463d5fSIstvan Varga 	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = {
166984463d5fSIstvan Varga 		.name           = "Leadtek TV2000 XP Global (XC4100)",
167084463d5fSIstvan Varga 		.tuner_type     = TUNER_XC4000,
167184463d5fSIstvan Varga 		.tuner_addr     = 0x61,
167284463d5fSIstvan Varga 		.radio_type     = UNSET,
167384463d5fSIstvan Varga 		.radio_addr     = ADDR_UNSET,
167484463d5fSIstvan Varga 		.input          = { {
167584463d5fSIstvan Varga 			.type   = CX88_VMUX_TELEVISION,
167684463d5fSIstvan Varga 			.vmux   = 0,
167784463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
167884463d5fSIstvan Varga 			.gpio1  = 0x6040,       /* pin 14 = 1, pin 13 = 0 */
167984463d5fSIstvan Varga 			.gpio2  = 0x0000,
168084463d5fSIstvan Varga 			.gpio3  = 0x0000,
168184463d5fSIstvan Varga 		}, {
168284463d5fSIstvan Varga 			.type   = CX88_VMUX_COMPOSITE1,
168384463d5fSIstvan Varga 			.vmux   = 1,
168484463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
168584463d5fSIstvan Varga 			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
168684463d5fSIstvan Varga 			.gpio2  = 0x0000,
168784463d5fSIstvan Varga 			.gpio3  = 0x0000,
168884463d5fSIstvan Varga 		}, {
168984463d5fSIstvan Varga 			.type   = CX88_VMUX_SVIDEO,
169084463d5fSIstvan Varga 			.vmux   = 2,
169184463d5fSIstvan Varga 			.gpio0  = 0x0400,       /* pin 2 = 0 */
169284463d5fSIstvan Varga 			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
169384463d5fSIstvan Varga 			.gpio2  = 0x0000,
169484463d5fSIstvan Varga 			.gpio3  = 0x0000,
169584463d5fSIstvan Varga 		} },
169684463d5fSIstvan Varga 		.radio = {
169784463d5fSIstvan Varga 			.type   = CX88_RADIO,
169884463d5fSIstvan Varga 			.gpio0  = 0x0400,        /* pin 2 = 0 */
169984463d5fSIstvan Varga 			.gpio1  = 0x6000,        /* pin 14 = 1, pin 13 = 0 */
170084463d5fSIstvan Varga 			.gpio2  = 0x0000,
170184463d5fSIstvan Varga 			.gpio3  = 0x0000,
170284463d5fSIstvan Varga 		},
170384463d5fSIstvan Varga 	},
17049507901eSMauro Carvalho Chehab 	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
1705399426caSMauro Carvalho Chehab 		/* Long names may confuse LIRC. */
1706399426caSMauro Carvalho Chehab 		.name           = "PowerColor RA330",
17079507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
17089507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
17099507901eSMauro Carvalho Chehab 		.input          = { {
1710399426caSMauro Carvalho Chehab 			/*
1711399426caSMauro Carvalho Chehab 			 * Due to the way the cx88 driver is written,
1712399426caSMauro Carvalho Chehab 			 * there is no way to deactivate audio pass-
1713399426caSMauro Carvalho Chehab 			 * through without this entry. Furthermore, if
1714399426caSMauro Carvalho Chehab 			 * the TV mux entry is first, you get audio
1715399426caSMauro Carvalho Chehab 			 * from the tuner on boot for a little while.
1716399426caSMauro Carvalho Chehab 			 */
1717a9606ce6SDaniel Gimpelevich 			.type   = CX88_VMUX_DEBUG,
1718399426caSMauro Carvalho Chehab 			.vmux   = 3,
1719399426caSMauro Carvalho Chehab 			.gpio0 = 0x00ff,
1720399426caSMauro Carvalho Chehab 			.gpio1 = 0xf39d,
1721399426caSMauro Carvalho Chehab 			.gpio3 = 0x0000,
1722399426caSMauro Carvalho Chehab 		}, {
17239507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
17249507901eSMauro Carvalho Chehab 			.vmux   = 0,
1725ab364983SDâniel Fraga 			.gpio0 = 0x00ff,
1726b573ea0aSMauro Carvalho Chehab 			.gpio1 = 0xf35d,
1727ab364983SDâniel Fraga 			.gpio3 = 0x0000,
17289507901eSMauro Carvalho Chehab 		}, {
17299507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
17309507901eSMauro Carvalho Chehab 			.vmux   = 1,
1731ab364983SDâniel Fraga 			.gpio0 = 0x00ff,
1732ab364983SDâniel Fraga 			.gpio1 = 0xf37d,
1733ab364983SDâniel Fraga 			.gpio3 = 0x0000,
17349507901eSMauro Carvalho Chehab 		}, {
17359507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
17369507901eSMauro Carvalho Chehab 			.vmux   = 2,
17379507901eSMauro Carvalho Chehab 			.gpio0  = 0x000ff,
17389507901eSMauro Carvalho Chehab 			.gpio1  = 0x0f37d,
17399507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000,
17409507901eSMauro Carvalho Chehab 		} },
17419507901eSMauro Carvalho Chehab 		.radio = {
17429507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
17439507901eSMauro Carvalho Chehab 			.gpio0  = 0x000ff,
17449507901eSMauro Carvalho Chehab 			.gpio1  = 0x0f35d,
17459507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000,
17469507901eSMauro Carvalho Chehab 		},
17479507901eSMauro Carvalho Chehab 	},
17489507901eSMauro Carvalho Chehab 	[CX88_BOARD_GENIATECH_X8000_MT] = {
17499507901eSMauro Carvalho Chehab 		/* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
17509507901eSMauro Carvalho Chehab 		.name           = "Geniatech X8000-MT DVBT",
17519507901eSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
17529507901eSMauro Carvalho Chehab 		.tuner_addr     = 0x61,
17539507901eSMauro Carvalho Chehab 		.input          = { {
17549507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
17559507901eSMauro Carvalho Chehab 			.vmux   = 0,
17569507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17579507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e341,
17589507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17599507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17609507901eSMauro Carvalho Chehab 		}, {
17619507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
17629507901eSMauro Carvalho Chehab 			.vmux   = 1,
17639507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17649507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e361,
17659507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17669507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17679507901eSMauro Carvalho Chehab 		}, {
17689507901eSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
17699507901eSMauro Carvalho Chehab 			.vmux   = 2,
17709507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17719507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e361,
17729507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17739507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17749507901eSMauro Carvalho Chehab 		} },
17759507901eSMauro Carvalho Chehab 		.radio = {
17769507901eSMauro Carvalho Chehab 			.type   = CX88_RADIO,
17779507901eSMauro Carvalho Chehab 			.gpio0  = 0x00000000,
17789507901eSMauro Carvalho Chehab 			.gpio1  = 0x00e3e341,
17799507901eSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
17809507901eSMauro Carvalho Chehab 			.gpio3  = 0x00000000,
17819507901eSMauro Carvalho Chehab 		},
17829507901eSMauro Carvalho Chehab 		.mpeg           = CX88_MPEG_DVB,
1783b3fb91d2SChris Pascoe 	},
1784e6f45ea2SDaniel Gonzalez Cabanelas 	[CX88_BOARD_NOTONLYTV_LV3H] = {
1785e6f45ea2SDaniel Gonzalez Cabanelas 		.name           = "NotOnlyTV LV3H",
1786e6f45ea2SDaniel Gonzalez Cabanelas 		.tuner_type     = TUNER_XC2028,
1787e6f45ea2SDaniel Gonzalez Cabanelas 		.radio_type     = UNSET,
1788e6f45ea2SDaniel Gonzalez Cabanelas 		.tuner_addr     = 0x61,
1789e6f45ea2SDaniel Gonzalez Cabanelas 		.radio_addr     = ADDR_UNSET,
1790e6f45ea2SDaniel Gonzalez Cabanelas 		/* if gpio1:bit9 is enabled, DVB-T won't work */
1791e6f45ea2SDaniel Gonzalez Cabanelas 
1792e6f45ea2SDaniel Gonzalez Cabanelas 		.input          = { {
1793e6f45ea2SDaniel Gonzalez Cabanelas 			.type   = CX88_VMUX_TELEVISION,
1794e6f45ea2SDaniel Gonzalez Cabanelas 			.vmux   = 0,
1795e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio0  = 0x0000,
1796e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio1  = 0xa141,
1797e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio2  = 0x0000,
1798e6f45ea2SDaniel Gonzalez Cabanelas 		}, {
1799e6f45ea2SDaniel Gonzalez Cabanelas 			.type   = CX88_VMUX_COMPOSITE1,
1800e6f45ea2SDaniel Gonzalez Cabanelas 			.vmux   = 1,
1801e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio0  = 0x0000,
1802e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio1  = 0xa161,
1803e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio2  = 0x0000,
1804e6f45ea2SDaniel Gonzalez Cabanelas 		}, {
1805e6f45ea2SDaniel Gonzalez Cabanelas 			.type   = CX88_VMUX_SVIDEO,
1806e6f45ea2SDaniel Gonzalez Cabanelas 			.vmux   = 2,
1807e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio0  = 0x0000,
1808e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio1  = 0xa161,
1809e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio2  = 0x0000,
1810e6f45ea2SDaniel Gonzalez Cabanelas 		} },
1811e6f45ea2SDaniel Gonzalez Cabanelas 		.radio = {
1812e6f45ea2SDaniel Gonzalez Cabanelas 			.type   = CX88_RADIO,
1813e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio0  = 0x0000,
1814e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio1  = 0xa141,
1815e6f45ea2SDaniel Gonzalez Cabanelas 			.gpio2  = 0x0000,
1816e6f45ea2SDaniel Gonzalez Cabanelas 		},
1817e6f45ea2SDaniel Gonzalez Cabanelas 		.mpeg           = CX88_MPEG_DVB,
1818e6f45ea2SDaniel Gonzalez Cabanelas 	},
1819b3fb91d2SChris Pascoe 	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
1820b3fb91d2SChris Pascoe 		.name           = "DViCO FusionHDTV DVB-T PRO",
182119c309e3STim Farrington 		.tuner_type     = TUNER_XC2028,
182219c309e3STim Farrington 		.tuner_addr     = 0x61,
1823b3fb91d2SChris Pascoe 		.radio_type     = UNSET,
1824b3fb91d2SChris Pascoe 		.radio_addr     = ADDR_UNSET,
1825b3fb91d2SChris Pascoe 		.input          = { {
1826b3fb91d2SChris Pascoe 			.type   = CX88_VMUX_COMPOSITE1,
1827b3fb91d2SChris Pascoe 			.vmux   = 1,
1828b3fb91d2SChris Pascoe 			.gpio0  = 0x000067df,
1829b3fb91d2SChris Pascoe 		}, {
1830b3fb91d2SChris Pascoe 			.type   = CX88_VMUX_SVIDEO,
1831b3fb91d2SChris Pascoe 			.vmux   = 2,
1832b3fb91d2SChris Pascoe 			.gpio0  = 0x000067df,
1833b3fb91d2SChris Pascoe 		} },
1834b3fb91d2SChris Pascoe 		.mpeg           = CX88_MPEG_DVB,
1835b3fb91d2SChris Pascoe 	},
18361117d6baSSteven Toth 	[CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
183776464d41SMichael Krufky 		.name           = "DViCO FusionHDTV 7 Gold",
18381117d6baSSteven Toth 		.tuner_type     = TUNER_XC5000,
18391117d6baSSteven Toth 		.radio_type     = UNSET,
18401117d6baSSteven Toth 		.tuner_addr	= ADDR_UNSET,
18411117d6baSSteven Toth 		.radio_addr	= ADDR_UNSET,
18421117d6baSSteven Toth 		.input          = { {
18431117d6baSSteven Toth 			.type   = CX88_VMUX_TELEVISION,
18441117d6baSSteven Toth 			.vmux   = 0,
184576464d41SMichael Krufky 			.gpio0  = 0x10df,
18461117d6baSSteven Toth 		}, {
18471117d6baSSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
18481117d6baSSteven Toth 			.vmux   = 1,
184976464d41SMichael Krufky 			.gpio0  = 0x16d9,
18501117d6baSSteven Toth 		}, {
18511117d6baSSteven Toth 			.type   = CX88_VMUX_SVIDEO,
18521117d6baSSteven Toth 			.vmux   = 2,
185376464d41SMichael Krufky 			.gpio0  = 0x16d9,
18541117d6baSSteven Toth 		} },
1855d893d5dcSSteven Toth 		.mpeg           = CX88_MPEG_DVB,
18561117d6baSSteven Toth 	},
18572422a9b3SMauro Carvalho Chehab 	[CX88_BOARD_PROLINK_PV_8000GT] = {
18582422a9b3SMauro Carvalho Chehab 		.name           = "Prolink Pixelview MPEG 8000GT",
18592422a9b3SMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
18602422a9b3SMauro Carvalho Chehab 		.tuner_addr     = 0x61,
18612422a9b3SMauro Carvalho Chehab 		.input          = { {
18622422a9b3SMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
18632422a9b3SMauro Carvalho Chehab 			.vmux   = 0,
18642422a9b3SMauro Carvalho Chehab 			.gpio0 = 0x0ff,
18652422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18662422a9b3SMauro Carvalho Chehab 		}, {
18672422a9b3SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
18682422a9b3SMauro Carvalho Chehab 			.vmux   = 1,
18692422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18702422a9b3SMauro Carvalho Chehab 		}, {
18712422a9b3SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
18722422a9b3SMauro Carvalho Chehab 			.vmux   = 2,
18732422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18742422a9b3SMauro Carvalho Chehab 		} },
18752422a9b3SMauro Carvalho Chehab 		.radio = {
18762422a9b3SMauro Carvalho Chehab 			.type   = CX88_RADIO,
18772422a9b3SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
18782422a9b3SMauro Carvalho Chehab 		},
18792422a9b3SMauro Carvalho Chehab 	},
1880a31d2bb7SMauro Carvalho Chehab 	[CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
1881a31d2bb7SMauro Carvalho Chehab 		.name           = "Prolink Pixelview Global Extreme",
1882a31d2bb7SMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
1883a31d2bb7SMauro Carvalho Chehab 		.tuner_addr     = 0x61,
1884a31d2bb7SMauro Carvalho Chehab 		.input          = { {
1885a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
1886a31d2bb7SMauro Carvalho Chehab 			.vmux   = 0,
1887a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04fb,
1888a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1889a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cf7,
1890a31d2bb7SMauro Carvalho Chehab 		}, {
1891a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
1892a31d2bb7SMauro Carvalho Chehab 			.vmux   = 1,
1893a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04fb,
1894a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1895a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
1896a31d2bb7SMauro Carvalho Chehab 		}, {
1897a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
1898a31d2bb7SMauro Carvalho Chehab 			.vmux   = 2,
1899a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04fb,
1900a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1901a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cfb,
1902a31d2bb7SMauro Carvalho Chehab 		} },
1903a31d2bb7SMauro Carvalho Chehab 		.radio = {
1904a31d2bb7SMauro Carvalho Chehab 			.type   = CX88_RADIO,
1905a31d2bb7SMauro Carvalho Chehab 			.gpio0 = 0x04ff,
1906a31d2bb7SMauro Carvalho Chehab 			.gpio1 = 0x04080,
1907a31d2bb7SMauro Carvalho Chehab 			.gpio2 = 0x0cf7,
1908a31d2bb7SMauro Carvalho Chehab 		},
1909a31d2bb7SMauro Carvalho Chehab 	},
1910399426caSMauro Carvalho Chehab 	/*
1911399426caSMauro Carvalho Chehab 	 * Both radio, analog and ATSC work with this board.
1912399426caSMauro Carvalho Chehab 	 * However, for analog to work, s5h1409 gate should be open,
1913399426caSMauro Carvalho Chehab 	 * otherwise, tuner-xc3028 won't be detected.
1914399426caSMauro Carvalho Chehab 	 * A proper fix require using the newer i2c methods to add
1915399426caSMauro Carvalho Chehab 	 * tuner-xc3028 without doing an i2c probe.
191699e09eacSMauro Carvalho Chehab 	 */
191799e09eacSMauro Carvalho Chehab 	[CX88_BOARD_KWORLD_ATSC_120] = {
191899e09eacSMauro Carvalho Chehab 		.name           = "Kworld PlusTV HD PCI 120 (ATSC 120)",
191999e09eacSMauro Carvalho Chehab 		.tuner_type     = TUNER_XC2028,
192099e09eacSMauro Carvalho Chehab 		.radio_type     = UNSET,
192199e09eacSMauro Carvalho Chehab 		.tuner_addr	= ADDR_UNSET,
192299e09eacSMauro Carvalho Chehab 		.radio_addr	= ADDR_UNSET,
192399e09eacSMauro Carvalho Chehab 		.input          = { {
192499e09eacSMauro Carvalho Chehab 			.type   = CX88_VMUX_TELEVISION,
192599e09eacSMauro Carvalho Chehab 			.vmux   = 0,
192699e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
192799e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f35d,
192899e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
192999e09eacSMauro Carvalho Chehab 		}, {
193099e09eacSMauro Carvalho Chehab 			.type   = CX88_VMUX_COMPOSITE1,
193199e09eacSMauro Carvalho Chehab 			.vmux   = 1,
193299e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
193399e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f37e,
193499e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
193599e09eacSMauro Carvalho Chehab 		}, {
193699e09eacSMauro Carvalho Chehab 			.type   = CX88_VMUX_SVIDEO,
193799e09eacSMauro Carvalho Chehab 			.vmux   = 2,
193899e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
193999e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f37e,
194099e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
194199e09eacSMauro Carvalho Chehab 		} },
194299e09eacSMauro Carvalho Chehab 		.radio = {
194399e09eacSMauro Carvalho Chehab 			.type   = CX88_RADIO,
194499e09eacSMauro Carvalho Chehab 			.gpio0  = 0x000000ff,
194599e09eacSMauro Carvalho Chehab 			.gpio1  = 0x0000f35d,
194699e09eacSMauro Carvalho Chehab 			.gpio2  = 0x00000000,
194799e09eacSMauro Carvalho Chehab 		},
194899e09eacSMauro Carvalho Chehab 		.mpeg           = CX88_MPEG_DVB,
194999e09eacSMauro Carvalho Chehab 	},
19505bd1b663SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR4000] = {
19515bd1b663SSteven Toth 		.name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
19525bd1b663SSteven Toth 		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
19535bd1b663SSteven Toth 		.radio_type     = UNSET,
19545bd1b663SSteven Toth 		.tuner_addr     = ADDR_UNSET,
19555bd1b663SSteven Toth 		.radio_addr     = ADDR_UNSET,
19565bd1b663SSteven Toth 		.tda9887_conf   = TDA9887_PRESENT,
1957facd2366SHans Verkuil 		.audio_chip     = CX88_AUDIO_WM8775,
19585bd1b663SSteven Toth 		/*
19595bd1b663SSteven Toth 		 * GPIO0 (WINTV2000)
19605bd1b663SSteven Toth 		 *
19615bd1b663SSteven Toth 		 * Analogue     SAT     DVB-T
19625bd1b663SSteven Toth 		 * Antenna      0xc4bf  0xc4bb
19635bd1b663SSteven Toth 		 * Composite    0xc4bf  0xc4bb
19645bd1b663SSteven Toth 		 * S-Video      0xc4bf  0xc4bb
19655bd1b663SSteven Toth 		 * Composite1   0xc4ff  0xc4fb
19665bd1b663SSteven Toth 		 * S-Video1     0xc4ff  0xc4fb
19672491fbb7SSteven Toth 		 *
19682491fbb7SSteven Toth 		 * BIT  VALUE   FUNCTION GP{x}_IO
19692491fbb7SSteven Toth 		 * 0    1       I:?
19702491fbb7SSteven Toth 		 * 1    1       I:?
197163248f26SDarron Broad 		 * 2    1       O:MPEG PORT 0=DVB-T 1=DVB-S
19722491fbb7SSteven Toth 		 * 3    1       I:?
19732491fbb7SSteven Toth 		 * 4    1       I:?
19742491fbb7SSteven Toth 		 * 5    1       I:?
19752491fbb7SSteven Toth 		 * 6    0       O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
19762491fbb7SSteven Toth 		 * 7    1       O:DVB-T DEMOD RESET LOW
19772491fbb7SSteven Toth 		 *
19782491fbb7SSteven Toth 		 * BIT  VALUE   FUNCTION GP{x}_OE
19792491fbb7SSteven Toth 		 * 8    0       I
19802491fbb7SSteven Toth 		 * 9    0       I
19812491fbb7SSteven Toth 		 * a    1       O
19822491fbb7SSteven Toth 		 * b    0       I
19832491fbb7SSteven Toth 		 * c    0       I
19842491fbb7SSteven Toth 		 * d    0       I
19852491fbb7SSteven Toth 		 * e    1       O
19862491fbb7SSteven Toth 		 * f    1       O
1987649e13a9SDarron Broad 		 *
1988649e13a9SDarron Broad 		 * WM8775 ADC
1989649e13a9SDarron Broad 		 *
1990649e13a9SDarron Broad 		 * 1: TV Audio / FM Mono
1991649e13a9SDarron Broad 		 * 2: Line-In
1992649e13a9SDarron Broad 		 * 3: Line-In Expansion
1993649e13a9SDarron Broad 		 * 4: FM Stereo
19945bd1b663SSteven Toth 		 */
19955bd1b663SSteven Toth 		.input          = { {
19965bd1b663SSteven Toth 			.type   = CX88_VMUX_TELEVISION,
19975bd1b663SSteven Toth 			.vmux   = 0,
19985bd1b663SSteven Toth 			.gpio0  = 0xc4bf,
1999649e13a9SDarron Broad 			/* 1: TV Audio / FM Mono */
2000923ac7f7SDarron Broad 			.audioroute = 1,
20015bd1b663SSteven Toth 		}, {
20025bd1b663SSteven Toth 			.type   = CX88_VMUX_COMPOSITE1,
20035bd1b663SSteven Toth 			.vmux   = 1,
20045bd1b663SSteven Toth 			.gpio0  = 0xc4bf,
2005649e13a9SDarron Broad 			/* 2: Line-In */
2006923ac7f7SDarron Broad 			.audioroute = 2,
20075bd1b663SSteven Toth 		}, {
20085bd1b663SSteven Toth 			.type   = CX88_VMUX_SVIDEO,
20095bd1b663SSteven Toth 			.vmux   = 2,
20105bd1b663SSteven Toth 			.gpio0  = 0xc4bf,
2011649e13a9SDarron Broad 			/* 2: Line-In */
2012923ac7f7SDarron Broad 			.audioroute = 2,
20135bd1b663SSteven Toth 		} },
201463248f26SDarron Broad 		.radio = {
201563248f26SDarron Broad 			.type   = CX88_RADIO,
201663248f26SDarron Broad 			.gpio0	= 0xc4bf,
2017649e13a9SDarron Broad 			/* 4: FM Stereo */
2018649e13a9SDarron Broad 			.audioroute = 8,
201963248f26SDarron Broad 		},
20205bd1b663SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
2021363c35fcSSteven Toth 		.num_frontends	= 2,
20225bd1b663SSteven Toth 	},
20235bd1b663SSteven Toth 	[CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
20245bd1b663SSteven Toth 		.name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
20255bd1b663SSteven Toth 		.tuner_type     = UNSET,
20265bd1b663SSteven Toth 		.radio_type     = UNSET,
20275bd1b663SSteven Toth 		.tuner_addr     = ADDR_UNSET,
20285bd1b663SSteven Toth 		.radio_addr     = ADDR_UNSET,
20295bd1b663SSteven Toth 		.input          = { {
20305bd1b663SSteven Toth 			.type   = CX88_VMUX_DVB,
20315bd1b663SSteven Toth 			.vmux   = 0,
20325bd1b663SSteven Toth 		} },
20335bd1b663SSteven Toth 		.mpeg           = CX88_MPEG_DVB,
20345bd1b663SSteven Toth 	},
2035e4aab64cSIgor M. Liplianin 	[CX88_BOARD_TEVII_S420] = {
2036e4aab64cSIgor M. Liplianin 		.name           = "TeVii S420 DVB-S",
2037e4aab64cSIgor M. Liplianin 		.tuner_type     = UNSET,
2038e4aab64cSIgor M. Liplianin 		.radio_type     = UNSET,
2039e4aab64cSIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2040e4aab64cSIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2041e4aab64cSIgor M. Liplianin 		.input          = { {
2042e4aab64cSIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2043e4aab64cSIgor M. Liplianin 			.vmux   = 0,
2044e4aab64cSIgor M. Liplianin 		} },
2045e4aab64cSIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2046e4aab64cSIgor M. Liplianin 	},
2047af832623SIgor M. Liplianin 	[CX88_BOARD_TEVII_S460] = {
2048af832623SIgor M. Liplianin 		.name           = "TeVii S460 DVB-S/S2",
2049af832623SIgor M. Liplianin 		.tuner_type     = UNSET,
2050af832623SIgor M. Liplianin 		.radio_type     = UNSET,
2051af832623SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2052af832623SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2053af832623SIgor M. Liplianin 		.input          = { {
2054af832623SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2055af832623SIgor M. Liplianin 			.vmux   = 0,
2056af832623SIgor M. Liplianin 		} },
2057af832623SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2058af832623SIgor M. Liplianin 	},
20590cb73639SIgor M. Liplianin 	[CX88_BOARD_TEVII_S464] = {
20600cb73639SIgor M. Liplianin 		.name           = "TeVii S464 DVB-S/S2",
20610cb73639SIgor M. Liplianin 		.tuner_type     = UNSET,
20620cb73639SIgor M. Liplianin 		.radio_type     = UNSET,
20630cb73639SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
20640cb73639SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
20650cb73639SIgor M. Liplianin 		.input          = { {
20660cb73639SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
20670cb73639SIgor M. Liplianin 			.vmux   = 0,
20680cb73639SIgor M. Liplianin 		} },
20690cb73639SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
20700cb73639SIgor M. Liplianin 	},
20714cd7fb87SOleg Roitburd 	[CX88_BOARD_OMICOM_SS4_PCI] = {
20724cd7fb87SOleg Roitburd 		.name           = "Omicom SS4 DVB-S/S2 PCI",
20734cd7fb87SOleg Roitburd 		.tuner_type     = UNSET,
20744cd7fb87SOleg Roitburd 		.radio_type     = UNSET,
20754cd7fb87SOleg Roitburd 		.tuner_addr     = ADDR_UNSET,
20764cd7fb87SOleg Roitburd 		.radio_addr     = ADDR_UNSET,
20774cd7fb87SOleg Roitburd 		.input          = { {
20784cd7fb87SOleg Roitburd 			.type   = CX88_VMUX_DVB,
20794cd7fb87SOleg Roitburd 			.vmux   = 0,
20804cd7fb87SOleg Roitburd 		} },
20814cd7fb87SOleg Roitburd 		.mpeg           = CX88_MPEG_DVB,
20824cd7fb87SOleg Roitburd 	},
20834b29631dSIgor M. Liplianin 	[CX88_BOARD_TBS_8910] = {
20844b29631dSIgor M. Liplianin 		.name           = "TBS 8910 DVB-S",
20854b29631dSIgor M. Liplianin 		.tuner_type     = UNSET,
20864b29631dSIgor M. Liplianin 		.radio_type     = UNSET,
20874b29631dSIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
20884b29631dSIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
20894b29631dSIgor M. Liplianin 		.input          = { {
20904b29631dSIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
20914b29631dSIgor M. Liplianin 			.vmux   = 0,
20924b29631dSIgor M. Liplianin 		} },
20934b29631dSIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
20944b29631dSIgor M. Liplianin 	},
2095ee73042cSOleg Roitburd 	[CX88_BOARD_TBS_8920] = {
2096ee73042cSOleg Roitburd 		.name           = "TBS 8920 DVB-S/S2",
2097c39ba330SHans Verkuil 		.tuner_type     = UNSET,
2098ee73042cSOleg Roitburd 		.radio_type     = UNSET,
2099ee73042cSOleg Roitburd 		.tuner_addr     = ADDR_UNSET,
2100ee73042cSOleg Roitburd 		.radio_addr     = ADDR_UNSET,
2101ee73042cSOleg Roitburd 		.input          = { {
2102ee73042cSOleg Roitburd 			.type   = CX88_VMUX_DVB,
2103ad5f74c0SIgor M. Liplianin 			.vmux   = 0,
2104ad5f74c0SIgor M. Liplianin 			.gpio0  = 0x8080,
2105ee73042cSOleg Roitburd 		} },
2106ee73042cSOleg Roitburd 		.mpeg           = CX88_MPEG_DVB,
2107ee73042cSOleg Roitburd 	},
2108cd3cde12SIgor M. Liplianin 	[CX88_BOARD_PROF_6200] = {
2109cd3cde12SIgor M. Liplianin 		.name           = "Prof 6200 DVB-S",
2110cd3cde12SIgor M. Liplianin 		.tuner_type     = UNSET,
2111cd3cde12SIgor M. Liplianin 		.radio_type     = UNSET,
2112cd3cde12SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2113cd3cde12SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2114cd3cde12SIgor M. Liplianin 		.input          = { {
2115cd3cde12SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2116cd3cde12SIgor M. Liplianin 			.vmux   = 0,
2117cd3cde12SIgor M. Liplianin 		} },
2118cd3cde12SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2119cd3cde12SIgor M. Liplianin 	},
212057f51dbcSOleg Roitburd 	[CX88_BOARD_PROF_7300] = {
212157f51dbcSOleg Roitburd 		.name           = "PROF 7300 DVB-S/S2",
212257f51dbcSOleg Roitburd 		.tuner_type     = UNSET,
212357f51dbcSOleg Roitburd 		.radio_type     = UNSET,
212457f51dbcSOleg Roitburd 		.tuner_addr     = ADDR_UNSET,
212557f51dbcSOleg Roitburd 		.radio_addr     = ADDR_UNSET,
212657f51dbcSOleg Roitburd 		.input          = { {
212757f51dbcSOleg Roitburd 			.type   = CX88_VMUX_DVB,
212857f51dbcSOleg Roitburd 			.vmux   = 0,
212957f51dbcSOleg Roitburd 		} },
213057f51dbcSOleg Roitburd 		.mpeg           = CX88_MPEG_DVB,
213157f51dbcSOleg Roitburd 	},
21324b29631dSIgor M. Liplianin 	[CX88_BOARD_SATTRADE_ST4200] = {
21334b29631dSIgor M. Liplianin 		.name           = "SATTRADE ST4200 DVB-S/S2",
21344b29631dSIgor M. Liplianin 		.tuner_type     = UNSET,
21354b29631dSIgor M. Liplianin 		.radio_type     = UNSET,
21364b29631dSIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
21374b29631dSIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
21384b29631dSIgor M. Liplianin 		.input          = { {
21394b29631dSIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
21404b29631dSIgor M. Liplianin 			.vmux   = 0,
21414b29631dSIgor M. Liplianin 		} },
21424b29631dSIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
21434b29631dSIgor M. Liplianin 	},
214470101a27SStephan Wienczny 	[CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
214570101a27SStephan Wienczny 		.name           = "Terratec Cinergy HT PCI MKII",
214670101a27SStephan Wienczny 		.tuner_type     = TUNER_XC2028,
214770101a27SStephan Wienczny 		.tuner_addr     = 0x61,
2148b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
2149b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
215070101a27SStephan Wienczny 		.input          = { {
215170101a27SStephan Wienczny 			.type   = CX88_VMUX_TELEVISION,
215270101a27SStephan Wienczny 			.vmux   = 0,
215370101a27SStephan Wienczny 			.gpio0  = 0x004ff,
215470101a27SStephan Wienczny 			.gpio1  = 0x010ff,
215570101a27SStephan Wienczny 			.gpio2  = 0x00001,
215670101a27SStephan Wienczny 		}, {
215770101a27SStephan Wienczny 			.type   = CX88_VMUX_COMPOSITE1,
215870101a27SStephan Wienczny 			.vmux   = 1,
215970101a27SStephan Wienczny 			.gpio0  = 0x004fb,
216070101a27SStephan Wienczny 			.gpio1  = 0x010ef,
216170101a27SStephan Wienczny 			.audioroute = 1,
216270101a27SStephan Wienczny 		}, {
216370101a27SStephan Wienczny 			.type   = CX88_VMUX_SVIDEO,
216470101a27SStephan Wienczny 			.vmux   = 2,
216570101a27SStephan Wienczny 			.gpio0  = 0x004fb,
216670101a27SStephan Wienczny 			.gpio1  = 0x010ef,
216770101a27SStephan Wienczny 			.audioroute = 1,
216870101a27SStephan Wienczny 		} },
216970101a27SStephan Wienczny 		.radio = {
217070101a27SStephan Wienczny 			.type   = CX88_RADIO,
217170101a27SStephan Wienczny 			.gpio0  = 0x004ff,
217270101a27SStephan Wienczny 			.gpio1  = 0x010ff,
217370101a27SStephan Wienczny 			.gpio2  = 0x0ff,
217470101a27SStephan Wienczny 		},
217570101a27SStephan Wienczny 		.mpeg           = CX88_MPEG_DVB,
217670101a27SStephan Wienczny 	},
2177501d8cd4SSteven Toth 	[CX88_BOARD_HAUPPAUGE_IRONLY] = {
2178501d8cd4SSteven Toth 		.name           = "Hauppauge WinTV-IR Only",
2179501d8cd4SSteven Toth 		.tuner_type     = UNSET,
2180501d8cd4SSteven Toth 		.radio_type     = UNSET,
2181501d8cd4SSteven Toth 		.tuner_addr	= ADDR_UNSET,
2182501d8cd4SSteven Toth 		.radio_addr	= ADDR_UNSET,
2183501d8cd4SSteven Toth 	},
21843047a176SMiroslav Sustek 	[CX88_BOARD_WINFAST_DTV1800H] = {
21853047a176SMiroslav Sustek 		.name           = "Leadtek WinFast DTV1800 Hybrid",
21863047a176SMiroslav Sustek 		.tuner_type     = TUNER_XC2028,
2187b6854e3fSMiroslav Slugen 		.radio_type     = UNSET,
21883047a176SMiroslav Sustek 		.tuner_addr     = 0x61,
2189b6854e3fSMiroslav Slugen 		.radio_addr     = ADDR_UNSET,
21903047a176SMiroslav Sustek 		/*
21913047a176SMiroslav Sustek 		 * GPIO setting
21923047a176SMiroslav Sustek 		 *
21933047a176SMiroslav Sustek 		 *  2: mute (0=off,1=on)
21943047a176SMiroslav Sustek 		 * 12: tuner reset pin
21953047a176SMiroslav Sustek 		 * 13: audio source (0=tuner audio,1=line in)
21963047a176SMiroslav Sustek 		 * 14: FM (0=on,1=off ???)
21973047a176SMiroslav Sustek 		 */
21983047a176SMiroslav Sustek 		.input          = { {
21993047a176SMiroslav Sustek 			.type   = CX88_VMUX_TELEVISION,
22003047a176SMiroslav Sustek 			.vmux   = 0,
22013047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
22023047a176SMiroslav Sustek 			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
22033047a176SMiroslav Sustek 			.gpio2  = 0x0000,
22043047a176SMiroslav Sustek 		}, {
22053047a176SMiroslav Sustek 			.type   = CX88_VMUX_COMPOSITE1,
22063047a176SMiroslav Sustek 			.vmux   = 1,
22073047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
22083047a176SMiroslav Sustek 			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
22093047a176SMiroslav Sustek 			.gpio2  = 0x0000,
22103047a176SMiroslav Sustek 		}, {
22113047a176SMiroslav Sustek 			.type   = CX88_VMUX_SVIDEO,
22123047a176SMiroslav Sustek 			.vmux   = 2,
22133047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
22143047a176SMiroslav Sustek 			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
22153047a176SMiroslav Sustek 			.gpio2  = 0x0000,
22163047a176SMiroslav Sustek 		} },
22173047a176SMiroslav Sustek 		.radio = {
22183047a176SMiroslav Sustek 			.type   = CX88_RADIO,
22193047a176SMiroslav Sustek 			.gpio0  = 0x0400,       /* pin 2 = 0 */
22203047a176SMiroslav Sustek 			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
22213047a176SMiroslav Sustek 			.gpio2  = 0x0000,
22223047a176SMiroslav Sustek 		},
22233047a176SMiroslav Sustek 		.mpeg           = CX88_MPEG_DVB,
22243047a176SMiroslav Sustek 	},
22258eb79c0bSistvan_v@mailbox.hu 	[CX88_BOARD_WINFAST_DTV1800H_XC4000] = {
22268eb79c0bSistvan_v@mailbox.hu 		.name		= "Leadtek WinFast DTV1800 H (XC4000)",
22278eb79c0bSistvan_v@mailbox.hu 		.tuner_type	= TUNER_XC4000,
2228b6854e3fSMiroslav Slugen 		.radio_type	= UNSET,
22298eb79c0bSistvan_v@mailbox.hu 		.tuner_addr	= 0x61,
2230b6854e3fSMiroslav Slugen 		.radio_addr	= ADDR_UNSET,
22318eb79c0bSistvan_v@mailbox.hu 		/*
22328eb79c0bSistvan_v@mailbox.hu 		 * GPIO setting
22338eb79c0bSistvan_v@mailbox.hu 		 *
22348eb79c0bSistvan_v@mailbox.hu 		 *  2: mute (0=off,1=on)
22358eb79c0bSistvan_v@mailbox.hu 		 * 12: tuner reset pin
22368eb79c0bSistvan_v@mailbox.hu 		 * 13: audio source (0=tuner audio,1=line in)
22378eb79c0bSistvan_v@mailbox.hu 		 * 14: FM (0=on,1=off ???)
22388eb79c0bSistvan_v@mailbox.hu 		 */
22398eb79c0bSistvan_v@mailbox.hu 		.input		= { {
22408eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_VMUX_TELEVISION,
22418eb79c0bSistvan_v@mailbox.hu 			.vmux	= 0,
22428eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22438eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6040,	/* pin 13 = 0, pin 14 = 1 */
22448eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22458eb79c0bSistvan_v@mailbox.hu 		}, {
22468eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_VMUX_COMPOSITE1,
22478eb79c0bSistvan_v@mailbox.hu 			.vmux	= 1,
22488eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22498eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
22508eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22518eb79c0bSistvan_v@mailbox.hu 		}, {
22528eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_VMUX_SVIDEO,
22538eb79c0bSistvan_v@mailbox.hu 			.vmux	= 2,
22548eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22558eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
22568eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22578eb79c0bSistvan_v@mailbox.hu 		} },
22588eb79c0bSistvan_v@mailbox.hu 		.radio = {
22598eb79c0bSistvan_v@mailbox.hu 			.type	= CX88_RADIO,
22608eb79c0bSistvan_v@mailbox.hu 			.gpio0	= 0x0400,	/* pin 2 = 0 */
22618eb79c0bSistvan_v@mailbox.hu 			.gpio1	= 0x6000,	/* pin 13 = 0, pin 14 = 0 */
22628eb79c0bSistvan_v@mailbox.hu 			.gpio2	= 0x0000,
22638eb79c0bSistvan_v@mailbox.hu 		},
22648eb79c0bSistvan_v@mailbox.hu 		.mpeg		= CX88_MPEG_DVB,
22658eb79c0bSistvan_v@mailbox.hu 	},
2266f271a3afSistvan_v@mailbox.hu 	[CX88_BOARD_WINFAST_DTV2000H_PLUS] = {
2267f271a3afSistvan_v@mailbox.hu 		.name		= "Leadtek WinFast DTV2000 H PLUS",
2268f271a3afSistvan_v@mailbox.hu 		.tuner_type	= TUNER_XC4000,
2269b6854e3fSMiroslav Slugen 		.radio_type	= UNSET,
2270f271a3afSistvan_v@mailbox.hu 		.tuner_addr	= 0x61,
2271b6854e3fSMiroslav Slugen 		.radio_addr	= ADDR_UNSET,
2272f271a3afSistvan_v@mailbox.hu 		/*
2273f271a3afSistvan_v@mailbox.hu 		 * GPIO
2274f271a3afSistvan_v@mailbox.hu 		 *   2: 1: mute audio
2275f271a3afSistvan_v@mailbox.hu 		 *  12: 0: reset XC4000
2276f271a3afSistvan_v@mailbox.hu 		 *  13: 1: audio input is line in (0: tuner)
2277f271a3afSistvan_v@mailbox.hu 		 *  14: 0: FM radio
2278f271a3afSistvan_v@mailbox.hu 		 *  16: 0: RF input is cable
2279f271a3afSistvan_v@mailbox.hu 		 */
2280f271a3afSistvan_v@mailbox.hu 		.input		= { {
2281f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_TELEVISION,
2282f271a3afSistvan_v@mailbox.hu 			.vmux	= 0,
2283f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,
2284f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0D7,
2285f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0101,
2286f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2287f271a3afSistvan_v@mailbox.hu 		}, {
2288f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_CABLE,
2289f271a3afSistvan_v@mailbox.hu 			.vmux	= 0,
2290f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,
2291f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0D7,
2292f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0100,
2293f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2294f271a3afSistvan_v@mailbox.hu 		}, {
2295f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_COMPOSITE1,
2296f271a3afSistvan_v@mailbox.hu 			.vmux	= 1,
2297f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,	/* was 0x0407 */
2298f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0F7,
2299f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0101,
2300f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2301f271a3afSistvan_v@mailbox.hu 		}, {
2302f271a3afSistvan_v@mailbox.hu 			.type	= CX88_VMUX_SVIDEO,
2303f271a3afSistvan_v@mailbox.hu 			.vmux	= 2,
2304f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,	/* was 0x0407 */
2305f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF0F7,
2306f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0101,
2307f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2308f271a3afSistvan_v@mailbox.hu 		} },
2309f271a3afSistvan_v@mailbox.hu 		.radio = {
2310f271a3afSistvan_v@mailbox.hu 			.type	= CX88_RADIO,
2311f271a3afSistvan_v@mailbox.hu 			.gpio0	= 0x0403,
2312f271a3afSistvan_v@mailbox.hu 			.gpio1	= 0xF097,
2313f271a3afSistvan_v@mailbox.hu 			.gpio2	= 0x0100,
2314f271a3afSistvan_v@mailbox.hu 			.gpio3	= 0x0000,
2315f271a3afSistvan_v@mailbox.hu 		},
2316f271a3afSistvan_v@mailbox.hu 		.mpeg		= CX88_MPEG_DVB,
2317f271a3afSistvan_v@mailbox.hu 	},
2318b699c271SIgor M. Liplianin 	[CX88_BOARD_PROF_7301] = {
2319b699c271SIgor M. Liplianin 		.name           = "Prof 7301 DVB-S/S2",
2320b699c271SIgor M. Liplianin 		.tuner_type     = UNSET,
2321b699c271SIgor M. Liplianin 		.radio_type     = UNSET,
2322b699c271SIgor M. Liplianin 		.tuner_addr     = ADDR_UNSET,
2323b699c271SIgor M. Liplianin 		.radio_addr     = ADDR_UNSET,
2324b699c271SIgor M. Liplianin 		.input          = { {
2325b699c271SIgor M. Liplianin 			.type   = CX88_VMUX_DVB,
2326b699c271SIgor M. Liplianin 			.vmux   = 0,
2327b699c271SIgor M. Liplianin 		} },
2328b699c271SIgor M. Liplianin 		.mpeg           = CX88_MPEG_DVB,
2329b699c271SIgor M. Liplianin 	},
2330111ac84aSSergey Ivanov 	[CX88_BOARD_TWINHAN_VP1027_DVBS] = {
2331111ac84aSSergey Ivanov 		.name		= "Twinhan VP-1027 DVB-S",
2332c39ba330SHans Verkuil 		.tuner_type     = UNSET,
2333111ac84aSSergey Ivanov 		.radio_type     = UNSET,
2334111ac84aSSergey Ivanov 		.tuner_addr     = ADDR_UNSET,
2335111ac84aSSergey Ivanov 		.radio_addr     = ADDR_UNSET,
2336111ac84aSSergey Ivanov 		.input          = { {
2337111ac84aSSergey Ivanov 		       .type   = CX88_VMUX_DVB,
2338111ac84aSSergey Ivanov 		       .vmux   = 0,
2339111ac84aSSergey Ivanov 		} },
2340111ac84aSSergey Ivanov 		.mpeg           = CX88_MPEG_DVB,
2341111ac84aSSergey Ivanov 	},
23421da177e4SLinus Torvalds };
23431da177e4SLinus Torvalds 
23441da177e4SLinus Torvalds /* ------------------------------------------------------------------ */
23451da177e4SLinus Torvalds /* PCI subsystem IDs                                                  */
23461da177e4SLinus Torvalds 
2347bbc83597STrent Piepho static const struct cx88_subid cx88_subids[] = {
23481da177e4SLinus Torvalds 	{
23491da177e4SLinus Torvalds 		.subvendor = 0x0070,
23501da177e4SLinus Torvalds 		.subdevice = 0x3400,
23511da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE,
23521da177e4SLinus Torvalds 	}, {
23531da177e4SLinus Torvalds 		.subvendor = 0x0070,
23541da177e4SLinus Torvalds 		.subdevice = 0x3401,
23551da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE,
23561da177e4SLinus Torvalds 	}, {
23571da177e4SLinus Torvalds 		.subvendor = 0x14c7,
23581da177e4SLinus Torvalds 		.subdevice = 0x0106,
23591da177e4SLinus Torvalds 		.card      = CX88_BOARD_GDI,
23601da177e4SLinus Torvalds 	}, {
23611da177e4SLinus Torvalds 		.subvendor = 0x14c7,
23621da177e4SLinus Torvalds 		.subdevice = 0x0107, /* with mpeg encoder */
23631da177e4SLinus Torvalds 		.card      = CX88_BOARD_GDI,
23641da177e4SLinus Torvalds 	}, {
23651da177e4SLinus Torvalds 		.subvendor = PCI_VENDOR_ID_ATI,
23661da177e4SLinus Torvalds 		.subdevice = 0x00f8,
23671da177e4SLinus Torvalds 		.card      = CX88_BOARD_ATI_WONDER_PRO,
23681da177e4SLinus Torvalds 	}, {
2369bc13ae11SPatrice Levesque 		.subvendor = PCI_VENDOR_ID_ATI,
2370bc13ae11SPatrice Levesque 		.subdevice = 0x00f9,
2371bc13ae11SPatrice Levesque 		.card      = CX88_BOARD_ATI_WONDER_PRO,
2372bc13ae11SPatrice Levesque 	}, {
23731da177e4SLinus Torvalds 		.subvendor = 0x107d,
23741da177e4SLinus Torvalds 		.subdevice = 0x6611,
23751da177e4SLinus Torvalds 		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
23761da177e4SLinus Torvalds 	}, {
23771da177e4SLinus Torvalds 		.subvendor = 0x107d,
23781da177e4SLinus Torvalds 		.subdevice = 0x6613,	/* NTSC */
23791da177e4SLinus Torvalds 		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
23801da177e4SLinus Torvalds 	}, {
23811da177e4SLinus Torvalds 		.subvendor = 0x107d,
23821da177e4SLinus Torvalds 		.subdevice = 0x6620,
23831da177e4SLinus Torvalds 		.card      = CX88_BOARD_WINFAST_DV2000,
23841da177e4SLinus Torvalds 	}, {
23851da177e4SLinus Torvalds 		.subvendor = 0x107d,
23861da177e4SLinus Torvalds 		.subdevice = 0x663b,
23871da177e4SLinus Torvalds 		.card      = CX88_BOARD_LEADTEK_PVR2000,
23881da177e4SLinus Torvalds 	}, {
23891da177e4SLinus Torvalds 		.subvendor = 0x107d,
23908dd86eebSMichael Krufky 		.subdevice = 0x663c,
23911da177e4SLinus Torvalds 		.card      = CX88_BOARD_LEADTEK_PVR2000,
23921da177e4SLinus Torvalds 	}, {
23931da177e4SLinus Torvalds 		.subvendor = 0x1461,
23941da177e4SLinus Torvalds 		.subdevice = 0x000b,
23957418f346SLubomir Bulej 		.card      = CX88_BOARD_AVERTV_STUDIO_303,
23961da177e4SLinus Torvalds 	}, {
23971da177e4SLinus Torvalds 		.subvendor = 0x1462,
23981da177e4SLinus Torvalds 		.subdevice = 0x8606,
23991da177e4SLinus Torvalds 		.card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,
24001da177e4SLinus Torvalds 	}, {
24011da177e4SLinus Torvalds 		.subvendor = 0x10fc,
24021da177e4SLinus Torvalds 		.subdevice = 0xd003,
24031da177e4SLinus Torvalds 		.card      = CX88_BOARD_IODATA_GVVCP3PCI,
24041da177e4SLinus Torvalds 	}, {
24051da177e4SLinus Torvalds 		.subvendor = 0x1043,
24061da177e4SLinus Torvalds 		.subdevice = 0x4823,  /* with mpeg encoder */
24071da177e4SLinus Torvalds 		.card      = CX88_BOARD_ASUS_PVR_416,
24081da177e4SLinus Torvalds 	}, {
24091da177e4SLinus Torvalds 		.subvendor = 0x17de,
24101da177e4SLinus Torvalds 		.subdevice = 0x08a6,
24111da177e4SLinus Torvalds 		.card      = CX88_BOARD_KWORLD_DVB_T,
24121da177e4SLinus Torvalds 	}, {
24131da177e4SLinus Torvalds 		.subvendor = 0x18ac,
24141da177e4SLinus Torvalds 		.subdevice = 0xd810,
2415a82decf6SMauro Carvalho Chehab 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
24161da177e4SLinus Torvalds 	}, {
2417097b750eSMichael Krufky 		.subvendor = 0x18ac,
2418097b750eSMichael Krufky 		.subdevice = 0xd820,
241980d34362SMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
2420097b750eSMichael Krufky 	}, {
24217df64e8cSMichael Krufky 		.subvendor = 0x18ac,
24227df64e8cSMichael Krufky 		.subdevice = 0xdb00,
24231da177e4SLinus Torvalds 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
24241da177e4SLinus Torvalds 	}, {
24251da177e4SLinus Torvalds 		.subvendor = 0x0070,
24261da177e4SLinus Torvalds 		.subdevice = 0x9002,
24271da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
24281da177e4SLinus Torvalds 	}, {
24291da177e4SLinus Torvalds 		.subvendor = 0x14f1,
24301da177e4SLinus Torvalds 		.subdevice = 0x0187,
24311da177e4SLinus Torvalds 		.card      = CX88_BOARD_CONEXANT_DVB_T1,
24321da177e4SLinus Torvalds 	}, {
24331da177e4SLinus Torvalds 		.subvendor = 0x1540,
24341da177e4SLinus Torvalds 		.subdevice = 0x2580,
24351da177e4SLinus Torvalds 		.card      = CX88_BOARD_PROVIDEO_PV259,
24361da177e4SLinus Torvalds 	}, {
24377df64e8cSMichael Krufky 		.subvendor = 0x18ac,
24387df64e8cSMichael Krufky 		.subdevice = 0xdb10,
24391da177e4SLinus Torvalds 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
24401da177e4SLinus Torvalds 	}, {
24411da177e4SLinus Torvalds 		.subvendor = 0x1554,
24421da177e4SLinus Torvalds 		.subdevice = 0x4811,
24431da177e4SLinus Torvalds 		.card      = CX88_BOARD_PIXELVIEW,
24441da177e4SLinus Torvalds 	}, {
24451da177e4SLinus Torvalds 		.subvendor = 0x7063,
24461da177e4SLinus Torvalds 		.subdevice = 0x3000, /* HD-3000 card */
24471da177e4SLinus Torvalds 		.card      = CX88_BOARD_PCHDTV_HD3000,
24481da177e4SLinus Torvalds 	}, {
24497df64e8cSMichael Krufky 		.subvendor = 0x17de,
24507df64e8cSMichael Krufky 		.subdevice = 0xa8a6,
24511da177e4SLinus Torvalds 		.card      = CX88_BOARD_DNTV_LIVE_DVB_T,
24521da177e4SLinus Torvalds 	}, {
24531da177e4SLinus Torvalds 		.subvendor = 0x0070,
24541da177e4SLinus Torvalds 		.subdevice = 0x2801,
24551da177e4SLinus Torvalds 		.card      = CX88_BOARD_HAUPPAUGE_ROSLYN,
24561da177e4SLinus Torvalds 	}, {
24577df64e8cSMichael Krufky 		.subvendor = 0x14f1,
24581da177e4SLinus Torvalds 		.subdevice = 0x0342,
24591da177e4SLinus Torvalds 		.card      = CX88_BOARD_DIGITALLOGIC_MEC,
24601da177e4SLinus Torvalds 	}, {
24611da177e4SLinus Torvalds 		.subvendor = 0x10fc,
24621da177e4SLinus Torvalds 		.subdevice = 0xd035,
24631da177e4SLinus Torvalds 		.card      = CX88_BOARD_IODATA_GVBCTV7E,
2464a82decf6SMauro Carvalho Chehab 	}, {
2465a82decf6SMauro Carvalho Chehab 		.subvendor = 0x1421,
2466a82decf6SMauro Carvalho Chehab 		.subdevice = 0x0334,
2467a82decf6SMauro Carvalho Chehab 		.card      = CX88_BOARD_ADSTECH_DVB_T_PCI,
2468e057ee11SMichael Krufky 	}, {
2469e057ee11SMichael Krufky 		.subvendor = 0x153b,
2470e057ee11SMichael Krufky 		.subdevice = 0x1166,
2471e057ee11SMichael Krufky 		.card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
24729fef07caSMichael Krufky 	}, {
24739fef07caSMichael Krufky 		.subvendor = 0x18ac,
24749fef07caSMichael Krufky 		.subdevice = 0xd500,
24759fef07caSMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
2476d45170edSNickolay V. Shmyrev 	}, {
2477d45170edSNickolay V. Shmyrev 		.subvendor = 0x1461,
2478d45170edSNickolay V. Shmyrev 		.subdevice = 0x8011,
2479d45170edSNickolay V. Shmyrev 		.card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
2480e976f937SKirk Lapray 	}, {
2481e976f937SKirk Lapray 		.subvendor = PCI_VENDOR_ID_ATI,
2482e976f937SKirk Lapray 		.subdevice = 0xa101,
2483e976f937SKirk Lapray 		.card      = CX88_BOARD_ATI_HDTVWONDER,
24842b5200a7SDavid Shirley 	}, {
24852b5200a7SDavid Shirley 		.subvendor = 0x107d,
24862b5200a7SDavid Shirley 		.subdevice = 0x665f,
24872b5200a7SDavid Shirley 		.card      = CX88_BOARD_WINFAST_DTV1000,
24887418f346SLubomir Bulej 	}, {
24897418f346SLubomir Bulej 		.subvendor = 0x1461,
24907418f346SLubomir Bulej 		.subdevice = 0x000a,
24917418f346SLubomir Bulej 		.card      = CX88_BOARD_AVERTV_303,
24920fa14aa6SSteven Toth 	}, {
24930fa14aa6SSteven Toth 		.subvendor = 0x0070,
24940fa14aa6SSteven Toth 		.subdevice = 0x9200,
2495fb56cb65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
2496fb56cb65SSteven Toth 	}, {
2497fb56cb65SSteven Toth 		.subvendor = 0x0070,
2498fb56cb65SSteven Toth 		.subdevice = 0x9201,
24990fa14aa6SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
25000fa14aa6SSteven Toth 	}, {
25010fa14aa6SSteven Toth 		.subvendor = 0x0070,
25020fa14aa6SSteven Toth 		.subdevice = 0x9202,
2503fb56cb65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
25040e0351e3SVadim Catana 	}, {
25050e0351e3SVadim Catana 		.subvendor = 0x17de,
25060e0351e3SVadim Catana 		.subdevice = 0x08b2,
25070e0351e3SVadim Catana 		.card      = CX88_BOARD_KWORLD_DVBS_100,
2508611900c1SSteven Toth 	}, {
2509611900c1SSteven Toth 		.subvendor = 0x0070,
2510611900c1SSteven Toth 		.subdevice = 0x9400,
2511611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
2512611900c1SSteven Toth 	}, {
2513611900c1SSteven Toth 		.subvendor = 0x0070,
2514611900c1SSteven Toth 		.subdevice = 0x9402,
2515611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
2516611900c1SSteven Toth 	}, {
2517611900c1SSteven Toth 		.subvendor = 0x0070,
2518611900c1SSteven Toth 		.subdevice = 0x9800,
2519611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2520611900c1SSteven Toth 	}, {
2521611900c1SSteven Toth 		.subvendor = 0x0070,
2522611900c1SSteven Toth 		.subdevice = 0x9802,
2523611900c1SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
2524c432a072SSteven Toth 	}, {
2525c432a072SSteven Toth 		.subvendor = 0x0070,
2526c432a072SSteven Toth 		.subdevice = 0x9001,
2527c432a072SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
2528fc40b261SChris Pascoe 	}, {
2529fc40b261SChris Pascoe 		.subvendor = 0x1822,
2530fc40b261SChris Pascoe 		.subdevice = 0x0025,
2531fc40b261SChris Pascoe 		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
2532f39624fdSManenti Marco 	}, {
2533f39624fdSManenti Marco 		.subvendor = 0x17de,
2534f39624fdSManenti Marco 		.subdevice = 0x08a1,
2535f39624fdSManenti Marco 		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
253643eabb4eSChris Pascoe 	}, {
253743eabb4eSChris Pascoe 		.subvendor = 0x18ac,
253843eabb4eSChris Pascoe 		.subdevice = 0xdb50,
253943eabb4eSChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
25406bfb2e1fSMichael Krufky 	}, {
25416bfb2e1fSMichael Krufky 		.subvendor = 0x18ac,
2542f74a6b39SMichael Krufky 		.subdevice = 0xdb54,
2543f74a6b39SMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
2544f74a6b39SMichael Krufky 		/* Re-branded DViCO: DigitalNow DVB-T Dual */
2545f74a6b39SMichael Krufky 	}, {
2546f74a6b39SMichael Krufky 		.subvendor = 0x18ac,
25476bfb2e1fSMichael Krufky 		.subdevice = 0xdb11,
25486bfb2e1fSMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
25496bfb2e1fSMichael Krufky 		/* Re-branded DViCO: UltraView DVB-T Plus */
255044256de1SMichael Krufky 	}, {
2551b3fb91d2SChris Pascoe 		.subvendor = 0x18ac,
2552b3fb91d2SChris Pascoe 		.subdevice = 0xdb30,
2553b3fb91d2SChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
2554b3fb91d2SChris Pascoe 	}, {
255544256de1SMichael Krufky 		.subvendor = 0x17de,
255644256de1SMichael Krufky 		.subdevice = 0x0840,
255744256de1SMichael Krufky 		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
25582d90fa44SJelle Foks 	}, {
25592d90fa44SJelle Foks 		.subvendor = 0x1421,
25602d90fa44SJelle Foks 		.subdevice = 0x0305,
25612d90fa44SJelle Foks 		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
2562780dfef3SChris Pascoe 	}, {
2563780dfef3SChris Pascoe 		.subvendor = 0x18ac,
2564780dfef3SChris Pascoe 		.subdevice = 0xdb40,
2565780dfef3SChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2566780dfef3SChris Pascoe 	}, {
2567780dfef3SChris Pascoe 		.subvendor = 0x18ac,
2568780dfef3SChris Pascoe 		.subdevice = 0xdb44,
2569780dfef3SChris Pascoe 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
2570da215d22SRusty Scott 	}, {
2571da215d22SRusty Scott 		.subvendor = 0x7063,
2572da215d22SRusty Scott 		.subdevice = 0x5500,
2573da215d22SRusty Scott 		.card      = CX88_BOARD_PCHDTV_HD5500,
2574b3038304SValentin Zagura 	}, {
2575b3038304SValentin Zagura 		.subvendor = 0x17de,
2576b3038304SValentin Zagura 		.subdevice = 0x0841,
2577b3038304SValentin Zagura 		.card      = CX88_BOARD_KWORLD_MCE200_DELUXE,
2578fc066478SMichael Krufky 	}, {
2579fc066478SMichael Krufky 		.subvendor = 0x1822,
2580fc066478SMichael Krufky 		.subdevice = 0x0019,
2581fc066478SMichael Krufky 		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
2582a3124622SAngelo Marconi 	}, {
2583a3124622SAngelo Marconi 		.subvendor = 0x1554,
2584a3124622SAngelo Marconi 		.subdevice = 0x4813,
2585a3124622SAngelo Marconi 		.card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
2586680543c5SRicardo Cerqueira 	}, {
2587680543c5SRicardo Cerqueira 		.subvendor = 0x14f1,
2588680543c5SRicardo Cerqueira 		.subdevice = 0x0842,
2589be4f4519SRicardo Cerqueira 		.card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
25904bd6e9d9SMalcolm Valentine 	}, {
25914bd6e9d9SMalcolm Valentine 		.subvendor = 0x107d,
25924bd6e9d9SMalcolm Valentine 		.subdevice = 0x665e,
25934bd6e9d9SMalcolm Valentine 		.card      = CX88_BOARD_WINFAST_DTV2000H,
259465271bffSMichael Krufky 	}, {
25954d14c833SVlastimil Labsky 		.subvendor = 0x107d,
25964d14c833SVlastimil Labsky 		.subdevice = 0x6f2b,
25974d14c833SVlastimil Labsky 		.card      = CX88_BOARD_WINFAST_DTV2000H_J,
25984d14c833SVlastimil Labsky 	}, {
259965271bffSMichael Krufky 		.subvendor = 0x18ac,
260065271bffSMichael Krufky 		.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
260165271bffSMichael Krufky 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
2602c02a34f4SSaqeb Akhter 	}, {
2603c02a34f4SSaqeb Akhter 		.subvendor = 0x14f1,
2604c02a34f4SSaqeb Akhter 		.subdevice = 0x0084,
2605c02a34f4SSaqeb Akhter 		.card      = CX88_BOARD_GENIATECH_DVBS,
2606ad10c930SEric Thomas 	}, {
2607ad10c930SEric Thomas 		.subvendor = 0x0070,
2608ad10c930SEric Thomas 		.subdevice = 0x1404,
2609ad10c930SEric Thomas 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
26105dbaa2cbSMichael Krufky 	}, {
26114f3ca2f1SDirk Herrendoerfer 		.subvendor = 0x18ac,
26124f3ca2f1SDirk Herrendoerfer 		.subdevice = 0xdc00,
26134f3ca2f1SDirk Herrendoerfer 		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
26144f3ca2f1SDirk Herrendoerfer 	}, {
26154f3ca2f1SDirk Herrendoerfer 		.subvendor = 0x18ac,
26164f3ca2f1SDirk Herrendoerfer 		.subdevice = 0xdccd,
26174f3ca2f1SDirk Herrendoerfer 		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
26184f3ca2f1SDirk Herrendoerfer 	}, {
26195dbaa2cbSMichael Krufky 		.subvendor = 0x1461,
26205dbaa2cbSMichael Krufky 		.subdevice = 0xc111, /* AverMedia M150-D */
26215dbaa2cbSMichael Krufky 		/* This board is known to work with the ASUS PVR416 config */
26225dbaa2cbSMichael Krufky 		.card      = CX88_BOARD_ASUS_PVR_416,
26232acadefaSDavid Bussenschutt 	}, {
26242acadefaSDavid Bussenschutt 		.subvendor = 0xc180,
26252acadefaSDavid Bussenschutt 		.subdevice = 0xc980,
26262acadefaSDavid Bussenschutt 		.card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,
2627aa481a65SSteven Toth 	}, {
2628aa481a65SSteven Toth 		.subvendor = 0x0070,
2629aa481a65SSteven Toth 		.subdevice = 0x9600,
2630aa481a65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
2631aa481a65SSteven Toth 	}, {
2632aa481a65SSteven Toth 		.subvendor = 0x0070,
2633aa481a65SSteven Toth 		.subdevice = 0x9601,
2634aa481a65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
2635aa481a65SSteven Toth 	}, {
2636aa481a65SSteven Toth 		.subvendor = 0x0070,
2637aa481a65SSteven Toth 		.subdevice = 0x9602,
2638aa481a65SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
2639dab489dfSMichael Krufky 	}, {
2640dab489dfSMichael Krufky 		.subvendor = 0x107d,
2641dab489dfSMichael Krufky 		.subdevice = 0x6632,
2642dab489dfSMichael Krufky 		.card      = CX88_BOARD_LEADTEK_PVR2000,
26434508f598SMichael Krufky 	}, {
26444508f598SMichael Krufky 		.subvendor = 0x12ab,
26454508f598SMichael Krufky 		.subdevice = 0x2300, /* Club3D Zap TV2100 */
26464508f598SMichael Krufky 		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
26473979ecc7SSteven Toth 	}, {
26483979ecc7SSteven Toth 		.subvendor = 0x0070,
26493979ecc7SSteven Toth 		.subdevice = 0x9000,
26503979ecc7SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
265176dc82abSSteven Toth 	}, {
265276dc82abSSteven Toth 		.subvendor = 0x0070,
265376dc82abSSteven Toth 		.subdevice = 0x1400,
265476dc82abSSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
265576dc82abSSteven Toth 	}, {
265676dc82abSSteven Toth 		.subvendor = 0x0070,
265776dc82abSSteven Toth 		.subdevice = 0x1401,
265876dc82abSSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
265976dc82abSSteven Toth 	}, {
266076dc82abSSteven Toth 		.subvendor = 0x0070,
266176dc82abSSteven Toth 		.subdevice = 0x1402,
266276dc82abSSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
2663733aeaf4SMichael Krufky 	}, {
2664733aeaf4SMichael Krufky 		.subvendor = 0x1421,
2665733aeaf4SMichael Krufky 		.subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
2666733aeaf4SMichael Krufky 		.card      = CX88_BOARD_KWORLD_DVBS_100,
26677cb47a14SDaniel Gimpelevich 	}, {
26687cb47a14SDaniel Gimpelevich 		.subvendor = 0x1421,
26697cb47a14SDaniel Gimpelevich 		.subdevice = 0x0390,
26707cb47a14SDaniel Gimpelevich 		.card      = CX88_BOARD_ADSTECH_PTV_390,
267160464da8SSteven Toth 	}, {
267260464da8SSteven Toth 		.subvendor = 0x11bd,
267360464da8SSteven Toth 		.subdevice = 0x0051,
267460464da8SSteven Toth 		.card      = CX88_BOARD_PINNACLE_PCTV_HD_800i,
26755c00fac0SSteven Toth 	}, {
26765c00fac0SSteven Toth 		.subvendor = 0x18ac,
26775c00fac0SSteven Toth 		.subdevice = 0xd530,
26785c00fac0SSteven Toth 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,
26799507901eSMauro Carvalho Chehab 	}, {
26809507901eSMauro Carvalho Chehab 		.subvendor = 0x12ab,
26819507901eSMauro Carvalho Chehab 		.subdevice = 0x1788,
26829507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_PINNACLE_HYBRID_PCTV,
26839507901eSMauro Carvalho Chehab 	}, {
26849507901eSMauro Carvalho Chehab 		.subvendor = 0x14f1,
26859507901eSMauro Carvalho Chehab 		.subdevice = 0xea3d,
26869507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_POWERCOLOR_REAL_ANGEL,
26879507901eSMauro Carvalho Chehab 	}, {
26889507901eSMauro Carvalho Chehab 		.subvendor = 0x107d,
26899507901eSMauro Carvalho Chehab 		.subdevice = 0x6f18,
26909507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
26919507901eSMauro Carvalho Chehab 	}, {
2692e6f45ea2SDaniel Gonzalez Cabanelas 		/* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */
26939507901eSMauro Carvalho Chehab 		.subvendor = 0x14f1,
26949507901eSMauro Carvalho Chehab 		.subdevice = 0x8852,
26959507901eSMauro Carvalho Chehab 		.card      = CX88_BOARD_GENIATECH_X8000_MT,
26961117d6baSSteven Toth 	}, {
26971117d6baSSteven Toth 		.subvendor = 0x18ac,
26981117d6baSSteven Toth 		.subdevice = 0xd610,
26991117d6baSSteven Toth 		.card      = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,
27002422a9b3SMauro Carvalho Chehab 	}, {
27012422a9b3SMauro Carvalho Chehab 		.subvendor = 0x1554,
27022422a9b3SMauro Carvalho Chehab 		.subdevice = 0x4935,
27032422a9b3SMauro Carvalho Chehab 		.card      = CX88_BOARD_PROLINK_PV_8000GT,
270499e09eacSMauro Carvalho Chehab 	}, {
2705a31d2bb7SMauro Carvalho Chehab 		.subvendor = 0x1554,
2706a31d2bb7SMauro Carvalho Chehab 		.subdevice = 0x4976,
2707a31d2bb7SMauro Carvalho Chehab 		.card      = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,
2708a31d2bb7SMauro Carvalho Chehab 	}, {
270999e09eacSMauro Carvalho Chehab 		.subvendor = 0x17de,
271099e09eacSMauro Carvalho Chehab 		.subdevice = 0x08c1,
271199e09eacSMauro Carvalho Chehab 		.card      = CX88_BOARD_KWORLD_ATSC_120,
27125bd1b663SSteven Toth 	}, {
27135bd1b663SSteven Toth 		.subvendor = 0x0070,
27145bd1b663SSteven Toth 		.subdevice = 0x6900,
27155bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
27165bd1b663SSteven Toth 	}, {
27175bd1b663SSteven Toth 		.subvendor = 0x0070,
27185bd1b663SSteven Toth 		.subdevice = 0x6904,
27195bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
27205bd1b663SSteven Toth 	}, {
27215bd1b663SSteven Toth 		.subvendor = 0x0070,
27225bd1b663SSteven Toth 		.subdevice = 0x6902,
27235bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
27245bd1b663SSteven Toth 	}, {
27255bd1b663SSteven Toth 		.subvendor = 0x0070,
27265bd1b663SSteven Toth 		.subdevice = 0x6905,
27275bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
27285bd1b663SSteven Toth 	}, {
27295bd1b663SSteven Toth 		.subvendor = 0x0070,
27305bd1b663SSteven Toth 		.subdevice = 0x6906,
27315bd1b663SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
2732af832623SIgor M. Liplianin 	}, {
2733e4aab64cSIgor M. Liplianin 		.subvendor = 0xd420,
2734e4aab64cSIgor M. Liplianin 		.subdevice = 0x9022,
2735e4aab64cSIgor M. Liplianin 		.card      = CX88_BOARD_TEVII_S420,
2736e4aab64cSIgor M. Liplianin 	}, {
2737e4aab64cSIgor M. Liplianin 		.subvendor = 0xd460,
2738af832623SIgor M. Liplianin 		.subdevice = 0x9022,
2739af832623SIgor M. Liplianin 		.card      = CX88_BOARD_TEVII_S460,
27404cd7fb87SOleg Roitburd 	}, {
27410cb73639SIgor M. Liplianin 		.subvendor = 0xd464,
27420cb73639SIgor M. Liplianin 		.subdevice = 0x9022,
27430cb73639SIgor M. Liplianin 		.card      = CX88_BOARD_TEVII_S464,
27440cb73639SIgor M. Liplianin 	}, {
27454cd7fb87SOleg Roitburd 		.subvendor = 0xA044,
27464cd7fb87SOleg Roitburd 		.subdevice = 0x2011,
27474cd7fb87SOleg Roitburd 		.card      = CX88_BOARD_OMICOM_SS4_PCI,
2748ee73042cSOleg Roitburd 	}, {
27494b29631dSIgor M. Liplianin 		.subvendor = 0x8910,
27504b29631dSIgor M. Liplianin 		.subdevice = 0x8888,
27514b29631dSIgor M. Liplianin 		.card      = CX88_BOARD_TBS_8910,
27524b29631dSIgor M. Liplianin 	}, {
2753ee73042cSOleg Roitburd 		.subvendor = 0x8920,
2754ee73042cSOleg Roitburd 		.subdevice = 0x8888,
2755ee73042cSOleg Roitburd 		.card      = CX88_BOARD_TBS_8920,
275657f51dbcSOleg Roitburd 	}, {
2757cd3cde12SIgor M. Liplianin 		.subvendor = 0xb022,
2758cd3cde12SIgor M. Liplianin 		.subdevice = 0x3022,
2759cd3cde12SIgor M. Liplianin 		.card      = CX88_BOARD_PROF_6200,
2760cd3cde12SIgor M. Liplianin 	}, {
276157f51dbcSOleg Roitburd 		.subvendor = 0xB033,
276257f51dbcSOleg Roitburd 		.subdevice = 0x3033,
276357f51dbcSOleg Roitburd 		.card      = CX88_BOARD_PROF_7300,
27644b29631dSIgor M. Liplianin 	}, {
27654b29631dSIgor M. Liplianin 		.subvendor = 0xb200,
27664b29631dSIgor M. Liplianin 		.subdevice = 0x4200,
27674b29631dSIgor M. Liplianin 		.card      = CX88_BOARD_SATTRADE_ST4200,
276870101a27SStephan Wienczny 	}, {
276970101a27SStephan Wienczny 		.subvendor = 0x153b,
277070101a27SStephan Wienczny 		.subdevice = 0x1177,
277170101a27SStephan Wienczny 		.card      = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,
2772501d8cd4SSteven Toth 	}, {
2773501d8cd4SSteven Toth 		.subvendor = 0x0070,
2774501d8cd4SSteven Toth 		.subdevice = 0x9290,
2775501d8cd4SSteven Toth 		.card      = CX88_BOARD_HAUPPAUGE_IRONLY,
27763047a176SMiroslav Sustek 	}, {
27773047a176SMiroslav Sustek 		.subvendor = 0x107d,
27783047a176SMiroslav Sustek 		.subdevice = 0x6654,
27793047a176SMiroslav Sustek 		.card      = CX88_BOARD_WINFAST_DTV1800H,
278014422f9dSMauro Carvalho Chehab 	}, {
27818eb79c0bSistvan_v@mailbox.hu 		/* WinFast DTV1800 H with XC4000 tuner */
27828eb79c0bSistvan_v@mailbox.hu 		.subvendor = 0x107d,
27838eb79c0bSistvan_v@mailbox.hu 		.subdevice = 0x6f38,
27848eb79c0bSistvan_v@mailbox.hu 		.card      = CX88_BOARD_WINFAST_DTV1800H_XC4000,
27858eb79c0bSistvan_v@mailbox.hu 	}, {
2786f271a3afSistvan_v@mailbox.hu 		.subvendor = 0x107d,
2787f271a3afSistvan_v@mailbox.hu 		.subdevice = 0x6f42,
2788f271a3afSistvan_v@mailbox.hu 		.card      = CX88_BOARD_WINFAST_DTV2000H_PLUS,
2789f271a3afSistvan_v@mailbox.hu 	}, {
279014422f9dSMauro Carvalho Chehab 		/* PVR2000 PAL Model [107d:6630] */
279114422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
279214422f9dSMauro Carvalho Chehab 		.subdevice = 0x6630,
279314422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
279414422f9dSMauro Carvalho Chehab 	}, {
279514422f9dSMauro Carvalho Chehab 		/* PVR2000 PAL Model [107d:6638] */
279614422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
279714422f9dSMauro Carvalho Chehab 		.subdevice = 0x6638,
279814422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
279914422f9dSMauro Carvalho Chehab 	}, {
280014422f9dSMauro Carvalho Chehab 		/* PVR2000 NTSC Model [107d:6631] */
280114422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
280214422f9dSMauro Carvalho Chehab 		.subdevice = 0x6631,
280314422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
280414422f9dSMauro Carvalho Chehab 	}, {
280514422f9dSMauro Carvalho Chehab 		/* PVR2000 NTSC Model [107d:6637] */
280614422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
280714422f9dSMauro Carvalho Chehab 		.subdevice = 0x6637,
280814422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
280914422f9dSMauro Carvalho Chehab 	}, {
281014422f9dSMauro Carvalho Chehab 		/* PVR2000 NTSC Model [107d:663d] */
281114422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
281214422f9dSMauro Carvalho Chehab 		.subdevice = 0x663d,
281314422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_LEADTEK_PVR2000,
281414422f9dSMauro Carvalho Chehab 	}, {
281514422f9dSMauro Carvalho Chehab 		/* DV2000 NTSC Model [107d:6621] */
281614422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
281714422f9dSMauro Carvalho Chehab 		.subdevice = 0x6621,
281814422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_WINFAST_DV2000,
281914422f9dSMauro Carvalho Chehab 	}, {
282014422f9dSMauro Carvalho Chehab 		/* TV2000 XP Global [107d:6618]  */
282114422f9dSMauro Carvalho Chehab 		.subvendor = 0x107d,
282214422f9dSMauro Carvalho Chehab 		.subdevice = 0x6618,
282314422f9dSMauro Carvalho Chehab 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
2824b699c271SIgor M. Liplianin 	}, {
282584463d5fSIstvan Varga 		/* TV2000 XP Global [107d:6618] */
282684463d5fSIstvan Varga 		.subvendor = 0x107d,
282784463d5fSIstvan Varga 		.subdevice = 0x6619,
282884463d5fSIstvan Varga 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
282984463d5fSIstvan Varga 	}, {
283084463d5fSIstvan Varga 		/* WinFast TV2000 XP Global with XC4000 tuner */
283184463d5fSIstvan Varga 		.subvendor = 0x107d,
283284463d5fSIstvan Varga 		.subdevice = 0x6f36,
283384463d5fSIstvan Varga 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36,
283484463d5fSIstvan Varga 	}, {
283584463d5fSIstvan Varga 		/* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */
283684463d5fSIstvan Varga 		.subvendor = 0x107d,
283784463d5fSIstvan Varga 		.subdevice = 0x6f43,
283884463d5fSIstvan Varga 		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43,
283984463d5fSIstvan Varga 	}, {
2840b699c271SIgor M. Liplianin 		.subvendor = 0xb034,
2841b699c271SIgor M. Liplianin 		.subdevice = 0x3034,
2842b699c271SIgor M. Liplianin 		.card      = CX88_BOARD_PROF_7301,
2843111ac84aSSergey Ivanov 	}, {
2844111ac84aSSergey Ivanov 		.subvendor = 0x1822,
2845111ac84aSSergey Ivanov 		.subdevice = 0x0023,
2846111ac84aSSergey Ivanov 		.card      = CX88_BOARD_TWINHAN_VP1027_DVBS,
28472422a9b3SMauro Carvalho Chehab 	},
28481da177e4SLinus Torvalds };
28491da177e4SLinus Torvalds 
2850399426caSMauro Carvalho Chehab /*
2851399426caSMauro Carvalho Chehab  * some leadtek specific stuff
2852399426caSMauro Carvalho Chehab  */
leadtek_eeprom(struct cx88_core * core,u8 * eeprom_data)285369f7e75aSJean Delvare static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
28541da177e4SLinus Torvalds {
28551da177e4SLinus Torvalds 	if (eeprom_data[4] != 0x7d ||
28561da177e4SLinus Torvalds 	    eeprom_data[5] != 0x10 ||
28571da177e4SLinus Torvalds 	    eeprom_data[7] != 0x66) {
285865bc2fe8SMauro Carvalho Chehab 		pr_warn("Leadtek eeprom invalid.\n");
28591da177e4SLinus Torvalds 		return;
28601da177e4SLinus Torvalds 	}
28611da177e4SLinus Torvalds 
286214422f9dSMauro Carvalho Chehab 	/* Terry Wu <terrywu2009@gmail.com> */
286314422f9dSMauro Carvalho Chehab 	switch (eeprom_data[6]) {
286414422f9dSMauro Carvalho Chehab 	case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
286514422f9dSMauro Carvalho Chehab 	case 0x21: /* SSID 6621 for DV2000 NTSC Model */
286614422f9dSMauro Carvalho Chehab 	case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
286714422f9dSMauro Carvalho Chehab 	case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
286814422f9dSMauro Carvalho Chehab 	case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
286914422f9dSMauro Carvalho Chehab 		core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
287014422f9dSMauro Carvalho Chehab 		break;
287114422f9dSMauro Carvalho Chehab 	default:
287214422f9dSMauro Carvalho Chehab 		core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
287314422f9dSMauro Carvalho Chehab 		break;
287414422f9dSMauro Carvalho Chehab 	}
28751da177e4SLinus Torvalds 
287665bc2fe8SMauro Carvalho Chehab 	pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n",
28770f19e65bSMauro Carvalho Chehab 		core->board.tuner_type, eeprom_data[0]);
28781da177e4SLinus Torvalds }
28791da177e4SLinus Torvalds 
hauppauge_eeprom(struct cx88_core * core,u8 * eeprom_data)28801da177e4SLinus Torvalds static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
28811da177e4SLinus Torvalds {
28821da177e4SLinus Torvalds 	struct tveeprom tv;
28831da177e4SLinus Torvalds 
2884446aba66SMauro Carvalho Chehab 	tveeprom_hauppauge_analog(&tv, eeprom_data);
28856a59d64cSTrent Piepho 	core->board.tuner_type = tv.tuner_type;
28860345c387SSteven Toth 	core->tuner_formats = tv.tuner_formats;
28876a59d64cSTrent Piepho 	core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;
288848a8a03bSMauro Carvalho Chehab 	core->model = tv.model;
28891da177e4SLinus Torvalds 
28901da177e4SLinus Torvalds 	/* Make sure we support the board model */
2891399426caSMauro Carvalho Chehab 	switch (tv.model) {
289276dc82abSSteven Toth 	case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
289376dc82abSSteven Toth 	case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
289476dc82abSSteven Toth 	case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
289576dc82abSSteven Toth 	case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
289676dc82abSSteven Toth 	case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
289776dc82abSSteven Toth 	case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
2898ad10c930SEric Thomas 	case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
289976dc82abSSteven Toth 	case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
290076dc82abSSteven Toth 	case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
29010345c387SSteven Toth 	case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
290242d2b6efSIan Pickworth 	case 34519: /* WinTV-PCI-FM */
29035bd1b663SSteven Toth 	case 69009:
29045bd1b663SSteven Toth 		/* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
29055bd1b663SSteven Toth 	case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
29065bd1b663SSteven Toth 	case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
29075bd1b663SSteven Toth 	case 69559:
29085bd1b663SSteven Toth 		/* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
29095bd1b663SSteven Toth 	case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
2910759324c3SSteven Toth 	case 90002: /* Nova-T-PCI (9002) */
29110fe22865SSteven Toth 	case 92001: /* Nova-S-Plus (Video and IR) */
29120fe22865SSteven Toth 	case 92002: /* Nova-S-Plus (Video and IR) */
29130fe22865SSteven Toth 	case 90003: /* Nova-T-PCI (9002 No RF out) */
2914759324c3SSteven Toth 	case 90500: /* Nova-T-PCI (oem) */
2915759324c3SSteven Toth 	case 90501: /* Nova-T-PCI (oem/IR) */
29163ca0ea98SSteven Toth 	case 92000: /* Nova-SE2 (OEM, No Video or IR) */
2917501d8cd4SSteven Toth 	case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */
2918611900c1SSteven Toth 	case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
2919611900c1SSteven Toth 	case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
2920aa481a65SSteven Toth 	case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
2921aa481a65SSteven Toth 	case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
2922aa481a65SSteven Toth 	case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
2923aa481a65SSteven Toth 	case 96569: /* WinTV-HVR1300 () */
2924aa481a65SSteven Toth 	case 96659: /* WinTV-HVR1300 () */
2925611900c1SSteven Toth 	case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
29261da177e4SLinus Torvalds 		/* known */
29271da177e4SLinus Torvalds 		break;
29284f3ca2f1SDirk Herrendoerfer 	case CX88_BOARD_SAMSUNG_SMT_7020:
29294f3ca2f1SDirk Herrendoerfer 		cx_set(MO_GP0_IO, 0x008989FF);
29304f3ca2f1SDirk Herrendoerfer 		break;
29311da177e4SLinus Torvalds 	default:
293265bc2fe8SMauro Carvalho Chehab 		pr_warn("warning: unknown hauppauge model #%d\n", tv.model);
29331da177e4SLinus Torvalds 		break;
29341da177e4SLinus Torvalds 	}
29351da177e4SLinus Torvalds 
293665bc2fe8SMauro Carvalho Chehab 	pr_info("hauppauge eeprom: model=%d\n", tv.model);
29371da177e4SLinus Torvalds }
29381da177e4SLinus Torvalds 
2939399426caSMauro Carvalho Chehab /*
2940399426caSMauro Carvalho Chehab  * some GDI (was: Modular Technology) specific stuff
2941399426caSMauro Carvalho Chehab  */
29421da177e4SLinus Torvalds 
29432e4e98e7Slawrence rust static const struct {
29441da177e4SLinus Torvalds 	int  id;
29451da177e4SLinus Torvalds 	int  fm;
29462e4e98e7Slawrence rust 	const char *name;
29471da177e4SLinus Torvalds } gdi_tuner[] = {
2948c39ba330SHans Verkuil 	[0x01] = { .id   = UNSET,
29491da177e4SLinus Torvalds 		   .name = "NTSC_M" },
2950c39ba330SHans Verkuil 	[0x02] = { .id   = UNSET,
29511da177e4SLinus Torvalds 		   .name = "PAL_B" },
2952c39ba330SHans Verkuil 	[0x03] = { .id   = UNSET,
29531da177e4SLinus Torvalds 		   .name = "PAL_I" },
2954c39ba330SHans Verkuil 	[0x04] = { .id   = UNSET,
29551da177e4SLinus Torvalds 		   .name = "PAL_D" },
2956c39ba330SHans Verkuil 	[0x05] = { .id   = UNSET,
29571da177e4SLinus Torvalds 		   .name = "SECAM" },
29581da177e4SLinus Torvalds 
2959c39ba330SHans Verkuil 	[0x10] = { .id   = UNSET,
29601da177e4SLinus Torvalds 		   .fm   = 1,
29611da177e4SLinus Torvalds 		   .name = "TEMIC_4049" },
29621da177e4SLinus Torvalds 	[0x11] = { .id   = TUNER_TEMIC_4136FY5,
29631da177e4SLinus Torvalds 		   .name = "TEMIC_4136" },
2964c39ba330SHans Verkuil 	[0x12] = { .id   = UNSET,
29651da177e4SLinus Torvalds 		   .name = "TEMIC_4146" },
29661da177e4SLinus Torvalds 
29671da177e4SLinus Torvalds 	[0x20] = { .id   = TUNER_PHILIPS_FQ1216ME,
29681da177e4SLinus Torvalds 		   .fm   = 1,
29691da177e4SLinus Torvalds 		   .name = "PHILIPS_FQ1216_MK3" },
2970c39ba330SHans Verkuil 	[0x21] = { .id   = UNSET, .fm = 1,
29711da177e4SLinus Torvalds 		   .name = "PHILIPS_FQ1236_MK3" },
2972c39ba330SHans Verkuil 	[0x22] = { .id   = UNSET,
29731da177e4SLinus Torvalds 		   .name = "PHILIPS_FI1236_MK3" },
2974c39ba330SHans Verkuil 	[0x23] = { .id   = UNSET,
29751da177e4SLinus Torvalds 		   .name = "PHILIPS_FI1216_MK3" },
29761da177e4SLinus Torvalds };
29771da177e4SLinus Torvalds 
gdi_eeprom(struct cx88_core * core,u8 * eeprom_data)29781da177e4SLinus Torvalds static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
29791da177e4SLinus Torvalds {
29802e4e98e7Slawrence rust 	const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
29811da177e4SLinus Torvalds 		? gdi_tuner[eeprom_data[0x0d]].name : NULL;
29821da177e4SLinus Torvalds 
298365bc2fe8SMauro Carvalho Chehab 	pr_info("GDI: tuner=%s\n", name ? name : "unknown");
2984399426caSMauro Carvalho Chehab 	if (!name)
29851da177e4SLinus Torvalds 		return;
29866a59d64cSTrent Piepho 	core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
29876a59d64cSTrent Piepho 	core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?
29886a59d64cSTrent Piepho 		CX88_RADIO : 0;
29891da177e4SLinus Torvalds }
29901da177e4SLinus Torvalds 
2991399426caSMauro Carvalho Chehab /*
2992399426caSMauro Carvalho Chehab  * some Divco specific stuff
2993399426caSMauro Carvalho Chehab  */
cx88_dvico_xc2028_callback(struct cx88_core * core,int command,int arg)29940be51b46SMauro Carvalho Chehab static int cx88_dvico_xc2028_callback(struct cx88_core *core,
29950be51b46SMauro Carvalho Chehab 				      int command, int arg)
2996b3fb91d2SChris Pascoe {
2997b3fb91d2SChris Pascoe 	switch (command) {
2998b3fb91d2SChris Pascoe 	case XC2028_TUNER_RESET:
2999d7cba043SMichael Krufky 		switch (core->boardnr) {
3000d7cba043SMichael Krufky 		case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
3001d7cba043SMichael Krufky 			/* GPIO-4 xc3028 tuner */
3002d7cba043SMichael Krufky 
3003d7cba043SMichael Krufky 			cx_set(MO_GP0_IO, 0x00001000);
3004d7cba043SMichael Krufky 			cx_clear(MO_GP0_IO, 0x00000010);
3005d7cba043SMichael Krufky 			msleep(100);
3006d7cba043SMichael Krufky 			cx_set(MO_GP0_IO, 0x00000010);
3007d7cba043SMichael Krufky 			msleep(100);
3008d7cba043SMichael Krufky 			break;
3009d7cba043SMichael Krufky 		default:
30108765561fSChris Pascoe 			cx_write(MO_GP0_IO, 0x101000);
30118765561fSChris Pascoe 			mdelay(5);
30128765561fSChris Pascoe 			cx_set(MO_GP0_IO, 0x101010);
3013d7cba043SMichael Krufky 		}
3014b3fb91d2SChris Pascoe 		break;
3015b3fb91d2SChris Pascoe 	default:
3016b3fb91d2SChris Pascoe 		return -EINVAL;
3017b3fb91d2SChris Pascoe 	}
3018b3fb91d2SChris Pascoe 
3019b3fb91d2SChris Pascoe 	return 0;
3020b3fb91d2SChris Pascoe }
3021b3fb91d2SChris Pascoe 
3022399426caSMauro Carvalho Chehab /*
3023399426caSMauro Carvalho Chehab  * some Geniatech specific stuff
3024399426caSMauro Carvalho Chehab  */
30259507901eSMauro Carvalho Chehab 
cx88_xc3028_geniatech_tuner_callback(struct cx88_core * core,int command,int mode)30260be51b46SMauro Carvalho Chehab static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
30270be51b46SMauro Carvalho Chehab 						int command, int mode)
30289507901eSMauro Carvalho Chehab {
30299507901eSMauro Carvalho Chehab 	switch (command) {
30309507901eSMauro Carvalho Chehab 	case XC2028_TUNER_RESET:
30319507901eSMauro Carvalho Chehab 		switch (INPUT(core->input).type) {
30329507901eSMauro Carvalho Chehab 		case CX88_RADIO:
3033c450e50eSMauro Carvalho Chehab 			break;
30349507901eSMauro Carvalho Chehab 		case CX88_VMUX_DVB:
30359507901eSMauro Carvalho Chehab 			cx_write(MO_GP1_IO, 0x030302);
30369507901eSMauro Carvalho Chehab 			mdelay(50);
3037c450e50eSMauro Carvalho Chehab 			break;
30389507901eSMauro Carvalho Chehab 		default:
30399507901eSMauro Carvalho Chehab 			cx_write(MO_GP1_IO, 0x030301);
30409507901eSMauro Carvalho Chehab 			mdelay(50);
3041c450e50eSMauro Carvalho Chehab 		}
30429507901eSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
30439507901eSMauro Carvalho Chehab 		mdelay(50);
30449507901eSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101000);
30459507901eSMauro Carvalho Chehab 		mdelay(50);
30469507901eSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
30479507901eSMauro Carvalho Chehab 		mdelay(50);
30489507901eSMauro Carvalho Chehab 		return 0;
30499507901eSMauro Carvalho Chehab 	}
30509507901eSMauro Carvalho Chehab 	return -EINVAL;
30519507901eSMauro Carvalho Chehab }
30529507901eSMauro Carvalho Chehab 
cx88_xc3028_winfast1800h_callback(struct cx88_core * core,int command,int arg)30533047a176SMiroslav Sustek static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
30543047a176SMiroslav Sustek 					     int command, int arg)
30553047a176SMiroslav Sustek {
30563047a176SMiroslav Sustek 	switch (command) {
30573047a176SMiroslav Sustek 	case XC2028_TUNER_RESET:
30583047a176SMiroslav Sustek 		/* GPIO 12 (xc3028 tuner reset) */
30593047a176SMiroslav Sustek 		cx_set(MO_GP1_IO, 0x1010);
30603047a176SMiroslav Sustek 		mdelay(50);
30613047a176SMiroslav Sustek 		cx_clear(MO_GP1_IO, 0x10);
30624699903eSAlan Cox 		mdelay(75);
30633047a176SMiroslav Sustek 		cx_set(MO_GP1_IO, 0x10);
30644699903eSAlan Cox 		mdelay(75);
30653047a176SMiroslav Sustek 		return 0;
30663047a176SMiroslav Sustek 	}
30673047a176SMiroslav Sustek 	return -EINVAL;
30683047a176SMiroslav Sustek }
30693047a176SMiroslav Sustek 
cx88_xc4000_winfast2000h_plus_callback(struct cx88_core * core,int command,int arg)3070f271a3afSistvan_v@mailbox.hu static int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core,
3071f271a3afSistvan_v@mailbox.hu 						  int command, int arg)
3072f271a3afSistvan_v@mailbox.hu {
3073f271a3afSistvan_v@mailbox.hu 	switch (command) {
3074f271a3afSistvan_v@mailbox.hu 	case XC4000_TUNER_RESET:
3075f271a3afSistvan_v@mailbox.hu 		/* GPIO 12 (xc4000 tuner reset) */
3076f271a3afSistvan_v@mailbox.hu 		cx_set(MO_GP1_IO, 0x1010);
3077f271a3afSistvan_v@mailbox.hu 		mdelay(50);
3078f271a3afSistvan_v@mailbox.hu 		cx_clear(MO_GP1_IO, 0x10);
3079f271a3afSistvan_v@mailbox.hu 		mdelay(75);
3080f271a3afSistvan_v@mailbox.hu 		cx_set(MO_GP1_IO, 0x10);
3081f271a3afSistvan_v@mailbox.hu 		mdelay(75);
3082f271a3afSistvan_v@mailbox.hu 		return 0;
3083f271a3afSistvan_v@mailbox.hu 	}
3084f271a3afSistvan_v@mailbox.hu 	return -EINVAL;
3085f271a3afSistvan_v@mailbox.hu }
3086f271a3afSistvan_v@mailbox.hu 
3087399426caSMauro Carvalho Chehab /*
3088399426caSMauro Carvalho Chehab  * some Divco specific stuff
3089399426caSMauro Carvalho Chehab  */
cx88_pv_8000gt_callback(struct cx88_core * core,int command,int arg)30900be51b46SMauro Carvalho Chehab static int cx88_pv_8000gt_callback(struct cx88_core *core,
30910be51b46SMauro Carvalho Chehab 				   int command, int arg)
30922422a9b3SMauro Carvalho Chehab {
30932422a9b3SMauro Carvalho Chehab 	switch (command) {
30942422a9b3SMauro Carvalho Chehab 	case XC2028_TUNER_RESET:
30952422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
30962422a9b3SMauro Carvalho Chehab 		mdelay(50);
30972422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xef5);
30982422a9b3SMauro Carvalho Chehab 		mdelay(50);
30992422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
31002422a9b3SMauro Carvalho Chehab 		break;
31012422a9b3SMauro Carvalho Chehab 	default:
31022422a9b3SMauro Carvalho Chehab 		return -EINVAL;
31032422a9b3SMauro Carvalho Chehab 	}
31042422a9b3SMauro Carvalho Chehab 
31052422a9b3SMauro Carvalho Chehab 	return 0;
31062422a9b3SMauro Carvalho Chehab }
31072422a9b3SMauro Carvalho Chehab 
3108399426caSMauro Carvalho Chehab /*
3109399426caSMauro Carvalho Chehab  * some DViCO specific stuff
3110399426caSMauro Carvalho Chehab  */
3111780dfef3SChris Pascoe 
dvico_fusionhdtv_hybrid_init(struct cx88_core * core)3112780dfef3SChris Pascoe static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
3113780dfef3SChris Pascoe {
3114780dfef3SChris Pascoe 	struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
3115780dfef3SChris Pascoe 	int i, err;
311669b27e3dSChris Pascoe 	static u8 init_bufs[13][5] = {
3117780dfef3SChris Pascoe 		{ 0x10, 0x00, 0x20, 0x01, 0x03 },
3118780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x01, 0x00, 0x21 },
3119780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x10, 0x00, 0xCA },
3120780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x12, 0x00, 0x08 },
3121780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x13, 0x00, 0x0A },
3122780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x16, 0x01, 0xC0 },
3123780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x22, 0x01, 0x3D },
3124780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x73, 0x01, 0x2E },
3125780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x72, 0x00, 0xC5 },
3126780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x71, 0x01, 0x97 },
3127780dfef3SChris Pascoe 		{ 0x10, 0x10, 0x70, 0x00, 0x0F },
3128780dfef3SChris Pascoe 		{ 0x10, 0x10, 0xB0, 0x00, 0x01 },
3129780dfef3SChris Pascoe 		{ 0x03, 0x0C },
3130780dfef3SChris Pascoe 	};
3131780dfef3SChris Pascoe 
31325b9c4e6dSMauro Carvalho Chehab 	for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {
3133780dfef3SChris Pascoe 		msg.buf = init_bufs[i];
3134780dfef3SChris Pascoe 		msg.len = (i != 12 ? 5 : 2);
3135780dfef3SChris Pascoe 		err = i2c_transfer(&core->i2c_adap, &msg, 1);
3136780dfef3SChris Pascoe 		if (err != 1) {
313765bc2fe8SMauro Carvalho Chehab 			pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n",
3138e318e584SMauro Carvalho Chehab 				i, err);
3139780dfef3SChris Pascoe 			return;
3140780dfef3SChris Pascoe 		}
3141780dfef3SChris Pascoe 	}
3142780dfef3SChris Pascoe }
3143780dfef3SChris Pascoe 
cx88_xc2028_tuner_callback(struct cx88_core * core,int command,int arg)31440be51b46SMauro Carvalho Chehab static int cx88_xc2028_tuner_callback(struct cx88_core *core,
31450be51b46SMauro Carvalho Chehab 				      int command, int arg)
3146c2cb8fccSMauro Carvalho Chehab {
31479507901eSMauro Carvalho Chehab 	/* Board-specific callbacks */
31489507901eSMauro Carvalho Chehab 	switch (core->boardnr) {
31499507901eSMauro Carvalho Chehab 	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
31509507901eSMauro Carvalho Chehab 	case CX88_BOARD_GENIATECH_X8000_MT:
315199e09eacSMauro Carvalho Chehab 	case CX88_BOARD_KWORLD_ATSC_120:
31520be51b46SMauro Carvalho Chehab 		return cx88_xc3028_geniatech_tuner_callback(core,
31530be51b46SMauro Carvalho Chehab 							command, arg);
31542422a9b3SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_8000GT:
3155a31d2bb7SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
31560be51b46SMauro Carvalho Chehab 		return cx88_pv_8000gt_callback(core, command, arg);
3157b3fb91d2SChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
3158d7cba043SMichael Krufky 	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
31590be51b46SMauro Carvalho Chehab 		return cx88_dvico_xc2028_callback(core, command, arg);
3160e6f45ea2SDaniel Gonzalez Cabanelas 	case CX88_BOARD_NOTONLYTV_LV3H:
316114422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
31623047a176SMiroslav Sustek 	case CX88_BOARD_WINFAST_DTV1800H:
31633047a176SMiroslav Sustek 		return cx88_xc3028_winfast1800h_callback(core, command, arg);
31649507901eSMauro Carvalho Chehab 	}
31659507901eSMauro Carvalho Chehab 
3166c2cb8fccSMauro Carvalho Chehab 	switch (command) {
3167c2cb8fccSMauro Carvalho Chehab 	case XC2028_TUNER_RESET:
3168c2cb8fccSMauro Carvalho Chehab 		switch (INPUT(core->input).type) {
3169c2cb8fccSMauro Carvalho Chehab 		case CX88_RADIO:
317002615ed5SMauro Carvalho Chehab 			dprintk(1, "setting GPIO to radio!\n");
3171c2cb8fccSMauro Carvalho Chehab 			cx_write(MO_GP0_IO, 0x4ff);
3172c2cb8fccSMauro Carvalho Chehab 			mdelay(250);
3173c2cb8fccSMauro Carvalho Chehab 			cx_write(MO_GP2_IO, 0xff);
3174c2cb8fccSMauro Carvalho Chehab 			mdelay(250);
3175c450e50eSMauro Carvalho Chehab 			break;
3176c2cb8fccSMauro Carvalho Chehab 		case CX88_VMUX_DVB:	/* Digital TV*/
3177c2cb8fccSMauro Carvalho Chehab 		default:		/* Analog TV */
317802615ed5SMauro Carvalho Chehab 			dprintk(1, "setting GPIO to TV!\n");
3179c450e50eSMauro Carvalho Chehab 			break;
3180c450e50eSMauro Carvalho Chehab 		}
3181c2cb8fccSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
3182c2cb8fccSMauro Carvalho Chehab 		mdelay(250);
3183c2cb8fccSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101000);
3184c2cb8fccSMauro Carvalho Chehab 		mdelay(250);
3185c2cb8fccSMauro Carvalho Chehab 		cx_write(MO_GP1_IO, 0x101010);
3186c2cb8fccSMauro Carvalho Chehab 		mdelay(250);
3187c2cb8fccSMauro Carvalho Chehab 		return 0;
3188c2cb8fccSMauro Carvalho Chehab 	}
3189c2cb8fccSMauro Carvalho Chehab 	return -EINVAL;
3190c2cb8fccSMauro Carvalho Chehab }
3191c2cb8fccSMauro Carvalho Chehab 
cx88_xc4000_tuner_callback(struct cx88_core * core,int command,int arg)3192c21973e8Sistvan_v@mailbox.hu static int cx88_xc4000_tuner_callback(struct cx88_core *core,
3193c21973e8Sistvan_v@mailbox.hu 				      int command, int arg)
3194c21973e8Sistvan_v@mailbox.hu {
3195c21973e8Sistvan_v@mailbox.hu 	/* Board-specific callbacks */
3196c21973e8Sistvan_v@mailbox.hu 	switch (core->boardnr) {
31978eb79c0bSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
3198f271a3afSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
319984463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
320084463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
3201f271a3afSistvan_v@mailbox.hu 		return cx88_xc4000_winfast2000h_plus_callback(core,
3202f271a3afSistvan_v@mailbox.hu 							      command, arg);
3203c21973e8Sistvan_v@mailbox.hu 	}
3204c21973e8Sistvan_v@mailbox.hu 	return -EINVAL;
3205c21973e8Sistvan_v@mailbox.hu }
3206c21973e8Sistvan_v@mailbox.hu 
3207399426caSMauro Carvalho Chehab /*
3208399426caSMauro Carvalho Chehab  * Tuner callback function. Currently only needed for the Pinnacle
320973c9a3f3SBhaskar Chowdhury  * PCTV HD 800i with an xc5000 silicon tuner. This is used for both
3210399426caSMauro Carvalho Chehab  * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c)
3211399426caSMauro Carvalho Chehab  */
cx88_xc5000_tuner_callback(struct cx88_core * core,int command,int arg)32120be51b46SMauro Carvalho Chehab static int cx88_xc5000_tuner_callback(struct cx88_core *core,
32130be51b46SMauro Carvalho Chehab 				      int command, int arg)
321460464da8SSteven Toth {
321560464da8SSteven Toth 	switch (core->boardnr) {
321660464da8SSteven Toth 	case CX88_BOARD_PINNACLE_PCTV_HD_800i:
321760464da8SSteven Toth 		if (command == 0) { /* This is the reset command from xc5000 */
3218b8d91986SDevin Heitmueller 
3219399426caSMauro Carvalho Chehab 			/*
3220399426caSMauro Carvalho Chehab 			 * djh - According to the engineer at PCTV Systems,
3221399426caSMauro Carvalho Chehab 			 * the xc5000 reset pin is supposed to be on GPIO12.
3222399426caSMauro Carvalho Chehab 			 * However, despite three nights of effort, pulling
3223399426caSMauro Carvalho Chehab 			 * that GPIO low didn't reset the xc5000.  While
3224399426caSMauro Carvalho Chehab 			 * pulling MO_SRST_IO low does reset the xc5000, this
3225399426caSMauro Carvalho Chehab 			 * also resets in the s5h1409 being reset as well.
3226399426caSMauro Carvalho Chehab 			 * This causes tuning to always fail since the internal
3227399426caSMauro Carvalho Chehab 			 * state of the s5h1409 does not match the driver's
3228399426caSMauro Carvalho Chehab 			 * state.  Given that the only two conditions in which
3229399426caSMauro Carvalho Chehab 			 * the driver performs a reset is during firmware load
3230399426caSMauro Carvalho Chehab 			 * and powering down the chip, I am taking out the
3231399426caSMauro Carvalho Chehab 			 * reset.  We know that the chip is being reset
3232399426caSMauro Carvalho Chehab 			 * when the cx88 comes online, and not being able to
3233399426caSMauro Carvalho Chehab 			 * do power management for this board is worse than
3234399426caSMauro Carvalho Chehab 			 * not having any tuning at all.
3235399426caSMauro Carvalho Chehab 			 */
323660464da8SSteven Toth 			return 0;
3237399426caSMauro Carvalho Chehab 		}
3238399426caSMauro Carvalho Chehab 
323902615ed5SMauro Carvalho Chehab 		dprintk(1, "xc5000: unknown tuner callback command.\n");
324060464da8SSteven Toth 		return -EINVAL;
32411117d6baSSteven Toth 	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
32421117d6baSSteven Toth 		if (command == 0) { /* This is the reset command from xc5000 */
32431117d6baSSteven Toth 			cx_clear(MO_GP0_IO, 0x00000010);
3244399426caSMauro Carvalho Chehab 			usleep_range(10000, 20000);
32451117d6baSSteven Toth 			cx_set(MO_GP0_IO, 0x00000010);
32461117d6baSSteven Toth 			return 0;
3247399426caSMauro Carvalho Chehab 		}
3248399426caSMauro Carvalho Chehab 
324902615ed5SMauro Carvalho Chehab 		dprintk(1, "xc5000: unknown tuner callback command.\n");
32501117d6baSSteven Toth 		return -EINVAL;
32511117d6baSSteven Toth 	}
325260464da8SSteven Toth 	return 0; /* Should never be here */
325360464da8SSteven Toth }
3254c2cb8fccSMauro Carvalho Chehab 
cx88_tuner_callback(void * priv,int component,int command,int arg)3255d7cba043SMichael Krufky int cx88_tuner_callback(void *priv, int component, int command, int arg)
3256c2cb8fccSMauro Carvalho Chehab {
3257c2cb8fccSMauro Carvalho Chehab 	struct i2c_algo_bit_data *i2c_algo = priv;
32580be51b46SMauro Carvalho Chehab 	struct cx88_core *core;
32590be51b46SMauro Carvalho Chehab 
32600be51b46SMauro Carvalho Chehab 	if (!i2c_algo) {
326165bc2fe8SMauro Carvalho Chehab 		pr_err("Error - i2c private data undefined.\n");
32620be51b46SMauro Carvalho Chehab 		return -EINVAL;
32630be51b46SMauro Carvalho Chehab 	}
32640be51b46SMauro Carvalho Chehab 
32650be51b46SMauro Carvalho Chehab 	core = i2c_algo->data;
32660be51b46SMauro Carvalho Chehab 
32670be51b46SMauro Carvalho Chehab 	if (!core) {
326865bc2fe8SMauro Carvalho Chehab 		pr_err("Error - device struct undefined.\n");
32690be51b46SMauro Carvalho Chehab 		return -EINVAL;
32700be51b46SMauro Carvalho Chehab 	}
3271c2cb8fccSMauro Carvalho Chehab 
3272d7cba043SMichael Krufky 	if (component != DVB_FRONTEND_COMPONENT_TUNER)
3273d7cba043SMichael Krufky 		return -EINVAL;
3274d7cba043SMichael Krufky 
3275c2cb8fccSMauro Carvalho Chehab 	switch (core->board.tuner_type) {
3276c2cb8fccSMauro Carvalho Chehab 	case TUNER_XC2028:
327702615ed5SMauro Carvalho Chehab 		dprintk(1, "Calling XC2028/3028 callback\n");
32780be51b46SMauro Carvalho Chehab 		return cx88_xc2028_tuner_callback(core, command, arg);
3279c21973e8Sistvan_v@mailbox.hu 	case TUNER_XC4000:
328002615ed5SMauro Carvalho Chehab 		dprintk(1, "Calling XC4000 callback\n");
3281c21973e8Sistvan_v@mailbox.hu 		return cx88_xc4000_tuner_callback(core, command, arg);
3282c2cb8fccSMauro Carvalho Chehab 	case TUNER_XC5000:
328302615ed5SMauro Carvalho Chehab 		dprintk(1, "Calling XC5000 callback\n");
32840be51b46SMauro Carvalho Chehab 		return cx88_xc5000_tuner_callback(core, command, arg);
3285c2cb8fccSMauro Carvalho Chehab 	}
328665bc2fe8SMauro Carvalho Chehab 	pr_err("Error: Calling callback for tuner %d\n",
32870f19e65bSMauro Carvalho Chehab 	       core->board.tuner_type);
3288c2cb8fccSMauro Carvalho Chehab 	return -EINVAL;
3289c2cb8fccSMauro Carvalho Chehab }
329060464da8SSteven Toth EXPORT_SYMBOL(cx88_tuner_callback);
329160464da8SSteven Toth 
329260464da8SSteven Toth /* ----------------------------------------------------------------------- */
32931da177e4SLinus Torvalds 
cx88_card_list(struct cx88_core * core,struct pci_dev * pci)3294bbc83597STrent Piepho static void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
32951da177e4SLinus Torvalds {
32961da177e4SLinus Torvalds 	int i;
32971da177e4SLinus Torvalds 
3298399426caSMauro Carvalho Chehab 	if (!pci->subsystem_vendor && !pci->subsystem_device) {
329965bc2fe8SMauro Carvalho Chehab 		pr_err("Your board has no valid PCI Subsystem ID and thus can't\n");
330065bc2fe8SMauro Carvalho Chehab 		pr_err("be autodetected.  Please pass card=<n> insmod option to\n");
330165bc2fe8SMauro Carvalho Chehab 		pr_err("workaround that.  Redirect complaints to the vendor of\n");
330265bc2fe8SMauro Carvalho Chehab 		pr_err("the TV card\n");
33031da177e4SLinus Torvalds 	} else {
330465bc2fe8SMauro Carvalho Chehab 		pr_err("Your board isn't known (yet) to the driver.  You can\n");
330565bc2fe8SMauro Carvalho Chehab 		pr_err("try to pick one of the existing card configs via\n");
330665bc2fe8SMauro Carvalho Chehab 		pr_err("card=<n> insmod option.  Updating to the latest\n");
330765bc2fe8SMauro Carvalho Chehab 		pr_err("version might help as well.\n");
33081da177e4SLinus Torvalds 	}
330965bc2fe8SMauro Carvalho Chehab 	pr_err("Here is a list of valid choices for the card=<n> insmod option:\n");
3310bbc83597STrent Piepho 	for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)
331165bc2fe8SMauro Carvalho Chehab 		pr_err("    card=%d -> %s\n", i, cx88_boards[i].name);
33121da177e4SLinus Torvalds }
33131da177e4SLinus Torvalds 
cx88_card_setup_pre_i2c(struct cx88_core * core)3314bbc83597STrent Piepho static void cx88_card_setup_pre_i2c(struct cx88_core *core)
3315aa481a65SSteven Toth {
33166a59d64cSTrent Piepho 	switch (core->boardnr) {
3317aa481a65SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1300:
33182491fbb7SSteven Toth 		/*
3319399426caSMauro Carvalho Chehab 		 * Bring the 702 demod up before i2c scanning/attach or
3320399426caSMauro Carvalho Chehab 		 * devices are hidden.
3321399426caSMauro Carvalho Chehab 		 *
33222491fbb7SSteven Toth 		 * We leave here with the 702 on the bus
33232491fbb7SSteven Toth 		 *
33242491fbb7SSteven Toth 		 * "reset the IR receiver on GPIO[3]"
33252491fbb7SSteven Toth 		 * Reported by Mike Crash <mike AT mikecrash.com>
33262491fbb7SSteven Toth 		 */
33272491fbb7SSteven Toth 		cx_write(MO_GP0_IO, 0x0000ef88);
3328aa481a65SSteven Toth 		udelay(1000);
33292491fbb7SSteven Toth 		cx_clear(MO_GP0_IO, 0x00000088);
3330aa481a65SSteven Toth 		udelay(50);
33312491fbb7SSteven Toth 		cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */
3332aa481a65SSteven Toth 		udelay(1000);
3333aa481a65SSteven Toth 		break;
33342422a9b3SMauro Carvalho Chehab 
3335a31d2bb7SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
33362422a9b3SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_8000GT:
33372422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
3338dddaf754SJia-Ju Bai 		msleep(50);
33392422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xef5);
3340dddaf754SJia-Ju Bai 		msleep(50);
33412422a9b3SMauro Carvalho Chehab 		cx_write(MO_GP2_IO, 0xcf7);
3342399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
33432422a9b3SMauro Carvalho Chehab 		break;
33442422a9b3SMauro Carvalho Chehab 
33451117d6baSSteven Toth 	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
33461117d6baSSteven Toth 		/* Enable the xc5000 tuner */
33471117d6baSSteven Toth 		cx_set(MO_GP0_IO, 0x00001010);
33481117d6baSSteven Toth 		break;
33492491fbb7SSteven Toth 
335027b93d8aSMiroslav Slugen 	case CX88_BOARD_WINFAST_DTV2000H_J:
33512491fbb7SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR3000:
33525bd1b663SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR4000:
33532491fbb7SSteven Toth 		/* Init GPIO */
33542491fbb7SSteven Toth 		cx_write(MO_GP0_IO, core->board.input[0].gpio0);
33555bd1b663SSteven Toth 		udelay(1000);
33562f3af9e6SDarron Broad 		cx_clear(MO_GP0_IO, 0x00000080);
33572f3af9e6SDarron Broad 		udelay(50);
33582f3af9e6SDarron Broad 		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
33592f3af9e6SDarron Broad 		udelay(1000);
33602491fbb7SSteven Toth 		break;
33613047a176SMiroslav Sustek 
3362e6f45ea2SDaniel Gonzalez Cabanelas 	case CX88_BOARD_NOTONLYTV_LV3H:
336314422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
33643047a176SMiroslav Sustek 	case CX88_BOARD_WINFAST_DTV1800H:
336579a5b9a2Sistvan_v@mailbox.hu 		cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0);
33663047a176SMiroslav Sustek 		break;
3367111ac84aSSergey Ivanov 
33688eb79c0bSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
3369f271a3afSistvan_v@mailbox.hu 	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
337084463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
337184463d5fSIstvan Varga 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
3372f271a3afSistvan_v@mailbox.hu 		cx88_xc4000_winfast2000h_plus_callback(core,
3373f271a3afSistvan_v@mailbox.hu 						       XC4000_TUNER_RESET, 0);
3374f271a3afSistvan_v@mailbox.hu 		break;
3375f271a3afSistvan_v@mailbox.hu 
3376111ac84aSSergey Ivanov 	case CX88_BOARD_TWINHAN_VP1027_DVBS:
3377111ac84aSSergey Ivanov 		cx_write(MO_GP0_IO, 0x00003230);
3378111ac84aSSergey Ivanov 		cx_write(MO_GP0_IO, 0x00003210);
3379399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
3380111ac84aSSergey Ivanov 		cx_write(MO_GP0_IO, 0x00001230);
3381111ac84aSSergey Ivanov 		break;
3382aa481a65SSteven Toth 	}
3383aa481a65SSteven Toth }
3384aa481a65SSteven Toth 
338599e09eacSMauro Carvalho Chehab /*
338699e09eacSMauro Carvalho Chehab  * Sets board-dependent xc3028 configuration
338799e09eacSMauro Carvalho Chehab  */
cx88_setup_xc3028(struct cx88_core * core,struct xc2028_ctrl * ctl)338899e09eacSMauro Carvalho Chehab void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
338999e09eacSMauro Carvalho Chehab {
339099e09eacSMauro Carvalho Chehab 	memset(ctl, 0, sizeof(*ctl));
339199e09eacSMauro Carvalho Chehab 
339299e09eacSMauro Carvalho Chehab 	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
339399e09eacSMauro Carvalho Chehab 	ctl->max_len = 64;
339499e09eacSMauro Carvalho Chehab 
339599e09eacSMauro Carvalho Chehab 	switch (core->boardnr) {
339699e09eacSMauro Carvalho Chehab 	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
3397a9606ce6SDaniel Gimpelevich 		/* Now works with firmware version 2.7 */
3398a9606ce6SDaniel Gimpelevich 		if (core->i2c_algo.udelay < 16)
3399a9606ce6SDaniel Gimpelevich 			core->i2c_algo.udelay = 16;
340099e09eacSMauro Carvalho Chehab 		break;
340199e09eacSMauro Carvalho Chehab 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
34023047a176SMiroslav Sustek 	case CX88_BOARD_WINFAST_DTV1800H:
340319c309e3STim Farrington 		ctl->demod = XC3028_FE_ZARLINK456;
340499e09eacSMauro Carvalho Chehab 		break;
340599e09eacSMauro Carvalho Chehab 	case CX88_BOARD_KWORLD_ATSC_120:
340699e09eacSMauro Carvalho Chehab 	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
340799e09eacSMauro Carvalho Chehab 		ctl->demod = XC3028_FE_OREN538;
340899e09eacSMauro Carvalho Chehab 		break;
340993b99923SDevin Heitmueller 	case CX88_BOARD_GENIATECH_X8000_MT:
3410399426caSMauro Carvalho Chehab 		/*
3411399426caSMauro Carvalho Chehab 		 * FIXME: For this board, the xc3028 never recovers after being
3412399426caSMauro Carvalho Chehab 		 * powered down (the reset GPIO probably is not set properly).
3413399426caSMauro Carvalho Chehab 		 * We don't have access to the hardware so we cannot determine
3414399426caSMauro Carvalho Chehab 		 * which GPIO is used for xc3028, so just disable power xc3028
3415399426caSMauro Carvalho Chehab 		 * power management for now
3416399426caSMauro Carvalho Chehab 		 */
341793b99923SDevin Heitmueller 		ctl->disable_power_mgmt = 1;
341893b99923SDevin Heitmueller 		break;
3419e6f45ea2SDaniel Gonzalez Cabanelas 	case CX88_BOARD_NOTONLYTV_LV3H:
3420e6f45ea2SDaniel Gonzalez Cabanelas 		ctl->demod			= XC3028_FE_ZARLINK456;
3421e6f45ea2SDaniel Gonzalez Cabanelas 		ctl->fname			= XC3028L_DEFAULT_FIRMWARE;
3422e6f45ea2SDaniel Gonzalez Cabanelas 		ctl->read_not_reliable	= 1;
3423e6f45ea2SDaniel Gonzalez Cabanelas 		break;
342414422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
3425a31d2bb7SMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
342699e09eacSMauro Carvalho Chehab 	case CX88_BOARD_PROLINK_PV_8000GT:
342799e09eacSMauro Carvalho Chehab 		/*
3428a31d2bb7SMauro Carvalho Chehab 		 * Those boards uses non-MTS firmware
342999e09eacSMauro Carvalho Chehab 		 */
343099e09eacSMauro Carvalho Chehab 		break;
34313f6014fcSStéphane Voltz 	case CX88_BOARD_PINNACLE_HYBRID_PCTV:
343270101a27SStephan Wienczny 	case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
34333f6014fcSStéphane Voltz 		ctl->demod = XC3028_FE_ZARLINK456;
34343f6014fcSStéphane Voltz 		ctl->mts = 1;
34353f6014fcSStéphane Voltz 		break;
343699e09eacSMauro Carvalho Chehab 	default:
343799e09eacSMauro Carvalho Chehab 		ctl->demod = XC3028_FE_OREN538;
343899e09eacSMauro Carvalho Chehab 		ctl->mts = 1;
343999e09eacSMauro Carvalho Chehab 	}
344099e09eacSMauro Carvalho Chehab }
344199e09eacSMauro Carvalho Chehab EXPORT_SYMBOL_GPL(cx88_setup_xc3028);
344299e09eacSMauro Carvalho Chehab 
cx88_card_setup(struct cx88_core * core)3443bbc83597STrent Piepho static void cx88_card_setup(struct cx88_core *core)
34441da177e4SLinus Torvalds {
34453ca0ea98SSteven Toth 	static u8 eeprom[256];
34464bf1226aSMauro Carvalho Chehab 	struct tuner_setup tun_setup;
3447ad020dc2SMauro Carvalho Chehab 	unsigned int mode_mask = T_RADIO | T_ANALOG_TV;
34484bf1226aSMauro Carvalho Chehab 
34494bf1226aSMauro Carvalho Chehab 	memset(&tun_setup, 0, sizeof(tun_setup));
34501da177e4SLinus Torvalds 
3451399426caSMauro Carvalho Chehab 	if (!core->i2c_rc) {
34521da177e4SLinus Torvalds 		core->i2c_client.addr = 0xa0 >> 1;
34531da177e4SLinus Torvalds 		tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));
34541da177e4SLinus Torvalds 	}
34551da177e4SLinus Torvalds 
34566a59d64cSTrent Piepho 	switch (core->boardnr) {
34571da177e4SLinus Torvalds 	case CX88_BOARD_HAUPPAUGE:
34581da177e4SLinus Torvalds 	case CX88_BOARD_HAUPPAUGE_ROSLYN:
3459399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34601da177e4SLinus Torvalds 			hauppauge_eeprom(core, eeprom + 8);
34611da177e4SLinus Torvalds 		break;
34621da177e4SLinus Torvalds 	case CX88_BOARD_GDI:
3463399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34641da177e4SLinus Torvalds 			gdi_eeprom(core, eeprom);
34651da177e4SLinus Torvalds 		break;
346614422f9dSMauro Carvalho Chehab 	case CX88_BOARD_LEADTEK_PVR2000:
346714422f9dSMauro Carvalho Chehab 	case CX88_BOARD_WINFAST_DV2000:
34681da177e4SLinus Torvalds 	case CX88_BOARD_WINFAST2000XP_EXPERT:
3469399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34701da177e4SLinus Torvalds 			leadtek_eeprom(core, eeprom);
34711da177e4SLinus Torvalds 		break;
34720fa14aa6SSteven Toth 	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
34730fa14aa6SSteven Toth 	case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
34741da177e4SLinus Torvalds 	case CX88_BOARD_HAUPPAUGE_DVB_T1:
3475611900c1SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1100:
3476611900c1SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1100LP:
3477ad10c930SEric Thomas 	case CX88_BOARD_HAUPPAUGE_HVR3000:
3478aa481a65SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR1300:
34795bd1b663SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR4000:
34805bd1b663SSteven Toth 	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
3481501d8cd4SSteven Toth 	case CX88_BOARD_HAUPPAUGE_IRONLY:
3482399426caSMauro Carvalho Chehab 		if (!core->i2c_rc)
34833ca0ea98SSteven Toth 			hauppauge_eeprom(core, eeprom);
34841da177e4SLinus Torvalds 		break;
34850e0351e3SVadim Catana 	case CX88_BOARD_KWORLD_DVBS_100:
34860e0351e3SVadim Catana 		cx_write(MO_GP0_IO, 0x000007f8);
34870e0351e3SVadim Catana 		cx_write(MO_GP1_IO, 0x00000001);
34880e0351e3SVadim Catana 		break;
34898765561fSChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
34908765561fSChris Pascoe 		/* GPIO0:0 is hooked to demod reset */
34918765561fSChris Pascoe 		/* GPIO0:4 is hooked to xc3028 reset */
34928765561fSChris Pascoe 		cx_write(MO_GP0_IO, 0x00111100);
3493399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
34948765561fSChris Pascoe 		cx_write(MO_GP0_IO, 0x00111111);
34958765561fSChris Pascoe 		break;
3496d536e9c4SChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
3497d536e9c4SChris Pascoe 		/* GPIO0:6 is hooked to FX2 reset pin */
3498d536e9c4SChris Pascoe 		cx_set(MO_GP0_IO, 0x00004040);
3499d536e9c4SChris Pascoe 		cx_clear(MO_GP0_IO, 0x00000040);
3500d536e9c4SChris Pascoe 		msleep(1000);
3501d536e9c4SChris Pascoe 		cx_set(MO_GP0_IO, 0x00004040);
35021771e9fbSGustavo A. R. Silva 		fallthrough;
35031da177e4SLinus Torvalds 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
35041da177e4SLinus Torvalds 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
3505780dfef3SChris Pascoe 	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
35061da177e4SLinus Torvalds 		/* GPIO0:0 is hooked to mt352 reset pin */
35071da177e4SLinus Torvalds 		cx_set(MO_GP0_IO, 0x00000101);
35081da177e4SLinus Torvalds 		cx_clear(MO_GP0_IO, 0x00000001);
3509399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
35101da177e4SLinus Torvalds 		cx_set(MO_GP0_IO, 0x00000101);
3511399426caSMauro Carvalho Chehab 		if (!core->i2c_rc &&
35126a59d64cSTrent Piepho 		    core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
3513780dfef3SChris Pascoe 			dvico_fusionhdtv_hybrid_init(core);
35141da177e4SLinus Torvalds 		break;
35151da177e4SLinus Torvalds 	case CX88_BOARD_KWORLD_DVB_T:
35161da177e4SLinus Torvalds 	case CX88_BOARD_DNTV_LIVE_DVB_T:
35171da177e4SLinus Torvalds 		cx_set(MO_GP0_IO, 0x00000707);
35181da177e4SLinus Torvalds 		cx_set(MO_GP2_IO, 0x00000101);
35191da177e4SLinus Torvalds 		cx_clear(MO_GP2_IO, 0x00000001);
3520399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
35211da177e4SLinus Torvalds 		cx_clear(MO_GP0_IO, 0x00000007);
35221da177e4SLinus Torvalds 		cx_set(MO_GP2_IO, 0x00000101);
35231da177e4SLinus Torvalds 		break;
3524fc40b261SChris Pascoe 	case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
3525fc40b261SChris Pascoe 		cx_write(MO_GP0_IO, 0x00080808);
3526fc40b261SChris Pascoe 		break;
3527e976f937SKirk Lapray 	case CX88_BOARD_ATI_HDTVWONDER:
3528399426caSMauro Carvalho Chehab 		if (!core->i2c_rc) {
3529e976f937SKirk Lapray 			/* enable tuner */
3530e976f937SKirk Lapray 			int i;
35315b9c4e6dSMauro Carvalho Chehab 			static const u8 buffer[][2] = {
35325b9c4e6dSMauro Carvalho Chehab 				{0x10, 0x12},
35335b9c4e6dSMauro Carvalho Chehab 				{0x13, 0x04},
35345b9c4e6dSMauro Carvalho Chehab 				{0x16, 0x00},
35355b9c4e6dSMauro Carvalho Chehab 				{0x14, 0x04},
35365b9c4e6dSMauro Carvalho Chehab 				{0x17, 0x00}
35375b9c4e6dSMauro Carvalho Chehab 			};
3538e976f937SKirk Lapray 			core->i2c_client.addr = 0x0a;
3539e976f937SKirk Lapray 
35405b9c4e6dSMauro Carvalho Chehab 			for (i = 0; i < ARRAY_SIZE(buffer); i++)
3541399426caSMauro Carvalho Chehab 				if (i2c_master_send(&core->i2c_client,
3542399426caSMauro Carvalho Chehab 						    buffer[i], 2) != 2)
354365bc2fe8SMauro Carvalho Chehab 					pr_warn("Unable to enable tuner(%i).\n",
3544e318e584SMauro Carvalho Chehab 						i);
3545e976f937SKirk Lapray 		}
3546e976f937SKirk Lapray 		break;
354755c88610SMauro Carvalho Chehab 	case CX88_BOARD_MSI_TVANYWHERE_MASTER:
354855c88610SMauro Carvalho Chehab 	{
354955c88610SMauro Carvalho Chehab 		struct v4l2_priv_tun_config tea5767_cfg;
355055c88610SMauro Carvalho Chehab 		struct tea5767_ctrl ctl;
355155c88610SMauro Carvalho Chehab 
355255c88610SMauro Carvalho Chehab 		memset(&ctl, 0, sizeof(ctl));
355355c88610SMauro Carvalho Chehab 
355455c88610SMauro Carvalho Chehab 		ctl.high_cut  = 1;
355555c88610SMauro Carvalho Chehab 		ctl.st_noise  = 1;
355655c88610SMauro Carvalho Chehab 		ctl.deemph_75 = 1;
355755c88610SMauro Carvalho Chehab 		ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
355855c88610SMauro Carvalho Chehab 
355955c88610SMauro Carvalho Chehab 		tea5767_cfg.tuner = TUNER_TEA5767;
356055c88610SMauro Carvalho Chehab 		tea5767_cfg.priv  = &ctl;
356155c88610SMauro Carvalho Chehab 
3562b8341e1dSHans Verkuil 		call_all(core, tuner, s_config, &tea5767_cfg);
3563af832623SIgor M. Liplianin 		break;
356455c88610SMauro Carvalho Chehab 	}
3565e4aab64cSIgor M. Liplianin 	case  CX88_BOARD_TEVII_S420:
3566af832623SIgor M. Liplianin 	case  CX88_BOARD_TEVII_S460:
35670cb73639SIgor M. Liplianin 	case  CX88_BOARD_TEVII_S464:
35684cd7fb87SOleg Roitburd 	case  CX88_BOARD_OMICOM_SS4_PCI:
35694b29631dSIgor M. Liplianin 	case  CX88_BOARD_TBS_8910:
3570ee73042cSOleg Roitburd 	case  CX88_BOARD_TBS_8920:
3571cd3cde12SIgor M. Liplianin 	case  CX88_BOARD_PROF_6200:
357257f51dbcSOleg Roitburd 	case  CX88_BOARD_PROF_7300:
3573b699c271SIgor M. Liplianin 	case  CX88_BOARD_PROF_7301:
35744b29631dSIgor M. Liplianin 	case  CX88_BOARD_SATTRADE_ST4200:
3575ad5f74c0SIgor M. Liplianin 		cx_write(MO_GP0_IO, 0x8000);
3576ad5f74c0SIgor M. Liplianin 		msleep(100);
3577ee73042cSOleg Roitburd 		cx_write(MO_SRST_IO, 0);
3578399426caSMauro Carvalho Chehab 		usleep_range(10000, 20000);
3579ad5f74c0SIgor M. Liplianin 		cx_write(MO_GP0_IO, 0x8080);
3580ee73042cSOleg Roitburd 		msleep(100);
3581ee73042cSOleg Roitburd 		cx_write(MO_SRST_IO, 1);
3582ee73042cSOleg Roitburd 		msleep(100);
3583ee73042cSOleg Roitburd 		break;
35844bf1226aSMauro Carvalho Chehab 	} /*end switch() */
35854bf1226aSMauro Carvalho Chehab 
35864bf1226aSMauro Carvalho Chehab 	/* Setup tuners */
3587399426caSMauro Carvalho Chehab 	if (core->board.radio_type != UNSET) {
35884bf1226aSMauro Carvalho Chehab 		tun_setup.mode_mask      = T_RADIO;
35894bf1226aSMauro Carvalho Chehab 		tun_setup.type           = core->board.radio_type;
35904bf1226aSMauro Carvalho Chehab 		tun_setup.addr           = core->board.radio_addr;
35914bf1226aSMauro Carvalho Chehab 		tun_setup.tuner_callback = cx88_tuner_callback;
3592b8341e1dSHans Verkuil 		call_all(core, tuner, s_type_addr, &tun_setup);
35934bf1226aSMauro Carvalho Chehab 		mode_mask &= ~T_RADIO;
35944bf1226aSMauro Carvalho Chehab 	}
35954bf1226aSMauro Carvalho Chehab 
3596c39ba330SHans Verkuil 	if (core->board.tuner_type != UNSET) {
35974bf1226aSMauro Carvalho Chehab 		tun_setup.mode_mask      = mode_mask;
35984bf1226aSMauro Carvalho Chehab 		tun_setup.type           = core->board.tuner_type;
35994bf1226aSMauro Carvalho Chehab 		tun_setup.addr           = core->board.tuner_addr;
36004bf1226aSMauro Carvalho Chehab 		tun_setup.tuner_callback = cx88_tuner_callback;
36014bf1226aSMauro Carvalho Chehab 
3602b8341e1dSHans Verkuil 		call_all(core, tuner, s_type_addr, &tun_setup);
36034bf1226aSMauro Carvalho Chehab 	}
36044bf1226aSMauro Carvalho Chehab 
36054bf1226aSMauro Carvalho Chehab 	if (core->board.tda9887_conf) {
36064bf1226aSMauro Carvalho Chehab 		struct v4l2_priv_tun_config tda9887_cfg;
36074bf1226aSMauro Carvalho Chehab 
36084bf1226aSMauro Carvalho Chehab 		tda9887_cfg.tuner = TUNER_TDA9887;
36094bf1226aSMauro Carvalho Chehab 		tda9887_cfg.priv  = &core->board.tda9887_conf;
36104bf1226aSMauro Carvalho Chehab 
3611b8341e1dSHans Verkuil 		call_all(core, tuner, s_config, &tda9887_cfg);
36121da177e4SLinus Torvalds 	}
3613c2cb8fccSMauro Carvalho Chehab 
3614c2cb8fccSMauro Carvalho Chehab 	if (core->board.tuner_type == TUNER_XC2028) {
3615c2cb8fccSMauro Carvalho Chehab 		struct v4l2_priv_tun_config  xc2028_cfg;
3616c2cb8fccSMauro Carvalho Chehab 		struct xc2028_ctrl           ctl;
3617c2cb8fccSMauro Carvalho Chehab 
361899e09eacSMauro Carvalho Chehab 		/* Fills device-dependent initialization parameters */
361999e09eacSMauro Carvalho Chehab 		cx88_setup_xc3028(core, &ctl);
362099e09eacSMauro Carvalho Chehab 
362199e09eacSMauro Carvalho Chehab 		/* Sends parameters to xc2028/3028 tuner */
3622a9317abfSMauro Carvalho Chehab 		memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
3623c2cb8fccSMauro Carvalho Chehab 		xc2028_cfg.tuner = TUNER_XC2028;
3624c2cb8fccSMauro Carvalho Chehab 		xc2028_cfg.priv  = &ctl;
362502615ed5SMauro Carvalho Chehab 		dprintk(1, "Asking xc2028/3028 to load firmware %s\n",
362664016330SMauro Carvalho Chehab 			ctl.fname);
3627b8341e1dSHans Verkuil 		call_all(core, tuner, s_config, &xc2028_cfg);
3628c2cb8fccSMauro Carvalho Chehab 	}
36293aab15afSHans Verkuil 	call_all(core, tuner, standby);
36301da177e4SLinus Torvalds }
36311da177e4SLinus Torvalds 
36321da177e4SLinus Torvalds /* ------------------------------------------------------------------ */
36331da177e4SLinus Torvalds 
cx88_pci_quirks(const char * name,struct pci_dev * pci)3634bbc83597STrent Piepho static int cx88_pci_quirks(const char *name, struct pci_dev *pci)
3635bbc83597STrent Piepho {
3636bbc83597STrent Piepho 	unsigned int lat = UNSET;
3637bbc83597STrent Piepho 	u8 ctrl = 0;
3638bbc83597STrent Piepho 	u8 value;
3639bbc83597STrent Piepho 
3640bbc83597STrent Piepho 	/* check pci quirks */
3641bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_TRITON) {
364265bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_TRITON -- set TBFX\n");
3643bbc83597STrent Piepho 		ctrl |= CX88X_EN_TBFX;
3644bbc83597STrent Piepho 	}
3645bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_NATOMA) {
364665bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n");
3647bbc83597STrent Piepho 		ctrl |= CX88X_EN_TBFX;
3648bbc83597STrent Piepho 	}
3649bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_VIAETBF) {
365065bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n");
3651bbc83597STrent Piepho 		ctrl |= CX88X_EN_TBFX;
3652bbc83597STrent Piepho 	}
3653bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_VSFX) {
365465bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_VSFX -- set VSFX\n");
3655bbc83597STrent Piepho 		ctrl |= CX88X_EN_VSFX;
3656bbc83597STrent Piepho 	}
3657bbc83597STrent Piepho #ifdef PCIPCI_ALIMAGIK
3658bbc83597STrent Piepho 	if (pci_pci_problems & PCIPCI_ALIMAGIK) {
365965bc2fe8SMauro Carvalho Chehab 		pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n");
3660bbc83597STrent Piepho 		lat = 0x0A;
3661bbc83597STrent Piepho 	}
3662bbc83597STrent Piepho #endif
3663bbc83597STrent Piepho 
3664bbc83597STrent Piepho 	/* check insmod options */
36657b61ba8fSMauro Carvalho Chehab 	if (latency != UNSET)
3666bbc83597STrent Piepho 		lat = latency;
3667bbc83597STrent Piepho 
3668bbc83597STrent Piepho 	/* apply stuff */
3669bbc83597STrent Piepho 	if (ctrl) {
3670bbc83597STrent Piepho 		pci_read_config_byte(pci, CX88X_DEVCTRL, &value);
3671bbc83597STrent Piepho 		value |= ctrl;
3672bbc83597STrent Piepho 		pci_write_config_byte(pci, CX88X_DEVCTRL, value);
3673bbc83597STrent Piepho 	}
36747b61ba8fSMauro Carvalho Chehab 	if (lat != UNSET) {
3675399426caSMauro Carvalho Chehab 		pr_info("setting pci latency timer to %d\n", latency);
3676bbc83597STrent Piepho 		pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);
3677bbc83597STrent Piepho 	}
3678bbc83597STrent Piepho 	return 0;
3679bbc83597STrent Piepho }
3680bbc83597STrent Piepho 
cx88_get_resources(const struct cx88_core * core,struct pci_dev * pci)3681bbc83597STrent Piepho int cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)
3682bbc83597STrent Piepho {
3683bbc83597STrent Piepho 	if (request_mem_region(pci_resource_start(pci, 0),
3684bbc83597STrent Piepho 			       pci_resource_len(pci, 0),
3685bbc83597STrent Piepho 			       core->name))
3686bbc83597STrent Piepho 		return 0;
368765bc2fe8SMauro Carvalho Chehab 	pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",
368865bc2fe8SMauro Carvalho Chehab 	       PCI_FUNC(pci->devfn),
3689bbc83597STrent Piepho 	       (unsigned long long)pci_resource_start(pci, 0),
3690bbc83597STrent Piepho 	       pci->subsystem_vendor, pci->subsystem_device);
3691bbc83597STrent Piepho 	return -EBUSY;
3692bbc83597STrent Piepho }
3693bbc83597STrent Piepho 
3694399426caSMauro Carvalho Chehab /*
3695399426caSMauro Carvalho Chehab  * Allocate and initialize the cx88 core struct.  One should hold the
3696399426caSMauro Carvalho Chehab  * devlist mutex before calling this.
3697399426caSMauro Carvalho Chehab  */
cx88_core_create(struct pci_dev * pci,int nr)3698bbc83597STrent Piepho struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
3699bbc83597STrent Piepho {
3700bbc83597STrent Piepho 	struct cx88_core *core;
3701bbc83597STrent Piepho 	int i;
3702bbc83597STrent Piepho 
3703bbc83597STrent Piepho 	core = kzalloc(sizeof(*core), GFP_KERNEL);
3704399426caSMauro Carvalho Chehab 	if (!core)
3705fbc0ae20SAlan Cox 		return NULL;
3706bbc83597STrent Piepho 
3707a8d8e38aSElena Reshetova 	refcount_set(&core->refcount, 1);
3708bbc83597STrent Piepho 	core->pci_bus  = pci->bus->number;
3709bbc83597STrent Piepho 	core->pci_slot = PCI_SLOT(pci->devfn);
37108ddac9eeSTrent Piepho 	core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |
37118ddac9eeSTrent Piepho 			    PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |
37128ddac9eeSTrent Piepho 			    PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;
3713bbc83597STrent Piepho 	mutex_init(&core->lock);
3714bbc83597STrent Piepho 
3715bbc83597STrent Piepho 	core->nr = nr;
3716bbc83597STrent Piepho 	sprintf(core->name, "cx88[%d]", core->nr);
37179467fe12SHans Verkuil 
37184e0973a9SDevin Heitmueller 	/*
37194e0973a9SDevin Heitmueller 	 * Note: Setting initial standard here would cause first call to
37204e0973a9SDevin Heitmueller 	 * cx88_set_tvnorm() to return without programming any registers.  Leave
37214e0973a9SDevin Heitmueller 	 * it blank for at this point and it will get set later in
37224e0973a9SDevin Heitmueller 	 * cx8800_initdev()
37234e0973a9SDevin Heitmueller 	 */
37244e0973a9SDevin Heitmueller 	core->tvnorm  = 0;
37254e0973a9SDevin Heitmueller 
3726ccd6f1d4SHans Verkuil 	core->width   = 320;
3727ccd6f1d4SHans Verkuil 	core->height  = 240;
3728ccd6f1d4SHans Verkuil 	core->field   = V4L2_FIELD_INTERLACED;
3729ccd6f1d4SHans Verkuil 
3730cc1e6315SMauro Carvalho Chehab 	strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name));
37319467fe12SHans Verkuil 	if (v4l2_device_register(NULL, &core->v4l2_dev)) {
37329467fe12SHans Verkuil 		kfree(core);
37339467fe12SHans Verkuil 		return NULL;
37349467fe12SHans Verkuil 	}
37359467fe12SHans Verkuil 
37368c7cb12aSHans Verkuil 	if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) {
37378c7cb12aSHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
37388c7cb12aSHans Verkuil 		kfree(core);
37398c7cb12aSHans Verkuil 		return NULL;
37408c7cb12aSHans Verkuil 	}
37418c7cb12aSHans Verkuil 
37428c7cb12aSHans Verkuil 	if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) {
37438c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->video_hdl);
3744bac63981SHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
3745bac63981SHans Verkuil 		kfree(core);
3746bac63981SHans Verkuil 		return NULL;
3747bac63981SHans Verkuil 	}
3748bac63981SHans Verkuil 
37497b61ba8fSMauro Carvalho Chehab 	if (cx88_get_resources(core, pci) != 0) {
37508c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->video_hdl);
37518c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->audio_hdl);
37529467fe12SHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
3753bbc83597STrent Piepho 		kfree(core);
3754bbc83597STrent Piepho 		return NULL;
3755bbc83597STrent Piepho 	}
3756bbc83597STrent Piepho 
3757bbc83597STrent Piepho 	/* PCI stuff */
3758bbc83597STrent Piepho 	cx88_pci_quirks(core->name, pci);
3759bbc83597STrent Piepho 	core->lmmio = ioremap(pci_resource_start(pci, 0),
3760bbc83597STrent Piepho 			      pci_resource_len(pci, 0));
3761bbc83597STrent Piepho 	core->bmmio = (u8 __iomem *)core->lmmio;
3762bbc83597STrent Piepho 
3763399426caSMauro Carvalho Chehab 	if (!core->lmmio) {
3764bac63981SHans Verkuil 		release_mem_region(pci_resource_start(pci, 0),
3765bac63981SHans Verkuil 				   pci_resource_len(pci, 0));
37668c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->video_hdl);
37678c7cb12aSHans Verkuil 		v4l2_ctrl_handler_free(&core->audio_hdl);
3768bac63981SHans Verkuil 		v4l2_device_unregister(&core->v4l2_dev);
3769fbc0ae20SAlan Cox 		kfree(core);
3770fbc0ae20SAlan Cox 		return NULL;
3771fbc0ae20SAlan Cox 	}
3772fbc0ae20SAlan Cox 
3773bbc83597STrent Piepho 	/* board config */
3774bbc83597STrent Piepho 	core->boardnr = UNSET;
3775bbc83597STrent Piepho 	if (card[core->nr] < ARRAY_SIZE(cx88_boards))
3776bbc83597STrent Piepho 		core->boardnr = card[core->nr];
3777399426caSMauro Carvalho Chehab 	for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++)
3778bbc83597STrent Piepho 		if (pci->subsystem_vendor == cx88_subids[i].subvendor &&
3779bbc83597STrent Piepho 		    pci->subsystem_device == cx88_subids[i].subdevice)
3780bbc83597STrent Piepho 			core->boardnr = cx88_subids[i].card;
37817b61ba8fSMauro Carvalho Chehab 	if (core->boardnr == UNSET) {
3782bbc83597STrent Piepho 		core->boardnr = CX88_BOARD_UNKNOWN;
3783bbc83597STrent Piepho 		cx88_card_list(core, pci);
3784bbc83597STrent Piepho 	}
3785bbc83597STrent Piepho 
3786b5237747SEzequiel Garcia 	core->board = cx88_boards[core->boardnr];
3787bbc83597STrent Piepho 
37883007703dSMauro Carvalho Chehab 	if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
3789363c35fcSSteven Toth 		core->board.num_frontends = 1;
3790363c35fcSSteven Toth 
379165bc2fe8SMauro Carvalho Chehab 	pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
37920f19e65bSMauro Carvalho Chehab 		pci->subsystem_vendor, pci->subsystem_device, core->board.name,
3793bbc83597STrent Piepho 		core->boardnr, card[core->nr] == core->boardnr ?
3794363c35fcSSteven Toth 		"insmod option" : "autodetected",
3795363c35fcSSteven Toth 		core->board.num_frontends);
3796bbc83597STrent Piepho 
3797bbc83597STrent Piepho 	if (tuner[core->nr] != UNSET)
3798bbc83597STrent Piepho 		core->board.tuner_type = tuner[core->nr];
3799bbc83597STrent Piepho 	if (radio[core->nr] != UNSET)
3800bbc83597STrent Piepho 		core->board.radio_type = radio[core->nr];
3801bbc83597STrent Piepho 
380202615ed5SMauro Carvalho Chehab 	dprintk(1, "TV tuner type %d, Radio tuner type %d\n",
38030f19e65bSMauro Carvalho Chehab 		core->board.tuner_type, core->board.radio_type);
3804bbc83597STrent Piepho 
3805bbc83597STrent Piepho 	/* init hardware */
3806bbc83597STrent Piepho 	cx88_reset(core);
3807bbc83597STrent Piepho 	cx88_card_setup_pre_i2c(core);
3808bbc83597STrent Piepho 	cx88_i2c_init(core, pci);
3809189bf5f0SMauro Carvalho Chehab 
3810189bf5f0SMauro Carvalho Chehab 	/* load tuner module, if needed */
38117b61ba8fSMauro Carvalho Chehab 	if (core->board.tuner_type != UNSET) {
3812399426caSMauro Carvalho Chehab 		/*
3813399426caSMauro Carvalho Chehab 		 * Ignore 0x6b and 0x6f on cx88 boards.
381443d5eab7SHans Verkuil 		 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
3815399426caSMauro Carvalho Chehab 		 * and an RTC at 0x6f which can get corrupted if probed.
3816399426caSMauro Carvalho Chehab 		 */
381743d5eab7SHans Verkuil 		static const unsigned short tv_addrs[] = {
381843d5eab7SHans Verkuil 			0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
381943d5eab7SHans Verkuil 			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
382043d5eab7SHans Verkuil 			0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,
382143d5eab7SHans Verkuil 			I2C_CLIENT_END
382243d5eab7SHans Verkuil 		};
3823b8341e1dSHans Verkuil 		int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);
3824b8341e1dSHans Verkuil 
3825399426caSMauro Carvalho Chehab 		/*
3826399426caSMauro Carvalho Chehab 		 * I don't trust the radio_type as is stored in the card
3827399426caSMauro Carvalho Chehab 		 * definitions, so we just probe for it.
3828399426caSMauro Carvalho Chehab 		 * The radio_type is sometimes missing, or set to UNSET but
3829399426caSMauro Carvalho Chehab 		 * later code configures a tea5767.
3830b8341e1dSHans Verkuil 		 */
383153dacb15SHans Verkuil 		v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
3832399426caSMauro Carvalho Chehab 				    "tuner", 0,
3833399426caSMauro Carvalho Chehab 				    v4l2_i2c_tuner_addrs(ADDRS_RADIO));
3834b8341e1dSHans Verkuil 		if (has_demod)
383553dacb15SHans Verkuil 			v4l2_i2c_new_subdev(&core->v4l2_dev,
38369a1f8b34SLaurent Pinchart 					    &core->i2c_adap, "tuner",
383753dacb15SHans Verkuil 				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
3838b8341e1dSHans Verkuil 		if (core->board.tuner_addr == ADDR_UNSET) {
383953dacb15SHans Verkuil 			v4l2_i2c_new_subdev(&core->v4l2_dev,
38409a1f8b34SLaurent Pinchart 					    &core->i2c_adap, "tuner",
384153dacb15SHans Verkuil 				0, has_demod ? tv_addrs + 4 : tv_addrs);
3842b8341e1dSHans Verkuil 		} else {
3843e6574f2fSHans Verkuil 			v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
3844399426caSMauro Carvalho Chehab 					    "tuner", core->board.tuner_addr,
3845399426caSMauro Carvalho Chehab 					    NULL);
3846b8341e1dSHans Verkuil 		}
3847b8341e1dSHans Verkuil 	}
3848189bf5f0SMauro Carvalho Chehab 
3849bbc83597STrent Piepho 	cx88_card_setup(core);
385089c3bc78SJean Delvare 	if (!disable_ir) {
385115ceb6b1SJean Delvare 		cx88_i2c_init_ir(core);
3852bbc83597STrent Piepho 		cx88_ir_init(core, pci);
385389c3bc78SJean Delvare 	}
3854bbc83597STrent Piepho 
3855bbc83597STrent Piepho 	return core;
3856bbc83597STrent Piepho }
3857