162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * device driver for Conexant 2388x based TV cards
462306a36Sopenharmony_ci * card-specific stuff.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include "cx88.h"
1062306a36Sopenharmony_ci#include "tea5767.h"
1162306a36Sopenharmony_ci#include "xc4000.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <linux/init.h>
1462306a36Sopenharmony_ci#include <linux/module.h>
1562306a36Sopenharmony_ci#include <linux/pci.h>
1662306a36Sopenharmony_ci#include <linux/delay.h>
1762306a36Sopenharmony_ci#include <linux/slab.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
2062306a36Sopenharmony_cistatic unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
2162306a36Sopenharmony_cistatic unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cimodule_param_array(tuner, int, NULL, 0444);
2462306a36Sopenharmony_cimodule_param_array(radio, int, NULL, 0444);
2562306a36Sopenharmony_cimodule_param_array(card,  int, NULL, 0444);
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ciMODULE_PARM_DESC(tuner, "tuner type");
2862306a36Sopenharmony_ciMODULE_PARM_DESC(radio, "radio tuner type");
2962306a36Sopenharmony_ciMODULE_PARM_DESC(card, "card type");
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic unsigned int latency = UNSET;
3262306a36Sopenharmony_cimodule_param(latency, int, 0444);
3362306a36Sopenharmony_ciMODULE_PARM_DESC(latency, "pci latency timer");
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic int disable_ir;
3662306a36Sopenharmony_cimodule_param(disable_ir, int, 0444);
3762306a36Sopenharmony_ciMODULE_PARM_DESC(disable_ir, "Disable IR support");
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define dprintk(level, fmt, arg...)	do {				\
4062306a36Sopenharmony_ci	if (cx88_core_debug >= level)					\
4162306a36Sopenharmony_ci		printk(KERN_DEBUG pr_fmt("%s: core:" fmt),		\
4262306a36Sopenharmony_ci			__func__, ##arg);				\
4362306a36Sopenharmony_ci} while (0)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/* ------------------------------------------------------------------ */
4662306a36Sopenharmony_ci/* board config info                                                  */
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* If radio_type !=UNSET, radio_addr should be specified
4962306a36Sopenharmony_ci */
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic const struct cx88_board cx88_boards[] = {
5262306a36Sopenharmony_ci	[CX88_BOARD_UNKNOWN] = {
5362306a36Sopenharmony_ci		.name		= "UNKNOWN/GENERIC",
5462306a36Sopenharmony_ci		.tuner_type     = UNSET,
5562306a36Sopenharmony_ci		.radio_type     = UNSET,
5662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
5762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
5862306a36Sopenharmony_ci		.input          = { {
5962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
6062306a36Sopenharmony_ci			.vmux   = 0,
6162306a36Sopenharmony_ci		}, {
6262306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE2,
6362306a36Sopenharmony_ci			.vmux   = 1,
6462306a36Sopenharmony_ci		}, {
6562306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE3,
6662306a36Sopenharmony_ci			.vmux   = 2,
6762306a36Sopenharmony_ci		}, {
6862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE4,
6962306a36Sopenharmony_ci			.vmux   = 3,
7062306a36Sopenharmony_ci		} },
7162306a36Sopenharmony_ci	},
7262306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE] = {
7362306a36Sopenharmony_ci		.name		= "Hauppauge WinTV 34xxx models",
7462306a36Sopenharmony_ci		.tuner_type     = UNSET,
7562306a36Sopenharmony_ci		.radio_type     = UNSET,
7662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
7762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
7862306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
7962306a36Sopenharmony_ci		.input          = { {
8062306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
8162306a36Sopenharmony_ci			.vmux   = 0,
8262306a36Sopenharmony_ci			.gpio0  = 0xff00,  // internal decoder
8362306a36Sopenharmony_ci		}, {
8462306a36Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
8562306a36Sopenharmony_ci			.vmux   = 0,
8662306a36Sopenharmony_ci			.gpio0  = 0xff01,  // mono from tuner chip
8762306a36Sopenharmony_ci		}, {
8862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
8962306a36Sopenharmony_ci			.vmux   = 1,
9062306a36Sopenharmony_ci			.gpio0  = 0xff02,
9162306a36Sopenharmony_ci		}, {
9262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
9362306a36Sopenharmony_ci			.vmux   = 2,
9462306a36Sopenharmony_ci			.gpio0  = 0xff02,
9562306a36Sopenharmony_ci		} },
9662306a36Sopenharmony_ci		.radio = {
9762306a36Sopenharmony_ci			.type   = CX88_RADIO,
9862306a36Sopenharmony_ci			.gpio0  = 0xff01,
9962306a36Sopenharmony_ci		},
10062306a36Sopenharmony_ci	},
10162306a36Sopenharmony_ci	[CX88_BOARD_GDI] = {
10262306a36Sopenharmony_ci		.name		= "GDI Black Gold",
10362306a36Sopenharmony_ci		.tuner_type     = UNSET,
10462306a36Sopenharmony_ci		.radio_type     = UNSET,
10562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
10662306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
10762306a36Sopenharmony_ci		.input          = { {
10862306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
10962306a36Sopenharmony_ci			.vmux   = 0,
11062306a36Sopenharmony_ci		}, {
11162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
11262306a36Sopenharmony_ci			.vmux   = 2,
11362306a36Sopenharmony_ci		} },
11462306a36Sopenharmony_ci	},
11562306a36Sopenharmony_ci	[CX88_BOARD_PIXELVIEW] = {
11662306a36Sopenharmony_ci		.name           = "PixelView",
11762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_PAL,
11862306a36Sopenharmony_ci		.radio_type     = UNSET,
11962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
12062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
12162306a36Sopenharmony_ci		.input          = { {
12262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
12362306a36Sopenharmony_ci			.vmux   = 0,
12462306a36Sopenharmony_ci			.gpio0  = 0xff00,  // internal decoder
12562306a36Sopenharmony_ci		}, {
12662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
12762306a36Sopenharmony_ci			.vmux   = 1,
12862306a36Sopenharmony_ci		}, {
12962306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
13062306a36Sopenharmony_ci			.vmux   = 2,
13162306a36Sopenharmony_ci		} },
13262306a36Sopenharmony_ci		.radio = {
13362306a36Sopenharmony_ci			 .type  = CX88_RADIO,
13462306a36Sopenharmony_ci			 .gpio0 = 0xff10,
13562306a36Sopenharmony_ci		},
13662306a36Sopenharmony_ci	},
13762306a36Sopenharmony_ci	[CX88_BOARD_ATI_WONDER_PRO] = {
13862306a36Sopenharmony_ci		.name           = "ATI TV Wonder Pro",
13962306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_4IN1,
14062306a36Sopenharmony_ci		.radio_type     = UNSET,
14162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
14262306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
14362306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,
14462306a36Sopenharmony_ci		.input          = { {
14562306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
14662306a36Sopenharmony_ci			.vmux   = 0,
14762306a36Sopenharmony_ci			.gpio0  = 0x03ff,
14862306a36Sopenharmony_ci		}, {
14962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
15062306a36Sopenharmony_ci			.vmux   = 1,
15162306a36Sopenharmony_ci			.gpio0  = 0x03fe,
15262306a36Sopenharmony_ci		}, {
15362306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
15462306a36Sopenharmony_ci			.vmux   = 2,
15562306a36Sopenharmony_ci			.gpio0  = 0x03fe,
15662306a36Sopenharmony_ci		} },
15762306a36Sopenharmony_ci	},
15862306a36Sopenharmony_ci	[CX88_BOARD_WINFAST2000XP_EXPERT] = {
15962306a36Sopenharmony_ci		.name           = "Leadtek Winfast 2000XP Expert",
16062306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_4IN1,
16162306a36Sopenharmony_ci		.radio_type     = UNSET,
16262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
16362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
16462306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
16562306a36Sopenharmony_ci		.input          = { {
16662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
16762306a36Sopenharmony_ci			.vmux   = 0,
16862306a36Sopenharmony_ci			.gpio0	= 0x00F5e700,
16962306a36Sopenharmony_ci			.gpio1  = 0x00003004,
17062306a36Sopenharmony_ci			.gpio2  = 0x00F5e700,
17162306a36Sopenharmony_ci			.gpio3  = 0x02000000,
17262306a36Sopenharmony_ci		}, {
17362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
17462306a36Sopenharmony_ci			.vmux   = 1,
17562306a36Sopenharmony_ci			.gpio0	= 0x00F5c700,
17662306a36Sopenharmony_ci			.gpio1  = 0x00003004,
17762306a36Sopenharmony_ci			.gpio2  = 0x00F5c700,
17862306a36Sopenharmony_ci			.gpio3  = 0x02000000,
17962306a36Sopenharmony_ci		}, {
18062306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
18162306a36Sopenharmony_ci			.vmux   = 2,
18262306a36Sopenharmony_ci			.gpio0	= 0x00F5c700,
18362306a36Sopenharmony_ci			.gpio1  = 0x00003004,
18462306a36Sopenharmony_ci			.gpio2  = 0x00F5c700,
18562306a36Sopenharmony_ci			.gpio3  = 0x02000000,
18662306a36Sopenharmony_ci		} },
18762306a36Sopenharmony_ci		.radio = {
18862306a36Sopenharmony_ci			.type   = CX88_RADIO,
18962306a36Sopenharmony_ci			.gpio0	= 0x00F5d700,
19062306a36Sopenharmony_ci			.gpio1  = 0x00003004,
19162306a36Sopenharmony_ci			.gpio2  = 0x00F5d700,
19262306a36Sopenharmony_ci			.gpio3  = 0x02000000,
19362306a36Sopenharmony_ci		},
19462306a36Sopenharmony_ci	},
19562306a36Sopenharmony_ci	[CX88_BOARD_AVERTV_STUDIO_303] = {
19662306a36Sopenharmony_ci		.name           = "AverTV Studio 303 (M126)",
19762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
19862306a36Sopenharmony_ci		.radio_type     = UNSET,
19962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
20062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
20162306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
20262306a36Sopenharmony_ci		.input          = { {
20362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
20462306a36Sopenharmony_ci			.vmux   = 0,
20562306a36Sopenharmony_ci			.gpio1  = 0xe09f,
20662306a36Sopenharmony_ci		}, {
20762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
20862306a36Sopenharmony_ci			.vmux   = 1,
20962306a36Sopenharmony_ci			.gpio1  = 0xe05f,
21062306a36Sopenharmony_ci		}, {
21162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
21262306a36Sopenharmony_ci			.vmux   = 2,
21362306a36Sopenharmony_ci			.gpio1  = 0xe05f,
21462306a36Sopenharmony_ci		} },
21562306a36Sopenharmony_ci		.radio = {
21662306a36Sopenharmony_ci			.gpio1  = 0xe0df,
21762306a36Sopenharmony_ci			.type   = CX88_RADIO,
21862306a36Sopenharmony_ci		},
21962306a36Sopenharmony_ci	},
22062306a36Sopenharmony_ci	[CX88_BOARD_MSI_TVANYWHERE_MASTER] = {
22162306a36Sopenharmony_ci		// added gpio values thanks to Michal
22262306a36Sopenharmony_ci		// values for PAL from DScaler
22362306a36Sopenharmony_ci		.name           = "MSI TV-@nywhere Master",
22462306a36Sopenharmony_ci		.tuner_type     = TUNER_MT2032,
22562306a36Sopenharmony_ci		.radio_type     = UNSET,
22662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
22762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
22862306a36Sopenharmony_ci		.tda9887_conf	= TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,
22962306a36Sopenharmony_ci		.input          = { {
23062306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
23162306a36Sopenharmony_ci			.vmux   = 0,
23262306a36Sopenharmony_ci			.gpio0  = 0x000040bf,
23362306a36Sopenharmony_ci			.gpio1  = 0x000080c0,
23462306a36Sopenharmony_ci			.gpio2  = 0x0000ff40,
23562306a36Sopenharmony_ci		}, {
23662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
23762306a36Sopenharmony_ci			.vmux   = 1,
23862306a36Sopenharmony_ci			.gpio0  = 0x000040bf,
23962306a36Sopenharmony_ci			.gpio1  = 0x000080c0,
24062306a36Sopenharmony_ci			.gpio2  = 0x0000ff40,
24162306a36Sopenharmony_ci		}, {
24262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
24362306a36Sopenharmony_ci			.vmux   = 2,
24462306a36Sopenharmony_ci			.gpio0  = 0x000040bf,
24562306a36Sopenharmony_ci			.gpio1  = 0x000080c0,
24662306a36Sopenharmony_ci			.gpio2  = 0x0000ff40,
24762306a36Sopenharmony_ci		} },
24862306a36Sopenharmony_ci		.radio = {
24962306a36Sopenharmony_ci			 .type   = CX88_RADIO,
25062306a36Sopenharmony_ci			 .vmux   = 3,
25162306a36Sopenharmony_ci			 .gpio0  = 0x000040bf,
25262306a36Sopenharmony_ci			 .gpio1  = 0x000080c0,
25362306a36Sopenharmony_ci			 .gpio2  = 0x0000ff20,
25462306a36Sopenharmony_ci		},
25562306a36Sopenharmony_ci	},
25662306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DV2000] = {
25762306a36Sopenharmony_ci		.name           = "Leadtek Winfast DV2000",
25862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
25962306a36Sopenharmony_ci		.radio_type     = UNSET,
26062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
26162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
26262306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
26362306a36Sopenharmony_ci		.input          = { {
26462306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
26562306a36Sopenharmony_ci			.vmux   = 0,
26662306a36Sopenharmony_ci			.gpio0  = 0x0035e700,
26762306a36Sopenharmony_ci			.gpio1  = 0x00003004,
26862306a36Sopenharmony_ci			.gpio2  = 0x0035e700,
26962306a36Sopenharmony_ci			.gpio3  = 0x02000000,
27062306a36Sopenharmony_ci		}, {
27162306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
27262306a36Sopenharmony_ci			.vmux   = 1,
27362306a36Sopenharmony_ci			.gpio0  = 0x0035c700,
27462306a36Sopenharmony_ci			.gpio1  = 0x00003004,
27562306a36Sopenharmony_ci			.gpio2  = 0x0035c700,
27662306a36Sopenharmony_ci			.gpio3  = 0x02000000,
27762306a36Sopenharmony_ci		}, {
27862306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
27962306a36Sopenharmony_ci			.vmux   = 2,
28062306a36Sopenharmony_ci			.gpio0  = 0x0035c700,
28162306a36Sopenharmony_ci			.gpio1  = 0x0035c700,
28262306a36Sopenharmony_ci			.gpio2  = 0x02000000,
28362306a36Sopenharmony_ci			.gpio3  = 0x02000000,
28462306a36Sopenharmony_ci		} },
28562306a36Sopenharmony_ci		.radio = {
28662306a36Sopenharmony_ci			.type   = CX88_RADIO,
28762306a36Sopenharmony_ci			.gpio0  = 0x0035d700,
28862306a36Sopenharmony_ci			.gpio1  = 0x00007004,
28962306a36Sopenharmony_ci			.gpio2  = 0x0035d700,
29062306a36Sopenharmony_ci			.gpio3  = 0x02000000,
29162306a36Sopenharmony_ci		},
29262306a36Sopenharmony_ci	},
29362306a36Sopenharmony_ci	[CX88_BOARD_LEADTEK_PVR2000] = {
29462306a36Sopenharmony_ci		// gpio values for PAL version from regspy by DScaler
29562306a36Sopenharmony_ci		.name           = "Leadtek PVR 2000",
29662306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
29762306a36Sopenharmony_ci		.radio_type     = UNSET,
29862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
29962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
30062306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
30162306a36Sopenharmony_ci		.input          = { {
30262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
30362306a36Sopenharmony_ci			.vmux   = 0,
30462306a36Sopenharmony_ci			.gpio0  = 0x0000bde2,
30562306a36Sopenharmony_ci			.audioroute = 1,
30662306a36Sopenharmony_ci		}, {
30762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
30862306a36Sopenharmony_ci			.vmux   = 1,
30962306a36Sopenharmony_ci			.gpio0  = 0x0000bde6,
31062306a36Sopenharmony_ci			.audioroute = 1,
31162306a36Sopenharmony_ci		}, {
31262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
31362306a36Sopenharmony_ci			.vmux   = 2,
31462306a36Sopenharmony_ci			.gpio0  = 0x0000bde6,
31562306a36Sopenharmony_ci			.audioroute = 1,
31662306a36Sopenharmony_ci		} },
31762306a36Sopenharmony_ci		.radio = {
31862306a36Sopenharmony_ci			.type   = CX88_RADIO,
31962306a36Sopenharmony_ci			.gpio0  = 0x0000bd62,
32062306a36Sopenharmony_ci			.audioroute = 1,
32162306a36Sopenharmony_ci		},
32262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
32362306a36Sopenharmony_ci	},
32462306a36Sopenharmony_ci	[CX88_BOARD_IODATA_GVVCP3PCI] = {
32562306a36Sopenharmony_ci		.name		= "IODATA GV-VCP3/PCI",
32662306a36Sopenharmony_ci		.tuner_type     = UNSET,
32762306a36Sopenharmony_ci		.radio_type     = UNSET,
32862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
32962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
33062306a36Sopenharmony_ci		.input          = { {
33162306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
33262306a36Sopenharmony_ci			.vmux   = 0,
33362306a36Sopenharmony_ci		}, {
33462306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE2,
33562306a36Sopenharmony_ci			.vmux   = 1,
33662306a36Sopenharmony_ci		}, {
33762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
33862306a36Sopenharmony_ci			.vmux   = 2,
33962306a36Sopenharmony_ci		} },
34062306a36Sopenharmony_ci	},
34162306a36Sopenharmony_ci	[CX88_BOARD_PROLINK_PLAYTVPVR] = {
34262306a36Sopenharmony_ci		.name           = "Prolink PlayTV PVR",
34362306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
34462306a36Sopenharmony_ci		.radio_type     = UNSET,
34562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
34662306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
34762306a36Sopenharmony_ci		.tda9887_conf	= TDA9887_PRESENT,
34862306a36Sopenharmony_ci		.input          = { {
34962306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
35062306a36Sopenharmony_ci			.vmux   = 0,
35162306a36Sopenharmony_ci			.gpio0  = 0xbff0,
35262306a36Sopenharmony_ci		}, {
35362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
35462306a36Sopenharmony_ci			.vmux   = 1,
35562306a36Sopenharmony_ci			.gpio0  = 0xbff3,
35662306a36Sopenharmony_ci		}, {
35762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
35862306a36Sopenharmony_ci			.vmux   = 2,
35962306a36Sopenharmony_ci			.gpio0  = 0xbff3,
36062306a36Sopenharmony_ci		} },
36162306a36Sopenharmony_ci		.radio = {
36262306a36Sopenharmony_ci			.type   = CX88_RADIO,
36362306a36Sopenharmony_ci			.gpio0  = 0xbff0,
36462306a36Sopenharmony_ci		},
36562306a36Sopenharmony_ci	},
36662306a36Sopenharmony_ci	[CX88_BOARD_ASUS_PVR_416] = {
36762306a36Sopenharmony_ci		.name		= "ASUS PVR-416",
36862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
36962306a36Sopenharmony_ci		.radio_type     = UNSET,
37062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
37162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
37262306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
37362306a36Sopenharmony_ci		.input          = { {
37462306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
37562306a36Sopenharmony_ci			.vmux   = 0,
37662306a36Sopenharmony_ci			.gpio0  = 0x0000fde6,
37762306a36Sopenharmony_ci		}, {
37862306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
37962306a36Sopenharmony_ci			.vmux   = 2,
38062306a36Sopenharmony_ci			.gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?
38162306a36Sopenharmony_ci			.audioroute = 1,
38262306a36Sopenharmony_ci		} },
38362306a36Sopenharmony_ci		.radio = {
38462306a36Sopenharmony_ci			.type   = CX88_RADIO,
38562306a36Sopenharmony_ci			.gpio0  = 0x0000fde2,
38662306a36Sopenharmony_ci		},
38762306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
38862306a36Sopenharmony_ci	},
38962306a36Sopenharmony_ci	[CX88_BOARD_MSI_TVANYWHERE] = {
39062306a36Sopenharmony_ci		.name           = "MSI TV-@nywhere",
39162306a36Sopenharmony_ci		.tuner_type     = TUNER_MT2032,
39262306a36Sopenharmony_ci		.radio_type     = UNSET,
39362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
39462306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
39562306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
39662306a36Sopenharmony_ci		.input          = { {
39762306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
39862306a36Sopenharmony_ci			.vmux   = 0,
39962306a36Sopenharmony_ci			.gpio0  = 0x00000fbf,
40062306a36Sopenharmony_ci			.gpio2  = 0x0000fc08,
40162306a36Sopenharmony_ci		}, {
40262306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
40362306a36Sopenharmony_ci			.vmux   = 1,
40462306a36Sopenharmony_ci			.gpio0  = 0x00000fbf,
40562306a36Sopenharmony_ci			.gpio2  = 0x0000fc68,
40662306a36Sopenharmony_ci		}, {
40762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
40862306a36Sopenharmony_ci			.vmux   = 2,
40962306a36Sopenharmony_ci			.gpio0  = 0x00000fbf,
41062306a36Sopenharmony_ci			.gpio2  = 0x0000fc68,
41162306a36Sopenharmony_ci		} },
41262306a36Sopenharmony_ci	},
41362306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_DVB_T] = {
41462306a36Sopenharmony_ci		.name           = "KWorld/VStream XPert DVB-T",
41562306a36Sopenharmony_ci		.tuner_type     = UNSET,
41662306a36Sopenharmony_ci		.radio_type     = UNSET,
41762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
41862306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
41962306a36Sopenharmony_ci		.input          = { {
42062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
42162306a36Sopenharmony_ci			.vmux   = 1,
42262306a36Sopenharmony_ci			.gpio0  = 0x0700,
42362306a36Sopenharmony_ci			.gpio2  = 0x0101,
42462306a36Sopenharmony_ci		}, {
42562306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
42662306a36Sopenharmony_ci			.vmux   = 2,
42762306a36Sopenharmony_ci			.gpio0  = 0x0700,
42862306a36Sopenharmony_ci			.gpio2  = 0x0101,
42962306a36Sopenharmony_ci		} },
43062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
43162306a36Sopenharmony_ci	},
43262306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {
43362306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T1",
43462306a36Sopenharmony_ci		.tuner_type     = UNSET, /* No analog tuner */
43562306a36Sopenharmony_ci		.radio_type     = UNSET,
43662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
43762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
43862306a36Sopenharmony_ci		.input          = { {
43962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
44062306a36Sopenharmony_ci			.vmux   = 1,
44162306a36Sopenharmony_ci			.gpio0  = 0x000027df,
44262306a36Sopenharmony_ci		}, {
44362306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
44462306a36Sopenharmony_ci			.vmux   = 2,
44562306a36Sopenharmony_ci			.gpio0  = 0x000027df,
44662306a36Sopenharmony_ci		} },
44762306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
44862306a36Sopenharmony_ci	},
44962306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_LTV883] = {
45062306a36Sopenharmony_ci		.name           = "KWorld LTV883RF",
45162306a36Sopenharmony_ci		.tuner_type     = TUNER_TNF_8831BGFF,
45262306a36Sopenharmony_ci		.radio_type     = UNSET,
45362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
45462306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
45562306a36Sopenharmony_ci		.input          = { {
45662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
45762306a36Sopenharmony_ci			.vmux   = 0,
45862306a36Sopenharmony_ci			.gpio0  = 0x07f8,
45962306a36Sopenharmony_ci		}, {
46062306a36Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
46162306a36Sopenharmony_ci			.vmux   = 0,
46262306a36Sopenharmony_ci			.gpio0  = 0x07f9,  // mono from tuner chip
46362306a36Sopenharmony_ci		}, {
46462306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
46562306a36Sopenharmony_ci			.vmux   = 1,
46662306a36Sopenharmony_ci			.gpio0  = 0x000007fa,
46762306a36Sopenharmony_ci		}, {
46862306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
46962306a36Sopenharmony_ci			.vmux   = 2,
47062306a36Sopenharmony_ci			.gpio0  = 0x000007fa,
47162306a36Sopenharmony_ci		} },
47262306a36Sopenharmony_ci		.radio = {
47362306a36Sopenharmony_ci			.type   = CX88_RADIO,
47462306a36Sopenharmony_ci			.gpio0  = 0x000007f8,
47562306a36Sopenharmony_ci		},
47662306a36Sopenharmony_ci	},
47762306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {
47862306a36Sopenharmony_ci		.name		= "DViCO FusionHDTV 3 Gold-Q",
47962306a36Sopenharmony_ci		.tuner_type     = TUNER_MICROTUNE_4042FI5,
48062306a36Sopenharmony_ci		.radio_type     = UNSET,
48162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
48262306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
48362306a36Sopenharmony_ci		/*
48462306a36Sopenharmony_ci		 * GPIO[0] resets DT3302 DTV receiver
48562306a36Sopenharmony_ci		 *     0 - reset asserted
48662306a36Sopenharmony_ci		 *     1 - normal operation
48762306a36Sopenharmony_ci		 * GPIO[1] mutes analog audio output connector
48862306a36Sopenharmony_ci		 *     0 - enable selected source
48962306a36Sopenharmony_ci		 *     1 - mute
49062306a36Sopenharmony_ci		 * GPIO[2] selects source for analog audio output connector
49162306a36Sopenharmony_ci		 *     0 - analog audio input connector on tab
49262306a36Sopenharmony_ci		 *     1 - analog DAC output from CX23881 chip
49362306a36Sopenharmony_ci		 * GPIO[3] selects RF input connector on tuner module
49462306a36Sopenharmony_ci		 *     0 - RF connector labeled CABLE
49562306a36Sopenharmony_ci		 *     1 - RF connector labeled ANT
49662306a36Sopenharmony_ci		 * GPIO[4] selects high RF for QAM256 mode
49762306a36Sopenharmony_ci		 *     0 - normal RF
49862306a36Sopenharmony_ci		 *     1 - high RF
49962306a36Sopenharmony_ci		 */
50062306a36Sopenharmony_ci		.input          = { {
50162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
50262306a36Sopenharmony_ci			.vmux   = 0,
50362306a36Sopenharmony_ci			.gpio0	= 0x0f0d,
50462306a36Sopenharmony_ci		}, {
50562306a36Sopenharmony_ci			.type   = CX88_VMUX_CABLE,
50662306a36Sopenharmony_ci			.vmux   = 0,
50762306a36Sopenharmony_ci			.gpio0	= 0x0f05,
50862306a36Sopenharmony_ci		}, {
50962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
51062306a36Sopenharmony_ci			.vmux   = 1,
51162306a36Sopenharmony_ci			.gpio0	= 0x0f00,
51262306a36Sopenharmony_ci		}, {
51362306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
51462306a36Sopenharmony_ci			.vmux   = 2,
51562306a36Sopenharmony_ci			.gpio0	= 0x0f00,
51662306a36Sopenharmony_ci		} },
51762306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
51862306a36Sopenharmony_ci	},
51962306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_DVB_T1] = {
52062306a36Sopenharmony_ci		.name           = "Hauppauge Nova-T DVB-T",
52162306a36Sopenharmony_ci		.tuner_type     = UNSET,
52262306a36Sopenharmony_ci		.radio_type     = UNSET,
52362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
52462306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
52562306a36Sopenharmony_ci		.input          = { {
52662306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
52762306a36Sopenharmony_ci			.vmux   = 0,
52862306a36Sopenharmony_ci		} },
52962306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
53062306a36Sopenharmony_ci	},
53162306a36Sopenharmony_ci	[CX88_BOARD_CONEXANT_DVB_T1] = {
53262306a36Sopenharmony_ci		.name           = "Conexant DVB-T reference design",
53362306a36Sopenharmony_ci		.tuner_type     = UNSET,
53462306a36Sopenharmony_ci		.radio_type     = UNSET,
53562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
53662306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
53762306a36Sopenharmony_ci		.input          = { {
53862306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
53962306a36Sopenharmony_ci			.vmux   = 0,
54062306a36Sopenharmony_ci		} },
54162306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
54262306a36Sopenharmony_ci	},
54362306a36Sopenharmony_ci	[CX88_BOARD_PROVIDEO_PV259] = {
54462306a36Sopenharmony_ci		.name		= "Provideo PV259",
54562306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FQ1216ME,
54662306a36Sopenharmony_ci		.radio_type     = UNSET,
54762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
54862306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
54962306a36Sopenharmony_ci		.input          = { {
55062306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
55162306a36Sopenharmony_ci			.vmux   = 0,
55262306a36Sopenharmony_ci			.audioroute = 1,
55362306a36Sopenharmony_ci		} },
55462306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
55562306a36Sopenharmony_ci	},
55662306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {
55762306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Plus",
55862306a36Sopenharmony_ci		.tuner_type     = UNSET, /* No analog tuner */
55962306a36Sopenharmony_ci		.radio_type     = UNSET,
56062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
56162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
56262306a36Sopenharmony_ci		.input          = { {
56362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
56462306a36Sopenharmony_ci			.vmux   = 1,
56562306a36Sopenharmony_ci			.gpio0  = 0x000027df,
56662306a36Sopenharmony_ci		}, {
56762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
56862306a36Sopenharmony_ci			.vmux   = 2,
56962306a36Sopenharmony_ci			.gpio0  = 0x000027df,
57062306a36Sopenharmony_ci		} },
57162306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
57262306a36Sopenharmony_ci	},
57362306a36Sopenharmony_ci	[CX88_BOARD_DNTV_LIVE_DVB_T] = {
57462306a36Sopenharmony_ci		.name		= "digitalnow DNTV Live! DVB-T",
57562306a36Sopenharmony_ci		.tuner_type     = UNSET,
57662306a36Sopenharmony_ci		.radio_type     = UNSET,
57762306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
57862306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
57962306a36Sopenharmony_ci		.input		= { {
58062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
58162306a36Sopenharmony_ci			.vmux   = 1,
58262306a36Sopenharmony_ci			.gpio0  = 0x00000700,
58362306a36Sopenharmony_ci			.gpio2  = 0x00000101,
58462306a36Sopenharmony_ci		}, {
58562306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
58662306a36Sopenharmony_ci			.vmux   = 2,
58762306a36Sopenharmony_ci			.gpio0  = 0x00000700,
58862306a36Sopenharmony_ci			.gpio2  = 0x00000101,
58962306a36Sopenharmony_ci		} },
59062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
59162306a36Sopenharmony_ci	},
59262306a36Sopenharmony_ci	[CX88_BOARD_PCHDTV_HD3000] = {
59362306a36Sopenharmony_ci		.name           = "pcHDTV HD3000 HDTV",
59462306a36Sopenharmony_ci		.tuner_type     = TUNER_THOMSON_DTT761X,
59562306a36Sopenharmony_ci		.radio_type     = UNSET,
59662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
59762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
59862306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
59962306a36Sopenharmony_ci		/* GPIO[2] = audio source for analog audio out connector
60062306a36Sopenharmony_ci		 *  0 = analog audio input connector
60162306a36Sopenharmony_ci		 *  1 = CX88 audio DACs
60262306a36Sopenharmony_ci		 *
60362306a36Sopenharmony_ci		 * GPIO[7] = input to CX88's audio/chroma ADC
60462306a36Sopenharmony_ci		 *  0 = FM 10.7 MHz IF
60562306a36Sopenharmony_ci		 *  1 = Sound 4.5 MHz IF
60662306a36Sopenharmony_ci		 *
60762306a36Sopenharmony_ci		 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively
60862306a36Sopenharmony_ci		 *
60962306a36Sopenharmony_ci		 * GPIO[16] = Remote control input
61062306a36Sopenharmony_ci		 */
61162306a36Sopenharmony_ci		.input          = { {
61262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
61362306a36Sopenharmony_ci			.vmux   = 0,
61462306a36Sopenharmony_ci			.gpio0  = 0x00008484,
61562306a36Sopenharmony_ci		}, {
61662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
61762306a36Sopenharmony_ci			.vmux   = 1,
61862306a36Sopenharmony_ci			.gpio0  = 0x00008400,
61962306a36Sopenharmony_ci		}, {
62062306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
62162306a36Sopenharmony_ci			.vmux   = 2,
62262306a36Sopenharmony_ci			.gpio0  = 0x00008400,
62362306a36Sopenharmony_ci		} },
62462306a36Sopenharmony_ci		.radio = {
62562306a36Sopenharmony_ci			.type   = CX88_RADIO,
62662306a36Sopenharmony_ci			.gpio0  = 0x00008404,
62762306a36Sopenharmony_ci		},
62862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
62962306a36Sopenharmony_ci	},
63062306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_ROSLYN] = {
63162306a36Sopenharmony_ci		// entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>
63262306a36Sopenharmony_ci		// GPIO values obtained from regspy, courtesy Sean Covel
63362306a36Sopenharmony_ci		.name           = "Hauppauge WinTV 28xxx (Roslyn) models",
63462306a36Sopenharmony_ci		.tuner_type     = UNSET,
63562306a36Sopenharmony_ci		.radio_type     = UNSET,
63662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
63762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
63862306a36Sopenharmony_ci		.input          = { {
63962306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
64062306a36Sopenharmony_ci			.vmux   = 0,
64162306a36Sopenharmony_ci			.gpio0  = 0xed1a,
64262306a36Sopenharmony_ci			.gpio2  = 0x00ff,
64362306a36Sopenharmony_ci		}, {
64462306a36Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
64562306a36Sopenharmony_ci			.vmux   = 0,
64662306a36Sopenharmony_ci			.gpio0  = 0xff01,
64762306a36Sopenharmony_ci		}, {
64862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
64962306a36Sopenharmony_ci			.vmux   = 1,
65062306a36Sopenharmony_ci			.gpio0  = 0xff02,
65162306a36Sopenharmony_ci		}, {
65262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
65362306a36Sopenharmony_ci			.vmux   = 2,
65462306a36Sopenharmony_ci			.gpio0  = 0xed92,
65562306a36Sopenharmony_ci			.gpio2  = 0x00ff,
65662306a36Sopenharmony_ci		} },
65762306a36Sopenharmony_ci		.radio = {
65862306a36Sopenharmony_ci			 .type   = CX88_RADIO,
65962306a36Sopenharmony_ci			 .gpio0  = 0xed96,
66062306a36Sopenharmony_ci			 .gpio2  = 0x00ff,
66162306a36Sopenharmony_ci		 },
66262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
66362306a36Sopenharmony_ci	},
66462306a36Sopenharmony_ci	[CX88_BOARD_DIGITALLOGIC_MEC] = {
66562306a36Sopenharmony_ci		.name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",
66662306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
66762306a36Sopenharmony_ci		.radio_type     = UNSET,
66862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
66962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
67062306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
67162306a36Sopenharmony_ci		.input          = { {
67262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
67362306a36Sopenharmony_ci			.vmux   = 0,
67462306a36Sopenharmony_ci			.gpio0  = 0x00009d80,
67562306a36Sopenharmony_ci			.audioroute = 1,
67662306a36Sopenharmony_ci		}, {
67762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
67862306a36Sopenharmony_ci			.vmux   = 1,
67962306a36Sopenharmony_ci			.gpio0  = 0x00009d76,
68062306a36Sopenharmony_ci			.audioroute = 1,
68162306a36Sopenharmony_ci		}, {
68262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
68362306a36Sopenharmony_ci			.vmux   = 2,
68462306a36Sopenharmony_ci			.gpio0  = 0x00009d76,
68562306a36Sopenharmony_ci			.audioroute = 1,
68662306a36Sopenharmony_ci		} },
68762306a36Sopenharmony_ci		.radio = {
68862306a36Sopenharmony_ci			.type   = CX88_RADIO,
68962306a36Sopenharmony_ci			.gpio0  = 0x00009d00,
69062306a36Sopenharmony_ci			.audioroute = 1,
69162306a36Sopenharmony_ci		},
69262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
69362306a36Sopenharmony_ci	},
69462306a36Sopenharmony_ci	[CX88_BOARD_IODATA_GVBCTV7E] = {
69562306a36Sopenharmony_ci		.name           = "IODATA GV/BCTV7E",
69662306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FQ1286,
69762306a36Sopenharmony_ci		.radio_type     = UNSET,
69862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
69962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
70062306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
70162306a36Sopenharmony_ci		.input          = { {
70262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
70362306a36Sopenharmony_ci			.vmux   = 1,
70462306a36Sopenharmony_ci			.gpio1  = 0x0000e03f,
70562306a36Sopenharmony_ci		}, {
70662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
70762306a36Sopenharmony_ci			.vmux   = 2,
70862306a36Sopenharmony_ci			.gpio1  = 0x0000e07f,
70962306a36Sopenharmony_ci		}, {
71062306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
71162306a36Sopenharmony_ci			.vmux   = 3,
71262306a36Sopenharmony_ci			.gpio1  = 0x0000e07f,
71362306a36Sopenharmony_ci		} }
71462306a36Sopenharmony_ci	},
71562306a36Sopenharmony_ci	[CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {
71662306a36Sopenharmony_ci		.name           = "PixelView PlayTV Ultra Pro (Stereo)",
71762306a36Sopenharmony_ci		/* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */
71862306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
71962306a36Sopenharmony_ci		.radio_type     = UNSET,
72062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
72162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
72262306a36Sopenharmony_ci		/*
72362306a36Sopenharmony_ci		 * Some variants use a tda9874 and so need the
72462306a36Sopenharmony_ci		 * tvaudio module.
72562306a36Sopenharmony_ci		 */
72662306a36Sopenharmony_ci		.audio_chip     = CX88_AUDIO_TVAUDIO,
72762306a36Sopenharmony_ci		.input          = { {
72862306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
72962306a36Sopenharmony_ci			.vmux   = 0,
73062306a36Sopenharmony_ci			.gpio0  = 0xbf61,  /* internal decoder */
73162306a36Sopenharmony_ci		}, {
73262306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
73362306a36Sopenharmony_ci			.vmux   = 1,
73462306a36Sopenharmony_ci			.gpio0	= 0xbf63,
73562306a36Sopenharmony_ci		}, {
73662306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
73762306a36Sopenharmony_ci			.vmux   = 2,
73862306a36Sopenharmony_ci			.gpio0	= 0xbf63,
73962306a36Sopenharmony_ci		} },
74062306a36Sopenharmony_ci		.radio = {
74162306a36Sopenharmony_ci			 .type  = CX88_RADIO,
74262306a36Sopenharmony_ci			 .gpio0 = 0xbf60,
74362306a36Sopenharmony_ci		 },
74462306a36Sopenharmony_ci	},
74562306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {
74662306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV 3 Gold-T",
74762306a36Sopenharmony_ci		.tuner_type     = TUNER_THOMSON_DTT761X,
74862306a36Sopenharmony_ci		.radio_type     = UNSET,
74962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
75062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
75162306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
75262306a36Sopenharmony_ci		.input          = { {
75362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
75462306a36Sopenharmony_ci			.vmux   = 0,
75562306a36Sopenharmony_ci			.gpio0  = 0x97ed,
75662306a36Sopenharmony_ci		}, {
75762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
75862306a36Sopenharmony_ci			.vmux   = 1,
75962306a36Sopenharmony_ci			.gpio0  = 0x97e9,
76062306a36Sopenharmony_ci		}, {
76162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
76262306a36Sopenharmony_ci			.vmux   = 2,
76362306a36Sopenharmony_ci			.gpio0  = 0x97e9,
76462306a36Sopenharmony_ci		} },
76562306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
76662306a36Sopenharmony_ci	},
76762306a36Sopenharmony_ci	[CX88_BOARD_ADSTECH_DVB_T_PCI] = {
76862306a36Sopenharmony_ci		.name           = "ADS Tech Instant TV DVB-T PCI",
76962306a36Sopenharmony_ci		.tuner_type     = UNSET,
77062306a36Sopenharmony_ci		.radio_type     = UNSET,
77162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
77262306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
77362306a36Sopenharmony_ci		.input          = { {
77462306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
77562306a36Sopenharmony_ci			.vmux   = 1,
77662306a36Sopenharmony_ci			.gpio0  = 0x0700,
77762306a36Sopenharmony_ci			.gpio2  = 0x0101,
77862306a36Sopenharmony_ci		}, {
77962306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
78062306a36Sopenharmony_ci			.vmux   = 2,
78162306a36Sopenharmony_ci			.gpio0  = 0x0700,
78262306a36Sopenharmony_ci			.gpio2  = 0x0101,
78362306a36Sopenharmony_ci		} },
78462306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
78562306a36Sopenharmony_ci	},
78662306a36Sopenharmony_ci	[CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {
78762306a36Sopenharmony_ci		.name           = "TerraTec Cinergy 1400 DVB-T",
78862306a36Sopenharmony_ci		.tuner_type     = UNSET,
78962306a36Sopenharmony_ci		.input          = { {
79062306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
79162306a36Sopenharmony_ci			.vmux   = 0,
79262306a36Sopenharmony_ci		}, {
79362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
79462306a36Sopenharmony_ci			.vmux   = 2,
79562306a36Sopenharmony_ci		}, {
79662306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
79762306a36Sopenharmony_ci			.vmux   = 2,
79862306a36Sopenharmony_ci		} },
79962306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
80062306a36Sopenharmony_ci	},
80162306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {
80262306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV 5 Gold",
80362306a36Sopenharmony_ci		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */
80462306a36Sopenharmony_ci		.radio_type     = UNSET,
80562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
80662306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
80762306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
80862306a36Sopenharmony_ci		.input          = { {
80962306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
81062306a36Sopenharmony_ci			.vmux   = 0,
81162306a36Sopenharmony_ci			.gpio0  = 0x87fd,
81262306a36Sopenharmony_ci		}, {
81362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
81462306a36Sopenharmony_ci			.vmux   = 1,
81562306a36Sopenharmony_ci			.gpio0  = 0x87f9,
81662306a36Sopenharmony_ci		}, {
81762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
81862306a36Sopenharmony_ci			.vmux   = 2,
81962306a36Sopenharmony_ci			.gpio0  = 0x87f9,
82062306a36Sopenharmony_ci		} },
82162306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
82262306a36Sopenharmony_ci	},
82362306a36Sopenharmony_ci	[CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {
82462306a36Sopenharmony_ci		.name           = "AverMedia UltraTV Media Center PCI 550",
82562306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,
82662306a36Sopenharmony_ci		.radio_type     = UNSET,
82762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
82862306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
82962306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
83062306a36Sopenharmony_ci		.input          = { {
83162306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
83262306a36Sopenharmony_ci			.vmux   = 0,
83362306a36Sopenharmony_ci			.gpio0  = 0x0000cd73,
83462306a36Sopenharmony_ci			.audioroute = 1,
83562306a36Sopenharmony_ci		}, {
83662306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
83762306a36Sopenharmony_ci			.vmux   = 1,
83862306a36Sopenharmony_ci			.gpio0  = 0x0000cd73,
83962306a36Sopenharmony_ci			.audioroute = 1,
84062306a36Sopenharmony_ci		}, {
84162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
84262306a36Sopenharmony_ci			.vmux   = 3,
84362306a36Sopenharmony_ci			.gpio0  = 0x0000cdb3,
84462306a36Sopenharmony_ci			.audioroute = 1,
84562306a36Sopenharmony_ci		} },
84662306a36Sopenharmony_ci		.radio = {
84762306a36Sopenharmony_ci			.type   = CX88_RADIO,
84862306a36Sopenharmony_ci			.vmux   = 2,
84962306a36Sopenharmony_ci			.gpio0  = 0x0000cdf3,
85062306a36Sopenharmony_ci			.audioroute = 1,
85162306a36Sopenharmony_ci		},
85262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
85362306a36Sopenharmony_ci	},
85462306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {
85562306a36Sopenharmony_ci		 /* Alexander Wold <awold@bigfoot.com> */
85662306a36Sopenharmony_ci		 .name           = "Kworld V-Stream Xpert DVD",
85762306a36Sopenharmony_ci		 .tuner_type     = UNSET,
85862306a36Sopenharmony_ci		 .input          = { {
85962306a36Sopenharmony_ci			 .type   = CX88_VMUX_COMPOSITE1,
86062306a36Sopenharmony_ci			 .vmux   = 1,
86162306a36Sopenharmony_ci			 .gpio0  = 0x03000000,
86262306a36Sopenharmony_ci			 .gpio1  = 0x01000000,
86362306a36Sopenharmony_ci			 .gpio2  = 0x02000000,
86462306a36Sopenharmony_ci			 .gpio3  = 0x00100000,
86562306a36Sopenharmony_ci		 }, {
86662306a36Sopenharmony_ci			 .type   = CX88_VMUX_SVIDEO,
86762306a36Sopenharmony_ci			 .vmux   = 2,
86862306a36Sopenharmony_ci			 .gpio0  = 0x03000000,
86962306a36Sopenharmony_ci			 .gpio1  = 0x01000000,
87062306a36Sopenharmony_ci			 .gpio2  = 0x02000000,
87162306a36Sopenharmony_ci			 .gpio3  = 0x00100000,
87262306a36Sopenharmony_ci		 } },
87362306a36Sopenharmony_ci	},
87462306a36Sopenharmony_ci	[CX88_BOARD_ATI_HDTVWONDER] = {
87562306a36Sopenharmony_ci		.name           = "ATI HDTV Wonder",
87662306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_TUV1236D,
87762306a36Sopenharmony_ci		.radio_type     = UNSET,
87862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
87962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
88062306a36Sopenharmony_ci		.input          = { {
88162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
88262306a36Sopenharmony_ci			.vmux   = 0,
88362306a36Sopenharmony_ci			.gpio0  = 0x00000ff7,
88462306a36Sopenharmony_ci			.gpio1  = 0x000000ff,
88562306a36Sopenharmony_ci			.gpio2  = 0x00000001,
88662306a36Sopenharmony_ci			.gpio3  = 0x00000000,
88762306a36Sopenharmony_ci		}, {
88862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
88962306a36Sopenharmony_ci			.vmux   = 1,
89062306a36Sopenharmony_ci			.gpio0  = 0x00000ffe,
89162306a36Sopenharmony_ci			.gpio1  = 0x000000ff,
89262306a36Sopenharmony_ci			.gpio2  = 0x00000001,
89362306a36Sopenharmony_ci			.gpio3  = 0x00000000,
89462306a36Sopenharmony_ci		}, {
89562306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
89662306a36Sopenharmony_ci			.vmux   = 2,
89762306a36Sopenharmony_ci			.gpio0  = 0x00000ffe,
89862306a36Sopenharmony_ci			.gpio1  = 0x000000ff,
89962306a36Sopenharmony_ci			.gpio2  = 0x00000001,
90062306a36Sopenharmony_ci			.gpio3  = 0x00000000,
90162306a36Sopenharmony_ci		} },
90262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
90362306a36Sopenharmony_ci	},
90462306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV1000] = {
90562306a36Sopenharmony_ci		.name           = "WinFast DTV1000-T",
90662306a36Sopenharmony_ci		.tuner_type     = UNSET,
90762306a36Sopenharmony_ci		.radio_type     = UNSET,
90862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
90962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
91062306a36Sopenharmony_ci		.input          = { {
91162306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
91262306a36Sopenharmony_ci			.vmux   = 0,
91362306a36Sopenharmony_ci		}, {
91462306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
91562306a36Sopenharmony_ci			.vmux   = 1,
91662306a36Sopenharmony_ci		}, {
91762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
91862306a36Sopenharmony_ci			.vmux   = 2,
91962306a36Sopenharmony_ci		} },
92062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
92162306a36Sopenharmony_ci	},
92262306a36Sopenharmony_ci	[CX88_BOARD_AVERTV_303] = {
92362306a36Sopenharmony_ci		.name           = "AVerTV 303 (M126)",
92462306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
92562306a36Sopenharmony_ci		.radio_type     = UNSET,
92662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
92762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
92862306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
92962306a36Sopenharmony_ci		.input          = { {
93062306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
93162306a36Sopenharmony_ci			.vmux   = 0,
93262306a36Sopenharmony_ci			.gpio0  = 0x00ff,
93362306a36Sopenharmony_ci			.gpio1  = 0xe09f,
93462306a36Sopenharmony_ci			.gpio2  = 0x0010,
93562306a36Sopenharmony_ci			.gpio3  = 0x0000,
93662306a36Sopenharmony_ci		}, {
93762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
93862306a36Sopenharmony_ci			.vmux   = 1,
93962306a36Sopenharmony_ci			.gpio0  = 0x00ff,
94062306a36Sopenharmony_ci			.gpio1  = 0xe05f,
94162306a36Sopenharmony_ci			.gpio2  = 0x0010,
94262306a36Sopenharmony_ci			.gpio3  = 0x0000,
94362306a36Sopenharmony_ci		}, {
94462306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
94562306a36Sopenharmony_ci			.vmux   = 2,
94662306a36Sopenharmony_ci			.gpio0  = 0x00ff,
94762306a36Sopenharmony_ci			.gpio1  = 0xe05f,
94862306a36Sopenharmony_ci			.gpio2  = 0x0010,
94962306a36Sopenharmony_ci			.gpio3  = 0x0000,
95062306a36Sopenharmony_ci		} },
95162306a36Sopenharmony_ci	},
95262306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {
95362306a36Sopenharmony_ci		.name		= "Hauppauge Nova-S-Plus DVB-S",
95462306a36Sopenharmony_ci		.tuner_type	= UNSET,
95562306a36Sopenharmony_ci		.radio_type	= UNSET,
95662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
95762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
95862306a36Sopenharmony_ci		.audio_chip	= CX88_AUDIO_WM8775,
95962306a36Sopenharmony_ci		.i2sinputcntl   = 2,
96062306a36Sopenharmony_ci		.input		= { {
96162306a36Sopenharmony_ci			.type	= CX88_VMUX_DVB,
96262306a36Sopenharmony_ci			.vmux	= 0,
96362306a36Sopenharmony_ci			/* 2: Line-In */
96462306a36Sopenharmony_ci			.audioroute = 2,
96562306a36Sopenharmony_ci		}, {
96662306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
96762306a36Sopenharmony_ci			.vmux	= 1,
96862306a36Sopenharmony_ci			/* 2: Line-In */
96962306a36Sopenharmony_ci			.audioroute = 2,
97062306a36Sopenharmony_ci		}, {
97162306a36Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
97262306a36Sopenharmony_ci			.vmux	= 2,
97362306a36Sopenharmony_ci			/* 2: Line-In */
97462306a36Sopenharmony_ci			.audioroute = 2,
97562306a36Sopenharmony_ci		} },
97662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
97762306a36Sopenharmony_ci	},
97862306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {
97962306a36Sopenharmony_ci		.name		= "Hauppauge Nova-SE2 DVB-S",
98062306a36Sopenharmony_ci		.tuner_type	= UNSET,
98162306a36Sopenharmony_ci		.radio_type	= UNSET,
98262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
98362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
98462306a36Sopenharmony_ci		.input		= { {
98562306a36Sopenharmony_ci			.type	= CX88_VMUX_DVB,
98662306a36Sopenharmony_ci			.vmux	= 0,
98762306a36Sopenharmony_ci		} },
98862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
98962306a36Sopenharmony_ci	},
99062306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_DVBS_100] = {
99162306a36Sopenharmony_ci		.name		= "KWorld DVB-S 100",
99262306a36Sopenharmony_ci		.tuner_type	= UNSET,
99362306a36Sopenharmony_ci		.radio_type	= UNSET,
99462306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
99562306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
99662306a36Sopenharmony_ci		.audio_chip = CX88_AUDIO_WM8775,
99762306a36Sopenharmony_ci		.input		= { {
99862306a36Sopenharmony_ci			.type	= CX88_VMUX_DVB,
99962306a36Sopenharmony_ci			.vmux	= 0,
100062306a36Sopenharmony_ci			/* 2: Line-In */
100162306a36Sopenharmony_ci			.audioroute = 2,
100262306a36Sopenharmony_ci		}, {
100362306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
100462306a36Sopenharmony_ci			.vmux	= 1,
100562306a36Sopenharmony_ci			/* 2: Line-In */
100662306a36Sopenharmony_ci			.audioroute = 2,
100762306a36Sopenharmony_ci		}, {
100862306a36Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
100962306a36Sopenharmony_ci			.vmux	= 2,
101062306a36Sopenharmony_ci			/* 2: Line-In */
101162306a36Sopenharmony_ci			.audioroute = 2,
101262306a36Sopenharmony_ci		} },
101362306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
101462306a36Sopenharmony_ci	},
101562306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR1100] = {
101662306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",
101762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
101862306a36Sopenharmony_ci		.radio_type	= UNSET,
101962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
102062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
102162306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
102262306a36Sopenharmony_ci		.input		= { {
102362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
102462306a36Sopenharmony_ci			.vmux   = 0,
102562306a36Sopenharmony_ci		}, {
102662306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
102762306a36Sopenharmony_ci			.vmux	= 1,
102862306a36Sopenharmony_ci		}, {
102962306a36Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
103062306a36Sopenharmony_ci			.vmux	= 2,
103162306a36Sopenharmony_ci		} },
103262306a36Sopenharmony_ci		/* fixme: Add radio support */
103362306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
103462306a36Sopenharmony_ci	},
103562306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR1100LP] = {
103662306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",
103762306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
103862306a36Sopenharmony_ci		.radio_type	= UNSET,
103962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
104062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
104162306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
104262306a36Sopenharmony_ci		.input		= { {
104362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
104462306a36Sopenharmony_ci			.vmux   = 0,
104562306a36Sopenharmony_ci		}, {
104662306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
104762306a36Sopenharmony_ci			.vmux	= 1,
104862306a36Sopenharmony_ci		} },
104962306a36Sopenharmony_ci		/* fixme: Add radio support */
105062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
105162306a36Sopenharmony_ci	},
105262306a36Sopenharmony_ci	[CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {
105362306a36Sopenharmony_ci		.name           = "digitalnow DNTV Live! DVB-T Pro",
105462306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
105562306a36Sopenharmony_ci		.radio_type     = UNSET,
105662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
105762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
105862306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
105962306a36Sopenharmony_ci				  TDA9887_PORT2_ACTIVE,
106062306a36Sopenharmony_ci		.input          = { {
106162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
106262306a36Sopenharmony_ci			.vmux   = 0,
106362306a36Sopenharmony_ci			.gpio0  = 0xf80808,
106462306a36Sopenharmony_ci		}, {
106562306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
106662306a36Sopenharmony_ci			.vmux   = 1,
106762306a36Sopenharmony_ci			.gpio0	= 0xf80808,
106862306a36Sopenharmony_ci		}, {
106962306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
107062306a36Sopenharmony_ci			.vmux   = 2,
107162306a36Sopenharmony_ci			.gpio0	= 0xf80808,
107262306a36Sopenharmony_ci		} },
107362306a36Sopenharmony_ci		.radio = {
107462306a36Sopenharmony_ci			 .type  = CX88_RADIO,
107562306a36Sopenharmony_ci			 .gpio0 = 0xf80808,
107662306a36Sopenharmony_ci		},
107762306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
107862306a36Sopenharmony_ci	},
107962306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_DVB_T_CX22702] = {
108062306a36Sopenharmony_ci		/* Kworld V-stream Xpert DVB-T with Thomson tuner */
108162306a36Sopenharmony_ci		/* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */
108262306a36Sopenharmony_ci		/* Manenti Marco <marco_manenti@colman.it> */
108362306a36Sopenharmony_ci		.name           = "KWorld/VStream XPert DVB-T with cx22702",
108462306a36Sopenharmony_ci		.tuner_type     = UNSET,
108562306a36Sopenharmony_ci		.radio_type     = UNSET,
108662306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
108762306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
108862306a36Sopenharmony_ci		.input          = { {
108962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
109062306a36Sopenharmony_ci			.vmux   = 1,
109162306a36Sopenharmony_ci			.gpio0  = 0x0700,
109262306a36Sopenharmony_ci			.gpio2  = 0x0101,
109362306a36Sopenharmony_ci		}, {
109462306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
109562306a36Sopenharmony_ci			.vmux   = 2,
109662306a36Sopenharmony_ci			.gpio0  = 0x0700,
109762306a36Sopenharmony_ci			.gpio2  = 0x0101,
109862306a36Sopenharmony_ci		} },
109962306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
110062306a36Sopenharmony_ci	},
110162306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {
110262306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Dual Digital",
110362306a36Sopenharmony_ci		.tuner_type     = UNSET, /* No analog tuner */
110462306a36Sopenharmony_ci		.radio_type     = UNSET,
110562306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
110662306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
110762306a36Sopenharmony_ci		.input          = { {
110862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
110962306a36Sopenharmony_ci			.vmux   = 1,
111062306a36Sopenharmony_ci			.gpio0  = 0x000067df,
111162306a36Sopenharmony_ci		 }, {
111262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
111362306a36Sopenharmony_ci			.vmux   = 2,
111462306a36Sopenharmony_ci			.gpio0  = 0x000067df,
111562306a36Sopenharmony_ci		} },
111662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
111762306a36Sopenharmony_ci	},
111862306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {
111962306a36Sopenharmony_ci		.name           = "KWorld HardwareMpegTV XPert",
112062306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_TDA8290,
112162306a36Sopenharmony_ci		.radio_type     = UNSET,
112262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
112362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
112462306a36Sopenharmony_ci		.input          = { {
112562306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
112662306a36Sopenharmony_ci			.vmux   = 0,
112762306a36Sopenharmony_ci			.gpio0  = 0x3de2,
112862306a36Sopenharmony_ci			.gpio2  = 0x00ff,
112962306a36Sopenharmony_ci		}, {
113062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
113162306a36Sopenharmony_ci			.vmux   = 1,
113262306a36Sopenharmony_ci			.gpio0  = 0x3de6,
113362306a36Sopenharmony_ci			.audioroute = 1,
113462306a36Sopenharmony_ci		}, {
113562306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
113662306a36Sopenharmony_ci			.vmux   = 2,
113762306a36Sopenharmony_ci			.gpio0  = 0x3de6,
113862306a36Sopenharmony_ci			.audioroute = 1,
113962306a36Sopenharmony_ci		} },
114062306a36Sopenharmony_ci		.radio = {
114162306a36Sopenharmony_ci			.type   = CX88_RADIO,
114262306a36Sopenharmony_ci			.gpio0  = 0x3de6,
114362306a36Sopenharmony_ci			.gpio2  = 0x00ff,
114462306a36Sopenharmony_ci		},
114562306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
114662306a36Sopenharmony_ci	},
114762306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {
114862306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T Hybrid",
114962306a36Sopenharmony_ci		.tuner_type     = TUNER_THOMSON_FE6600,
115062306a36Sopenharmony_ci		.radio_type     = UNSET,
115162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
115262306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
115362306a36Sopenharmony_ci		.input          = { {
115462306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
115562306a36Sopenharmony_ci			.vmux   = 0,
115662306a36Sopenharmony_ci			.gpio0  = 0x0000a75f,
115762306a36Sopenharmony_ci		}, {
115862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
115962306a36Sopenharmony_ci			.vmux   = 1,
116062306a36Sopenharmony_ci			.gpio0  = 0x0000a75b,
116162306a36Sopenharmony_ci		}, {
116262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
116362306a36Sopenharmony_ci			.vmux   = 2,
116462306a36Sopenharmony_ci			.gpio0  = 0x0000a75b,
116562306a36Sopenharmony_ci		} },
116662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
116762306a36Sopenharmony_ci	},
116862306a36Sopenharmony_ci	[CX88_BOARD_PCHDTV_HD5500] = {
116962306a36Sopenharmony_ci		.name           = "pcHDTV HD5500 HDTV",
117062306a36Sopenharmony_ci		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */
117162306a36Sopenharmony_ci		.radio_type     = UNSET,
117262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
117362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
117462306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
117562306a36Sopenharmony_ci		.input          = { {
117662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
117762306a36Sopenharmony_ci			.vmux   = 0,
117862306a36Sopenharmony_ci			.gpio0  = 0x87fd,
117962306a36Sopenharmony_ci		}, {
118062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
118162306a36Sopenharmony_ci			.vmux   = 1,
118262306a36Sopenharmony_ci			.gpio0  = 0x87f9,
118362306a36Sopenharmony_ci		}, {
118462306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
118562306a36Sopenharmony_ci			.vmux   = 2,
118662306a36Sopenharmony_ci			.gpio0  = 0x87f9,
118762306a36Sopenharmony_ci		} },
118862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
118962306a36Sopenharmony_ci	},
119062306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_MCE200_DELUXE] = {
119162306a36Sopenharmony_ci		/*
119262306a36Sopenharmony_ci		 * FIXME: tested TV input only, disabled composite,
119362306a36Sopenharmony_ci		 * svideo and radio until they can be tested also.
119462306a36Sopenharmony_ci		 */
119562306a36Sopenharmony_ci		.name           = "Kworld MCE 200 Deluxe",
119662306a36Sopenharmony_ci		.tuner_type     = TUNER_TENA_9533_DI,
119762306a36Sopenharmony_ci		.radio_type     = UNSET,
119862306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
119962306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
120062306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
120162306a36Sopenharmony_ci		.input          = { {
120262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
120362306a36Sopenharmony_ci			.vmux   = 0,
120462306a36Sopenharmony_ci			.gpio0  = 0x0000BDE6
120562306a36Sopenharmony_ci		} },
120662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
120762306a36Sopenharmony_ci	},
120862306a36Sopenharmony_ci	[CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {
120962306a36Sopenharmony_ci		/* FIXME: SVideo, Composite and FM inputs are untested */
121062306a36Sopenharmony_ci		.name           = "PixelView PlayTV P7000",
121162306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,
121262306a36Sopenharmony_ci		.radio_type     = UNSET,
121362306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
121462306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
121562306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |
121662306a36Sopenharmony_ci				  TDA9887_PORT2_ACTIVE,
121762306a36Sopenharmony_ci		.input          = { {
121862306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
121962306a36Sopenharmony_ci			.vmux   = 0,
122062306a36Sopenharmony_ci			.gpio0  = 0x5da6,
122162306a36Sopenharmony_ci		} },
122262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_BLACKBIRD,
122362306a36Sopenharmony_ci	},
122462306a36Sopenharmony_ci	[CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {
122562306a36Sopenharmony_ci		.name           = "NPG Tech Real TV FM Top 10",
122662306a36Sopenharmony_ci		.tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */
122762306a36Sopenharmony_ci		.radio_type     = UNSET,
122862306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
122962306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
123062306a36Sopenharmony_ci		.input          = { {
123162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
123262306a36Sopenharmony_ci			.vmux   = 0,
123362306a36Sopenharmony_ci			.gpio0	= 0x0788,
123462306a36Sopenharmony_ci		}, {
123562306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
123662306a36Sopenharmony_ci			.vmux   = 1,
123762306a36Sopenharmony_ci			.gpio0	= 0x078b,
123862306a36Sopenharmony_ci		}, {
123962306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
124062306a36Sopenharmony_ci			.vmux   = 2,
124162306a36Sopenharmony_ci			.gpio0	= 0x078b,
124262306a36Sopenharmony_ci		} },
124362306a36Sopenharmony_ci		.radio = {
124462306a36Sopenharmony_ci			 .type  = CX88_RADIO,
124562306a36Sopenharmony_ci			 .gpio0 = 0x074a,
124662306a36Sopenharmony_ci		},
124762306a36Sopenharmony_ci	},
124862306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV2000H] = {
124962306a36Sopenharmony_ci		.name           = "WinFast DTV2000 H",
125062306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
125162306a36Sopenharmony_ci		.radio_type     = UNSET,
125262306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
125362306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
125462306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
125562306a36Sopenharmony_ci		.input          = { {
125662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
125762306a36Sopenharmony_ci			.vmux   = 0,
125862306a36Sopenharmony_ci			.gpio0  = 0x00017304,
125962306a36Sopenharmony_ci			.gpio1  = 0x00008203,
126062306a36Sopenharmony_ci			.gpio2  = 0x00017304,
126162306a36Sopenharmony_ci			.gpio3  = 0x02000000,
126262306a36Sopenharmony_ci		}, {
126362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
126462306a36Sopenharmony_ci			.vmux   = 1,
126562306a36Sopenharmony_ci			.gpio0  = 0x0001d701,
126662306a36Sopenharmony_ci			.gpio1  = 0x0000b207,
126762306a36Sopenharmony_ci			.gpio2  = 0x0001d701,
126862306a36Sopenharmony_ci			.gpio3  = 0x02000000,
126962306a36Sopenharmony_ci		}, {
127062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE2,
127162306a36Sopenharmony_ci			.vmux   = 2,
127262306a36Sopenharmony_ci			.gpio0  = 0x0001d503,
127362306a36Sopenharmony_ci			.gpio1  = 0x0000b207,
127462306a36Sopenharmony_ci			.gpio2  = 0x0001d503,
127562306a36Sopenharmony_ci			.gpio3  = 0x02000000,
127662306a36Sopenharmony_ci		}, {
127762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
127862306a36Sopenharmony_ci			.vmux   = 3,
127962306a36Sopenharmony_ci			.gpio0  = 0x0001d701,
128062306a36Sopenharmony_ci			.gpio1  = 0x0000b207,
128162306a36Sopenharmony_ci			.gpio2  = 0x0001d701,
128262306a36Sopenharmony_ci			.gpio3  = 0x02000000,
128362306a36Sopenharmony_ci		} },
128462306a36Sopenharmony_ci		.radio = {
128562306a36Sopenharmony_ci			 .type  = CX88_RADIO,
128662306a36Sopenharmony_ci			 .gpio0 = 0x00015702,
128762306a36Sopenharmony_ci			 .gpio1 = 0x0000f207,
128862306a36Sopenharmony_ci			 .gpio2 = 0x00015702,
128962306a36Sopenharmony_ci			 .gpio3 = 0x02000000,
129062306a36Sopenharmony_ci		},
129162306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
129262306a36Sopenharmony_ci	},
129362306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV2000H_J] = {
129462306a36Sopenharmony_ci		.name           = "WinFast DTV2000 H rev. J",
129562306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216MEX_MK3,
129662306a36Sopenharmony_ci		.radio_type     = UNSET,
129762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
129862306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
129962306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
130062306a36Sopenharmony_ci		.input          = { {
130162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
130262306a36Sopenharmony_ci			.vmux   = 0,
130362306a36Sopenharmony_ci			.gpio0  = 0x00017300,
130462306a36Sopenharmony_ci			.gpio1  = 0x00008207,
130562306a36Sopenharmony_ci			.gpio2	= 0x00000000,
130662306a36Sopenharmony_ci			.gpio3  = 0x02000000,
130762306a36Sopenharmony_ci		}, {
130862306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
130962306a36Sopenharmony_ci			.vmux   = 0,
131062306a36Sopenharmony_ci			.gpio0  = 0x00018300,
131162306a36Sopenharmony_ci			.gpio1  = 0x0000f207,
131262306a36Sopenharmony_ci			.gpio2	= 0x00017304,
131362306a36Sopenharmony_ci			.gpio3  = 0x02000000,
131462306a36Sopenharmony_ci		}, {
131562306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
131662306a36Sopenharmony_ci			.vmux   = 1,
131762306a36Sopenharmony_ci			.gpio0  = 0x00018301,
131862306a36Sopenharmony_ci			.gpio1  = 0x0000f207,
131962306a36Sopenharmony_ci			.gpio2	= 0x00017304,
132062306a36Sopenharmony_ci			.gpio3  = 0x02000000,
132162306a36Sopenharmony_ci		}, {
132262306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
132362306a36Sopenharmony_ci			.vmux   = 2,
132462306a36Sopenharmony_ci			.gpio0  = 0x00018301,
132562306a36Sopenharmony_ci			.gpio1  = 0x0000f207,
132662306a36Sopenharmony_ci			.gpio2	= 0x00017304,
132762306a36Sopenharmony_ci			.gpio3  = 0x02000000,
132862306a36Sopenharmony_ci		} },
132962306a36Sopenharmony_ci		.radio = {
133062306a36Sopenharmony_ci			 .type  = CX88_RADIO,
133162306a36Sopenharmony_ci			 .gpio0 = 0x00015702,
133262306a36Sopenharmony_ci			 .gpio1 = 0x0000f207,
133362306a36Sopenharmony_ci			 .gpio2 = 0x00015702,
133462306a36Sopenharmony_ci			 .gpio3 = 0x02000000,
133562306a36Sopenharmony_ci		},
133662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
133762306a36Sopenharmony_ci	},
133862306a36Sopenharmony_ci	[CX88_BOARD_GENIATECH_DVBS] = {
133962306a36Sopenharmony_ci		.name          = "Geniatech DVB-S",
134062306a36Sopenharmony_ci		.tuner_type    = UNSET,
134162306a36Sopenharmony_ci		.radio_type    = UNSET,
134262306a36Sopenharmony_ci		.tuner_addr    = ADDR_UNSET,
134362306a36Sopenharmony_ci		.radio_addr    = ADDR_UNSET,
134462306a36Sopenharmony_ci		.input  = { {
134562306a36Sopenharmony_ci			.type  = CX88_VMUX_DVB,
134662306a36Sopenharmony_ci			.vmux  = 0,
134762306a36Sopenharmony_ci		}, {
134862306a36Sopenharmony_ci			.type  = CX88_VMUX_COMPOSITE1,
134962306a36Sopenharmony_ci			.vmux  = 1,
135062306a36Sopenharmony_ci		} },
135162306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
135262306a36Sopenharmony_ci	},
135362306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR3000] = {
135462306a36Sopenharmony_ci		.name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",
135562306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
135662306a36Sopenharmony_ci		.radio_type     = UNSET,
135762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
135862306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
135962306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
136062306a36Sopenharmony_ci		.audio_chip     = CX88_AUDIO_WM8775,
136162306a36Sopenharmony_ci		.input          = { {
136262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
136362306a36Sopenharmony_ci			.vmux   = 0,
136462306a36Sopenharmony_ci			.gpio0  = 0x84bf,
136562306a36Sopenharmony_ci			/* 1: TV Audio / FM Mono */
136662306a36Sopenharmony_ci			.audioroute = 1,
136762306a36Sopenharmony_ci		}, {
136862306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
136962306a36Sopenharmony_ci			.vmux   = 1,
137062306a36Sopenharmony_ci			.gpio0  = 0x84bf,
137162306a36Sopenharmony_ci			/* 2: Line-In */
137262306a36Sopenharmony_ci			.audioroute = 2,
137362306a36Sopenharmony_ci		}, {
137462306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
137562306a36Sopenharmony_ci			.vmux   = 2,
137662306a36Sopenharmony_ci			.gpio0  = 0x84bf,
137762306a36Sopenharmony_ci			/* 2: Line-In */
137862306a36Sopenharmony_ci			.audioroute = 2,
137962306a36Sopenharmony_ci		} },
138062306a36Sopenharmony_ci		.radio = {
138162306a36Sopenharmony_ci			.type   = CX88_RADIO,
138262306a36Sopenharmony_ci			.gpio0	= 0x84bf,
138362306a36Sopenharmony_ci			/* 4: FM Stereo (untested) */
138462306a36Sopenharmony_ci			.audioroute = 8,
138562306a36Sopenharmony_ci		},
138662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
138762306a36Sopenharmony_ci		.num_frontends	= 2,
138862306a36Sopenharmony_ci	},
138962306a36Sopenharmony_ci	[CX88_BOARD_NORWOOD_MICRO] = {
139062306a36Sopenharmony_ci		.name           = "Norwood Micro TV Tuner",
139162306a36Sopenharmony_ci		.tuner_type     = TUNER_TNF_5335MF,
139262306a36Sopenharmony_ci		.radio_type     = UNSET,
139362306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
139462306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
139562306a36Sopenharmony_ci		.input          = { {
139662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
139762306a36Sopenharmony_ci			.vmux   = 0,
139862306a36Sopenharmony_ci			.gpio0  = 0x0709,
139962306a36Sopenharmony_ci		}, {
140062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
140162306a36Sopenharmony_ci			.vmux   = 1,
140262306a36Sopenharmony_ci			.gpio0  = 0x070b,
140362306a36Sopenharmony_ci		}, {
140462306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
140562306a36Sopenharmony_ci			.vmux   = 2,
140662306a36Sopenharmony_ci			.gpio0  = 0x070b,
140762306a36Sopenharmony_ci		} },
140862306a36Sopenharmony_ci	},
140962306a36Sopenharmony_ci	[CX88_BOARD_TE_DTV_250_OEM_SWANN] = {
141062306a36Sopenharmony_ci		.name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",
141162306a36Sopenharmony_ci		.tuner_type     = TUNER_LG_PAL_NEW_TAPC,
141262306a36Sopenharmony_ci		.radio_type     = UNSET,
141362306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
141462306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
141562306a36Sopenharmony_ci		.input          = { {
141662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
141762306a36Sopenharmony_ci			.vmux   = 0,
141862306a36Sopenharmony_ci			.gpio0  = 0x003fffff,
141962306a36Sopenharmony_ci			.gpio1  = 0x00e00000,
142062306a36Sopenharmony_ci			.gpio2  = 0x003fffff,
142162306a36Sopenharmony_ci			.gpio3  = 0x02000000,
142262306a36Sopenharmony_ci		}, {
142362306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
142462306a36Sopenharmony_ci			.vmux   = 1,
142562306a36Sopenharmony_ci			.gpio0  = 0x003fffff,
142662306a36Sopenharmony_ci			.gpio1  = 0x00e00000,
142762306a36Sopenharmony_ci			.gpio2  = 0x003fffff,
142862306a36Sopenharmony_ci			.gpio3  = 0x02000000,
142962306a36Sopenharmony_ci		}, {
143062306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
143162306a36Sopenharmony_ci			.vmux   = 2,
143262306a36Sopenharmony_ci			.gpio0  = 0x003fffff,
143362306a36Sopenharmony_ci			.gpio1  = 0x00e00000,
143462306a36Sopenharmony_ci			.gpio2  = 0x003fffff,
143562306a36Sopenharmony_ci			.gpio3  = 0x02000000,
143662306a36Sopenharmony_ci		} },
143762306a36Sopenharmony_ci	},
143862306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR1300] = {
143962306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",
144062306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
144162306a36Sopenharmony_ci		.radio_type	= UNSET,
144262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
144362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
144462306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
144562306a36Sopenharmony_ci		.audio_chip     = CX88_AUDIO_WM8775,
144662306a36Sopenharmony_ci		/*
144762306a36Sopenharmony_ci		 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>
144862306a36Sopenharmony_ci		 */
144962306a36Sopenharmony_ci		.input		= { {
145062306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
145162306a36Sopenharmony_ci			.vmux   = 0,
145262306a36Sopenharmony_ci			.gpio0	= 0xef88,
145362306a36Sopenharmony_ci			/* 1: TV Audio / FM Mono */
145462306a36Sopenharmony_ci			.audioroute = 1,
145562306a36Sopenharmony_ci		}, {
145662306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
145762306a36Sopenharmony_ci			.vmux	= 1,
145862306a36Sopenharmony_ci			.gpio0	= 0xef88,
145962306a36Sopenharmony_ci			/* 2: Line-In */
146062306a36Sopenharmony_ci			.audioroute = 2,
146162306a36Sopenharmony_ci		}, {
146262306a36Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
146362306a36Sopenharmony_ci			.vmux	= 2,
146462306a36Sopenharmony_ci			.gpio0	= 0xef88,
146562306a36Sopenharmony_ci			/* 2: Line-In */
146662306a36Sopenharmony_ci			.audioroute = 2,
146762306a36Sopenharmony_ci		} },
146862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,
146962306a36Sopenharmony_ci		.radio = {
147062306a36Sopenharmony_ci			.type   = CX88_RADIO,
147162306a36Sopenharmony_ci			.gpio0	= 0xef88,
147262306a36Sopenharmony_ci			/* 4: FM Stereo (untested) */
147362306a36Sopenharmony_ci			.audioroute = 8,
147462306a36Sopenharmony_ci		},
147562306a36Sopenharmony_ci	},
147662306a36Sopenharmony_ci	[CX88_BOARD_SAMSUNG_SMT_7020] = {
147762306a36Sopenharmony_ci		.name		= "Samsung SMT 7020 DVB-S",
147862306a36Sopenharmony_ci		.tuner_type	= UNSET,
147962306a36Sopenharmony_ci		.radio_type	= UNSET,
148062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
148162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
148262306a36Sopenharmony_ci		.input		= { {
148362306a36Sopenharmony_ci			.type	= CX88_VMUX_DVB,
148462306a36Sopenharmony_ci			.vmux	= 0,
148562306a36Sopenharmony_ci		} },
148662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
148762306a36Sopenharmony_ci	},
148862306a36Sopenharmony_ci	[CX88_BOARD_ADSTECH_PTV_390] = {
148962306a36Sopenharmony_ci		.name           = "ADS Tech Instant Video PCI",
149062306a36Sopenharmony_ci		.tuner_type     = UNSET,
149162306a36Sopenharmony_ci		.radio_type     = UNSET,
149262306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
149362306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
149462306a36Sopenharmony_ci		.input          = { {
149562306a36Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
149662306a36Sopenharmony_ci			.vmux   = 3,
149762306a36Sopenharmony_ci			.gpio0  = 0x04ff,
149862306a36Sopenharmony_ci		}, {
149962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
150062306a36Sopenharmony_ci			.vmux   = 1,
150162306a36Sopenharmony_ci			.gpio0  = 0x07fa,
150262306a36Sopenharmony_ci		}, {
150362306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
150462306a36Sopenharmony_ci			.vmux   = 2,
150562306a36Sopenharmony_ci			.gpio0  = 0x07fa,
150662306a36Sopenharmony_ci		} },
150762306a36Sopenharmony_ci	},
150862306a36Sopenharmony_ci	[CX88_BOARD_PINNACLE_PCTV_HD_800i] = {
150962306a36Sopenharmony_ci		.name           = "Pinnacle PCTV HD 800i",
151062306a36Sopenharmony_ci		.tuner_type     = TUNER_XC5000,
151162306a36Sopenharmony_ci		.radio_type     = UNSET,
151262306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
151362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
151462306a36Sopenharmony_ci		.input          = { {
151562306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
151662306a36Sopenharmony_ci			.vmux   = 0,
151762306a36Sopenharmony_ci			.gpio0  = 0x04fb,
151862306a36Sopenharmony_ci			.gpio1  = 0x10ff,
151962306a36Sopenharmony_ci		}, {
152062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
152162306a36Sopenharmony_ci			.vmux   = 1,
152262306a36Sopenharmony_ci			.gpio0  = 0x04fb,
152362306a36Sopenharmony_ci			.gpio1  = 0x10ef,
152462306a36Sopenharmony_ci			.audioroute = 1,
152562306a36Sopenharmony_ci		}, {
152662306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
152762306a36Sopenharmony_ci			.vmux   = 2,
152862306a36Sopenharmony_ci			.gpio0  = 0x04fb,
152962306a36Sopenharmony_ci			.gpio1  = 0x10ef,
153062306a36Sopenharmony_ci			.audioroute = 1,
153162306a36Sopenharmony_ci		} },
153262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
153362306a36Sopenharmony_ci	},
153462306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {
153562306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV 5 PCI nano",
153662306a36Sopenharmony_ci		/* xc3008 tuner, digital only for now */
153762306a36Sopenharmony_ci		.tuner_type     = UNSET,
153862306a36Sopenharmony_ci		.radio_type     = UNSET,
153962306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
154062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
154162306a36Sopenharmony_ci		.input          = { {
154262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
154362306a36Sopenharmony_ci			.vmux   = 0,
154462306a36Sopenharmony_ci			.gpio0  = 0x000027df, /* Unconfirmed */
154562306a36Sopenharmony_ci		}, {
154662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
154762306a36Sopenharmony_ci			.vmux   = 1,
154862306a36Sopenharmony_ci			.gpio0  = 0x000027df, /* Unconfirmed */
154962306a36Sopenharmony_ci			.audioroute = 1,
155062306a36Sopenharmony_ci		}, {
155162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
155262306a36Sopenharmony_ci			.vmux   = 2,
155362306a36Sopenharmony_ci			.gpio0  = 0x000027df, /* Unconfirmed */
155462306a36Sopenharmony_ci			.audioroute = 1,
155562306a36Sopenharmony_ci		} },
155662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
155762306a36Sopenharmony_ci	},
155862306a36Sopenharmony_ci	[CX88_BOARD_PINNACLE_HYBRID_PCTV] = {
155962306a36Sopenharmony_ci		.name           = "Pinnacle Hybrid PCTV",
156062306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
156162306a36Sopenharmony_ci		.tuner_addr     = 0x61,
156262306a36Sopenharmony_ci		.radio_type     = UNSET,
156362306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
156462306a36Sopenharmony_ci		.input          = { {
156562306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
156662306a36Sopenharmony_ci			.vmux   = 0,
156762306a36Sopenharmony_ci			.gpio0  = 0x004ff,
156862306a36Sopenharmony_ci			.gpio1  = 0x010ff,
156962306a36Sopenharmony_ci			.gpio2  = 0x00001,
157062306a36Sopenharmony_ci		}, {
157162306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
157262306a36Sopenharmony_ci			.vmux   = 1,
157362306a36Sopenharmony_ci			.gpio0  = 0x004fb,
157462306a36Sopenharmony_ci			.gpio1  = 0x010ef,
157562306a36Sopenharmony_ci			.audioroute = 1,
157662306a36Sopenharmony_ci		}, {
157762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
157862306a36Sopenharmony_ci			.vmux   = 2,
157962306a36Sopenharmony_ci			.gpio0  = 0x004fb,
158062306a36Sopenharmony_ci			.gpio1  = 0x010ef,
158162306a36Sopenharmony_ci			.audioroute = 1,
158262306a36Sopenharmony_ci		} },
158362306a36Sopenharmony_ci		.radio = {
158462306a36Sopenharmony_ci			.type   = CX88_RADIO,
158562306a36Sopenharmony_ci			.gpio0  = 0x004ff,
158662306a36Sopenharmony_ci			.gpio1  = 0x010ff,
158762306a36Sopenharmony_ci			.gpio2  = 0x0ff,
158862306a36Sopenharmony_ci		},
158962306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
159062306a36Sopenharmony_ci	},
159162306a36Sopenharmony_ci	/* Terry Wu <terrywu2009@gmail.com> */
159262306a36Sopenharmony_ci	/* TV Audio :      set GPIO 2, 18, 19 value to 0, 1, 0 */
159362306a36Sopenharmony_ci	/* FM Audio :      set GPIO 2, 18, 19 value to 0, 0, 0 */
159462306a36Sopenharmony_ci	/* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */
159562306a36Sopenharmony_ci	/* Mute Audio :    set GPIO 2 value to 1               */
159662306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {
159762306a36Sopenharmony_ci		.name           = "Leadtek TV2000 XP Global",
159862306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
159962306a36Sopenharmony_ci		.tuner_addr     = 0x61,
160062306a36Sopenharmony_ci		.radio_type     = UNSET,
160162306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
160262306a36Sopenharmony_ci		.input          = { {
160362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
160462306a36Sopenharmony_ci			.vmux   = 0,
160562306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
160662306a36Sopenharmony_ci			.gpio1  = 0x0000,
160762306a36Sopenharmony_ci			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
160862306a36Sopenharmony_ci			.gpio3  = 0x0000,
160962306a36Sopenharmony_ci		}, {
161062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
161162306a36Sopenharmony_ci			.vmux   = 1,
161262306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
161362306a36Sopenharmony_ci			.gpio1  = 0x0000,
161462306a36Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
161562306a36Sopenharmony_ci			.gpio3  = 0x0000,
161662306a36Sopenharmony_ci		}, {
161762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
161862306a36Sopenharmony_ci			.vmux   = 2,
161962306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
162062306a36Sopenharmony_ci			.gpio1  = 0x0000,
162162306a36Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
162262306a36Sopenharmony_ci			.gpio3  = 0x0000,
162362306a36Sopenharmony_ci		} },
162462306a36Sopenharmony_ci		.radio = {
162562306a36Sopenharmony_ci			.type   = CX88_RADIO,
162662306a36Sopenharmony_ci			.gpio0  = 0x0400,        /* pin 2 = 0 */
162762306a36Sopenharmony_ci			.gpio1  = 0x0000,
162862306a36Sopenharmony_ci			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
162962306a36Sopenharmony_ci			.gpio3  = 0x0000,
163062306a36Sopenharmony_ci		},
163162306a36Sopenharmony_ci	},
163262306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = {
163362306a36Sopenharmony_ci		.name           = "Leadtek TV2000 XP Global (SC4100)",
163462306a36Sopenharmony_ci		.tuner_type     = TUNER_XC4000,
163562306a36Sopenharmony_ci		.tuner_addr     = 0x61,
163662306a36Sopenharmony_ci		.radio_type     = UNSET,
163762306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
163862306a36Sopenharmony_ci		.input          = { {
163962306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
164062306a36Sopenharmony_ci			.vmux   = 0,
164162306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
164262306a36Sopenharmony_ci			.gpio1  = 0x0000,
164362306a36Sopenharmony_ci			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */
164462306a36Sopenharmony_ci			.gpio3  = 0x0000,
164562306a36Sopenharmony_ci		}, {
164662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
164762306a36Sopenharmony_ci			.vmux   = 1,
164862306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
164962306a36Sopenharmony_ci			.gpio1  = 0x0000,
165062306a36Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
165162306a36Sopenharmony_ci			.gpio3  = 0x0000,
165262306a36Sopenharmony_ci		}, {
165362306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
165462306a36Sopenharmony_ci			.vmux   = 2,
165562306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
165662306a36Sopenharmony_ci			.gpio1  = 0x0000,
165762306a36Sopenharmony_ci			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */
165862306a36Sopenharmony_ci			.gpio3  = 0x0000,
165962306a36Sopenharmony_ci		} },
166062306a36Sopenharmony_ci		.radio = {
166162306a36Sopenharmony_ci			.type   = CX88_RADIO,
166262306a36Sopenharmony_ci			.gpio0  = 0x0400,        /* pin 2 = 0 */
166362306a36Sopenharmony_ci			.gpio1  = 0x0000,
166462306a36Sopenharmony_ci			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */
166562306a36Sopenharmony_ci			.gpio3  = 0x0000,
166662306a36Sopenharmony_ci		},
166762306a36Sopenharmony_ci	},
166862306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = {
166962306a36Sopenharmony_ci		.name           = "Leadtek TV2000 XP Global (XC4100)",
167062306a36Sopenharmony_ci		.tuner_type     = TUNER_XC4000,
167162306a36Sopenharmony_ci		.tuner_addr     = 0x61,
167262306a36Sopenharmony_ci		.radio_type     = UNSET,
167362306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
167462306a36Sopenharmony_ci		.input          = { {
167562306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
167662306a36Sopenharmony_ci			.vmux   = 0,
167762306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
167862306a36Sopenharmony_ci			.gpio1  = 0x6040,       /* pin 14 = 1, pin 13 = 0 */
167962306a36Sopenharmony_ci			.gpio2  = 0x0000,
168062306a36Sopenharmony_ci			.gpio3  = 0x0000,
168162306a36Sopenharmony_ci		}, {
168262306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
168362306a36Sopenharmony_ci			.vmux   = 1,
168462306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
168562306a36Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
168662306a36Sopenharmony_ci			.gpio2  = 0x0000,
168762306a36Sopenharmony_ci			.gpio3  = 0x0000,
168862306a36Sopenharmony_ci		}, {
168962306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
169062306a36Sopenharmony_ci			.vmux   = 2,
169162306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
169262306a36Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */
169362306a36Sopenharmony_ci			.gpio2  = 0x0000,
169462306a36Sopenharmony_ci			.gpio3  = 0x0000,
169562306a36Sopenharmony_ci		} },
169662306a36Sopenharmony_ci		.radio = {
169762306a36Sopenharmony_ci			.type   = CX88_RADIO,
169862306a36Sopenharmony_ci			.gpio0  = 0x0400,        /* pin 2 = 0 */
169962306a36Sopenharmony_ci			.gpio1  = 0x6000,        /* pin 14 = 1, pin 13 = 0 */
170062306a36Sopenharmony_ci			.gpio2  = 0x0000,
170162306a36Sopenharmony_ci			.gpio3  = 0x0000,
170262306a36Sopenharmony_ci		},
170362306a36Sopenharmony_ci	},
170462306a36Sopenharmony_ci	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {
170562306a36Sopenharmony_ci		/* Long names may confuse LIRC. */
170662306a36Sopenharmony_ci		.name           = "PowerColor RA330",
170762306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
170862306a36Sopenharmony_ci		.tuner_addr     = 0x61,
170962306a36Sopenharmony_ci		.input          = { {
171062306a36Sopenharmony_ci			/*
171162306a36Sopenharmony_ci			 * Due to the way the cx88 driver is written,
171262306a36Sopenharmony_ci			 * there is no way to deactivate audio pass-
171362306a36Sopenharmony_ci			 * through without this entry. Furthermore, if
171462306a36Sopenharmony_ci			 * the TV mux entry is first, you get audio
171562306a36Sopenharmony_ci			 * from the tuner on boot for a little while.
171662306a36Sopenharmony_ci			 */
171762306a36Sopenharmony_ci			.type   = CX88_VMUX_DEBUG,
171862306a36Sopenharmony_ci			.vmux   = 3,
171962306a36Sopenharmony_ci			.gpio0 = 0x00ff,
172062306a36Sopenharmony_ci			.gpio1 = 0xf39d,
172162306a36Sopenharmony_ci			.gpio3 = 0x0000,
172262306a36Sopenharmony_ci		}, {
172362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
172462306a36Sopenharmony_ci			.vmux   = 0,
172562306a36Sopenharmony_ci			.gpio0 = 0x00ff,
172662306a36Sopenharmony_ci			.gpio1 = 0xf35d,
172762306a36Sopenharmony_ci			.gpio3 = 0x0000,
172862306a36Sopenharmony_ci		}, {
172962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
173062306a36Sopenharmony_ci			.vmux   = 1,
173162306a36Sopenharmony_ci			.gpio0 = 0x00ff,
173262306a36Sopenharmony_ci			.gpio1 = 0xf37d,
173362306a36Sopenharmony_ci			.gpio3 = 0x0000,
173462306a36Sopenharmony_ci		}, {
173562306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
173662306a36Sopenharmony_ci			.vmux   = 2,
173762306a36Sopenharmony_ci			.gpio0  = 0x000ff,
173862306a36Sopenharmony_ci			.gpio1  = 0x0f37d,
173962306a36Sopenharmony_ci			.gpio3  = 0x00000,
174062306a36Sopenharmony_ci		} },
174162306a36Sopenharmony_ci		.radio = {
174262306a36Sopenharmony_ci			.type   = CX88_RADIO,
174362306a36Sopenharmony_ci			.gpio0  = 0x000ff,
174462306a36Sopenharmony_ci			.gpio1  = 0x0f35d,
174562306a36Sopenharmony_ci			.gpio3  = 0x00000,
174662306a36Sopenharmony_ci		},
174762306a36Sopenharmony_ci	},
174862306a36Sopenharmony_ci	[CX88_BOARD_GENIATECH_X8000_MT] = {
174962306a36Sopenharmony_ci		/* Also PowerColor Real Angel 330 and Geniatech X800 OEM */
175062306a36Sopenharmony_ci		.name           = "Geniatech X8000-MT DVBT",
175162306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
175262306a36Sopenharmony_ci		.tuner_addr     = 0x61,
175362306a36Sopenharmony_ci		.input          = { {
175462306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
175562306a36Sopenharmony_ci			.vmux   = 0,
175662306a36Sopenharmony_ci			.gpio0  = 0x00000000,
175762306a36Sopenharmony_ci			.gpio1  = 0x00e3e341,
175862306a36Sopenharmony_ci			.gpio2  = 0x00000000,
175962306a36Sopenharmony_ci			.gpio3  = 0x00000000,
176062306a36Sopenharmony_ci		}, {
176162306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
176262306a36Sopenharmony_ci			.vmux   = 1,
176362306a36Sopenharmony_ci			.gpio0  = 0x00000000,
176462306a36Sopenharmony_ci			.gpio1  = 0x00e3e361,
176562306a36Sopenharmony_ci			.gpio2  = 0x00000000,
176662306a36Sopenharmony_ci			.gpio3  = 0x00000000,
176762306a36Sopenharmony_ci		}, {
176862306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
176962306a36Sopenharmony_ci			.vmux   = 2,
177062306a36Sopenharmony_ci			.gpio0  = 0x00000000,
177162306a36Sopenharmony_ci			.gpio1  = 0x00e3e361,
177262306a36Sopenharmony_ci			.gpio2  = 0x00000000,
177362306a36Sopenharmony_ci			.gpio3  = 0x00000000,
177462306a36Sopenharmony_ci		} },
177562306a36Sopenharmony_ci		.radio = {
177662306a36Sopenharmony_ci			.type   = CX88_RADIO,
177762306a36Sopenharmony_ci			.gpio0  = 0x00000000,
177862306a36Sopenharmony_ci			.gpio1  = 0x00e3e341,
177962306a36Sopenharmony_ci			.gpio2  = 0x00000000,
178062306a36Sopenharmony_ci			.gpio3  = 0x00000000,
178162306a36Sopenharmony_ci		},
178262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
178362306a36Sopenharmony_ci	},
178462306a36Sopenharmony_ci	[CX88_BOARD_NOTONLYTV_LV3H] = {
178562306a36Sopenharmony_ci		.name           = "NotOnlyTV LV3H",
178662306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
178762306a36Sopenharmony_ci		.radio_type     = UNSET,
178862306a36Sopenharmony_ci		.tuner_addr     = 0x61,
178962306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
179062306a36Sopenharmony_ci		/* if gpio1:bit9 is enabled, DVB-T won't work */
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_ci		.input          = { {
179362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
179462306a36Sopenharmony_ci			.vmux   = 0,
179562306a36Sopenharmony_ci			.gpio0  = 0x0000,
179662306a36Sopenharmony_ci			.gpio1  = 0xa141,
179762306a36Sopenharmony_ci			.gpio2  = 0x0000,
179862306a36Sopenharmony_ci		}, {
179962306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
180062306a36Sopenharmony_ci			.vmux   = 1,
180162306a36Sopenharmony_ci			.gpio0  = 0x0000,
180262306a36Sopenharmony_ci			.gpio1  = 0xa161,
180362306a36Sopenharmony_ci			.gpio2  = 0x0000,
180462306a36Sopenharmony_ci		}, {
180562306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
180662306a36Sopenharmony_ci			.vmux   = 2,
180762306a36Sopenharmony_ci			.gpio0  = 0x0000,
180862306a36Sopenharmony_ci			.gpio1  = 0xa161,
180962306a36Sopenharmony_ci			.gpio2  = 0x0000,
181062306a36Sopenharmony_ci		} },
181162306a36Sopenharmony_ci		.radio = {
181262306a36Sopenharmony_ci			.type   = CX88_RADIO,
181362306a36Sopenharmony_ci			.gpio0  = 0x0000,
181462306a36Sopenharmony_ci			.gpio1  = 0xa141,
181562306a36Sopenharmony_ci			.gpio2  = 0x0000,
181662306a36Sopenharmony_ci		},
181762306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
181862306a36Sopenharmony_ci	},
181962306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {
182062306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV DVB-T PRO",
182162306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
182262306a36Sopenharmony_ci		.tuner_addr     = 0x61,
182362306a36Sopenharmony_ci		.radio_type     = UNSET,
182462306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
182562306a36Sopenharmony_ci		.input          = { {
182662306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
182762306a36Sopenharmony_ci			.vmux   = 1,
182862306a36Sopenharmony_ci			.gpio0  = 0x000067df,
182962306a36Sopenharmony_ci		}, {
183062306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
183162306a36Sopenharmony_ci			.vmux   = 2,
183262306a36Sopenharmony_ci			.gpio0  = 0x000067df,
183362306a36Sopenharmony_ci		} },
183462306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
183562306a36Sopenharmony_ci	},
183662306a36Sopenharmony_ci	[CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {
183762306a36Sopenharmony_ci		.name           = "DViCO FusionHDTV 7 Gold",
183862306a36Sopenharmony_ci		.tuner_type     = TUNER_XC5000,
183962306a36Sopenharmony_ci		.radio_type     = UNSET,
184062306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
184162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
184262306a36Sopenharmony_ci		.input          = { {
184362306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
184462306a36Sopenharmony_ci			.vmux   = 0,
184562306a36Sopenharmony_ci			.gpio0  = 0x10df,
184662306a36Sopenharmony_ci		}, {
184762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
184862306a36Sopenharmony_ci			.vmux   = 1,
184962306a36Sopenharmony_ci			.gpio0  = 0x16d9,
185062306a36Sopenharmony_ci		}, {
185162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
185262306a36Sopenharmony_ci			.vmux   = 2,
185362306a36Sopenharmony_ci			.gpio0  = 0x16d9,
185462306a36Sopenharmony_ci		} },
185562306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
185662306a36Sopenharmony_ci	},
185762306a36Sopenharmony_ci	[CX88_BOARD_PROLINK_PV_8000GT] = {
185862306a36Sopenharmony_ci		.name           = "Prolink Pixelview MPEG 8000GT",
185962306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
186062306a36Sopenharmony_ci		.tuner_addr     = 0x61,
186162306a36Sopenharmony_ci		.input          = { {
186262306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
186362306a36Sopenharmony_ci			.vmux   = 0,
186462306a36Sopenharmony_ci			.gpio0 = 0x0ff,
186562306a36Sopenharmony_ci			.gpio2 = 0x0cfb,
186662306a36Sopenharmony_ci		}, {
186762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
186862306a36Sopenharmony_ci			.vmux   = 1,
186962306a36Sopenharmony_ci			.gpio2 = 0x0cfb,
187062306a36Sopenharmony_ci		}, {
187162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
187262306a36Sopenharmony_ci			.vmux   = 2,
187362306a36Sopenharmony_ci			.gpio2 = 0x0cfb,
187462306a36Sopenharmony_ci		} },
187562306a36Sopenharmony_ci		.radio = {
187662306a36Sopenharmony_ci			.type   = CX88_RADIO,
187762306a36Sopenharmony_ci			.gpio2 = 0x0cfb,
187862306a36Sopenharmony_ci		},
187962306a36Sopenharmony_ci	},
188062306a36Sopenharmony_ci	[CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {
188162306a36Sopenharmony_ci		.name           = "Prolink Pixelview Global Extreme",
188262306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
188362306a36Sopenharmony_ci		.tuner_addr     = 0x61,
188462306a36Sopenharmony_ci		.input          = { {
188562306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
188662306a36Sopenharmony_ci			.vmux   = 0,
188762306a36Sopenharmony_ci			.gpio0 = 0x04fb,
188862306a36Sopenharmony_ci			.gpio1 = 0x04080,
188962306a36Sopenharmony_ci			.gpio2 = 0x0cf7,
189062306a36Sopenharmony_ci		}, {
189162306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
189262306a36Sopenharmony_ci			.vmux   = 1,
189362306a36Sopenharmony_ci			.gpio0 = 0x04fb,
189462306a36Sopenharmony_ci			.gpio1 = 0x04080,
189562306a36Sopenharmony_ci			.gpio2 = 0x0cfb,
189662306a36Sopenharmony_ci		}, {
189762306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
189862306a36Sopenharmony_ci			.vmux   = 2,
189962306a36Sopenharmony_ci			.gpio0 = 0x04fb,
190062306a36Sopenharmony_ci			.gpio1 = 0x04080,
190162306a36Sopenharmony_ci			.gpio2 = 0x0cfb,
190262306a36Sopenharmony_ci		} },
190362306a36Sopenharmony_ci		.radio = {
190462306a36Sopenharmony_ci			.type   = CX88_RADIO,
190562306a36Sopenharmony_ci			.gpio0 = 0x04ff,
190662306a36Sopenharmony_ci			.gpio1 = 0x04080,
190762306a36Sopenharmony_ci			.gpio2 = 0x0cf7,
190862306a36Sopenharmony_ci		},
190962306a36Sopenharmony_ci	},
191062306a36Sopenharmony_ci	/*
191162306a36Sopenharmony_ci	 * Both radio, analog and ATSC work with this board.
191262306a36Sopenharmony_ci	 * However, for analog to work, s5h1409 gate should be open,
191362306a36Sopenharmony_ci	 * otherwise, tuner-xc3028 won't be detected.
191462306a36Sopenharmony_ci	 * A proper fix require using the newer i2c methods to add
191562306a36Sopenharmony_ci	 * tuner-xc3028 without doing an i2c probe.
191662306a36Sopenharmony_ci	 */
191762306a36Sopenharmony_ci	[CX88_BOARD_KWORLD_ATSC_120] = {
191862306a36Sopenharmony_ci		.name           = "Kworld PlusTV HD PCI 120 (ATSC 120)",
191962306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
192062306a36Sopenharmony_ci		.radio_type     = UNSET,
192162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
192262306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
192362306a36Sopenharmony_ci		.input          = { {
192462306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
192562306a36Sopenharmony_ci			.vmux   = 0,
192662306a36Sopenharmony_ci			.gpio0  = 0x000000ff,
192762306a36Sopenharmony_ci			.gpio1  = 0x0000f35d,
192862306a36Sopenharmony_ci			.gpio2  = 0x00000000,
192962306a36Sopenharmony_ci		}, {
193062306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
193162306a36Sopenharmony_ci			.vmux   = 1,
193262306a36Sopenharmony_ci			.gpio0  = 0x000000ff,
193362306a36Sopenharmony_ci			.gpio1  = 0x0000f37e,
193462306a36Sopenharmony_ci			.gpio2  = 0x00000000,
193562306a36Sopenharmony_ci		}, {
193662306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
193762306a36Sopenharmony_ci			.vmux   = 2,
193862306a36Sopenharmony_ci			.gpio0  = 0x000000ff,
193962306a36Sopenharmony_ci			.gpio1  = 0x0000f37e,
194062306a36Sopenharmony_ci			.gpio2  = 0x00000000,
194162306a36Sopenharmony_ci		} },
194262306a36Sopenharmony_ci		.radio = {
194362306a36Sopenharmony_ci			.type   = CX88_RADIO,
194462306a36Sopenharmony_ci			.gpio0  = 0x000000ff,
194562306a36Sopenharmony_ci			.gpio1  = 0x0000f35d,
194662306a36Sopenharmony_ci			.gpio2  = 0x00000000,
194762306a36Sopenharmony_ci		},
194862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
194962306a36Sopenharmony_ci	},
195062306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR4000] = {
195162306a36Sopenharmony_ci		.name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",
195262306a36Sopenharmony_ci		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,
195362306a36Sopenharmony_ci		.radio_type     = UNSET,
195462306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
195562306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
195662306a36Sopenharmony_ci		.tda9887_conf   = TDA9887_PRESENT,
195762306a36Sopenharmony_ci		.audio_chip     = CX88_AUDIO_WM8775,
195862306a36Sopenharmony_ci		/*
195962306a36Sopenharmony_ci		 * GPIO0 (WINTV2000)
196062306a36Sopenharmony_ci		 *
196162306a36Sopenharmony_ci		 * Analogue     SAT     DVB-T
196262306a36Sopenharmony_ci		 * Antenna      0xc4bf  0xc4bb
196362306a36Sopenharmony_ci		 * Composite    0xc4bf  0xc4bb
196462306a36Sopenharmony_ci		 * S-Video      0xc4bf  0xc4bb
196562306a36Sopenharmony_ci		 * Composite1   0xc4ff  0xc4fb
196662306a36Sopenharmony_ci		 * S-Video1     0xc4ff  0xc4fb
196762306a36Sopenharmony_ci		 *
196862306a36Sopenharmony_ci		 * BIT  VALUE   FUNCTION GP{x}_IO
196962306a36Sopenharmony_ci		 * 0    1       I:?
197062306a36Sopenharmony_ci		 * 1    1       I:?
197162306a36Sopenharmony_ci		 * 2    1       O:MPEG PORT 0=DVB-T 1=DVB-S
197262306a36Sopenharmony_ci		 * 3    1       I:?
197362306a36Sopenharmony_ci		 * 4    1       I:?
197462306a36Sopenharmony_ci		 * 5    1       I:?
197562306a36Sopenharmony_ci		 * 6    0       O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION
197662306a36Sopenharmony_ci		 * 7    1       O:DVB-T DEMOD RESET LOW
197762306a36Sopenharmony_ci		 *
197862306a36Sopenharmony_ci		 * BIT  VALUE   FUNCTION GP{x}_OE
197962306a36Sopenharmony_ci		 * 8    0       I
198062306a36Sopenharmony_ci		 * 9    0       I
198162306a36Sopenharmony_ci		 * a    1       O
198262306a36Sopenharmony_ci		 * b    0       I
198362306a36Sopenharmony_ci		 * c    0       I
198462306a36Sopenharmony_ci		 * d    0       I
198562306a36Sopenharmony_ci		 * e    1       O
198662306a36Sopenharmony_ci		 * f    1       O
198762306a36Sopenharmony_ci		 *
198862306a36Sopenharmony_ci		 * WM8775 ADC
198962306a36Sopenharmony_ci		 *
199062306a36Sopenharmony_ci		 * 1: TV Audio / FM Mono
199162306a36Sopenharmony_ci		 * 2: Line-In
199262306a36Sopenharmony_ci		 * 3: Line-In Expansion
199362306a36Sopenharmony_ci		 * 4: FM Stereo
199462306a36Sopenharmony_ci		 */
199562306a36Sopenharmony_ci		.input          = { {
199662306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
199762306a36Sopenharmony_ci			.vmux   = 0,
199862306a36Sopenharmony_ci			.gpio0  = 0xc4bf,
199962306a36Sopenharmony_ci			/* 1: TV Audio / FM Mono */
200062306a36Sopenharmony_ci			.audioroute = 1,
200162306a36Sopenharmony_ci		}, {
200262306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
200362306a36Sopenharmony_ci			.vmux   = 1,
200462306a36Sopenharmony_ci			.gpio0  = 0xc4bf,
200562306a36Sopenharmony_ci			/* 2: Line-In */
200662306a36Sopenharmony_ci			.audioroute = 2,
200762306a36Sopenharmony_ci		}, {
200862306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
200962306a36Sopenharmony_ci			.vmux   = 2,
201062306a36Sopenharmony_ci			.gpio0  = 0xc4bf,
201162306a36Sopenharmony_ci			/* 2: Line-In */
201262306a36Sopenharmony_ci			.audioroute = 2,
201362306a36Sopenharmony_ci		} },
201462306a36Sopenharmony_ci		.radio = {
201562306a36Sopenharmony_ci			.type   = CX88_RADIO,
201662306a36Sopenharmony_ci			.gpio0	= 0xc4bf,
201762306a36Sopenharmony_ci			/* 4: FM Stereo */
201862306a36Sopenharmony_ci			.audioroute = 8,
201962306a36Sopenharmony_ci		},
202062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
202162306a36Sopenharmony_ci		.num_frontends	= 2,
202262306a36Sopenharmony_ci	},
202362306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {
202462306a36Sopenharmony_ci		.name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",
202562306a36Sopenharmony_ci		.tuner_type     = UNSET,
202662306a36Sopenharmony_ci		.radio_type     = UNSET,
202762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
202862306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
202962306a36Sopenharmony_ci		.input          = { {
203062306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
203162306a36Sopenharmony_ci			.vmux   = 0,
203262306a36Sopenharmony_ci		} },
203362306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
203462306a36Sopenharmony_ci	},
203562306a36Sopenharmony_ci	[CX88_BOARD_TEVII_S420] = {
203662306a36Sopenharmony_ci		.name           = "TeVii S420 DVB-S",
203762306a36Sopenharmony_ci		.tuner_type     = UNSET,
203862306a36Sopenharmony_ci		.radio_type     = UNSET,
203962306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
204062306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
204162306a36Sopenharmony_ci		.input          = { {
204262306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
204362306a36Sopenharmony_ci			.vmux   = 0,
204462306a36Sopenharmony_ci		} },
204562306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
204662306a36Sopenharmony_ci	},
204762306a36Sopenharmony_ci	[CX88_BOARD_TEVII_S460] = {
204862306a36Sopenharmony_ci		.name           = "TeVii S460 DVB-S/S2",
204962306a36Sopenharmony_ci		.tuner_type     = UNSET,
205062306a36Sopenharmony_ci		.radio_type     = UNSET,
205162306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
205262306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
205362306a36Sopenharmony_ci		.input          = { {
205462306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
205562306a36Sopenharmony_ci			.vmux   = 0,
205662306a36Sopenharmony_ci		} },
205762306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
205862306a36Sopenharmony_ci	},
205962306a36Sopenharmony_ci	[CX88_BOARD_TEVII_S464] = {
206062306a36Sopenharmony_ci		.name           = "TeVii S464 DVB-S/S2",
206162306a36Sopenharmony_ci		.tuner_type     = UNSET,
206262306a36Sopenharmony_ci		.radio_type     = UNSET,
206362306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
206462306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
206562306a36Sopenharmony_ci		.input          = { {
206662306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
206762306a36Sopenharmony_ci			.vmux   = 0,
206862306a36Sopenharmony_ci		} },
206962306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
207062306a36Sopenharmony_ci	},
207162306a36Sopenharmony_ci	[CX88_BOARD_OMICOM_SS4_PCI] = {
207262306a36Sopenharmony_ci		.name           = "Omicom SS4 DVB-S/S2 PCI",
207362306a36Sopenharmony_ci		.tuner_type     = UNSET,
207462306a36Sopenharmony_ci		.radio_type     = UNSET,
207562306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
207662306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
207762306a36Sopenharmony_ci		.input          = { {
207862306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
207962306a36Sopenharmony_ci			.vmux   = 0,
208062306a36Sopenharmony_ci		} },
208162306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
208262306a36Sopenharmony_ci	},
208362306a36Sopenharmony_ci	[CX88_BOARD_TBS_8910] = {
208462306a36Sopenharmony_ci		.name           = "TBS 8910 DVB-S",
208562306a36Sopenharmony_ci		.tuner_type     = UNSET,
208662306a36Sopenharmony_ci		.radio_type     = UNSET,
208762306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
208862306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
208962306a36Sopenharmony_ci		.input          = { {
209062306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
209162306a36Sopenharmony_ci			.vmux   = 0,
209262306a36Sopenharmony_ci		} },
209362306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
209462306a36Sopenharmony_ci	},
209562306a36Sopenharmony_ci	[CX88_BOARD_TBS_8920] = {
209662306a36Sopenharmony_ci		.name           = "TBS 8920 DVB-S/S2",
209762306a36Sopenharmony_ci		.tuner_type     = UNSET,
209862306a36Sopenharmony_ci		.radio_type     = UNSET,
209962306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
210062306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
210162306a36Sopenharmony_ci		.input          = { {
210262306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
210362306a36Sopenharmony_ci			.vmux   = 0,
210462306a36Sopenharmony_ci			.gpio0  = 0x8080,
210562306a36Sopenharmony_ci		} },
210662306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
210762306a36Sopenharmony_ci	},
210862306a36Sopenharmony_ci	[CX88_BOARD_PROF_6200] = {
210962306a36Sopenharmony_ci		.name           = "Prof 6200 DVB-S",
211062306a36Sopenharmony_ci		.tuner_type     = UNSET,
211162306a36Sopenharmony_ci		.radio_type     = UNSET,
211262306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
211362306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
211462306a36Sopenharmony_ci		.input          = { {
211562306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
211662306a36Sopenharmony_ci			.vmux   = 0,
211762306a36Sopenharmony_ci		} },
211862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
211962306a36Sopenharmony_ci	},
212062306a36Sopenharmony_ci	[CX88_BOARD_PROF_7300] = {
212162306a36Sopenharmony_ci		.name           = "PROF 7300 DVB-S/S2",
212262306a36Sopenharmony_ci		.tuner_type     = UNSET,
212362306a36Sopenharmony_ci		.radio_type     = UNSET,
212462306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
212562306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
212662306a36Sopenharmony_ci		.input          = { {
212762306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
212862306a36Sopenharmony_ci			.vmux   = 0,
212962306a36Sopenharmony_ci		} },
213062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
213162306a36Sopenharmony_ci	},
213262306a36Sopenharmony_ci	[CX88_BOARD_SATTRADE_ST4200] = {
213362306a36Sopenharmony_ci		.name           = "SATTRADE ST4200 DVB-S/S2",
213462306a36Sopenharmony_ci		.tuner_type     = UNSET,
213562306a36Sopenharmony_ci		.radio_type     = UNSET,
213662306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
213762306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
213862306a36Sopenharmony_ci		.input          = { {
213962306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
214062306a36Sopenharmony_ci			.vmux   = 0,
214162306a36Sopenharmony_ci		} },
214262306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
214362306a36Sopenharmony_ci	},
214462306a36Sopenharmony_ci	[CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {
214562306a36Sopenharmony_ci		.name           = "Terratec Cinergy HT PCI MKII",
214662306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
214762306a36Sopenharmony_ci		.tuner_addr     = 0x61,
214862306a36Sopenharmony_ci		.radio_type     = UNSET,
214962306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
215062306a36Sopenharmony_ci		.input          = { {
215162306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
215262306a36Sopenharmony_ci			.vmux   = 0,
215362306a36Sopenharmony_ci			.gpio0  = 0x004ff,
215462306a36Sopenharmony_ci			.gpio1  = 0x010ff,
215562306a36Sopenharmony_ci			.gpio2  = 0x00001,
215662306a36Sopenharmony_ci		}, {
215762306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
215862306a36Sopenharmony_ci			.vmux   = 1,
215962306a36Sopenharmony_ci			.gpio0  = 0x004fb,
216062306a36Sopenharmony_ci			.gpio1  = 0x010ef,
216162306a36Sopenharmony_ci			.audioroute = 1,
216262306a36Sopenharmony_ci		}, {
216362306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
216462306a36Sopenharmony_ci			.vmux   = 2,
216562306a36Sopenharmony_ci			.gpio0  = 0x004fb,
216662306a36Sopenharmony_ci			.gpio1  = 0x010ef,
216762306a36Sopenharmony_ci			.audioroute = 1,
216862306a36Sopenharmony_ci		} },
216962306a36Sopenharmony_ci		.radio = {
217062306a36Sopenharmony_ci			.type   = CX88_RADIO,
217162306a36Sopenharmony_ci			.gpio0  = 0x004ff,
217262306a36Sopenharmony_ci			.gpio1  = 0x010ff,
217362306a36Sopenharmony_ci			.gpio2  = 0x0ff,
217462306a36Sopenharmony_ci		},
217562306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
217662306a36Sopenharmony_ci	},
217762306a36Sopenharmony_ci	[CX88_BOARD_HAUPPAUGE_IRONLY] = {
217862306a36Sopenharmony_ci		.name           = "Hauppauge WinTV-IR Only",
217962306a36Sopenharmony_ci		.tuner_type     = UNSET,
218062306a36Sopenharmony_ci		.radio_type     = UNSET,
218162306a36Sopenharmony_ci		.tuner_addr	= ADDR_UNSET,
218262306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
218362306a36Sopenharmony_ci	},
218462306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV1800H] = {
218562306a36Sopenharmony_ci		.name           = "Leadtek WinFast DTV1800 Hybrid",
218662306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
218762306a36Sopenharmony_ci		.radio_type     = UNSET,
218862306a36Sopenharmony_ci		.tuner_addr     = 0x61,
218962306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
219062306a36Sopenharmony_ci		/*
219162306a36Sopenharmony_ci		 * GPIO setting
219262306a36Sopenharmony_ci		 *
219362306a36Sopenharmony_ci		 *  2: mute (0=off,1=on)
219462306a36Sopenharmony_ci		 * 12: tuner reset pin
219562306a36Sopenharmony_ci		 * 13: audio source (0=tuner audio,1=line in)
219662306a36Sopenharmony_ci		 * 14: FM (0=on,1=off ???)
219762306a36Sopenharmony_ci		 */
219862306a36Sopenharmony_ci		.input          = { {
219962306a36Sopenharmony_ci			.type   = CX88_VMUX_TELEVISION,
220062306a36Sopenharmony_ci			.vmux   = 0,
220162306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
220262306a36Sopenharmony_ci			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */
220362306a36Sopenharmony_ci			.gpio2  = 0x0000,
220462306a36Sopenharmony_ci		}, {
220562306a36Sopenharmony_ci			.type   = CX88_VMUX_COMPOSITE1,
220662306a36Sopenharmony_ci			.vmux   = 1,
220762306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
220862306a36Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
220962306a36Sopenharmony_ci			.gpio2  = 0x0000,
221062306a36Sopenharmony_ci		}, {
221162306a36Sopenharmony_ci			.type   = CX88_VMUX_SVIDEO,
221262306a36Sopenharmony_ci			.vmux   = 2,
221362306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
221462306a36Sopenharmony_ci			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */
221562306a36Sopenharmony_ci			.gpio2  = 0x0000,
221662306a36Sopenharmony_ci		} },
221762306a36Sopenharmony_ci		.radio = {
221862306a36Sopenharmony_ci			.type   = CX88_RADIO,
221962306a36Sopenharmony_ci			.gpio0  = 0x0400,       /* pin 2 = 0 */
222062306a36Sopenharmony_ci			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */
222162306a36Sopenharmony_ci			.gpio2  = 0x0000,
222262306a36Sopenharmony_ci		},
222362306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
222462306a36Sopenharmony_ci	},
222562306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV1800H_XC4000] = {
222662306a36Sopenharmony_ci		.name		= "Leadtek WinFast DTV1800 H (XC4000)",
222762306a36Sopenharmony_ci		.tuner_type	= TUNER_XC4000,
222862306a36Sopenharmony_ci		.radio_type	= UNSET,
222962306a36Sopenharmony_ci		.tuner_addr	= 0x61,
223062306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
223162306a36Sopenharmony_ci		/*
223262306a36Sopenharmony_ci		 * GPIO setting
223362306a36Sopenharmony_ci		 *
223462306a36Sopenharmony_ci		 *  2: mute (0=off,1=on)
223562306a36Sopenharmony_ci		 * 12: tuner reset pin
223662306a36Sopenharmony_ci		 * 13: audio source (0=tuner audio,1=line in)
223762306a36Sopenharmony_ci		 * 14: FM (0=on,1=off ???)
223862306a36Sopenharmony_ci		 */
223962306a36Sopenharmony_ci		.input		= { {
224062306a36Sopenharmony_ci			.type	= CX88_VMUX_TELEVISION,
224162306a36Sopenharmony_ci			.vmux	= 0,
224262306a36Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
224362306a36Sopenharmony_ci			.gpio1	= 0x6040,	/* pin 13 = 0, pin 14 = 1 */
224462306a36Sopenharmony_ci			.gpio2	= 0x0000,
224562306a36Sopenharmony_ci		}, {
224662306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
224762306a36Sopenharmony_ci			.vmux	= 1,
224862306a36Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
224962306a36Sopenharmony_ci			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
225062306a36Sopenharmony_ci			.gpio2	= 0x0000,
225162306a36Sopenharmony_ci		}, {
225262306a36Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
225362306a36Sopenharmony_ci			.vmux	= 2,
225462306a36Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
225562306a36Sopenharmony_ci			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */
225662306a36Sopenharmony_ci			.gpio2	= 0x0000,
225762306a36Sopenharmony_ci		} },
225862306a36Sopenharmony_ci		.radio = {
225962306a36Sopenharmony_ci			.type	= CX88_RADIO,
226062306a36Sopenharmony_ci			.gpio0	= 0x0400,	/* pin 2 = 0 */
226162306a36Sopenharmony_ci			.gpio1	= 0x6000,	/* pin 13 = 0, pin 14 = 0 */
226262306a36Sopenharmony_ci			.gpio2	= 0x0000,
226362306a36Sopenharmony_ci		},
226462306a36Sopenharmony_ci		.mpeg		= CX88_MPEG_DVB,
226562306a36Sopenharmony_ci	},
226662306a36Sopenharmony_ci	[CX88_BOARD_WINFAST_DTV2000H_PLUS] = {
226762306a36Sopenharmony_ci		.name		= "Leadtek WinFast DTV2000 H PLUS",
226862306a36Sopenharmony_ci		.tuner_type	= TUNER_XC4000,
226962306a36Sopenharmony_ci		.radio_type	= UNSET,
227062306a36Sopenharmony_ci		.tuner_addr	= 0x61,
227162306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
227262306a36Sopenharmony_ci		/*
227362306a36Sopenharmony_ci		 * GPIO
227462306a36Sopenharmony_ci		 *   2: 1: mute audio
227562306a36Sopenharmony_ci		 *  12: 0: reset XC4000
227662306a36Sopenharmony_ci		 *  13: 1: audio input is line in (0: tuner)
227762306a36Sopenharmony_ci		 *  14: 0: FM radio
227862306a36Sopenharmony_ci		 *  16: 0: RF input is cable
227962306a36Sopenharmony_ci		 */
228062306a36Sopenharmony_ci		.input		= { {
228162306a36Sopenharmony_ci			.type	= CX88_VMUX_TELEVISION,
228262306a36Sopenharmony_ci			.vmux	= 0,
228362306a36Sopenharmony_ci			.gpio0	= 0x0403,
228462306a36Sopenharmony_ci			.gpio1	= 0xF0D7,
228562306a36Sopenharmony_ci			.gpio2	= 0x0101,
228662306a36Sopenharmony_ci			.gpio3	= 0x0000,
228762306a36Sopenharmony_ci		}, {
228862306a36Sopenharmony_ci			.type	= CX88_VMUX_CABLE,
228962306a36Sopenharmony_ci			.vmux	= 0,
229062306a36Sopenharmony_ci			.gpio0	= 0x0403,
229162306a36Sopenharmony_ci			.gpio1	= 0xF0D7,
229262306a36Sopenharmony_ci			.gpio2	= 0x0100,
229362306a36Sopenharmony_ci			.gpio3	= 0x0000,
229462306a36Sopenharmony_ci		}, {
229562306a36Sopenharmony_ci			.type	= CX88_VMUX_COMPOSITE1,
229662306a36Sopenharmony_ci			.vmux	= 1,
229762306a36Sopenharmony_ci			.gpio0	= 0x0403,	/* was 0x0407 */
229862306a36Sopenharmony_ci			.gpio1	= 0xF0F7,
229962306a36Sopenharmony_ci			.gpio2	= 0x0101,
230062306a36Sopenharmony_ci			.gpio3	= 0x0000,
230162306a36Sopenharmony_ci		}, {
230262306a36Sopenharmony_ci			.type	= CX88_VMUX_SVIDEO,
230362306a36Sopenharmony_ci			.vmux	= 2,
230462306a36Sopenharmony_ci			.gpio0	= 0x0403,	/* was 0x0407 */
230562306a36Sopenharmony_ci			.gpio1	= 0xF0F7,
230662306a36Sopenharmony_ci			.gpio2	= 0x0101,
230762306a36Sopenharmony_ci			.gpio3	= 0x0000,
230862306a36Sopenharmony_ci		} },
230962306a36Sopenharmony_ci		.radio = {
231062306a36Sopenharmony_ci			.type	= CX88_RADIO,
231162306a36Sopenharmony_ci			.gpio0	= 0x0403,
231262306a36Sopenharmony_ci			.gpio1	= 0xF097,
231362306a36Sopenharmony_ci			.gpio2	= 0x0100,
231462306a36Sopenharmony_ci			.gpio3	= 0x0000,
231562306a36Sopenharmony_ci		},
231662306a36Sopenharmony_ci		.mpeg		= CX88_MPEG_DVB,
231762306a36Sopenharmony_ci	},
231862306a36Sopenharmony_ci	[CX88_BOARD_PROF_7301] = {
231962306a36Sopenharmony_ci		.name           = "Prof 7301 DVB-S/S2",
232062306a36Sopenharmony_ci		.tuner_type     = UNSET,
232162306a36Sopenharmony_ci		.radio_type     = UNSET,
232262306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
232362306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
232462306a36Sopenharmony_ci		.input          = { {
232562306a36Sopenharmony_ci			.type   = CX88_VMUX_DVB,
232662306a36Sopenharmony_ci			.vmux   = 0,
232762306a36Sopenharmony_ci		} },
232862306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
232962306a36Sopenharmony_ci	},
233062306a36Sopenharmony_ci	[CX88_BOARD_TWINHAN_VP1027_DVBS] = {
233162306a36Sopenharmony_ci		.name		= "Twinhan VP-1027 DVB-S",
233262306a36Sopenharmony_ci		.tuner_type     = UNSET,
233362306a36Sopenharmony_ci		.radio_type     = UNSET,
233462306a36Sopenharmony_ci		.tuner_addr     = ADDR_UNSET,
233562306a36Sopenharmony_ci		.radio_addr     = ADDR_UNSET,
233662306a36Sopenharmony_ci		.input          = { {
233762306a36Sopenharmony_ci		       .type   = CX88_VMUX_DVB,
233862306a36Sopenharmony_ci		       .vmux   = 0,
233962306a36Sopenharmony_ci		} },
234062306a36Sopenharmony_ci		.mpeg           = CX88_MPEG_DVB,
234162306a36Sopenharmony_ci	},
234262306a36Sopenharmony_ci};
234362306a36Sopenharmony_ci
234462306a36Sopenharmony_ci/* ------------------------------------------------------------------ */
234562306a36Sopenharmony_ci/* PCI subsystem IDs                                                  */
234662306a36Sopenharmony_ci
234762306a36Sopenharmony_cistatic const struct cx88_subid cx88_subids[] = {
234862306a36Sopenharmony_ci	{
234962306a36Sopenharmony_ci		.subvendor = 0x0070,
235062306a36Sopenharmony_ci		.subdevice = 0x3400,
235162306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE,
235262306a36Sopenharmony_ci	}, {
235362306a36Sopenharmony_ci		.subvendor = 0x0070,
235462306a36Sopenharmony_ci		.subdevice = 0x3401,
235562306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE,
235662306a36Sopenharmony_ci	}, {
235762306a36Sopenharmony_ci		.subvendor = 0x14c7,
235862306a36Sopenharmony_ci		.subdevice = 0x0106,
235962306a36Sopenharmony_ci		.card      = CX88_BOARD_GDI,
236062306a36Sopenharmony_ci	}, {
236162306a36Sopenharmony_ci		.subvendor = 0x14c7,
236262306a36Sopenharmony_ci		.subdevice = 0x0107, /* with mpeg encoder */
236362306a36Sopenharmony_ci		.card      = CX88_BOARD_GDI,
236462306a36Sopenharmony_ci	}, {
236562306a36Sopenharmony_ci		.subvendor = PCI_VENDOR_ID_ATI,
236662306a36Sopenharmony_ci		.subdevice = 0x00f8,
236762306a36Sopenharmony_ci		.card      = CX88_BOARD_ATI_WONDER_PRO,
236862306a36Sopenharmony_ci	}, {
236962306a36Sopenharmony_ci		.subvendor = PCI_VENDOR_ID_ATI,
237062306a36Sopenharmony_ci		.subdevice = 0x00f9,
237162306a36Sopenharmony_ci		.card      = CX88_BOARD_ATI_WONDER_PRO,
237262306a36Sopenharmony_ci	}, {
237362306a36Sopenharmony_ci		.subvendor = 0x107d,
237462306a36Sopenharmony_ci		.subdevice = 0x6611,
237562306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
237662306a36Sopenharmony_ci	}, {
237762306a36Sopenharmony_ci		.subvendor = 0x107d,
237862306a36Sopenharmony_ci		.subdevice = 0x6613,	/* NTSC */
237962306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,
238062306a36Sopenharmony_ci	}, {
238162306a36Sopenharmony_ci		.subvendor = 0x107d,
238262306a36Sopenharmony_ci		.subdevice = 0x6620,
238362306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DV2000,
238462306a36Sopenharmony_ci	}, {
238562306a36Sopenharmony_ci		.subvendor = 0x107d,
238662306a36Sopenharmony_ci		.subdevice = 0x663b,
238762306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
238862306a36Sopenharmony_ci	}, {
238962306a36Sopenharmony_ci		.subvendor = 0x107d,
239062306a36Sopenharmony_ci		.subdevice = 0x663c,
239162306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
239262306a36Sopenharmony_ci	}, {
239362306a36Sopenharmony_ci		.subvendor = 0x1461,
239462306a36Sopenharmony_ci		.subdevice = 0x000b,
239562306a36Sopenharmony_ci		.card      = CX88_BOARD_AVERTV_STUDIO_303,
239662306a36Sopenharmony_ci	}, {
239762306a36Sopenharmony_ci		.subvendor = 0x1462,
239862306a36Sopenharmony_ci		.subdevice = 0x8606,
239962306a36Sopenharmony_ci		.card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,
240062306a36Sopenharmony_ci	}, {
240162306a36Sopenharmony_ci		.subvendor = 0x10fc,
240262306a36Sopenharmony_ci		.subdevice = 0xd003,
240362306a36Sopenharmony_ci		.card      = CX88_BOARD_IODATA_GVVCP3PCI,
240462306a36Sopenharmony_ci	}, {
240562306a36Sopenharmony_ci		.subvendor = 0x1043,
240662306a36Sopenharmony_ci		.subdevice = 0x4823,  /* with mpeg encoder */
240762306a36Sopenharmony_ci		.card      = CX88_BOARD_ASUS_PVR_416,
240862306a36Sopenharmony_ci	}, {
240962306a36Sopenharmony_ci		.subvendor = 0x17de,
241062306a36Sopenharmony_ci		.subdevice = 0x08a6,
241162306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVB_T,
241262306a36Sopenharmony_ci	}, {
241362306a36Sopenharmony_ci		.subvendor = 0x18ac,
241462306a36Sopenharmony_ci		.subdevice = 0xd810,
241562306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
241662306a36Sopenharmony_ci	}, {
241762306a36Sopenharmony_ci		.subvendor = 0x18ac,
241862306a36Sopenharmony_ci		.subdevice = 0xd820,
241962306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,
242062306a36Sopenharmony_ci	}, {
242162306a36Sopenharmony_ci		.subvendor = 0x18ac,
242262306a36Sopenharmony_ci		.subdevice = 0xdb00,
242362306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,
242462306a36Sopenharmony_ci	}, {
242562306a36Sopenharmony_ci		.subvendor = 0x0070,
242662306a36Sopenharmony_ci		.subdevice = 0x9002,
242762306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
242862306a36Sopenharmony_ci	}, {
242962306a36Sopenharmony_ci		.subvendor = 0x14f1,
243062306a36Sopenharmony_ci		.subdevice = 0x0187,
243162306a36Sopenharmony_ci		.card      = CX88_BOARD_CONEXANT_DVB_T1,
243262306a36Sopenharmony_ci	}, {
243362306a36Sopenharmony_ci		.subvendor = 0x1540,
243462306a36Sopenharmony_ci		.subdevice = 0x2580,
243562306a36Sopenharmony_ci		.card      = CX88_BOARD_PROVIDEO_PV259,
243662306a36Sopenharmony_ci	}, {
243762306a36Sopenharmony_ci		.subvendor = 0x18ac,
243862306a36Sopenharmony_ci		.subdevice = 0xdb10,
243962306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
244062306a36Sopenharmony_ci	}, {
244162306a36Sopenharmony_ci		.subvendor = 0x1554,
244262306a36Sopenharmony_ci		.subdevice = 0x4811,
244362306a36Sopenharmony_ci		.card      = CX88_BOARD_PIXELVIEW,
244462306a36Sopenharmony_ci	}, {
244562306a36Sopenharmony_ci		.subvendor = 0x7063,
244662306a36Sopenharmony_ci		.subdevice = 0x3000, /* HD-3000 card */
244762306a36Sopenharmony_ci		.card      = CX88_BOARD_PCHDTV_HD3000,
244862306a36Sopenharmony_ci	}, {
244962306a36Sopenharmony_ci		.subvendor = 0x17de,
245062306a36Sopenharmony_ci		.subdevice = 0xa8a6,
245162306a36Sopenharmony_ci		.card      = CX88_BOARD_DNTV_LIVE_DVB_T,
245262306a36Sopenharmony_ci	}, {
245362306a36Sopenharmony_ci		.subvendor = 0x0070,
245462306a36Sopenharmony_ci		.subdevice = 0x2801,
245562306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_ROSLYN,
245662306a36Sopenharmony_ci	}, {
245762306a36Sopenharmony_ci		.subvendor = 0x14f1,
245862306a36Sopenharmony_ci		.subdevice = 0x0342,
245962306a36Sopenharmony_ci		.card      = CX88_BOARD_DIGITALLOGIC_MEC,
246062306a36Sopenharmony_ci	}, {
246162306a36Sopenharmony_ci		.subvendor = 0x10fc,
246262306a36Sopenharmony_ci		.subdevice = 0xd035,
246362306a36Sopenharmony_ci		.card      = CX88_BOARD_IODATA_GVBCTV7E,
246462306a36Sopenharmony_ci	}, {
246562306a36Sopenharmony_ci		.subvendor = 0x1421,
246662306a36Sopenharmony_ci		.subdevice = 0x0334,
246762306a36Sopenharmony_ci		.card      = CX88_BOARD_ADSTECH_DVB_T_PCI,
246862306a36Sopenharmony_ci	}, {
246962306a36Sopenharmony_ci		.subvendor = 0x153b,
247062306a36Sopenharmony_ci		.subdevice = 0x1166,
247162306a36Sopenharmony_ci		.card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,
247262306a36Sopenharmony_ci	}, {
247362306a36Sopenharmony_ci		.subvendor = 0x18ac,
247462306a36Sopenharmony_ci		.subdevice = 0xd500,
247562306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,
247662306a36Sopenharmony_ci	}, {
247762306a36Sopenharmony_ci		.subvendor = 0x1461,
247862306a36Sopenharmony_ci		.subdevice = 0x8011,
247962306a36Sopenharmony_ci		.card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,
248062306a36Sopenharmony_ci	}, {
248162306a36Sopenharmony_ci		.subvendor = PCI_VENDOR_ID_ATI,
248262306a36Sopenharmony_ci		.subdevice = 0xa101,
248362306a36Sopenharmony_ci		.card      = CX88_BOARD_ATI_HDTVWONDER,
248462306a36Sopenharmony_ci	}, {
248562306a36Sopenharmony_ci		.subvendor = 0x107d,
248662306a36Sopenharmony_ci		.subdevice = 0x665f,
248762306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV1000,
248862306a36Sopenharmony_ci	}, {
248962306a36Sopenharmony_ci		.subvendor = 0x1461,
249062306a36Sopenharmony_ci		.subdevice = 0x000a,
249162306a36Sopenharmony_ci		.card      = CX88_BOARD_AVERTV_303,
249262306a36Sopenharmony_ci	}, {
249362306a36Sopenharmony_ci		.subvendor = 0x0070,
249462306a36Sopenharmony_ci		.subdevice = 0x9200,
249562306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,
249662306a36Sopenharmony_ci	}, {
249762306a36Sopenharmony_ci		.subvendor = 0x0070,
249862306a36Sopenharmony_ci		.subdevice = 0x9201,
249962306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
250062306a36Sopenharmony_ci	}, {
250162306a36Sopenharmony_ci		.subvendor = 0x0070,
250262306a36Sopenharmony_ci		.subdevice = 0x9202,
250362306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,
250462306a36Sopenharmony_ci	}, {
250562306a36Sopenharmony_ci		.subvendor = 0x17de,
250662306a36Sopenharmony_ci		.subdevice = 0x08b2,
250762306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVBS_100,
250862306a36Sopenharmony_ci	}, {
250962306a36Sopenharmony_ci		.subvendor = 0x0070,
251062306a36Sopenharmony_ci		.subdevice = 0x9400,
251162306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
251262306a36Sopenharmony_ci	}, {
251362306a36Sopenharmony_ci		.subvendor = 0x0070,
251462306a36Sopenharmony_ci		.subdevice = 0x9402,
251562306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,
251662306a36Sopenharmony_ci	}, {
251762306a36Sopenharmony_ci		.subvendor = 0x0070,
251862306a36Sopenharmony_ci		.subdevice = 0x9800,
251962306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
252062306a36Sopenharmony_ci	}, {
252162306a36Sopenharmony_ci		.subvendor = 0x0070,
252262306a36Sopenharmony_ci		.subdevice = 0x9802,
252362306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,
252462306a36Sopenharmony_ci	}, {
252562306a36Sopenharmony_ci		.subvendor = 0x0070,
252662306a36Sopenharmony_ci		.subdevice = 0x9001,
252762306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
252862306a36Sopenharmony_ci	}, {
252962306a36Sopenharmony_ci		.subvendor = 0x1822,
253062306a36Sopenharmony_ci		.subdevice = 0x0025,
253162306a36Sopenharmony_ci		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
253262306a36Sopenharmony_ci	}, {
253362306a36Sopenharmony_ci		.subvendor = 0x17de,
253462306a36Sopenharmony_ci		.subdevice = 0x08a1,
253562306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
253662306a36Sopenharmony_ci	}, {
253762306a36Sopenharmony_ci		.subvendor = 0x18ac,
253862306a36Sopenharmony_ci		.subdevice = 0xdb50,
253962306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
254062306a36Sopenharmony_ci	}, {
254162306a36Sopenharmony_ci		.subvendor = 0x18ac,
254262306a36Sopenharmony_ci		.subdevice = 0xdb54,
254362306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,
254462306a36Sopenharmony_ci		/* Re-branded DViCO: DigitalNow DVB-T Dual */
254562306a36Sopenharmony_ci	}, {
254662306a36Sopenharmony_ci		.subvendor = 0x18ac,
254762306a36Sopenharmony_ci		.subdevice = 0xdb11,
254862306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,
254962306a36Sopenharmony_ci		/* Re-branded DViCO: UltraView DVB-T Plus */
255062306a36Sopenharmony_ci	}, {
255162306a36Sopenharmony_ci		.subvendor = 0x18ac,
255262306a36Sopenharmony_ci		.subdevice = 0xdb30,
255362306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,
255462306a36Sopenharmony_ci	}, {
255562306a36Sopenharmony_ci		.subvendor = 0x17de,
255662306a36Sopenharmony_ci		.subdevice = 0x0840,
255762306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
255862306a36Sopenharmony_ci	}, {
255962306a36Sopenharmony_ci		.subvendor = 0x1421,
256062306a36Sopenharmony_ci		.subdevice = 0x0305,
256162306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,
256262306a36Sopenharmony_ci	}, {
256362306a36Sopenharmony_ci		.subvendor = 0x18ac,
256462306a36Sopenharmony_ci		.subdevice = 0xdb40,
256562306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
256662306a36Sopenharmony_ci	}, {
256762306a36Sopenharmony_ci		.subvendor = 0x18ac,
256862306a36Sopenharmony_ci		.subdevice = 0xdb44,
256962306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,
257062306a36Sopenharmony_ci	}, {
257162306a36Sopenharmony_ci		.subvendor = 0x7063,
257262306a36Sopenharmony_ci		.subdevice = 0x5500,
257362306a36Sopenharmony_ci		.card      = CX88_BOARD_PCHDTV_HD5500,
257462306a36Sopenharmony_ci	}, {
257562306a36Sopenharmony_ci		.subvendor = 0x17de,
257662306a36Sopenharmony_ci		.subdevice = 0x0841,
257762306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_MCE200_DELUXE,
257862306a36Sopenharmony_ci	}, {
257962306a36Sopenharmony_ci		.subvendor = 0x1822,
258062306a36Sopenharmony_ci		.subdevice = 0x0019,
258162306a36Sopenharmony_ci		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,
258262306a36Sopenharmony_ci	}, {
258362306a36Sopenharmony_ci		.subvendor = 0x1554,
258462306a36Sopenharmony_ci		.subdevice = 0x4813,
258562306a36Sopenharmony_ci		.card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,
258662306a36Sopenharmony_ci	}, {
258762306a36Sopenharmony_ci		.subvendor = 0x14f1,
258862306a36Sopenharmony_ci		.subdevice = 0x0842,
258962306a36Sopenharmony_ci		.card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,
259062306a36Sopenharmony_ci	}, {
259162306a36Sopenharmony_ci		.subvendor = 0x107d,
259262306a36Sopenharmony_ci		.subdevice = 0x665e,
259362306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV2000H,
259462306a36Sopenharmony_ci	}, {
259562306a36Sopenharmony_ci		.subvendor = 0x107d,
259662306a36Sopenharmony_ci		.subdevice = 0x6f2b,
259762306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV2000H_J,
259862306a36Sopenharmony_ci	}, {
259962306a36Sopenharmony_ci		.subvendor = 0x18ac,
260062306a36Sopenharmony_ci		.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */
260162306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,
260262306a36Sopenharmony_ci	}, {
260362306a36Sopenharmony_ci		.subvendor = 0x14f1,
260462306a36Sopenharmony_ci		.subdevice = 0x0084,
260562306a36Sopenharmony_ci		.card      = CX88_BOARD_GENIATECH_DVBS,
260662306a36Sopenharmony_ci	}, {
260762306a36Sopenharmony_ci		.subvendor = 0x0070,
260862306a36Sopenharmony_ci		.subdevice = 0x1404,
260962306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
261062306a36Sopenharmony_ci	}, {
261162306a36Sopenharmony_ci		.subvendor = 0x18ac,
261262306a36Sopenharmony_ci		.subdevice = 0xdc00,
261362306a36Sopenharmony_ci		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
261462306a36Sopenharmony_ci	}, {
261562306a36Sopenharmony_ci		.subvendor = 0x18ac,
261662306a36Sopenharmony_ci		.subdevice = 0xdccd,
261762306a36Sopenharmony_ci		.card      = CX88_BOARD_SAMSUNG_SMT_7020,
261862306a36Sopenharmony_ci	}, {
261962306a36Sopenharmony_ci		.subvendor = 0x1461,
262062306a36Sopenharmony_ci		.subdevice = 0xc111, /* AverMedia M150-D */
262162306a36Sopenharmony_ci		/* This board is known to work with the ASUS PVR416 config */
262262306a36Sopenharmony_ci		.card      = CX88_BOARD_ASUS_PVR_416,
262362306a36Sopenharmony_ci	}, {
262462306a36Sopenharmony_ci		.subvendor = 0xc180,
262562306a36Sopenharmony_ci		.subdevice = 0xc980,
262662306a36Sopenharmony_ci		.card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,
262762306a36Sopenharmony_ci	}, {
262862306a36Sopenharmony_ci		.subvendor = 0x0070,
262962306a36Sopenharmony_ci		.subdevice = 0x9600,
263062306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
263162306a36Sopenharmony_ci	}, {
263262306a36Sopenharmony_ci		.subvendor = 0x0070,
263362306a36Sopenharmony_ci		.subdevice = 0x9601,
263462306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
263562306a36Sopenharmony_ci	}, {
263662306a36Sopenharmony_ci		.subvendor = 0x0070,
263762306a36Sopenharmony_ci		.subdevice = 0x9602,
263862306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,
263962306a36Sopenharmony_ci	}, {
264062306a36Sopenharmony_ci		.subvendor = 0x107d,
264162306a36Sopenharmony_ci		.subdevice = 0x6632,
264262306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
264362306a36Sopenharmony_ci	}, {
264462306a36Sopenharmony_ci		.subvendor = 0x12ab,
264562306a36Sopenharmony_ci		.subdevice = 0x2300, /* Club3D Zap TV2100 */
264662306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,
264762306a36Sopenharmony_ci	}, {
264862306a36Sopenharmony_ci		.subvendor = 0x0070,
264962306a36Sopenharmony_ci		.subdevice = 0x9000,
265062306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,
265162306a36Sopenharmony_ci	}, {
265262306a36Sopenharmony_ci		.subvendor = 0x0070,
265362306a36Sopenharmony_ci		.subdevice = 0x1400,
265462306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
265562306a36Sopenharmony_ci	}, {
265662306a36Sopenharmony_ci		.subvendor = 0x0070,
265762306a36Sopenharmony_ci		.subdevice = 0x1401,
265862306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
265962306a36Sopenharmony_ci	}, {
266062306a36Sopenharmony_ci		.subvendor = 0x0070,
266162306a36Sopenharmony_ci		.subdevice = 0x1402,
266262306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,
266362306a36Sopenharmony_ci	}, {
266462306a36Sopenharmony_ci		.subvendor = 0x1421,
266562306a36Sopenharmony_ci		.subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */
266662306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_DVBS_100,
266762306a36Sopenharmony_ci	}, {
266862306a36Sopenharmony_ci		.subvendor = 0x1421,
266962306a36Sopenharmony_ci		.subdevice = 0x0390,
267062306a36Sopenharmony_ci		.card      = CX88_BOARD_ADSTECH_PTV_390,
267162306a36Sopenharmony_ci	}, {
267262306a36Sopenharmony_ci		.subvendor = 0x11bd,
267362306a36Sopenharmony_ci		.subdevice = 0x0051,
267462306a36Sopenharmony_ci		.card      = CX88_BOARD_PINNACLE_PCTV_HD_800i,
267562306a36Sopenharmony_ci	}, {
267662306a36Sopenharmony_ci		.subvendor = 0x18ac,
267762306a36Sopenharmony_ci		.subdevice = 0xd530,
267862306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,
267962306a36Sopenharmony_ci	}, {
268062306a36Sopenharmony_ci		.subvendor = 0x12ab,
268162306a36Sopenharmony_ci		.subdevice = 0x1788,
268262306a36Sopenharmony_ci		.card      = CX88_BOARD_PINNACLE_HYBRID_PCTV,
268362306a36Sopenharmony_ci	}, {
268462306a36Sopenharmony_ci		.subvendor = 0x14f1,
268562306a36Sopenharmony_ci		.subdevice = 0xea3d,
268662306a36Sopenharmony_ci		.card      = CX88_BOARD_POWERCOLOR_REAL_ANGEL,
268762306a36Sopenharmony_ci	}, {
268862306a36Sopenharmony_ci		.subvendor = 0x107d,
268962306a36Sopenharmony_ci		.subdevice = 0x6f18,
269062306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
269162306a36Sopenharmony_ci	}, {
269262306a36Sopenharmony_ci		/* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */
269362306a36Sopenharmony_ci		.subvendor = 0x14f1,
269462306a36Sopenharmony_ci		.subdevice = 0x8852,
269562306a36Sopenharmony_ci		.card      = CX88_BOARD_GENIATECH_X8000_MT,
269662306a36Sopenharmony_ci	}, {
269762306a36Sopenharmony_ci		.subvendor = 0x18ac,
269862306a36Sopenharmony_ci		.subdevice = 0xd610,
269962306a36Sopenharmony_ci		.card      = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,
270062306a36Sopenharmony_ci	}, {
270162306a36Sopenharmony_ci		.subvendor = 0x1554,
270262306a36Sopenharmony_ci		.subdevice = 0x4935,
270362306a36Sopenharmony_ci		.card      = CX88_BOARD_PROLINK_PV_8000GT,
270462306a36Sopenharmony_ci	}, {
270562306a36Sopenharmony_ci		.subvendor = 0x1554,
270662306a36Sopenharmony_ci		.subdevice = 0x4976,
270762306a36Sopenharmony_ci		.card      = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,
270862306a36Sopenharmony_ci	}, {
270962306a36Sopenharmony_ci		.subvendor = 0x17de,
271062306a36Sopenharmony_ci		.subdevice = 0x08c1,
271162306a36Sopenharmony_ci		.card      = CX88_BOARD_KWORLD_ATSC_120,
271262306a36Sopenharmony_ci	}, {
271362306a36Sopenharmony_ci		.subvendor = 0x0070,
271462306a36Sopenharmony_ci		.subdevice = 0x6900,
271562306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
271662306a36Sopenharmony_ci	}, {
271762306a36Sopenharmony_ci		.subvendor = 0x0070,
271862306a36Sopenharmony_ci		.subdevice = 0x6904,
271962306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
272062306a36Sopenharmony_ci	}, {
272162306a36Sopenharmony_ci		.subvendor = 0x0070,
272262306a36Sopenharmony_ci		.subdevice = 0x6902,
272362306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,
272462306a36Sopenharmony_ci	}, {
272562306a36Sopenharmony_ci		.subvendor = 0x0070,
272662306a36Sopenharmony_ci		.subdevice = 0x6905,
272762306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
272862306a36Sopenharmony_ci	}, {
272962306a36Sopenharmony_ci		.subvendor = 0x0070,
273062306a36Sopenharmony_ci		.subdevice = 0x6906,
273162306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,
273262306a36Sopenharmony_ci	}, {
273362306a36Sopenharmony_ci		.subvendor = 0xd420,
273462306a36Sopenharmony_ci		.subdevice = 0x9022,
273562306a36Sopenharmony_ci		.card      = CX88_BOARD_TEVII_S420,
273662306a36Sopenharmony_ci	}, {
273762306a36Sopenharmony_ci		.subvendor = 0xd460,
273862306a36Sopenharmony_ci		.subdevice = 0x9022,
273962306a36Sopenharmony_ci		.card      = CX88_BOARD_TEVII_S460,
274062306a36Sopenharmony_ci	}, {
274162306a36Sopenharmony_ci		.subvendor = 0xd464,
274262306a36Sopenharmony_ci		.subdevice = 0x9022,
274362306a36Sopenharmony_ci		.card      = CX88_BOARD_TEVII_S464,
274462306a36Sopenharmony_ci	}, {
274562306a36Sopenharmony_ci		.subvendor = 0xA044,
274662306a36Sopenharmony_ci		.subdevice = 0x2011,
274762306a36Sopenharmony_ci		.card      = CX88_BOARD_OMICOM_SS4_PCI,
274862306a36Sopenharmony_ci	}, {
274962306a36Sopenharmony_ci		.subvendor = 0x8910,
275062306a36Sopenharmony_ci		.subdevice = 0x8888,
275162306a36Sopenharmony_ci		.card      = CX88_BOARD_TBS_8910,
275262306a36Sopenharmony_ci	}, {
275362306a36Sopenharmony_ci		.subvendor = 0x8920,
275462306a36Sopenharmony_ci		.subdevice = 0x8888,
275562306a36Sopenharmony_ci		.card      = CX88_BOARD_TBS_8920,
275662306a36Sopenharmony_ci	}, {
275762306a36Sopenharmony_ci		.subvendor = 0xb022,
275862306a36Sopenharmony_ci		.subdevice = 0x3022,
275962306a36Sopenharmony_ci		.card      = CX88_BOARD_PROF_6200,
276062306a36Sopenharmony_ci	}, {
276162306a36Sopenharmony_ci		.subvendor = 0xB033,
276262306a36Sopenharmony_ci		.subdevice = 0x3033,
276362306a36Sopenharmony_ci		.card      = CX88_BOARD_PROF_7300,
276462306a36Sopenharmony_ci	}, {
276562306a36Sopenharmony_ci		.subvendor = 0xb200,
276662306a36Sopenharmony_ci		.subdevice = 0x4200,
276762306a36Sopenharmony_ci		.card      = CX88_BOARD_SATTRADE_ST4200,
276862306a36Sopenharmony_ci	}, {
276962306a36Sopenharmony_ci		.subvendor = 0x153b,
277062306a36Sopenharmony_ci		.subdevice = 0x1177,
277162306a36Sopenharmony_ci		.card      = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,
277262306a36Sopenharmony_ci	}, {
277362306a36Sopenharmony_ci		.subvendor = 0x0070,
277462306a36Sopenharmony_ci		.subdevice = 0x9290,
277562306a36Sopenharmony_ci		.card      = CX88_BOARD_HAUPPAUGE_IRONLY,
277662306a36Sopenharmony_ci	}, {
277762306a36Sopenharmony_ci		.subvendor = 0x107d,
277862306a36Sopenharmony_ci		.subdevice = 0x6654,
277962306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV1800H,
278062306a36Sopenharmony_ci	}, {
278162306a36Sopenharmony_ci		/* WinFast DTV1800 H with XC4000 tuner */
278262306a36Sopenharmony_ci		.subvendor = 0x107d,
278362306a36Sopenharmony_ci		.subdevice = 0x6f38,
278462306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV1800H_XC4000,
278562306a36Sopenharmony_ci	}, {
278662306a36Sopenharmony_ci		.subvendor = 0x107d,
278762306a36Sopenharmony_ci		.subdevice = 0x6f42,
278862306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DTV2000H_PLUS,
278962306a36Sopenharmony_ci	}, {
279062306a36Sopenharmony_ci		/* PVR2000 PAL Model [107d:6630] */
279162306a36Sopenharmony_ci		.subvendor = 0x107d,
279262306a36Sopenharmony_ci		.subdevice = 0x6630,
279362306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
279462306a36Sopenharmony_ci	}, {
279562306a36Sopenharmony_ci		/* PVR2000 PAL Model [107d:6638] */
279662306a36Sopenharmony_ci		.subvendor = 0x107d,
279762306a36Sopenharmony_ci		.subdevice = 0x6638,
279862306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
279962306a36Sopenharmony_ci	}, {
280062306a36Sopenharmony_ci		/* PVR2000 NTSC Model [107d:6631] */
280162306a36Sopenharmony_ci		.subvendor = 0x107d,
280262306a36Sopenharmony_ci		.subdevice = 0x6631,
280362306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
280462306a36Sopenharmony_ci	}, {
280562306a36Sopenharmony_ci		/* PVR2000 NTSC Model [107d:6637] */
280662306a36Sopenharmony_ci		.subvendor = 0x107d,
280762306a36Sopenharmony_ci		.subdevice = 0x6637,
280862306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
280962306a36Sopenharmony_ci	}, {
281062306a36Sopenharmony_ci		/* PVR2000 NTSC Model [107d:663d] */
281162306a36Sopenharmony_ci		.subvendor = 0x107d,
281262306a36Sopenharmony_ci		.subdevice = 0x663d,
281362306a36Sopenharmony_ci		.card      = CX88_BOARD_LEADTEK_PVR2000,
281462306a36Sopenharmony_ci	}, {
281562306a36Sopenharmony_ci		/* DV2000 NTSC Model [107d:6621] */
281662306a36Sopenharmony_ci		.subvendor = 0x107d,
281762306a36Sopenharmony_ci		.subdevice = 0x6621,
281862306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_DV2000,
281962306a36Sopenharmony_ci	}, {
282062306a36Sopenharmony_ci		/* TV2000 XP Global [107d:6618]  */
282162306a36Sopenharmony_ci		.subvendor = 0x107d,
282262306a36Sopenharmony_ci		.subdevice = 0x6618,
282362306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
282462306a36Sopenharmony_ci	}, {
282562306a36Sopenharmony_ci		/* TV2000 XP Global [107d:6618] */
282662306a36Sopenharmony_ci		.subvendor = 0x107d,
282762306a36Sopenharmony_ci		.subdevice = 0x6619,
282862306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,
282962306a36Sopenharmony_ci	}, {
283062306a36Sopenharmony_ci		/* WinFast TV2000 XP Global with XC4000 tuner */
283162306a36Sopenharmony_ci		.subvendor = 0x107d,
283262306a36Sopenharmony_ci		.subdevice = 0x6f36,
283362306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36,
283462306a36Sopenharmony_ci	}, {
283562306a36Sopenharmony_ci		/* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */
283662306a36Sopenharmony_ci		.subvendor = 0x107d,
283762306a36Sopenharmony_ci		.subdevice = 0x6f43,
283862306a36Sopenharmony_ci		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43,
283962306a36Sopenharmony_ci	}, {
284062306a36Sopenharmony_ci		.subvendor = 0xb034,
284162306a36Sopenharmony_ci		.subdevice = 0x3034,
284262306a36Sopenharmony_ci		.card      = CX88_BOARD_PROF_7301,
284362306a36Sopenharmony_ci	}, {
284462306a36Sopenharmony_ci		.subvendor = 0x1822,
284562306a36Sopenharmony_ci		.subdevice = 0x0023,
284662306a36Sopenharmony_ci		.card      = CX88_BOARD_TWINHAN_VP1027_DVBS,
284762306a36Sopenharmony_ci	},
284862306a36Sopenharmony_ci};
284962306a36Sopenharmony_ci
285062306a36Sopenharmony_ci/*
285162306a36Sopenharmony_ci * some leadtek specific stuff
285262306a36Sopenharmony_ci */
285362306a36Sopenharmony_cistatic void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)
285462306a36Sopenharmony_ci{
285562306a36Sopenharmony_ci	if (eeprom_data[4] != 0x7d ||
285662306a36Sopenharmony_ci	    eeprom_data[5] != 0x10 ||
285762306a36Sopenharmony_ci	    eeprom_data[7] != 0x66) {
285862306a36Sopenharmony_ci		pr_warn("Leadtek eeprom invalid.\n");
285962306a36Sopenharmony_ci		return;
286062306a36Sopenharmony_ci	}
286162306a36Sopenharmony_ci
286262306a36Sopenharmony_ci	/* Terry Wu <terrywu2009@gmail.com> */
286362306a36Sopenharmony_ci	switch (eeprom_data[6]) {
286462306a36Sopenharmony_ci	case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */
286562306a36Sopenharmony_ci	case 0x21: /* SSID 6621 for DV2000 NTSC Model */
286662306a36Sopenharmony_ci	case 0x31: /* SSID 6631 for PVR2000 NTSC Model */
286762306a36Sopenharmony_ci	case 0x37: /* SSID 6637 for PVR2000 NTSC Model */
286862306a36Sopenharmony_ci	case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */
286962306a36Sopenharmony_ci		core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;
287062306a36Sopenharmony_ci		break;
287162306a36Sopenharmony_ci	default:
287262306a36Sopenharmony_ci		core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
287362306a36Sopenharmony_ci		break;
287462306a36Sopenharmony_ci	}
287562306a36Sopenharmony_ci
287662306a36Sopenharmony_ci	pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n",
287762306a36Sopenharmony_ci		core->board.tuner_type, eeprom_data[0]);
287862306a36Sopenharmony_ci}
287962306a36Sopenharmony_ci
288062306a36Sopenharmony_cistatic void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)
288162306a36Sopenharmony_ci{
288262306a36Sopenharmony_ci	struct tveeprom tv;
288362306a36Sopenharmony_ci
288462306a36Sopenharmony_ci	tveeprom_hauppauge_analog(&tv, eeprom_data);
288562306a36Sopenharmony_ci	core->board.tuner_type = tv.tuner_type;
288662306a36Sopenharmony_ci	core->tuner_formats = tv.tuner_formats;
288762306a36Sopenharmony_ci	core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;
288862306a36Sopenharmony_ci	core->model = tv.model;
288962306a36Sopenharmony_ci
289062306a36Sopenharmony_ci	/* Make sure we support the board model */
289162306a36Sopenharmony_ci	switch (tv.model) {
289262306a36Sopenharmony_ci	case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */
289362306a36Sopenharmony_ci	case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */
289462306a36Sopenharmony_ci	case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */
289562306a36Sopenharmony_ci	case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */
289662306a36Sopenharmony_ci	case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */
289762306a36Sopenharmony_ci	case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */
289862306a36Sopenharmony_ci	case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */
289962306a36Sopenharmony_ci	case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */
290062306a36Sopenharmony_ci	case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */
290162306a36Sopenharmony_ci	case 28552: /* WinTV-PVR 'Roslyn' (No IR) */
290262306a36Sopenharmony_ci	case 34519: /* WinTV-PCI-FM */
290362306a36Sopenharmony_ci	case 69009:
290462306a36Sopenharmony_ci		/* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */
290562306a36Sopenharmony_ci	case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */
290662306a36Sopenharmony_ci	case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */
290762306a36Sopenharmony_ci	case 69559:
290862306a36Sopenharmony_ci		/* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */
290962306a36Sopenharmony_ci	case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */
291062306a36Sopenharmony_ci	case 90002: /* Nova-T-PCI (9002) */
291162306a36Sopenharmony_ci	case 92001: /* Nova-S-Plus (Video and IR) */
291262306a36Sopenharmony_ci	case 92002: /* Nova-S-Plus (Video and IR) */
291362306a36Sopenharmony_ci	case 90003: /* Nova-T-PCI (9002 No RF out) */
291462306a36Sopenharmony_ci	case 90500: /* Nova-T-PCI (oem) */
291562306a36Sopenharmony_ci	case 90501: /* Nova-T-PCI (oem/IR) */
291662306a36Sopenharmony_ci	case 92000: /* Nova-SE2 (OEM, No Video or IR) */
291762306a36Sopenharmony_ci	case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */
291862306a36Sopenharmony_ci	case 94009: /* WinTV-HVR1100 (Video and IR Retail) */
291962306a36Sopenharmony_ci	case 94501: /* WinTV-HVR1100 (Video and IR OEM) */
292062306a36Sopenharmony_ci	case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */
292162306a36Sopenharmony_ci	case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */
292262306a36Sopenharmony_ci	case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */
292362306a36Sopenharmony_ci	case 96569: /* WinTV-HVR1300 () */
292462306a36Sopenharmony_ci	case 96659: /* WinTV-HVR1300 () */
292562306a36Sopenharmony_ci	case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */
292662306a36Sopenharmony_ci		/* known */
292762306a36Sopenharmony_ci		break;
292862306a36Sopenharmony_ci	case CX88_BOARD_SAMSUNG_SMT_7020:
292962306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x008989FF);
293062306a36Sopenharmony_ci		break;
293162306a36Sopenharmony_ci	default:
293262306a36Sopenharmony_ci		pr_warn("warning: unknown hauppauge model #%d\n", tv.model);
293362306a36Sopenharmony_ci		break;
293462306a36Sopenharmony_ci	}
293562306a36Sopenharmony_ci
293662306a36Sopenharmony_ci	pr_info("hauppauge eeprom: model=%d\n", tv.model);
293762306a36Sopenharmony_ci}
293862306a36Sopenharmony_ci
293962306a36Sopenharmony_ci/*
294062306a36Sopenharmony_ci * some GDI (was: Modular Technology) specific stuff
294162306a36Sopenharmony_ci */
294262306a36Sopenharmony_ci
294362306a36Sopenharmony_cistatic const struct {
294462306a36Sopenharmony_ci	int  id;
294562306a36Sopenharmony_ci	int  fm;
294662306a36Sopenharmony_ci	const char *name;
294762306a36Sopenharmony_ci} gdi_tuner[] = {
294862306a36Sopenharmony_ci	[0x01] = { .id   = UNSET,
294962306a36Sopenharmony_ci		   .name = "NTSC_M" },
295062306a36Sopenharmony_ci	[0x02] = { .id   = UNSET,
295162306a36Sopenharmony_ci		   .name = "PAL_B" },
295262306a36Sopenharmony_ci	[0x03] = { .id   = UNSET,
295362306a36Sopenharmony_ci		   .name = "PAL_I" },
295462306a36Sopenharmony_ci	[0x04] = { .id   = UNSET,
295562306a36Sopenharmony_ci		   .name = "PAL_D" },
295662306a36Sopenharmony_ci	[0x05] = { .id   = UNSET,
295762306a36Sopenharmony_ci		   .name = "SECAM" },
295862306a36Sopenharmony_ci
295962306a36Sopenharmony_ci	[0x10] = { .id   = UNSET,
296062306a36Sopenharmony_ci		   .fm   = 1,
296162306a36Sopenharmony_ci		   .name = "TEMIC_4049" },
296262306a36Sopenharmony_ci	[0x11] = { .id   = TUNER_TEMIC_4136FY5,
296362306a36Sopenharmony_ci		   .name = "TEMIC_4136" },
296462306a36Sopenharmony_ci	[0x12] = { .id   = UNSET,
296562306a36Sopenharmony_ci		   .name = "TEMIC_4146" },
296662306a36Sopenharmony_ci
296762306a36Sopenharmony_ci	[0x20] = { .id   = TUNER_PHILIPS_FQ1216ME,
296862306a36Sopenharmony_ci		   .fm   = 1,
296962306a36Sopenharmony_ci		   .name = "PHILIPS_FQ1216_MK3" },
297062306a36Sopenharmony_ci	[0x21] = { .id   = UNSET, .fm = 1,
297162306a36Sopenharmony_ci		   .name = "PHILIPS_FQ1236_MK3" },
297262306a36Sopenharmony_ci	[0x22] = { .id   = UNSET,
297362306a36Sopenharmony_ci		   .name = "PHILIPS_FI1236_MK3" },
297462306a36Sopenharmony_ci	[0x23] = { .id   = UNSET,
297562306a36Sopenharmony_ci		   .name = "PHILIPS_FI1216_MK3" },
297662306a36Sopenharmony_ci};
297762306a36Sopenharmony_ci
297862306a36Sopenharmony_cistatic void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)
297962306a36Sopenharmony_ci{
298062306a36Sopenharmony_ci	const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))
298162306a36Sopenharmony_ci		? gdi_tuner[eeprom_data[0x0d]].name : NULL;
298262306a36Sopenharmony_ci
298362306a36Sopenharmony_ci	pr_info("GDI: tuner=%s\n", name ? name : "unknown");
298462306a36Sopenharmony_ci	if (!name)
298562306a36Sopenharmony_ci		return;
298662306a36Sopenharmony_ci	core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;
298762306a36Sopenharmony_ci	core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?
298862306a36Sopenharmony_ci		CX88_RADIO : 0;
298962306a36Sopenharmony_ci}
299062306a36Sopenharmony_ci
299162306a36Sopenharmony_ci/*
299262306a36Sopenharmony_ci * some Divco specific stuff
299362306a36Sopenharmony_ci */
299462306a36Sopenharmony_cistatic int cx88_dvico_xc2028_callback(struct cx88_core *core,
299562306a36Sopenharmony_ci				      int command, int arg)
299662306a36Sopenharmony_ci{
299762306a36Sopenharmony_ci	switch (command) {
299862306a36Sopenharmony_ci	case XC2028_TUNER_RESET:
299962306a36Sopenharmony_ci		switch (core->boardnr) {
300062306a36Sopenharmony_ci		case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
300162306a36Sopenharmony_ci			/* GPIO-4 xc3028 tuner */
300262306a36Sopenharmony_ci
300362306a36Sopenharmony_ci			cx_set(MO_GP0_IO, 0x00001000);
300462306a36Sopenharmony_ci			cx_clear(MO_GP0_IO, 0x00000010);
300562306a36Sopenharmony_ci			msleep(100);
300662306a36Sopenharmony_ci			cx_set(MO_GP0_IO, 0x00000010);
300762306a36Sopenharmony_ci			msleep(100);
300862306a36Sopenharmony_ci			break;
300962306a36Sopenharmony_ci		default:
301062306a36Sopenharmony_ci			cx_write(MO_GP0_IO, 0x101000);
301162306a36Sopenharmony_ci			mdelay(5);
301262306a36Sopenharmony_ci			cx_set(MO_GP0_IO, 0x101010);
301362306a36Sopenharmony_ci		}
301462306a36Sopenharmony_ci		break;
301562306a36Sopenharmony_ci	default:
301662306a36Sopenharmony_ci		return -EINVAL;
301762306a36Sopenharmony_ci	}
301862306a36Sopenharmony_ci
301962306a36Sopenharmony_ci	return 0;
302062306a36Sopenharmony_ci}
302162306a36Sopenharmony_ci
302262306a36Sopenharmony_ci/*
302362306a36Sopenharmony_ci * some Geniatech specific stuff
302462306a36Sopenharmony_ci */
302562306a36Sopenharmony_ci
302662306a36Sopenharmony_cistatic int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,
302762306a36Sopenharmony_ci						int command, int mode)
302862306a36Sopenharmony_ci{
302962306a36Sopenharmony_ci	switch (command) {
303062306a36Sopenharmony_ci	case XC2028_TUNER_RESET:
303162306a36Sopenharmony_ci		switch (INPUT(core->input).type) {
303262306a36Sopenharmony_ci		case CX88_RADIO:
303362306a36Sopenharmony_ci			break;
303462306a36Sopenharmony_ci		case CX88_VMUX_DVB:
303562306a36Sopenharmony_ci			cx_write(MO_GP1_IO, 0x030302);
303662306a36Sopenharmony_ci			mdelay(50);
303762306a36Sopenharmony_ci			break;
303862306a36Sopenharmony_ci		default:
303962306a36Sopenharmony_ci			cx_write(MO_GP1_IO, 0x030301);
304062306a36Sopenharmony_ci			mdelay(50);
304162306a36Sopenharmony_ci		}
304262306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
304362306a36Sopenharmony_ci		mdelay(50);
304462306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101000);
304562306a36Sopenharmony_ci		mdelay(50);
304662306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
304762306a36Sopenharmony_ci		mdelay(50);
304862306a36Sopenharmony_ci		return 0;
304962306a36Sopenharmony_ci	}
305062306a36Sopenharmony_ci	return -EINVAL;
305162306a36Sopenharmony_ci}
305262306a36Sopenharmony_ci
305362306a36Sopenharmony_cistatic int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,
305462306a36Sopenharmony_ci					     int command, int arg)
305562306a36Sopenharmony_ci{
305662306a36Sopenharmony_ci	switch (command) {
305762306a36Sopenharmony_ci	case XC2028_TUNER_RESET:
305862306a36Sopenharmony_ci		/* GPIO 12 (xc3028 tuner reset) */
305962306a36Sopenharmony_ci		cx_set(MO_GP1_IO, 0x1010);
306062306a36Sopenharmony_ci		mdelay(50);
306162306a36Sopenharmony_ci		cx_clear(MO_GP1_IO, 0x10);
306262306a36Sopenharmony_ci		mdelay(75);
306362306a36Sopenharmony_ci		cx_set(MO_GP1_IO, 0x10);
306462306a36Sopenharmony_ci		mdelay(75);
306562306a36Sopenharmony_ci		return 0;
306662306a36Sopenharmony_ci	}
306762306a36Sopenharmony_ci	return -EINVAL;
306862306a36Sopenharmony_ci}
306962306a36Sopenharmony_ci
307062306a36Sopenharmony_cistatic int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core,
307162306a36Sopenharmony_ci						  int command, int arg)
307262306a36Sopenharmony_ci{
307362306a36Sopenharmony_ci	switch (command) {
307462306a36Sopenharmony_ci	case XC4000_TUNER_RESET:
307562306a36Sopenharmony_ci		/* GPIO 12 (xc4000 tuner reset) */
307662306a36Sopenharmony_ci		cx_set(MO_GP1_IO, 0x1010);
307762306a36Sopenharmony_ci		mdelay(50);
307862306a36Sopenharmony_ci		cx_clear(MO_GP1_IO, 0x10);
307962306a36Sopenharmony_ci		mdelay(75);
308062306a36Sopenharmony_ci		cx_set(MO_GP1_IO, 0x10);
308162306a36Sopenharmony_ci		mdelay(75);
308262306a36Sopenharmony_ci		return 0;
308362306a36Sopenharmony_ci	}
308462306a36Sopenharmony_ci	return -EINVAL;
308562306a36Sopenharmony_ci}
308662306a36Sopenharmony_ci
308762306a36Sopenharmony_ci/*
308862306a36Sopenharmony_ci * some Divco specific stuff
308962306a36Sopenharmony_ci */
309062306a36Sopenharmony_cistatic int cx88_pv_8000gt_callback(struct cx88_core *core,
309162306a36Sopenharmony_ci				   int command, int arg)
309262306a36Sopenharmony_ci{
309362306a36Sopenharmony_ci	switch (command) {
309462306a36Sopenharmony_ci	case XC2028_TUNER_RESET:
309562306a36Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
309662306a36Sopenharmony_ci		mdelay(50);
309762306a36Sopenharmony_ci		cx_write(MO_GP2_IO, 0xef5);
309862306a36Sopenharmony_ci		mdelay(50);
309962306a36Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
310062306a36Sopenharmony_ci		break;
310162306a36Sopenharmony_ci	default:
310262306a36Sopenharmony_ci		return -EINVAL;
310362306a36Sopenharmony_ci	}
310462306a36Sopenharmony_ci
310562306a36Sopenharmony_ci	return 0;
310662306a36Sopenharmony_ci}
310762306a36Sopenharmony_ci
310862306a36Sopenharmony_ci/*
310962306a36Sopenharmony_ci * some DViCO specific stuff
311062306a36Sopenharmony_ci */
311162306a36Sopenharmony_ci
311262306a36Sopenharmony_cistatic void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)
311362306a36Sopenharmony_ci{
311462306a36Sopenharmony_ci	struct i2c_msg msg = { .addr = 0x45, .flags = 0 };
311562306a36Sopenharmony_ci	int i, err;
311662306a36Sopenharmony_ci	static u8 init_bufs[13][5] = {
311762306a36Sopenharmony_ci		{ 0x10, 0x00, 0x20, 0x01, 0x03 },
311862306a36Sopenharmony_ci		{ 0x10, 0x10, 0x01, 0x00, 0x21 },
311962306a36Sopenharmony_ci		{ 0x10, 0x10, 0x10, 0x00, 0xCA },
312062306a36Sopenharmony_ci		{ 0x10, 0x10, 0x12, 0x00, 0x08 },
312162306a36Sopenharmony_ci		{ 0x10, 0x10, 0x13, 0x00, 0x0A },
312262306a36Sopenharmony_ci		{ 0x10, 0x10, 0x16, 0x01, 0xC0 },
312362306a36Sopenharmony_ci		{ 0x10, 0x10, 0x22, 0x01, 0x3D },
312462306a36Sopenharmony_ci		{ 0x10, 0x10, 0x73, 0x01, 0x2E },
312562306a36Sopenharmony_ci		{ 0x10, 0x10, 0x72, 0x00, 0xC5 },
312662306a36Sopenharmony_ci		{ 0x10, 0x10, 0x71, 0x01, 0x97 },
312762306a36Sopenharmony_ci		{ 0x10, 0x10, 0x70, 0x00, 0x0F },
312862306a36Sopenharmony_ci		{ 0x10, 0x10, 0xB0, 0x00, 0x01 },
312962306a36Sopenharmony_ci		{ 0x03, 0x0C },
313062306a36Sopenharmony_ci	};
313162306a36Sopenharmony_ci
313262306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {
313362306a36Sopenharmony_ci		msg.buf = init_bufs[i];
313462306a36Sopenharmony_ci		msg.len = (i != 12 ? 5 : 2);
313562306a36Sopenharmony_ci		err = i2c_transfer(&core->i2c_adap, &msg, 1);
313662306a36Sopenharmony_ci		if (err != 1) {
313762306a36Sopenharmony_ci			pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n",
313862306a36Sopenharmony_ci				i, err);
313962306a36Sopenharmony_ci			return;
314062306a36Sopenharmony_ci		}
314162306a36Sopenharmony_ci	}
314262306a36Sopenharmony_ci}
314362306a36Sopenharmony_ci
314462306a36Sopenharmony_cistatic int cx88_xc2028_tuner_callback(struct cx88_core *core,
314562306a36Sopenharmony_ci				      int command, int arg)
314662306a36Sopenharmony_ci{
314762306a36Sopenharmony_ci	/* Board-specific callbacks */
314862306a36Sopenharmony_ci	switch (core->boardnr) {
314962306a36Sopenharmony_ci	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
315062306a36Sopenharmony_ci	case CX88_BOARD_GENIATECH_X8000_MT:
315162306a36Sopenharmony_ci	case CX88_BOARD_KWORLD_ATSC_120:
315262306a36Sopenharmony_ci		return cx88_xc3028_geniatech_tuner_callback(core,
315362306a36Sopenharmony_ci							command, arg);
315462306a36Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_8000GT:
315562306a36Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
315662306a36Sopenharmony_ci		return cx88_pv_8000gt_callback(core, command, arg);
315762306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
315862306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
315962306a36Sopenharmony_ci		return cx88_dvico_xc2028_callback(core, command, arg);
316062306a36Sopenharmony_ci	case CX88_BOARD_NOTONLYTV_LV3H:
316162306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
316262306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H:
316362306a36Sopenharmony_ci		return cx88_xc3028_winfast1800h_callback(core, command, arg);
316462306a36Sopenharmony_ci	}
316562306a36Sopenharmony_ci
316662306a36Sopenharmony_ci	switch (command) {
316762306a36Sopenharmony_ci	case XC2028_TUNER_RESET:
316862306a36Sopenharmony_ci		switch (INPUT(core->input).type) {
316962306a36Sopenharmony_ci		case CX88_RADIO:
317062306a36Sopenharmony_ci			dprintk(1, "setting GPIO to radio!\n");
317162306a36Sopenharmony_ci			cx_write(MO_GP0_IO, 0x4ff);
317262306a36Sopenharmony_ci			mdelay(250);
317362306a36Sopenharmony_ci			cx_write(MO_GP2_IO, 0xff);
317462306a36Sopenharmony_ci			mdelay(250);
317562306a36Sopenharmony_ci			break;
317662306a36Sopenharmony_ci		case CX88_VMUX_DVB:	/* Digital TV*/
317762306a36Sopenharmony_ci		default:		/* Analog TV */
317862306a36Sopenharmony_ci			dprintk(1, "setting GPIO to TV!\n");
317962306a36Sopenharmony_ci			break;
318062306a36Sopenharmony_ci		}
318162306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
318262306a36Sopenharmony_ci		mdelay(250);
318362306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101000);
318462306a36Sopenharmony_ci		mdelay(250);
318562306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x101010);
318662306a36Sopenharmony_ci		mdelay(250);
318762306a36Sopenharmony_ci		return 0;
318862306a36Sopenharmony_ci	}
318962306a36Sopenharmony_ci	return -EINVAL;
319062306a36Sopenharmony_ci}
319162306a36Sopenharmony_ci
319262306a36Sopenharmony_cistatic int cx88_xc4000_tuner_callback(struct cx88_core *core,
319362306a36Sopenharmony_ci				      int command, int arg)
319462306a36Sopenharmony_ci{
319562306a36Sopenharmony_ci	/* Board-specific callbacks */
319662306a36Sopenharmony_ci	switch (core->boardnr) {
319762306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
319862306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
319962306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
320062306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
320162306a36Sopenharmony_ci		return cx88_xc4000_winfast2000h_plus_callback(core,
320262306a36Sopenharmony_ci							      command, arg);
320362306a36Sopenharmony_ci	}
320462306a36Sopenharmony_ci	return -EINVAL;
320562306a36Sopenharmony_ci}
320662306a36Sopenharmony_ci
320762306a36Sopenharmony_ci/*
320862306a36Sopenharmony_ci * Tuner callback function. Currently only needed for the Pinnacle
320962306a36Sopenharmony_ci * PCTV HD 800i with an xc5000 silicon tuner. This is used for both
321062306a36Sopenharmony_ci * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c)
321162306a36Sopenharmony_ci */
321262306a36Sopenharmony_cistatic int cx88_xc5000_tuner_callback(struct cx88_core *core,
321362306a36Sopenharmony_ci				      int command, int arg)
321462306a36Sopenharmony_ci{
321562306a36Sopenharmony_ci	switch (core->boardnr) {
321662306a36Sopenharmony_ci	case CX88_BOARD_PINNACLE_PCTV_HD_800i:
321762306a36Sopenharmony_ci		if (command == 0) { /* This is the reset command from xc5000 */
321862306a36Sopenharmony_ci
321962306a36Sopenharmony_ci			/*
322062306a36Sopenharmony_ci			 * djh - According to the engineer at PCTV Systems,
322162306a36Sopenharmony_ci			 * the xc5000 reset pin is supposed to be on GPIO12.
322262306a36Sopenharmony_ci			 * However, despite three nights of effort, pulling
322362306a36Sopenharmony_ci			 * that GPIO low didn't reset the xc5000.  While
322462306a36Sopenharmony_ci			 * pulling MO_SRST_IO low does reset the xc5000, this
322562306a36Sopenharmony_ci			 * also resets in the s5h1409 being reset as well.
322662306a36Sopenharmony_ci			 * This causes tuning to always fail since the internal
322762306a36Sopenharmony_ci			 * state of the s5h1409 does not match the driver's
322862306a36Sopenharmony_ci			 * state.  Given that the only two conditions in which
322962306a36Sopenharmony_ci			 * the driver performs a reset is during firmware load
323062306a36Sopenharmony_ci			 * and powering down the chip, I am taking out the
323162306a36Sopenharmony_ci			 * reset.  We know that the chip is being reset
323262306a36Sopenharmony_ci			 * when the cx88 comes online, and not being able to
323362306a36Sopenharmony_ci			 * do power management for this board is worse than
323462306a36Sopenharmony_ci			 * not having any tuning at all.
323562306a36Sopenharmony_ci			 */
323662306a36Sopenharmony_ci			return 0;
323762306a36Sopenharmony_ci		}
323862306a36Sopenharmony_ci
323962306a36Sopenharmony_ci		dprintk(1, "xc5000: unknown tuner callback command.\n");
324062306a36Sopenharmony_ci		return -EINVAL;
324162306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
324262306a36Sopenharmony_ci		if (command == 0) { /* This is the reset command from xc5000 */
324362306a36Sopenharmony_ci			cx_clear(MO_GP0_IO, 0x00000010);
324462306a36Sopenharmony_ci			usleep_range(10000, 20000);
324562306a36Sopenharmony_ci			cx_set(MO_GP0_IO, 0x00000010);
324662306a36Sopenharmony_ci			return 0;
324762306a36Sopenharmony_ci		}
324862306a36Sopenharmony_ci
324962306a36Sopenharmony_ci		dprintk(1, "xc5000: unknown tuner callback command.\n");
325062306a36Sopenharmony_ci		return -EINVAL;
325162306a36Sopenharmony_ci	}
325262306a36Sopenharmony_ci	return 0; /* Should never be here */
325362306a36Sopenharmony_ci}
325462306a36Sopenharmony_ci
325562306a36Sopenharmony_ciint cx88_tuner_callback(void *priv, int component, int command, int arg)
325662306a36Sopenharmony_ci{
325762306a36Sopenharmony_ci	struct i2c_algo_bit_data *i2c_algo = priv;
325862306a36Sopenharmony_ci	struct cx88_core *core;
325962306a36Sopenharmony_ci
326062306a36Sopenharmony_ci	if (!i2c_algo) {
326162306a36Sopenharmony_ci		pr_err("Error - i2c private data undefined.\n");
326262306a36Sopenharmony_ci		return -EINVAL;
326362306a36Sopenharmony_ci	}
326462306a36Sopenharmony_ci
326562306a36Sopenharmony_ci	core = i2c_algo->data;
326662306a36Sopenharmony_ci
326762306a36Sopenharmony_ci	if (!core) {
326862306a36Sopenharmony_ci		pr_err("Error - device struct undefined.\n");
326962306a36Sopenharmony_ci		return -EINVAL;
327062306a36Sopenharmony_ci	}
327162306a36Sopenharmony_ci
327262306a36Sopenharmony_ci	if (component != DVB_FRONTEND_COMPONENT_TUNER)
327362306a36Sopenharmony_ci		return -EINVAL;
327462306a36Sopenharmony_ci
327562306a36Sopenharmony_ci	switch (core->board.tuner_type) {
327662306a36Sopenharmony_ci	case TUNER_XC2028:
327762306a36Sopenharmony_ci		dprintk(1, "Calling XC2028/3028 callback\n");
327862306a36Sopenharmony_ci		return cx88_xc2028_tuner_callback(core, command, arg);
327962306a36Sopenharmony_ci	case TUNER_XC4000:
328062306a36Sopenharmony_ci		dprintk(1, "Calling XC4000 callback\n");
328162306a36Sopenharmony_ci		return cx88_xc4000_tuner_callback(core, command, arg);
328262306a36Sopenharmony_ci	case TUNER_XC5000:
328362306a36Sopenharmony_ci		dprintk(1, "Calling XC5000 callback\n");
328462306a36Sopenharmony_ci		return cx88_xc5000_tuner_callback(core, command, arg);
328562306a36Sopenharmony_ci	}
328662306a36Sopenharmony_ci	pr_err("Error: Calling callback for tuner %d\n",
328762306a36Sopenharmony_ci	       core->board.tuner_type);
328862306a36Sopenharmony_ci	return -EINVAL;
328962306a36Sopenharmony_ci}
329062306a36Sopenharmony_ciEXPORT_SYMBOL(cx88_tuner_callback);
329162306a36Sopenharmony_ci
329262306a36Sopenharmony_ci/* ----------------------------------------------------------------------- */
329362306a36Sopenharmony_ci
329462306a36Sopenharmony_cistatic void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)
329562306a36Sopenharmony_ci{
329662306a36Sopenharmony_ci	int i;
329762306a36Sopenharmony_ci
329862306a36Sopenharmony_ci	if (!pci->subsystem_vendor && !pci->subsystem_device) {
329962306a36Sopenharmony_ci		pr_err("Your board has no valid PCI Subsystem ID and thus can't\n");
330062306a36Sopenharmony_ci		pr_err("be autodetected.  Please pass card=<n> insmod option to\n");
330162306a36Sopenharmony_ci		pr_err("workaround that.  Redirect complaints to the vendor of\n");
330262306a36Sopenharmony_ci		pr_err("the TV card\n");
330362306a36Sopenharmony_ci	} else {
330462306a36Sopenharmony_ci		pr_err("Your board isn't known (yet) to the driver.  You can\n");
330562306a36Sopenharmony_ci		pr_err("try to pick one of the existing card configs via\n");
330662306a36Sopenharmony_ci		pr_err("card=<n> insmod option.  Updating to the latest\n");
330762306a36Sopenharmony_ci		pr_err("version might help as well.\n");
330862306a36Sopenharmony_ci	}
330962306a36Sopenharmony_ci	pr_err("Here is a list of valid choices for the card=<n> insmod option:\n");
331062306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)
331162306a36Sopenharmony_ci		pr_err("    card=%d -> %s\n", i, cx88_boards[i].name);
331262306a36Sopenharmony_ci}
331362306a36Sopenharmony_ci
331462306a36Sopenharmony_cistatic void cx88_card_setup_pre_i2c(struct cx88_core *core)
331562306a36Sopenharmony_ci{
331662306a36Sopenharmony_ci	switch (core->boardnr) {
331762306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1300:
331862306a36Sopenharmony_ci		/*
331962306a36Sopenharmony_ci		 * Bring the 702 demod up before i2c scanning/attach or
332062306a36Sopenharmony_ci		 * devices are hidden.
332162306a36Sopenharmony_ci		 *
332262306a36Sopenharmony_ci		 * We leave here with the 702 on the bus
332362306a36Sopenharmony_ci		 *
332462306a36Sopenharmony_ci		 * "reset the IR receiver on GPIO[3]"
332562306a36Sopenharmony_ci		 * Reported by Mike Crash <mike AT mikecrash.com>
332662306a36Sopenharmony_ci		 */
332762306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x0000ef88);
332862306a36Sopenharmony_ci		udelay(1000);
332962306a36Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000088);
333062306a36Sopenharmony_ci		udelay(50);
333162306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */
333262306a36Sopenharmony_ci		udelay(1000);
333362306a36Sopenharmony_ci		break;
333462306a36Sopenharmony_ci
333562306a36Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
333662306a36Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_8000GT:
333762306a36Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
333862306a36Sopenharmony_ci		msleep(50);
333962306a36Sopenharmony_ci		cx_write(MO_GP2_IO, 0xef5);
334062306a36Sopenharmony_ci		msleep(50);
334162306a36Sopenharmony_ci		cx_write(MO_GP2_IO, 0xcf7);
334262306a36Sopenharmony_ci		usleep_range(10000, 20000);
334362306a36Sopenharmony_ci		break;
334462306a36Sopenharmony_ci
334562306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:
334662306a36Sopenharmony_ci		/* Enable the xc5000 tuner */
334762306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00001010);
334862306a36Sopenharmony_ci		break;
334962306a36Sopenharmony_ci
335062306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV2000H_J:
335162306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR3000:
335262306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR4000:
335362306a36Sopenharmony_ci		/* Init GPIO */
335462306a36Sopenharmony_ci		cx_write(MO_GP0_IO, core->board.input[0].gpio0);
335562306a36Sopenharmony_ci		udelay(1000);
335662306a36Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000080);
335762306a36Sopenharmony_ci		udelay(50);
335862306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */
335962306a36Sopenharmony_ci		udelay(1000);
336062306a36Sopenharmony_ci		break;
336162306a36Sopenharmony_ci
336262306a36Sopenharmony_ci	case CX88_BOARD_NOTONLYTV_LV3H:
336362306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
336462306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H:
336562306a36Sopenharmony_ci		cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0);
336662306a36Sopenharmony_ci		break;
336762306a36Sopenharmony_ci
336862306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H_XC4000:
336962306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV2000H_PLUS:
337062306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:
337162306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:
337262306a36Sopenharmony_ci		cx88_xc4000_winfast2000h_plus_callback(core,
337362306a36Sopenharmony_ci						       XC4000_TUNER_RESET, 0);
337462306a36Sopenharmony_ci		break;
337562306a36Sopenharmony_ci
337662306a36Sopenharmony_ci	case CX88_BOARD_TWINHAN_VP1027_DVBS:
337762306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00003230);
337862306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00003210);
337962306a36Sopenharmony_ci		usleep_range(10000, 20000);
338062306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00001230);
338162306a36Sopenharmony_ci		break;
338262306a36Sopenharmony_ci	}
338362306a36Sopenharmony_ci}
338462306a36Sopenharmony_ci
338562306a36Sopenharmony_ci/*
338662306a36Sopenharmony_ci * Sets board-dependent xc3028 configuration
338762306a36Sopenharmony_ci */
338862306a36Sopenharmony_civoid cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)
338962306a36Sopenharmony_ci{
339062306a36Sopenharmony_ci	memset(ctl, 0, sizeof(*ctl));
339162306a36Sopenharmony_ci
339262306a36Sopenharmony_ci	ctl->fname   = XC2028_DEFAULT_FIRMWARE;
339362306a36Sopenharmony_ci	ctl->max_len = 64;
339462306a36Sopenharmony_ci
339562306a36Sopenharmony_ci	switch (core->boardnr) {
339662306a36Sopenharmony_ci	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:
339762306a36Sopenharmony_ci		/* Now works with firmware version 2.7 */
339862306a36Sopenharmony_ci		if (core->i2c_algo.udelay < 16)
339962306a36Sopenharmony_ci			core->i2c_algo.udelay = 16;
340062306a36Sopenharmony_ci		break;
340162306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
340262306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DTV1800H:
340362306a36Sopenharmony_ci		ctl->demod = XC3028_FE_ZARLINK456;
340462306a36Sopenharmony_ci		break;
340562306a36Sopenharmony_ci	case CX88_BOARD_KWORLD_ATSC_120:
340662306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:
340762306a36Sopenharmony_ci		ctl->demod = XC3028_FE_OREN538;
340862306a36Sopenharmony_ci		break;
340962306a36Sopenharmony_ci	case CX88_BOARD_GENIATECH_X8000_MT:
341062306a36Sopenharmony_ci		/*
341162306a36Sopenharmony_ci		 * FIXME: For this board, the xc3028 never recovers after being
341262306a36Sopenharmony_ci		 * powered down (the reset GPIO probably is not set properly).
341362306a36Sopenharmony_ci		 * We don't have access to the hardware so we cannot determine
341462306a36Sopenharmony_ci		 * which GPIO is used for xc3028, so just disable power xc3028
341562306a36Sopenharmony_ci		 * power management for now
341662306a36Sopenharmony_ci		 */
341762306a36Sopenharmony_ci		ctl->disable_power_mgmt = 1;
341862306a36Sopenharmony_ci		break;
341962306a36Sopenharmony_ci	case CX88_BOARD_NOTONLYTV_LV3H:
342062306a36Sopenharmony_ci		ctl->demod			= XC3028_FE_ZARLINK456;
342162306a36Sopenharmony_ci		ctl->fname			= XC3028L_DEFAULT_FIRMWARE;
342262306a36Sopenharmony_ci		ctl->read_not_reliable	= 1;
342362306a36Sopenharmony_ci		break;
342462306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:
342562306a36Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:
342662306a36Sopenharmony_ci	case CX88_BOARD_PROLINK_PV_8000GT:
342762306a36Sopenharmony_ci		/*
342862306a36Sopenharmony_ci		 * Those boards uses non-MTS firmware
342962306a36Sopenharmony_ci		 */
343062306a36Sopenharmony_ci		break;
343162306a36Sopenharmony_ci	case CX88_BOARD_PINNACLE_HYBRID_PCTV:
343262306a36Sopenharmony_ci	case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:
343362306a36Sopenharmony_ci		ctl->demod = XC3028_FE_ZARLINK456;
343462306a36Sopenharmony_ci		ctl->mts = 1;
343562306a36Sopenharmony_ci		break;
343662306a36Sopenharmony_ci	default:
343762306a36Sopenharmony_ci		ctl->demod = XC3028_FE_OREN538;
343862306a36Sopenharmony_ci		ctl->mts = 1;
343962306a36Sopenharmony_ci	}
344062306a36Sopenharmony_ci}
344162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(cx88_setup_xc3028);
344262306a36Sopenharmony_ci
344362306a36Sopenharmony_cistatic void cx88_card_setup(struct cx88_core *core)
344462306a36Sopenharmony_ci{
344562306a36Sopenharmony_ci	static u8 eeprom[256];
344662306a36Sopenharmony_ci	struct tuner_setup tun_setup;
344762306a36Sopenharmony_ci	unsigned int mode_mask = T_RADIO | T_ANALOG_TV;
344862306a36Sopenharmony_ci
344962306a36Sopenharmony_ci	memset(&tun_setup, 0, sizeof(tun_setup));
345062306a36Sopenharmony_ci
345162306a36Sopenharmony_ci	if (!core->i2c_rc) {
345262306a36Sopenharmony_ci		core->i2c_client.addr = 0xa0 >> 1;
345362306a36Sopenharmony_ci		tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));
345462306a36Sopenharmony_ci	}
345562306a36Sopenharmony_ci
345662306a36Sopenharmony_ci	switch (core->boardnr) {
345762306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE:
345862306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_ROSLYN:
345962306a36Sopenharmony_ci		if (!core->i2c_rc)
346062306a36Sopenharmony_ci			hauppauge_eeprom(core, eeprom + 8);
346162306a36Sopenharmony_ci		break;
346262306a36Sopenharmony_ci	case CX88_BOARD_GDI:
346362306a36Sopenharmony_ci		if (!core->i2c_rc)
346462306a36Sopenharmony_ci			gdi_eeprom(core, eeprom);
346562306a36Sopenharmony_ci		break;
346662306a36Sopenharmony_ci	case CX88_BOARD_LEADTEK_PVR2000:
346762306a36Sopenharmony_ci	case CX88_BOARD_WINFAST_DV2000:
346862306a36Sopenharmony_ci	case CX88_BOARD_WINFAST2000XP_EXPERT:
346962306a36Sopenharmony_ci		if (!core->i2c_rc)
347062306a36Sopenharmony_ci			leadtek_eeprom(core, eeprom);
347162306a36Sopenharmony_ci		break;
347262306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:
347362306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:
347462306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_DVB_T1:
347562306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1100:
347662306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1100LP:
347762306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR3000:
347862306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR1300:
347962306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR4000:
348062306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:
348162306a36Sopenharmony_ci	case CX88_BOARD_HAUPPAUGE_IRONLY:
348262306a36Sopenharmony_ci		if (!core->i2c_rc)
348362306a36Sopenharmony_ci			hauppauge_eeprom(core, eeprom);
348462306a36Sopenharmony_ci		break;
348562306a36Sopenharmony_ci	case CX88_BOARD_KWORLD_DVBS_100:
348662306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x000007f8);
348762306a36Sopenharmony_ci		cx_write(MO_GP1_IO, 0x00000001);
348862306a36Sopenharmony_ci		break;
348962306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:
349062306a36Sopenharmony_ci		/* GPIO0:0 is hooked to demod reset */
349162306a36Sopenharmony_ci		/* GPIO0:4 is hooked to xc3028 reset */
349262306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00111100);
349362306a36Sopenharmony_ci		usleep_range(10000, 20000);
349462306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00111111);
349562306a36Sopenharmony_ci		break;
349662306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:
349762306a36Sopenharmony_ci		/* GPIO0:6 is hooked to FX2 reset pin */
349862306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00004040);
349962306a36Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000040);
350062306a36Sopenharmony_ci		msleep(1000);
350162306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00004040);
350262306a36Sopenharmony_ci		fallthrough;
350362306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:
350462306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:
350562306a36Sopenharmony_ci	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:
350662306a36Sopenharmony_ci		/* GPIO0:0 is hooked to mt352 reset pin */
350762306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000101);
350862306a36Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000001);
350962306a36Sopenharmony_ci		usleep_range(10000, 20000);
351062306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000101);
351162306a36Sopenharmony_ci		if (!core->i2c_rc &&
351262306a36Sopenharmony_ci		    core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)
351362306a36Sopenharmony_ci			dvico_fusionhdtv_hybrid_init(core);
351462306a36Sopenharmony_ci		break;
351562306a36Sopenharmony_ci	case CX88_BOARD_KWORLD_DVB_T:
351662306a36Sopenharmony_ci	case CX88_BOARD_DNTV_LIVE_DVB_T:
351762306a36Sopenharmony_ci		cx_set(MO_GP0_IO, 0x00000707);
351862306a36Sopenharmony_ci		cx_set(MO_GP2_IO, 0x00000101);
351962306a36Sopenharmony_ci		cx_clear(MO_GP2_IO, 0x00000001);
352062306a36Sopenharmony_ci		usleep_range(10000, 20000);
352162306a36Sopenharmony_ci		cx_clear(MO_GP0_IO, 0x00000007);
352262306a36Sopenharmony_ci		cx_set(MO_GP2_IO, 0x00000101);
352362306a36Sopenharmony_ci		break;
352462306a36Sopenharmony_ci	case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:
352562306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x00080808);
352662306a36Sopenharmony_ci		break;
352762306a36Sopenharmony_ci	case CX88_BOARD_ATI_HDTVWONDER:
352862306a36Sopenharmony_ci		if (!core->i2c_rc) {
352962306a36Sopenharmony_ci			/* enable tuner */
353062306a36Sopenharmony_ci			int i;
353162306a36Sopenharmony_ci			static const u8 buffer[][2] = {
353262306a36Sopenharmony_ci				{0x10, 0x12},
353362306a36Sopenharmony_ci				{0x13, 0x04},
353462306a36Sopenharmony_ci				{0x16, 0x00},
353562306a36Sopenharmony_ci				{0x14, 0x04},
353662306a36Sopenharmony_ci				{0x17, 0x00}
353762306a36Sopenharmony_ci			};
353862306a36Sopenharmony_ci			core->i2c_client.addr = 0x0a;
353962306a36Sopenharmony_ci
354062306a36Sopenharmony_ci			for (i = 0; i < ARRAY_SIZE(buffer); i++)
354162306a36Sopenharmony_ci				if (i2c_master_send(&core->i2c_client,
354262306a36Sopenharmony_ci						    buffer[i], 2) != 2)
354362306a36Sopenharmony_ci					pr_warn("Unable to enable tuner(%i).\n",
354462306a36Sopenharmony_ci						i);
354562306a36Sopenharmony_ci		}
354662306a36Sopenharmony_ci		break;
354762306a36Sopenharmony_ci	case CX88_BOARD_MSI_TVANYWHERE_MASTER:
354862306a36Sopenharmony_ci	{
354962306a36Sopenharmony_ci		struct v4l2_priv_tun_config tea5767_cfg;
355062306a36Sopenharmony_ci		struct tea5767_ctrl ctl;
355162306a36Sopenharmony_ci
355262306a36Sopenharmony_ci		memset(&ctl, 0, sizeof(ctl));
355362306a36Sopenharmony_ci
355462306a36Sopenharmony_ci		ctl.high_cut  = 1;
355562306a36Sopenharmony_ci		ctl.st_noise  = 1;
355662306a36Sopenharmony_ci		ctl.deemph_75 = 1;
355762306a36Sopenharmony_ci		ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
355862306a36Sopenharmony_ci
355962306a36Sopenharmony_ci		tea5767_cfg.tuner = TUNER_TEA5767;
356062306a36Sopenharmony_ci		tea5767_cfg.priv  = &ctl;
356162306a36Sopenharmony_ci
356262306a36Sopenharmony_ci		call_all(core, tuner, s_config, &tea5767_cfg);
356362306a36Sopenharmony_ci		break;
356462306a36Sopenharmony_ci	}
356562306a36Sopenharmony_ci	case  CX88_BOARD_TEVII_S420:
356662306a36Sopenharmony_ci	case  CX88_BOARD_TEVII_S460:
356762306a36Sopenharmony_ci	case  CX88_BOARD_TEVII_S464:
356862306a36Sopenharmony_ci	case  CX88_BOARD_OMICOM_SS4_PCI:
356962306a36Sopenharmony_ci	case  CX88_BOARD_TBS_8910:
357062306a36Sopenharmony_ci	case  CX88_BOARD_TBS_8920:
357162306a36Sopenharmony_ci	case  CX88_BOARD_PROF_6200:
357262306a36Sopenharmony_ci	case  CX88_BOARD_PROF_7300:
357362306a36Sopenharmony_ci	case  CX88_BOARD_PROF_7301:
357462306a36Sopenharmony_ci	case  CX88_BOARD_SATTRADE_ST4200:
357562306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x8000);
357662306a36Sopenharmony_ci		msleep(100);
357762306a36Sopenharmony_ci		cx_write(MO_SRST_IO, 0);
357862306a36Sopenharmony_ci		usleep_range(10000, 20000);
357962306a36Sopenharmony_ci		cx_write(MO_GP0_IO, 0x8080);
358062306a36Sopenharmony_ci		msleep(100);
358162306a36Sopenharmony_ci		cx_write(MO_SRST_IO, 1);
358262306a36Sopenharmony_ci		msleep(100);
358362306a36Sopenharmony_ci		break;
358462306a36Sopenharmony_ci	} /*end switch() */
358562306a36Sopenharmony_ci
358662306a36Sopenharmony_ci	/* Setup tuners */
358762306a36Sopenharmony_ci	if (core->board.radio_type != UNSET) {
358862306a36Sopenharmony_ci		tun_setup.mode_mask      = T_RADIO;
358962306a36Sopenharmony_ci		tun_setup.type           = core->board.radio_type;
359062306a36Sopenharmony_ci		tun_setup.addr           = core->board.radio_addr;
359162306a36Sopenharmony_ci		tun_setup.tuner_callback = cx88_tuner_callback;
359262306a36Sopenharmony_ci		call_all(core, tuner, s_type_addr, &tun_setup);
359362306a36Sopenharmony_ci		mode_mask &= ~T_RADIO;
359462306a36Sopenharmony_ci	}
359562306a36Sopenharmony_ci
359662306a36Sopenharmony_ci	if (core->board.tuner_type != UNSET) {
359762306a36Sopenharmony_ci		tun_setup.mode_mask      = mode_mask;
359862306a36Sopenharmony_ci		tun_setup.type           = core->board.tuner_type;
359962306a36Sopenharmony_ci		tun_setup.addr           = core->board.tuner_addr;
360062306a36Sopenharmony_ci		tun_setup.tuner_callback = cx88_tuner_callback;
360162306a36Sopenharmony_ci
360262306a36Sopenharmony_ci		call_all(core, tuner, s_type_addr, &tun_setup);
360362306a36Sopenharmony_ci	}
360462306a36Sopenharmony_ci
360562306a36Sopenharmony_ci	if (core->board.tda9887_conf) {
360662306a36Sopenharmony_ci		struct v4l2_priv_tun_config tda9887_cfg;
360762306a36Sopenharmony_ci
360862306a36Sopenharmony_ci		tda9887_cfg.tuner = TUNER_TDA9887;
360962306a36Sopenharmony_ci		tda9887_cfg.priv  = &core->board.tda9887_conf;
361062306a36Sopenharmony_ci
361162306a36Sopenharmony_ci		call_all(core, tuner, s_config, &tda9887_cfg);
361262306a36Sopenharmony_ci	}
361362306a36Sopenharmony_ci
361462306a36Sopenharmony_ci	if (core->board.tuner_type == TUNER_XC2028) {
361562306a36Sopenharmony_ci		struct v4l2_priv_tun_config  xc2028_cfg;
361662306a36Sopenharmony_ci		struct xc2028_ctrl           ctl;
361762306a36Sopenharmony_ci
361862306a36Sopenharmony_ci		/* Fills device-dependent initialization parameters */
361962306a36Sopenharmony_ci		cx88_setup_xc3028(core, &ctl);
362062306a36Sopenharmony_ci
362162306a36Sopenharmony_ci		/* Sends parameters to xc2028/3028 tuner */
362262306a36Sopenharmony_ci		memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
362362306a36Sopenharmony_ci		xc2028_cfg.tuner = TUNER_XC2028;
362462306a36Sopenharmony_ci		xc2028_cfg.priv  = &ctl;
362562306a36Sopenharmony_ci		dprintk(1, "Asking xc2028/3028 to load firmware %s\n",
362662306a36Sopenharmony_ci			ctl.fname);
362762306a36Sopenharmony_ci		call_all(core, tuner, s_config, &xc2028_cfg);
362862306a36Sopenharmony_ci	}
362962306a36Sopenharmony_ci	call_all(core, tuner, standby);
363062306a36Sopenharmony_ci}
363162306a36Sopenharmony_ci
363262306a36Sopenharmony_ci/* ------------------------------------------------------------------ */
363362306a36Sopenharmony_ci
363462306a36Sopenharmony_cistatic int cx88_pci_quirks(const char *name, struct pci_dev *pci)
363562306a36Sopenharmony_ci{
363662306a36Sopenharmony_ci	unsigned int lat = UNSET;
363762306a36Sopenharmony_ci	u8 ctrl = 0;
363862306a36Sopenharmony_ci	u8 value;
363962306a36Sopenharmony_ci
364062306a36Sopenharmony_ci	/* check pci quirks */
364162306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_TRITON) {
364262306a36Sopenharmony_ci		pr_info("quirk: PCIPCI_TRITON -- set TBFX\n");
364362306a36Sopenharmony_ci		ctrl |= CX88X_EN_TBFX;
364462306a36Sopenharmony_ci	}
364562306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_NATOMA) {
364662306a36Sopenharmony_ci		pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n");
364762306a36Sopenharmony_ci		ctrl |= CX88X_EN_TBFX;
364862306a36Sopenharmony_ci	}
364962306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_VIAETBF) {
365062306a36Sopenharmony_ci		pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n");
365162306a36Sopenharmony_ci		ctrl |= CX88X_EN_TBFX;
365262306a36Sopenharmony_ci	}
365362306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_VSFX) {
365462306a36Sopenharmony_ci		pr_info("quirk: PCIPCI_VSFX -- set VSFX\n");
365562306a36Sopenharmony_ci		ctrl |= CX88X_EN_VSFX;
365662306a36Sopenharmony_ci	}
365762306a36Sopenharmony_ci#ifdef PCIPCI_ALIMAGIK
365862306a36Sopenharmony_ci	if (pci_pci_problems & PCIPCI_ALIMAGIK) {
365962306a36Sopenharmony_ci		pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n");
366062306a36Sopenharmony_ci		lat = 0x0A;
366162306a36Sopenharmony_ci	}
366262306a36Sopenharmony_ci#endif
366362306a36Sopenharmony_ci
366462306a36Sopenharmony_ci	/* check insmod options */
366562306a36Sopenharmony_ci	if (latency != UNSET)
366662306a36Sopenharmony_ci		lat = latency;
366762306a36Sopenharmony_ci
366862306a36Sopenharmony_ci	/* apply stuff */
366962306a36Sopenharmony_ci	if (ctrl) {
367062306a36Sopenharmony_ci		pci_read_config_byte(pci, CX88X_DEVCTRL, &value);
367162306a36Sopenharmony_ci		value |= ctrl;
367262306a36Sopenharmony_ci		pci_write_config_byte(pci, CX88X_DEVCTRL, value);
367362306a36Sopenharmony_ci	}
367462306a36Sopenharmony_ci	if (lat != UNSET) {
367562306a36Sopenharmony_ci		pr_info("setting pci latency timer to %d\n", latency);
367662306a36Sopenharmony_ci		pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);
367762306a36Sopenharmony_ci	}
367862306a36Sopenharmony_ci	return 0;
367962306a36Sopenharmony_ci}
368062306a36Sopenharmony_ci
368162306a36Sopenharmony_ciint cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)
368262306a36Sopenharmony_ci{
368362306a36Sopenharmony_ci	if (request_mem_region(pci_resource_start(pci, 0),
368462306a36Sopenharmony_ci			       pci_resource_len(pci, 0),
368562306a36Sopenharmony_ci			       core->name))
368662306a36Sopenharmony_ci		return 0;
368762306a36Sopenharmony_ci	pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",
368862306a36Sopenharmony_ci	       PCI_FUNC(pci->devfn),
368962306a36Sopenharmony_ci	       (unsigned long long)pci_resource_start(pci, 0),
369062306a36Sopenharmony_ci	       pci->subsystem_vendor, pci->subsystem_device);
369162306a36Sopenharmony_ci	return -EBUSY;
369262306a36Sopenharmony_ci}
369362306a36Sopenharmony_ci
369462306a36Sopenharmony_ci/*
369562306a36Sopenharmony_ci * Allocate and initialize the cx88 core struct.  One should hold the
369662306a36Sopenharmony_ci * devlist mutex before calling this.
369762306a36Sopenharmony_ci */
369862306a36Sopenharmony_cistruct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)
369962306a36Sopenharmony_ci{
370062306a36Sopenharmony_ci	struct cx88_core *core;
370162306a36Sopenharmony_ci	int i;
370262306a36Sopenharmony_ci
370362306a36Sopenharmony_ci	core = kzalloc(sizeof(*core), GFP_KERNEL);
370462306a36Sopenharmony_ci	if (!core)
370562306a36Sopenharmony_ci		return NULL;
370662306a36Sopenharmony_ci
370762306a36Sopenharmony_ci	refcount_set(&core->refcount, 1);
370862306a36Sopenharmony_ci	core->pci_bus  = pci->bus->number;
370962306a36Sopenharmony_ci	core->pci_slot = PCI_SLOT(pci->devfn);
371062306a36Sopenharmony_ci	core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |
371162306a36Sopenharmony_ci			    PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |
371262306a36Sopenharmony_ci			    PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;
371362306a36Sopenharmony_ci	mutex_init(&core->lock);
371462306a36Sopenharmony_ci
371562306a36Sopenharmony_ci	core->nr = nr;
371662306a36Sopenharmony_ci	sprintf(core->name, "cx88[%d]", core->nr);
371762306a36Sopenharmony_ci
371862306a36Sopenharmony_ci	/*
371962306a36Sopenharmony_ci	 * Note: Setting initial standard here would cause first call to
372062306a36Sopenharmony_ci	 * cx88_set_tvnorm() to return without programming any registers.  Leave
372162306a36Sopenharmony_ci	 * it blank for at this point and it will get set later in
372262306a36Sopenharmony_ci	 * cx8800_initdev()
372362306a36Sopenharmony_ci	 */
372462306a36Sopenharmony_ci	core->tvnorm  = 0;
372562306a36Sopenharmony_ci
372662306a36Sopenharmony_ci	core->width   = 320;
372762306a36Sopenharmony_ci	core->height  = 240;
372862306a36Sopenharmony_ci	core->field   = V4L2_FIELD_INTERLACED;
372962306a36Sopenharmony_ci
373062306a36Sopenharmony_ci	strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name));
373162306a36Sopenharmony_ci	if (v4l2_device_register(NULL, &core->v4l2_dev)) {
373262306a36Sopenharmony_ci		kfree(core);
373362306a36Sopenharmony_ci		return NULL;
373462306a36Sopenharmony_ci	}
373562306a36Sopenharmony_ci
373662306a36Sopenharmony_ci	if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) {
373762306a36Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
373862306a36Sopenharmony_ci		kfree(core);
373962306a36Sopenharmony_ci		return NULL;
374062306a36Sopenharmony_ci	}
374162306a36Sopenharmony_ci
374262306a36Sopenharmony_ci	if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) {
374362306a36Sopenharmony_ci		v4l2_ctrl_handler_free(&core->video_hdl);
374462306a36Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
374562306a36Sopenharmony_ci		kfree(core);
374662306a36Sopenharmony_ci		return NULL;
374762306a36Sopenharmony_ci	}
374862306a36Sopenharmony_ci
374962306a36Sopenharmony_ci	if (cx88_get_resources(core, pci) != 0) {
375062306a36Sopenharmony_ci		v4l2_ctrl_handler_free(&core->video_hdl);
375162306a36Sopenharmony_ci		v4l2_ctrl_handler_free(&core->audio_hdl);
375262306a36Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
375362306a36Sopenharmony_ci		kfree(core);
375462306a36Sopenharmony_ci		return NULL;
375562306a36Sopenharmony_ci	}
375662306a36Sopenharmony_ci
375762306a36Sopenharmony_ci	/* PCI stuff */
375862306a36Sopenharmony_ci	cx88_pci_quirks(core->name, pci);
375962306a36Sopenharmony_ci	core->lmmio = ioremap(pci_resource_start(pci, 0),
376062306a36Sopenharmony_ci			      pci_resource_len(pci, 0));
376162306a36Sopenharmony_ci	core->bmmio = (u8 __iomem *)core->lmmio;
376262306a36Sopenharmony_ci
376362306a36Sopenharmony_ci	if (!core->lmmio) {
376462306a36Sopenharmony_ci		release_mem_region(pci_resource_start(pci, 0),
376562306a36Sopenharmony_ci				   pci_resource_len(pci, 0));
376662306a36Sopenharmony_ci		v4l2_ctrl_handler_free(&core->video_hdl);
376762306a36Sopenharmony_ci		v4l2_ctrl_handler_free(&core->audio_hdl);
376862306a36Sopenharmony_ci		v4l2_device_unregister(&core->v4l2_dev);
376962306a36Sopenharmony_ci		kfree(core);
377062306a36Sopenharmony_ci		return NULL;
377162306a36Sopenharmony_ci	}
377262306a36Sopenharmony_ci
377362306a36Sopenharmony_ci	/* board config */
377462306a36Sopenharmony_ci	core->boardnr = UNSET;
377562306a36Sopenharmony_ci	if (card[core->nr] < ARRAY_SIZE(cx88_boards))
377662306a36Sopenharmony_ci		core->boardnr = card[core->nr];
377762306a36Sopenharmony_ci	for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++)
377862306a36Sopenharmony_ci		if (pci->subsystem_vendor == cx88_subids[i].subvendor &&
377962306a36Sopenharmony_ci		    pci->subsystem_device == cx88_subids[i].subdevice)
378062306a36Sopenharmony_ci			core->boardnr = cx88_subids[i].card;
378162306a36Sopenharmony_ci	if (core->boardnr == UNSET) {
378262306a36Sopenharmony_ci		core->boardnr = CX88_BOARD_UNKNOWN;
378362306a36Sopenharmony_ci		cx88_card_list(core, pci);
378462306a36Sopenharmony_ci	}
378562306a36Sopenharmony_ci
378662306a36Sopenharmony_ci	core->board = cx88_boards[core->boardnr];
378762306a36Sopenharmony_ci
378862306a36Sopenharmony_ci	if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))
378962306a36Sopenharmony_ci		core->board.num_frontends = 1;
379062306a36Sopenharmony_ci
379162306a36Sopenharmony_ci	pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",
379262306a36Sopenharmony_ci		pci->subsystem_vendor, pci->subsystem_device, core->board.name,
379362306a36Sopenharmony_ci		core->boardnr, card[core->nr] == core->boardnr ?
379462306a36Sopenharmony_ci		"insmod option" : "autodetected",
379562306a36Sopenharmony_ci		core->board.num_frontends);
379662306a36Sopenharmony_ci
379762306a36Sopenharmony_ci	if (tuner[core->nr] != UNSET)
379862306a36Sopenharmony_ci		core->board.tuner_type = tuner[core->nr];
379962306a36Sopenharmony_ci	if (radio[core->nr] != UNSET)
380062306a36Sopenharmony_ci		core->board.radio_type = radio[core->nr];
380162306a36Sopenharmony_ci
380262306a36Sopenharmony_ci	dprintk(1, "TV tuner type %d, Radio tuner type %d\n",
380362306a36Sopenharmony_ci		core->board.tuner_type, core->board.radio_type);
380462306a36Sopenharmony_ci
380562306a36Sopenharmony_ci	/* init hardware */
380662306a36Sopenharmony_ci	cx88_reset(core);
380762306a36Sopenharmony_ci	cx88_card_setup_pre_i2c(core);
380862306a36Sopenharmony_ci	cx88_i2c_init(core, pci);
380962306a36Sopenharmony_ci
381062306a36Sopenharmony_ci	/* load tuner module, if needed */
381162306a36Sopenharmony_ci	if (core->board.tuner_type != UNSET) {
381262306a36Sopenharmony_ci		/*
381362306a36Sopenharmony_ci		 * Ignore 0x6b and 0x6f on cx88 boards.
381462306a36Sopenharmony_ci		 * FusionHDTV5 RT Gold has an ir receiver at 0x6b
381562306a36Sopenharmony_ci		 * and an RTC at 0x6f which can get corrupted if probed.
381662306a36Sopenharmony_ci		 */
381762306a36Sopenharmony_ci		static const unsigned short tv_addrs[] = {
381862306a36Sopenharmony_ci			0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */
381962306a36Sopenharmony_ci			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
382062306a36Sopenharmony_ci			0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,
382162306a36Sopenharmony_ci			I2C_CLIENT_END
382262306a36Sopenharmony_ci		};
382362306a36Sopenharmony_ci		int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);
382462306a36Sopenharmony_ci
382562306a36Sopenharmony_ci		/*
382662306a36Sopenharmony_ci		 * I don't trust the radio_type as is stored in the card
382762306a36Sopenharmony_ci		 * definitions, so we just probe for it.
382862306a36Sopenharmony_ci		 * The radio_type is sometimes missing, or set to UNSET but
382962306a36Sopenharmony_ci		 * later code configures a tea5767.
383062306a36Sopenharmony_ci		 */
383162306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
383262306a36Sopenharmony_ci				    "tuner", 0,
383362306a36Sopenharmony_ci				    v4l2_i2c_tuner_addrs(ADDRS_RADIO));
383462306a36Sopenharmony_ci		if (has_demod)
383562306a36Sopenharmony_ci			v4l2_i2c_new_subdev(&core->v4l2_dev,
383662306a36Sopenharmony_ci					    &core->i2c_adap, "tuner",
383762306a36Sopenharmony_ci				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
383862306a36Sopenharmony_ci		if (core->board.tuner_addr == ADDR_UNSET) {
383962306a36Sopenharmony_ci			v4l2_i2c_new_subdev(&core->v4l2_dev,
384062306a36Sopenharmony_ci					    &core->i2c_adap, "tuner",
384162306a36Sopenharmony_ci				0, has_demod ? tv_addrs + 4 : tv_addrs);
384262306a36Sopenharmony_ci		} else {
384362306a36Sopenharmony_ci			v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,
384462306a36Sopenharmony_ci					    "tuner", core->board.tuner_addr,
384562306a36Sopenharmony_ci					    NULL);
384662306a36Sopenharmony_ci		}
384762306a36Sopenharmony_ci	}
384862306a36Sopenharmony_ci
384962306a36Sopenharmony_ci	cx88_card_setup(core);
385062306a36Sopenharmony_ci	if (!disable_ir) {
385162306a36Sopenharmony_ci		cx88_i2c_init_ir(core);
385262306a36Sopenharmony_ci		cx88_ir_init(core, pci);
385362306a36Sopenharmony_ci	}
385462306a36Sopenharmony_ci
385562306a36Sopenharmony_ci	return core;
385662306a36Sopenharmony_ci}
3857