162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  Driver for the Conexant CX23885 PCIe bridge
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (c) 2006 Steven Toth <stoth@linuxtv.org>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "cx23885.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/init.h>
1162306a36Sopenharmony_ci#include <linux/module.h>
1262306a36Sopenharmony_ci#include <linux/pci.h>
1362306a36Sopenharmony_ci#include <linux/delay.h>
1462306a36Sopenharmony_ci#include <media/drv-intf/cx25840.h>
1562306a36Sopenharmony_ci#include <linux/firmware.h>
1662306a36Sopenharmony_ci#include <misc/altera.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include "xc2028.h"
1962306a36Sopenharmony_ci#include "netup-eeprom.h"
2062306a36Sopenharmony_ci#include "netup-init.h"
2162306a36Sopenharmony_ci#include "altera-ci.h"
2262306a36Sopenharmony_ci#include "xc4000.h"
2362306a36Sopenharmony_ci#include "xc5000.h"
2462306a36Sopenharmony_ci#include "cx23888-ir.h"
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic unsigned int netup_card_rev = 4;
2762306a36Sopenharmony_cimodule_param(netup_card_rev, int, 0644);
2862306a36Sopenharmony_ciMODULE_PARM_DESC(netup_card_rev,
2962306a36Sopenharmony_ci		"NetUP Dual DVB-T/C CI card revision");
3062306a36Sopenharmony_cistatic unsigned int enable_885_ir;
3162306a36Sopenharmony_cimodule_param(enable_885_ir, int, 0644);
3262306a36Sopenharmony_ciMODULE_PARM_DESC(enable_885_ir,
3362306a36Sopenharmony_ci		 "Enable integrated IR controller for supported\n"
3462306a36Sopenharmony_ci		 "\t\t    CX2388[57] boards that are wired for it:\n"
3562306a36Sopenharmony_ci		 "\t\t\tHVR-1250 (reported safe)\n"
3662306a36Sopenharmony_ci		 "\t\t\tTerraTec Cinergy T PCIe Dual (not well tested, appears to be safe)\n"
3762306a36Sopenharmony_ci		 "\t\t\tTeVii S470 (reported unsafe)\n"
3862306a36Sopenharmony_ci		 "\t\t    This can cause an interrupt storm with some cards.\n"
3962306a36Sopenharmony_ci		 "\t\t    Default: 0 [Disabled]");
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci/* ------------------------------------------------------------------ */
4262306a36Sopenharmony_ci/* board config info                                                  */
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistruct cx23885_board cx23885_boards[] = {
4562306a36Sopenharmony_ci	[CX23885_BOARD_UNKNOWN] = {
4662306a36Sopenharmony_ci		.name		= "UNKNOWN/GENERIC",
4762306a36Sopenharmony_ci		/* Ensure safe default for unknown boards */
4862306a36Sopenharmony_ci		.clk_freq       = 0,
4962306a36Sopenharmony_ci		.input          = {{
5062306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
5162306a36Sopenharmony_ci			.vmux   = 0,
5262306a36Sopenharmony_ci		}, {
5362306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE2,
5462306a36Sopenharmony_ci			.vmux   = 1,
5562306a36Sopenharmony_ci		}, {
5662306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE3,
5762306a36Sopenharmony_ci			.vmux   = 2,
5862306a36Sopenharmony_ci		}, {
5962306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE4,
6062306a36Sopenharmony_ci			.vmux   = 3,
6162306a36Sopenharmony_ci		} },
6262306a36Sopenharmony_ci	},
6362306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1800lp] = {
6462306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1800lp",
6562306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
6662306a36Sopenharmony_ci		.input          = {{
6762306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
6862306a36Sopenharmony_ci			.vmux   = 0,
6962306a36Sopenharmony_ci			.gpio0  = 0xff00,
7062306a36Sopenharmony_ci		}, {
7162306a36Sopenharmony_ci			.type   = CX23885_VMUX_DEBUG,
7262306a36Sopenharmony_ci			.vmux   = 0,
7362306a36Sopenharmony_ci			.gpio0  = 0xff01,
7462306a36Sopenharmony_ci		}, {
7562306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
7662306a36Sopenharmony_ci			.vmux   = 1,
7762306a36Sopenharmony_ci			.gpio0  = 0xff02,
7862306a36Sopenharmony_ci		}, {
7962306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
8062306a36Sopenharmony_ci			.vmux   = 2,
8162306a36Sopenharmony_ci			.gpio0  = 0xff02,
8262306a36Sopenharmony_ci		} },
8362306a36Sopenharmony_ci	},
8462306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1800] = {
8562306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1800",
8662306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
8762306a36Sopenharmony_ci		.portb		= CX23885_MPEG_ENCODER,
8862306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
8962306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_TDA8290,
9062306a36Sopenharmony_ci		.tuner_addr	= 0x42, /* 0x84 >> 1 */
9162306a36Sopenharmony_ci		.tuner_bus	= 1,
9262306a36Sopenharmony_ci		.input          = {{
9362306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
9462306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
9562306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
9662306a36Sopenharmony_ci					CX25840_VIN2_CH1,
9762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
9862306a36Sopenharmony_ci			.gpio0  = 0,
9962306a36Sopenharmony_ci		}, {
10062306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
10162306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
10262306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
10362306a36Sopenharmony_ci					CX25840_VIN6_CH1,
10462306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
10562306a36Sopenharmony_ci			.gpio0  = 0,
10662306a36Sopenharmony_ci		}, {
10762306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
10862306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
10962306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
11062306a36Sopenharmony_ci					CX25840_VIN8_CH1 |
11162306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
11262306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
11362306a36Sopenharmony_ci			.gpio0  = 0,
11462306a36Sopenharmony_ci		} },
11562306a36Sopenharmony_ci	},
11662306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1250] = {
11762306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1250",
11862306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
11962306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
12062306a36Sopenharmony_ci#ifdef MT2131_NO_ANALOG_SUPPORT_YET
12162306a36Sopenharmony_ci		.tuner_type	= TUNER_PHILIPS_TDA8290,
12262306a36Sopenharmony_ci		.tuner_addr	= 0x42, /* 0x84 >> 1 */
12362306a36Sopenharmony_ci		.tuner_bus	= 1,
12462306a36Sopenharmony_ci#endif
12562306a36Sopenharmony_ci		.force_bff	= 1,
12662306a36Sopenharmony_ci		.input          = {{
12762306a36Sopenharmony_ci#ifdef MT2131_NO_ANALOG_SUPPORT_YET
12862306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
12962306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
13062306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
13162306a36Sopenharmony_ci					CX25840_VIN2_CH1,
13262306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
13362306a36Sopenharmony_ci			.gpio0  = 0xff00,
13462306a36Sopenharmony_ci		}, {
13562306a36Sopenharmony_ci#endif
13662306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
13762306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
13862306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
13962306a36Sopenharmony_ci					CX25840_VIN6_CH1,
14062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
14162306a36Sopenharmony_ci			.gpio0  = 0xff02,
14262306a36Sopenharmony_ci		}, {
14362306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
14462306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
14562306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
14662306a36Sopenharmony_ci					CX25840_VIN8_CH1 |
14762306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
14862306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
14962306a36Sopenharmony_ci			.gpio0  = 0xff02,
15062306a36Sopenharmony_ci		} },
15162306a36Sopenharmony_ci	},
15262306a36Sopenharmony_ci	[CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP] = {
15362306a36Sopenharmony_ci		.name		= "DViCO FusionHDTV5 Express",
15462306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
15562306a36Sopenharmony_ci	},
15662306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1500Q] = {
15762306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1500Q",
15862306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
15962306a36Sopenharmony_ci	},
16062306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1500] = {
16162306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1500",
16262306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
16362306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
16462306a36Sopenharmony_ci		.tuner_type	= TUNER_XC2028,
16562306a36Sopenharmony_ci		.tuner_addr	= 0x61, /* 0xc2 >> 1 */
16662306a36Sopenharmony_ci		.input          = {{
16762306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
16862306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
16962306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
17062306a36Sopenharmony_ci					CX25840_VIN2_CH1,
17162306a36Sopenharmony_ci			.gpio0  = 0,
17262306a36Sopenharmony_ci		}, {
17362306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
17462306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
17562306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
17662306a36Sopenharmony_ci					CX25840_VIN6_CH1,
17762306a36Sopenharmony_ci			.gpio0  = 0,
17862306a36Sopenharmony_ci		}, {
17962306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
18062306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
18162306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
18262306a36Sopenharmony_ci					CX25840_VIN8_CH1 |
18362306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
18462306a36Sopenharmony_ci			.gpio0  = 0,
18562306a36Sopenharmony_ci		} },
18662306a36Sopenharmony_ci	},
18762306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1200] = {
18862306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1200",
18962306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
19062306a36Sopenharmony_ci	},
19162306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1700] = {
19262306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1700",
19362306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
19462306a36Sopenharmony_ci	},
19562306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1400] = {
19662306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1400",
19762306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
19862306a36Sopenharmony_ci	},
19962306a36Sopenharmony_ci	[CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP] = {
20062306a36Sopenharmony_ci		.name		= "DViCO FusionHDTV7 Dual Express",
20162306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
20262306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
20362306a36Sopenharmony_ci	},
20462306a36Sopenharmony_ci	[CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP] = {
20562306a36Sopenharmony_ci		.name		= "DViCO FusionHDTV DVB-T Dual Express",
20662306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
20762306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
20862306a36Sopenharmony_ci	},
20962306a36Sopenharmony_ci	[CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H] = {
21062306a36Sopenharmony_ci		.name		= "Leadtek Winfast PxDVR3200 H",
21162306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
21262306a36Sopenharmony_ci	},
21362306a36Sopenharmony_ci	[CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200] = {
21462306a36Sopenharmony_ci		.name		= "Leadtek Winfast PxPVR2200",
21562306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
21662306a36Sopenharmony_ci		.tuner_type	= TUNER_XC2028,
21762306a36Sopenharmony_ci		.tuner_addr	= 0x61,
21862306a36Sopenharmony_ci		.tuner_bus	= 1,
21962306a36Sopenharmony_ci		.input		= {{
22062306a36Sopenharmony_ci			.type	= CX23885_VMUX_TELEVISION,
22162306a36Sopenharmony_ci			.vmux	= CX25840_VIN2_CH1 |
22262306a36Sopenharmony_ci				  CX25840_VIN5_CH2,
22362306a36Sopenharmony_ci			.amux	= CX25840_AUDIO8,
22462306a36Sopenharmony_ci			.gpio0	= 0x704040,
22562306a36Sopenharmony_ci		}, {
22662306a36Sopenharmony_ci			.type	= CX23885_VMUX_COMPOSITE1,
22762306a36Sopenharmony_ci			.vmux	= CX25840_COMPOSITE1,
22862306a36Sopenharmony_ci			.amux	= CX25840_AUDIO7,
22962306a36Sopenharmony_ci			.gpio0	= 0x704040,
23062306a36Sopenharmony_ci		}, {
23162306a36Sopenharmony_ci			.type	= CX23885_VMUX_SVIDEO,
23262306a36Sopenharmony_ci			.vmux	= CX25840_SVIDEO_LUMA3 |
23362306a36Sopenharmony_ci				  CX25840_SVIDEO_CHROMA4,
23462306a36Sopenharmony_ci			.amux	= CX25840_AUDIO7,
23562306a36Sopenharmony_ci			.gpio0	= 0x704040,
23662306a36Sopenharmony_ci		}, {
23762306a36Sopenharmony_ci			.type	= CX23885_VMUX_COMPONENT,
23862306a36Sopenharmony_ci			.vmux	= CX25840_VIN7_CH1 |
23962306a36Sopenharmony_ci				  CX25840_VIN6_CH2 |
24062306a36Sopenharmony_ci				  CX25840_VIN8_CH3 |
24162306a36Sopenharmony_ci				  CX25840_COMPONENT_ON,
24262306a36Sopenharmony_ci			.amux	= CX25840_AUDIO7,
24362306a36Sopenharmony_ci			.gpio0	= 0x704040,
24462306a36Sopenharmony_ci		} },
24562306a36Sopenharmony_ci	},
24662306a36Sopenharmony_ci	[CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000] = {
24762306a36Sopenharmony_ci		.name		= "Leadtek Winfast PxDVR3200 H XC4000",
24862306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
24962306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
25062306a36Sopenharmony_ci		.tuner_type	= TUNER_XC4000,
25162306a36Sopenharmony_ci		.tuner_addr	= 0x61,
25262306a36Sopenharmony_ci		.radio_type	= UNSET,
25362306a36Sopenharmony_ci		.radio_addr	= ADDR_UNSET,
25462306a36Sopenharmony_ci		.input		= {{
25562306a36Sopenharmony_ci			.type	= CX23885_VMUX_TELEVISION,
25662306a36Sopenharmony_ci			.vmux	= CX25840_VIN2_CH1 |
25762306a36Sopenharmony_ci				  CX25840_VIN5_CH2 |
25862306a36Sopenharmony_ci				  CX25840_NONE0_CH3,
25962306a36Sopenharmony_ci		}, {
26062306a36Sopenharmony_ci			.type	= CX23885_VMUX_COMPOSITE1,
26162306a36Sopenharmony_ci			.vmux	= CX25840_COMPOSITE1,
26262306a36Sopenharmony_ci		}, {
26362306a36Sopenharmony_ci			.type	= CX23885_VMUX_SVIDEO,
26462306a36Sopenharmony_ci			.vmux	= CX25840_SVIDEO_LUMA3 |
26562306a36Sopenharmony_ci				  CX25840_SVIDEO_CHROMA4,
26662306a36Sopenharmony_ci		}, {
26762306a36Sopenharmony_ci			.type	= CX23885_VMUX_COMPONENT,
26862306a36Sopenharmony_ci			.vmux	= CX25840_VIN7_CH1 |
26962306a36Sopenharmony_ci				  CX25840_VIN6_CH2 |
27062306a36Sopenharmony_ci				  CX25840_VIN8_CH3 |
27162306a36Sopenharmony_ci				  CX25840_COMPONENT_ON,
27262306a36Sopenharmony_ci		} },
27362306a36Sopenharmony_ci	},
27462306a36Sopenharmony_ci	[CX23885_BOARD_COMPRO_VIDEOMATE_E650F] = {
27562306a36Sopenharmony_ci		.name		= "Compro VideoMate E650F",
27662306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
27762306a36Sopenharmony_ci	},
27862306a36Sopenharmony_ci	[CX23885_BOARD_TBS_6920] = {
27962306a36Sopenharmony_ci		.name		= "TurboSight TBS 6920",
28062306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
28162306a36Sopenharmony_ci	},
28262306a36Sopenharmony_ci	[CX23885_BOARD_TBS_6980] = {
28362306a36Sopenharmony_ci		.name		= "TurboSight TBS 6980",
28462306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
28562306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
28662306a36Sopenharmony_ci	},
28762306a36Sopenharmony_ci	[CX23885_BOARD_TBS_6981] = {
28862306a36Sopenharmony_ci		.name		= "TurboSight TBS 6981",
28962306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
29062306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
29162306a36Sopenharmony_ci	},
29262306a36Sopenharmony_ci	[CX23885_BOARD_TEVII_S470] = {
29362306a36Sopenharmony_ci		.name		= "TeVii S470",
29462306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
29562306a36Sopenharmony_ci	},
29662306a36Sopenharmony_ci	[CX23885_BOARD_DVBWORLD_2005] = {
29762306a36Sopenharmony_ci		.name		= "DVBWorld DVB-S2 2005",
29862306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
29962306a36Sopenharmony_ci	},
30062306a36Sopenharmony_ci	[CX23885_BOARD_NETUP_DUAL_DVBS2_CI] = {
30162306a36Sopenharmony_ci		.ci_type	= 1,
30262306a36Sopenharmony_ci		.name		= "NetUP Dual DVB-S2 CI",
30362306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
30462306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
30562306a36Sopenharmony_ci	},
30662306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1270] = {
30762306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1270",
30862306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
30962306a36Sopenharmony_ci	},
31062306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1275] = {
31162306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1275",
31262306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
31362306a36Sopenharmony_ci	},
31462306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1255] = {
31562306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1255",
31662306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
31762306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
31862306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
31962306a36Sopenharmony_ci		.tuner_addr	= 0x42, /* 0x84 >> 1 */
32062306a36Sopenharmony_ci		.force_bff	= 1,
32162306a36Sopenharmony_ci		.input          = {{
32262306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
32362306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
32462306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
32562306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
32662306a36Sopenharmony_ci					CX25840_DIF_ON,
32762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
32862306a36Sopenharmony_ci		}, {
32962306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
33062306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
33162306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
33262306a36Sopenharmony_ci					CX25840_VIN6_CH1,
33362306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
33462306a36Sopenharmony_ci		}, {
33562306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
33662306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
33762306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
33862306a36Sopenharmony_ci					CX25840_VIN8_CH1 |
33962306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
34062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
34162306a36Sopenharmony_ci		} },
34262306a36Sopenharmony_ci	},
34362306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1255_22111] = {
34462306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1255",
34562306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
34662306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
34762306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
34862306a36Sopenharmony_ci		.tuner_addr	= 0x42, /* 0x84 >> 1 */
34962306a36Sopenharmony_ci		.force_bff	= 1,
35062306a36Sopenharmony_ci		.input          = {{
35162306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
35262306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
35362306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
35462306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
35562306a36Sopenharmony_ci					CX25840_DIF_ON,
35662306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
35762306a36Sopenharmony_ci		}, {
35862306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
35962306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
36062306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
36162306a36Sopenharmony_ci					CX25840_VIN8_CH1 |
36262306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
36362306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
36462306a36Sopenharmony_ci		} },
36562306a36Sopenharmony_ci	},
36662306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1210] = {
36762306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1210",
36862306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
36962306a36Sopenharmony_ci	},
37062306a36Sopenharmony_ci	[CX23885_BOARD_MYGICA_X8506] = {
37162306a36Sopenharmony_ci		.name		= "Mygica X8506 DMB-TH",
37262306a36Sopenharmony_ci		.tuner_type = TUNER_XC5000,
37362306a36Sopenharmony_ci		.tuner_addr = 0x61,
37462306a36Sopenharmony_ci		.tuner_bus	= 1,
37562306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
37662306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
37762306a36Sopenharmony_ci		.input		= {
37862306a36Sopenharmony_ci			{
37962306a36Sopenharmony_ci				.type   = CX23885_VMUX_TELEVISION,
38062306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE2,
38162306a36Sopenharmony_ci			},
38262306a36Sopenharmony_ci			{
38362306a36Sopenharmony_ci				.type   = CX23885_VMUX_COMPOSITE1,
38462306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE8,
38562306a36Sopenharmony_ci			},
38662306a36Sopenharmony_ci			{
38762306a36Sopenharmony_ci				.type   = CX23885_VMUX_SVIDEO,
38862306a36Sopenharmony_ci				.vmux   = CX25840_SVIDEO_LUMA3 |
38962306a36Sopenharmony_ci						CX25840_SVIDEO_CHROMA4,
39062306a36Sopenharmony_ci			},
39162306a36Sopenharmony_ci			{
39262306a36Sopenharmony_ci				.type   = CX23885_VMUX_COMPONENT,
39362306a36Sopenharmony_ci				.vmux   = CX25840_COMPONENT_ON |
39462306a36Sopenharmony_ci					CX25840_VIN1_CH1 |
39562306a36Sopenharmony_ci					CX25840_VIN6_CH2 |
39662306a36Sopenharmony_ci					CX25840_VIN7_CH3,
39762306a36Sopenharmony_ci			},
39862306a36Sopenharmony_ci		},
39962306a36Sopenharmony_ci	},
40062306a36Sopenharmony_ci	[CX23885_BOARD_MAGICPRO_PROHDTVE2] = {
40162306a36Sopenharmony_ci		.name		= "Magic-Pro ProHDTV Extreme 2",
40262306a36Sopenharmony_ci		.tuner_type = TUNER_XC5000,
40362306a36Sopenharmony_ci		.tuner_addr = 0x61,
40462306a36Sopenharmony_ci		.tuner_bus	= 1,
40562306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
40662306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
40762306a36Sopenharmony_ci		.input		= {
40862306a36Sopenharmony_ci			{
40962306a36Sopenharmony_ci				.type   = CX23885_VMUX_TELEVISION,
41062306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE2,
41162306a36Sopenharmony_ci			},
41262306a36Sopenharmony_ci			{
41362306a36Sopenharmony_ci				.type   = CX23885_VMUX_COMPOSITE1,
41462306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE8,
41562306a36Sopenharmony_ci			},
41662306a36Sopenharmony_ci			{
41762306a36Sopenharmony_ci				.type   = CX23885_VMUX_SVIDEO,
41862306a36Sopenharmony_ci				.vmux   = CX25840_SVIDEO_LUMA3 |
41962306a36Sopenharmony_ci						CX25840_SVIDEO_CHROMA4,
42062306a36Sopenharmony_ci			},
42162306a36Sopenharmony_ci			{
42262306a36Sopenharmony_ci				.type   = CX23885_VMUX_COMPONENT,
42362306a36Sopenharmony_ci				.vmux   = CX25840_COMPONENT_ON |
42462306a36Sopenharmony_ci					CX25840_VIN1_CH1 |
42562306a36Sopenharmony_ci					CX25840_VIN6_CH2 |
42662306a36Sopenharmony_ci					CX25840_VIN7_CH3,
42762306a36Sopenharmony_ci			},
42862306a36Sopenharmony_ci		},
42962306a36Sopenharmony_ci	},
43062306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1850] = {
43162306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1850",
43262306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
43362306a36Sopenharmony_ci		.portb		= CX23885_MPEG_ENCODER,
43462306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
43562306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
43662306a36Sopenharmony_ci		.tuner_addr	= 0x42, /* 0x84 >> 1 */
43762306a36Sopenharmony_ci		.force_bff	= 1,
43862306a36Sopenharmony_ci		.input          = {{
43962306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
44062306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
44162306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
44262306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
44362306a36Sopenharmony_ci					CX25840_DIF_ON,
44462306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
44562306a36Sopenharmony_ci		}, {
44662306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
44762306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
44862306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
44962306a36Sopenharmony_ci					CX25840_VIN6_CH1,
45062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
45162306a36Sopenharmony_ci		}, {
45262306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
45362306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
45462306a36Sopenharmony_ci					CX25840_VIN4_CH2 |
45562306a36Sopenharmony_ci					CX25840_VIN8_CH1 |
45662306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
45762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
45862306a36Sopenharmony_ci		} },
45962306a36Sopenharmony_ci	},
46062306a36Sopenharmony_ci	[CX23885_BOARD_COMPRO_VIDEOMATE_E800] = {
46162306a36Sopenharmony_ci		.name		= "Compro VideoMate E800",
46262306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
46362306a36Sopenharmony_ci	},
46462306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1290] = {
46562306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR1290",
46662306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
46762306a36Sopenharmony_ci	},
46862306a36Sopenharmony_ci	[CX23885_BOARD_MYGICA_X8558PRO] = {
46962306a36Sopenharmony_ci		.name		= "Mygica X8558 PRO DMB-TH",
47062306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
47162306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
47262306a36Sopenharmony_ci	},
47362306a36Sopenharmony_ci	[CX23885_BOARD_LEADTEK_WINFAST_PXTV1200] = {
47462306a36Sopenharmony_ci		.name           = "LEADTEK WinFast PxTV1200",
47562306a36Sopenharmony_ci		.porta          = CX23885_ANALOG_VIDEO,
47662306a36Sopenharmony_ci		.tuner_type     = TUNER_XC2028,
47762306a36Sopenharmony_ci		.tuner_addr     = 0x61,
47862306a36Sopenharmony_ci		.tuner_bus	= 1,
47962306a36Sopenharmony_ci		.input          = {{
48062306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
48162306a36Sopenharmony_ci			.vmux   = CX25840_VIN2_CH1 |
48262306a36Sopenharmony_ci				  CX25840_VIN5_CH2 |
48362306a36Sopenharmony_ci				  CX25840_NONE0_CH3,
48462306a36Sopenharmony_ci		}, {
48562306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
48662306a36Sopenharmony_ci			.vmux   = CX25840_COMPOSITE1,
48762306a36Sopenharmony_ci		}, {
48862306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
48962306a36Sopenharmony_ci			.vmux   = CX25840_SVIDEO_LUMA3 |
49062306a36Sopenharmony_ci				  CX25840_SVIDEO_CHROMA4,
49162306a36Sopenharmony_ci		}, {
49262306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPONENT,
49362306a36Sopenharmony_ci			.vmux   = CX25840_VIN7_CH1 |
49462306a36Sopenharmony_ci				  CX25840_VIN6_CH2 |
49562306a36Sopenharmony_ci				  CX25840_VIN8_CH3 |
49662306a36Sopenharmony_ci				  CX25840_COMPONENT_ON,
49762306a36Sopenharmony_ci		} },
49862306a36Sopenharmony_ci	},
49962306a36Sopenharmony_ci	[CX23885_BOARD_GOTVIEW_X5_3D_HYBRID] = {
50062306a36Sopenharmony_ci		.name		= "GoTView X5 3D Hybrid",
50162306a36Sopenharmony_ci		.tuner_type	= TUNER_XC5000,
50262306a36Sopenharmony_ci		.tuner_addr	= 0x64,
50362306a36Sopenharmony_ci		.tuner_bus	= 1,
50462306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
50562306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
50662306a36Sopenharmony_ci		.input          = {{
50762306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
50862306a36Sopenharmony_ci			.vmux   = CX25840_VIN2_CH1 |
50962306a36Sopenharmony_ci				  CX25840_VIN5_CH2,
51062306a36Sopenharmony_ci			.gpio0	= 0x02,
51162306a36Sopenharmony_ci		}, {
51262306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
51362306a36Sopenharmony_ci			.vmux   = CX23885_VMUX_COMPOSITE1,
51462306a36Sopenharmony_ci		}, {
51562306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
51662306a36Sopenharmony_ci			.vmux   = CX25840_SVIDEO_LUMA3 |
51762306a36Sopenharmony_ci				  CX25840_SVIDEO_CHROMA4,
51862306a36Sopenharmony_ci		} },
51962306a36Sopenharmony_ci	},
52062306a36Sopenharmony_ci	[CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF] = {
52162306a36Sopenharmony_ci		.ci_type	= 2,
52262306a36Sopenharmony_ci		.name		= "NetUP Dual DVB-T/C-CI RF",
52362306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
52462306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
52562306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
52662306a36Sopenharmony_ci		.num_fds_portb	= 2,
52762306a36Sopenharmony_ci		.num_fds_portc	= 2,
52862306a36Sopenharmony_ci		.tuner_type	= TUNER_XC5000,
52962306a36Sopenharmony_ci		.tuner_addr	= 0x64,
53062306a36Sopenharmony_ci		.input          = { {
53162306a36Sopenharmony_ci				.type   = CX23885_VMUX_TELEVISION,
53262306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE1,
53362306a36Sopenharmony_ci		} },
53462306a36Sopenharmony_ci	},
53562306a36Sopenharmony_ci	[CX23885_BOARD_MPX885] = {
53662306a36Sopenharmony_ci		.name		= "MPX-885",
53762306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
53862306a36Sopenharmony_ci		.input          = {{
53962306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
54062306a36Sopenharmony_ci			.vmux   = CX25840_COMPOSITE1,
54162306a36Sopenharmony_ci			.amux   = CX25840_AUDIO6,
54262306a36Sopenharmony_ci			.gpio0  = 0,
54362306a36Sopenharmony_ci		}, {
54462306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE2,
54562306a36Sopenharmony_ci			.vmux   = CX25840_COMPOSITE2,
54662306a36Sopenharmony_ci			.amux   = CX25840_AUDIO6,
54762306a36Sopenharmony_ci			.gpio0  = 0,
54862306a36Sopenharmony_ci		}, {
54962306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE3,
55062306a36Sopenharmony_ci			.vmux   = CX25840_COMPOSITE3,
55162306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
55262306a36Sopenharmony_ci			.gpio0  = 0,
55362306a36Sopenharmony_ci		}, {
55462306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE4,
55562306a36Sopenharmony_ci			.vmux   = CX25840_COMPOSITE4,
55662306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
55762306a36Sopenharmony_ci			.gpio0  = 0,
55862306a36Sopenharmony_ci		} },
55962306a36Sopenharmony_ci	},
56062306a36Sopenharmony_ci	[CX23885_BOARD_MYGICA_X8507] = {
56162306a36Sopenharmony_ci		.name		= "Mygica X8502/X8507 ISDB-T",
56262306a36Sopenharmony_ci		.tuner_type = TUNER_XC5000,
56362306a36Sopenharmony_ci		.tuner_addr = 0x61,
56462306a36Sopenharmony_ci		.tuner_bus	= 1,
56562306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
56662306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
56762306a36Sopenharmony_ci		.input		= {
56862306a36Sopenharmony_ci			{
56962306a36Sopenharmony_ci				.type   = CX23885_VMUX_TELEVISION,
57062306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE2,
57162306a36Sopenharmony_ci				.amux   = CX25840_AUDIO8,
57262306a36Sopenharmony_ci			},
57362306a36Sopenharmony_ci			{
57462306a36Sopenharmony_ci				.type   = CX23885_VMUX_COMPOSITE1,
57562306a36Sopenharmony_ci				.vmux   = CX25840_COMPOSITE8,
57662306a36Sopenharmony_ci				.amux   = CX25840_AUDIO7,
57762306a36Sopenharmony_ci			},
57862306a36Sopenharmony_ci			{
57962306a36Sopenharmony_ci				.type   = CX23885_VMUX_SVIDEO,
58062306a36Sopenharmony_ci				.vmux   = CX25840_SVIDEO_LUMA3 |
58162306a36Sopenharmony_ci						CX25840_SVIDEO_CHROMA4,
58262306a36Sopenharmony_ci				.amux   = CX25840_AUDIO7,
58362306a36Sopenharmony_ci			},
58462306a36Sopenharmony_ci			{
58562306a36Sopenharmony_ci				.type   = CX23885_VMUX_COMPONENT,
58662306a36Sopenharmony_ci				.vmux   = CX25840_COMPONENT_ON |
58762306a36Sopenharmony_ci					CX25840_VIN1_CH1 |
58862306a36Sopenharmony_ci					CX25840_VIN6_CH2 |
58962306a36Sopenharmony_ci					CX25840_VIN7_CH3,
59062306a36Sopenharmony_ci				.amux   = CX25840_AUDIO7,
59162306a36Sopenharmony_ci			},
59262306a36Sopenharmony_ci		},
59362306a36Sopenharmony_ci	},
59462306a36Sopenharmony_ci	[CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL] = {
59562306a36Sopenharmony_ci		.name		= "TerraTec Cinergy T PCIe Dual",
59662306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
59762306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
59862306a36Sopenharmony_ci	},
59962306a36Sopenharmony_ci	[CX23885_BOARD_TEVII_S471] = {
60062306a36Sopenharmony_ci		.name		= "TeVii S471",
60162306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
60262306a36Sopenharmony_ci	},
60362306a36Sopenharmony_ci	[CX23885_BOARD_PROF_8000] = {
60462306a36Sopenharmony_ci		.name		= "Prof Revolution DVB-S2 8000",
60562306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
60662306a36Sopenharmony_ci	},
60762306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR4400] = {
60862306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR4400/HVR5500",
60962306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
61062306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
61162306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
61262306a36Sopenharmony_ci		.tuner_type	= TUNER_NXP_TDA18271,
61362306a36Sopenharmony_ci		.tuner_addr	= 0x60, /* 0xc0 >> 1 */
61462306a36Sopenharmony_ci		.tuner_bus	= 1,
61562306a36Sopenharmony_ci	},
61662306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_STARBURST] = {
61762306a36Sopenharmony_ci		.name		= "Hauppauge WinTV Starburst",
61862306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
61962306a36Sopenharmony_ci	},
62062306a36Sopenharmony_ci	[CX23885_BOARD_AVERMEDIA_HC81R] = {
62162306a36Sopenharmony_ci		.name		= "AVerTV Hybrid Express Slim HC81R",
62262306a36Sopenharmony_ci		.tuner_type	= TUNER_XC2028,
62362306a36Sopenharmony_ci		.tuner_addr	= 0x61, /* 0xc2 >> 1 */
62462306a36Sopenharmony_ci		.tuner_bus	= 1,
62562306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
62662306a36Sopenharmony_ci		.input          = {{
62762306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
62862306a36Sopenharmony_ci			.vmux   = CX25840_VIN2_CH1 |
62962306a36Sopenharmony_ci				  CX25840_VIN5_CH2 |
63062306a36Sopenharmony_ci				  CX25840_NONE0_CH3 |
63162306a36Sopenharmony_ci				  CX25840_NONE1_CH3,
63262306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
63362306a36Sopenharmony_ci		}, {
63462306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
63562306a36Sopenharmony_ci			.vmux   = CX25840_VIN8_CH1 |
63662306a36Sopenharmony_ci				  CX25840_NONE_CH2 |
63762306a36Sopenharmony_ci				  CX25840_VIN7_CH3 |
63862306a36Sopenharmony_ci				  CX25840_SVIDEO_ON,
63962306a36Sopenharmony_ci			.amux   = CX25840_AUDIO6,
64062306a36Sopenharmony_ci		}, {
64162306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPONENT,
64262306a36Sopenharmony_ci			.vmux   = CX25840_VIN1_CH1 |
64362306a36Sopenharmony_ci				  CX25840_NONE_CH2 |
64462306a36Sopenharmony_ci				  CX25840_NONE0_CH3 |
64562306a36Sopenharmony_ci				  CX25840_NONE1_CH3,
64662306a36Sopenharmony_ci			.amux   = CX25840_AUDIO6,
64762306a36Sopenharmony_ci		} },
64862306a36Sopenharmony_ci	},
64962306a36Sopenharmony_ci	[CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2] = {
65062306a36Sopenharmony_ci		.name		= "DViCO FusionHDTV DVB-T Dual Express2",
65162306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
65262306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
65362306a36Sopenharmony_ci	},
65462306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_IMPACTVCBE] = {
65562306a36Sopenharmony_ci		.name		= "Hauppauge ImpactVCB-e",
65662306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
65762306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
65862306a36Sopenharmony_ci		.input          = {{
65962306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
66062306a36Sopenharmony_ci			.vmux   = CX25840_VIN6_CH1,
66162306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
66262306a36Sopenharmony_ci		}, {
66362306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
66462306a36Sopenharmony_ci			.vmux   = CX25840_VIN4_CH2 |
66562306a36Sopenharmony_ci				  CX25840_VIN8_CH1 |
66662306a36Sopenharmony_ci				  CX25840_SVIDEO_ON,
66762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
66862306a36Sopenharmony_ci		} },
66962306a36Sopenharmony_ci	},
67062306a36Sopenharmony_ci	[CX23885_BOARD_DVBSKY_T9580] = {
67162306a36Sopenharmony_ci		.name		= "DVBSky T9580",
67262306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
67362306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
67462306a36Sopenharmony_ci	},
67562306a36Sopenharmony_ci	[CX23885_BOARD_DVBSKY_T980C] = {
67662306a36Sopenharmony_ci		.name		= "DVBSky T980C",
67762306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
67862306a36Sopenharmony_ci	},
67962306a36Sopenharmony_ci	[CX23885_BOARD_DVBSKY_S950C] = {
68062306a36Sopenharmony_ci		.name		= "DVBSky S950C",
68162306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
68262306a36Sopenharmony_ci	},
68362306a36Sopenharmony_ci	[CX23885_BOARD_TT_CT2_4500_CI] = {
68462306a36Sopenharmony_ci		.name		= "Technotrend TT-budget CT2-4500 CI",
68562306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
68662306a36Sopenharmony_ci	},
68762306a36Sopenharmony_ci	[CX23885_BOARD_DVBSKY_S950] = {
68862306a36Sopenharmony_ci		.name		= "DVBSky S950",
68962306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
69062306a36Sopenharmony_ci	},
69162306a36Sopenharmony_ci	[CX23885_BOARD_DVBSKY_S952] = {
69262306a36Sopenharmony_ci		.name		= "DVBSky S952",
69362306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
69462306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
69562306a36Sopenharmony_ci	},
69662306a36Sopenharmony_ci	[CX23885_BOARD_DVBSKY_T982] = {
69762306a36Sopenharmony_ci		.name		= "DVBSky T982",
69862306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
69962306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
70062306a36Sopenharmony_ci	},
70162306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR5525] = {
70262306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR5525",
70362306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
70462306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
70562306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
70662306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
70762306a36Sopenharmony_ci		.force_bff	= 1,
70862306a36Sopenharmony_ci		.input		= {{
70962306a36Sopenharmony_ci			.type	= CX23885_VMUX_TELEVISION,
71062306a36Sopenharmony_ci			.vmux	=	CX25840_VIN7_CH3 |
71162306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
71262306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
71362306a36Sopenharmony_ci					CX25840_DIF_ON,
71462306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
71562306a36Sopenharmony_ci		}, {
71662306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
71762306a36Sopenharmony_ci			.vmux   = CX25840_VIN6_CH1,
71862306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
71962306a36Sopenharmony_ci		}, {
72062306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
72162306a36Sopenharmony_ci			.vmux   = CX25840_VIN7_CH3 |
72262306a36Sopenharmony_ci				  CX25840_VIN8_CH1 |
72362306a36Sopenharmony_ci				  CX25840_SVIDEO_ON,
72462306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
72562306a36Sopenharmony_ci		} },
72662306a36Sopenharmony_ci	},
72762306a36Sopenharmony_ci	[CX23885_BOARD_VIEWCAST_260E] = {
72862306a36Sopenharmony_ci		.name		= "ViewCast 260e",
72962306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
73062306a36Sopenharmony_ci		.force_bff	= 1,
73162306a36Sopenharmony_ci		.input          = {{
73262306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
73362306a36Sopenharmony_ci			.vmux   = CX25840_VIN6_CH1,
73462306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
73562306a36Sopenharmony_ci		}, {
73662306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
73762306a36Sopenharmony_ci			.vmux   = CX25840_VIN7_CH3 |
73862306a36Sopenharmony_ci					CX25840_VIN5_CH1 |
73962306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
74062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
74162306a36Sopenharmony_ci		}, {
74262306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPONENT,
74362306a36Sopenharmony_ci			.vmux   = CX25840_VIN7_CH3 |
74462306a36Sopenharmony_ci					CX25840_VIN6_CH2 |
74562306a36Sopenharmony_ci					CX25840_VIN5_CH1 |
74662306a36Sopenharmony_ci					CX25840_COMPONENT_ON,
74762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
74862306a36Sopenharmony_ci		} },
74962306a36Sopenharmony_ci	},
75062306a36Sopenharmony_ci	[CX23885_BOARD_VIEWCAST_460E] = {
75162306a36Sopenharmony_ci		.name		= "ViewCast 460e",
75262306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
75362306a36Sopenharmony_ci		.force_bff	= 1,
75462306a36Sopenharmony_ci		.input          = {{
75562306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
75662306a36Sopenharmony_ci			.vmux   = CX25840_VIN4_CH1,
75762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
75862306a36Sopenharmony_ci		}, {
75962306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
76062306a36Sopenharmony_ci			.vmux   = CX25840_VIN7_CH3 |
76162306a36Sopenharmony_ci					CX25840_VIN6_CH1 |
76262306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
76362306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
76462306a36Sopenharmony_ci		}, {
76562306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPONENT,
76662306a36Sopenharmony_ci			.vmux   = CX25840_VIN7_CH3 |
76762306a36Sopenharmony_ci					CX25840_VIN6_CH1 |
76862306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
76962306a36Sopenharmony_ci					CX25840_COMPONENT_ON,
77062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
77162306a36Sopenharmony_ci		}, {
77262306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE2,
77362306a36Sopenharmony_ci			.vmux   = CX25840_VIN6_CH1,
77462306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
77562306a36Sopenharmony_ci		} },
77662306a36Sopenharmony_ci	},
77762306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_QUADHD_DVB] = {
77862306a36Sopenharmony_ci		.name         = "Hauppauge WinTV-QuadHD-DVB",
77962306a36Sopenharmony_ci		.porta        = CX23885_ANALOG_VIDEO,
78062306a36Sopenharmony_ci		.portb        = CX23885_MPEG_DVB,
78162306a36Sopenharmony_ci		.portc        = CX23885_MPEG_DVB,
78262306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
78362306a36Sopenharmony_ci		.force_bff	= 1,
78462306a36Sopenharmony_ci		.input          = {{
78562306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
78662306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
78762306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
78862306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
78962306a36Sopenharmony_ci					CX25840_DIF_ON,
79062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
79162306a36Sopenharmony_ci		} },
79262306a36Sopenharmony_ci	},
79362306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885] = {
79462306a36Sopenharmony_ci		.name         = "Hauppauge WinTV-QuadHD-DVB(885)",
79562306a36Sopenharmony_ci		.portb        = CX23885_MPEG_DVB,
79662306a36Sopenharmony_ci		.portc        = CX23885_MPEG_DVB,
79762306a36Sopenharmony_ci		.tuner_type   = TUNER_ABSENT,
79862306a36Sopenharmony_ci	},
79962306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC] = {
80062306a36Sopenharmony_ci		.name         = "Hauppauge WinTV-QuadHD-ATSC",
80162306a36Sopenharmony_ci		.porta        = CX23885_ANALOG_VIDEO,
80262306a36Sopenharmony_ci		.portb        = CX23885_MPEG_DVB,
80362306a36Sopenharmony_ci		.portc        = CX23885_MPEG_DVB,
80462306a36Sopenharmony_ci		.tuner_type	= TUNER_ABSENT,
80562306a36Sopenharmony_ci		.input          = {{
80662306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
80762306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
80862306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
80962306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
81062306a36Sopenharmony_ci					CX25840_DIF_ON,
81162306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
81262306a36Sopenharmony_ci		} },
81362306a36Sopenharmony_ci	},
81462306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885] = {
81562306a36Sopenharmony_ci		.name         = "Hauppauge WinTV-QuadHD-ATSC(885)",
81662306a36Sopenharmony_ci		.portb        = CX23885_MPEG_DVB,
81762306a36Sopenharmony_ci		.portc        = CX23885_MPEG_DVB,
81862306a36Sopenharmony_ci		.tuner_type   = TUNER_ABSENT,
81962306a36Sopenharmony_ci	},
82062306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_HVR1265_K4] = {
82162306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-HVR-1265(161111)",
82262306a36Sopenharmony_ci		.porta          = CX23885_ANALOG_VIDEO,
82362306a36Sopenharmony_ci		.portc		= CX23885_MPEG_DVB,
82462306a36Sopenharmony_ci		.tuner_type     = TUNER_ABSENT,
82562306a36Sopenharmony_ci		.input          = {{
82662306a36Sopenharmony_ci			.type   = CX23885_VMUX_TELEVISION,
82762306a36Sopenharmony_ci			.vmux   =	CX25840_VIN7_CH3 |
82862306a36Sopenharmony_ci					CX25840_VIN5_CH2 |
82962306a36Sopenharmony_ci					CX25840_VIN2_CH1 |
83062306a36Sopenharmony_ci					CX25840_DIF_ON,
83162306a36Sopenharmony_ci			.amux   = CX25840_AUDIO8,
83262306a36Sopenharmony_ci		}, {
83362306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
83462306a36Sopenharmony_ci			.vmux   =	CX25840_VIN4_CH2 |
83562306a36Sopenharmony_ci					CX25840_VIN6_CH1 |
83662306a36Sopenharmony_ci					CX25840_SVIDEO_ON,
83762306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
83862306a36Sopenharmony_ci		} },
83962306a36Sopenharmony_ci	},
84062306a36Sopenharmony_ci	[CX23885_BOARD_HAUPPAUGE_STARBURST2] = {
84162306a36Sopenharmony_ci		.name		= "Hauppauge WinTV-Starburst2",
84262306a36Sopenharmony_ci		.portb		= CX23885_MPEG_DVB,
84362306a36Sopenharmony_ci	},
84462306a36Sopenharmony_ci	[CX23885_BOARD_AVERMEDIA_CE310B] = {
84562306a36Sopenharmony_ci		.name		= "AVerMedia CE310B",
84662306a36Sopenharmony_ci		.porta		= CX23885_ANALOG_VIDEO,
84762306a36Sopenharmony_ci		.force_bff	= 1,
84862306a36Sopenharmony_ci		.input          = {{
84962306a36Sopenharmony_ci			.type   = CX23885_VMUX_COMPOSITE1,
85062306a36Sopenharmony_ci			.vmux   = CX25840_VIN1_CH1 |
85162306a36Sopenharmony_ci				  CX25840_NONE_CH2 |
85262306a36Sopenharmony_ci				  CX25840_NONE0_CH3,
85362306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
85462306a36Sopenharmony_ci		}, {
85562306a36Sopenharmony_ci			.type   = CX23885_VMUX_SVIDEO,
85662306a36Sopenharmony_ci			.vmux   = CX25840_VIN8_CH1 |
85762306a36Sopenharmony_ci				  CX25840_NONE_CH2 |
85862306a36Sopenharmony_ci				  CX25840_VIN7_CH3 |
85962306a36Sopenharmony_ci				  CX25840_SVIDEO_ON,
86062306a36Sopenharmony_ci			.amux   = CX25840_AUDIO7,
86162306a36Sopenharmony_ci		} },
86262306a36Sopenharmony_ci	},
86362306a36Sopenharmony_ci};
86462306a36Sopenharmony_ciconst unsigned int cx23885_bcount = ARRAY_SIZE(cx23885_boards);
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci/* ------------------------------------------------------------------ */
86762306a36Sopenharmony_ci/* PCI subsystem IDs                                                  */
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_cistruct cx23885_subid cx23885_subids[] = {
87062306a36Sopenharmony_ci	{
87162306a36Sopenharmony_ci		.subvendor = 0x0070,
87262306a36Sopenharmony_ci		.subdevice = 0x3400,
87362306a36Sopenharmony_ci		.card      = CX23885_BOARD_UNKNOWN,
87462306a36Sopenharmony_ci	}, {
87562306a36Sopenharmony_ci		.subvendor = 0x0070,
87662306a36Sopenharmony_ci		.subdevice = 0x7600,
87762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800lp,
87862306a36Sopenharmony_ci	}, {
87962306a36Sopenharmony_ci		.subvendor = 0x0070,
88062306a36Sopenharmony_ci		.subdevice = 0x7800,
88162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
88262306a36Sopenharmony_ci	}, {
88362306a36Sopenharmony_ci		.subvendor = 0x0070,
88462306a36Sopenharmony_ci		.subdevice = 0x7801,
88562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
88662306a36Sopenharmony_ci	}, {
88762306a36Sopenharmony_ci		.subvendor = 0x0070,
88862306a36Sopenharmony_ci		.subdevice = 0x7809,
88962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1800,
89062306a36Sopenharmony_ci	}, {
89162306a36Sopenharmony_ci		.subvendor = 0x0070,
89262306a36Sopenharmony_ci		.subdevice = 0x7911,
89362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1250,
89462306a36Sopenharmony_ci	}, {
89562306a36Sopenharmony_ci		.subvendor = 0x18ac,
89662306a36Sopenharmony_ci		.subdevice = 0xd500,
89762306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP,
89862306a36Sopenharmony_ci	}, {
89962306a36Sopenharmony_ci		.subvendor = 0x0070,
90062306a36Sopenharmony_ci		.subdevice = 0x7790,
90162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
90262306a36Sopenharmony_ci	}, {
90362306a36Sopenharmony_ci		.subvendor = 0x0070,
90462306a36Sopenharmony_ci		.subdevice = 0x7797,
90562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500Q,
90662306a36Sopenharmony_ci	}, {
90762306a36Sopenharmony_ci		.subvendor = 0x0070,
90862306a36Sopenharmony_ci		.subdevice = 0x7710,
90962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
91062306a36Sopenharmony_ci	}, {
91162306a36Sopenharmony_ci		.subvendor = 0x0070,
91262306a36Sopenharmony_ci		.subdevice = 0x7717,
91362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1500,
91462306a36Sopenharmony_ci	}, {
91562306a36Sopenharmony_ci		.subvendor = 0x0070,
91662306a36Sopenharmony_ci		.subdevice = 0x71d1,
91762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1200,
91862306a36Sopenharmony_ci	}, {
91962306a36Sopenharmony_ci		.subvendor = 0x0070,
92062306a36Sopenharmony_ci		.subdevice = 0x71d3,
92162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1200,
92262306a36Sopenharmony_ci	}, {
92362306a36Sopenharmony_ci		.subvendor = 0x0070,
92462306a36Sopenharmony_ci		.subdevice = 0x8101,
92562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1700,
92662306a36Sopenharmony_ci	}, {
92762306a36Sopenharmony_ci		.subvendor = 0x0070,
92862306a36Sopenharmony_ci		.subdevice = 0x8010,
92962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1400,
93062306a36Sopenharmony_ci	}, {
93162306a36Sopenharmony_ci		.subvendor = 0x18ac,
93262306a36Sopenharmony_ci		.subdevice = 0xd618,
93362306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP,
93462306a36Sopenharmony_ci	}, {
93562306a36Sopenharmony_ci		.subvendor = 0x18ac,
93662306a36Sopenharmony_ci		.subdevice = 0xdb78,
93762306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP,
93862306a36Sopenharmony_ci	}, {
93962306a36Sopenharmony_ci		.subvendor = 0x107d,
94062306a36Sopenharmony_ci		.subdevice = 0x6681,
94162306a36Sopenharmony_ci		.card      = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H,
94262306a36Sopenharmony_ci	}, {
94362306a36Sopenharmony_ci		.subvendor = 0x107d,
94462306a36Sopenharmony_ci		.subdevice = 0x6f21,
94562306a36Sopenharmony_ci		.card      = CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200,
94662306a36Sopenharmony_ci	}, {
94762306a36Sopenharmony_ci		.subvendor = 0x107d,
94862306a36Sopenharmony_ci		.subdevice = 0x6f39,
94962306a36Sopenharmony_ci		.card	   = CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000,
95062306a36Sopenharmony_ci	}, {
95162306a36Sopenharmony_ci		.subvendor = 0x185b,
95262306a36Sopenharmony_ci		.subdevice = 0xe800,
95362306a36Sopenharmony_ci		.card      = CX23885_BOARD_COMPRO_VIDEOMATE_E650F,
95462306a36Sopenharmony_ci	}, {
95562306a36Sopenharmony_ci		.subvendor = 0x6920,
95662306a36Sopenharmony_ci		.subdevice = 0x8888,
95762306a36Sopenharmony_ci		.card      = CX23885_BOARD_TBS_6920,
95862306a36Sopenharmony_ci	}, {
95962306a36Sopenharmony_ci		.subvendor = 0x6980,
96062306a36Sopenharmony_ci		.subdevice = 0x8888,
96162306a36Sopenharmony_ci		.card      = CX23885_BOARD_TBS_6980,
96262306a36Sopenharmony_ci	}, {
96362306a36Sopenharmony_ci		.subvendor = 0x6981,
96462306a36Sopenharmony_ci		.subdevice = 0x8888,
96562306a36Sopenharmony_ci		.card      = CX23885_BOARD_TBS_6981,
96662306a36Sopenharmony_ci	}, {
96762306a36Sopenharmony_ci		.subvendor = 0xd470,
96862306a36Sopenharmony_ci		.subdevice = 0x9022,
96962306a36Sopenharmony_ci		.card      = CX23885_BOARD_TEVII_S470,
97062306a36Sopenharmony_ci	}, {
97162306a36Sopenharmony_ci		.subvendor = 0x0001,
97262306a36Sopenharmony_ci		.subdevice = 0x2005,
97362306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBWORLD_2005,
97462306a36Sopenharmony_ci	}, {
97562306a36Sopenharmony_ci		.subvendor = 0x1b55,
97662306a36Sopenharmony_ci		.subdevice = 0x2a2c,
97762306a36Sopenharmony_ci		.card      = CX23885_BOARD_NETUP_DUAL_DVBS2_CI,
97862306a36Sopenharmony_ci	}, {
97962306a36Sopenharmony_ci		.subvendor = 0x0070,
98062306a36Sopenharmony_ci		.subdevice = 0x2211,
98162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1270,
98262306a36Sopenharmony_ci	}, {
98362306a36Sopenharmony_ci		.subvendor = 0x0070,
98462306a36Sopenharmony_ci		.subdevice = 0x2215,
98562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
98662306a36Sopenharmony_ci	}, {
98762306a36Sopenharmony_ci		.subvendor = 0x0070,
98862306a36Sopenharmony_ci		.subdevice = 0x221d,
98962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
99062306a36Sopenharmony_ci	}, {
99162306a36Sopenharmony_ci		.subvendor = 0x0070,
99262306a36Sopenharmony_ci		.subdevice = 0x2251,
99362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1255,
99462306a36Sopenharmony_ci	}, {
99562306a36Sopenharmony_ci		.subvendor = 0x0070,
99662306a36Sopenharmony_ci		.subdevice = 0x2259,
99762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1255_22111,
99862306a36Sopenharmony_ci	}, {
99962306a36Sopenharmony_ci		.subvendor = 0x0070,
100062306a36Sopenharmony_ci		.subdevice = 0x2291,
100162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
100262306a36Sopenharmony_ci	}, {
100362306a36Sopenharmony_ci		.subvendor = 0x0070,
100462306a36Sopenharmony_ci		.subdevice = 0x2295,
100562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
100662306a36Sopenharmony_ci	}, {
100762306a36Sopenharmony_ci		.subvendor = 0x0070,
100862306a36Sopenharmony_ci		.subdevice = 0x2299,
100962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
101062306a36Sopenharmony_ci	}, {
101162306a36Sopenharmony_ci		.subvendor = 0x0070,
101262306a36Sopenharmony_ci		.subdevice = 0x229d,
101362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
101462306a36Sopenharmony_ci	}, {
101562306a36Sopenharmony_ci		.subvendor = 0x0070,
101662306a36Sopenharmony_ci		.subdevice = 0x22f0,
101762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
101862306a36Sopenharmony_ci	}, {
101962306a36Sopenharmony_ci		.subvendor = 0x0070,
102062306a36Sopenharmony_ci		.subdevice = 0x22f1,
102162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1255,
102262306a36Sopenharmony_ci	}, {
102362306a36Sopenharmony_ci		.subvendor = 0x0070,
102462306a36Sopenharmony_ci		.subdevice = 0x22f2,
102562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1275,
102662306a36Sopenharmony_ci	}, {
102762306a36Sopenharmony_ci		.subvendor = 0x0070,
102862306a36Sopenharmony_ci		.subdevice = 0x22f3,
102962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
103062306a36Sopenharmony_ci	}, {
103162306a36Sopenharmony_ci		.subvendor = 0x0070,
103262306a36Sopenharmony_ci		.subdevice = 0x22f4,
103362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210,
103462306a36Sopenharmony_ci	}, {
103562306a36Sopenharmony_ci		.subvendor = 0x0070,
103662306a36Sopenharmony_ci		.subdevice = 0x22f5,
103762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1210, /* HVR1215 */
103862306a36Sopenharmony_ci	}, {
103962306a36Sopenharmony_ci		.subvendor = 0x14f1,
104062306a36Sopenharmony_ci		.subdevice = 0x8651,
104162306a36Sopenharmony_ci		.card      = CX23885_BOARD_MYGICA_X8506,
104262306a36Sopenharmony_ci	}, {
104362306a36Sopenharmony_ci		.subvendor = 0x14f1,
104462306a36Sopenharmony_ci		.subdevice = 0x8657,
104562306a36Sopenharmony_ci		.card      = CX23885_BOARD_MAGICPRO_PROHDTVE2,
104662306a36Sopenharmony_ci	}, {
104762306a36Sopenharmony_ci		.subvendor = 0x0070,
104862306a36Sopenharmony_ci		.subdevice = 0x8541,
104962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1850,
105062306a36Sopenharmony_ci	}, {
105162306a36Sopenharmony_ci		.subvendor = 0x1858,
105262306a36Sopenharmony_ci		.subdevice = 0xe800,
105362306a36Sopenharmony_ci		.card      = CX23885_BOARD_COMPRO_VIDEOMATE_E800,
105462306a36Sopenharmony_ci	}, {
105562306a36Sopenharmony_ci		.subvendor = 0x0070,
105662306a36Sopenharmony_ci		.subdevice = 0x8551,
105762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1290,
105862306a36Sopenharmony_ci	}, {
105962306a36Sopenharmony_ci		.subvendor = 0x14f1,
106062306a36Sopenharmony_ci		.subdevice = 0x8578,
106162306a36Sopenharmony_ci		.card      = CX23885_BOARD_MYGICA_X8558PRO,
106262306a36Sopenharmony_ci	}, {
106362306a36Sopenharmony_ci		.subvendor = 0x107d,
106462306a36Sopenharmony_ci		.subdevice = 0x6f22,
106562306a36Sopenharmony_ci		.card      = CX23885_BOARD_LEADTEK_WINFAST_PXTV1200,
106662306a36Sopenharmony_ci	}, {
106762306a36Sopenharmony_ci		.subvendor = 0x5654,
106862306a36Sopenharmony_ci		.subdevice = 0x2390,
106962306a36Sopenharmony_ci		.card      = CX23885_BOARD_GOTVIEW_X5_3D_HYBRID,
107062306a36Sopenharmony_ci	}, {
107162306a36Sopenharmony_ci		.subvendor = 0x1b55,
107262306a36Sopenharmony_ci		.subdevice = 0xe2e4,
107362306a36Sopenharmony_ci		.card      = CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF,
107462306a36Sopenharmony_ci	}, {
107562306a36Sopenharmony_ci		.subvendor = 0x14f1,
107662306a36Sopenharmony_ci		.subdevice = 0x8502,
107762306a36Sopenharmony_ci		.card      = CX23885_BOARD_MYGICA_X8507,
107862306a36Sopenharmony_ci	}, {
107962306a36Sopenharmony_ci		.subvendor = 0x153b,
108062306a36Sopenharmony_ci		.subdevice = 0x117e,
108162306a36Sopenharmony_ci		.card      = CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL,
108262306a36Sopenharmony_ci	}, {
108362306a36Sopenharmony_ci		.subvendor = 0xd471,
108462306a36Sopenharmony_ci		.subdevice = 0x9022,
108562306a36Sopenharmony_ci		.card      = CX23885_BOARD_TEVII_S471,
108662306a36Sopenharmony_ci	}, {
108762306a36Sopenharmony_ci		.subvendor = 0x8000,
108862306a36Sopenharmony_ci		.subdevice = 0x3034,
108962306a36Sopenharmony_ci		.card      = CX23885_BOARD_PROF_8000,
109062306a36Sopenharmony_ci	}, {
109162306a36Sopenharmony_ci		.subvendor = 0x0070,
109262306a36Sopenharmony_ci		.subdevice = 0xc108,
109362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-4400 (Model 121xxx, Hybrid DVB-T/S2, IR) */
109462306a36Sopenharmony_ci	}, {
109562306a36Sopenharmony_ci		.subvendor = 0x0070,
109662306a36Sopenharmony_ci		.subdevice = 0xc138,
109762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
109862306a36Sopenharmony_ci	}, {
109962306a36Sopenharmony_ci		.subvendor = 0x0070,
110062306a36Sopenharmony_ci		.subdevice = 0xc12a,
110162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_STARBURST, /* Hauppauge WinTV Starburst (Model 121x00, DVB-S2, IR) */
110262306a36Sopenharmony_ci	}, {
110362306a36Sopenharmony_ci		.subvendor = 0x0070,
110462306a36Sopenharmony_ci		.subdevice = 0xc1f8,
110562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
110662306a36Sopenharmony_ci	}, {
110762306a36Sopenharmony_ci		.subvendor = 0x1461,
110862306a36Sopenharmony_ci		.subdevice = 0xd939,
110962306a36Sopenharmony_ci		.card      = CX23885_BOARD_AVERMEDIA_HC81R,
111062306a36Sopenharmony_ci	}, {
111162306a36Sopenharmony_ci		.subvendor = 0x0070,
111262306a36Sopenharmony_ci		.subdevice = 0x7133,
111362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_IMPACTVCBE,
111462306a36Sopenharmony_ci	}, {
111562306a36Sopenharmony_ci		.subvendor = 0x0070,
111662306a36Sopenharmony_ci		.subdevice = 0x7137,
111762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_IMPACTVCBE,
111862306a36Sopenharmony_ci	}, {
111962306a36Sopenharmony_ci		.subvendor = 0x18ac,
112062306a36Sopenharmony_ci		.subdevice = 0xdb98,
112162306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2,
112262306a36Sopenharmony_ci	}, {
112362306a36Sopenharmony_ci		.subvendor = 0x4254,
112462306a36Sopenharmony_ci		.subdevice = 0x9580,
112562306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBSKY_T9580,
112662306a36Sopenharmony_ci	}, {
112762306a36Sopenharmony_ci		.subvendor = 0x4254,
112862306a36Sopenharmony_ci		.subdevice = 0x980c,
112962306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBSKY_T980C,
113062306a36Sopenharmony_ci	}, {
113162306a36Sopenharmony_ci		.subvendor = 0x4254,
113262306a36Sopenharmony_ci		.subdevice = 0x950c,
113362306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBSKY_S950C,
113462306a36Sopenharmony_ci	}, {
113562306a36Sopenharmony_ci		.subvendor = 0x13c2,
113662306a36Sopenharmony_ci		.subdevice = 0x3013,
113762306a36Sopenharmony_ci		.card      = CX23885_BOARD_TT_CT2_4500_CI,
113862306a36Sopenharmony_ci	}, {
113962306a36Sopenharmony_ci		.subvendor = 0x4254,
114062306a36Sopenharmony_ci		.subdevice = 0x0950,
114162306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBSKY_S950,
114262306a36Sopenharmony_ci	}, {
114362306a36Sopenharmony_ci		.subvendor = 0x4254,
114462306a36Sopenharmony_ci		.subdevice = 0x0952,
114562306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBSKY_S952,
114662306a36Sopenharmony_ci	}, {
114762306a36Sopenharmony_ci		.subvendor = 0x4254,
114862306a36Sopenharmony_ci		.subdevice = 0x0982,
114962306a36Sopenharmony_ci		.card      = CX23885_BOARD_DVBSKY_T982,
115062306a36Sopenharmony_ci	}, {
115162306a36Sopenharmony_ci		.subvendor = 0x0070,
115262306a36Sopenharmony_ci		.subdevice = 0xf038,
115362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR5525,
115462306a36Sopenharmony_ci	}, {
115562306a36Sopenharmony_ci		.subvendor = 0x1576,
115662306a36Sopenharmony_ci		.subdevice = 0x0260,
115762306a36Sopenharmony_ci		.card      = CX23885_BOARD_VIEWCAST_260E,
115862306a36Sopenharmony_ci	}, {
115962306a36Sopenharmony_ci		.subvendor = 0x1576,
116062306a36Sopenharmony_ci		.subdevice = 0x0460,
116162306a36Sopenharmony_ci		.card      = CX23885_BOARD_VIEWCAST_460E,
116262306a36Sopenharmony_ci	}, {
116362306a36Sopenharmony_ci		.subvendor = 0x0070,
116462306a36Sopenharmony_ci		.subdevice = 0x6a28,
116562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB, /* Tuner Pair 1 */
116662306a36Sopenharmony_ci	}, {
116762306a36Sopenharmony_ci		.subvendor = 0x0070,
116862306a36Sopenharmony_ci		.subdevice = 0x6b28,
116962306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_DVB, /* Tuner Pair 2 */
117062306a36Sopenharmony_ci	}, {
117162306a36Sopenharmony_ci		.subvendor = 0x0070,
117262306a36Sopenharmony_ci		.subdevice = 0x6a18,
117362306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC, /* Tuner Pair 1 */
117462306a36Sopenharmony_ci	}, {
117562306a36Sopenharmony_ci		.subvendor = 0x0070,
117662306a36Sopenharmony_ci		.subdevice = 0x6b18,
117762306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC, /* Tuner Pair 2 */
117862306a36Sopenharmony_ci	}, {
117962306a36Sopenharmony_ci		.subvendor = 0x0070,
118062306a36Sopenharmony_ci		.subdevice = 0x2a18,
118162306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_HVR1265_K4, /* Hauppauge WinTV HVR-1265 (Model 161xx1, Hybrid ATSC/QAM-B) */
118262306a36Sopenharmony_ci	}, {
118362306a36Sopenharmony_ci		.subvendor = 0x0070,
118462306a36Sopenharmony_ci		.subdevice = 0xf02a,
118562306a36Sopenharmony_ci		.card      = CX23885_BOARD_HAUPPAUGE_STARBURST2,
118662306a36Sopenharmony_ci	}, {
118762306a36Sopenharmony_ci		.subvendor = 0x1461,
118862306a36Sopenharmony_ci		.subdevice = 0x3100,
118962306a36Sopenharmony_ci		.card      = CX23885_BOARD_AVERMEDIA_CE310B,
119062306a36Sopenharmony_ci	},
119162306a36Sopenharmony_ci};
119262306a36Sopenharmony_ciconst unsigned int cx23885_idcount = ARRAY_SIZE(cx23885_subids);
119362306a36Sopenharmony_ci
119462306a36Sopenharmony_civoid cx23885_card_list(struct cx23885_dev *dev)
119562306a36Sopenharmony_ci{
119662306a36Sopenharmony_ci	int i;
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_ci	if (0 == dev->pci->subsystem_vendor &&
119962306a36Sopenharmony_ci	    0 == dev->pci->subsystem_device) {
120062306a36Sopenharmony_ci		pr_info("%s: Board has no valid PCIe Subsystem ID and can't\n"
120162306a36Sopenharmony_ci			"%s: be autodetected. Pass card=<n> insmod option\n"
120262306a36Sopenharmony_ci			"%s: to workaround that. Redirect complaints to the\n"
120362306a36Sopenharmony_ci			"%s: vendor of the TV card.  Best regards,\n"
120462306a36Sopenharmony_ci			"%s:         -- tux\n",
120562306a36Sopenharmony_ci			dev->name, dev->name, dev->name, dev->name, dev->name);
120662306a36Sopenharmony_ci	} else {
120762306a36Sopenharmony_ci		pr_info("%s: Your board isn't known (yet) to the driver.\n"
120862306a36Sopenharmony_ci			"%s: Try to pick one of the existing card configs via\n"
120962306a36Sopenharmony_ci			"%s: card=<n> insmod option.  Updating to the latest\n"
121062306a36Sopenharmony_ci			"%s: version might help as well.\n",
121162306a36Sopenharmony_ci			dev->name, dev->name, dev->name, dev->name);
121262306a36Sopenharmony_ci	}
121362306a36Sopenharmony_ci	pr_info("%s: Here is a list of valid choices for the card=<n> insmod option:\n",
121462306a36Sopenharmony_ci	       dev->name);
121562306a36Sopenharmony_ci	for (i = 0; i < cx23885_bcount; i++)
121662306a36Sopenharmony_ci		pr_info("%s:    card=%d -> %s\n",
121762306a36Sopenharmony_ci			dev->name, i, cx23885_boards[i].name);
121862306a36Sopenharmony_ci}
121962306a36Sopenharmony_ci
122062306a36Sopenharmony_cistatic void viewcast_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
122162306a36Sopenharmony_ci{
122262306a36Sopenharmony_ci	u32 sn;
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	/* The serial number record begins with tag 0x59 */
122562306a36Sopenharmony_ci	if (*(eeprom_data + 0x00) != 0x59) {
122662306a36Sopenharmony_ci		pr_info("%s() eeprom records are undefined, no serial number\n",
122762306a36Sopenharmony_ci			__func__);
122862306a36Sopenharmony_ci		return;
122962306a36Sopenharmony_ci	}
123062306a36Sopenharmony_ci
123162306a36Sopenharmony_ci	sn =	(*(eeprom_data + 0x06) << 24) |
123262306a36Sopenharmony_ci		(*(eeprom_data + 0x05) << 16) |
123362306a36Sopenharmony_ci		(*(eeprom_data + 0x04) << 8) |
123462306a36Sopenharmony_ci		(*(eeprom_data + 0x03));
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_ci	pr_info("%s: card '%s' sn# MM%d\n",
123762306a36Sopenharmony_ci		dev->name,
123862306a36Sopenharmony_ci		cx23885_boards[dev->board].name,
123962306a36Sopenharmony_ci		sn);
124062306a36Sopenharmony_ci}
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_cistatic void hauppauge_eeprom(struct cx23885_dev *dev, u8 *eeprom_data)
124362306a36Sopenharmony_ci{
124462306a36Sopenharmony_ci	struct tveeprom tv;
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci	tveeprom_hauppauge_analog(&tv, eeprom_data);
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_ci	/* Make sure we support the board model */
124962306a36Sopenharmony_ci	switch (tv.model) {
125062306a36Sopenharmony_ci	case 22001:
125162306a36Sopenharmony_ci		/* WinTV-HVR1270 (PCIe, Retail, half height)
125262306a36Sopenharmony_ci		 * ATSC/QAM and basic analog, IR Blast */
125362306a36Sopenharmony_ci	case 22009:
125462306a36Sopenharmony_ci		/* WinTV-HVR1210 (PCIe, Retail, half height)
125562306a36Sopenharmony_ci		 * DVB-T and basic analog, IR Blast */
125662306a36Sopenharmony_ci	case 22011:
125762306a36Sopenharmony_ci		/* WinTV-HVR1270 (PCIe, Retail, half height)
125862306a36Sopenharmony_ci		 * ATSC/QAM and basic analog, IR Recv */
125962306a36Sopenharmony_ci	case 22019:
126062306a36Sopenharmony_ci		/* WinTV-HVR1210 (PCIe, Retail, half height)
126162306a36Sopenharmony_ci		 * DVB-T and basic analog, IR Recv */
126262306a36Sopenharmony_ci	case 22021:
126362306a36Sopenharmony_ci		/* WinTV-HVR1275 (PCIe, Retail, half height)
126462306a36Sopenharmony_ci		 * ATSC/QAM and basic analog, IR Recv */
126562306a36Sopenharmony_ci	case 22029:
126662306a36Sopenharmony_ci		/* WinTV-HVR1210 (PCIe, Retail, half height)
126762306a36Sopenharmony_ci		 * DVB-T and basic analog, IR Recv */
126862306a36Sopenharmony_ci	case 22101:
126962306a36Sopenharmony_ci		/* WinTV-HVR1270 (PCIe, Retail, full height)
127062306a36Sopenharmony_ci		 * ATSC/QAM and basic analog, IR Blast */
127162306a36Sopenharmony_ci	case 22109:
127262306a36Sopenharmony_ci		/* WinTV-HVR1210 (PCIe, Retail, full height)
127362306a36Sopenharmony_ci		 * DVB-T and basic analog, IR Blast */
127462306a36Sopenharmony_ci	case 22111:
127562306a36Sopenharmony_ci		/* WinTV-HVR1270 (PCIe, Retail, full height)
127662306a36Sopenharmony_ci		 * ATSC/QAM and basic analog, IR Recv */
127762306a36Sopenharmony_ci	case 22119:
127862306a36Sopenharmony_ci		/* WinTV-HVR1210 (PCIe, Retail, full height)
127962306a36Sopenharmony_ci		 * DVB-T and basic analog, IR Recv */
128062306a36Sopenharmony_ci	case 22121:
128162306a36Sopenharmony_ci		/* WinTV-HVR1275 (PCIe, Retail, full height)
128262306a36Sopenharmony_ci		 * ATSC/QAM and basic analog, IR Recv */
128362306a36Sopenharmony_ci	case 22129:
128462306a36Sopenharmony_ci		/* WinTV-HVR1210 (PCIe, Retail, full height)
128562306a36Sopenharmony_ci		 * DVB-T and basic analog, IR Recv */
128662306a36Sopenharmony_ci	case 71009:
128762306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, Retail, full height)
128862306a36Sopenharmony_ci		 * DVB-T and basic analog */
128962306a36Sopenharmony_ci	case 71100:
129062306a36Sopenharmony_ci		/* WinTV-ImpactVCB-e (PCIe, Retail, half height)
129162306a36Sopenharmony_ci		 * Basic analog */
129262306a36Sopenharmony_ci	case 71359:
129362306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, half height)
129462306a36Sopenharmony_ci		 * DVB-T and basic analog */
129562306a36Sopenharmony_ci	case 71439:
129662306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, half height)
129762306a36Sopenharmony_ci		 * DVB-T and basic analog */
129862306a36Sopenharmony_ci	case 71449:
129962306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, full height)
130062306a36Sopenharmony_ci		 * DVB-T and basic analog */
130162306a36Sopenharmony_ci	case 71939:
130262306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, half height)
130362306a36Sopenharmony_ci		 * DVB-T and basic analog */
130462306a36Sopenharmony_ci	case 71949:
130562306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, full height)
130662306a36Sopenharmony_ci		 * DVB-T and basic analog */
130762306a36Sopenharmony_ci	case 71959:
130862306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, full height)
130962306a36Sopenharmony_ci		 * DVB-T and basic analog */
131062306a36Sopenharmony_ci	case 71979:
131162306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, half height)
131262306a36Sopenharmony_ci		 * DVB-T and basic analog */
131362306a36Sopenharmony_ci	case 71999:
131462306a36Sopenharmony_ci		/* WinTV-HVR1200 (PCIe, OEM, full height)
131562306a36Sopenharmony_ci		 * DVB-T and basic analog */
131662306a36Sopenharmony_ci	case 76601:
131762306a36Sopenharmony_ci		/* WinTV-HVR1800lp (PCIe, Retail, No IR, Dual
131862306a36Sopenharmony_ci			channel ATSC and MPEG2 HW Encoder */
131962306a36Sopenharmony_ci	case 77001:
132062306a36Sopenharmony_ci		/* WinTV-HVR1500 (Express Card, OEM, No IR, ATSC
132162306a36Sopenharmony_ci			and Basic analog */
132262306a36Sopenharmony_ci	case 77011:
132362306a36Sopenharmony_ci		/* WinTV-HVR1500 (Express Card, Retail, No IR, ATSC
132462306a36Sopenharmony_ci			and Basic analog */
132562306a36Sopenharmony_ci	case 77041:
132662306a36Sopenharmony_ci		/* WinTV-HVR1500Q (Express Card, OEM, No IR, ATSC/QAM
132762306a36Sopenharmony_ci			and Basic analog */
132862306a36Sopenharmony_ci	case 77051:
132962306a36Sopenharmony_ci		/* WinTV-HVR1500Q (Express Card, Retail, No IR, ATSC/QAM
133062306a36Sopenharmony_ci			and Basic analog */
133162306a36Sopenharmony_ci	case 78011:
133262306a36Sopenharmony_ci		/* WinTV-HVR1800 (PCIe, Retail, 3.5mm in, IR, No FM,
133362306a36Sopenharmony_ci			Dual channel ATSC and MPEG2 HW Encoder */
133462306a36Sopenharmony_ci	case 78501:
133562306a36Sopenharmony_ci		/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
133662306a36Sopenharmony_ci			Dual channel ATSC and MPEG2 HW Encoder */
133762306a36Sopenharmony_ci	case 78521:
133862306a36Sopenharmony_ci		/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, FM,
133962306a36Sopenharmony_ci			Dual channel ATSC and MPEG2 HW Encoder */
134062306a36Sopenharmony_ci	case 78531:
134162306a36Sopenharmony_ci		/* WinTV-HVR1800 (PCIe, OEM, RCA in, No IR, No FM,
134262306a36Sopenharmony_ci			Dual channel ATSC and MPEG2 HW Encoder */
134362306a36Sopenharmony_ci	case 78631:
134462306a36Sopenharmony_ci		/* WinTV-HVR1800 (PCIe, OEM, No IR, No FM,
134562306a36Sopenharmony_ci			Dual channel ATSC and MPEG2 HW Encoder */
134662306a36Sopenharmony_ci	case 79001:
134762306a36Sopenharmony_ci		/* WinTV-HVR1250 (PCIe, Retail, IR, full height,
134862306a36Sopenharmony_ci			ATSC and Basic analog */
134962306a36Sopenharmony_ci	case 79101:
135062306a36Sopenharmony_ci		/* WinTV-HVR1250 (PCIe, Retail, IR, half height,
135162306a36Sopenharmony_ci			ATSC and Basic analog */
135262306a36Sopenharmony_ci	case 79501:
135362306a36Sopenharmony_ci		/* WinTV-HVR1250 (PCIe, No IR, half height,
135462306a36Sopenharmony_ci			ATSC [at least] and Basic analog) */
135562306a36Sopenharmony_ci	case 79561:
135662306a36Sopenharmony_ci		/* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
135762306a36Sopenharmony_ci			ATSC and Basic analog */
135862306a36Sopenharmony_ci	case 79571:
135962306a36Sopenharmony_ci		/* WinTV-HVR1250 (PCIe, OEM, No IR, full height,
136062306a36Sopenharmony_ci		 ATSC and Basic analog */
136162306a36Sopenharmony_ci	case 79671:
136262306a36Sopenharmony_ci		/* WinTV-HVR1250 (PCIe, OEM, No IR, half height,
136362306a36Sopenharmony_ci			ATSC and Basic analog */
136462306a36Sopenharmony_ci	case 80019:
136562306a36Sopenharmony_ci		/* WinTV-HVR1400 (Express Card, Retail, IR,
136662306a36Sopenharmony_ci		 * DVB-T and Basic analog */
136762306a36Sopenharmony_ci	case 81509:
136862306a36Sopenharmony_ci		/* WinTV-HVR1700 (PCIe, OEM, No IR, half height)
136962306a36Sopenharmony_ci		 * DVB-T and MPEG2 HW Encoder */
137062306a36Sopenharmony_ci	case 81519:
137162306a36Sopenharmony_ci		/* WinTV-HVR1700 (PCIe, OEM, No IR, full height)
137262306a36Sopenharmony_ci		 * DVB-T and MPEG2 HW Encoder */
137362306a36Sopenharmony_ci		break;
137462306a36Sopenharmony_ci	case 85021:
137562306a36Sopenharmony_ci		/* WinTV-HVR1850 (PCIe, Retail, 3.5mm in, IR, FM,
137662306a36Sopenharmony_ci			Dual channel ATSC and MPEG2 HW Encoder */
137762306a36Sopenharmony_ci		break;
137862306a36Sopenharmony_ci	case 85721:
137962306a36Sopenharmony_ci		/* WinTV-HVR1290 (PCIe, OEM, RCA in, IR,
138062306a36Sopenharmony_ci			Dual channel ATSC and Basic analog */
138162306a36Sopenharmony_ci	case 121019:
138262306a36Sopenharmony_ci		/* WinTV-HVR4400 (PCIe, DVB-S2, DVB-C/T) */
138362306a36Sopenharmony_ci		break;
138462306a36Sopenharmony_ci	case 121029:
138562306a36Sopenharmony_ci		/* WinTV-HVR5500 (PCIe, DVB-S2, DVB-C/T) */
138662306a36Sopenharmony_ci		break;
138762306a36Sopenharmony_ci	case 150329:
138862306a36Sopenharmony_ci		/* WinTV-HVR5525 (PCIe, DVB-S/S2, DVB-T/T2/C) */
138962306a36Sopenharmony_ci		break;
139062306a36Sopenharmony_ci	case 161111:
139162306a36Sopenharmony_ci		/* WinTV-HVR-1265 K4 (PCIe, Analog/ATSC/QAM-B) */
139262306a36Sopenharmony_ci		break;
139362306a36Sopenharmony_ci	case 166100: /* 888 version, hybrid */
139462306a36Sopenharmony_ci	case 166200: /* 885 version, DVB only */
139562306a36Sopenharmony_ci		/* WinTV-QuadHD (DVB) Tuner Pair 1 (PCIe, IR, half height,
139662306a36Sopenharmony_ci		   DVB-T/T2/C, DVB-T/T2/C */
139762306a36Sopenharmony_ci		break;
139862306a36Sopenharmony_ci	case 166101: /* 888 version, hybrid */
139962306a36Sopenharmony_ci	case 166201: /* 885 version, DVB only */
140062306a36Sopenharmony_ci		/* WinTV-QuadHD (DVB) Tuner Pair 2 (PCIe, IR, half height,
140162306a36Sopenharmony_ci		   DVB-T/T2/C, DVB-T/T2/C */
140262306a36Sopenharmony_ci		break;
140362306a36Sopenharmony_ci	case 165100: /* 888 version, hybrid */
140462306a36Sopenharmony_ci	case 165200: /* 885 version, digital only */
140562306a36Sopenharmony_ci		/* WinTV-QuadHD (ATSC) Tuner Pair 1 (PCIe, IR, half height,
140662306a36Sopenharmony_ci		 * ATSC/QAM-B, ATSC/QAM-B */
140762306a36Sopenharmony_ci		break;
140862306a36Sopenharmony_ci	case 165101: /* 888 version, hybrid */
140962306a36Sopenharmony_ci	case 165201: /* 885 version, digital only */
141062306a36Sopenharmony_ci		/* WinTV-QuadHD (ATSC) Tuner Pair 2 (PCIe, IR, half height,
141162306a36Sopenharmony_ci		 * ATSC/QAM-B, ATSC/QAM-B */
141262306a36Sopenharmony_ci		break;
141362306a36Sopenharmony_ci	default:
141462306a36Sopenharmony_ci		pr_warn("%s: warning: unknown hauppauge model #%d\n",
141562306a36Sopenharmony_ci			dev->name, tv.model);
141662306a36Sopenharmony_ci		break;
141762306a36Sopenharmony_ci	}
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci	pr_info("%s: hauppauge eeprom: model=%d\n",
142062306a36Sopenharmony_ci		dev->name, tv.model);
142162306a36Sopenharmony_ci}
142262306a36Sopenharmony_ci
142362306a36Sopenharmony_ci/* Some TBS cards require initing a chip using a bitbanged SPI attached
142462306a36Sopenharmony_ci   to the cx23885 gpio's. If this chip doesn't get init'ed the demod
142562306a36Sopenharmony_ci   doesn't respond to any command. */
142662306a36Sopenharmony_cistatic void tbs_card_init(struct cx23885_dev *dev)
142762306a36Sopenharmony_ci{
142862306a36Sopenharmony_ci	int i;
142962306a36Sopenharmony_ci	static const u8 buf[] = {
143062306a36Sopenharmony_ci		0xe0, 0x06, 0x66, 0x33, 0x65,
143162306a36Sopenharmony_ci		0x01, 0x17, 0x06, 0xde};
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci	switch (dev->board) {
143462306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
143562306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
143662306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00070007);
143762306a36Sopenharmony_ci		usleep_range(1000, 10000);
143862306a36Sopenharmony_ci		cx_clear(GP0_IO, 2);
143962306a36Sopenharmony_ci		usleep_range(1000, 10000);
144062306a36Sopenharmony_ci		for (i = 0; i < 9 * 8; i++) {
144162306a36Sopenharmony_ci			cx_clear(GP0_IO, 7);
144262306a36Sopenharmony_ci			usleep_range(1000, 10000);
144362306a36Sopenharmony_ci			cx_set(GP0_IO,
144462306a36Sopenharmony_ci				((buf[i >> 3] >> (7 - (i & 7))) & 1) | 4);
144562306a36Sopenharmony_ci			usleep_range(1000, 10000);
144662306a36Sopenharmony_ci		}
144762306a36Sopenharmony_ci		cx_set(GP0_IO, 7);
144862306a36Sopenharmony_ci		break;
144962306a36Sopenharmony_ci	}
145062306a36Sopenharmony_ci}
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_ciint cx23885_tuner_callback(void *priv, int component, int command, int arg)
145362306a36Sopenharmony_ci{
145462306a36Sopenharmony_ci	struct cx23885_tsport *port = priv;
145562306a36Sopenharmony_ci	struct cx23885_dev *dev = port->dev;
145662306a36Sopenharmony_ci	u32 bitmask = 0;
145762306a36Sopenharmony_ci
145862306a36Sopenharmony_ci	if ((command == XC2028_RESET_CLK) || (command == XC2028_I2C_FLUSH))
145962306a36Sopenharmony_ci		return 0;
146062306a36Sopenharmony_ci
146162306a36Sopenharmony_ci	if (command != 0) {
146262306a36Sopenharmony_ci		pr_err("%s(): Unknown command 0x%x.\n",
146362306a36Sopenharmony_ci		       __func__, command);
146462306a36Sopenharmony_ci		return -EINVAL;
146562306a36Sopenharmony_ci	}
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci	switch (dev->board) {
146862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1400:
146962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500:
147062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
147162306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
147262306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
147362306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
147462306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
147562306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
147662306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
147762306a36Sopenharmony_ci		/* Tuner Reset Command */
147862306a36Sopenharmony_ci		bitmask = 0x04;
147962306a36Sopenharmony_ci		break;
148062306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
148162306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
148262306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
148362306a36Sopenharmony_ci		/* Two identical tuners on two different i2c buses,
148462306a36Sopenharmony_ci		 * we need to reset the correct gpio. */
148562306a36Sopenharmony_ci		if (port->nr == 1)
148662306a36Sopenharmony_ci			bitmask = 0x01;
148762306a36Sopenharmony_ci		else if (port->nr == 2)
148862306a36Sopenharmony_ci			bitmask = 0x04;
148962306a36Sopenharmony_ci		break;
149062306a36Sopenharmony_ci	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
149162306a36Sopenharmony_ci		/* Tuner Reset Command */
149262306a36Sopenharmony_ci		bitmask = 0x02;
149362306a36Sopenharmony_ci		break;
149462306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
149562306a36Sopenharmony_ci		altera_ci_tuner_reset(dev, port->nr);
149662306a36Sopenharmony_ci		break;
149762306a36Sopenharmony_ci	case CX23885_BOARD_AVERMEDIA_HC81R:
149862306a36Sopenharmony_ci		/* XC3028L Reset Command */
149962306a36Sopenharmony_ci		bitmask = 1 << 2;
150062306a36Sopenharmony_ci		break;
150162306a36Sopenharmony_ci	}
150262306a36Sopenharmony_ci
150362306a36Sopenharmony_ci	if (bitmask) {
150462306a36Sopenharmony_ci		/* Drive the tuner into reset and back out */
150562306a36Sopenharmony_ci		cx_clear(GP0_IO, bitmask);
150662306a36Sopenharmony_ci		mdelay(200);
150762306a36Sopenharmony_ci		cx_set(GP0_IO, bitmask);
150862306a36Sopenharmony_ci	}
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_ci	return 0;
151162306a36Sopenharmony_ci}
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_civoid cx23885_gpio_setup(struct cx23885_dev *dev)
151462306a36Sopenharmony_ci{
151562306a36Sopenharmony_ci	switch (dev->board) {
151662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
151762306a36Sopenharmony_ci		/* GPIO-0 cx24227 demodulator reset */
151862306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
151962306a36Sopenharmony_ci		break;
152062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500:
152162306a36Sopenharmony_ci		/* GPIO-0 cx24227 demodulator */
152262306a36Sopenharmony_ci		/* GPIO-2 xc3028 tuner */
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci		/* Put the parts into reset */
152562306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050000);
152662306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00000005);
152762306a36Sopenharmony_ci		msleep(5);
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_ci		/* Bring the parts out of reset */
153062306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050005);
153162306a36Sopenharmony_ci		break;
153262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
153362306a36Sopenharmony_ci		/* GPIO-0 cx24227 demodulator reset */
153462306a36Sopenharmony_ci		/* GPIO-2 xc5000 tuner reset */
153562306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050005); /* Bring the part out of reset */
153662306a36Sopenharmony_ci		break;
153762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800:
153862306a36Sopenharmony_ci		/* GPIO-0 656_CLK */
153962306a36Sopenharmony_ci		/* GPIO-1 656_D0 */
154062306a36Sopenharmony_ci		/* GPIO-2 8295A Reset */
154162306a36Sopenharmony_ci		/* GPIO-3-10 cx23417 data0-7 */
154262306a36Sopenharmony_ci		/* GPIO-11-14 cx23417 addr0-3 */
154362306a36Sopenharmony_ci		/* GPIO-15-18 cx23417 READY, CS, RD, WR */
154462306a36Sopenharmony_ci		/* GPIO-19 IR_RX */
154562306a36Sopenharmony_ci
154662306a36Sopenharmony_ci		/* CX23417 GPIO's */
154762306a36Sopenharmony_ci		/* EIO15 Zilog Reset */
154862306a36Sopenharmony_ci		/* EIO14 S5H1409/CX24227 Reset */
154962306a36Sopenharmony_ci		mc417_gpio_enable(dev, GPIO_15 | GPIO_14, 1);
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_ci		/* Put the demod into reset and protect the eeprom */
155262306a36Sopenharmony_ci		mc417_gpio_clear(dev, GPIO_15 | GPIO_14);
155362306a36Sopenharmony_ci		msleep(100);
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_ci		/* Bring the demod and blaster out of reset */
155662306a36Sopenharmony_ci		mc417_gpio_set(dev, GPIO_15 | GPIO_14);
155762306a36Sopenharmony_ci		msleep(100);
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci		/* Force the TDA8295A into reset and back */
156062306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_2, 1);
156162306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_2);
156262306a36Sopenharmony_ci		msleep(20);
156362306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_2);
156462306a36Sopenharmony_ci		msleep(20);
156562306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_2);
156662306a36Sopenharmony_ci		msleep(20);
156762306a36Sopenharmony_ci		break;
156862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1200:
156962306a36Sopenharmony_ci		/* GPIO-0 tda10048 demodulator reset */
157062306a36Sopenharmony_ci		/* GPIO-2 tda18271 tuner reset */
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ci		/* Put the parts into reset and back */
157362306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050000);
157462306a36Sopenharmony_ci		msleep(20);
157562306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00000005);
157662306a36Sopenharmony_ci		msleep(20);
157762306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050005);
157862306a36Sopenharmony_ci		break;
157962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1700:
158062306a36Sopenharmony_ci		/* GPIO-0 TDA10048 demodulator reset */
158162306a36Sopenharmony_ci		/* GPIO-2 TDA8295A Reset */
158262306a36Sopenharmony_ci		/* GPIO-3-10 cx23417 data0-7 */
158362306a36Sopenharmony_ci		/* GPIO-11-14 cx23417 addr0-3 */
158462306a36Sopenharmony_ci		/* GPIO-15-18 cx23417 READY, CS, RD, WR */
158562306a36Sopenharmony_ci
158662306a36Sopenharmony_ci		/* The following GPIO's are on the interna AVCore (cx25840) */
158762306a36Sopenharmony_ci		/* GPIO-19 IR_RX */
158862306a36Sopenharmony_ci		/* GPIO-20 IR_TX 416/DVBT Select */
158962306a36Sopenharmony_ci		/* GPIO-21 IIS DAT */
159062306a36Sopenharmony_ci		/* GPIO-22 IIS WCLK */
159162306a36Sopenharmony_ci		/* GPIO-23 IIS BCLK */
159262306a36Sopenharmony_ci
159362306a36Sopenharmony_ci		/* Put the parts into reset and back */
159462306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050000);
159562306a36Sopenharmony_ci		msleep(20);
159662306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00000005);
159762306a36Sopenharmony_ci		msleep(20);
159862306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050005);
159962306a36Sopenharmony_ci		break;
160062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1400:
160162306a36Sopenharmony_ci		/* GPIO-0  Dibcom7000p demodulator reset */
160262306a36Sopenharmony_ci		/* GPIO-2  xc3028L tuner reset */
160362306a36Sopenharmony_ci		/* GPIO-13 LED */
160462306a36Sopenharmony_ci
160562306a36Sopenharmony_ci		/* Put the parts into reset and back */
160662306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050000);
160762306a36Sopenharmony_ci		msleep(20);
160862306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00000005);
160962306a36Sopenharmony_ci		msleep(20);
161062306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00050005);
161162306a36Sopenharmony_ci		break;
161262306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
161362306a36Sopenharmony_ci		/* GPIO-0 xc5000 tuner reset i2c bus 0 */
161462306a36Sopenharmony_ci		/* GPIO-1 s5h1409 demod reset i2c bus 0 */
161562306a36Sopenharmony_ci		/* GPIO-2 xc5000 tuner reset i2c bus 1 */
161662306a36Sopenharmony_ci		/* GPIO-3 s5h1409 demod reset i2c bus 0 */
161762306a36Sopenharmony_ci
161862306a36Sopenharmony_ci		/* Put the parts into reset and back */
161962306a36Sopenharmony_ci		cx_set(GP0_IO, 0x000f0000);
162062306a36Sopenharmony_ci		msleep(20);
162162306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x0000000f);
162262306a36Sopenharmony_ci		msleep(20);
162362306a36Sopenharmony_ci		cx_set(GP0_IO, 0x000f000f);
162462306a36Sopenharmony_ci		break;
162562306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
162662306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
162762306a36Sopenharmony_ci		/* GPIO-0 portb xc3028 reset */
162862306a36Sopenharmony_ci		/* GPIO-1 portb zl10353 reset */
162962306a36Sopenharmony_ci		/* GPIO-2 portc xc3028 reset */
163062306a36Sopenharmony_ci		/* GPIO-3 portc zl10353 reset */
163162306a36Sopenharmony_ci
163262306a36Sopenharmony_ci		/* Put the parts into reset and back */
163362306a36Sopenharmony_ci		cx_set(GP0_IO, 0x000f0000);
163462306a36Sopenharmony_ci		msleep(20);
163562306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x0000000f);
163662306a36Sopenharmony_ci		msleep(20);
163762306a36Sopenharmony_ci		cx_set(GP0_IO, 0x000f000f);
163862306a36Sopenharmony_ci		break;
163962306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
164062306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
164162306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
164262306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
164362306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
164462306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
164562306a36Sopenharmony_ci		/* GPIO-2  xc3028 tuner reset */
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci		/* The following GPIO's are on the internal AVCore (cx25840) */
164862306a36Sopenharmony_ci		/* GPIO-?  zl10353 demod reset */
164962306a36Sopenharmony_ci
165062306a36Sopenharmony_ci		/* Put the parts into reset and back */
165162306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00040000);
165262306a36Sopenharmony_ci		msleep(20);
165362306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00000004);
165462306a36Sopenharmony_ci		msleep(20);
165562306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00040004);
165662306a36Sopenharmony_ci		break;
165762306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6920:
165862306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
165962306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
166062306a36Sopenharmony_ci	case CX23885_BOARD_PROF_8000:
166162306a36Sopenharmony_ci		cx_write(MC417_CTL, 0x00000036);
166262306a36Sopenharmony_ci		cx_write(MC417_OEN, 0x00001000);
166362306a36Sopenharmony_ci		cx_set(MC417_RWD, 0x00000002);
166462306a36Sopenharmony_ci		msleep(200);
166562306a36Sopenharmony_ci		cx_clear(MC417_RWD, 0x00000800);
166662306a36Sopenharmony_ci		msleep(200);
166762306a36Sopenharmony_ci		cx_set(MC417_RWD, 0x00000800);
166862306a36Sopenharmony_ci		msleep(200);
166962306a36Sopenharmony_ci		break;
167062306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
167162306a36Sopenharmony_ci		/* GPIO-0 INTA from CiMax1
167262306a36Sopenharmony_ci		   GPIO-1 INTB from CiMax2
167362306a36Sopenharmony_ci		   GPIO-2 reset chips
167462306a36Sopenharmony_ci		   GPIO-3 to GPIO-10 data/addr for CA
167562306a36Sopenharmony_ci		   GPIO-11 ~CS0 to CiMax1
167662306a36Sopenharmony_ci		   GPIO-12 ~CS1 to CiMax2
167762306a36Sopenharmony_ci		   GPIO-13 ADL0 load LSB addr
167862306a36Sopenharmony_ci		   GPIO-14 ADL1 load MSB addr
167962306a36Sopenharmony_ci		   GPIO-15 ~RDY from CiMax
168062306a36Sopenharmony_ci		   GPIO-17 ~RD to CiMax
168162306a36Sopenharmony_ci		   GPIO-18 ~WR to CiMax
168262306a36Sopenharmony_ci		 */
168362306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00040000); /* GPIO as out */
168462306a36Sopenharmony_ci		/* GPIO1 and GPIO2 as INTA and INTB from CiMaxes, reset low */
168562306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00030004);
168662306a36Sopenharmony_ci		msleep(100);/* reset delay */
168762306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00040004); /* GPIO as out, reset high */
168862306a36Sopenharmony_ci		cx_write(MC417_CTL, 0x00000037);/* enable GPIO3-18 pins */
168962306a36Sopenharmony_ci		/* GPIO-15 IN as ~ACK, rest as OUT */
169062306a36Sopenharmony_ci		cx_write(MC417_OEN, 0x00001000);
169162306a36Sopenharmony_ci		/* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
169262306a36Sopenharmony_ci		cx_write(MC417_RWD, 0x0000c300);
169362306a36Sopenharmony_ci		/* enable irq */
169462306a36Sopenharmony_ci		cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
169562306a36Sopenharmony_ci		break;
169662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
169762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1275:
169862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255:
169962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
170062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1210:
170162306a36Sopenharmony_ci		/* GPIO-5 RF Control: 0 = RF1 Terrestrial, 1 = RF2 Cable */
170262306a36Sopenharmony_ci		/* GPIO-6 I2C Gate which can isolate the demod from the bus */
170362306a36Sopenharmony_ci		/* GPIO-9 Demod reset */
170462306a36Sopenharmony_ci
170562306a36Sopenharmony_ci		/* Put the parts into reset and back */
170662306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_9 | GPIO_6 | GPIO_5, 1);
170762306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_9 | GPIO_6 | GPIO_5);
170862306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_9);
170962306a36Sopenharmony_ci		msleep(20);
171062306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_9);
171162306a36Sopenharmony_ci		break;
171262306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8506:
171362306a36Sopenharmony_ci	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
171462306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8507:
171562306a36Sopenharmony_ci		/* GPIO-0 (0)Analog / (1)Digital TV */
171662306a36Sopenharmony_ci		/* GPIO-1 reset XC5000 */
171762306a36Sopenharmony_ci		/* GPIO-2 demod reset */
171862306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_0 | GPIO_1 | GPIO_2, 1);
171962306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_1 | GPIO_2);
172062306a36Sopenharmony_ci		msleep(100);
172162306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_0 | GPIO_1 | GPIO_2);
172262306a36Sopenharmony_ci		msleep(100);
172362306a36Sopenharmony_ci		break;
172462306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8558PRO:
172562306a36Sopenharmony_ci		/* GPIO-0 reset first ATBM8830 */
172662306a36Sopenharmony_ci		/* GPIO-1 reset second ATBM8830 */
172762306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_0 | GPIO_1, 1);
172862306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_0 | GPIO_1);
172962306a36Sopenharmony_ci		msleep(100);
173062306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_0 | GPIO_1);
173162306a36Sopenharmony_ci		msleep(100);
173262306a36Sopenharmony_ci		break;
173362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
173462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
173562306a36Sopenharmony_ci		/* GPIO-0 656_CLK */
173662306a36Sopenharmony_ci		/* GPIO-1 656_D0 */
173762306a36Sopenharmony_ci		/* GPIO-2 Wake# */
173862306a36Sopenharmony_ci		/* GPIO-3-10 cx23417 data0-7 */
173962306a36Sopenharmony_ci		/* GPIO-11-14 cx23417 addr0-3 */
174062306a36Sopenharmony_ci		/* GPIO-15-18 cx23417 READY, CS, RD, WR */
174162306a36Sopenharmony_ci		/* GPIO-19 IR_RX */
174262306a36Sopenharmony_ci		/* GPIO-20 C_IR_TX */
174362306a36Sopenharmony_ci		/* GPIO-21 I2S DAT */
174462306a36Sopenharmony_ci		/* GPIO-22 I2S WCLK */
174562306a36Sopenharmony_ci		/* GPIO-23 I2S BCLK */
174662306a36Sopenharmony_ci		/* ALT GPIO: EXP GPIO LATCH */
174762306a36Sopenharmony_ci
174862306a36Sopenharmony_ci		/* CX23417 GPIO's */
174962306a36Sopenharmony_ci		/* GPIO-14 S5H1411/CX24228 Reset */
175062306a36Sopenharmony_ci		/* GPIO-13 EEPROM write protect */
175162306a36Sopenharmony_ci		mc417_gpio_enable(dev, GPIO_14 | GPIO_13, 1);
175262306a36Sopenharmony_ci
175362306a36Sopenharmony_ci		/* Put the demod into reset and protect the eeprom */
175462306a36Sopenharmony_ci		mc417_gpio_clear(dev, GPIO_14 | GPIO_13);
175562306a36Sopenharmony_ci		msleep(100);
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci		/* Bring the demod out of reset */
175862306a36Sopenharmony_ci		mc417_gpio_set(dev, GPIO_14);
175962306a36Sopenharmony_ci		msleep(100);
176062306a36Sopenharmony_ci
176162306a36Sopenharmony_ci		/* CX24228 GPIO */
176262306a36Sopenharmony_ci		/* Connected to IF / Mux */
176362306a36Sopenharmony_ci		break;
176462306a36Sopenharmony_ci	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
176562306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00010001); /* Bring the part out of reset */
176662306a36Sopenharmony_ci		break;
176762306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
176862306a36Sopenharmony_ci		/* GPIO-0 ~INT in
176962306a36Sopenharmony_ci		   GPIO-1 TMS out
177062306a36Sopenharmony_ci		   GPIO-2 ~reset chips out
177162306a36Sopenharmony_ci		   GPIO-3 to GPIO-10 data/addr for CA in/out
177262306a36Sopenharmony_ci		   GPIO-11 ~CS out
177362306a36Sopenharmony_ci		   GPIO-12 ADDR out
177462306a36Sopenharmony_ci		   GPIO-13 ~WR out
177562306a36Sopenharmony_ci		   GPIO-14 ~RD out
177662306a36Sopenharmony_ci		   GPIO-15 ~RDY in
177762306a36Sopenharmony_ci		   GPIO-16 TCK out
177862306a36Sopenharmony_ci		   GPIO-17 TDO in
177962306a36Sopenharmony_ci		   GPIO-18 TDI out
178062306a36Sopenharmony_ci		 */
178162306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00060000); /* GPIO-1,2 as out */
178262306a36Sopenharmony_ci		/* GPIO-0 as INT, reset & TMS low */
178362306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00010006);
178462306a36Sopenharmony_ci		msleep(100);/* reset delay */
178562306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00000004); /* reset high */
178662306a36Sopenharmony_ci		cx_write(MC417_CTL, 0x00000037);/* enable GPIO-3..18 pins */
178762306a36Sopenharmony_ci		/* GPIO-17 is TDO in, GPIO-15 is ~RDY in, rest is out */
178862306a36Sopenharmony_ci		cx_write(MC417_OEN, 0x00005000);
178962306a36Sopenharmony_ci		/* ~RD, ~WR high; ADDR low; ~CS high */
179062306a36Sopenharmony_ci		cx_write(MC417_RWD, 0x00000d00);
179162306a36Sopenharmony_ci		/* enable irq */
179262306a36Sopenharmony_ci		cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
179362306a36Sopenharmony_ci		break;
179462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR4400:
179562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_STARBURST:
179662306a36Sopenharmony_ci		/* GPIO-8 tda10071 demod reset */
179762306a36Sopenharmony_ci		/* GPIO-9 si2165 demod reset (only HVR4400/HVR5500)*/
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_ci		/* Put the parts into reset and back */
180062306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
180362306a36Sopenharmony_ci		msleep(100);
180462306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
180562306a36Sopenharmony_ci		msleep(100);
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_ci		break;
180862306a36Sopenharmony_ci	case CX23885_BOARD_AVERMEDIA_HC81R:
180962306a36Sopenharmony_ci		cx_clear(MC417_CTL, 1);
181062306a36Sopenharmony_ci		/* GPIO-0,1,2 setup direction as output */
181162306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00070000);
181262306a36Sopenharmony_ci		usleep_range(10000, 11000);
181362306a36Sopenharmony_ci		/* AF9013 demod reset */
181462306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00010001);
181562306a36Sopenharmony_ci		usleep_range(10000, 11000);
181662306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00010001);
181762306a36Sopenharmony_ci		usleep_range(10000, 11000);
181862306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00010001);
181962306a36Sopenharmony_ci		usleep_range(10000, 11000);
182062306a36Sopenharmony_ci		/* demod tune? */
182162306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00030003);
182262306a36Sopenharmony_ci		usleep_range(10000, 11000);
182362306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00020002);
182462306a36Sopenharmony_ci		usleep_range(10000, 11000);
182562306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00010001);
182662306a36Sopenharmony_ci		usleep_range(10000, 11000);
182762306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00020002);
182862306a36Sopenharmony_ci		/* XC3028L tuner reset */
182962306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00040004);
183062306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00040004);
183162306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00040004);
183262306a36Sopenharmony_ci		msleep(60);
183362306a36Sopenharmony_ci		break;
183462306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T9580:
183562306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S952:
183662306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T982:
183762306a36Sopenharmony_ci		/* enable GPIO3-18 pins */
183862306a36Sopenharmony_ci		cx_write(MC417_CTL, 0x00000037);
183962306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_2 | GPIO_11, 1);
184062306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_2 | GPIO_11);
184162306a36Sopenharmony_ci		msleep(100);
184262306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_2 | GPIO_11);
184362306a36Sopenharmony_ci		break;
184462306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T980C:
184562306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950C:
184662306a36Sopenharmony_ci	case CX23885_BOARD_TT_CT2_4500_CI:
184762306a36Sopenharmony_ci		/*
184862306a36Sopenharmony_ci		 * GPIO-0 INTA from CiMax, input
184962306a36Sopenharmony_ci		 * GPIO-1 reset CiMax, output, high active
185062306a36Sopenharmony_ci		 * GPIO-2 reset demod, output, low active
185162306a36Sopenharmony_ci		 * GPIO-3 to GPIO-10 data/addr for CAM
185262306a36Sopenharmony_ci		 * GPIO-11 ~CS0 to CiMax1
185362306a36Sopenharmony_ci		 * GPIO-12 ~CS1 to CiMax2
185462306a36Sopenharmony_ci		 * GPIO-13 ADL0 load LSB addr
185562306a36Sopenharmony_ci		 * GPIO-14 ADL1 load MSB addr
185662306a36Sopenharmony_ci		 * GPIO-15 ~RDY from CiMax
185762306a36Sopenharmony_ci		 * GPIO-17 ~RD to CiMax
185862306a36Sopenharmony_ci		 * GPIO-18 ~WR to CiMax
185962306a36Sopenharmony_ci		 */
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00060002); /* GPIO 1/2 as output */
186262306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00010004); /* GPIO 0 as input */
186362306a36Sopenharmony_ci		msleep(100); /* reset delay */
186462306a36Sopenharmony_ci		cx_set(GP0_IO, 0x00060004); /* GPIO as out, reset high */
186562306a36Sopenharmony_ci		cx_clear(GP0_IO, 0x00010002);
186662306a36Sopenharmony_ci		cx_write(MC417_CTL, 0x00000037); /* enable GPIO3-18 pins */
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ci		/* GPIO-15 IN as ~ACK, rest as OUT */
186962306a36Sopenharmony_ci		cx_write(MC417_OEN, 0x00001000);
187062306a36Sopenharmony_ci
187162306a36Sopenharmony_ci		/* ~RD, ~WR high; ADL0, ADL1 low; ~CS0, ~CS1 high */
187262306a36Sopenharmony_ci		cx_write(MC417_RWD, 0x0000c300);
187362306a36Sopenharmony_ci
187462306a36Sopenharmony_ci		/* enable irq */
187562306a36Sopenharmony_ci		cx_write(GPIO_ISM, 0x00000000); /* INTERRUPTS active low */
187662306a36Sopenharmony_ci		break;
187762306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950:
187862306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_2, 1);
187962306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_2);
188062306a36Sopenharmony_ci		msleep(100);
188162306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_2);
188262306a36Sopenharmony_ci		break;
188362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR5525:
188462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_STARBURST2:
188562306a36Sopenharmony_ci		/*
188662306a36Sopenharmony_ci		 * HVR5525 GPIO Details:
188762306a36Sopenharmony_ci		 *  GPIO-00 IR_WIDE
188862306a36Sopenharmony_ci		 *  GPIO-02 wake#
188962306a36Sopenharmony_ci		 *  GPIO-03 VAUX Pres.
189062306a36Sopenharmony_ci		 *  GPIO-07 PROG#
189162306a36Sopenharmony_ci		 *  GPIO-08 SAT_RESN
189262306a36Sopenharmony_ci		 *  GPIO-09 TER_RESN
189362306a36Sopenharmony_ci		 *  GPIO-10 B2_SENSE
189462306a36Sopenharmony_ci		 *  GPIO-11 B1_SENSE
189562306a36Sopenharmony_ci		 *  GPIO-15 IR_LED_STATUS
189662306a36Sopenharmony_ci		 *  GPIO-19 IR_NARROW
189762306a36Sopenharmony_ci		 *  GPIO-20 Blauster1
189862306a36Sopenharmony_ci		 *  ALTGPIO VAUX_SWITCH
189962306a36Sopenharmony_ci		 *  AUX_PLL_CLK : Blaster2
190062306a36Sopenharmony_ci		 */
190162306a36Sopenharmony_ci		/* Put the parts into reset and back */
190262306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
190362306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
190462306a36Sopenharmony_ci		msleep(100);
190562306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
190662306a36Sopenharmony_ci		msleep(100);
190762306a36Sopenharmony_ci		break;
190862306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_260E:
190962306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_460E:
191062306a36Sopenharmony_ci		/* For documentation purposes, it's worth noting that this
191162306a36Sopenharmony_ci		 * card does not have any GPIO's connected to subcomponents.
191262306a36Sopenharmony_ci		 */
191362306a36Sopenharmony_ci		break;
191462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
191562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
191662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885:
191762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
191862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885:
191962306a36Sopenharmony_ci		/*
192062306a36Sopenharmony_ci		 * GPIO-08 TER1_RESN
192162306a36Sopenharmony_ci		 * GPIO-09 TER2_RESN
192262306a36Sopenharmony_ci		 */
192362306a36Sopenharmony_ci		/* Put the parts into reset and back */
192462306a36Sopenharmony_ci		cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
192562306a36Sopenharmony_ci		cx23885_gpio_clear(dev, GPIO_8 | GPIO_9);
192662306a36Sopenharmony_ci		msleep(100);
192762306a36Sopenharmony_ci		cx23885_gpio_set(dev, GPIO_8 | GPIO_9);
192862306a36Sopenharmony_ci		msleep(100);
192962306a36Sopenharmony_ci		break;
193062306a36Sopenharmony_ci	}
193162306a36Sopenharmony_ci}
193262306a36Sopenharmony_ci
193362306a36Sopenharmony_ciint cx23885_ir_init(struct cx23885_dev *dev)
193462306a36Sopenharmony_ci{
193562306a36Sopenharmony_ci	static struct v4l2_subdev_io_pin_config ir_rxtx_pin_cfg[] = {
193662306a36Sopenharmony_ci		{
193762306a36Sopenharmony_ci			.flags	  = BIT(V4L2_SUBDEV_IO_PIN_INPUT),
193862306a36Sopenharmony_ci			.pin	  = CX23885_PIN_IR_RX_GPIO19,
193962306a36Sopenharmony_ci			.function = CX23885_PAD_IR_RX,
194062306a36Sopenharmony_ci			.value	  = 0,
194162306a36Sopenharmony_ci			.strength = CX25840_PIN_DRIVE_MEDIUM,
194262306a36Sopenharmony_ci		}, {
194362306a36Sopenharmony_ci			.flags	  = BIT(V4L2_SUBDEV_IO_PIN_OUTPUT),
194462306a36Sopenharmony_ci			.pin	  = CX23885_PIN_IR_TX_GPIO20,
194562306a36Sopenharmony_ci			.function = CX23885_PAD_IR_TX,
194662306a36Sopenharmony_ci			.value	  = 0,
194762306a36Sopenharmony_ci			.strength = CX25840_PIN_DRIVE_MEDIUM,
194862306a36Sopenharmony_ci		}
194962306a36Sopenharmony_ci	};
195062306a36Sopenharmony_ci	const size_t ir_rxtx_pin_cfg_count = ARRAY_SIZE(ir_rxtx_pin_cfg);
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	static struct v4l2_subdev_io_pin_config ir_rx_pin_cfg[] = {
195362306a36Sopenharmony_ci		{
195462306a36Sopenharmony_ci			.flags	  = BIT(V4L2_SUBDEV_IO_PIN_INPUT),
195562306a36Sopenharmony_ci			.pin	  = CX23885_PIN_IR_RX_GPIO19,
195662306a36Sopenharmony_ci			.function = CX23885_PAD_IR_RX,
195762306a36Sopenharmony_ci			.value	  = 0,
195862306a36Sopenharmony_ci			.strength = CX25840_PIN_DRIVE_MEDIUM,
195962306a36Sopenharmony_ci		}
196062306a36Sopenharmony_ci	};
196162306a36Sopenharmony_ci	const size_t ir_rx_pin_cfg_count = ARRAY_SIZE(ir_rx_pin_cfg);
196262306a36Sopenharmony_ci
196362306a36Sopenharmony_ci	struct v4l2_subdev_ir_parameters params;
196462306a36Sopenharmony_ci	int ret = 0;
196562306a36Sopenharmony_ci	switch (dev->board) {
196662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500:
196762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
196862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800:
196962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1200:
197062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1400:
197162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1275:
197262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255:
197362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
197462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1210:
197562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
197662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
197762306a36Sopenharmony_ci		/* FIXME: Implement me */
197862306a36Sopenharmony_ci		break;
197962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
198062306a36Sopenharmony_ci		ret = cx23888_ir_probe(dev);
198162306a36Sopenharmony_ci		if (ret)
198262306a36Sopenharmony_ci			break;
198362306a36Sopenharmony_ci		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
198462306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
198562306a36Sopenharmony_ci				 ir_rx_pin_cfg_count, ir_rx_pin_cfg);
198662306a36Sopenharmony_ci		break;
198762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
198862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
198962306a36Sopenharmony_ci		ret = cx23888_ir_probe(dev);
199062306a36Sopenharmony_ci		if (ret)
199162306a36Sopenharmony_ci			break;
199262306a36Sopenharmony_ci		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_888_IR);
199362306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
199462306a36Sopenharmony_ci				 ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
199562306a36Sopenharmony_ci		/*
199662306a36Sopenharmony_ci		 * For these boards we need to invert the Tx output via the
199762306a36Sopenharmony_ci		 * IR controller to have the LED off while idle
199862306a36Sopenharmony_ci		 */
199962306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_ir, ir, tx_g_parameters, &params);
200062306a36Sopenharmony_ci		params.enable = false;
200162306a36Sopenharmony_ci		params.shutdown = false;
200262306a36Sopenharmony_ci		params.invert_level = true;
200362306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
200462306a36Sopenharmony_ci		params.shutdown = true;
200562306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_ir, ir, tx_s_parameters, &params);
200662306a36Sopenharmony_ci		break;
200762306a36Sopenharmony_ci	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
200862306a36Sopenharmony_ci	case CX23885_BOARD_TEVII_S470:
200962306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8507:
201062306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
201162306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
201262306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T9580:
201362306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T980C:
201462306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950C:
201562306a36Sopenharmony_ci	case CX23885_BOARD_TT_CT2_4500_CI:
201662306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950:
201762306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S952:
201862306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T982:
201962306a36Sopenharmony_ci		if (!enable_885_ir)
202062306a36Sopenharmony_ci			break;
202162306a36Sopenharmony_ci		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
202262306a36Sopenharmony_ci		if (dev->sd_ir == NULL) {
202362306a36Sopenharmony_ci			ret = -ENODEV;
202462306a36Sopenharmony_ci			break;
202562306a36Sopenharmony_ci		}
202662306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
202762306a36Sopenharmony_ci				 ir_rx_pin_cfg_count, ir_rx_pin_cfg);
202862306a36Sopenharmony_ci		break;
202962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
203062306a36Sopenharmony_ci		if (!enable_885_ir)
203162306a36Sopenharmony_ci			break;
203262306a36Sopenharmony_ci		dev->sd_ir = cx23885_find_hw(dev, CX23885_HW_AV_CORE);
203362306a36Sopenharmony_ci		if (dev->sd_ir == NULL) {
203462306a36Sopenharmony_ci			ret = -ENODEV;
203562306a36Sopenharmony_ci			break;
203662306a36Sopenharmony_ci		}
203762306a36Sopenharmony_ci		v4l2_subdev_call(dev->sd_cx25840, core, s_io_pin_config,
203862306a36Sopenharmony_ci				 ir_rxtx_pin_cfg_count, ir_rxtx_pin_cfg);
203962306a36Sopenharmony_ci		break;
204062306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
204162306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
204262306a36Sopenharmony_ci		request_module("ir-kbd-i2c");
204362306a36Sopenharmony_ci		break;
204462306a36Sopenharmony_ci	}
204562306a36Sopenharmony_ci
204662306a36Sopenharmony_ci	return ret;
204762306a36Sopenharmony_ci}
204862306a36Sopenharmony_ci
204962306a36Sopenharmony_civoid cx23885_ir_fini(struct cx23885_dev *dev)
205062306a36Sopenharmony_ci{
205162306a36Sopenharmony_ci	switch (dev->board) {
205262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
205362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
205462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
205562306a36Sopenharmony_ci		cx23885_irq_remove(dev, PCI_MSK_IR);
205662306a36Sopenharmony_ci		cx23888_ir_remove(dev);
205762306a36Sopenharmony_ci		dev->sd_ir = NULL;
205862306a36Sopenharmony_ci		break;
205962306a36Sopenharmony_ci	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
206062306a36Sopenharmony_ci	case CX23885_BOARD_TEVII_S470:
206162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
206262306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8507:
206362306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
206462306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
206562306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T9580:
206662306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T980C:
206762306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950C:
206862306a36Sopenharmony_ci	case CX23885_BOARD_TT_CT2_4500_CI:
206962306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950:
207062306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S952:
207162306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T982:
207262306a36Sopenharmony_ci		cx23885_irq_remove(dev, PCI_MSK_AV_CORE);
207362306a36Sopenharmony_ci		/* sd_ir is a duplicate pointer to the AV Core, just clear it */
207462306a36Sopenharmony_ci		dev->sd_ir = NULL;
207562306a36Sopenharmony_ci		break;
207662306a36Sopenharmony_ci	}
207762306a36Sopenharmony_ci}
207862306a36Sopenharmony_ci
207962306a36Sopenharmony_cistatic int netup_jtag_io(void *device, int tms, int tdi, int read_tdo)
208062306a36Sopenharmony_ci{
208162306a36Sopenharmony_ci	int data;
208262306a36Sopenharmony_ci	int tdo = 0;
208362306a36Sopenharmony_ci	struct cx23885_dev *dev = (struct cx23885_dev *)device;
208462306a36Sopenharmony_ci	/*TMS*/
208562306a36Sopenharmony_ci	data = ((cx_read(GP0_IO)) & (~0x00000002));
208662306a36Sopenharmony_ci	data |= (tms ? 0x00020002 : 0x00020000);
208762306a36Sopenharmony_ci	cx_write(GP0_IO, data);
208862306a36Sopenharmony_ci
208962306a36Sopenharmony_ci	/*TDI*/
209062306a36Sopenharmony_ci	data = ((cx_read(MC417_RWD)) & (~0x0000a000));
209162306a36Sopenharmony_ci	data |= (tdi ? 0x00008000 : 0);
209262306a36Sopenharmony_ci	cx_write(MC417_RWD, data);
209362306a36Sopenharmony_ci	if (read_tdo)
209462306a36Sopenharmony_ci		tdo = (data & 0x00004000) ? 1 : 0; /*TDO*/
209562306a36Sopenharmony_ci
209662306a36Sopenharmony_ci	cx_write(MC417_RWD, data | 0x00002000);
209762306a36Sopenharmony_ci	udelay(1);
209862306a36Sopenharmony_ci	/*TCK*/
209962306a36Sopenharmony_ci	cx_write(MC417_RWD, data);
210062306a36Sopenharmony_ci
210162306a36Sopenharmony_ci	return tdo;
210262306a36Sopenharmony_ci}
210362306a36Sopenharmony_ci
210462306a36Sopenharmony_civoid cx23885_ir_pci_int_enable(struct cx23885_dev *dev)
210562306a36Sopenharmony_ci{
210662306a36Sopenharmony_ci	switch (dev->board) {
210762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
210862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
210962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
211062306a36Sopenharmony_ci		if (dev->sd_ir)
211162306a36Sopenharmony_ci			cx23885_irq_add_enable(dev, PCI_MSK_IR);
211262306a36Sopenharmony_ci		break;
211362306a36Sopenharmony_ci	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
211462306a36Sopenharmony_ci	case CX23885_BOARD_TEVII_S470:
211562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
211662306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8507:
211762306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
211862306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
211962306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T9580:
212062306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T980C:
212162306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950C:
212262306a36Sopenharmony_ci	case CX23885_BOARD_TT_CT2_4500_CI:
212362306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950:
212462306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S952:
212562306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T982:
212662306a36Sopenharmony_ci		if (dev->sd_ir)
212762306a36Sopenharmony_ci			cx23885_irq_add_enable(dev, PCI_MSK_AV_CORE);
212862306a36Sopenharmony_ci		break;
212962306a36Sopenharmony_ci	}
213062306a36Sopenharmony_ci}
213162306a36Sopenharmony_ci
213262306a36Sopenharmony_civoid cx23885_card_setup(struct cx23885_dev *dev)
213362306a36Sopenharmony_ci{
213462306a36Sopenharmony_ci	struct cx23885_tsport *ts1 = &dev->ts1;
213562306a36Sopenharmony_ci	struct cx23885_tsport *ts2 = &dev->ts2;
213662306a36Sopenharmony_ci
213762306a36Sopenharmony_ci	static u8 eeprom[256];
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci	if (dev->i2c_bus[0].i2c_rc == 0) {
214062306a36Sopenharmony_ci		dev->i2c_bus[0].i2c_client.addr = 0xa0 >> 1;
214162306a36Sopenharmony_ci		tveeprom_read(&dev->i2c_bus[0].i2c_client,
214262306a36Sopenharmony_ci			      eeprom, sizeof(eeprom));
214362306a36Sopenharmony_ci	}
214462306a36Sopenharmony_ci
214562306a36Sopenharmony_ci	switch (dev->board) {
214662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
214762306a36Sopenharmony_ci		if (dev->i2c_bus[0].i2c_rc == 0) {
214862306a36Sopenharmony_ci			if (eeprom[0x80] != 0x84)
214962306a36Sopenharmony_ci				hauppauge_eeprom(dev, eeprom+0xc0);
215062306a36Sopenharmony_ci			else
215162306a36Sopenharmony_ci				hauppauge_eeprom(dev, eeprom+0x80);
215262306a36Sopenharmony_ci		}
215362306a36Sopenharmony_ci		break;
215462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500:
215562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
215662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1400:
215762306a36Sopenharmony_ci		if (dev->i2c_bus[0].i2c_rc == 0)
215862306a36Sopenharmony_ci			hauppauge_eeprom(dev, eeprom+0x80);
215962306a36Sopenharmony_ci		break;
216062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800:
216162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
216262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1200:
216362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1700:
216462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
216562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1275:
216662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255:
216762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
216862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1210:
216962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
217062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
217162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR4400:
217262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_STARBURST:
217362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
217462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR5525:
217562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
217662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_STARBURST2:
217762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
217862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885:
217962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
218062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885:
218162306a36Sopenharmony_ci		if (dev->i2c_bus[0].i2c_rc == 0)
218262306a36Sopenharmony_ci			hauppauge_eeprom(dev, eeprom+0xc0);
218362306a36Sopenharmony_ci		break;
218462306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_260E:
218562306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_460E:
218662306a36Sopenharmony_ci		dev->i2c_bus[1].i2c_client.addr = 0xa0 >> 1;
218762306a36Sopenharmony_ci		tveeprom_read(&dev->i2c_bus[1].i2c_client,
218862306a36Sopenharmony_ci			      eeprom, sizeof(eeprom));
218962306a36Sopenharmony_ci		if (dev->i2c_bus[0].i2c_rc == 0)
219062306a36Sopenharmony_ci			viewcast_eeprom(dev, eeprom);
219162306a36Sopenharmony_ci		break;
219262306a36Sopenharmony_ci	}
219362306a36Sopenharmony_ci
219462306a36Sopenharmony_ci	switch (dev->board) {
219562306a36Sopenharmony_ci	case CX23885_BOARD_AVERMEDIA_HC81R:
219662306a36Sopenharmony_ci		/* Defaults for VID B */
219762306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x4; /* Parallel */
219862306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
219962306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
220062306a36Sopenharmony_ci		/* Defaults for VID C */
220162306a36Sopenharmony_ci		/* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
220262306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0x10e;
220362306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
220462306a36Sopenharmony_ci		ts2->src_sel_val     = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
220562306a36Sopenharmony_ci		break;
220662306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_7_DUAL_EXP:
220762306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP:
220862306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL_EXP2:
220962306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
221062306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
221162306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
221262306a36Sopenharmony_ci		fallthrough;
221362306a36Sopenharmony_ci	case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
221462306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
221562306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
221662306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
221762306a36Sopenharmony_ci		break;
221862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
221962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800:
222062306a36Sopenharmony_ci		/* Defaults for VID B - Analog encoder */
222162306a36Sopenharmony_ci		/* DREQ_POL, SMODE, PUNC_CLK, MCLK_POL Serial bus + punc clk */
222262306a36Sopenharmony_ci		ts1->gen_ctrl_val    = 0x10e;
222362306a36Sopenharmony_ci		ts1->ts_clk_en_val   = 0x1; /* Enable TS_CLK */
222462306a36Sopenharmony_ci		ts1->src_sel_val     = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
222562306a36Sopenharmony_ci
222662306a36Sopenharmony_ci		/* APB_TSVALERR_POL (active low)*/
222762306a36Sopenharmony_ci		ts1->vld_misc_val    = 0x2000;
222862306a36Sopenharmony_ci		ts1->hw_sop_ctrl_val = (0x47 << 16 | 188 << 4 | 0xc);
222962306a36Sopenharmony_ci		cx_write(0x130184, 0xc);
223062306a36Sopenharmony_ci
223162306a36Sopenharmony_ci		/* Defaults for VID C */
223262306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
223362306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
223462306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
223562306a36Sopenharmony_ci		break;
223662306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6920:
223762306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x4; /* Parallel */
223862306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
223962306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
224062306a36Sopenharmony_ci		break;
224162306a36Sopenharmony_ci	case CX23885_BOARD_TEVII_S470:
224262306a36Sopenharmony_ci	case CX23885_BOARD_TEVII_S471:
224362306a36Sopenharmony_ci	case CX23885_BOARD_DVBWORLD_2005:
224462306a36Sopenharmony_ci	case CX23885_BOARD_PROF_8000:
224562306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T980C:
224662306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950C:
224762306a36Sopenharmony_ci	case CX23885_BOARD_TT_CT2_4500_CI:
224862306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950:
224962306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x5; /* Parallel */
225062306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
225162306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
225262306a36Sopenharmony_ci		break;
225362306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
225462306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
225562306a36Sopenharmony_ci	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
225662306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
225762306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
225862306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
225962306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
226062306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
226162306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
226262306a36Sopenharmony_ci		break;
226362306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
226462306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
226562306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
226662306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
226762306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
226862306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
226962306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
227062306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
227162306a36Sopenharmony_ci		tbs_card_init(dev);
227262306a36Sopenharmony_ci		break;
227362306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8506:
227462306a36Sopenharmony_ci	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
227562306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8507:
227662306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x5; /* Parallel */
227762306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
227862306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
227962306a36Sopenharmony_ci		break;
228062306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8558PRO:
228162306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x5; /* Parallel */
228262306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
228362306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
228462306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
228562306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
228662306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
228762306a36Sopenharmony_ci		break;
228862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR4400:
228962306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
229062306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
229162306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
229262306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
229362306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
229462306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
229562306a36Sopenharmony_ci		break;
229662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_STARBURST:
229762306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
229862306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
229962306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
230062306a36Sopenharmony_ci		break;
230162306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T9580:
230262306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T982:
230362306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x5; /* Parallel */
230462306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
230562306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
230662306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0x8; /* Serial bus */
230762306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
230862306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
230962306a36Sopenharmony_ci		break;
231062306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S952:
231162306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x5; /* Parallel */
231262306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
231362306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
231462306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xe; /* Serial bus */
231562306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
231662306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
231762306a36Sopenharmony_ci		break;
231862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR5525:
231962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_STARBURST2:
232062306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0x5; /* Parallel */
232162306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
232262306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
232362306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
232462306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
232562306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
232662306a36Sopenharmony_ci		break;
232762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
232862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
232962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB_885:
233062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
233162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC_885:
233262306a36Sopenharmony_ci		ts1->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
233362306a36Sopenharmony_ci		ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
233462306a36Sopenharmony_ci		ts1->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
233562306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
233662306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
233762306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
233862306a36Sopenharmony_ci		break;
233962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
234062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500:
234162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
234262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
234362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1200:
234462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1700:
234562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1400:
234662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
234762306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
234862306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
234962306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
235062306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
235162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
235262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1275:
235362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255:
235462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
235562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1210:
235662306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
235762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
235862306a36Sopenharmony_ci	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
235962306a36Sopenharmony_ci	default:
236062306a36Sopenharmony_ci		ts2->gen_ctrl_val  = 0xc; /* Serial bus + punctured clock */
236162306a36Sopenharmony_ci		ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
236262306a36Sopenharmony_ci		ts2->src_sel_val   = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
236362306a36Sopenharmony_ci	}
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	/* Certain boards support analog, or require the avcore to be
236662306a36Sopenharmony_ci	 * loaded, ensure this happens.
236762306a36Sopenharmony_ci	 */
236862306a36Sopenharmony_ci	switch (dev->board) {
236962306a36Sopenharmony_ci	case CX23885_BOARD_TEVII_S470:
237062306a36Sopenharmony_ci		/* Currently only enabled for the integrated IR controller */
237162306a36Sopenharmony_ci		if (!enable_885_ir)
237262306a36Sopenharmony_ci			break;
237362306a36Sopenharmony_ci		fallthrough;
237462306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1250:
237562306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800:
237662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
237762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
237862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1700:
237962306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H:
238062306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXPVR2200:
238162306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXDVR3200_H_XC4000:
238262306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E650F:
238362306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
238462306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
238562306a36Sopenharmony_ci	case CX23885_BOARD_COMPRO_VIDEOMATE_E800:
238662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255:
238762306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1255_22111:
238862306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1265_K4:
238962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_DVB:
239062306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_QUADHD_ATSC:
239162306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1270:
239262306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1850:
239362306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR5525:
239462306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8506:
239562306a36Sopenharmony_ci	case CX23885_BOARD_MAGICPRO_PROHDTVE2:
239662306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1290:
239762306a36Sopenharmony_ci	case CX23885_BOARD_LEADTEK_WINFAST_PXTV1200:
239862306a36Sopenharmony_ci	case CX23885_BOARD_GOTVIEW_X5_3D_HYBRID:
239962306a36Sopenharmony_ci	case CX23885_BOARD_HAUPPAUGE_HVR1500:
240062306a36Sopenharmony_ci	case CX23885_BOARD_MPX885:
240162306a36Sopenharmony_ci	case CX23885_BOARD_MYGICA_X8507:
240262306a36Sopenharmony_ci	case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
240362306a36Sopenharmony_ci	case CX23885_BOARD_AVERMEDIA_HC81R:
240462306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6980:
240562306a36Sopenharmony_ci	case CX23885_BOARD_TBS_6981:
240662306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T9580:
240762306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T980C:
240862306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950C:
240962306a36Sopenharmony_ci	case CX23885_BOARD_TT_CT2_4500_CI:
241062306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S950:
241162306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_S952:
241262306a36Sopenharmony_ci	case CX23885_BOARD_DVBSKY_T982:
241362306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_260E:
241462306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_460E:
241562306a36Sopenharmony_ci	case CX23885_BOARD_AVERMEDIA_CE310B:
241662306a36Sopenharmony_ci		dev->sd_cx25840 = v4l2_i2c_new_subdev(&dev->v4l2_dev,
241762306a36Sopenharmony_ci				&dev->i2c_bus[2].i2c_adap,
241862306a36Sopenharmony_ci				"cx25840", 0x88 >> 1, NULL);
241962306a36Sopenharmony_ci		if (dev->sd_cx25840) {
242062306a36Sopenharmony_ci			/* set host data for clk_freq configuration */
242162306a36Sopenharmony_ci			v4l2_set_subdev_hostdata(dev->sd_cx25840,
242262306a36Sopenharmony_ci						&dev->clk_freq);
242362306a36Sopenharmony_ci
242462306a36Sopenharmony_ci			dev->sd_cx25840->grp_id = CX23885_HW_AV_CORE;
242562306a36Sopenharmony_ci			v4l2_subdev_call(dev->sd_cx25840, core, load_fw);
242662306a36Sopenharmony_ci		}
242762306a36Sopenharmony_ci		break;
242862306a36Sopenharmony_ci	}
242962306a36Sopenharmony_ci
243062306a36Sopenharmony_ci	switch (dev->board) {
243162306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_260E:
243262306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&dev->v4l2_dev,
243362306a36Sopenharmony_ci				&dev->i2c_bus[0].i2c_adap,
243462306a36Sopenharmony_ci				"cs3308", 0x82 >> 1, NULL);
243562306a36Sopenharmony_ci		break;
243662306a36Sopenharmony_ci	case CX23885_BOARD_VIEWCAST_460E:
243762306a36Sopenharmony_ci		/* This cs3308 controls the audio from the breakout cable */
243862306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&dev->v4l2_dev,
243962306a36Sopenharmony_ci				&dev->i2c_bus[0].i2c_adap,
244062306a36Sopenharmony_ci				"cs3308", 0x80 >> 1, NULL);
244162306a36Sopenharmony_ci		/* This cs3308 controls the audio from the onboard header */
244262306a36Sopenharmony_ci		v4l2_i2c_new_subdev(&dev->v4l2_dev,
244362306a36Sopenharmony_ci				&dev->i2c_bus[0].i2c_adap,
244462306a36Sopenharmony_ci				"cs3308", 0x82 >> 1, NULL);
244562306a36Sopenharmony_ci		break;
244662306a36Sopenharmony_ci	}
244762306a36Sopenharmony_ci
244862306a36Sopenharmony_ci	/* AUX-PLL 27MHz CLK */
244962306a36Sopenharmony_ci	switch (dev->board) {
245062306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVBS2_CI:
245162306a36Sopenharmony_ci		netup_initialize(dev);
245262306a36Sopenharmony_ci		break;
245362306a36Sopenharmony_ci	case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF: {
245462306a36Sopenharmony_ci		int ret;
245562306a36Sopenharmony_ci		const struct firmware *fw;
245662306a36Sopenharmony_ci		const char *filename = "dvb-netup-altera-01.fw";
245762306a36Sopenharmony_ci		char *action = "configure";
245862306a36Sopenharmony_ci		static struct netup_card_info cinfo;
245962306a36Sopenharmony_ci		struct altera_config netup_config = {
246062306a36Sopenharmony_ci			.dev = dev,
246162306a36Sopenharmony_ci			.action = action,
246262306a36Sopenharmony_ci			.jtag_io = netup_jtag_io,
246362306a36Sopenharmony_ci		};
246462306a36Sopenharmony_ci
246562306a36Sopenharmony_ci		netup_initialize(dev);
246662306a36Sopenharmony_ci
246762306a36Sopenharmony_ci		netup_get_card_info(&dev->i2c_bus[0].i2c_adap, &cinfo);
246862306a36Sopenharmony_ci		if (netup_card_rev)
246962306a36Sopenharmony_ci			cinfo.rev = netup_card_rev;
247062306a36Sopenharmony_ci
247162306a36Sopenharmony_ci		switch (cinfo.rev) {
247262306a36Sopenharmony_ci		case 0x4:
247362306a36Sopenharmony_ci			filename = "dvb-netup-altera-04.fw";
247462306a36Sopenharmony_ci			break;
247562306a36Sopenharmony_ci		default:
247662306a36Sopenharmony_ci			filename = "dvb-netup-altera-01.fw";
247762306a36Sopenharmony_ci			break;
247862306a36Sopenharmony_ci		}
247962306a36Sopenharmony_ci		pr_info("NetUP card rev=0x%x fw_filename=%s\n",
248062306a36Sopenharmony_ci			cinfo.rev, filename);
248162306a36Sopenharmony_ci
248262306a36Sopenharmony_ci		ret = request_firmware(&fw, filename, &dev->pci->dev);
248362306a36Sopenharmony_ci		if (ret != 0)
248462306a36Sopenharmony_ci			pr_err("did not find the firmware file '%s'. You can use <kernel_dir>/scripts/get_dvb_firmware to get the firmware.",
248562306a36Sopenharmony_ci			       filename);
248662306a36Sopenharmony_ci		else
248762306a36Sopenharmony_ci			altera_init(&netup_config, fw);
248862306a36Sopenharmony_ci
248962306a36Sopenharmony_ci		release_firmware(fw);
249062306a36Sopenharmony_ci		break;
249162306a36Sopenharmony_ci	}
249262306a36Sopenharmony_ci	}
249362306a36Sopenharmony_ci}
2494