18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * device driver for Conexant 2388x based TV cards
48c2ecf20Sopenharmony_ci * card-specific stuff.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include "cx88.h"
108c2ecf20Sopenharmony_ci#include "tea5767.h"
118c2ecf20Sopenharmony_ci#include "xc4000.h"
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/init.h>
148c2ecf20Sopenharmony_ci#include <linux/module.h>
158c2ecf20Sopenharmony_ci#include <linux/pci.h>
168c2ecf20Sopenharmony_ci#include <linux/delay.h>
178c2ecf20Sopenharmony_ci#include <linux/slab.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_cistatic unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
208c2ecf20Sopenharmony_cistatic unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
218c2ecf20Sopenharmony_cistatic unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cimodule_param_array(tuner, int, NULL, 0444);
248c2ecf20Sopenharmony_cimodule_param_array(radio, int, NULL, 0444);
258c2ecf20Sopenharmony_cimodule_param_array(card,  int, NULL, 0444);
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ciMODULE_PARM_DESC(tuner, "tuner type");
288c2ecf20Sopenharmony_ciMODULE_PARM_DESC(radio, "radio tuner type");
298c2ecf20Sopenharmony_ciMODULE_PARM_DESC(card, "card type");
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic unsigned int latency = UNSET;
328c2ecf20Sopenharmony_cimodule_param(latency, int, 0444);
338c2ecf20Sopenharmony_ciMODULE_PARM_DESC(latency, "pci latency timer");
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic int disable_ir;
368c2ecf20Sopenharmony_cimodule_param(disable_ir, int, 0444);
378c2ecf20Sopenharmony_ciMODULE_PARM_DESC(disable_ir, "Disable IR support");
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define dprintk(level, fmt, arg...)	do {				\
408c2ecf20Sopenharmony_ci	if (cx88_core_debug >= level)					\
418c2ecf20Sopenharmony_ci		printk(KERN_DEBUG pr_fmt("%s: core:" fmt),		\
428c2ecf20Sopenharmony_ci			__func__, ##arg);				\
438c2ecf20Sopenharmony_ci} while (0)
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci/* ------------------------------------------------------------------ */
468c2ecf20Sopenharmony_ci/* board config info                                                  */
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci/* If radio_type !=UNSET, radio_addr should be specified
498c2ecf20Sopenharmony_ci */
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic const struct cx88_board cx88_boards[] = {
528c2ecf20Sopenharmony_ci	[CX88_BOARD_UNKNOWN] = {
538c2ecf20Sopenharmony_ci		.name		= "UNKNOWN/GENERIC",
548c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
558c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
568c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
578c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
588c2ecf20Sopenharmony_ci		.input          = { {
598c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
608c2ecf20Sopenharmony_ci			.vmux   = 0,
618c2ecf20Sopenharmony_ci		}, {
628c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE2,
638c2ecf20Sopenharmony_ci			.vmux   = 1,
648c2ecf20Sopenharmony_ci		}, {
658c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE3,
668c2ecf20Sopenharmony_ci			.vmux   = 2,
678c2ecf20Sopenharmony_ci		}, {
688c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE4,
698c2ecf20Sopenharmony_ci			.vmux   = 3,
708c2ecf20Sopenharmony_ci		} },
718c2ecf20Sopenharmony_ci	},
728c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE] = {
738c2ecf20Sopenharmony_ci		.name		= "Hauppauge WinTV 34xxx models",
748c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
758c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
768c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
778c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
788c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
798c2ecf20Sopenharmony_ci		.input          = { {
808c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
818c2ecf20Sopenharmony_ci			.vmux   = 0,
828c2ecf20Sopenharmony_ci			.gpio0  = 0xff00,  // internal decoder
838c2ecf20Sopenharmony_ci		}, {
848c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
858c2ecf20Sopenharmony_ci			.vmux   = 0,
868c2ecf20Sopenharmony_ci			.gpio0  = 0xff01,  // mono from tuner chip
878c2ecf20Sopenharmony_ci		}, {
888c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
898c2ecf20Sopenharmony_ci			.vmux   = 1,
908c2ecf20Sopenharmony_ci			.gpio0  = 0xff02,
918c2ecf20Sopenharmony_ci		}, {
928c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
938c2ecf20Sopenharmony_ci			.vmux   = 2,
948c2ecf20Sopenharmony_ci			.gpio0  = 0xff02,
958c2ecf20Sopenharmony_ci		} },
968c2ecf20Sopenharmony_ci		.radio = {
978c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
988c2ecf20Sopenharmony_ci			.gpio0  = 0xff01,
998c2ecf20Sopenharmony_ci		},
1008c2ecf20Sopenharmony_ci	},
1018c2ecf20Sopenharmony_ci	[CX88_BOARD_GDI] = {
1028c2ecf20Sopenharmony_ci		.name		= "GDI Black Gold",
1038c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
1048c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
1058c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
1068c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
1078c2ecf20Sopenharmony_ci		.input          = { {
1088c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
1098c2ecf20Sopenharmony_ci			.vmux   = 0,
1108c2ecf20Sopenharmony_ci		}, {
1118c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
1128c2ecf20Sopenharmony_ci			.vmux   = 2,
1138c2ecf20Sopenharmony_ci		} },
1148c2ecf20Sopenharmony_ci	},
1158c2ecf20Sopenharmony_ci	[CX88_BOARD_PIXELVIEW] = {
1168c2ecf20Sopenharmony_ci		.name           = "PixelView",
1178c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
1188c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
1198c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
1208c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
1218c2ecf20Sopenharmony_ci		.input          = { {
1228c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
1238c2ecf20Sopenharmony_ci			.vmux   = 0,
1248c2ecf20Sopenharmony_ci			.gpio0  = 0xff00,  // internal decoder
1258c2ecf20Sopenharmony_ci		}, {
1268c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
1278c2ecf20Sopenharmony_ci			.vmux   = 1,
1288c2ecf20Sopenharmony_ci		}, {
1298c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
1308c2ecf20Sopenharmony_ci			.vmux   = 2,
1318c2ecf20Sopenharmony_ci		} },
1328c2ecf20Sopenharmony_ci		.radio = {
1338c2ecf20Sopenharmony_ci			 .type  = CX88_RADIO,
1348c2ecf20Sopenharmony_ci			 .gpio0 = 0xff10,
1358c2ecf20Sopenharmony_ci		},
1368c2ecf20Sopenharmony_ci	},
1378c2ecf20Sopenharmony_ci	[CX88_BOARD_ATI_WONDER_PRO] = {
1388c2ecf20Sopenharmony_ci		.name           = "ATI TV Wonder Pro",
1398c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_4IN1,
1408c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
1418c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
1428c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
1438c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
1448c2ecf20Sopenharmony_ci		.input          = { {
1458c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
1468c2ecf20Sopenharmony_ci			.vmux   = 0,
1478c2ecf20Sopenharmony_ci			.gpio0  = 0x03ff,
1488c2ecf20Sopenharmony_ci		}, {
1498c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
1508c2ecf20Sopenharmony_ci			.vmux   = 1,
1518c2ecf20Sopenharmony_ci			.gpio0  = 0x03fe,
1528c2ecf20Sopenharmony_ci		}, {
1538c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
1548c2ecf20Sopenharmony_ci			.vmux   = 2,
1558c2ecf20Sopenharmony_ci			.gpio0  = 0x03fe,
1568c2ecf20Sopenharmony_ci		} },
1578c2ecf20Sopenharmony_ci	},
1588c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST2000XP_EXPERT] = {
1598c2ecf20Sopenharmony_ci		.name           = "Leadtek Winfast 2000XP Expert",
1608c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_4IN1,
1618c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
1628c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
1638c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
1648c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
1658c2ecf20Sopenharmony_ci		.input          = { {
1668c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
1678c2ecf20Sopenharmony_ci			.vmux   = 0,
1688c2ecf20Sopenharmony_ci			.gpio0	= 0x00F5e700,
1698c2ecf20Sopenharmony_ci			.gpio1  = 0x00003004,
1708c2ecf20Sopenharmony_ci			.gpio2  = 0x00F5e700,
1718c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
1728c2ecf20Sopenharmony_ci		}, {
1738c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
1748c2ecf20Sopenharmony_ci			.vmux   = 1,
1758c2ecf20Sopenharmony_ci			.gpio0	= 0x00F5c700,
1768c2ecf20Sopenharmony_ci			.gpio1  = 0x00003004,
1778c2ecf20Sopenharmony_ci			.gpio2  = 0x00F5c700,
1788c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
1798c2ecf20Sopenharmony_ci		}, {
1808c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
1818c2ecf20Sopenharmony_ci			.vmux   = 2,
1828c2ecf20Sopenharmony_ci			.gpio0	= 0x00F5c700,
1838c2ecf20Sopenharmony_ci			.gpio1  = 0x00003004,
1848c2ecf20Sopenharmony_ci			.gpio2  = 0x00F5c700,
1858c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
1868c2ecf20Sopenharmony_ci		} },
1878c2ecf20Sopenharmony_ci		.radio = {
1888c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
1898c2ecf20Sopenharmony_ci			.gpio0	= 0x00F5d700,
1908c2ecf20Sopenharmony_ci			.gpio1  = 0x00003004,
1918c2ecf20Sopenharmony_ci			.gpio2  = 0x00F5d700,
1928c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
1938c2ecf20Sopenharmony_ci		},
1948c2ecf20Sopenharmony_ci	},
1958c2ecf20Sopenharmony_ci	[CX88_BOARD_AVERTV_STUDIO_303] = {
1968c2ecf20Sopenharmony_ci		.name           = "AverTV Studio 303 (M126)",
1978c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
1988c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
1998c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
2008c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
2018c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
2028c2ecf20Sopenharmony_ci		.input          = { {
2038c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
2048c2ecf20Sopenharmony_ci			.vmux   = 0,
2058c2ecf20Sopenharmony_ci			.gpio1  = 0xe09f,
2068c2ecf20Sopenharmony_ci		}, {
2078c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
2088c2ecf20Sopenharmony_ci			.vmux   = 1,
2098c2ecf20Sopenharmony_ci			.gpio1  = 0xe05f,
2108c2ecf20Sopenharmony_ci		}, {
2118c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
2128c2ecf20Sopenharmony_ci			.vmux   = 2,
2138c2ecf20Sopenharmony_ci			.gpio1  = 0xe05f,
2148c2ecf20Sopenharmony_ci		} },
2158c2ecf20Sopenharmony_ci		.radio = {
2168c2ecf20Sopenharmony_ci			.gpio1  = 0xe0df,
2178c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
2188c2ecf20Sopenharmony_ci		},
2198c2ecf20Sopenharmony_ci	},
2208c2ecf20Sopenharmony_ci	[CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
2218c2ecf20Sopenharmony_ci		// added gpio values thanks to Michal
2228c2ecf20Sopenharmony_ci		// values for PAL from DScaler
2238c2ecf20Sopenharmony_ci		.name           = "MSI TV-@nywhere Master",
2248c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_MT2032,
2258c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
2268c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
2278c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
2288c2ecf20Sopenharmony_ci		.tda9887_conf	= TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
2298c2ecf20Sopenharmony_ci		.input          = { {
2308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
2318c2ecf20Sopenharmony_ci			.vmux   = 0,
2328c2ecf20Sopenharmony_ci			.gpio0  = 0x000040bf,
2338c2ecf20Sopenharmony_ci			.gpio1  = 0x000080c0,
2348c2ecf20Sopenharmony_ci			.gpio2  = 0x0000ff40,
2358c2ecf20Sopenharmony_ci		}, {
2368c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
2378c2ecf20Sopenharmony_ci			.vmux   = 1,
2388c2ecf20Sopenharmony_ci			.gpio0  = 0x000040bf,
2398c2ecf20Sopenharmony_ci			.gpio1  = 0x000080c0,
2408c2ecf20Sopenharmony_ci			.gpio2  = 0x0000ff40,
2418c2ecf20Sopenharmony_ci		}, {
2428c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
2438c2ecf20Sopenharmony_ci			.vmux   = 2,
2448c2ecf20Sopenharmony_ci			.gpio0  = 0x000040bf,
2458c2ecf20Sopenharmony_ci			.gpio1  = 0x000080c0,
2468c2ecf20Sopenharmony_ci			.gpio2  = 0x0000ff40,
2478c2ecf20Sopenharmony_ci		} },
2488c2ecf20Sopenharmony_ci		.radio = {
2498c2ecf20Sopenharmony_ci			 .type   = CX88_RADIO,
2508c2ecf20Sopenharmony_ci			 .vmux   = 3,
2518c2ecf20Sopenharmony_ci			 .gpio0  = 0x000040bf,
2528c2ecf20Sopenharmony_ci			 .gpio1  = 0x000080c0,
2538c2ecf20Sopenharmony_ci			 .gpio2  = 0x0000ff20,
2548c2ecf20Sopenharmony_ci		},
2558c2ecf20Sopenharmony_ci	},
2568c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DV2000] = {
2578c2ecf20Sopenharmony_ci		.name           = "Leadtek Winfast DV2000",
2588c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
2598c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
2608c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
2618c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
2628c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
2638c2ecf20Sopenharmony_ci		.input          = { {
2648c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
2658c2ecf20Sopenharmony_ci			.vmux   = 0,
2668c2ecf20Sopenharmony_ci			.gpio0  = 0x0035e700,
2678c2ecf20Sopenharmony_ci			.gpio1  = 0x00003004,
2688c2ecf20Sopenharmony_ci			.gpio2  = 0x0035e700,
2698c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
2708c2ecf20Sopenharmony_ci		}, {
2718c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
2728c2ecf20Sopenharmony_ci			.vmux   = 1,
2738c2ecf20Sopenharmony_ci			.gpio0  = 0x0035c700,
2748c2ecf20Sopenharmony_ci			.gpio1  = 0x00003004,
2758c2ecf20Sopenharmony_ci			.gpio2  = 0x0035c700,
2768c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
2778c2ecf20Sopenharmony_ci		}, {
2788c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
2798c2ecf20Sopenharmony_ci			.vmux   = 2,
2808c2ecf20Sopenharmony_ci			.gpio0  = 0x0035c700,
2818c2ecf20Sopenharmony_ci			.gpio1  = 0x0035c700,
2828c2ecf20Sopenharmony_ci			.gpio2  = 0x02000000,
2838c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
2848c2ecf20Sopenharmony_ci		} },
2858c2ecf20Sopenharmony_ci		.radio = {
2868c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
2878c2ecf20Sopenharmony_ci			.gpio0  = 0x0035d700,
2888c2ecf20Sopenharmony_ci			.gpio1  = 0x00007004,
2898c2ecf20Sopenharmony_ci			.gpio2  = 0x0035d700,
2908c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
2918c2ecf20Sopenharmony_ci		},
2928c2ecf20Sopenharmony_ci	},
2938c2ecf20Sopenharmony_ci	[CX88_BOARD_LEADTEK_PVR2000] = {
2948c2ecf20Sopenharmony_ci		// gpio values for PAL version from regspy by DScaler
2958c2ecf20Sopenharmony_ci		.name           = "Leadtek PVR 2000",
2968c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
2978c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
2988c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
2998c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
3008c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
3018c2ecf20Sopenharmony_ci		.input          = { {
3028c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
3038c2ecf20Sopenharmony_ci			.vmux   = 0,
3048c2ecf20Sopenharmony_ci			.gpio0  = 0x0000bde2,
3058c2ecf20Sopenharmony_ci			.audioroute = 1,
3068c2ecf20Sopenharmony_ci		}, {
3078c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
3088c2ecf20Sopenharmony_ci			.vmux   = 1,
3098c2ecf20Sopenharmony_ci			.gpio0  = 0x0000bde6,
3108c2ecf20Sopenharmony_ci			.audioroute = 1,
3118c2ecf20Sopenharmony_ci		}, {
3128c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
3138c2ecf20Sopenharmony_ci			.vmux   = 2,
3148c2ecf20Sopenharmony_ci			.gpio0  = 0x0000bde6,
3158c2ecf20Sopenharmony_ci			.audioroute = 1,
3168c2ecf20Sopenharmony_ci		} },
3178c2ecf20Sopenharmony_ci		.radio = {
3188c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
3198c2ecf20Sopenharmony_ci			.gpio0  = 0x0000bd62,
3208c2ecf20Sopenharmony_ci			.audioroute = 1,
3218c2ecf20Sopenharmony_ci		},
3228c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
3238c2ecf20Sopenharmony_ci	},
3248c2ecf20Sopenharmony_ci	[CX88_BOARD_IODATA_GVVCP3PCI] = {
3258c2ecf20Sopenharmony_ci		.name		= "IODATA GV-VCP3/PCI",
3268c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
3278c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
3288c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
3298c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
3308c2ecf20Sopenharmony_ci		.input          = { {
3318c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
3328c2ecf20Sopenharmony_ci			.vmux   = 0,
3338c2ecf20Sopenharmony_ci		}, {
3348c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE2,
3358c2ecf20Sopenharmony_ci			.vmux   = 1,
3368c2ecf20Sopenharmony_ci		}, {
3378c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
3388c2ecf20Sopenharmony_ci			.vmux   = 2,
3398c2ecf20Sopenharmony_ci		} },
3408c2ecf20Sopenharmony_ci	},
3418c2ecf20Sopenharmony_ci	[CX88_BOARD_PROLINK_PLAYTVPVR] = {
3428c2ecf20Sopenharmony_ci		.name           = "Prolink PlayTV PVR",
3438c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
3448c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
3458c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
3468c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
3478c2ecf20Sopenharmony_ci		.tda9887_conf	= TDA9887_PRESENT,
3488c2ecf20Sopenharmony_ci		.input          = { {
3498c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
3508c2ecf20Sopenharmony_ci			.vmux   = 0,
3518c2ecf20Sopenharmony_ci			.gpio0  = 0xbff0,
3528c2ecf20Sopenharmony_ci		}, {
3538c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
3548c2ecf20Sopenharmony_ci			.vmux   = 1,
3558c2ecf20Sopenharmony_ci			.gpio0  = 0xbff3,
3568c2ecf20Sopenharmony_ci		}, {
3578c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
3588c2ecf20Sopenharmony_ci			.vmux   = 2,
3598c2ecf20Sopenharmony_ci			.gpio0  = 0xbff3,
3608c2ecf20Sopenharmony_ci		} },
3618c2ecf20Sopenharmony_ci		.radio = {
3628c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
3638c2ecf20Sopenharmony_ci			.gpio0  = 0xbff0,
3648c2ecf20Sopenharmony_ci		},
3658c2ecf20Sopenharmony_ci	},
3668c2ecf20Sopenharmony_ci	[CX88_BOARD_ASUS_PVR_416] = {
3678c2ecf20Sopenharmony_ci		.name		= "ASUS PVR-416",
3688c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
3698c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
3708c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
3718c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
3728c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
3738c2ecf20Sopenharmony_ci		.input          = { {
3748c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
3758c2ecf20Sopenharmony_ci			.vmux   = 0,
3768c2ecf20Sopenharmony_ci			.gpio0  = 0x0000fde6,
3778c2ecf20Sopenharmony_ci		}, {
3788c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
3798c2ecf20Sopenharmony_ci			.vmux   = 2,
3808c2ecf20Sopenharmony_ci			.gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
3818c2ecf20Sopenharmony_ci			.audioroute = 1,
3828c2ecf20Sopenharmony_ci		} },
3838c2ecf20Sopenharmony_ci		.radio = {
3848c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
3858c2ecf20Sopenharmony_ci			.gpio0  = 0x0000fde2,
3868c2ecf20Sopenharmony_ci		},
3878c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
3888c2ecf20Sopenharmony_ci	},
3898c2ecf20Sopenharmony_ci	[CX88_BOARD_MSI_TVANYWHERE] = {
3908c2ecf20Sopenharmony_ci		.name           = "MSI TV-@nywhere",
3918c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_MT2032,
3928c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
3938c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
3948c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
3958c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
3968c2ecf20Sopenharmony_ci		.input          = { {
3978c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
3988c2ecf20Sopenharmony_ci			.vmux   = 0,
3998c2ecf20Sopenharmony_ci			.gpio0  = 0x00000fbf,
4008c2ecf20Sopenharmony_ci			.gpio2  = 0x0000fc08,
4018c2ecf20Sopenharmony_ci		}, {
4028c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
4038c2ecf20Sopenharmony_ci			.vmux   = 1,
4048c2ecf20Sopenharmony_ci			.gpio0  = 0x00000fbf,
4058c2ecf20Sopenharmony_ci			.gpio2  = 0x0000fc68,
4068c2ecf20Sopenharmony_ci		}, {
4078c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
4088c2ecf20Sopenharmony_ci			.vmux   = 2,
4098c2ecf20Sopenharmony_ci			.gpio0  = 0x00000fbf,
4108c2ecf20Sopenharmony_ci			.gpio2  = 0x0000fc68,
4118c2ecf20Sopenharmony_ci		} },
4128c2ecf20Sopenharmony_ci	},
4138c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_DVB_T] = {
4148c2ecf20Sopenharmony_ci		.name           = "KWorld/VStream XPert DVB-T",
4158c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
4168c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
4178c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
4188c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
4198c2ecf20Sopenharmony_ci		.input          = { {
4208c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
4218c2ecf20Sopenharmony_ci			.vmux   = 1,
4228c2ecf20Sopenharmony_ci			.gpio0  = 0x0700,
4238c2ecf20Sopenharmony_ci			.gpio2  = 0x0101,
4248c2ecf20Sopenharmony_ci		}, {
4258c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
4268c2ecf20Sopenharmony_ci			.vmux   = 2,
4278c2ecf20Sopenharmony_ci			.gpio0  = 0x0700,
4288c2ecf20Sopenharmony_ci			.gpio2  = 0x0101,
4298c2ecf20Sopenharmony_ci		} },
4308c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
4318c2ecf20Sopenharmony_ci	},
4328c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
4338c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T1",
4348c2ecf20Sopenharmony_ci		.tuner_type     = UNSET, /* No analog tuner */
4358c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
4368c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
4378c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
4388c2ecf20Sopenharmony_ci		.input          = { {
4398c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
4408c2ecf20Sopenharmony_ci			.vmux   = 1,
4418c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df,
4428c2ecf20Sopenharmony_ci		}, {
4438c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
4448c2ecf20Sopenharmony_ci			.vmux   = 2,
4458c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df,
4468c2ecf20Sopenharmony_ci		} },
4478c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
4488c2ecf20Sopenharmony_ci	},
4498c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_LTV883] = {
4508c2ecf20Sopenharmony_ci		.name           = "KWorld LTV883RF",
4518c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_TNF_8831BGFF,
4528c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
4538c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
4548c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
4558c2ecf20Sopenharmony_ci		.input          = { {
4568c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
4578c2ecf20Sopenharmony_ci			.vmux   = 0,
4588c2ecf20Sopenharmony_ci			.gpio0  = 0x07f8,
4598c2ecf20Sopenharmony_ci		}, {
4608c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
4618c2ecf20Sopenharmony_ci			.vmux   = 0,
4628c2ecf20Sopenharmony_ci			.gpio0  = 0x07f9,  // mono from tuner chip
4638c2ecf20Sopenharmony_ci		}, {
4648c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
4658c2ecf20Sopenharmony_ci			.vmux   = 1,
4668c2ecf20Sopenharmony_ci			.gpio0  = 0x000007fa,
4678c2ecf20Sopenharmony_ci		}, {
4688c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
4698c2ecf20Sopenharmony_ci			.vmux   = 2,
4708c2ecf20Sopenharmony_ci			.gpio0  = 0x000007fa,
4718c2ecf20Sopenharmony_ci		} },
4728c2ecf20Sopenharmony_ci		.radio = {
4738c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
4748c2ecf20Sopenharmony_ci			.gpio0  = 0x000007f8,
4758c2ecf20Sopenharmony_ci		},
4768c2ecf20Sopenharmony_ci	},
4778c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
4788c2ecf20Sopenharmony_ci		.name		= "DViCO FusionHDTV 3 Gold-Q",
4798c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_MICROTUNE_4042FI5,
4808c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
4818c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
4828c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
4838c2ecf20Sopenharmony_ci		/*
4848c2ecf20Sopenharmony_ci		 * GPIO[0] resets DT3302 DTV receiver
4858c2ecf20Sopenharmony_ci		 *     0 - reset asserted
4868c2ecf20Sopenharmony_ci		 *     1 - normal operation
4878c2ecf20Sopenharmony_ci		 * GPIO[1] mutes analog audio output connector
4888c2ecf20Sopenharmony_ci		 *     0 - enable selected source
4898c2ecf20Sopenharmony_ci		 *     1 - mute
4908c2ecf20Sopenharmony_ci		 * GPIO[2] selects source for analog audio output connector
4918c2ecf20Sopenharmony_ci		 *     0 - analog audio input connector on tab
4928c2ecf20Sopenharmony_ci		 *     1 - analog DAC output from CX23881 chip
4938c2ecf20Sopenharmony_ci		 * GPIO[3] selects RF input connector on tuner module
4948c2ecf20Sopenharmony_ci		 *     0 - RF connector labeled CABLE
4958c2ecf20Sopenharmony_ci		 *     1 - RF connector labeled ANT
4968c2ecf20Sopenharmony_ci		 * GPIO[4] selects high RF for QAM256 mode
4978c2ecf20Sopenharmony_ci		 *     0 - normal RF
4988c2ecf20Sopenharmony_ci		 *     1 - high RF
4998c2ecf20Sopenharmony_ci		 */
5008c2ecf20Sopenharmony_ci		.input          = { {
5018c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
5028c2ecf20Sopenharmony_ci			.vmux   = 0,
5038c2ecf20Sopenharmony_ci			.gpio0	= 0x0f0d,
5048c2ecf20Sopenharmony_ci		}, {
5058c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_CABLE,
5068c2ecf20Sopenharmony_ci			.vmux   = 0,
5078c2ecf20Sopenharmony_ci			.gpio0	= 0x0f05,
5088c2ecf20Sopenharmony_ci		}, {
5098c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
5108c2ecf20Sopenharmony_ci			.vmux   = 1,
5118c2ecf20Sopenharmony_ci			.gpio0	= 0x0f00,
5128c2ecf20Sopenharmony_ci		}, {
5138c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
5148c2ecf20Sopenharmony_ci			.vmux   = 2,
5158c2ecf20Sopenharmony_ci			.gpio0	= 0x0f00,
5168c2ecf20Sopenharmony_ci		} },
5178c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
5188c2ecf20Sopenharmony_ci	},
5198c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_DVB_T1] = {
5208c2ecf20Sopenharmony_ci		.name           = "Hauppauge Nova-T DVB-T",
5218c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
5228c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
5238c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5248c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5258c2ecf20Sopenharmony_ci		.input          = { {
5268c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
5278c2ecf20Sopenharmony_ci			.vmux   = 0,
5288c2ecf20Sopenharmony_ci		} },
5298c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
5308c2ecf20Sopenharmony_ci	},
5318c2ecf20Sopenharmony_ci	[CX88_BOARD_CONEXANT_DVB_T1] = {
5328c2ecf20Sopenharmony_ci		.name           = "Conexant DVB-T reference design",
5338c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
5348c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
5358c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5368c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5378c2ecf20Sopenharmony_ci		.input          = { {
5388c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
5398c2ecf20Sopenharmony_ci			.vmux   = 0,
5408c2ecf20Sopenharmony_ci		} },
5418c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
5428c2ecf20Sopenharmony_ci	},
5438c2ecf20Sopenharmony_ci	[CX88_BOARD_PROVIDEO_PV259] = {
5448c2ecf20Sopenharmony_ci		.name		= "Provideo PV259",
5458c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FQ1216ME,
5468c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
5478c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5488c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5498c2ecf20Sopenharmony_ci		.input          = { {
5508c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
5518c2ecf20Sopenharmony_ci			.vmux   = 0,
5528c2ecf20Sopenharmony_ci			.audioroute = 1,
5538c2ecf20Sopenharmony_ci		} },
5548c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
5558c2ecf20Sopenharmony_ci	},
5568c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
5578c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Plus",
5588c2ecf20Sopenharmony_ci		.tuner_type     = UNSET, /* No analog tuner */
5598c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
5608c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5618c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5628c2ecf20Sopenharmony_ci		.input          = { {
5638c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
5648c2ecf20Sopenharmony_ci			.vmux   = 1,
5658c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df,
5668c2ecf20Sopenharmony_ci		}, {
5678c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
5688c2ecf20Sopenharmony_ci			.vmux   = 2,
5698c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df,
5708c2ecf20Sopenharmony_ci		} },
5718c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
5728c2ecf20Sopenharmony_ci	},
5738c2ecf20Sopenharmony_ci	[CX88_BOARD_DNTV_LIVE_DVB_T] = {
5748c2ecf20Sopenharmony_ci		.name		= "digitalnow DNTV Live! DVB-T",
5758c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
5768c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
5778c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5788c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5798c2ecf20Sopenharmony_ci		.input		= { {
5808c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
5818c2ecf20Sopenharmony_ci			.vmux   = 1,
5828c2ecf20Sopenharmony_ci			.gpio0  = 0x00000700,
5838c2ecf20Sopenharmony_ci			.gpio2  = 0x00000101,
5848c2ecf20Sopenharmony_ci		}, {
5858c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
5868c2ecf20Sopenharmony_ci			.vmux   = 2,
5878c2ecf20Sopenharmony_ci			.gpio0  = 0x00000700,
5888c2ecf20Sopenharmony_ci			.gpio2  = 0x00000101,
5898c2ecf20Sopenharmony_ci		} },
5908c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
5918c2ecf20Sopenharmony_ci	},
5928c2ecf20Sopenharmony_ci	[CX88_BOARD_PCHDTV_HD3000] = {
5938c2ecf20Sopenharmony_ci		.name           = "pcHDTV HD3000 HDTV",
5948c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_THOMSON_DTT761X,
5958c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
5968c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5978c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5988c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
5998c2ecf20Sopenharmony_ci		/* GPIO[2] = audio source for analog audio out connector
6008c2ecf20Sopenharmony_ci		 *  0 = analog audio input connector
6018c2ecf20Sopenharmony_ci		 *  1 = CX88 audio DACs
6028c2ecf20Sopenharmony_ci		 *
6038c2ecf20Sopenharmony_ci		 * GPIO[7] = input to CX88's audio/chroma ADC
6048c2ecf20Sopenharmony_ci		 *  0 = FM 10.7 MHz IF
6058c2ecf20Sopenharmony_ci		 *  1 = Sound 4.5 MHz IF
6068c2ecf20Sopenharmony_ci		 *
6078c2ecf20Sopenharmony_ci		 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
6088c2ecf20Sopenharmony_ci		 *
6098c2ecf20Sopenharmony_ci		 * GPIO[16] = Remote control input
6108c2ecf20Sopenharmony_ci		 */
6118c2ecf20Sopenharmony_ci		.input          = { {
6128c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
6138c2ecf20Sopenharmony_ci			.vmux   = 0,
6148c2ecf20Sopenharmony_ci			.gpio0  = 0x00008484,
6158c2ecf20Sopenharmony_ci		}, {
6168c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
6178c2ecf20Sopenharmony_ci			.vmux   = 1,
6188c2ecf20Sopenharmony_ci			.gpio0  = 0x00008400,
6198c2ecf20Sopenharmony_ci		}, {
6208c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
6218c2ecf20Sopenharmony_ci			.vmux   = 2,
6228c2ecf20Sopenharmony_ci			.gpio0  = 0x00008400,
6238c2ecf20Sopenharmony_ci		} },
6248c2ecf20Sopenharmony_ci		.radio = {
6258c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
6268c2ecf20Sopenharmony_ci			.gpio0  = 0x00008404,
6278c2ecf20Sopenharmony_ci		},
6288c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
6298c2ecf20Sopenharmony_ci	},
6308c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_ROSLYN] = {
6318c2ecf20Sopenharmony_ci		// entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
6328c2ecf20Sopenharmony_ci		// GPIO values obtained from regspy, courtesy Sean Covel
6338c2ecf20Sopenharmony_ci		.name           = "Hauppauge WinTV 28xxx (Roslyn) models",
6348c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
6358c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
6368c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
6378c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
6388c2ecf20Sopenharmony_ci		.input          = { {
6398c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
6408c2ecf20Sopenharmony_ci			.vmux   = 0,
6418c2ecf20Sopenharmony_ci			.gpio0  = 0xed1a,
6428c2ecf20Sopenharmony_ci			.gpio2  = 0x00ff,
6438c2ecf20Sopenharmony_ci		}, {
6448c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
6458c2ecf20Sopenharmony_ci			.vmux   = 0,
6468c2ecf20Sopenharmony_ci			.gpio0  = 0xff01,
6478c2ecf20Sopenharmony_ci		}, {
6488c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
6498c2ecf20Sopenharmony_ci			.vmux   = 1,
6508c2ecf20Sopenharmony_ci			.gpio0  = 0xff02,
6518c2ecf20Sopenharmony_ci		}, {
6528c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
6538c2ecf20Sopenharmony_ci			.vmux   = 2,
6548c2ecf20Sopenharmony_ci			.gpio0  = 0xed92,
6558c2ecf20Sopenharmony_ci			.gpio2  = 0x00ff,
6568c2ecf20Sopenharmony_ci		} },
6578c2ecf20Sopenharmony_ci		.radio = {
6588c2ecf20Sopenharmony_ci			 .type   = CX88_RADIO,
6598c2ecf20Sopenharmony_ci			 .gpio0  = 0xed96,
6608c2ecf20Sopenharmony_ci			 .gpio2  = 0x00ff,
6618c2ecf20Sopenharmony_ci		 },
6628c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
6638c2ecf20Sopenharmony_ci	},
6648c2ecf20Sopenharmony_ci	[CX88_BOARD_DIGITALLOGIC_MEC] = {
6658c2ecf20Sopenharmony_ci		.name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
6668c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
6678c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
6688c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
6698c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
6708c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
6718c2ecf20Sopenharmony_ci		.input          = { {
6728c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
6738c2ecf20Sopenharmony_ci			.vmux   = 0,
6748c2ecf20Sopenharmony_ci			.gpio0  = 0x00009d80,
6758c2ecf20Sopenharmony_ci			.audioroute = 1,
6768c2ecf20Sopenharmony_ci		}, {
6778c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
6788c2ecf20Sopenharmony_ci			.vmux   = 1,
6798c2ecf20Sopenharmony_ci			.gpio0  = 0x00009d76,
6808c2ecf20Sopenharmony_ci			.audioroute = 1,
6818c2ecf20Sopenharmony_ci		}, {
6828c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
6838c2ecf20Sopenharmony_ci			.vmux   = 2,
6848c2ecf20Sopenharmony_ci			.gpio0  = 0x00009d76,
6858c2ecf20Sopenharmony_ci			.audioroute = 1,
6868c2ecf20Sopenharmony_ci		} },
6878c2ecf20Sopenharmony_ci		.radio = {
6888c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
6898c2ecf20Sopenharmony_ci			.gpio0  = 0x00009d00,
6908c2ecf20Sopenharmony_ci			.audioroute = 1,
6918c2ecf20Sopenharmony_ci		},
6928c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
6938c2ecf20Sopenharmony_ci	},
6948c2ecf20Sopenharmony_ci	[CX88_BOARD_IODATA_GVBCTV7E] = {
6958c2ecf20Sopenharmony_ci		.name           = "IODATA GV/BCTV7E",
6968c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FQ1286,
6978c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
6988c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
6998c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
7008c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
7018c2ecf20Sopenharmony_ci		.input          = { {
7028c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
7038c2ecf20Sopenharmony_ci			.vmux   = 1,
7048c2ecf20Sopenharmony_ci			.gpio1  = 0x0000e03f,
7058c2ecf20Sopenharmony_ci		}, {
7068c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
7078c2ecf20Sopenharmony_ci			.vmux   = 2,
7088c2ecf20Sopenharmony_ci			.gpio1  = 0x0000e07f,
7098c2ecf20Sopenharmony_ci		}, {
7108c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
7118c2ecf20Sopenharmony_ci			.vmux   = 3,
7128c2ecf20Sopenharmony_ci			.gpio1  = 0x0000e07f,
7138c2ecf20Sopenharmony_ci		} }
7148c2ecf20Sopenharmony_ci	},
7158c2ecf20Sopenharmony_ci	[CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
7168c2ecf20Sopenharmony_ci		.name           = "PixelView PlayTV Ultra Pro (Stereo)",
7178c2ecf20Sopenharmony_ci		/* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
7188c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
7198c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
7208c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
7218c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
7228c2ecf20Sopenharmony_ci		/*
7238c2ecf20Sopenharmony_ci		 * Some variants use a tda9874 and so need the
7248c2ecf20Sopenharmony_ci		 * tvaudio module.
7258c2ecf20Sopenharmony_ci		 */
7268c2ecf20Sopenharmony_ci		.audio_chip     = CX88_AUDIO_TVAUDIO,
7278c2ecf20Sopenharmony_ci		.input          = { {
7288c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
7298c2ecf20Sopenharmony_ci			.vmux   = 0,
7308c2ecf20Sopenharmony_ci			.gpio0  = 0xbf61,  /* internal decoder */
7318c2ecf20Sopenharmony_ci		}, {
7328c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
7338c2ecf20Sopenharmony_ci			.vmux   = 1,
7348c2ecf20Sopenharmony_ci			.gpio0	= 0xbf63,
7358c2ecf20Sopenharmony_ci		}, {
7368c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
7378c2ecf20Sopenharmony_ci			.vmux   = 2,
7388c2ecf20Sopenharmony_ci			.gpio0	= 0xbf63,
7398c2ecf20Sopenharmony_ci		} },
7408c2ecf20Sopenharmony_ci		.radio = {
7418c2ecf20Sopenharmony_ci			 .type  = CX88_RADIO,
7428c2ecf20Sopenharmony_ci			 .gpio0 = 0xbf60,
7438c2ecf20Sopenharmony_ci		 },
7448c2ecf20Sopenharmony_ci	},
7458c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
7468c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV 3 Gold-T",
7478c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_THOMSON_DTT761X,
7488c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
7498c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
7508c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
7518c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
7528c2ecf20Sopenharmony_ci		.input          = { {
7538c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
7548c2ecf20Sopenharmony_ci			.vmux   = 0,
7558c2ecf20Sopenharmony_ci			.gpio0  = 0x97ed,
7568c2ecf20Sopenharmony_ci		}, {
7578c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
7588c2ecf20Sopenharmony_ci			.vmux   = 1,
7598c2ecf20Sopenharmony_ci			.gpio0  = 0x97e9,
7608c2ecf20Sopenharmony_ci		}, {
7618c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
7628c2ecf20Sopenharmony_ci			.vmux   = 2,
7638c2ecf20Sopenharmony_ci			.gpio0  = 0x97e9,
7648c2ecf20Sopenharmony_ci		} },
7658c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
7668c2ecf20Sopenharmony_ci	},
7678c2ecf20Sopenharmony_ci	[CX88_BOARD_ADSTECH_DVB_T_PCI] = {
7688c2ecf20Sopenharmony_ci		.name           = "ADS Tech Instant TV DVB-T PCI",
7698c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
7708c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
7718c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
7728c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
7738c2ecf20Sopenharmony_ci		.input          = { {
7748c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
7758c2ecf20Sopenharmony_ci			.vmux   = 1,
7768c2ecf20Sopenharmony_ci			.gpio0  = 0x0700,
7778c2ecf20Sopenharmony_ci			.gpio2  = 0x0101,
7788c2ecf20Sopenharmony_ci		}, {
7798c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
7808c2ecf20Sopenharmony_ci			.vmux   = 2,
7818c2ecf20Sopenharmony_ci			.gpio0  = 0x0700,
7828c2ecf20Sopenharmony_ci			.gpio2  = 0x0101,
7838c2ecf20Sopenharmony_ci		} },
7848c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
7858c2ecf20Sopenharmony_ci	},
7868c2ecf20Sopenharmony_ci	[CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
7878c2ecf20Sopenharmony_ci		.name           = "TerraTec Cinergy 1400 DVB-T",
7888c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
7898c2ecf20Sopenharmony_ci		.input          = { {
7908c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
7918c2ecf20Sopenharmony_ci			.vmux   = 0,
7928c2ecf20Sopenharmony_ci		}, {
7938c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
7948c2ecf20Sopenharmony_ci			.vmux   = 2,
7958c2ecf20Sopenharmony_ci		}, {
7968c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
7978c2ecf20Sopenharmony_ci			.vmux   = 2,
7988c2ecf20Sopenharmony_ci		} },
7998c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
8008c2ecf20Sopenharmony_ci	},
8018c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
8028c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV 5 Gold",
8038c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
8048c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
8058c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
8068c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
8078c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
8088c2ecf20Sopenharmony_ci		.input          = { {
8098c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
8108c2ecf20Sopenharmony_ci			.vmux   = 0,
8118c2ecf20Sopenharmony_ci			.gpio0  = 0x87fd,
8128c2ecf20Sopenharmony_ci		}, {
8138c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
8148c2ecf20Sopenharmony_ci			.vmux   = 1,
8158c2ecf20Sopenharmony_ci			.gpio0  = 0x87f9,
8168c2ecf20Sopenharmony_ci		}, {
8178c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
8188c2ecf20Sopenharmony_ci			.vmux   = 2,
8198c2ecf20Sopenharmony_ci			.gpio0  = 0x87f9,
8208c2ecf20Sopenharmony_ci		} },
8218c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
8228c2ecf20Sopenharmony_ci	},
8238c2ecf20Sopenharmony_ci	[CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
8248c2ecf20Sopenharmony_ci		.name           = "AverMedia UltraTV Media Center PCI 550",
8258c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
8268c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
8278c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
8288c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
8298c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
8308c2ecf20Sopenharmony_ci		.input          = { {
8318c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
8328c2ecf20Sopenharmony_ci			.vmux   = 0,
8338c2ecf20Sopenharmony_ci			.gpio0  = 0x0000cd73,
8348c2ecf20Sopenharmony_ci			.audioroute = 1,
8358c2ecf20Sopenharmony_ci		}, {
8368c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
8378c2ecf20Sopenharmony_ci			.vmux   = 1,
8388c2ecf20Sopenharmony_ci			.gpio0  = 0x0000cd73,
8398c2ecf20Sopenharmony_ci			.audioroute = 1,
8408c2ecf20Sopenharmony_ci		}, {
8418c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
8428c2ecf20Sopenharmony_ci			.vmux   = 3,
8438c2ecf20Sopenharmony_ci			.gpio0  = 0x0000cdb3,
8448c2ecf20Sopenharmony_ci			.audioroute = 1,
8458c2ecf20Sopenharmony_ci		} },
8468c2ecf20Sopenharmony_ci		.radio = {
8478c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
8488c2ecf20Sopenharmony_ci			.vmux   = 2,
8498c2ecf20Sopenharmony_ci			.gpio0  = 0x0000cdf3,
8508c2ecf20Sopenharmony_ci			.audioroute = 1,
8518c2ecf20Sopenharmony_ci		},
8528c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
8538c2ecf20Sopenharmony_ci	},
8548c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
8558c2ecf20Sopenharmony_ci		 /* Alexander Wold <awold@bigfoot.com> */
8568c2ecf20Sopenharmony_ci		 .name           = "Kworld V-Stream Xpert DVD",
8578c2ecf20Sopenharmony_ci		 .tuner_type     = UNSET,
8588c2ecf20Sopenharmony_ci		 .input          = { {
8598c2ecf20Sopenharmony_ci			 .type   = CX88_VMUX_COMPOSITE1,
8608c2ecf20Sopenharmony_ci			 .vmux   = 1,
8618c2ecf20Sopenharmony_ci			 .gpio0  = 0x03000000,
8628c2ecf20Sopenharmony_ci			 .gpio1  = 0x01000000,
8638c2ecf20Sopenharmony_ci			 .gpio2  = 0x02000000,
8648c2ecf20Sopenharmony_ci			 .gpio3  = 0x00100000,
8658c2ecf20Sopenharmony_ci		 }, {
8668c2ecf20Sopenharmony_ci			 .type   = CX88_VMUX_SVIDEO,
8678c2ecf20Sopenharmony_ci			 .vmux   = 2,
8688c2ecf20Sopenharmony_ci			 .gpio0  = 0x03000000,
8698c2ecf20Sopenharmony_ci			 .gpio1  = 0x01000000,
8708c2ecf20Sopenharmony_ci			 .gpio2  = 0x02000000,
8718c2ecf20Sopenharmony_ci			 .gpio3  = 0x00100000,
8728c2ecf20Sopenharmony_ci		 } },
8738c2ecf20Sopenharmony_ci	},
8748c2ecf20Sopenharmony_ci	[CX88_BOARD_ATI_HDTVWONDER] = {
8758c2ecf20Sopenharmony_ci		.name           = "ATI HDTV Wonder",
8768c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_TUV1236D,
8778c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
8788c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
8798c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
8808c2ecf20Sopenharmony_ci		.input          = { {
8818c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
8828c2ecf20Sopenharmony_ci			.vmux   = 0,
8838c2ecf20Sopenharmony_ci			.gpio0  = 0x00000ff7,
8848c2ecf20Sopenharmony_ci			.gpio1  = 0x000000ff,
8858c2ecf20Sopenharmony_ci			.gpio2  = 0x00000001,
8868c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
8878c2ecf20Sopenharmony_ci		}, {
8888c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
8898c2ecf20Sopenharmony_ci			.vmux   = 1,
8908c2ecf20Sopenharmony_ci			.gpio0  = 0x00000ffe,
8918c2ecf20Sopenharmony_ci			.gpio1  = 0x000000ff,
8928c2ecf20Sopenharmony_ci			.gpio2  = 0x00000001,
8938c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
8948c2ecf20Sopenharmony_ci		}, {
8958c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
8968c2ecf20Sopenharmony_ci			.vmux   = 2,
8978c2ecf20Sopenharmony_ci			.gpio0  = 0x00000ffe,
8988c2ecf20Sopenharmony_ci			.gpio1  = 0x000000ff,
8998c2ecf20Sopenharmony_ci			.gpio2  = 0x00000001,
9008c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
9018c2ecf20Sopenharmony_ci		} },
9028c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
9038c2ecf20Sopenharmony_ci	},
9048c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV1000] = {
9058c2ecf20Sopenharmony_ci		.name           = "WinFast DTV1000-T",
9068c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
9078c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
9088c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
9098c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
9108c2ecf20Sopenharmony_ci		.input          = { {
9118c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
9128c2ecf20Sopenharmony_ci			.vmux   = 0,
9138c2ecf20Sopenharmony_ci		}, {
9148c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
9158c2ecf20Sopenharmony_ci			.vmux   = 1,
9168c2ecf20Sopenharmony_ci		}, {
9178c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
9188c2ecf20Sopenharmony_ci			.vmux   = 2,
9198c2ecf20Sopenharmony_ci		} },
9208c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
9218c2ecf20Sopenharmony_ci	},
9228c2ecf20Sopenharmony_ci	[CX88_BOARD_AVERTV_303] = {
9238c2ecf20Sopenharmony_ci		.name           = "AVerTV 303 (M126)",
9248c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
9258c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
9268c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
9278c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
9288c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
9298c2ecf20Sopenharmony_ci		.input          = { {
9308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
9318c2ecf20Sopenharmony_ci			.vmux   = 0,
9328c2ecf20Sopenharmony_ci			.gpio0  = 0x00ff,
9338c2ecf20Sopenharmony_ci			.gpio1  = 0xe09f,
9348c2ecf20Sopenharmony_ci			.gpio2  = 0x0010,
9358c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
9368c2ecf20Sopenharmony_ci		}, {
9378c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
9388c2ecf20Sopenharmony_ci			.vmux   = 1,
9398c2ecf20Sopenharmony_ci			.gpio0  = 0x00ff,
9408c2ecf20Sopenharmony_ci			.gpio1  = 0xe05f,
9418c2ecf20Sopenharmony_ci			.gpio2  = 0x0010,
9428c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
9438c2ecf20Sopenharmony_ci		}, {
9448c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
9458c2ecf20Sopenharmony_ci			.vmux   = 2,
9468c2ecf20Sopenharmony_ci			.gpio0  = 0x00ff,
9478c2ecf20Sopenharmony_ci			.gpio1  = 0xe05f,
9488c2ecf20Sopenharmony_ci			.gpio2  = 0x0010,
9498c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
9508c2ecf20Sopenharmony_ci		} },
9518c2ecf20Sopenharmony_ci	},
9528c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
9538c2ecf20Sopenharmony_ci		.name		= "Hauppauge Nova-S-Plus DVB-S",
9548c2ecf20Sopenharmony_ci		.tuner_type	= UNSET,
9558c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
9568c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
9578c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
9588c2ecf20Sopenharmony_ci		.audio_chip	= CX88_AUDIO_WM8775,
9598c2ecf20Sopenharmony_ci		.i2sinputcntl   = 2,
9608c2ecf20Sopenharmony_ci		.input		= { {
9618c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_DVB,
9628c2ecf20Sopenharmony_ci			.vmux	= 0,
9638c2ecf20Sopenharmony_ci			/* 2: Line-In */
9648c2ecf20Sopenharmony_ci			.audioroute = 2,
9658c2ecf20Sopenharmony_ci		}, {
9668c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
9678c2ecf20Sopenharmony_ci			.vmux	= 1,
9688c2ecf20Sopenharmony_ci			/* 2: Line-In */
9698c2ecf20Sopenharmony_ci			.audioroute = 2,
9708c2ecf20Sopenharmony_ci		}, {
9718c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
9728c2ecf20Sopenharmony_ci			.vmux	= 2,
9738c2ecf20Sopenharmony_ci			/* 2: Line-In */
9748c2ecf20Sopenharmony_ci			.audioroute = 2,
9758c2ecf20Sopenharmony_ci		} },
9768c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
9778c2ecf20Sopenharmony_ci	},
9788c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
9798c2ecf20Sopenharmony_ci		.name		= "Hauppauge Nova-SE2 DVB-S",
9808c2ecf20Sopenharmony_ci		.tuner_type	= UNSET,
9818c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
9828c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
9838c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
9848c2ecf20Sopenharmony_ci		.input		= { {
9858c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_DVB,
9868c2ecf20Sopenharmony_ci			.vmux	= 0,
9878c2ecf20Sopenharmony_ci		} },
9888c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
9898c2ecf20Sopenharmony_ci	},
9908c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_DVBS_100] = {
9918c2ecf20Sopenharmony_ci		.name		= "KWorld DVB-S 100",
9928c2ecf20Sopenharmony_ci		.tuner_type	= UNSET,
9938c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
9948c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
9958c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
9968c2ecf20Sopenharmony_ci		.audio_chip = CX88_AUDIO_WM8775,
9978c2ecf20Sopenharmony_ci		.input		= { {
9988c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_DVB,
9998c2ecf20Sopenharmony_ci			.vmux	= 0,
10008c2ecf20Sopenharmony_ci			/* 2: Line-In */
10018c2ecf20Sopenharmony_ci			.audioroute = 2,
10028c2ecf20Sopenharmony_ci		}, {
10038c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
10048c2ecf20Sopenharmony_ci			.vmux	= 1,
10058c2ecf20Sopenharmony_ci			/* 2: Line-In */
10068c2ecf20Sopenharmony_ci			.audioroute = 2,
10078c2ecf20Sopenharmony_ci		}, {
10088c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
10098c2ecf20Sopenharmony_ci			.vmux	= 2,
10108c2ecf20Sopenharmony_ci			/* 2: Line-In */
10118c2ecf20Sopenharmony_ci			.audioroute = 2,
10128c2ecf20Sopenharmony_ci		} },
10138c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
10148c2ecf20Sopenharmony_ci	},
10158c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR1100] = {
10168c2ecf20Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
10178c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
10188c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
10198c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
10208c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
10218c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
10228c2ecf20Sopenharmony_ci		.input		= { {
10238c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
10248c2ecf20Sopenharmony_ci			.vmux   = 0,
10258c2ecf20Sopenharmony_ci		}, {
10268c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
10278c2ecf20Sopenharmony_ci			.vmux	= 1,
10288c2ecf20Sopenharmony_ci		}, {
10298c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
10308c2ecf20Sopenharmony_ci			.vmux	= 2,
10318c2ecf20Sopenharmony_ci		} },
10328c2ecf20Sopenharmony_ci		/* fixme: Add radio support */
10338c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
10348c2ecf20Sopenharmony_ci	},
10358c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
10368c2ecf20Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
10378c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
10388c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
10398c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
10408c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
10418c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
10428c2ecf20Sopenharmony_ci		.input		= { {
10438c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
10448c2ecf20Sopenharmony_ci			.vmux   = 0,
10458c2ecf20Sopenharmony_ci		}, {
10468c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
10478c2ecf20Sopenharmony_ci			.vmux	= 1,
10488c2ecf20Sopenharmony_ci		} },
10498c2ecf20Sopenharmony_ci		/* fixme: Add radio support */
10508c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
10518c2ecf20Sopenharmony_ci	},
10528c2ecf20Sopenharmony_ci	[CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
10538c2ecf20Sopenharmony_ci		.name           = "digitalnow DNTV Live! DVB-T Pro",
10548c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
10558c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
10568c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
10578c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
10588c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
10598c2ecf20Sopenharmony_ci				  TDA9887_PORT2_ACTIVE,
10608c2ecf20Sopenharmony_ci		.input          = { {
10618c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
10628c2ecf20Sopenharmony_ci			.vmux   = 0,
10638c2ecf20Sopenharmony_ci			.gpio0  = 0xf80808,
10648c2ecf20Sopenharmony_ci		}, {
10658c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
10668c2ecf20Sopenharmony_ci			.vmux   = 1,
10678c2ecf20Sopenharmony_ci			.gpio0	= 0xf80808,
10688c2ecf20Sopenharmony_ci		}, {
10698c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
10708c2ecf20Sopenharmony_ci			.vmux   = 2,
10718c2ecf20Sopenharmony_ci			.gpio0	= 0xf80808,
10728c2ecf20Sopenharmony_ci		} },
10738c2ecf20Sopenharmony_ci		.radio = {
10748c2ecf20Sopenharmony_ci			 .type  = CX88_RADIO,
10758c2ecf20Sopenharmony_ci			 .gpio0 = 0xf80808,
10768c2ecf20Sopenharmony_ci		},
10778c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
10788c2ecf20Sopenharmony_ci	},
10798c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_DVB_T_CX22702] = {
10808c2ecf20Sopenharmony_ci		/* Kworld V-stream Xpert DVB-T with Thomson tuner */
10818c2ecf20Sopenharmony_ci		/* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */
10828c2ecf20Sopenharmony_ci		/* Manenti Marco <marco_manenti@colman.it> */
10838c2ecf20Sopenharmony_ci		.name           = "KWorld/VStream XPert DVB-T with cx22702",
10848c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
10858c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
10868c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
10878c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
10888c2ecf20Sopenharmony_ci		.input          = { {
10898c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
10908c2ecf20Sopenharmony_ci			.vmux   = 1,
10918c2ecf20Sopenharmony_ci			.gpio0  = 0x0700,
10928c2ecf20Sopenharmony_ci			.gpio2  = 0x0101,
10938c2ecf20Sopenharmony_ci		}, {
10948c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
10958c2ecf20Sopenharmony_ci			.vmux   = 2,
10968c2ecf20Sopenharmony_ci			.gpio0  = 0x0700,
10978c2ecf20Sopenharmony_ci			.gpio2  = 0x0101,
10988c2ecf20Sopenharmony_ci		} },
10998c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
11008c2ecf20Sopenharmony_ci	},
11018c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
11028c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Dual Digital",
11038c2ecf20Sopenharmony_ci		.tuner_type     = UNSET, /* No analog tuner */
11048c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
11058c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
11068c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
11078c2ecf20Sopenharmony_ci		.input          = { {
11088c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
11098c2ecf20Sopenharmony_ci			.vmux   = 1,
11108c2ecf20Sopenharmony_ci			.gpio0  = 0x000067df,
11118c2ecf20Sopenharmony_ci		 }, {
11128c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
11138c2ecf20Sopenharmony_ci			.vmux   = 2,
11148c2ecf20Sopenharmony_ci			.gpio0  = 0x000067df,
11158c2ecf20Sopenharmony_ci		} },
11168c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
11178c2ecf20Sopenharmony_ci	},
11188c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
11198c2ecf20Sopenharmony_ci		.name           = "KWorld HardwareMpegTV XPert",
11208c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_TDA8290,
11218c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
11228c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
11238c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
11248c2ecf20Sopenharmony_ci		.input          = { {
11258c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
11268c2ecf20Sopenharmony_ci			.vmux   = 0,
11278c2ecf20Sopenharmony_ci			.gpio0  = 0x3de2,
11288c2ecf20Sopenharmony_ci			.gpio2  = 0x00ff,
11298c2ecf20Sopenharmony_ci		}, {
11308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
11318c2ecf20Sopenharmony_ci			.vmux   = 1,
11328c2ecf20Sopenharmony_ci			.gpio0  = 0x3de6,
11338c2ecf20Sopenharmony_ci			.audioroute = 1,
11348c2ecf20Sopenharmony_ci		}, {
11358c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
11368c2ecf20Sopenharmony_ci			.vmux   = 2,
11378c2ecf20Sopenharmony_ci			.gpio0  = 0x3de6,
11388c2ecf20Sopenharmony_ci			.audioroute = 1,
11398c2ecf20Sopenharmony_ci		} },
11408c2ecf20Sopenharmony_ci		.radio = {
11418c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
11428c2ecf20Sopenharmony_ci			.gpio0  = 0x3de6,
11438c2ecf20Sopenharmony_ci			.gpio2  = 0x00ff,
11448c2ecf20Sopenharmony_ci		},
11458c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
11468c2ecf20Sopenharmony_ci	},
11478c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
11488c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Hybrid",
11498c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_THOMSON_FE6600,
11508c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
11518c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
11528c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
11538c2ecf20Sopenharmony_ci		.input          = { {
11548c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
11558c2ecf20Sopenharmony_ci			.vmux   = 0,
11568c2ecf20Sopenharmony_ci			.gpio0  = 0x0000a75f,
11578c2ecf20Sopenharmony_ci		}, {
11588c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
11598c2ecf20Sopenharmony_ci			.vmux   = 1,
11608c2ecf20Sopenharmony_ci			.gpio0  = 0x0000a75b,
11618c2ecf20Sopenharmony_ci		}, {
11628c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
11638c2ecf20Sopenharmony_ci			.vmux   = 2,
11648c2ecf20Sopenharmony_ci			.gpio0  = 0x0000a75b,
11658c2ecf20Sopenharmony_ci		} },
11668c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
11678c2ecf20Sopenharmony_ci	},
11688c2ecf20Sopenharmony_ci	[CX88_BOARD_PCHDTV_HD5500] = {
11698c2ecf20Sopenharmony_ci		.name           = "pcHDTV HD5500 HDTV",
11708c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
11718c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
11728c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
11738c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
11748c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
11758c2ecf20Sopenharmony_ci		.input          = { {
11768c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
11778c2ecf20Sopenharmony_ci			.vmux   = 0,
11788c2ecf20Sopenharmony_ci			.gpio0  = 0x87fd,
11798c2ecf20Sopenharmony_ci		}, {
11808c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
11818c2ecf20Sopenharmony_ci			.vmux   = 1,
11828c2ecf20Sopenharmony_ci			.gpio0  = 0x87f9,
11838c2ecf20Sopenharmony_ci		}, {
11848c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
11858c2ecf20Sopenharmony_ci			.vmux   = 2,
11868c2ecf20Sopenharmony_ci			.gpio0  = 0x87f9,
11878c2ecf20Sopenharmony_ci		} },
11888c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
11898c2ecf20Sopenharmony_ci	},
11908c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_MCE200_DELUXE] = {
11918c2ecf20Sopenharmony_ci		/*
11928c2ecf20Sopenharmony_ci		 * FIXME: tested TV input only, disabled composite,
11938c2ecf20Sopenharmony_ci		 * svideo and radio until they can be tested also.
11948c2ecf20Sopenharmony_ci		 */
11958c2ecf20Sopenharmony_ci		.name           = "Kworld MCE 200 Deluxe",
11968c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_TENA_9533_DI,
11978c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
11988c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
11998c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
12008c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
12018c2ecf20Sopenharmony_ci		.input          = { {
12028c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
12038c2ecf20Sopenharmony_ci			.vmux   = 0,
12048c2ecf20Sopenharmony_ci			.gpio0  = 0x0000BDE6
12058c2ecf20Sopenharmony_ci		} },
12068c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
12078c2ecf20Sopenharmony_ci	},
12088c2ecf20Sopenharmony_ci	[CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
12098c2ecf20Sopenharmony_ci		/* FIXME: SVideo, Composite and FM inputs are untested */
12108c2ecf20Sopenharmony_ci		.name           = "PixelView PlayTV P7000",
12118c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
12128c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
12138c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
12148c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
12158c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
12168c2ecf20Sopenharmony_ci				  TDA9887_PORT2_ACTIVE,
12178c2ecf20Sopenharmony_ci		.input          = { {
12188c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
12198c2ecf20Sopenharmony_ci			.vmux   = 0,
12208c2ecf20Sopenharmony_ci			.gpio0  = 0x5da6,
12218c2ecf20Sopenharmony_ci		} },
12228c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
12238c2ecf20Sopenharmony_ci	},
12248c2ecf20Sopenharmony_ci	[CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
12258c2ecf20Sopenharmony_ci		.name           = "NPG Tech Real TV FM Top 10",
12268c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */
12278c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
12288c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
12298c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
12308c2ecf20Sopenharmony_ci		.input          = { {
12318c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
12328c2ecf20Sopenharmony_ci			.vmux   = 0,
12338c2ecf20Sopenharmony_ci			.gpio0	= 0x0788,
12348c2ecf20Sopenharmony_ci		}, {
12358c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
12368c2ecf20Sopenharmony_ci			.vmux   = 1,
12378c2ecf20Sopenharmony_ci			.gpio0	= 0x078b,
12388c2ecf20Sopenharmony_ci		}, {
12398c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
12408c2ecf20Sopenharmony_ci			.vmux   = 2,
12418c2ecf20Sopenharmony_ci			.gpio0	= 0x078b,
12428c2ecf20Sopenharmony_ci		} },
12438c2ecf20Sopenharmony_ci		.radio = {
12448c2ecf20Sopenharmony_ci			 .type  = CX88_RADIO,
12458c2ecf20Sopenharmony_ci			 .gpio0 = 0x074a,
12468c2ecf20Sopenharmony_ci		},
12478c2ecf20Sopenharmony_ci	},
12488c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV2000H] = {
12498c2ecf20Sopenharmony_ci		.name           = "WinFast DTV2000 H",
12508c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
12518c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
12528c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
12538c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
12548c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
12558c2ecf20Sopenharmony_ci		.input          = { {
12568c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
12578c2ecf20Sopenharmony_ci			.vmux   = 0,
12588c2ecf20Sopenharmony_ci			.gpio0  = 0x00017304,
12598c2ecf20Sopenharmony_ci			.gpio1  = 0x00008203,
12608c2ecf20Sopenharmony_ci			.gpio2  = 0x00017304,
12618c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
12628c2ecf20Sopenharmony_ci		}, {
12638c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
12648c2ecf20Sopenharmony_ci			.vmux   = 1,
12658c2ecf20Sopenharmony_ci			.gpio0  = 0x0001d701,
12668c2ecf20Sopenharmony_ci			.gpio1  = 0x0000b207,
12678c2ecf20Sopenharmony_ci			.gpio2  = 0x0001d701,
12688c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
12698c2ecf20Sopenharmony_ci		}, {
12708c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE2,
12718c2ecf20Sopenharmony_ci			.vmux   = 2,
12728c2ecf20Sopenharmony_ci			.gpio0  = 0x0001d503,
12738c2ecf20Sopenharmony_ci			.gpio1  = 0x0000b207,
12748c2ecf20Sopenharmony_ci			.gpio2  = 0x0001d503,
12758c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
12768c2ecf20Sopenharmony_ci		}, {
12778c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
12788c2ecf20Sopenharmony_ci			.vmux   = 3,
12798c2ecf20Sopenharmony_ci			.gpio0  = 0x0001d701,
12808c2ecf20Sopenharmony_ci			.gpio1  = 0x0000b207,
12818c2ecf20Sopenharmony_ci			.gpio2  = 0x0001d701,
12828c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
12838c2ecf20Sopenharmony_ci		} },
12848c2ecf20Sopenharmony_ci		.radio = {
12858c2ecf20Sopenharmony_ci			 .type  = CX88_RADIO,
12868c2ecf20Sopenharmony_ci			 .gpio0 = 0x00015702,
12878c2ecf20Sopenharmony_ci			 .gpio1 = 0x0000f207,
12888c2ecf20Sopenharmony_ci			 .gpio2 = 0x00015702,
12898c2ecf20Sopenharmony_ci			 .gpio3 = 0x02000000,
12908c2ecf20Sopenharmony_ci		},
12918c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
12928c2ecf20Sopenharmony_ci	},
12938c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV2000H_J] = {
12948c2ecf20Sopenharmony_ci		.name           = "WinFast DTV2000 H rev. J",
12958c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216MEX_MK3,
12968c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
12978c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
12988c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
12998c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
13008c2ecf20Sopenharmony_ci		.input          = { {
13018c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
13028c2ecf20Sopenharmony_ci			.vmux   = 0,
13038c2ecf20Sopenharmony_ci			.gpio0  = 0x00017300,
13048c2ecf20Sopenharmony_ci			.gpio1  = 0x00008207,
13058c2ecf20Sopenharmony_ci			.gpio2	= 0x00000000,
13068c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
13078c2ecf20Sopenharmony_ci		}, {
13088c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
13098c2ecf20Sopenharmony_ci			.vmux   = 0,
13108c2ecf20Sopenharmony_ci			.gpio0  = 0x00018300,
13118c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f207,
13128c2ecf20Sopenharmony_ci			.gpio2	= 0x00017304,
13138c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
13148c2ecf20Sopenharmony_ci		}, {
13158c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
13168c2ecf20Sopenharmony_ci			.vmux   = 1,
13178c2ecf20Sopenharmony_ci			.gpio0  = 0x00018301,
13188c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f207,
13198c2ecf20Sopenharmony_ci			.gpio2	= 0x00017304,
13208c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
13218c2ecf20Sopenharmony_ci		}, {
13228c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
13238c2ecf20Sopenharmony_ci			.vmux   = 2,
13248c2ecf20Sopenharmony_ci			.gpio0  = 0x00018301,
13258c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f207,
13268c2ecf20Sopenharmony_ci			.gpio2	= 0x00017304,
13278c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
13288c2ecf20Sopenharmony_ci		} },
13298c2ecf20Sopenharmony_ci		.radio = {
13308c2ecf20Sopenharmony_ci			 .type  = CX88_RADIO,
13318c2ecf20Sopenharmony_ci			 .gpio0 = 0x00015702,
13328c2ecf20Sopenharmony_ci			 .gpio1 = 0x0000f207,
13338c2ecf20Sopenharmony_ci			 .gpio2 = 0x00015702,
13348c2ecf20Sopenharmony_ci			 .gpio3 = 0x02000000,
13358c2ecf20Sopenharmony_ci		},
13368c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
13378c2ecf20Sopenharmony_ci	},
13388c2ecf20Sopenharmony_ci	[CX88_BOARD_GENIATECH_DVBS] = {
13398c2ecf20Sopenharmony_ci		.name          = "Geniatech DVB-S",
13408c2ecf20Sopenharmony_ci		.tuner_type    = UNSET,
13418c2ecf20Sopenharmony_ci		.radio_type    = UNSET,
13428c2ecf20Sopenharmony_ci		.tuner_addr    = ADDR_UNSET,
13438c2ecf20Sopenharmony_ci		.radio_addr    = ADDR_UNSET,
13448c2ecf20Sopenharmony_ci		.input  = { {
13458c2ecf20Sopenharmony_ci			.type  = CX88_VMUX_DVB,
13468c2ecf20Sopenharmony_ci			.vmux  = 0,
13478c2ecf20Sopenharmony_ci		}, {
13488c2ecf20Sopenharmony_ci			.type  = CX88_VMUX_COMPOSITE1,
13498c2ecf20Sopenharmony_ci			.vmux  = 1,
13508c2ecf20Sopenharmony_ci		} },
13518c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
13528c2ecf20Sopenharmony_ci	},
13538c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR3000] = {
13548c2ecf20Sopenharmony_ci		.name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
13558c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
13568c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
13578c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
13588c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
13598c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
13608c2ecf20Sopenharmony_ci		.audio_chip     = CX88_AUDIO_WM8775,
13618c2ecf20Sopenharmony_ci		.input          = { {
13628c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
13638c2ecf20Sopenharmony_ci			.vmux   = 0,
13648c2ecf20Sopenharmony_ci			.gpio0  = 0x84bf,
13658c2ecf20Sopenharmony_ci			/* 1: TV Audio / FM Mono */
13668c2ecf20Sopenharmony_ci			.audioroute = 1,
13678c2ecf20Sopenharmony_ci		}, {
13688c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
13698c2ecf20Sopenharmony_ci			.vmux   = 1,
13708c2ecf20Sopenharmony_ci			.gpio0  = 0x84bf,
13718c2ecf20Sopenharmony_ci			/* 2: Line-In */
13728c2ecf20Sopenharmony_ci			.audioroute = 2,
13738c2ecf20Sopenharmony_ci		}, {
13748c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
13758c2ecf20Sopenharmony_ci			.vmux   = 2,
13768c2ecf20Sopenharmony_ci			.gpio0  = 0x84bf,
13778c2ecf20Sopenharmony_ci			/* 2: Line-In */
13788c2ecf20Sopenharmony_ci			.audioroute = 2,
13798c2ecf20Sopenharmony_ci		} },
13808c2ecf20Sopenharmony_ci		.radio = {
13818c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
13828c2ecf20Sopenharmony_ci			.gpio0	= 0x84bf,
13838c2ecf20Sopenharmony_ci			/* 4: FM Stereo (untested) */
13848c2ecf20Sopenharmony_ci			.audioroute = 8,
13858c2ecf20Sopenharmony_ci		},
13868c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
13878c2ecf20Sopenharmony_ci		.num_frontends	= 2,
13888c2ecf20Sopenharmony_ci	},
13898c2ecf20Sopenharmony_ci	[CX88_BOARD_NORWOOD_MICRO] = {
13908c2ecf20Sopenharmony_ci		.name           = "Norwood Micro TV Tuner",
13918c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_TNF_5335MF,
13928c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
13938c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
13948c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
13958c2ecf20Sopenharmony_ci		.input          = { {
13968c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
13978c2ecf20Sopenharmony_ci			.vmux   = 0,
13988c2ecf20Sopenharmony_ci			.gpio0  = 0x0709,
13998c2ecf20Sopenharmony_ci		}, {
14008c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
14018c2ecf20Sopenharmony_ci			.vmux   = 1,
14028c2ecf20Sopenharmony_ci			.gpio0  = 0x070b,
14038c2ecf20Sopenharmony_ci		}, {
14048c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
14058c2ecf20Sopenharmony_ci			.vmux   = 2,
14068c2ecf20Sopenharmony_ci			.gpio0  = 0x070b,
14078c2ecf20Sopenharmony_ci		} },
14088c2ecf20Sopenharmony_ci	},
14098c2ecf20Sopenharmony_ci	[CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
14108c2ecf20Sopenharmony_ci		.name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
14118c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_LG_PAL_NEW_TAPC,
14128c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
14138c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
14148c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
14158c2ecf20Sopenharmony_ci		.input          = { {
14168c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
14178c2ecf20Sopenharmony_ci			.vmux   = 0,
14188c2ecf20Sopenharmony_ci			.gpio0  = 0x003fffff,
14198c2ecf20Sopenharmony_ci			.gpio1  = 0x00e00000,
14208c2ecf20Sopenharmony_ci			.gpio2  = 0x003fffff,
14218c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
14228c2ecf20Sopenharmony_ci		}, {
14238c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
14248c2ecf20Sopenharmony_ci			.vmux   = 1,
14258c2ecf20Sopenharmony_ci			.gpio0  = 0x003fffff,
14268c2ecf20Sopenharmony_ci			.gpio1  = 0x00e00000,
14278c2ecf20Sopenharmony_ci			.gpio2  = 0x003fffff,
14288c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
14298c2ecf20Sopenharmony_ci		}, {
14308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
14318c2ecf20Sopenharmony_ci			.vmux   = 2,
14328c2ecf20Sopenharmony_ci			.gpio0  = 0x003fffff,
14338c2ecf20Sopenharmony_ci			.gpio1  = 0x00e00000,
14348c2ecf20Sopenharmony_ci			.gpio2  = 0x003fffff,
14358c2ecf20Sopenharmony_ci			.gpio3  = 0x02000000,
14368c2ecf20Sopenharmony_ci		} },
14378c2ecf20Sopenharmony_ci	},
14388c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR1300] = {
14398c2ecf20Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
14408c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
14418c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
14428c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
14438c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
14448c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
14458c2ecf20Sopenharmony_ci		.audio_chip     = CX88_AUDIO_WM8775,
14468c2ecf20Sopenharmony_ci		/*
14478c2ecf20Sopenharmony_ci		 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
14488c2ecf20Sopenharmony_ci		 */
14498c2ecf20Sopenharmony_ci		.input		= { {
14508c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
14518c2ecf20Sopenharmony_ci			.vmux   = 0,
14528c2ecf20Sopenharmony_ci			.gpio0	= 0xef88,
14538c2ecf20Sopenharmony_ci			/* 1: TV Audio / FM Mono */
14548c2ecf20Sopenharmony_ci			.audioroute = 1,
14558c2ecf20Sopenharmony_ci		}, {
14568c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
14578c2ecf20Sopenharmony_ci			.vmux	= 1,
14588c2ecf20Sopenharmony_ci			.gpio0	= 0xef88,
14598c2ecf20Sopenharmony_ci			/* 2: Line-In */
14608c2ecf20Sopenharmony_ci			.audioroute = 2,
14618c2ecf20Sopenharmony_ci		}, {
14628c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
14638c2ecf20Sopenharmony_ci			.vmux	= 2,
14648c2ecf20Sopenharmony_ci			.gpio0	= 0xef88,
14658c2ecf20Sopenharmony_ci			/* 2: Line-In */
14668c2ecf20Sopenharmony_ci			.audioroute = 2,
14678c2ecf20Sopenharmony_ci		} },
14688c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
14698c2ecf20Sopenharmony_ci		.radio = {
14708c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
14718c2ecf20Sopenharmony_ci			.gpio0	= 0xef88,
14728c2ecf20Sopenharmony_ci			/* 4: FM Stereo (untested) */
14738c2ecf20Sopenharmony_ci			.audioroute = 8,
14748c2ecf20Sopenharmony_ci		},
14758c2ecf20Sopenharmony_ci	},
14768c2ecf20Sopenharmony_ci	[CX88_BOARD_SAMSUNG_SMT_7020] = {
14778c2ecf20Sopenharmony_ci		.name		= "Samsung SMT 7020 DVB-S",
14788c2ecf20Sopenharmony_ci		.tuner_type	= UNSET,
14798c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
14808c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
14818c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
14828c2ecf20Sopenharmony_ci		.input		= { {
14838c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_DVB,
14848c2ecf20Sopenharmony_ci			.vmux	= 0,
14858c2ecf20Sopenharmony_ci		} },
14868c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
14878c2ecf20Sopenharmony_ci	},
14888c2ecf20Sopenharmony_ci	[CX88_BOARD_ADSTECH_PTV_390] = {
14898c2ecf20Sopenharmony_ci		.name           = "ADS Tech Instant Video PCI",
14908c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
14918c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
14928c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
14938c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
14948c2ecf20Sopenharmony_ci		.input          = { {
14958c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
14968c2ecf20Sopenharmony_ci			.vmux   = 3,
14978c2ecf20Sopenharmony_ci			.gpio0  = 0x04ff,
14988c2ecf20Sopenharmony_ci		}, {
14998c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
15008c2ecf20Sopenharmony_ci			.vmux   = 1,
15018c2ecf20Sopenharmony_ci			.gpio0  = 0x07fa,
15028c2ecf20Sopenharmony_ci		}, {
15038c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
15048c2ecf20Sopenharmony_ci			.vmux   = 2,
15058c2ecf20Sopenharmony_ci			.gpio0  = 0x07fa,
15068c2ecf20Sopenharmony_ci		} },
15078c2ecf20Sopenharmony_ci	},
15088c2ecf20Sopenharmony_ci	[CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
15098c2ecf20Sopenharmony_ci		.name           = "Pinnacle PCTV HD 800i",
15108c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC5000,
15118c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
15128c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
15138c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
15148c2ecf20Sopenharmony_ci		.input          = { {
15158c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
15168c2ecf20Sopenharmony_ci			.vmux   = 0,
15178c2ecf20Sopenharmony_ci			.gpio0  = 0x04fb,
15188c2ecf20Sopenharmony_ci			.gpio1  = 0x10ff,
15198c2ecf20Sopenharmony_ci		}, {
15208c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
15218c2ecf20Sopenharmony_ci			.vmux   = 1,
15228c2ecf20Sopenharmony_ci			.gpio0  = 0x04fb,
15238c2ecf20Sopenharmony_ci			.gpio1  = 0x10ef,
15248c2ecf20Sopenharmony_ci			.audioroute = 1,
15258c2ecf20Sopenharmony_ci		}, {
15268c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
15278c2ecf20Sopenharmony_ci			.vmux   = 2,
15288c2ecf20Sopenharmony_ci			.gpio0  = 0x04fb,
15298c2ecf20Sopenharmony_ci			.gpio1  = 0x10ef,
15308c2ecf20Sopenharmony_ci			.audioroute = 1,
15318c2ecf20Sopenharmony_ci		} },
15328c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
15338c2ecf20Sopenharmony_ci	},
15348c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
15358c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV 5 PCI nano",
15368c2ecf20Sopenharmony_ci		/* xc3008 tuner, digital only for now */
15378c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
15388c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
15398c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
15408c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
15418c2ecf20Sopenharmony_ci		.input          = { {
15428c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
15438c2ecf20Sopenharmony_ci			.vmux   = 0,
15448c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df, /* Unconfirmed */
15458c2ecf20Sopenharmony_ci		}, {
15468c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
15478c2ecf20Sopenharmony_ci			.vmux   = 1,
15488c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df, /* Unconfirmed */
15498c2ecf20Sopenharmony_ci			.audioroute = 1,
15508c2ecf20Sopenharmony_ci		}, {
15518c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
15528c2ecf20Sopenharmony_ci			.vmux   = 2,
15538c2ecf20Sopenharmony_ci			.gpio0  = 0x000027df, /* Unconfirmed */
15548c2ecf20Sopenharmony_ci			.audioroute = 1,
15558c2ecf20Sopenharmony_ci		} },
15568c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
15578c2ecf20Sopenharmony_ci	},
15588c2ecf20Sopenharmony_ci	[CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
15598c2ecf20Sopenharmony_ci		.name           = "Pinnacle Hybrid PCTV",
15608c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
15618c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
15628c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
15638c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
15648c2ecf20Sopenharmony_ci		.input          = { {
15658c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
15668c2ecf20Sopenharmony_ci			.vmux   = 0,
15678c2ecf20Sopenharmony_ci			.gpio0  = 0x004ff,
15688c2ecf20Sopenharmony_ci			.gpio1  = 0x010ff,
15698c2ecf20Sopenharmony_ci			.gpio2  = 0x00001,
15708c2ecf20Sopenharmony_ci		}, {
15718c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
15728c2ecf20Sopenharmony_ci			.vmux   = 1,
15738c2ecf20Sopenharmony_ci			.gpio0  = 0x004fb,
15748c2ecf20Sopenharmony_ci			.gpio1  = 0x010ef,
15758c2ecf20Sopenharmony_ci			.audioroute = 1,
15768c2ecf20Sopenharmony_ci		}, {
15778c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
15788c2ecf20Sopenharmony_ci			.vmux   = 2,
15798c2ecf20Sopenharmony_ci			.gpio0  = 0x004fb,
15808c2ecf20Sopenharmony_ci			.gpio1  = 0x010ef,
15818c2ecf20Sopenharmony_ci			.audioroute = 1,
15828c2ecf20Sopenharmony_ci		} },
15838c2ecf20Sopenharmony_ci		.radio = {
15848c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
15858c2ecf20Sopenharmony_ci			.gpio0  = 0x004ff,
15868c2ecf20Sopenharmony_ci			.gpio1  = 0x010ff,
15878c2ecf20Sopenharmony_ci			.gpio2  = 0x0ff,
15888c2ecf20Sopenharmony_ci		},
15898c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
15908c2ecf20Sopenharmony_ci	},
15918c2ecf20Sopenharmony_ci	/* Terry Wu <terrywu2009@gmail.com> */
15928c2ecf20Sopenharmony_ci	/* TV Audio :      set GPIO 2, 18, 19 value to 0, 1, 0 */
15938c2ecf20Sopenharmony_ci	/* FM Audio :      set GPIO 2, 18, 19 value to 0, 0, 0 */
15948c2ecf20Sopenharmony_ci	/* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
15958c2ecf20Sopenharmony_ci	/* Mute Audio :    set GPIO 2 value to 1               */
15968c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
15978c2ecf20Sopenharmony_ci		.name           = "Leadtek TV2000 XP Global",
15988c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
15998c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
16008c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
16018c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
16028c2ecf20Sopenharmony_ci		.input          = { {
16038c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
16048c2ecf20Sopenharmony_ci			.vmux   = 0,
16058c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16068c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16078c2ecf20Sopenharmony_ci			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
16088c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16098c2ecf20Sopenharmony_ci		}, {
16108c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
16118c2ecf20Sopenharmony_ci			.vmux   = 1,
16128c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16138c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16148c2ecf20Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
16158c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16168c2ecf20Sopenharmony_ci		}, {
16178c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
16188c2ecf20Sopenharmony_ci			.vmux   = 2,
16198c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16208c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16218c2ecf20Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
16228c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16238c2ecf20Sopenharmony_ci		} },
16248c2ecf20Sopenharmony_ci		.radio = {
16258c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
16268c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,        /* pin 2 = 0 */
16278c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16288c2ecf20Sopenharmony_ci			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
16298c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16308c2ecf20Sopenharmony_ci		},
16318c2ecf20Sopenharmony_ci	},
16328c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = {
16338c2ecf20Sopenharmony_ci		.name           = "Leadtek TV2000 XP Global (SC4100)",
16348c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC4000,
16358c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
16368c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
16378c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
16388c2ecf20Sopenharmony_ci		.input          = { {
16398c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
16408c2ecf20Sopenharmony_ci			.vmux   = 0,
16418c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16428c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16438c2ecf20Sopenharmony_ci			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
16448c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16458c2ecf20Sopenharmony_ci		}, {
16468c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
16478c2ecf20Sopenharmony_ci			.vmux   = 1,
16488c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16498c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16508c2ecf20Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
16518c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16528c2ecf20Sopenharmony_ci		}, {
16538c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
16548c2ecf20Sopenharmony_ci			.vmux   = 2,
16558c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16568c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16578c2ecf20Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
16588c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16598c2ecf20Sopenharmony_ci		} },
16608c2ecf20Sopenharmony_ci		.radio = {
16618c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
16628c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,        /* pin 2 = 0 */
16638c2ecf20Sopenharmony_ci			.gpio1  = 0x0000,
16648c2ecf20Sopenharmony_ci			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
16658c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16668c2ecf20Sopenharmony_ci		},
16678c2ecf20Sopenharmony_ci	},
16688c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = {
16698c2ecf20Sopenharmony_ci		.name           = "Leadtek TV2000 XP Global (XC4100)",
16708c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC4000,
16718c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
16728c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
16738c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
16748c2ecf20Sopenharmony_ci		.input          = { {
16758c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
16768c2ecf20Sopenharmony_ci			.vmux   = 0,
16778c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16788c2ecf20Sopenharmony_ci			.gpio1  = 0x6040,       /* pin 14 = 1, pin 13 = 0 */
16798c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
16808c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16818c2ecf20Sopenharmony_ci		}, {
16828c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
16838c2ecf20Sopenharmony_ci			.vmux   = 1,
16848c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16858c2ecf20Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
16868c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
16878c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16888c2ecf20Sopenharmony_ci		}, {
16898c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
16908c2ecf20Sopenharmony_ci			.vmux   = 2,
16918c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
16928c2ecf20Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
16938c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
16948c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
16958c2ecf20Sopenharmony_ci		} },
16968c2ecf20Sopenharmony_ci		.radio = {
16978c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
16988c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,        /* pin 2 = 0 */
16998c2ecf20Sopenharmony_ci			.gpio1  = 0x6000,        /* pin 14 = 1, pin 13 = 0 */
17008c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
17018c2ecf20Sopenharmony_ci			.gpio3  = 0x0000,
17028c2ecf20Sopenharmony_ci		},
17038c2ecf20Sopenharmony_ci	},
17048c2ecf20Sopenharmony_ci	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
17058c2ecf20Sopenharmony_ci		/* Long names may confuse LIRC. */
17068c2ecf20Sopenharmony_ci		.name           = "PowerColor RA330",
17078c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
17088c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
17098c2ecf20Sopenharmony_ci		.input          = { {
17108c2ecf20Sopenharmony_ci			/*
17118c2ecf20Sopenharmony_ci			 * Due to the way the cx88 driver is written,
17128c2ecf20Sopenharmony_ci			 * there is no way to deactivate audio pass-
17138c2ecf20Sopenharmony_ci			 * through without this entry. Furthermore, if
17148c2ecf20Sopenharmony_ci			 * the TV mux entry is first, you get audio
17158c2ecf20Sopenharmony_ci			 * from the tuner on boot for a little while.
17168c2ecf20Sopenharmony_ci			 */
17178c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
17188c2ecf20Sopenharmony_ci			.vmux   = 3,
17198c2ecf20Sopenharmony_ci			.gpio0 = 0x00ff,
17208c2ecf20Sopenharmony_ci			.gpio1 = 0xf39d,
17218c2ecf20Sopenharmony_ci			.gpio3 = 0x0000,
17228c2ecf20Sopenharmony_ci		}, {
17238c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
17248c2ecf20Sopenharmony_ci			.vmux   = 0,
17258c2ecf20Sopenharmony_ci			.gpio0 = 0x00ff,
17268c2ecf20Sopenharmony_ci			.gpio1 = 0xf35d,
17278c2ecf20Sopenharmony_ci			.gpio3 = 0x0000,
17288c2ecf20Sopenharmony_ci		}, {
17298c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
17308c2ecf20Sopenharmony_ci			.vmux   = 1,
17318c2ecf20Sopenharmony_ci			.gpio0 = 0x00ff,
17328c2ecf20Sopenharmony_ci			.gpio1 = 0xf37d,
17338c2ecf20Sopenharmony_ci			.gpio3 = 0x0000,
17348c2ecf20Sopenharmony_ci		}, {
17358c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
17368c2ecf20Sopenharmony_ci			.vmux   = 2,
17378c2ecf20Sopenharmony_ci			.gpio0  = 0x000ff,
17388c2ecf20Sopenharmony_ci			.gpio1  = 0x0f37d,
17398c2ecf20Sopenharmony_ci			.gpio3  = 0x00000,
17408c2ecf20Sopenharmony_ci		} },
17418c2ecf20Sopenharmony_ci		.radio = {
17428c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
17438c2ecf20Sopenharmony_ci			.gpio0  = 0x000ff,
17448c2ecf20Sopenharmony_ci			.gpio1  = 0x0f35d,
17458c2ecf20Sopenharmony_ci			.gpio3  = 0x00000,
17468c2ecf20Sopenharmony_ci		},
17478c2ecf20Sopenharmony_ci	},
17488c2ecf20Sopenharmony_ci	[CX88_BOARD_GENIATECH_X8000_MT] = {
17498c2ecf20Sopenharmony_ci		/* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
17508c2ecf20Sopenharmony_ci		.name           = "Geniatech X8000-MT DVBT",
17518c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
17528c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
17538c2ecf20Sopenharmony_ci		.input          = { {
17548c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
17558c2ecf20Sopenharmony_ci			.vmux   = 0,
17568c2ecf20Sopenharmony_ci			.gpio0  = 0x00000000,
17578c2ecf20Sopenharmony_ci			.gpio1  = 0x00e3e341,
17588c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
17598c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
17608c2ecf20Sopenharmony_ci		}, {
17618c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
17628c2ecf20Sopenharmony_ci			.vmux   = 1,
17638c2ecf20Sopenharmony_ci			.gpio0  = 0x00000000,
17648c2ecf20Sopenharmony_ci			.gpio1  = 0x00e3e361,
17658c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
17668c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
17678c2ecf20Sopenharmony_ci		}, {
17688c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
17698c2ecf20Sopenharmony_ci			.vmux   = 2,
17708c2ecf20Sopenharmony_ci			.gpio0  = 0x00000000,
17718c2ecf20Sopenharmony_ci			.gpio1  = 0x00e3e361,
17728c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
17738c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
17748c2ecf20Sopenharmony_ci		} },
17758c2ecf20Sopenharmony_ci		.radio = {
17768c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
17778c2ecf20Sopenharmony_ci			.gpio0  = 0x00000000,
17788c2ecf20Sopenharmony_ci			.gpio1  = 0x00e3e341,
17798c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
17808c2ecf20Sopenharmony_ci			.gpio3  = 0x00000000,
17818c2ecf20Sopenharmony_ci		},
17828c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
17838c2ecf20Sopenharmony_ci	},
17848c2ecf20Sopenharmony_ci	[CX88_BOARD_NOTONLYTV_LV3H] = {
17858c2ecf20Sopenharmony_ci		.name           = "NotOnlyTV LV3H",
17868c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
17878c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
17888c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
17898c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
17908c2ecf20Sopenharmony_ci		/* if gpio1:bit9 is enabled, DVB-T won't work */
17918c2ecf20Sopenharmony_ci
17928c2ecf20Sopenharmony_ci		.input          = { {
17938c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
17948c2ecf20Sopenharmony_ci			.vmux   = 0,
17958c2ecf20Sopenharmony_ci			.gpio0  = 0x0000,
17968c2ecf20Sopenharmony_ci			.gpio1  = 0xa141,
17978c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
17988c2ecf20Sopenharmony_ci		}, {
17998c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
18008c2ecf20Sopenharmony_ci			.vmux   = 1,
18018c2ecf20Sopenharmony_ci			.gpio0  = 0x0000,
18028c2ecf20Sopenharmony_ci			.gpio1  = 0xa161,
18038c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
18048c2ecf20Sopenharmony_ci		}, {
18058c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
18068c2ecf20Sopenharmony_ci			.vmux   = 2,
18078c2ecf20Sopenharmony_ci			.gpio0  = 0x0000,
18088c2ecf20Sopenharmony_ci			.gpio1  = 0xa161,
18098c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
18108c2ecf20Sopenharmony_ci		} },
18118c2ecf20Sopenharmony_ci		.radio = {
18128c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
18138c2ecf20Sopenharmony_ci			.gpio0  = 0x0000,
18148c2ecf20Sopenharmony_ci			.gpio1  = 0xa141,
18158c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
18168c2ecf20Sopenharmony_ci		},
18178c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
18188c2ecf20Sopenharmony_ci	},
18198c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
18208c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T PRO",
18218c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
18228c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
18238c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
18248c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
18258c2ecf20Sopenharmony_ci		.input          = { {
18268c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
18278c2ecf20Sopenharmony_ci			.vmux   = 1,
18288c2ecf20Sopenharmony_ci			.gpio0  = 0x000067df,
18298c2ecf20Sopenharmony_ci		}, {
18308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
18318c2ecf20Sopenharmony_ci			.vmux   = 2,
18328c2ecf20Sopenharmony_ci			.gpio0  = 0x000067df,
18338c2ecf20Sopenharmony_ci		} },
18348c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
18358c2ecf20Sopenharmony_ci	},
18368c2ecf20Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
18378c2ecf20Sopenharmony_ci		.name           = "DViCO FusionHDTV 7 Gold",
18388c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC5000,
18398c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
18408c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
18418c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
18428c2ecf20Sopenharmony_ci		.input          = { {
18438c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
18448c2ecf20Sopenharmony_ci			.vmux   = 0,
18458c2ecf20Sopenharmony_ci			.gpio0  = 0x10df,
18468c2ecf20Sopenharmony_ci		}, {
18478c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
18488c2ecf20Sopenharmony_ci			.vmux   = 1,
18498c2ecf20Sopenharmony_ci			.gpio0  = 0x16d9,
18508c2ecf20Sopenharmony_ci		}, {
18518c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
18528c2ecf20Sopenharmony_ci			.vmux   = 2,
18538c2ecf20Sopenharmony_ci			.gpio0  = 0x16d9,
18548c2ecf20Sopenharmony_ci		} },
18558c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
18568c2ecf20Sopenharmony_ci	},
18578c2ecf20Sopenharmony_ci	[CX88_BOARD_PROLINK_PV_8000GT] = {
18588c2ecf20Sopenharmony_ci		.name           = "Prolink Pixelview MPEG 8000GT",
18598c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
18608c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
18618c2ecf20Sopenharmony_ci		.input          = { {
18628c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
18638c2ecf20Sopenharmony_ci			.vmux   = 0,
18648c2ecf20Sopenharmony_ci			.gpio0 = 0x0ff,
18658c2ecf20Sopenharmony_ci			.gpio2 = 0x0cfb,
18668c2ecf20Sopenharmony_ci		}, {
18678c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
18688c2ecf20Sopenharmony_ci			.vmux   = 1,
18698c2ecf20Sopenharmony_ci			.gpio2 = 0x0cfb,
18708c2ecf20Sopenharmony_ci		}, {
18718c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
18728c2ecf20Sopenharmony_ci			.vmux   = 2,
18738c2ecf20Sopenharmony_ci			.gpio2 = 0x0cfb,
18748c2ecf20Sopenharmony_ci		} },
18758c2ecf20Sopenharmony_ci		.radio = {
18768c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
18778c2ecf20Sopenharmony_ci			.gpio2 = 0x0cfb,
18788c2ecf20Sopenharmony_ci		},
18798c2ecf20Sopenharmony_ci	},
18808c2ecf20Sopenharmony_ci	[CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
18818c2ecf20Sopenharmony_ci		.name           = "Prolink Pixelview Global Extreme",
18828c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
18838c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
18848c2ecf20Sopenharmony_ci		.input          = { {
18858c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
18868c2ecf20Sopenharmony_ci			.vmux   = 0,
18878c2ecf20Sopenharmony_ci			.gpio0 = 0x04fb,
18888c2ecf20Sopenharmony_ci			.gpio1 = 0x04080,
18898c2ecf20Sopenharmony_ci			.gpio2 = 0x0cf7,
18908c2ecf20Sopenharmony_ci		}, {
18918c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
18928c2ecf20Sopenharmony_ci			.vmux   = 1,
18938c2ecf20Sopenharmony_ci			.gpio0 = 0x04fb,
18948c2ecf20Sopenharmony_ci			.gpio1 = 0x04080,
18958c2ecf20Sopenharmony_ci			.gpio2 = 0x0cfb,
18968c2ecf20Sopenharmony_ci		}, {
18978c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
18988c2ecf20Sopenharmony_ci			.vmux   = 2,
18998c2ecf20Sopenharmony_ci			.gpio0 = 0x04fb,
19008c2ecf20Sopenharmony_ci			.gpio1 = 0x04080,
19018c2ecf20Sopenharmony_ci			.gpio2 = 0x0cfb,
19028c2ecf20Sopenharmony_ci		} },
19038c2ecf20Sopenharmony_ci		.radio = {
19048c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
19058c2ecf20Sopenharmony_ci			.gpio0 = 0x04ff,
19068c2ecf20Sopenharmony_ci			.gpio1 = 0x04080,
19078c2ecf20Sopenharmony_ci			.gpio2 = 0x0cf7,
19088c2ecf20Sopenharmony_ci		},
19098c2ecf20Sopenharmony_ci	},
19108c2ecf20Sopenharmony_ci	/*
19118c2ecf20Sopenharmony_ci	 * Both radio, analog and ATSC work with this board.
19128c2ecf20Sopenharmony_ci	 * However, for analog to work, s5h1409 gate should be open,
19138c2ecf20Sopenharmony_ci	 * otherwise, tuner-xc3028 won't be detected.
19148c2ecf20Sopenharmony_ci	 * A proper fix require using the newer i2c methods to add
19158c2ecf20Sopenharmony_ci	 * tuner-xc3028 without doing an i2c probe.
19168c2ecf20Sopenharmony_ci	 */
19178c2ecf20Sopenharmony_ci	[CX88_BOARD_KWORLD_ATSC_120] = {
19188c2ecf20Sopenharmony_ci		.name           = "Kworld PlusTV HD PCI 120 (ATSC 120)",
19198c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
19208c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
19218c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
19228c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
19238c2ecf20Sopenharmony_ci		.input          = { {
19248c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
19258c2ecf20Sopenharmony_ci			.vmux   = 0,
19268c2ecf20Sopenharmony_ci			.gpio0  = 0x000000ff,
19278c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f35d,
19288c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
19298c2ecf20Sopenharmony_ci		}, {
19308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
19318c2ecf20Sopenharmony_ci			.vmux   = 1,
19328c2ecf20Sopenharmony_ci			.gpio0  = 0x000000ff,
19338c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f37e,
19348c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
19358c2ecf20Sopenharmony_ci		}, {
19368c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
19378c2ecf20Sopenharmony_ci			.vmux   = 2,
19388c2ecf20Sopenharmony_ci			.gpio0  = 0x000000ff,
19398c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f37e,
19408c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
19418c2ecf20Sopenharmony_ci		} },
19428c2ecf20Sopenharmony_ci		.radio = {
19438c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
19448c2ecf20Sopenharmony_ci			.gpio0  = 0x000000ff,
19458c2ecf20Sopenharmony_ci			.gpio1  = 0x0000f35d,
19468c2ecf20Sopenharmony_ci			.gpio2  = 0x00000000,
19478c2ecf20Sopenharmony_ci		},
19488c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
19498c2ecf20Sopenharmony_ci	},
19508c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR4000] = {
19518c2ecf20Sopenharmony_ci		.name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
19528c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
19538c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
19548c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
19558c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
19568c2ecf20Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
19578c2ecf20Sopenharmony_ci		.audio_chip     = CX88_AUDIO_WM8775,
19588c2ecf20Sopenharmony_ci		/*
19598c2ecf20Sopenharmony_ci		 * GPIO0 (WINTV2000)
19608c2ecf20Sopenharmony_ci		 *
19618c2ecf20Sopenharmony_ci		 * Analogue     SAT     DVB-T
19628c2ecf20Sopenharmony_ci		 * Antenna      0xc4bf  0xc4bb
19638c2ecf20Sopenharmony_ci		 * Composite    0xc4bf  0xc4bb
19648c2ecf20Sopenharmony_ci		 * S-Video      0xc4bf  0xc4bb
19658c2ecf20Sopenharmony_ci		 * Composite1   0xc4ff  0xc4fb
19668c2ecf20Sopenharmony_ci		 * S-Video1     0xc4ff  0xc4fb
19678c2ecf20Sopenharmony_ci		 *
19688c2ecf20Sopenharmony_ci		 * BIT  VALUE   FUNCTION GP{x}_IO
19698c2ecf20Sopenharmony_ci		 * 0    1       I:?
19708c2ecf20Sopenharmony_ci		 * 1    1       I:?
19718c2ecf20Sopenharmony_ci		 * 2    1       O:MPEG PORT 0=DVB-T 1=DVB-S
19728c2ecf20Sopenharmony_ci		 * 3    1       I:?
19738c2ecf20Sopenharmony_ci		 * 4    1       I:?
19748c2ecf20Sopenharmony_ci		 * 5    1       I:?
19758c2ecf20Sopenharmony_ci		 * 6    0       O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
19768c2ecf20Sopenharmony_ci		 * 7    1       O:DVB-T DEMOD RESET LOW
19778c2ecf20Sopenharmony_ci		 *
19788c2ecf20Sopenharmony_ci		 * BIT  VALUE   FUNCTION GP{x}_OE
19798c2ecf20Sopenharmony_ci		 * 8    0       I
19808c2ecf20Sopenharmony_ci		 * 9    0       I
19818c2ecf20Sopenharmony_ci		 * a    1       O
19828c2ecf20Sopenharmony_ci		 * b    0       I
19838c2ecf20Sopenharmony_ci		 * c    0       I
19848c2ecf20Sopenharmony_ci		 * d    0       I
19858c2ecf20Sopenharmony_ci		 * e    1       O
19868c2ecf20Sopenharmony_ci		 * f    1       O
19878c2ecf20Sopenharmony_ci		 *
19888c2ecf20Sopenharmony_ci		 * WM8775 ADC
19898c2ecf20Sopenharmony_ci		 *
19908c2ecf20Sopenharmony_ci		 * 1: TV Audio / FM Mono
19918c2ecf20Sopenharmony_ci		 * 2: Line-In
19928c2ecf20Sopenharmony_ci		 * 3: Line-In Expansion
19938c2ecf20Sopenharmony_ci		 * 4: FM Stereo
19948c2ecf20Sopenharmony_ci		 */
19958c2ecf20Sopenharmony_ci		.input          = { {
19968c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
19978c2ecf20Sopenharmony_ci			.vmux   = 0,
19988c2ecf20Sopenharmony_ci			.gpio0  = 0xc4bf,
19998c2ecf20Sopenharmony_ci			/* 1: TV Audio / FM Mono */
20008c2ecf20Sopenharmony_ci			.audioroute = 1,
20018c2ecf20Sopenharmony_ci		}, {
20028c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
20038c2ecf20Sopenharmony_ci			.vmux   = 1,
20048c2ecf20Sopenharmony_ci			.gpio0  = 0xc4bf,
20058c2ecf20Sopenharmony_ci			/* 2: Line-In */
20068c2ecf20Sopenharmony_ci			.audioroute = 2,
20078c2ecf20Sopenharmony_ci		}, {
20088c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
20098c2ecf20Sopenharmony_ci			.vmux   = 2,
20108c2ecf20Sopenharmony_ci			.gpio0  = 0xc4bf,
20118c2ecf20Sopenharmony_ci			/* 2: Line-In */
20128c2ecf20Sopenharmony_ci			.audioroute = 2,
20138c2ecf20Sopenharmony_ci		} },
20148c2ecf20Sopenharmony_ci		.radio = {
20158c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
20168c2ecf20Sopenharmony_ci			.gpio0	= 0xc4bf,
20178c2ecf20Sopenharmony_ci			/* 4: FM Stereo */
20188c2ecf20Sopenharmony_ci			.audioroute = 8,
20198c2ecf20Sopenharmony_ci		},
20208c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20218c2ecf20Sopenharmony_ci		.num_frontends	= 2,
20228c2ecf20Sopenharmony_ci	},
20238c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
20248c2ecf20Sopenharmony_ci		.name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
20258c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20268c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20278c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
20288c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
20298c2ecf20Sopenharmony_ci		.input          = { {
20308c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
20318c2ecf20Sopenharmony_ci			.vmux   = 0,
20328c2ecf20Sopenharmony_ci		} },
20338c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20348c2ecf20Sopenharmony_ci	},
20358c2ecf20Sopenharmony_ci	[CX88_BOARD_TEVII_S420] = {
20368c2ecf20Sopenharmony_ci		.name           = "TeVii S420 DVB-S",
20378c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20388c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20398c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
20408c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
20418c2ecf20Sopenharmony_ci		.input          = { {
20428c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
20438c2ecf20Sopenharmony_ci			.vmux   = 0,
20448c2ecf20Sopenharmony_ci		} },
20458c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20468c2ecf20Sopenharmony_ci	},
20478c2ecf20Sopenharmony_ci	[CX88_BOARD_TEVII_S460] = {
20488c2ecf20Sopenharmony_ci		.name           = "TeVii S460 DVB-S/S2",
20498c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20508c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20518c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
20528c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
20538c2ecf20Sopenharmony_ci		.input          = { {
20548c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
20558c2ecf20Sopenharmony_ci			.vmux   = 0,
20568c2ecf20Sopenharmony_ci		} },
20578c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20588c2ecf20Sopenharmony_ci	},
20598c2ecf20Sopenharmony_ci	[CX88_BOARD_TEVII_S464] = {
20608c2ecf20Sopenharmony_ci		.name           = "TeVii S464 DVB-S/S2",
20618c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20628c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20638c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
20648c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
20658c2ecf20Sopenharmony_ci		.input          = { {
20668c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
20678c2ecf20Sopenharmony_ci			.vmux   = 0,
20688c2ecf20Sopenharmony_ci		} },
20698c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20708c2ecf20Sopenharmony_ci	},
20718c2ecf20Sopenharmony_ci	[CX88_BOARD_OMICOM_SS4_PCI] = {
20728c2ecf20Sopenharmony_ci		.name           = "Omicom SS4 DVB-S/S2 PCI",
20738c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20748c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20758c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
20768c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
20778c2ecf20Sopenharmony_ci		.input          = { {
20788c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
20798c2ecf20Sopenharmony_ci			.vmux   = 0,
20808c2ecf20Sopenharmony_ci		} },
20818c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20828c2ecf20Sopenharmony_ci	},
20838c2ecf20Sopenharmony_ci	[CX88_BOARD_TBS_8910] = {
20848c2ecf20Sopenharmony_ci		.name           = "TBS 8910 DVB-S",
20858c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20868c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20878c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
20888c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
20898c2ecf20Sopenharmony_ci		.input          = { {
20908c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
20918c2ecf20Sopenharmony_ci			.vmux   = 0,
20928c2ecf20Sopenharmony_ci		} },
20938c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
20948c2ecf20Sopenharmony_ci	},
20958c2ecf20Sopenharmony_ci	[CX88_BOARD_TBS_8920] = {
20968c2ecf20Sopenharmony_ci		.name           = "TBS 8920 DVB-S/S2",
20978c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
20988c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
20998c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
21008c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
21018c2ecf20Sopenharmony_ci		.input          = { {
21028c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
21038c2ecf20Sopenharmony_ci			.vmux   = 0,
21048c2ecf20Sopenharmony_ci			.gpio0  = 0x8080,
21058c2ecf20Sopenharmony_ci		} },
21068c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
21078c2ecf20Sopenharmony_ci	},
21088c2ecf20Sopenharmony_ci	[CX88_BOARD_PROF_6200] = {
21098c2ecf20Sopenharmony_ci		.name           = "Prof 6200 DVB-S",
21108c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
21118c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
21128c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
21138c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
21148c2ecf20Sopenharmony_ci		.input          = { {
21158c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
21168c2ecf20Sopenharmony_ci			.vmux   = 0,
21178c2ecf20Sopenharmony_ci		} },
21188c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
21198c2ecf20Sopenharmony_ci	},
21208c2ecf20Sopenharmony_ci	[CX88_BOARD_PROF_7300] = {
21218c2ecf20Sopenharmony_ci		.name           = "PROF 7300 DVB-S/S2",
21228c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
21238c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
21248c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
21258c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
21268c2ecf20Sopenharmony_ci		.input          = { {
21278c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
21288c2ecf20Sopenharmony_ci			.vmux   = 0,
21298c2ecf20Sopenharmony_ci		} },
21308c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
21318c2ecf20Sopenharmony_ci	},
21328c2ecf20Sopenharmony_ci	[CX88_BOARD_SATTRADE_ST4200] = {
21338c2ecf20Sopenharmony_ci		.name           = "SATTRADE ST4200 DVB-S/S2",
21348c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
21358c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
21368c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
21378c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
21388c2ecf20Sopenharmony_ci		.input          = { {
21398c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
21408c2ecf20Sopenharmony_ci			.vmux   = 0,
21418c2ecf20Sopenharmony_ci		} },
21428c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
21438c2ecf20Sopenharmony_ci	},
21448c2ecf20Sopenharmony_ci	[CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
21458c2ecf20Sopenharmony_ci		.name           = "Terratec Cinergy HT PCI MKII",
21468c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
21478c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
21488c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
21498c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
21508c2ecf20Sopenharmony_ci		.input          = { {
21518c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
21528c2ecf20Sopenharmony_ci			.vmux   = 0,
21538c2ecf20Sopenharmony_ci			.gpio0  = 0x004ff,
21548c2ecf20Sopenharmony_ci			.gpio1  = 0x010ff,
21558c2ecf20Sopenharmony_ci			.gpio2  = 0x00001,
21568c2ecf20Sopenharmony_ci		}, {
21578c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
21588c2ecf20Sopenharmony_ci			.vmux   = 1,
21598c2ecf20Sopenharmony_ci			.gpio0  = 0x004fb,
21608c2ecf20Sopenharmony_ci			.gpio1  = 0x010ef,
21618c2ecf20Sopenharmony_ci			.audioroute = 1,
21628c2ecf20Sopenharmony_ci		}, {
21638c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
21648c2ecf20Sopenharmony_ci			.vmux   = 2,
21658c2ecf20Sopenharmony_ci			.gpio0  = 0x004fb,
21668c2ecf20Sopenharmony_ci			.gpio1  = 0x010ef,
21678c2ecf20Sopenharmony_ci			.audioroute = 1,
21688c2ecf20Sopenharmony_ci		} },
21698c2ecf20Sopenharmony_ci		.radio = {
21708c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
21718c2ecf20Sopenharmony_ci			.gpio0  = 0x004ff,
21728c2ecf20Sopenharmony_ci			.gpio1  = 0x010ff,
21738c2ecf20Sopenharmony_ci			.gpio2  = 0x0ff,
21748c2ecf20Sopenharmony_ci		},
21758c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
21768c2ecf20Sopenharmony_ci	},
21778c2ecf20Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_IRONLY] = {
21788c2ecf20Sopenharmony_ci		.name           = "Hauppauge WinTV-IR Only",
21798c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
21808c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
21818c2ecf20Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
21828c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
21838c2ecf20Sopenharmony_ci	},
21848c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV1800H] = {
21858c2ecf20Sopenharmony_ci		.name           = "Leadtek WinFast DTV1800 Hybrid",
21868c2ecf20Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
21878c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
21888c2ecf20Sopenharmony_ci		.tuner_addr     = 0x61,
21898c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
21908c2ecf20Sopenharmony_ci		/*
21918c2ecf20Sopenharmony_ci		 * GPIO setting
21928c2ecf20Sopenharmony_ci		 *
21938c2ecf20Sopenharmony_ci		 *  2: mute (0=off,1=on)
21948c2ecf20Sopenharmony_ci		 * 12: tuner reset pin
21958c2ecf20Sopenharmony_ci		 * 13: audio source (0=tuner audio,1=line in)
21968c2ecf20Sopenharmony_ci		 * 14: FM (0=on,1=off ???)
21978c2ecf20Sopenharmony_ci		 */
21988c2ecf20Sopenharmony_ci		.input          = { {
21998c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
22008c2ecf20Sopenharmony_ci			.vmux   = 0,
22018c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
22028c2ecf20Sopenharmony_ci			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
22038c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
22048c2ecf20Sopenharmony_ci		}, {
22058c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
22068c2ecf20Sopenharmony_ci			.vmux   = 1,
22078c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
22088c2ecf20Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
22098c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
22108c2ecf20Sopenharmony_ci		}, {
22118c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
22128c2ecf20Sopenharmony_ci			.vmux   = 2,
22138c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
22148c2ecf20Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
22158c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
22168c2ecf20Sopenharmony_ci		} },
22178c2ecf20Sopenharmony_ci		.radio = {
22188c2ecf20Sopenharmony_ci			.type   = CX88_RADIO,
22198c2ecf20Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
22208c2ecf20Sopenharmony_ci			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
22218c2ecf20Sopenharmony_ci			.gpio2  = 0x0000,
22228c2ecf20Sopenharmony_ci		},
22238c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
22248c2ecf20Sopenharmony_ci	},
22258c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV1800H_XC4000] = {
22268c2ecf20Sopenharmony_ci		.name		= "Leadtek WinFast DTV1800 H (XC4000)",
22278c2ecf20Sopenharmony_ci		.tuner_type	= TUNER_XC4000,
22288c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
22298c2ecf20Sopenharmony_ci		.tuner_addr	= 0x61,
22308c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
22318c2ecf20Sopenharmony_ci		/*
22328c2ecf20Sopenharmony_ci		 * GPIO setting
22338c2ecf20Sopenharmony_ci		 *
22348c2ecf20Sopenharmony_ci		 *  2: mute (0=off,1=on)
22358c2ecf20Sopenharmony_ci		 * 12: tuner reset pin
22368c2ecf20Sopenharmony_ci		 * 13: audio source (0=tuner audio,1=line in)
22378c2ecf20Sopenharmony_ci		 * 14: FM (0=on,1=off ???)
22388c2ecf20Sopenharmony_ci		 */
22398c2ecf20Sopenharmony_ci		.input		= { {
22408c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_TELEVISION,
22418c2ecf20Sopenharmony_ci			.vmux	= 0,
22428c2ecf20Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
22438c2ecf20Sopenharmony_ci			.gpio1	= 0x6040,	/* pin 13 = 0, pin 14 = 1 */
22448c2ecf20Sopenharmony_ci			.gpio2	= 0x0000,
22458c2ecf20Sopenharmony_ci		}, {
22468c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
22478c2ecf20Sopenharmony_ci			.vmux	= 1,
22488c2ecf20Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
22498c2ecf20Sopenharmony_ci			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
22508c2ecf20Sopenharmony_ci			.gpio2	= 0x0000,
22518c2ecf20Sopenharmony_ci		}, {
22528c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
22538c2ecf20Sopenharmony_ci			.vmux	= 2,
22548c2ecf20Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
22558c2ecf20Sopenharmony_ci			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
22568c2ecf20Sopenharmony_ci			.gpio2	= 0x0000,
22578c2ecf20Sopenharmony_ci		} },
22588c2ecf20Sopenharmony_ci		.radio = {
22598c2ecf20Sopenharmony_ci			.type	= CX88_RADIO,
22608c2ecf20Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
22618c2ecf20Sopenharmony_ci			.gpio1	= 0x6000,	/* pin 13 = 0, pin 14 = 0 */
22628c2ecf20Sopenharmony_ci			.gpio2	= 0x0000,
22638c2ecf20Sopenharmony_ci		},
22648c2ecf20Sopenharmony_ci		.mpeg		= CX88_MPEG_DVB,
22658c2ecf20Sopenharmony_ci	},
22668c2ecf20Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV2000H_PLUS] = {
22678c2ecf20Sopenharmony_ci		.name		= "Leadtek WinFast DTV2000 H PLUS",
22688c2ecf20Sopenharmony_ci		.tuner_type	= TUNER_XC4000,
22698c2ecf20Sopenharmony_ci		.radio_type	= UNSET,
22708c2ecf20Sopenharmony_ci		.tuner_addr	= 0x61,
22718c2ecf20Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
22728c2ecf20Sopenharmony_ci		/*
22738c2ecf20Sopenharmony_ci		 * GPIO
22748c2ecf20Sopenharmony_ci		 *   2: 1: mute audio
22758c2ecf20Sopenharmony_ci		 *  12: 0: reset XC4000
22768c2ecf20Sopenharmony_ci		 *  13: 1: audio input is line in (0: tuner)
22778c2ecf20Sopenharmony_ci		 *  14: 0: FM radio
22788c2ecf20Sopenharmony_ci		 *  16: 0: RF input is cable
22798c2ecf20Sopenharmony_ci		 */
22808c2ecf20Sopenharmony_ci		.input		= { {
22818c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_TELEVISION,
22828c2ecf20Sopenharmony_ci			.vmux	= 0,
22838c2ecf20Sopenharmony_ci			.gpio0	= 0x0403,
22848c2ecf20Sopenharmony_ci			.gpio1	= 0xF0D7,
22858c2ecf20Sopenharmony_ci			.gpio2	= 0x0101,
22868c2ecf20Sopenharmony_ci			.gpio3	= 0x0000,
22878c2ecf20Sopenharmony_ci		}, {
22888c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_CABLE,
22898c2ecf20Sopenharmony_ci			.vmux	= 0,
22908c2ecf20Sopenharmony_ci			.gpio0	= 0x0403,
22918c2ecf20Sopenharmony_ci			.gpio1	= 0xF0D7,
22928c2ecf20Sopenharmony_ci			.gpio2	= 0x0100,
22938c2ecf20Sopenharmony_ci			.gpio3	= 0x0000,
22948c2ecf20Sopenharmony_ci		}, {
22958c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
22968c2ecf20Sopenharmony_ci			.vmux	= 1,
22978c2ecf20Sopenharmony_ci			.gpio0	= 0x0403,	/* was 0x0407 */
22988c2ecf20Sopenharmony_ci			.gpio1	= 0xF0F7,
22998c2ecf20Sopenharmony_ci			.gpio2	= 0x0101,
23008c2ecf20Sopenharmony_ci			.gpio3	= 0x0000,
23018c2ecf20Sopenharmony_ci		}, {
23028c2ecf20Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
23038c2ecf20Sopenharmony_ci			.vmux	= 2,
23048c2ecf20Sopenharmony_ci			.gpio0	= 0x0403,	/* was 0x0407 */
23058c2ecf20Sopenharmony_ci			.gpio1	= 0xF0F7,
23068c2ecf20Sopenharmony_ci			.gpio2	= 0x0101,
23078c2ecf20Sopenharmony_ci			.gpio3	= 0x0000,
23088c2ecf20Sopenharmony_ci		} },
23098c2ecf20Sopenharmony_ci		.radio = {
23108c2ecf20Sopenharmony_ci			.type	= CX88_RADIO,
23118c2ecf20Sopenharmony_ci			.gpio0	= 0x0403,
23128c2ecf20Sopenharmony_ci			.gpio1	= 0xF097,
23138c2ecf20Sopenharmony_ci			.gpio2	= 0x0100,
23148c2ecf20Sopenharmony_ci			.gpio3	= 0x0000,
23158c2ecf20Sopenharmony_ci		},
23168c2ecf20Sopenharmony_ci		.mpeg		= CX88_MPEG_DVB,
23178c2ecf20Sopenharmony_ci	},
23188c2ecf20Sopenharmony_ci	[CX88_BOARD_PROF_7301] = {
23198c2ecf20Sopenharmony_ci		.name           = "Prof 7301 DVB-S/S2",
23208c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
23218c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
23228c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
23238c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
23248c2ecf20Sopenharmony_ci		.input          = { {
23258c2ecf20Sopenharmony_ci			.type   = CX88_VMUX_DVB,
23268c2ecf20Sopenharmony_ci			.vmux   = 0,
23278c2ecf20Sopenharmony_ci		} },
23288c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
23298c2ecf20Sopenharmony_ci	},
23308c2ecf20Sopenharmony_ci	[CX88_BOARD_TWINHAN_VP1027_DVBS] = {
23318c2ecf20Sopenharmony_ci		.name		= "Twinhan VP-1027 DVB-S",
23328c2ecf20Sopenharmony_ci		.tuner_type     = UNSET,
23338c2ecf20Sopenharmony_ci		.radio_type     = UNSET,
23348c2ecf20Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
23358c2ecf20Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
23368c2ecf20Sopenharmony_ci		.input          = { {
23378c2ecf20Sopenharmony_ci		       .type   = CX88_VMUX_DVB,
23388c2ecf20Sopenharmony_ci		       .vmux   = 0,
23398c2ecf20Sopenharmony_ci		} },
23408c2ecf20Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
23418c2ecf20Sopenharmony_ci	},
23428c2ecf20Sopenharmony_ci};
23438c2ecf20Sopenharmony_ci
23448c2ecf20Sopenharmony_ci/* ------------------------------------------------------------------ */
23458c2ecf20Sopenharmony_ci/* PCI subsystem IDs                                                  */
23468c2ecf20Sopenharmony_ci
23478c2ecf20Sopenharmony_cistatic const struct cx88_subid cx88_subids[] = {
23488c2ecf20Sopenharmony_ci	{
23498c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
23508c2ecf20Sopenharmony_ci		.subdevice = 0x3400,
23518c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE,
23528c2ecf20Sopenharmony_ci	}, {
23538c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
23548c2ecf20Sopenharmony_ci		.subdevice = 0x3401,
23558c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE,
23568c2ecf20Sopenharmony_ci	}, {
23578c2ecf20Sopenharmony_ci		.subvendor = 0x14c7,
23588c2ecf20Sopenharmony_ci		.subdevice = 0x0106,
23598c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_GDI,
23608c2ecf20Sopenharmony_ci	}, {
23618c2ecf20Sopenharmony_ci		.subvendor = 0x14c7,
23628c2ecf20Sopenharmony_ci		.subdevice = 0x0107, /* with mpeg encoder */
23638c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_GDI,
23648c2ecf20Sopenharmony_ci	}, {
23658c2ecf20Sopenharmony_ci		.subvendor = PCI_VENDOR_ID_ATI,
23668c2ecf20Sopenharmony_ci		.subdevice = 0x00f8,
23678c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ATI_WONDER_PRO,
23688c2ecf20Sopenharmony_ci	}, {
23698c2ecf20Sopenharmony_ci		.subvendor = PCI_VENDOR_ID_ATI,
23708c2ecf20Sopenharmony_ci		.subdevice = 0x00f9,
23718c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ATI_WONDER_PRO,
23728c2ecf20Sopenharmony_ci	}, {
23738c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
23748c2ecf20Sopenharmony_ci		.subdevice = 0x6611,
23758c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
23768c2ecf20Sopenharmony_ci	}, {
23778c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
23788c2ecf20Sopenharmony_ci		.subdevice = 0x6613,	/* NTSC */
23798c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
23808c2ecf20Sopenharmony_ci	}, {
23818c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
23828c2ecf20Sopenharmony_ci		.subdevice = 0x6620,
23838c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DV2000,
23848c2ecf20Sopenharmony_ci	}, {
23858c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
23868c2ecf20Sopenharmony_ci		.subdevice = 0x663b,
23878c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
23888c2ecf20Sopenharmony_ci	}, {
23898c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
23908c2ecf20Sopenharmony_ci		.subdevice = 0x663c,
23918c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
23928c2ecf20Sopenharmony_ci	}, {
23938c2ecf20Sopenharmony_ci		.subvendor = 0x1461,
23948c2ecf20Sopenharmony_ci		.subdevice = 0x000b,
23958c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_AVERTV_STUDIO_303,
23968c2ecf20Sopenharmony_ci	}, {
23978c2ecf20Sopenharmony_ci		.subvendor = 0x1462,
23988c2ecf20Sopenharmony_ci		.subdevice = 0x8606,
23998c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,
24008c2ecf20Sopenharmony_ci	}, {
24018c2ecf20Sopenharmony_ci		.subvendor = 0x10fc,
24028c2ecf20Sopenharmony_ci		.subdevice = 0xd003,
24038c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_IODATA_GVVCP3PCI,
24048c2ecf20Sopenharmony_ci	}, {
24058c2ecf20Sopenharmony_ci		.subvendor = 0x1043,
24068c2ecf20Sopenharmony_ci		.subdevice = 0x4823,  /* with mpeg encoder */
24078c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ASUS_PVR_416,
24088c2ecf20Sopenharmony_ci	}, {
24098c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
24108c2ecf20Sopenharmony_ci		.subdevice = 0x08a6,
24118c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVB_T,
24128c2ecf20Sopenharmony_ci	}, {
24138c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
24148c2ecf20Sopenharmony_ci		.subdevice = 0xd810,
24158c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
24168c2ecf20Sopenharmony_ci	}, {
24178c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
24188c2ecf20Sopenharmony_ci		.subdevice = 0xd820,
24198c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
24208c2ecf20Sopenharmony_ci	}, {
24218c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
24228c2ecf20Sopenharmony_ci		.subdevice = 0xdb00,
24238c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
24248c2ecf20Sopenharmony_ci	}, {
24258c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
24268c2ecf20Sopenharmony_ci		.subdevice = 0x9002,
24278c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
24288c2ecf20Sopenharmony_ci	}, {
24298c2ecf20Sopenharmony_ci		.subvendor = 0x14f1,
24308c2ecf20Sopenharmony_ci		.subdevice = 0x0187,
24318c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_CONEXANT_DVB_T1,
24328c2ecf20Sopenharmony_ci	}, {
24338c2ecf20Sopenharmony_ci		.subvendor = 0x1540,
24348c2ecf20Sopenharmony_ci		.subdevice = 0x2580,
24358c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PROVIDEO_PV259,
24368c2ecf20Sopenharmony_ci	}, {
24378c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
24388c2ecf20Sopenharmony_ci		.subdevice = 0xdb10,
24398c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
24408c2ecf20Sopenharmony_ci	}, {
24418c2ecf20Sopenharmony_ci		.subvendor = 0x1554,
24428c2ecf20Sopenharmony_ci		.subdevice = 0x4811,
24438c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PIXELVIEW,
24448c2ecf20Sopenharmony_ci	}, {
24458c2ecf20Sopenharmony_ci		.subvendor = 0x7063,
24468c2ecf20Sopenharmony_ci		.subdevice = 0x3000, /* HD-3000 card */
24478c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PCHDTV_HD3000,
24488c2ecf20Sopenharmony_ci	}, {
24498c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
24508c2ecf20Sopenharmony_ci		.subdevice = 0xa8a6,
24518c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DNTV_LIVE_DVB_T,
24528c2ecf20Sopenharmony_ci	}, {
24538c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
24548c2ecf20Sopenharmony_ci		.subdevice = 0x2801,
24558c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_ROSLYN,
24568c2ecf20Sopenharmony_ci	}, {
24578c2ecf20Sopenharmony_ci		.subvendor = 0x14f1,
24588c2ecf20Sopenharmony_ci		.subdevice = 0x0342,
24598c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DIGITALLOGIC_MEC,
24608c2ecf20Sopenharmony_ci	}, {
24618c2ecf20Sopenharmony_ci		.subvendor = 0x10fc,
24628c2ecf20Sopenharmony_ci		.subdevice = 0xd035,
24638c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_IODATA_GVBCTV7E,
24648c2ecf20Sopenharmony_ci	}, {
24658c2ecf20Sopenharmony_ci		.subvendor = 0x1421,
24668c2ecf20Sopenharmony_ci		.subdevice = 0x0334,
24678c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ADSTECH_DVB_T_PCI,
24688c2ecf20Sopenharmony_ci	}, {
24698c2ecf20Sopenharmony_ci		.subvendor = 0x153b,
24708c2ecf20Sopenharmony_ci		.subdevice = 0x1166,
24718c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
24728c2ecf20Sopenharmony_ci	}, {
24738c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
24748c2ecf20Sopenharmony_ci		.subdevice = 0xd500,
24758c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
24768c2ecf20Sopenharmony_ci	}, {
24778c2ecf20Sopenharmony_ci		.subvendor = 0x1461,
24788c2ecf20Sopenharmony_ci		.subdevice = 0x8011,
24798c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
24808c2ecf20Sopenharmony_ci	}, {
24818c2ecf20Sopenharmony_ci		.subvendor = PCI_VENDOR_ID_ATI,
24828c2ecf20Sopenharmony_ci		.subdevice = 0xa101,
24838c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ATI_HDTVWONDER,
24848c2ecf20Sopenharmony_ci	}, {
24858c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
24868c2ecf20Sopenharmony_ci		.subdevice = 0x665f,
24878c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV1000,
24888c2ecf20Sopenharmony_ci	}, {
24898c2ecf20Sopenharmony_ci		.subvendor = 0x1461,
24908c2ecf20Sopenharmony_ci		.subdevice = 0x000a,
24918c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_AVERTV_303,
24928c2ecf20Sopenharmony_ci	}, {
24938c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
24948c2ecf20Sopenharmony_ci		.subdevice = 0x9200,
24958c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
24968c2ecf20Sopenharmony_ci	}, {
24978c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
24988c2ecf20Sopenharmony_ci		.subdevice = 0x9201,
24998c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
25008c2ecf20Sopenharmony_ci	}, {
25018c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
25028c2ecf20Sopenharmony_ci		.subdevice = 0x9202,
25038c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
25048c2ecf20Sopenharmony_ci	}, {
25058c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
25068c2ecf20Sopenharmony_ci		.subdevice = 0x08b2,
25078c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVBS_100,
25088c2ecf20Sopenharmony_ci	}, {
25098c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
25108c2ecf20Sopenharmony_ci		.subdevice = 0x9400,
25118c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
25128c2ecf20Sopenharmony_ci	}, {
25138c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
25148c2ecf20Sopenharmony_ci		.subdevice = 0x9402,
25158c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
25168c2ecf20Sopenharmony_ci	}, {
25178c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
25188c2ecf20Sopenharmony_ci		.subdevice = 0x9800,
25198c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
25208c2ecf20Sopenharmony_ci	}, {
25218c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
25228c2ecf20Sopenharmony_ci		.subdevice = 0x9802,
25238c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
25248c2ecf20Sopenharmony_ci	}, {
25258c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
25268c2ecf20Sopenharmony_ci		.subdevice = 0x9001,
25278c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
25288c2ecf20Sopenharmony_ci	}, {
25298c2ecf20Sopenharmony_ci		.subvendor = 0x1822,
25308c2ecf20Sopenharmony_ci		.subdevice = 0x0025,
25318c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
25328c2ecf20Sopenharmony_ci	}, {
25338c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
25348c2ecf20Sopenharmony_ci		.subdevice = 0x08a1,
25358c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
25368c2ecf20Sopenharmony_ci	}, {
25378c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
25388c2ecf20Sopenharmony_ci		.subdevice = 0xdb50,
25398c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
25408c2ecf20Sopenharmony_ci	}, {
25418c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
25428c2ecf20Sopenharmony_ci		.subdevice = 0xdb54,
25438c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
25448c2ecf20Sopenharmony_ci		/* Re-branded DViCO: DigitalNow DVB-T Dual */
25458c2ecf20Sopenharmony_ci	}, {
25468c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
25478c2ecf20Sopenharmony_ci		.subdevice = 0xdb11,
25488c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
25498c2ecf20Sopenharmony_ci		/* Re-branded DViCO: UltraView DVB-T Plus */
25508c2ecf20Sopenharmony_ci	}, {
25518c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
25528c2ecf20Sopenharmony_ci		.subdevice = 0xdb30,
25538c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
25548c2ecf20Sopenharmony_ci	}, {
25558c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
25568c2ecf20Sopenharmony_ci		.subdevice = 0x0840,
25578c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
25588c2ecf20Sopenharmony_ci	}, {
25598c2ecf20Sopenharmony_ci		.subvendor = 0x1421,
25608c2ecf20Sopenharmony_ci		.subdevice = 0x0305,
25618c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
25628c2ecf20Sopenharmony_ci	}, {
25638c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
25648c2ecf20Sopenharmony_ci		.subdevice = 0xdb40,
25658c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
25668c2ecf20Sopenharmony_ci	}, {
25678c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
25688c2ecf20Sopenharmony_ci		.subdevice = 0xdb44,
25698c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
25708c2ecf20Sopenharmony_ci	}, {
25718c2ecf20Sopenharmony_ci		.subvendor = 0x7063,
25728c2ecf20Sopenharmony_ci		.subdevice = 0x5500,
25738c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PCHDTV_HD5500,
25748c2ecf20Sopenharmony_ci	}, {
25758c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
25768c2ecf20Sopenharmony_ci		.subdevice = 0x0841,
25778c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_MCE200_DELUXE,
25788c2ecf20Sopenharmony_ci	}, {
25798c2ecf20Sopenharmony_ci		.subvendor = 0x1822,
25808c2ecf20Sopenharmony_ci		.subdevice = 0x0019,
25818c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
25828c2ecf20Sopenharmony_ci	}, {
25838c2ecf20Sopenharmony_ci		.subvendor = 0x1554,
25848c2ecf20Sopenharmony_ci		.subdevice = 0x4813,
25858c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
25868c2ecf20Sopenharmony_ci	}, {
25878c2ecf20Sopenharmony_ci		.subvendor = 0x14f1,
25888c2ecf20Sopenharmony_ci		.subdevice = 0x0842,
25898c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
25908c2ecf20Sopenharmony_ci	}, {
25918c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
25928c2ecf20Sopenharmony_ci		.subdevice = 0x665e,
25938c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV2000H,
25948c2ecf20Sopenharmony_ci	}, {
25958c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
25968c2ecf20Sopenharmony_ci		.subdevice = 0x6f2b,
25978c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV2000H_J,
25988c2ecf20Sopenharmony_ci	}, {
25998c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
26008c2ecf20Sopenharmony_ci		.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
26018c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
26028c2ecf20Sopenharmony_ci	}, {
26038c2ecf20Sopenharmony_ci		.subvendor = 0x14f1,
26048c2ecf20Sopenharmony_ci		.subdevice = 0x0084,
26058c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_GENIATECH_DVBS,
26068c2ecf20Sopenharmony_ci	}, {
26078c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26088c2ecf20Sopenharmony_ci		.subdevice = 0x1404,
26098c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
26108c2ecf20Sopenharmony_ci	}, {
26118c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
26128c2ecf20Sopenharmony_ci		.subdevice = 0xdc00,
26138c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
26148c2ecf20Sopenharmony_ci	}, {
26158c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
26168c2ecf20Sopenharmony_ci		.subdevice = 0xdccd,
26178c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
26188c2ecf20Sopenharmony_ci	}, {
26198c2ecf20Sopenharmony_ci		.subvendor = 0x1461,
26208c2ecf20Sopenharmony_ci		.subdevice = 0xc111, /* AverMedia M150-D */
26218c2ecf20Sopenharmony_ci		/* This board is known to work with the ASUS PVR416 config */
26228c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ASUS_PVR_416,
26238c2ecf20Sopenharmony_ci	}, {
26248c2ecf20Sopenharmony_ci		.subvendor = 0xc180,
26258c2ecf20Sopenharmony_ci		.subdevice = 0xc980,
26268c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,
26278c2ecf20Sopenharmony_ci	}, {
26288c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26298c2ecf20Sopenharmony_ci		.subdevice = 0x9600,
26308c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
26318c2ecf20Sopenharmony_ci	}, {
26328c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26338c2ecf20Sopenharmony_ci		.subdevice = 0x9601,
26348c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
26358c2ecf20Sopenharmony_ci	}, {
26368c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26378c2ecf20Sopenharmony_ci		.subdevice = 0x9602,
26388c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
26398c2ecf20Sopenharmony_ci	}, {
26408c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
26418c2ecf20Sopenharmony_ci		.subdevice = 0x6632,
26428c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
26438c2ecf20Sopenharmony_ci	}, {
26448c2ecf20Sopenharmony_ci		.subvendor = 0x12ab,
26458c2ecf20Sopenharmony_ci		.subdevice = 0x2300, /* Club3D Zap TV2100 */
26468c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
26478c2ecf20Sopenharmony_ci	}, {
26488c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26498c2ecf20Sopenharmony_ci		.subdevice = 0x9000,
26508c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
26518c2ecf20Sopenharmony_ci	}, {
26528c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26538c2ecf20Sopenharmony_ci		.subdevice = 0x1400,
26548c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
26558c2ecf20Sopenharmony_ci	}, {
26568c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26578c2ecf20Sopenharmony_ci		.subdevice = 0x1401,
26588c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
26598c2ecf20Sopenharmony_ci	}, {
26608c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
26618c2ecf20Sopenharmony_ci		.subdevice = 0x1402,
26628c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
26638c2ecf20Sopenharmony_ci	}, {
26648c2ecf20Sopenharmony_ci		.subvendor = 0x1421,
26658c2ecf20Sopenharmony_ci		.subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
26668c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVBS_100,
26678c2ecf20Sopenharmony_ci	}, {
26688c2ecf20Sopenharmony_ci		.subvendor = 0x1421,
26698c2ecf20Sopenharmony_ci		.subdevice = 0x0390,
26708c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_ADSTECH_PTV_390,
26718c2ecf20Sopenharmony_ci	}, {
26728c2ecf20Sopenharmony_ci		.subvendor = 0x11bd,
26738c2ecf20Sopenharmony_ci		.subdevice = 0x0051,
26748c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PINNACLE_PCTV_HD_800i,
26758c2ecf20Sopenharmony_ci	}, {
26768c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
26778c2ecf20Sopenharmony_ci		.subdevice = 0xd530,
26788c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,
26798c2ecf20Sopenharmony_ci	}, {
26808c2ecf20Sopenharmony_ci		.subvendor = 0x12ab,
26818c2ecf20Sopenharmony_ci		.subdevice = 0x1788,
26828c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PINNACLE_HYBRID_PCTV,
26838c2ecf20Sopenharmony_ci	}, {
26848c2ecf20Sopenharmony_ci		.subvendor = 0x14f1,
26858c2ecf20Sopenharmony_ci		.subdevice = 0xea3d,
26868c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_POWERCOLOR_REAL_ANGEL,
26878c2ecf20Sopenharmony_ci	}, {
26888c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
26898c2ecf20Sopenharmony_ci		.subdevice = 0x6f18,
26908c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
26918c2ecf20Sopenharmony_ci	}, {
26928c2ecf20Sopenharmony_ci		/* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */
26938c2ecf20Sopenharmony_ci		.subvendor = 0x14f1,
26948c2ecf20Sopenharmony_ci		.subdevice = 0x8852,
26958c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_GENIATECH_X8000_MT,
26968c2ecf20Sopenharmony_ci	}, {
26978c2ecf20Sopenharmony_ci		.subvendor = 0x18ac,
26988c2ecf20Sopenharmony_ci		.subdevice = 0xd610,
26998c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,
27008c2ecf20Sopenharmony_ci	}, {
27018c2ecf20Sopenharmony_ci		.subvendor = 0x1554,
27028c2ecf20Sopenharmony_ci		.subdevice = 0x4935,
27038c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PROLINK_PV_8000GT,
27048c2ecf20Sopenharmony_ci	}, {
27058c2ecf20Sopenharmony_ci		.subvendor = 0x1554,
27068c2ecf20Sopenharmony_ci		.subdevice = 0x4976,
27078c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,
27088c2ecf20Sopenharmony_ci	}, {
27098c2ecf20Sopenharmony_ci		.subvendor = 0x17de,
27108c2ecf20Sopenharmony_ci		.subdevice = 0x08c1,
27118c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_ATSC_120,
27128c2ecf20Sopenharmony_ci	}, {
27138c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
27148c2ecf20Sopenharmony_ci		.subdevice = 0x6900,
27158c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
27168c2ecf20Sopenharmony_ci	}, {
27178c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
27188c2ecf20Sopenharmony_ci		.subdevice = 0x6904,
27198c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
27208c2ecf20Sopenharmony_ci	}, {
27218c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
27228c2ecf20Sopenharmony_ci		.subdevice = 0x6902,
27238c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
27248c2ecf20Sopenharmony_ci	}, {
27258c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
27268c2ecf20Sopenharmony_ci		.subdevice = 0x6905,
27278c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
27288c2ecf20Sopenharmony_ci	}, {
27298c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
27308c2ecf20Sopenharmony_ci		.subdevice = 0x6906,
27318c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
27328c2ecf20Sopenharmony_ci	}, {
27338c2ecf20Sopenharmony_ci		.subvendor = 0xd420,
27348c2ecf20Sopenharmony_ci		.subdevice = 0x9022,
27358c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TEVII_S420,
27368c2ecf20Sopenharmony_ci	}, {
27378c2ecf20Sopenharmony_ci		.subvendor = 0xd460,
27388c2ecf20Sopenharmony_ci		.subdevice = 0x9022,
27398c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TEVII_S460,
27408c2ecf20Sopenharmony_ci	}, {
27418c2ecf20Sopenharmony_ci		.subvendor = 0xd464,
27428c2ecf20Sopenharmony_ci		.subdevice = 0x9022,
27438c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TEVII_S464,
27448c2ecf20Sopenharmony_ci	}, {
27458c2ecf20Sopenharmony_ci		.subvendor = 0xA044,
27468c2ecf20Sopenharmony_ci		.subdevice = 0x2011,
27478c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_OMICOM_SS4_PCI,
27488c2ecf20Sopenharmony_ci	}, {
27498c2ecf20Sopenharmony_ci		.subvendor = 0x8910,
27508c2ecf20Sopenharmony_ci		.subdevice = 0x8888,
27518c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TBS_8910,
27528c2ecf20Sopenharmony_ci	}, {
27538c2ecf20Sopenharmony_ci		.subvendor = 0x8920,
27548c2ecf20Sopenharmony_ci		.subdevice = 0x8888,
27558c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TBS_8920,
27568c2ecf20Sopenharmony_ci	}, {
27578c2ecf20Sopenharmony_ci		.subvendor = 0xb022,
27588c2ecf20Sopenharmony_ci		.subdevice = 0x3022,
27598c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PROF_6200,
27608c2ecf20Sopenharmony_ci	}, {
27618c2ecf20Sopenharmony_ci		.subvendor = 0xB033,
27628c2ecf20Sopenharmony_ci		.subdevice = 0x3033,
27638c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PROF_7300,
27648c2ecf20Sopenharmony_ci	}, {
27658c2ecf20Sopenharmony_ci		.subvendor = 0xb200,
27668c2ecf20Sopenharmony_ci		.subdevice = 0x4200,
27678c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_SATTRADE_ST4200,
27688c2ecf20Sopenharmony_ci	}, {
27698c2ecf20Sopenharmony_ci		.subvendor = 0x153b,
27708c2ecf20Sopenharmony_ci		.subdevice = 0x1177,
27718c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,
27728c2ecf20Sopenharmony_ci	}, {
27738c2ecf20Sopenharmony_ci		.subvendor = 0x0070,
27748c2ecf20Sopenharmony_ci		.subdevice = 0x9290,
27758c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_IRONLY,
27768c2ecf20Sopenharmony_ci	}, {
27778c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
27788c2ecf20Sopenharmony_ci		.subdevice = 0x6654,
27798c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV1800H,
27808c2ecf20Sopenharmony_ci	}, {
27818c2ecf20Sopenharmony_ci		/* WinFast DTV1800 H with XC4000 tuner */
27828c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
27838c2ecf20Sopenharmony_ci		.subdevice = 0x6f38,
27848c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV1800H_XC4000,
27858c2ecf20Sopenharmony_ci	}, {
27868c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
27878c2ecf20Sopenharmony_ci		.subdevice = 0x6f42,
27888c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV2000H_PLUS,
27898c2ecf20Sopenharmony_ci	}, {
27908c2ecf20Sopenharmony_ci		/* PVR2000 PAL Model [107d:6630] */
27918c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
27928c2ecf20Sopenharmony_ci		.subdevice = 0x6630,
27938c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
27948c2ecf20Sopenharmony_ci	}, {
27958c2ecf20Sopenharmony_ci		/* PVR2000 PAL Model [107d:6638] */
27968c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
27978c2ecf20Sopenharmony_ci		.subdevice = 0x6638,
27988c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
27998c2ecf20Sopenharmony_ci	}, {
28008c2ecf20Sopenharmony_ci		/* PVR2000 NTSC Model [107d:6631] */
28018c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28028c2ecf20Sopenharmony_ci		.subdevice = 0x6631,
28038c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
28048c2ecf20Sopenharmony_ci	}, {
28058c2ecf20Sopenharmony_ci		/* PVR2000 NTSC Model [107d:6637] */
28068c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28078c2ecf20Sopenharmony_ci		.subdevice = 0x6637,
28088c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
28098c2ecf20Sopenharmony_ci	}, {
28108c2ecf20Sopenharmony_ci		/* PVR2000 NTSC Model [107d:663d] */
28118c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28128c2ecf20Sopenharmony_ci		.subdevice = 0x663d,
28138c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
28148c2ecf20Sopenharmony_ci	}, {
28158c2ecf20Sopenharmony_ci		/* DV2000 NTSC Model [107d:6621] */
28168c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28178c2ecf20Sopenharmony_ci		.subdevice = 0x6621,
28188c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DV2000,
28198c2ecf20Sopenharmony_ci	}, {
28208c2ecf20Sopenharmony_ci		/* TV2000 XP Global [107d:6618]  */
28218c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28228c2ecf20Sopenharmony_ci		.subdevice = 0x6618,
28238c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
28248c2ecf20Sopenharmony_ci	}, {
28258c2ecf20Sopenharmony_ci		/* TV2000 XP Global [107d:6618] */
28268c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28278c2ecf20Sopenharmony_ci		.subdevice = 0x6619,
28288c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
28298c2ecf20Sopenharmony_ci	}, {
28308c2ecf20Sopenharmony_ci		/* WinFast TV2000 XP Global with XC4000 tuner */
28318c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28328c2ecf20Sopenharmony_ci		.subdevice = 0x6f36,
28338c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36,
28348c2ecf20Sopenharmony_ci	}, {
28358c2ecf20Sopenharmony_ci		/* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */
28368c2ecf20Sopenharmony_ci		.subvendor = 0x107d,
28378c2ecf20Sopenharmony_ci		.subdevice = 0x6f43,
28388c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43,
28398c2ecf20Sopenharmony_ci	}, {
28408c2ecf20Sopenharmony_ci		.subvendor = 0xb034,
28418c2ecf20Sopenharmony_ci		.subdevice = 0x3034,
28428c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_PROF_7301,
28438c2ecf20Sopenharmony_ci	}, {
28448c2ecf20Sopenharmony_ci		.subvendor = 0x1822,
28458c2ecf20Sopenharmony_ci		.subdevice = 0x0023,
28468c2ecf20Sopenharmony_ci		.card      = CX88_BOARD_TWINHAN_VP1027_DVBS,
28478c2ecf20Sopenharmony_ci	},
28488c2ecf20Sopenharmony_ci};
28498c2ecf20Sopenharmony_ci
28508c2ecf20Sopenharmony_ci/*
28518c2ecf20Sopenharmony_ci * some leadtek specific stuff
28528c2ecf20Sopenharmony_ci */
28538c2ecf20Sopenharmony_cistatic void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
28548c2ecf20Sopenharmony_ci{
28558c2ecf20Sopenharmony_ci	if (eeprom_data[4] != 0x7d ||
28568c2ecf20Sopenharmony_ci	    eeprom_data[5] != 0x10 ||
28578c2ecf20Sopenharmony_ci	    eeprom_data[7] != 0x66) {
28588c2ecf20Sopenharmony_ci		pr_warn("Leadtek eeprom invalid.\n");
28598c2ecf20Sopenharmony_ci		return;
28608c2ecf20Sopenharmony_ci	}
28618c2ecf20Sopenharmony_ci
28628c2ecf20Sopenharmony_ci	/* Terry Wu <terrywu2009@gmail.com> */
28638c2ecf20Sopenharmony_ci	switch (eeprom_data[6]) {
28648c2ecf20Sopenharmony_ci	case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
28658c2ecf20Sopenharmony_ci	case 0x21: /* SSID 6621 for DV2000 NTSC Model */
28668c2ecf20Sopenharmony_ci	case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
28678c2ecf20Sopenharmony_ci	case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
28688c2ecf20Sopenharmony_ci	case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
28698c2ecf20Sopenharmony_ci		core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
28708c2ecf20Sopenharmony_ci		break;
28718c2ecf20Sopenharmony_ci	default:
28728c2ecf20Sopenharmony_ci		core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
28738c2ecf20Sopenharmony_ci		break;
28748c2ecf20Sopenharmony_ci	}
28758c2ecf20Sopenharmony_ci
28768c2ecf20Sopenharmony_ci	pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n",
28778c2ecf20Sopenharmony_ci		core->board.tuner_type, eeprom_data[0]);
28788c2ecf20Sopenharmony_ci}
28798c2ecf20Sopenharmony_ci
28808c2ecf20Sopenharmony_cistatic void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
28818c2ecf20Sopenharmony_ci{
28828c2ecf20Sopenharmony_ci	struct tveeprom tv;
28838c2ecf20Sopenharmony_ci
28848c2ecf20Sopenharmony_ci	tveeprom_hauppauge_analog(&tv, eeprom_data);
28858c2ecf20Sopenharmony_ci	core->board.tuner_type = tv.tuner_type;
28868c2ecf20Sopenharmony_ci	core->tuner_formats = tv.tuner_formats;
28878c2ecf20Sopenharmony_ci	core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;
28888c2ecf20Sopenharmony_ci	core->model = tv.model;
28898c2ecf20Sopenharmony_ci
28908c2ecf20Sopenharmony_ci	/* Make sure we support the board model */
28918c2ecf20Sopenharmony_ci	switch (tv.model) {
28928c2ecf20Sopenharmony_ci	case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
28938c2ecf20Sopenharmony_ci	case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
28948c2ecf20Sopenharmony_ci	case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
28958c2ecf20Sopenharmony_ci	case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
28968c2ecf20Sopenharmony_ci	case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
28978c2ecf20Sopenharmony_ci	case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
28988c2ecf20Sopenharmony_ci	case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
28998c2ecf20Sopenharmony_ci	case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
29008c2ecf20Sopenharmony_ci	case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
29018c2ecf20Sopenharmony_ci	case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
29028c2ecf20Sopenharmony_ci	case 34519: /* WinTV-PCI-FM */
29038c2ecf20Sopenharmony_ci	case 69009:
29048c2ecf20Sopenharmony_ci		/* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
29058c2ecf20Sopenharmony_ci	case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
29068c2ecf20Sopenharmony_ci	case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
29078c2ecf20Sopenharmony_ci	case 69559:
29088c2ecf20Sopenharmony_ci		/* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
29098c2ecf20Sopenharmony_ci	case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
29108c2ecf20Sopenharmony_ci	case 90002: /* Nova-T-PCI (9002) */
29118c2ecf20Sopenharmony_ci	case 92001: /* Nova-S-Plus (Video and IR) */
29128c2ecf20Sopenharmony_ci	case 92002: /* Nova-S-Plus (Video and IR) */
29138c2ecf20Sopenharmony_ci	case 90003: /* Nova-T-PCI (9002 No RF out) */
29148c2ecf20Sopenharmony_ci	case 90500: /* Nova-T-PCI (oem) */
29158c2ecf20Sopenharmony_ci	case 90501: /* Nova-T-PCI (oem/IR) */
29168c2ecf20Sopenharmony_ci	case 92000: /* Nova-SE2 (OEM, No Video or IR) */
29178c2ecf20Sopenharmony_ci	case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */
29188c2ecf20Sopenharmony_ci	case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
29198c2ecf20Sopenharmony_ci	case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
29208c2ecf20Sopenharmony_ci	case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
29218c2ecf20Sopenharmony_ci	case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
29228c2ecf20Sopenharmony_ci	case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
29238c2ecf20Sopenharmony_ci	case 96569: /* WinTV-HVR1300 () */
29248c2ecf20Sopenharmony_ci	case 96659: /* WinTV-HVR1300 () */
29258c2ecf20Sopenharmony_ci	case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
29268c2ecf20Sopenharmony_ci		/* known */
29278c2ecf20Sopenharmony_ci		break;
29288c2ecf20Sopenharmony_ci	case CX88_BOARD_SAMSUNG_SMT_7020:
29298c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x008989FF);
29308c2ecf20Sopenharmony_ci		break;
29318c2ecf20Sopenharmony_ci	default:
29328c2ecf20Sopenharmony_ci		pr_warn("warning: unknown hauppauge model #%d\n", tv.model);
29338c2ecf20Sopenharmony_ci		break;
29348c2ecf20Sopenharmony_ci	}
29358c2ecf20Sopenharmony_ci
29368c2ecf20Sopenharmony_ci	pr_info("hauppauge eeprom: model=%d\n", tv.model);
29378c2ecf20Sopenharmony_ci}
29388c2ecf20Sopenharmony_ci
29398c2ecf20Sopenharmony_ci/*
29408c2ecf20Sopenharmony_ci * some GDI (was: Modular Technology) specific stuff
29418c2ecf20Sopenharmony_ci */
29428c2ecf20Sopenharmony_ci
29438c2ecf20Sopenharmony_cistatic const struct {
29448c2ecf20Sopenharmony_ci	int  id;
29458c2ecf20Sopenharmony_ci	int  fm;
29468c2ecf20Sopenharmony_ci	const char *name;
29478c2ecf20Sopenharmony_ci} gdi_tuner[] = {
29488c2ecf20Sopenharmony_ci	[0x01] = { .id   = UNSET,
29498c2ecf20Sopenharmony_ci		   .name = "NTSC_M" },
29508c2ecf20Sopenharmony_ci	[0x02] = { .id   = UNSET,
29518c2ecf20Sopenharmony_ci		   .name = "PAL_B" },
29528c2ecf20Sopenharmony_ci	[0x03] = { .id   = UNSET,
29538c2ecf20Sopenharmony_ci		   .name = "PAL_I" },
29548c2ecf20Sopenharmony_ci	[0x04] = { .id   = UNSET,
29558c2ecf20Sopenharmony_ci		   .name = "PAL_D" },
29568c2ecf20Sopenharmony_ci	[0x05] = { .id   = UNSET,
29578c2ecf20Sopenharmony_ci		   .name = "SECAM" },
29588c2ecf20Sopenharmony_ci
29598c2ecf20Sopenharmony_ci	[0x10] = { .id   = UNSET,
29608c2ecf20Sopenharmony_ci		   .fm   = 1,
29618c2ecf20Sopenharmony_ci		   .name = "TEMIC_4049" },
29628c2ecf20Sopenharmony_ci	[0x11] = { .id   = TUNER_TEMIC_4136FY5,
29638c2ecf20Sopenharmony_ci		   .name = "TEMIC_4136" },
29648c2ecf20Sopenharmony_ci	[0x12] = { .id   = UNSET,
29658c2ecf20Sopenharmony_ci		   .name = "TEMIC_4146" },
29668c2ecf20Sopenharmony_ci
29678c2ecf20Sopenharmony_ci	[0x20] = { .id   = TUNER_PHILIPS_FQ1216ME,
29688c2ecf20Sopenharmony_ci		   .fm   = 1,
29698c2ecf20Sopenharmony_ci		   .name = "PHILIPS_FQ1216_MK3" },
29708c2ecf20Sopenharmony_ci	[0x21] = { .id   = UNSET, .fm = 1,
29718c2ecf20Sopenharmony_ci		   .name = "PHILIPS_FQ1236_MK3" },
29728c2ecf20Sopenharmony_ci	[0x22] = { .id   = UNSET,
29738c2ecf20Sopenharmony_ci		   .name = "PHILIPS_FI1236_MK3" },
29748c2ecf20Sopenharmony_ci	[0x23] = { .id   = UNSET,
29758c2ecf20Sopenharmony_ci		   .name = "PHILIPS_FI1216_MK3" },
29768c2ecf20Sopenharmony_ci};
29778c2ecf20Sopenharmony_ci
29788c2ecf20Sopenharmony_cistatic void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
29798c2ecf20Sopenharmony_ci{
29808c2ecf20Sopenharmony_ci	const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
29818c2ecf20Sopenharmony_ci		? gdi_tuner[eeprom_data[0x0d]].name : NULL;
29828c2ecf20Sopenharmony_ci
29838c2ecf20Sopenharmony_ci	pr_info("GDI: tuner=%s\n", name ? name : "unknown");
29848c2ecf20Sopenharmony_ci	if (!name)
29858c2ecf20Sopenharmony_ci		return;
29868c2ecf20Sopenharmony_ci	core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
29878c2ecf20Sopenharmony_ci	core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?
29888c2ecf20Sopenharmony_ci		CX88_RADIO : 0;
29898c2ecf20Sopenharmony_ci}
29908c2ecf20Sopenharmony_ci
29918c2ecf20Sopenharmony_ci/*
29928c2ecf20Sopenharmony_ci * some Divco specific stuff
29938c2ecf20Sopenharmony_ci */
29948c2ecf20Sopenharmony_cistatic int cx88_dvico_xc2028_callback(struct cx88_core *core,
29958c2ecf20Sopenharmony_ci				      int command, int arg)
29968c2ecf20Sopenharmony_ci{
29978c2ecf20Sopenharmony_ci	switch (command) {
29988c2ecf20Sopenharmony_ci	case XC2028_TUNER_RESET:
29998c2ecf20Sopenharmony_ci		switch (core->boardnr) {
30008c2ecf20Sopenharmony_ci		case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
30018c2ecf20Sopenharmony_ci			/* GPIO-4 xc3028 tuner */
30028c2ecf20Sopenharmony_ci
30038c2ecf20Sopenharmony_ci			cx_set(MO_GP0_IO, 0x00001000);
30048c2ecf20Sopenharmony_ci			cx_clear(MO_GP0_IO, 0x00000010);
30058c2ecf20Sopenharmony_ci			msleep(100);
30068c2ecf20Sopenharmony_ci			cx_set(MO_GP0_IO, 0x00000010);
30078c2ecf20Sopenharmony_ci			msleep(100);
30088c2ecf20Sopenharmony_ci			break;
30098c2ecf20Sopenharmony_ci		default:
30108c2ecf20Sopenharmony_ci			cx_write(MO_GP0_IO, 0x101000);
30118c2ecf20Sopenharmony_ci			mdelay(5);
30128c2ecf20Sopenharmony_ci			cx_set(MO_GP0_IO, 0x101010);
30138c2ecf20Sopenharmony_ci		}
30148c2ecf20Sopenharmony_ci		break;
30158c2ecf20Sopenharmony_ci	default:
30168c2ecf20Sopenharmony_ci		return -EINVAL;
30178c2ecf20Sopenharmony_ci	}
30188c2ecf20Sopenharmony_ci
30198c2ecf20Sopenharmony_ci	return 0;
30208c2ecf20Sopenharmony_ci}
30218c2ecf20Sopenharmony_ci
30228c2ecf20Sopenharmony_ci/*
30238c2ecf20Sopenharmony_ci * some Geniatech specific stuff
30248c2ecf20Sopenharmony_ci */
30258c2ecf20Sopenharmony_ci
30268c2ecf20Sopenharmony_cistatic int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
30278c2ecf20Sopenharmony_ci						int command, int mode)
30288c2ecf20Sopenharmony_ci{
30298c2ecf20Sopenharmony_ci	switch (command) {
30308c2ecf20Sopenharmony_ci	case XC2028_TUNER_RESET:
30318c2ecf20Sopenharmony_ci		switch (INPUT(core->input).type) {
30328c2ecf20Sopenharmony_ci		case CX88_RADIO:
30338c2ecf20Sopenharmony_ci			break;
30348c2ecf20Sopenharmony_ci		case CX88_VMUX_DVB:
30358c2ecf20Sopenharmony_ci			cx_write(MO_GP1_IO, 0x030302);
30368c2ecf20Sopenharmony_ci			mdelay(50);
30378c2ecf20Sopenharmony_ci			break;
30388c2ecf20Sopenharmony_ci		default:
30398c2ecf20Sopenharmony_ci			cx_write(MO_GP1_IO, 0x030301);
30408c2ecf20Sopenharmony_ci			mdelay(50);
30418c2ecf20Sopenharmony_ci		}
30428c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
30438c2ecf20Sopenharmony_ci		mdelay(50);
30448c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101000);
30458c2ecf20Sopenharmony_ci		mdelay(50);
30468c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
30478c2ecf20Sopenharmony_ci		mdelay(50);
30488c2ecf20Sopenharmony_ci		return 0;
30498c2ecf20Sopenharmony_ci	}
30508c2ecf20Sopenharmony_ci	return -EINVAL;
30518c2ecf20Sopenharmony_ci}
30528c2ecf20Sopenharmony_ci
30538c2ecf20Sopenharmony_cistatic int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
30548c2ecf20Sopenharmony_ci					     int command, int arg)
30558c2ecf20Sopenharmony_ci{
30568c2ecf20Sopenharmony_ci	switch (command) {
30578c2ecf20Sopenharmony_ci	case XC2028_TUNER_RESET:
30588c2ecf20Sopenharmony_ci		/* GPIO 12 (xc3028 tuner reset) */
30598c2ecf20Sopenharmony_ci		cx_set(MO_GP1_IO, 0x1010);
30608c2ecf20Sopenharmony_ci		mdelay(50);
30618c2ecf20Sopenharmony_ci		cx_clear(MO_GP1_IO, 0x10);
30628c2ecf20Sopenharmony_ci		mdelay(75);
30638c2ecf20Sopenharmony_ci		cx_set(MO_GP1_IO, 0x10);
30648c2ecf20Sopenharmony_ci		mdelay(75);
30658c2ecf20Sopenharmony_ci		return 0;
30668c2ecf20Sopenharmony_ci	}
30678c2ecf20Sopenharmony_ci	return -EINVAL;
30688c2ecf20Sopenharmony_ci}
30698c2ecf20Sopenharmony_ci
30708c2ecf20Sopenharmony_cistatic int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core,
30718c2ecf20Sopenharmony_ci						  int command, int arg)
30728c2ecf20Sopenharmony_ci{
30738c2ecf20Sopenharmony_ci	switch (command) {
30748c2ecf20Sopenharmony_ci	case XC4000_TUNER_RESET:
30758c2ecf20Sopenharmony_ci		/* GPIO 12 (xc4000 tuner reset) */
30768c2ecf20Sopenharmony_ci		cx_set(MO_GP1_IO, 0x1010);
30778c2ecf20Sopenharmony_ci		mdelay(50);
30788c2ecf20Sopenharmony_ci		cx_clear(MO_GP1_IO, 0x10);
30798c2ecf20Sopenharmony_ci		mdelay(75);
30808c2ecf20Sopenharmony_ci		cx_set(MO_GP1_IO, 0x10);
30818c2ecf20Sopenharmony_ci		mdelay(75);
30828c2ecf20Sopenharmony_ci		return 0;
30838c2ecf20Sopenharmony_ci	}
30848c2ecf20Sopenharmony_ci	return -EINVAL;
30858c2ecf20Sopenharmony_ci}
30868c2ecf20Sopenharmony_ci
30878c2ecf20Sopenharmony_ci/*
30888c2ecf20Sopenharmony_ci * some Divco specific stuff
30898c2ecf20Sopenharmony_ci */
30908c2ecf20Sopenharmony_cistatic int cx88_pv_8000gt_callback(struct cx88_core *core,
30918c2ecf20Sopenharmony_ci				   int command, int arg)
30928c2ecf20Sopenharmony_ci{
30938c2ecf20Sopenharmony_ci	switch (command) {
30948c2ecf20Sopenharmony_ci	case XC2028_TUNER_RESET:
30958c2ecf20Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
30968c2ecf20Sopenharmony_ci		mdelay(50);
30978c2ecf20Sopenharmony_ci		cx_write(MO_GP2_IO, 0xef5);
30988c2ecf20Sopenharmony_ci		mdelay(50);
30998c2ecf20Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
31008c2ecf20Sopenharmony_ci		break;
31018c2ecf20Sopenharmony_ci	default:
31028c2ecf20Sopenharmony_ci		return -EINVAL;
31038c2ecf20Sopenharmony_ci	}
31048c2ecf20Sopenharmony_ci
31058c2ecf20Sopenharmony_ci	return 0;
31068c2ecf20Sopenharmony_ci}
31078c2ecf20Sopenharmony_ci
31088c2ecf20Sopenharmony_ci/*
31098c2ecf20Sopenharmony_ci * some DViCO specific stuff
31108c2ecf20Sopenharmony_ci */
31118c2ecf20Sopenharmony_ci
31128c2ecf20Sopenharmony_cistatic void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
31138c2ecf20Sopenharmony_ci{
31148c2ecf20Sopenharmony_ci	struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
31158c2ecf20Sopenharmony_ci	int i, err;
31168c2ecf20Sopenharmony_ci	static u8 init_bufs[13][5] = {
31178c2ecf20Sopenharmony_ci		{ 0x10, 0x00, 0x20, 0x01, 0x03 },
31188c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x01, 0x00, 0x21 },
31198c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x10, 0x00, 0xCA },
31208c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x12, 0x00, 0x08 },
31218c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x13, 0x00, 0x0A },
31228c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x16, 0x01, 0xC0 },
31238c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x22, 0x01, 0x3D },
31248c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x73, 0x01, 0x2E },
31258c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x72, 0x00, 0xC5 },
31268c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x71, 0x01, 0x97 },
31278c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0x70, 0x00, 0x0F },
31288c2ecf20Sopenharmony_ci		{ 0x10, 0x10, 0xB0, 0x00, 0x01 },
31298c2ecf20Sopenharmony_ci		{ 0x03, 0x0C },
31308c2ecf20Sopenharmony_ci	};
31318c2ecf20Sopenharmony_ci
31328c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {
31338c2ecf20Sopenharmony_ci		msg.buf = init_bufs[i];
31348c2ecf20Sopenharmony_ci		msg.len = (i != 12 ? 5 : 2);
31358c2ecf20Sopenharmony_ci		err = i2c_transfer(&core->i2c_adap, &msg, 1);
31368c2ecf20Sopenharmony_ci		if (err != 1) {
31378c2ecf20Sopenharmony_ci			pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n",
31388c2ecf20Sopenharmony_ci				i, err);
31398c2ecf20Sopenharmony_ci			return;
31408c2ecf20Sopenharmony_ci		}
31418c2ecf20Sopenharmony_ci	}
31428c2ecf20Sopenharmony_ci}
31438c2ecf20Sopenharmony_ci
31448c2ecf20Sopenharmony_cistatic int cx88_xc2028_tuner_callback(struct cx88_core *core,
31458c2ecf20Sopenharmony_ci				      int command, int arg)
31468c2ecf20Sopenharmony_ci{
31478c2ecf20Sopenharmony_ci	/* Board-specific callbacks */
31488c2ecf20Sopenharmony_ci	switch (core->boardnr) {
31498c2ecf20Sopenharmony_ci	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
31508c2ecf20Sopenharmony_ci	case CX88_BOARD_GENIATECH_X8000_MT:
31518c2ecf20Sopenharmony_ci	case CX88_BOARD_KWORLD_ATSC_120:
31528c2ecf20Sopenharmony_ci		return cx88_xc3028_geniatech_tuner_callback(core,
31538c2ecf20Sopenharmony_ci							command, arg);
31548c2ecf20Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_8000GT:
31558c2ecf20Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
31568c2ecf20Sopenharmony_ci		return cx88_pv_8000gt_callback(core, command, arg);
31578c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
31588c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
31598c2ecf20Sopenharmony_ci		return cx88_dvico_xc2028_callback(core, command, arg);
31608c2ecf20Sopenharmony_ci	case CX88_BOARD_NOTONLYTV_LV3H:
31618c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
31628c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H:
31638c2ecf20Sopenharmony_ci		return cx88_xc3028_winfast1800h_callback(core, command, arg);
31648c2ecf20Sopenharmony_ci	}
31658c2ecf20Sopenharmony_ci
31668c2ecf20Sopenharmony_ci	switch (command) {
31678c2ecf20Sopenharmony_ci	case XC2028_TUNER_RESET:
31688c2ecf20Sopenharmony_ci		switch (INPUT(core->input).type) {
31698c2ecf20Sopenharmony_ci		case CX88_RADIO:
31708c2ecf20Sopenharmony_ci			dprintk(1, "setting GPIO to radio!\n");
31718c2ecf20Sopenharmony_ci			cx_write(MO_GP0_IO, 0x4ff);
31728c2ecf20Sopenharmony_ci			mdelay(250);
31738c2ecf20Sopenharmony_ci			cx_write(MO_GP2_IO, 0xff);
31748c2ecf20Sopenharmony_ci			mdelay(250);
31758c2ecf20Sopenharmony_ci			break;
31768c2ecf20Sopenharmony_ci		case CX88_VMUX_DVB:	/* Digital TV*/
31778c2ecf20Sopenharmony_ci		default:		/* Analog TV */
31788c2ecf20Sopenharmony_ci			dprintk(1, "setting GPIO to TV!\n");
31798c2ecf20Sopenharmony_ci			break;
31808c2ecf20Sopenharmony_ci		}
31818c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
31828c2ecf20Sopenharmony_ci		mdelay(250);
31838c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101000);
31848c2ecf20Sopenharmony_ci		mdelay(250);
31858c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
31868c2ecf20Sopenharmony_ci		mdelay(250);
31878c2ecf20Sopenharmony_ci		return 0;
31888c2ecf20Sopenharmony_ci	}
31898c2ecf20Sopenharmony_ci	return -EINVAL;
31908c2ecf20Sopenharmony_ci}
31918c2ecf20Sopenharmony_ci
31928c2ecf20Sopenharmony_cistatic int cx88_xc4000_tuner_callback(struct cx88_core *core,
31938c2ecf20Sopenharmony_ci				      int command, int arg)
31948c2ecf20Sopenharmony_ci{
31958c2ecf20Sopenharmony_ci	/* Board-specific callbacks */
31968c2ecf20Sopenharmony_ci	switch (core->boardnr) {
31978c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
31988c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
31998c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
32008c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
32018c2ecf20Sopenharmony_ci		return cx88_xc4000_winfast2000h_plus_callback(core,
32028c2ecf20Sopenharmony_ci							      command, arg);
32038c2ecf20Sopenharmony_ci	}
32048c2ecf20Sopenharmony_ci	return -EINVAL;
32058c2ecf20Sopenharmony_ci}
32068c2ecf20Sopenharmony_ci
32078c2ecf20Sopenharmony_ci/*
32088c2ecf20Sopenharmony_ci * Tuner callback function. Currently only needed for the Pinnacle
32098c2ecf20Sopenharmony_ci * PCTV HD 800i with an xc5000 sillicon tuner. This is used for both
32108c2ecf20Sopenharmony_ci * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c)
32118c2ecf20Sopenharmony_ci */
32128c2ecf20Sopenharmony_cistatic int cx88_xc5000_tuner_callback(struct cx88_core *core,
32138c2ecf20Sopenharmony_ci				      int command, int arg)
32148c2ecf20Sopenharmony_ci{
32158c2ecf20Sopenharmony_ci	switch (core->boardnr) {
32168c2ecf20Sopenharmony_ci	case CX88_BOARD_PINNACLE_PCTV_HD_800i:
32178c2ecf20Sopenharmony_ci		if (command == 0) { /* This is the reset command from xc5000 */
32188c2ecf20Sopenharmony_ci
32198c2ecf20Sopenharmony_ci			/*
32208c2ecf20Sopenharmony_ci			 * djh - According to the engineer at PCTV Systems,
32218c2ecf20Sopenharmony_ci			 * the xc5000 reset pin is supposed to be on GPIO12.
32228c2ecf20Sopenharmony_ci			 * However, despite three nights of effort, pulling
32238c2ecf20Sopenharmony_ci			 * that GPIO low didn't reset the xc5000.  While
32248c2ecf20Sopenharmony_ci			 * pulling MO_SRST_IO low does reset the xc5000, this
32258c2ecf20Sopenharmony_ci			 * also resets in the s5h1409 being reset as well.
32268c2ecf20Sopenharmony_ci			 * This causes tuning to always fail since the internal
32278c2ecf20Sopenharmony_ci			 * state of the s5h1409 does not match the driver's
32288c2ecf20Sopenharmony_ci			 * state.  Given that the only two conditions in which
32298c2ecf20Sopenharmony_ci			 * the driver performs a reset is during firmware load
32308c2ecf20Sopenharmony_ci			 * and powering down the chip, I am taking out the
32318c2ecf20Sopenharmony_ci			 * reset.  We know that the chip is being reset
32328c2ecf20Sopenharmony_ci			 * when the cx88 comes online, and not being able to
32338c2ecf20Sopenharmony_ci			 * do power management for this board is worse than
32348c2ecf20Sopenharmony_ci			 * not having any tuning at all.
32358c2ecf20Sopenharmony_ci			 */
32368c2ecf20Sopenharmony_ci			return 0;
32378c2ecf20Sopenharmony_ci		}
32388c2ecf20Sopenharmony_ci
32398c2ecf20Sopenharmony_ci		dprintk(1, "xc5000: unknown tuner callback command.\n");
32408c2ecf20Sopenharmony_ci		return -EINVAL;
32418c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
32428c2ecf20Sopenharmony_ci		if (command == 0) { /* This is the reset command from xc5000 */
32438c2ecf20Sopenharmony_ci			cx_clear(MO_GP0_IO, 0x00000010);
32448c2ecf20Sopenharmony_ci			usleep_range(10000, 20000);
32458c2ecf20Sopenharmony_ci			cx_set(MO_GP0_IO, 0x00000010);
32468c2ecf20Sopenharmony_ci			return 0;
32478c2ecf20Sopenharmony_ci		}
32488c2ecf20Sopenharmony_ci
32498c2ecf20Sopenharmony_ci		dprintk(1, "xc5000: unknown tuner callback command.\n");
32508c2ecf20Sopenharmony_ci		return -EINVAL;
32518c2ecf20Sopenharmony_ci	}
32528c2ecf20Sopenharmony_ci	return 0; /* Should never be here */
32538c2ecf20Sopenharmony_ci}
32548c2ecf20Sopenharmony_ci
32558c2ecf20Sopenharmony_ciint cx88_tuner_callback(void *priv, int component, int command, int arg)
32568c2ecf20Sopenharmony_ci{
32578c2ecf20Sopenharmony_ci	struct i2c_algo_bit_data *i2c_algo = priv;
32588c2ecf20Sopenharmony_ci	struct cx88_core *core;
32598c2ecf20Sopenharmony_ci
32608c2ecf20Sopenharmony_ci	if (!i2c_algo) {
32618c2ecf20Sopenharmony_ci		pr_err("Error - i2c private data undefined.\n");
32628c2ecf20Sopenharmony_ci		return -EINVAL;
32638c2ecf20Sopenharmony_ci	}
32648c2ecf20Sopenharmony_ci
32658c2ecf20Sopenharmony_ci	core = i2c_algo->data;
32668c2ecf20Sopenharmony_ci
32678c2ecf20Sopenharmony_ci	if (!core) {
32688c2ecf20Sopenharmony_ci		pr_err("Error - device struct undefined.\n");
32698c2ecf20Sopenharmony_ci		return -EINVAL;
32708c2ecf20Sopenharmony_ci	}
32718c2ecf20Sopenharmony_ci
32728c2ecf20Sopenharmony_ci	if (component != DVB_FRONTEND_COMPONENT_TUNER)
32738c2ecf20Sopenharmony_ci		return -EINVAL;
32748c2ecf20Sopenharmony_ci
32758c2ecf20Sopenharmony_ci	switch (core->board.tuner_type) {
32768c2ecf20Sopenharmony_ci	case TUNER_XC2028:
32778c2ecf20Sopenharmony_ci		dprintk(1, "Calling XC2028/3028 callback\n");
32788c2ecf20Sopenharmony_ci		return cx88_xc2028_tuner_callback(core, command, arg);
32798c2ecf20Sopenharmony_ci	case TUNER_XC4000:
32808c2ecf20Sopenharmony_ci		dprintk(1, "Calling XC4000 callback\n");
32818c2ecf20Sopenharmony_ci		return cx88_xc4000_tuner_callback(core, command, arg);
32828c2ecf20Sopenharmony_ci	case TUNER_XC5000:
32838c2ecf20Sopenharmony_ci		dprintk(1, "Calling XC5000 callback\n");
32848c2ecf20Sopenharmony_ci		return cx88_xc5000_tuner_callback(core, command, arg);
32858c2ecf20Sopenharmony_ci	}
32868c2ecf20Sopenharmony_ci	pr_err("Error: Calling callback for tuner %d\n",
32878c2ecf20Sopenharmony_ci	       core->board.tuner_type);
32888c2ecf20Sopenharmony_ci	return -EINVAL;
32898c2ecf20Sopenharmony_ci}
32908c2ecf20Sopenharmony_ciEXPORT_SYMBOL(cx88_tuner_callback);
32918c2ecf20Sopenharmony_ci
32928c2ecf20Sopenharmony_ci/* ----------------------------------------------------------------------- */
32938c2ecf20Sopenharmony_ci
32948c2ecf20Sopenharmony_cistatic void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
32958c2ecf20Sopenharmony_ci{
32968c2ecf20Sopenharmony_ci	int i;
32978c2ecf20Sopenharmony_ci
32988c2ecf20Sopenharmony_ci	if (!pci->subsystem_vendor && !pci->subsystem_device) {
32998c2ecf20Sopenharmony_ci		pr_err("Your board has no valid PCI Subsystem ID and thus can't\n");
33008c2ecf20Sopenharmony_ci		pr_err("be autodetected.  Please pass card=<n> insmod option to\n");
33018c2ecf20Sopenharmony_ci		pr_err("workaround that.  Redirect complaints to the vendor of\n");
33028c2ecf20Sopenharmony_ci		pr_err("the TV card\n");
33038c2ecf20Sopenharmony_ci	} else {
33048c2ecf20Sopenharmony_ci		pr_err("Your board isn't known (yet) to the driver.  You can\n");
33058c2ecf20Sopenharmony_ci		pr_err("try to pick one of the existing card configs via\n");
33068c2ecf20Sopenharmony_ci		pr_err("card=<n> insmod option.  Updating to the latest\n");
33078c2ecf20Sopenharmony_ci		pr_err("version might help as well.\n");
33088c2ecf20Sopenharmony_ci	}
33098c2ecf20Sopenharmony_ci	pr_err("Here is a list of valid choices for the card=<n> insmod option:\n");
33108c2ecf20Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)
33118c2ecf20Sopenharmony_ci		pr_err("    card=%d -> %s\n", i, cx88_boards[i].name);
33128c2ecf20Sopenharmony_ci}
33138c2ecf20Sopenharmony_ci
33148c2ecf20Sopenharmony_cistatic void cx88_card_setup_pre_i2c(struct cx88_core *core)
33158c2ecf20Sopenharmony_ci{
33168c2ecf20Sopenharmony_ci	switch (core->boardnr) {
33178c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1300:
33188c2ecf20Sopenharmony_ci		/*
33198c2ecf20Sopenharmony_ci		 * Bring the 702 demod up before i2c scanning/attach or
33208c2ecf20Sopenharmony_ci		 * devices are hidden.
33218c2ecf20Sopenharmony_ci		 *
33228c2ecf20Sopenharmony_ci		 * We leave here with the 702 on the bus
33238c2ecf20Sopenharmony_ci		 *
33248c2ecf20Sopenharmony_ci		 * "reset the IR receiver on GPIO[3]"
33258c2ecf20Sopenharmony_ci		 * Reported by Mike Crash <mike AT mikecrash.com>
33268c2ecf20Sopenharmony_ci		 */
33278c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x0000ef88);
33288c2ecf20Sopenharmony_ci		udelay(1000);
33298c2ecf20Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000088);
33308c2ecf20Sopenharmony_ci		udelay(50);
33318c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */
33328c2ecf20Sopenharmony_ci		udelay(1000);
33338c2ecf20Sopenharmony_ci		break;
33348c2ecf20Sopenharmony_ci
33358c2ecf20Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
33368c2ecf20Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_8000GT:
33378c2ecf20Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
33388c2ecf20Sopenharmony_ci		msleep(50);
33398c2ecf20Sopenharmony_ci		cx_write(MO_GP2_IO, 0xef5);
33408c2ecf20Sopenharmony_ci		msleep(50);
33418c2ecf20Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
33428c2ecf20Sopenharmony_ci		usleep_range(10000, 20000);
33438c2ecf20Sopenharmony_ci		break;
33448c2ecf20Sopenharmony_ci
33458c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
33468c2ecf20Sopenharmony_ci		/* Enable the xc5000 tuner */
33478c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00001010);
33488c2ecf20Sopenharmony_ci		break;
33498c2ecf20Sopenharmony_ci
33508c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV2000H_J:
33518c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR3000:
33528c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR4000:
33538c2ecf20Sopenharmony_ci		/* Init GPIO */
33548c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, core->board.input[0].gpio0);
33558c2ecf20Sopenharmony_ci		udelay(1000);
33568c2ecf20Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000080);
33578c2ecf20Sopenharmony_ci		udelay(50);
33588c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
33598c2ecf20Sopenharmony_ci		udelay(1000);
33608c2ecf20Sopenharmony_ci		break;
33618c2ecf20Sopenharmony_ci
33628c2ecf20Sopenharmony_ci	case CX88_BOARD_NOTONLYTV_LV3H:
33638c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
33648c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H:
33658c2ecf20Sopenharmony_ci		cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0);
33668c2ecf20Sopenharmony_ci		break;
33678c2ecf20Sopenharmony_ci
33688c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
33698c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
33708c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
33718c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
33728c2ecf20Sopenharmony_ci		cx88_xc4000_winfast2000h_plus_callback(core,
33738c2ecf20Sopenharmony_ci						       XC4000_TUNER_RESET, 0);
33748c2ecf20Sopenharmony_ci		break;
33758c2ecf20Sopenharmony_ci
33768c2ecf20Sopenharmony_ci	case CX88_BOARD_TWINHAN_VP1027_DVBS:
33778c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00003230);
33788c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00003210);
33798c2ecf20Sopenharmony_ci		usleep_range(10000, 20000);
33808c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00001230);
33818c2ecf20Sopenharmony_ci		break;
33828c2ecf20Sopenharmony_ci	}
33838c2ecf20Sopenharmony_ci}
33848c2ecf20Sopenharmony_ci
33858c2ecf20Sopenharmony_ci/*
33868c2ecf20Sopenharmony_ci * Sets board-dependent xc3028 configuration
33878c2ecf20Sopenharmony_ci */
33888c2ecf20Sopenharmony_civoid cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
33898c2ecf20Sopenharmony_ci{
33908c2ecf20Sopenharmony_ci	memset(ctl, 0, sizeof(*ctl));
33918c2ecf20Sopenharmony_ci
33928c2ecf20Sopenharmony_ci	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
33938c2ecf20Sopenharmony_ci	ctl->max_len = 64;
33948c2ecf20Sopenharmony_ci
33958c2ecf20Sopenharmony_ci	switch (core->boardnr) {
33968c2ecf20Sopenharmony_ci	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
33978c2ecf20Sopenharmony_ci		/* Now works with firmware version 2.7 */
33988c2ecf20Sopenharmony_ci		if (core->i2c_algo.udelay < 16)
33998c2ecf20Sopenharmony_ci			core->i2c_algo.udelay = 16;
34008c2ecf20Sopenharmony_ci		break;
34018c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
34028c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H:
34038c2ecf20Sopenharmony_ci		ctl->demod = XC3028_FE_ZARLINK456;
34048c2ecf20Sopenharmony_ci		break;
34058c2ecf20Sopenharmony_ci	case CX88_BOARD_KWORLD_ATSC_120:
34068c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
34078c2ecf20Sopenharmony_ci		ctl->demod = XC3028_FE_OREN538;
34088c2ecf20Sopenharmony_ci		break;
34098c2ecf20Sopenharmony_ci	case CX88_BOARD_GENIATECH_X8000_MT:
34108c2ecf20Sopenharmony_ci		/*
34118c2ecf20Sopenharmony_ci		 * FIXME: For this board, the xc3028 never recovers after being
34128c2ecf20Sopenharmony_ci		 * powered down (the reset GPIO probably is not set properly).
34138c2ecf20Sopenharmony_ci		 * We don't have access to the hardware so we cannot determine
34148c2ecf20Sopenharmony_ci		 * which GPIO is used for xc3028, so just disable power xc3028
34158c2ecf20Sopenharmony_ci		 * power management for now
34168c2ecf20Sopenharmony_ci		 */
34178c2ecf20Sopenharmony_ci		ctl->disable_power_mgmt = 1;
34188c2ecf20Sopenharmony_ci		break;
34198c2ecf20Sopenharmony_ci	case CX88_BOARD_NOTONLYTV_LV3H:
34208c2ecf20Sopenharmony_ci		ctl->demod			= XC3028_FE_ZARLINK456;
34218c2ecf20Sopenharmony_ci		ctl->fname			= XC3028L_DEFAULT_FIRMWARE;
34228c2ecf20Sopenharmony_ci		ctl->read_not_reliable	= 1;
34238c2ecf20Sopenharmony_ci		break;
34248c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
34258c2ecf20Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
34268c2ecf20Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_8000GT:
34278c2ecf20Sopenharmony_ci		/*
34288c2ecf20Sopenharmony_ci		 * Those boards uses non-MTS firmware
34298c2ecf20Sopenharmony_ci		 */
34308c2ecf20Sopenharmony_ci		break;
34318c2ecf20Sopenharmony_ci	case CX88_BOARD_PINNACLE_HYBRID_PCTV:
34328c2ecf20Sopenharmony_ci	case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
34338c2ecf20Sopenharmony_ci		ctl->demod = XC3028_FE_ZARLINK456;
34348c2ecf20Sopenharmony_ci		ctl->mts = 1;
34358c2ecf20Sopenharmony_ci		break;
34368c2ecf20Sopenharmony_ci	default:
34378c2ecf20Sopenharmony_ci		ctl->demod = XC3028_FE_OREN538;
34388c2ecf20Sopenharmony_ci		ctl->mts = 1;
34398c2ecf20Sopenharmony_ci	}
34408c2ecf20Sopenharmony_ci}
34418c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(cx88_setup_xc3028);
34428c2ecf20Sopenharmony_ci
34438c2ecf20Sopenharmony_cistatic void cx88_card_setup(struct cx88_core *core)
34448c2ecf20Sopenharmony_ci{
34458c2ecf20Sopenharmony_ci	static u8 eeprom[256];
34468c2ecf20Sopenharmony_ci	struct tuner_setup tun_setup;
34478c2ecf20Sopenharmony_ci	unsigned int mode_mask = T_RADIO | T_ANALOG_TV;
34488c2ecf20Sopenharmony_ci
34498c2ecf20Sopenharmony_ci	memset(&tun_setup, 0, sizeof(tun_setup));
34508c2ecf20Sopenharmony_ci
34518c2ecf20Sopenharmony_ci	if (!core->i2c_rc) {
34528c2ecf20Sopenharmony_ci		core->i2c_client.addr = 0xa0 >> 1;
34538c2ecf20Sopenharmony_ci		tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));
34548c2ecf20Sopenharmony_ci	}
34558c2ecf20Sopenharmony_ci
34568c2ecf20Sopenharmony_ci	switch (core->boardnr) {
34578c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE:
34588c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_ROSLYN:
34598c2ecf20Sopenharmony_ci		if (!core->i2c_rc)
34608c2ecf20Sopenharmony_ci			hauppauge_eeprom(core, eeprom + 8);
34618c2ecf20Sopenharmony_ci		break;
34628c2ecf20Sopenharmony_ci	case CX88_BOARD_GDI:
34638c2ecf20Sopenharmony_ci		if (!core->i2c_rc)
34648c2ecf20Sopenharmony_ci			gdi_eeprom(core, eeprom);
34658c2ecf20Sopenharmony_ci		break;
34668c2ecf20Sopenharmony_ci	case CX88_BOARD_LEADTEK_PVR2000:
34678c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST_DV2000:
34688c2ecf20Sopenharmony_ci	case CX88_BOARD_WINFAST2000XP_EXPERT:
34698c2ecf20Sopenharmony_ci		if (!core->i2c_rc)
34708c2ecf20Sopenharmony_ci			leadtek_eeprom(core, eeprom);
34718c2ecf20Sopenharmony_ci		break;
34728c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
34738c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
34748c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_DVB_T1:
34758c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1100:
34768c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1100LP:
34778c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR3000:
34788c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1300:
34798c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR4000:
34808c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
34818c2ecf20Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_IRONLY:
34828c2ecf20Sopenharmony_ci		if (!core->i2c_rc)
34838c2ecf20Sopenharmony_ci			hauppauge_eeprom(core, eeprom);
34848c2ecf20Sopenharmony_ci		break;
34858c2ecf20Sopenharmony_ci	case CX88_BOARD_KWORLD_DVBS_100:
34868c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x000007f8);
34878c2ecf20Sopenharmony_ci		cx_write(MO_GP1_IO, 0x00000001);
34888c2ecf20Sopenharmony_ci		break;
34898c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
34908c2ecf20Sopenharmony_ci		/* GPIO0:0 is hooked to demod reset */
34918c2ecf20Sopenharmony_ci		/* GPIO0:4 is hooked to xc3028 reset */
34928c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00111100);
34938c2ecf20Sopenharmony_ci		usleep_range(10000, 20000);
34948c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00111111);
34958c2ecf20Sopenharmony_ci		break;
34968c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
34978c2ecf20Sopenharmony_ci		/* GPIO0:6 is hooked to FX2 reset pin */
34988c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00004040);
34998c2ecf20Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000040);
35008c2ecf20Sopenharmony_ci		msleep(1000);
35018c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00004040);
35028c2ecf20Sopenharmony_ci		fallthrough;
35038c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
35048c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
35058c2ecf20Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
35068c2ecf20Sopenharmony_ci		/* GPIO0:0 is hooked to mt352 reset pin */
35078c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000101);
35088c2ecf20Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000001);
35098c2ecf20Sopenharmony_ci		usleep_range(10000, 20000);
35108c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000101);
35118c2ecf20Sopenharmony_ci		if (!core->i2c_rc &&
35128c2ecf20Sopenharmony_ci		    core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
35138c2ecf20Sopenharmony_ci			dvico_fusionhdtv_hybrid_init(core);
35148c2ecf20Sopenharmony_ci		break;
35158c2ecf20Sopenharmony_ci	case CX88_BOARD_KWORLD_DVB_T:
35168c2ecf20Sopenharmony_ci	case CX88_BOARD_DNTV_LIVE_DVB_T:
35178c2ecf20Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000707);
35188c2ecf20Sopenharmony_ci		cx_set(MO_GP2_IO, 0x00000101);
35198c2ecf20Sopenharmony_ci		cx_clear(MO_GP2_IO, 0x00000001);
35208c2ecf20Sopenharmony_ci		usleep_range(10000, 20000);
35218c2ecf20Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000007);
35228c2ecf20Sopenharmony_ci		cx_set(MO_GP2_IO, 0x00000101);
35238c2ecf20Sopenharmony_ci		break;
35248c2ecf20Sopenharmony_ci	case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
35258c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00080808);
35268c2ecf20Sopenharmony_ci		break;
35278c2ecf20Sopenharmony_ci	case CX88_BOARD_ATI_HDTVWONDER:
35288c2ecf20Sopenharmony_ci		if (!core->i2c_rc) {
35298c2ecf20Sopenharmony_ci			/* enable tuner */
35308c2ecf20Sopenharmony_ci			int i;
35318c2ecf20Sopenharmony_ci			static const u8 buffer[][2] = {
35328c2ecf20Sopenharmony_ci				{0x10, 0x12},
35338c2ecf20Sopenharmony_ci				{0x13, 0x04},
35348c2ecf20Sopenharmony_ci				{0x16, 0x00},
35358c2ecf20Sopenharmony_ci				{0x14, 0x04},
35368c2ecf20Sopenharmony_ci				{0x17, 0x00}
35378c2ecf20Sopenharmony_ci			};
35388c2ecf20Sopenharmony_ci			core->i2c_client.addr = 0x0a;
35398c2ecf20Sopenharmony_ci
35408c2ecf20Sopenharmony_ci			for (i = 0; i < ARRAY_SIZE(buffer); i++)
35418c2ecf20Sopenharmony_ci				if (i2c_master_send(&core->i2c_client,
35428c2ecf20Sopenharmony_ci						    buffer[i], 2) != 2)
35438c2ecf20Sopenharmony_ci					pr_warn("Unable to enable tuner(%i).\n",
35448c2ecf20Sopenharmony_ci						i);
35458c2ecf20Sopenharmony_ci		}
35468c2ecf20Sopenharmony_ci		break;
35478c2ecf20Sopenharmony_ci	case CX88_BOARD_MSI_TVANYWHERE_MASTER:
35488c2ecf20Sopenharmony_ci	{
35498c2ecf20Sopenharmony_ci		struct v4l2_priv_tun_config tea5767_cfg;
35508c2ecf20Sopenharmony_ci		struct tea5767_ctrl ctl;
35518c2ecf20Sopenharmony_ci
35528c2ecf20Sopenharmony_ci		memset(&ctl, 0, sizeof(ctl));
35538c2ecf20Sopenharmony_ci
35548c2ecf20Sopenharmony_ci		ctl.high_cut  = 1;
35558c2ecf20Sopenharmony_ci		ctl.st_noise  = 1;
35568c2ecf20Sopenharmony_ci		ctl.deemph_75 = 1;
35578c2ecf20Sopenharmony_ci		ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
35588c2ecf20Sopenharmony_ci
35598c2ecf20Sopenharmony_ci		tea5767_cfg.tuner = TUNER_TEA5767;
35608c2ecf20Sopenharmony_ci		tea5767_cfg.priv  = &ctl;
35618c2ecf20Sopenharmony_ci
35628c2ecf20Sopenharmony_ci		call_all(core, tuner, s_config, &tea5767_cfg);
35638c2ecf20Sopenharmony_ci		break;
35648c2ecf20Sopenharmony_ci	}
35658c2ecf20Sopenharmony_ci	case  CX88_BOARD_TEVII_S420:
35668c2ecf20Sopenharmony_ci	case  CX88_BOARD_TEVII_S460:
35678c2ecf20Sopenharmony_ci	case  CX88_BOARD_TEVII_S464:
35688c2ecf20Sopenharmony_ci	case  CX88_BOARD_OMICOM_SS4_PCI:
35698c2ecf20Sopenharmony_ci	case  CX88_BOARD_TBS_8910:
35708c2ecf20Sopenharmony_ci	case  CX88_BOARD_TBS_8920:
35718c2ecf20Sopenharmony_ci	case  CX88_BOARD_PROF_6200:
35728c2ecf20Sopenharmony_ci	case  CX88_BOARD_PROF_7300:
35738c2ecf20Sopenharmony_ci	case  CX88_BOARD_PROF_7301:
35748c2ecf20Sopenharmony_ci	case  CX88_BOARD_SATTRADE_ST4200:
35758c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x8000);
35768c2ecf20Sopenharmony_ci		msleep(100);
35778c2ecf20Sopenharmony_ci		cx_write(MO_SRST_IO, 0);
35788c2ecf20Sopenharmony_ci		usleep_range(10000, 20000);
35798c2ecf20Sopenharmony_ci		cx_write(MO_GP0_IO, 0x8080);
35808c2ecf20Sopenharmony_ci		msleep(100);
35818c2ecf20Sopenharmony_ci		cx_write(MO_SRST_IO, 1);
35828c2ecf20Sopenharmony_ci		msleep(100);
35838c2ecf20Sopenharmony_ci		break;
35848c2ecf20Sopenharmony_ci	} /*end switch() */
35858c2ecf20Sopenharmony_ci
35868c2ecf20Sopenharmony_ci	/* Setup tuners */
35878c2ecf20Sopenharmony_ci	if (core->board.radio_type != UNSET) {
35888c2ecf20Sopenharmony_ci		tun_setup.mode_mask      = T_RADIO;
35898c2ecf20Sopenharmony_ci		tun_setup.type           = core->board.radio_type;
35908c2ecf20Sopenharmony_ci		tun_setup.addr           = core->board.radio_addr;
35918c2ecf20Sopenharmony_ci		tun_setup.tuner_callback = cx88_tuner_callback;
35928c2ecf20Sopenharmony_ci		call_all(core, tuner, s_type_addr, &tun_setup);
35938c2ecf20Sopenharmony_ci		mode_mask &= ~T_RADIO;
35948c2ecf20Sopenharmony_ci	}
35958c2ecf20Sopenharmony_ci
35968c2ecf20Sopenharmony_ci	if (core->board.tuner_type != UNSET) {
35978c2ecf20Sopenharmony_ci		tun_setup.mode_mask      = mode_mask;
35988c2ecf20Sopenharmony_ci		tun_setup.type           = core->board.tuner_type;
35998c2ecf20Sopenharmony_ci		tun_setup.addr           = core->board.tuner_addr;
36008c2ecf20Sopenharmony_ci		tun_setup.tuner_callback = cx88_tuner_callback;
36018c2ecf20Sopenharmony_ci
36028c2ecf20Sopenharmony_ci		call_all(core, tuner, s_type_addr, &tun_setup);
36038c2ecf20Sopenharmony_ci	}
36048c2ecf20Sopenharmony_ci
36058c2ecf20Sopenharmony_ci	if (core->board.tda9887_conf) {
36068c2ecf20Sopenharmony_ci		struct v4l2_priv_tun_config tda9887_cfg;
36078c2ecf20Sopenharmony_ci
36088c2ecf20Sopenharmony_ci		tda9887_cfg.tuner = TUNER_TDA9887;
36098c2ecf20Sopenharmony_ci		tda9887_cfg.priv  = &core->board.tda9887_conf;
36108c2ecf20Sopenharmony_ci
36118c2ecf20Sopenharmony_ci		call_all(core, tuner, s_config, &tda9887_cfg);
36128c2ecf20Sopenharmony_ci	}
36138c2ecf20Sopenharmony_ci
36148c2ecf20Sopenharmony_ci	if (core->board.tuner_type == TUNER_XC2028) {
36158c2ecf20Sopenharmony_ci		struct v4l2_priv_tun_config  xc2028_cfg;
36168c2ecf20Sopenharmony_ci		struct xc2028_ctrl           ctl;
36178c2ecf20Sopenharmony_ci
36188c2ecf20Sopenharmony_ci		/* Fills device-dependent initialization parameters */
36198c2ecf20Sopenharmony_ci		cx88_setup_xc3028(core, &ctl);
36208c2ecf20Sopenharmony_ci
36218c2ecf20Sopenharmony_ci		/* Sends parameters to xc2028/3028 tuner */
36228c2ecf20Sopenharmony_ci		memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
36238c2ecf20Sopenharmony_ci		xc2028_cfg.tuner = TUNER_XC2028;
36248c2ecf20Sopenharmony_ci		xc2028_cfg.priv  = &ctl;
36258c2ecf20Sopenharmony_ci		dprintk(1, "Asking xc2028/3028 to load firmware %s\n",
36268c2ecf20Sopenharmony_ci			ctl.fname);
36278c2ecf20Sopenharmony_ci		call_all(core, tuner, s_config, &xc2028_cfg);
36288c2ecf20Sopenharmony_ci	}
36298c2ecf20Sopenharmony_ci	call_all(core, tuner, standby);
36308c2ecf20Sopenharmony_ci}
36318c2ecf20Sopenharmony_ci
36328c2ecf20Sopenharmony_ci/* ------------------------------------------------------------------ */
36338c2ecf20Sopenharmony_ci
36348c2ecf20Sopenharmony_cistatic int cx88_pci_quirks(const char *name, struct pci_dev *pci)
36358c2ecf20Sopenharmony_ci{
36368c2ecf20Sopenharmony_ci	unsigned int lat = UNSET;
36378c2ecf20Sopenharmony_ci	u8 ctrl = 0;
36388c2ecf20Sopenharmony_ci	u8 value;
36398c2ecf20Sopenharmony_ci
36408c2ecf20Sopenharmony_ci	/* check pci quirks */
36418c2ecf20Sopenharmony_ci	if (pci_pci_problems & PCIPCI_TRITON) {
36428c2ecf20Sopenharmony_ci		pr_info("quirk: PCIPCI_TRITON -- set TBFX\n");
36438c2ecf20Sopenharmony_ci		ctrl |= CX88X_EN_TBFX;
36448c2ecf20Sopenharmony_ci	}
36458c2ecf20Sopenharmony_ci	if (pci_pci_problems & PCIPCI_NATOMA) {
36468c2ecf20Sopenharmony_ci		pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n");
36478c2ecf20Sopenharmony_ci		ctrl |= CX88X_EN_TBFX;
36488c2ecf20Sopenharmony_ci	}
36498c2ecf20Sopenharmony_ci	if (pci_pci_problems & PCIPCI_VIAETBF) {
36508c2ecf20Sopenharmony_ci		pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n");
36518c2ecf20Sopenharmony_ci		ctrl |= CX88X_EN_TBFX;
36528c2ecf20Sopenharmony_ci	}
36538c2ecf20Sopenharmony_ci	if (pci_pci_problems & PCIPCI_VSFX) {
36548c2ecf20Sopenharmony_ci		pr_info("quirk: PCIPCI_VSFX -- set VSFX\n");
36558c2ecf20Sopenharmony_ci		ctrl |= CX88X_EN_VSFX;
36568c2ecf20Sopenharmony_ci	}
36578c2ecf20Sopenharmony_ci#ifdef PCIPCI_ALIMAGIK
36588c2ecf20Sopenharmony_ci	if (pci_pci_problems & PCIPCI_ALIMAGIK) {
36598c2ecf20Sopenharmony_ci		pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n");
36608c2ecf20Sopenharmony_ci		lat = 0x0A;
36618c2ecf20Sopenharmony_ci	}
36628c2ecf20Sopenharmony_ci#endif
36638c2ecf20Sopenharmony_ci
36648c2ecf20Sopenharmony_ci	/* check insmod options */
36658c2ecf20Sopenharmony_ci	if (latency != UNSET)
36668c2ecf20Sopenharmony_ci		lat = latency;
36678c2ecf20Sopenharmony_ci
36688c2ecf20Sopenharmony_ci	/* apply stuff */
36698c2ecf20Sopenharmony_ci	if (ctrl) {
36708c2ecf20Sopenharmony_ci		pci_read_config_byte(pci, CX88X_DEVCTRL, &value);
36718c2ecf20Sopenharmony_ci		value |= ctrl;
36728c2ecf20Sopenharmony_ci		pci_write_config_byte(pci, CX88X_DEVCTRL, value);
36738c2ecf20Sopenharmony_ci	}
36748c2ecf20Sopenharmony_ci	if (lat != UNSET) {
36758c2ecf20Sopenharmony_ci		pr_info("setting pci latency timer to %d\n", latency);
36768c2ecf20Sopenharmony_ci		pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);
36778c2ecf20Sopenharmony_ci	}
36788c2ecf20Sopenharmony_ci	return 0;
36798c2ecf20Sopenharmony_ci}
36808c2ecf20Sopenharmony_ci
36818c2ecf20Sopenharmony_ciint cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)
36828c2ecf20Sopenharmony_ci{
36838c2ecf20Sopenharmony_ci	if (request_mem_region(pci_resource_start(pci, 0),
36848c2ecf20Sopenharmony_ci			       pci_resource_len(pci, 0),
36858c2ecf20Sopenharmony_ci			       core->name))
36868c2ecf20Sopenharmony_ci		return 0;
36878c2ecf20Sopenharmony_ci	pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",
36888c2ecf20Sopenharmony_ci	       PCI_FUNC(pci->devfn),
36898c2ecf20Sopenharmony_ci	       (unsigned long long)pci_resource_start(pci, 0),
36908c2ecf20Sopenharmony_ci	       pci->subsystem_vendor, pci->subsystem_device);
36918c2ecf20Sopenharmony_ci	return -EBUSY;
36928c2ecf20Sopenharmony_ci}
36938c2ecf20Sopenharmony_ci
36948c2ecf20Sopenharmony_ci/*
36958c2ecf20Sopenharmony_ci * Allocate and initialize the cx88 core struct.  One should hold the
36968c2ecf20Sopenharmony_ci * devlist mutex before calling this.
36978c2ecf20Sopenharmony_ci */
36988c2ecf20Sopenharmony_cistruct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
36998c2ecf20Sopenharmony_ci{
37008c2ecf20Sopenharmony_ci	struct cx88_core *core;
37018c2ecf20Sopenharmony_ci	int i;
37028c2ecf20Sopenharmony_ci
37038c2ecf20Sopenharmony_ci	core = kzalloc(sizeof(*core), GFP_KERNEL);
37048c2ecf20Sopenharmony_ci	if (!core)
37058c2ecf20Sopenharmony_ci		return NULL;
37068c2ecf20Sopenharmony_ci
37078c2ecf20Sopenharmony_ci	refcount_set(&core->refcount, 1);
37088c2ecf20Sopenharmony_ci	core->pci_bus  = pci->bus->number;
37098c2ecf20Sopenharmony_ci	core->pci_slot = PCI_SLOT(pci->devfn);
37108c2ecf20Sopenharmony_ci	core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |
37118c2ecf20Sopenharmony_ci			    PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |
37128c2ecf20Sopenharmony_ci			    PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;
37138c2ecf20Sopenharmony_ci	mutex_init(&core->lock);
37148c2ecf20Sopenharmony_ci
37158c2ecf20Sopenharmony_ci	core->nr = nr;
37168c2ecf20Sopenharmony_ci	sprintf(core->name, "cx88[%d]", core->nr);
37178c2ecf20Sopenharmony_ci
37188c2ecf20Sopenharmony_ci	/*
37198c2ecf20Sopenharmony_ci	 * Note: Setting initial standard here would cause first call to
37208c2ecf20Sopenharmony_ci	 * cx88_set_tvnorm() to return without programming any registers.  Leave
37218c2ecf20Sopenharmony_ci	 * it blank for at this point and it will get set later in
37228c2ecf20Sopenharmony_ci	 * cx8800_initdev()
37238c2ecf20Sopenharmony_ci	 */
37248c2ecf20Sopenharmony_ci	core->tvnorm  = 0;
37258c2ecf20Sopenharmony_ci
37268c2ecf20Sopenharmony_ci	core->width   = 320;
37278c2ecf20Sopenharmony_ci	core->height  = 240;
37288c2ecf20Sopenharmony_ci	core->field   = V4L2_FIELD_INTERLACED;
37298c2ecf20Sopenharmony_ci
37308c2ecf20Sopenharmony_ci	strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name));
37318c2ecf20Sopenharmony_ci	if (v4l2_device_register(NULL, &core->v4l2_dev)) {
37328c2ecf20Sopenharmony_ci		kfree(core);
37338c2ecf20Sopenharmony_ci		return NULL;
37348c2ecf20Sopenharmony_ci	}
37358c2ecf20Sopenharmony_ci
37368c2ecf20Sopenharmony_ci	if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) {
37378c2ecf20Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
37388c2ecf20Sopenharmony_ci		kfree(core);
37398c2ecf20Sopenharmony_ci		return NULL;
37408c2ecf20Sopenharmony_ci	}
37418c2ecf20Sopenharmony_ci
37428c2ecf20Sopenharmony_ci	if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) {
37438c2ecf20Sopenharmony_ci		v4l2_ctrl_handler_free(&core->video_hdl);
37448c2ecf20Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
37458c2ecf20Sopenharmony_ci		kfree(core);
37468c2ecf20Sopenharmony_ci		return NULL;
37478c2ecf20Sopenharmony_ci	}
37488c2ecf20Sopenharmony_ci
37498c2ecf20Sopenharmony_ci	if (cx88_get_resources(core, pci) != 0) {
37508c2ecf20Sopenharmony_ci		v4l2_ctrl_handler_free(&core->video_hdl);
37518c2ecf20Sopenharmony_ci		v4l2_ctrl_handler_free(&core->audio_hdl);
37528c2ecf20Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
37538c2ecf20Sopenharmony_ci		kfree(core);
37548c2ecf20Sopenharmony_ci		return NULL;
37558c2ecf20Sopenharmony_ci	}
37568c2ecf20Sopenharmony_ci
37578c2ecf20Sopenharmony_ci	/* PCI stuff */
37588c2ecf20Sopenharmony_ci	cx88_pci_quirks(core->name, pci);
37598c2ecf20Sopenharmony_ci	core->lmmio = ioremap(pci_resource_start(pci, 0),
37608c2ecf20Sopenharmony_ci			      pci_resource_len(pci, 0));
37618c2ecf20Sopenharmony_ci	core->bmmio = (u8 __iomem *)core->lmmio;
37628c2ecf20Sopenharmony_ci
37638c2ecf20Sopenharmony_ci	if (!core->lmmio) {
37648c2ecf20Sopenharmony_ci		release_mem_region(pci_resource_start(pci, 0),
37658c2ecf20Sopenharmony_ci				   pci_resource_len(pci, 0));
37668c2ecf20Sopenharmony_ci		v4l2_ctrl_handler_free(&core->video_hdl);
37678c2ecf20Sopenharmony_ci		v4l2_ctrl_handler_free(&core->audio_hdl);
37688c2ecf20Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
37698c2ecf20Sopenharmony_ci		kfree(core);
37708c2ecf20Sopenharmony_ci		return NULL;
37718c2ecf20Sopenharmony_ci	}
37728c2ecf20Sopenharmony_ci
37738c2ecf20Sopenharmony_ci	/* board config */
37748c2ecf20Sopenharmony_ci	core->boardnr = UNSET;
37758c2ecf20Sopenharmony_ci	if (card[core->nr] < ARRAY_SIZE(cx88_boards))
37768c2ecf20Sopenharmony_ci		core->boardnr = card[core->nr];
37778c2ecf20Sopenharmony_ci	for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++)
37788c2ecf20Sopenharmony_ci		if (pci->subsystem_vendor == cx88_subids[i].subvendor &&
37798c2ecf20Sopenharmony_ci		    pci->subsystem_device == cx88_subids[i].subdevice)
37808c2ecf20Sopenharmony_ci			core->boardnr = cx88_subids[i].card;
37818c2ecf20Sopenharmony_ci	if (core->boardnr == UNSET) {
37828c2ecf20Sopenharmony_ci		core->boardnr = CX88_BOARD_UNKNOWN;
37838c2ecf20Sopenharmony_ci		cx88_card_list(core, pci);
37848c2ecf20Sopenharmony_ci	}
37858c2ecf20Sopenharmony_ci
37868c2ecf20Sopenharmony_ci	core->board = cx88_boards[core->boardnr];
37878c2ecf20Sopenharmony_ci
37888c2ecf20Sopenharmony_ci	if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
37898c2ecf20Sopenharmony_ci		core->board.num_frontends = 1;
37908c2ecf20Sopenharmony_ci
37918c2ecf20Sopenharmony_ci	pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
37928c2ecf20Sopenharmony_ci		pci->subsystem_vendor, pci->subsystem_device, core->board.name,
37938c2ecf20Sopenharmony_ci		core->boardnr, card[core->nr] == core->boardnr ?
37948c2ecf20Sopenharmony_ci		"insmod option" : "autodetected",
37958c2ecf20Sopenharmony_ci		core->board.num_frontends);
37968c2ecf20Sopenharmony_ci
37978c2ecf20Sopenharmony_ci	if (tuner[core->nr] != UNSET)
37988c2ecf20Sopenharmony_ci		core->board.tuner_type = tuner[core->nr];
37998c2ecf20Sopenharmony_ci	if (radio[core->nr] != UNSET)
38008c2ecf20Sopenharmony_ci		core->board.radio_type = radio[core->nr];
38018c2ecf20Sopenharmony_ci
38028c2ecf20Sopenharmony_ci	dprintk(1, "TV tuner type %d, Radio tuner type %d\n",
38038c2ecf20Sopenharmony_ci		core->board.tuner_type, core->board.radio_type);
38048c2ecf20Sopenharmony_ci
38058c2ecf20Sopenharmony_ci	/* init hardware */
38068c2ecf20Sopenharmony_ci	cx88_reset(core);
38078c2ecf20Sopenharmony_ci	cx88_card_setup_pre_i2c(core);
38088c2ecf20Sopenharmony_ci	cx88_i2c_init(core, pci);
38098c2ecf20Sopenharmony_ci
38108c2ecf20Sopenharmony_ci	/* load tuner module, if needed */
38118c2ecf20Sopenharmony_ci	if (core->board.tuner_type != UNSET) {
38128c2ecf20Sopenharmony_ci		/*
38138c2ecf20Sopenharmony_ci		 * Ignore 0x6b and 0x6f on cx88 boards.
38148c2ecf20Sopenharmony_ci		 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
38158c2ecf20Sopenharmony_ci		 * and an RTC at 0x6f which can get corrupted if probed.
38168c2ecf20Sopenharmony_ci		 */
38178c2ecf20Sopenharmony_ci		static const unsigned short tv_addrs[] = {
38188c2ecf20Sopenharmony_ci			0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
38198c2ecf20Sopenharmony_ci			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
38208c2ecf20Sopenharmony_ci			0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,
38218c2ecf20Sopenharmony_ci			I2C_CLIENT_END
38228c2ecf20Sopenharmony_ci		};
38238c2ecf20Sopenharmony_ci		int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);
38248c2ecf20Sopenharmony_ci
38258c2ecf20Sopenharmony_ci		/*
38268c2ecf20Sopenharmony_ci		 * I don't trust the radio_type as is stored in the card
38278c2ecf20Sopenharmony_ci		 * definitions, so we just probe for it.
38288c2ecf20Sopenharmony_ci		 * The radio_type is sometimes missing, or set to UNSET but
38298c2ecf20Sopenharmony_ci		 * later code configures a tea5767.
38308c2ecf20Sopenharmony_ci		 */
38318c2ecf20Sopenharmony_ci		v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
38328c2ecf20Sopenharmony_ci				    "tuner", 0,
38338c2ecf20Sopenharmony_ci				    v4l2_i2c_tuner_addrs(ADDRS_RADIO));
38348c2ecf20Sopenharmony_ci		if (has_demod)
38358c2ecf20Sopenharmony_ci			v4l2_i2c_new_subdev(&core->v4l2_dev,
38368c2ecf20Sopenharmony_ci					    &core->i2c_adap, "tuner",
38378c2ecf20Sopenharmony_ci				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
38388c2ecf20Sopenharmony_ci		if (core->board.tuner_addr == ADDR_UNSET) {
38398c2ecf20Sopenharmony_ci			v4l2_i2c_new_subdev(&core->v4l2_dev,
38408c2ecf20Sopenharmony_ci					    &core->i2c_adap, "tuner",
38418c2ecf20Sopenharmony_ci				0, has_demod ? tv_addrs + 4 : tv_addrs);
38428c2ecf20Sopenharmony_ci		} else {
38438c2ecf20Sopenharmony_ci			v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
38448c2ecf20Sopenharmony_ci					    "tuner", core->board.tuner_addr,
38458c2ecf20Sopenharmony_ci					    NULL);
38468c2ecf20Sopenharmony_ci		}
38478c2ecf20Sopenharmony_ci	}
38488c2ecf20Sopenharmony_ci
38498c2ecf20Sopenharmony_ci	cx88_card_setup(core);
38508c2ecf20Sopenharmony_ci	if (!disable_ir) {
38518c2ecf20Sopenharmony_ci		cx88_i2c_init_ir(core);
38528c2ecf20Sopenharmony_ci		cx88_ir_init(core, pci);
38538c2ecf20Sopenharmony_ci	}
38548c2ecf20Sopenharmony_ci
38558c2ecf20Sopenharmony_ci	return core;
38568c2ecf20Sopenharmony_ci}
3857