brintos

brintos / linux-shallow public Read only

0
0
Text · 96.9 KiB · f01e48c Raw
3857 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * device driver for Conexant 2388x based TV cards4 * card-specific stuff.5 *6 * (c) 2003 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]7 */8 9#include "cx88.h"10#include "tea5767.h"11#include "xc4000.h"12 13#include <linux/init.h>14#include <linux/module.h>15#include <linux/pci.h>16#include <linux/delay.h>17#include <linux/slab.h>18 19static unsigned int tuner[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };20static unsigned int radio[] = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };21static unsigned int card[]  = {[0 ... (CX88_MAXBOARDS - 1)] = UNSET };22 23module_param_array(tuner, int, NULL, 0444);24module_param_array(radio, int, NULL, 0444);25module_param_array(card,  int, NULL, 0444);26 27MODULE_PARM_DESC(tuner, "tuner type");28MODULE_PARM_DESC(radio, "radio tuner type");29MODULE_PARM_DESC(card, "card type");30 31static unsigned int latency = UNSET;32module_param(latency, int, 0444);33MODULE_PARM_DESC(latency, "pci latency timer");34 35static int disable_ir;36module_param(disable_ir, int, 0444);37MODULE_PARM_DESC(disable_ir, "Disable IR support");38 39#define dprintk(level, fmt, arg...)	do {				\40	if (cx88_core_debug >= level)					\41		printk(KERN_DEBUG pr_fmt("%s: core:" fmt),		\42			__func__, ##arg);				\43} while (0)44 45/* ------------------------------------------------------------------ */46/* board config info                                                  */47 48/* If radio_type !=UNSET, radio_addr should be specified49 */50 51static const struct cx88_board cx88_boards[] = {52	[CX88_BOARD_UNKNOWN] = {53		.name		= "UNKNOWN/GENERIC",54		.tuner_type     = UNSET,55		.radio_type     = UNSET,56		.tuner_addr	= ADDR_UNSET,57		.radio_addr	= ADDR_UNSET,58		.input          = { {59			.type   = CX88_VMUX_COMPOSITE1,60			.vmux   = 0,61		}, {62			.type   = CX88_VMUX_COMPOSITE2,63			.vmux   = 1,64		}, {65			.type   = CX88_VMUX_COMPOSITE3,66			.vmux   = 2,67		}, {68			.type   = CX88_VMUX_COMPOSITE4,69			.vmux   = 3,70		} },71	},72	[CX88_BOARD_HAUPPAUGE] = {73		.name		= "Hauppauge WinTV 34xxx models",74		.tuner_type     = UNSET,75		.radio_type     = UNSET,76		.tuner_addr	= ADDR_UNSET,77		.radio_addr	= ADDR_UNSET,78		.tda9887_conf   = TDA9887_PRESENT,79		.input          = { {80			.type   = CX88_VMUX_TELEVISION,81			.vmux   = 0,82			.gpio0  = 0xff00,  // internal decoder83		}, {84			.type   = CX88_VMUX_DEBUG,85			.vmux   = 0,86			.gpio0  = 0xff01,  // mono from tuner chip87		}, {88			.type   = CX88_VMUX_COMPOSITE1,89			.vmux   = 1,90			.gpio0  = 0xff02,91		}, {92			.type   = CX88_VMUX_SVIDEO,93			.vmux   = 2,94			.gpio0  = 0xff02,95		} },96		.radio = {97			.type   = CX88_RADIO,98			.gpio0  = 0xff01,99		},100	},101	[CX88_BOARD_GDI] = {102		.name		= "GDI Black Gold",103		.tuner_type     = UNSET,104		.radio_type     = UNSET,105		.tuner_addr	= ADDR_UNSET,106		.radio_addr	= ADDR_UNSET,107		.input          = { {108			.type   = CX88_VMUX_TELEVISION,109			.vmux   = 0,110		}, {111			.type   = CX88_VMUX_SVIDEO,112			.vmux   = 2,113		} },114	},115	[CX88_BOARD_PIXELVIEW] = {116		.name           = "PixelView",117		.tuner_type     = TUNER_PHILIPS_PAL,118		.radio_type     = UNSET,119		.tuner_addr	= ADDR_UNSET,120		.radio_addr	= ADDR_UNSET,121		.input          = { {122			.type   = CX88_VMUX_TELEVISION,123			.vmux   = 0,124			.gpio0  = 0xff00,  // internal decoder125		}, {126			.type   = CX88_VMUX_COMPOSITE1,127			.vmux   = 1,128		}, {129			.type   = CX88_VMUX_SVIDEO,130			.vmux   = 2,131		} },132		.radio = {133			 .type  = CX88_RADIO,134			 .gpio0 = 0xff10,135		},136	},137	[CX88_BOARD_ATI_WONDER_PRO] = {138		.name           = "ATI TV Wonder Pro",139		.tuner_type     = TUNER_PHILIPS_4IN1,140		.radio_type     = UNSET,141		.tuner_addr	= ADDR_UNSET,142		.radio_addr	= ADDR_UNSET,143		.tda9887_conf   = TDA9887_PRESENT | TDA9887_INTERCARRIER,144		.input          = { {145			.type   = CX88_VMUX_TELEVISION,146			.vmux   = 0,147			.gpio0  = 0x03ff,148		}, {149			.type   = CX88_VMUX_COMPOSITE1,150			.vmux   = 1,151			.gpio0  = 0x03fe,152		}, {153			.type   = CX88_VMUX_SVIDEO,154			.vmux   = 2,155			.gpio0  = 0x03fe,156		} },157	},158	[CX88_BOARD_WINFAST2000XP_EXPERT] = {159		.name           = "Leadtek Winfast 2000XP Expert",160		.tuner_type     = TUNER_PHILIPS_4IN1,161		.radio_type     = UNSET,162		.tuner_addr	= ADDR_UNSET,163		.radio_addr	= ADDR_UNSET,164		.tda9887_conf   = TDA9887_PRESENT,165		.input          = { {166			.type   = CX88_VMUX_TELEVISION,167			.vmux   = 0,168			.gpio0	= 0x00F5e700,169			.gpio1  = 0x00003004,170			.gpio2  = 0x00F5e700,171			.gpio3  = 0x02000000,172		}, {173			.type   = CX88_VMUX_COMPOSITE1,174			.vmux   = 1,175			.gpio0	= 0x00F5c700,176			.gpio1  = 0x00003004,177			.gpio2  = 0x00F5c700,178			.gpio3  = 0x02000000,179		}, {180			.type   = CX88_VMUX_SVIDEO,181			.vmux   = 2,182			.gpio0	= 0x00F5c700,183			.gpio1  = 0x00003004,184			.gpio2  = 0x00F5c700,185			.gpio3  = 0x02000000,186		} },187		.radio = {188			.type   = CX88_RADIO,189			.gpio0	= 0x00F5d700,190			.gpio1  = 0x00003004,191			.gpio2  = 0x00F5d700,192			.gpio3  = 0x02000000,193		},194	},195	[CX88_BOARD_AVERTV_STUDIO_303] = {196		.name           = "AverTV Studio 303 (M126)",197		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,198		.radio_type     = UNSET,199		.tuner_addr	= ADDR_UNSET,200		.radio_addr	= ADDR_UNSET,201		.tda9887_conf   = TDA9887_PRESENT,202		.input          = { {203			.type   = CX88_VMUX_TELEVISION,204			.vmux   = 0,205			.gpio1  = 0xe09f,206		}, {207			.type   = CX88_VMUX_COMPOSITE1,208			.vmux   = 1,209			.gpio1  = 0xe05f,210		}, {211			.type   = CX88_VMUX_SVIDEO,212			.vmux   = 2,213			.gpio1  = 0xe05f,214		} },215		.radio = {216			.gpio1  = 0xe0df,217			.type   = CX88_RADIO,218		},219	},220	[CX88_BOARD_MSI_TVANYWHERE_MASTER] = {221		// added gpio values thanks to Michal222		// values for PAL from DScaler223		.name           = "MSI TV-@nywhere Master",224		.tuner_type     = TUNER_MT2032,225		.radio_type     = UNSET,226		.tuner_addr	= ADDR_UNSET,227		.radio_addr	= ADDR_UNSET,228		.tda9887_conf	= TDA9887_PRESENT | TDA9887_INTERCARRIER_NTSC,229		.input          = { {230			.type   = CX88_VMUX_TELEVISION,231			.vmux   = 0,232			.gpio0  = 0x000040bf,233			.gpio1  = 0x000080c0,234			.gpio2  = 0x0000ff40,235		}, {236			.type   = CX88_VMUX_COMPOSITE1,237			.vmux   = 1,238			.gpio0  = 0x000040bf,239			.gpio1  = 0x000080c0,240			.gpio2  = 0x0000ff40,241		}, {242			.type   = CX88_VMUX_SVIDEO,243			.vmux   = 2,244			.gpio0  = 0x000040bf,245			.gpio1  = 0x000080c0,246			.gpio2  = 0x0000ff40,247		} },248		.radio = {249			 .type   = CX88_RADIO,250			 .vmux   = 3,251			 .gpio0  = 0x000040bf,252			 .gpio1  = 0x000080c0,253			 .gpio2  = 0x0000ff20,254		},255	},256	[CX88_BOARD_WINFAST_DV2000] = {257		.name           = "Leadtek Winfast DV2000",258		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,259		.radio_type     = UNSET,260		.tuner_addr	= ADDR_UNSET,261		.radio_addr	= ADDR_UNSET,262		.tda9887_conf   = TDA9887_PRESENT,263		.input          = { {264			.type   = CX88_VMUX_TELEVISION,265			.vmux   = 0,266			.gpio0  = 0x0035e700,267			.gpio1  = 0x00003004,268			.gpio2  = 0x0035e700,269			.gpio3  = 0x02000000,270		}, {271			.type   = CX88_VMUX_COMPOSITE1,272			.vmux   = 1,273			.gpio0  = 0x0035c700,274			.gpio1  = 0x00003004,275			.gpio2  = 0x0035c700,276			.gpio3  = 0x02000000,277		}, {278			.type   = CX88_VMUX_SVIDEO,279			.vmux   = 2,280			.gpio0  = 0x0035c700,281			.gpio1  = 0x0035c700,282			.gpio2  = 0x02000000,283			.gpio3  = 0x02000000,284		} },285		.radio = {286			.type   = CX88_RADIO,287			.gpio0  = 0x0035d700,288			.gpio1  = 0x00007004,289			.gpio2  = 0x0035d700,290			.gpio3  = 0x02000000,291		},292	},293	[CX88_BOARD_LEADTEK_PVR2000] = {294		// gpio values for PAL version from regspy by DScaler295		.name           = "Leadtek PVR 2000",296		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,297		.radio_type     = UNSET,298		.tuner_addr	= ADDR_UNSET,299		.radio_addr	= ADDR_UNSET,300		.tda9887_conf   = TDA9887_PRESENT,301		.input          = { {302			.type   = CX88_VMUX_TELEVISION,303			.vmux   = 0,304			.gpio0  = 0x0000bde2,305			.audioroute = 1,306		}, {307			.type   = CX88_VMUX_COMPOSITE1,308			.vmux   = 1,309			.gpio0  = 0x0000bde6,310			.audioroute = 1,311		}, {312			.type   = CX88_VMUX_SVIDEO,313			.vmux   = 2,314			.gpio0  = 0x0000bde6,315			.audioroute = 1,316		} },317		.radio = {318			.type   = CX88_RADIO,319			.gpio0  = 0x0000bd62,320			.audioroute = 1,321		},322		.mpeg           = CX88_MPEG_BLACKBIRD,323	},324	[CX88_BOARD_IODATA_GVVCP3PCI] = {325		.name		= "IODATA GV-VCP3/PCI",326		.tuner_type     = UNSET,327		.radio_type     = UNSET,328		.tuner_addr	= ADDR_UNSET,329		.radio_addr	= ADDR_UNSET,330		.input          = { {331			.type   = CX88_VMUX_COMPOSITE1,332			.vmux   = 0,333		}, {334			.type   = CX88_VMUX_COMPOSITE2,335			.vmux   = 1,336		}, {337			.type   = CX88_VMUX_SVIDEO,338			.vmux   = 2,339		} },340	},341	[CX88_BOARD_PROLINK_PLAYTVPVR] = {342		.name           = "Prolink PlayTV PVR",343		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,344		.radio_type     = UNSET,345		.tuner_addr	= ADDR_UNSET,346		.radio_addr	= ADDR_UNSET,347		.tda9887_conf	= TDA9887_PRESENT,348		.input          = { {349			.type   = CX88_VMUX_TELEVISION,350			.vmux   = 0,351			.gpio0  = 0xbff0,352		}, {353			.type   = CX88_VMUX_COMPOSITE1,354			.vmux   = 1,355			.gpio0  = 0xbff3,356		}, {357			.type   = CX88_VMUX_SVIDEO,358			.vmux   = 2,359			.gpio0  = 0xbff3,360		} },361		.radio = {362			.type   = CX88_RADIO,363			.gpio0  = 0xbff0,364		},365	},366	[CX88_BOARD_ASUS_PVR_416] = {367		.name		= "ASUS PVR-416",368		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,369		.radio_type     = UNSET,370		.tuner_addr	= ADDR_UNSET,371		.radio_addr	= ADDR_UNSET,372		.tda9887_conf   = TDA9887_PRESENT,373		.input          = { {374			.type   = CX88_VMUX_TELEVISION,375			.vmux   = 0,376			.gpio0  = 0x0000fde6,377		}, {378			.type   = CX88_VMUX_SVIDEO,379			.vmux   = 2,380			.gpio0  = 0x0000fde6, // 0x0000fda6 L,R RCA audio in?381			.audioroute = 1,382		} },383		.radio = {384			.type   = CX88_RADIO,385			.gpio0  = 0x0000fde2,386		},387		.mpeg           = CX88_MPEG_BLACKBIRD,388	},389	[CX88_BOARD_MSI_TVANYWHERE] = {390		.name           = "MSI TV-@nywhere",391		.tuner_type     = TUNER_MT2032,392		.radio_type     = UNSET,393		.tuner_addr	= ADDR_UNSET,394		.radio_addr	= ADDR_UNSET,395		.tda9887_conf   = TDA9887_PRESENT,396		.input          = { {397			.type   = CX88_VMUX_TELEVISION,398			.vmux   = 0,399			.gpio0  = 0x00000fbf,400			.gpio2  = 0x0000fc08,401		}, {402			.type   = CX88_VMUX_COMPOSITE1,403			.vmux   = 1,404			.gpio0  = 0x00000fbf,405			.gpio2  = 0x0000fc68,406		}, {407			.type   = CX88_VMUX_SVIDEO,408			.vmux   = 2,409			.gpio0  = 0x00000fbf,410			.gpio2  = 0x0000fc68,411		} },412	},413	[CX88_BOARD_KWORLD_DVB_T] = {414		.name           = "KWorld/VStream XPert DVB-T",415		.tuner_type     = UNSET,416		.radio_type     = UNSET,417		.tuner_addr	= ADDR_UNSET,418		.radio_addr	= ADDR_UNSET,419		.input          = { {420			.type   = CX88_VMUX_COMPOSITE1,421			.vmux   = 1,422			.gpio0  = 0x0700,423			.gpio2  = 0x0101,424		}, {425			.type   = CX88_VMUX_SVIDEO,426			.vmux   = 2,427			.gpio0  = 0x0700,428			.gpio2  = 0x0101,429		} },430		.mpeg           = CX88_MPEG_DVB,431	},432	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1] = {433		.name           = "DViCO FusionHDTV DVB-T1",434		.tuner_type     = UNSET, /* No analog tuner */435		.radio_type     = UNSET,436		.tuner_addr	= ADDR_UNSET,437		.radio_addr	= ADDR_UNSET,438		.input          = { {439			.type   = CX88_VMUX_COMPOSITE1,440			.vmux   = 1,441			.gpio0  = 0x000027df,442		}, {443			.type   = CX88_VMUX_SVIDEO,444			.vmux   = 2,445			.gpio0  = 0x000027df,446		} },447		.mpeg           = CX88_MPEG_DVB,448	},449	[CX88_BOARD_KWORLD_LTV883] = {450		.name           = "KWorld LTV883RF",451		.tuner_type     = TUNER_TNF_8831BGFF,452		.radio_type     = UNSET,453		.tuner_addr	= ADDR_UNSET,454		.radio_addr	= ADDR_UNSET,455		.input          = { {456			.type   = CX88_VMUX_TELEVISION,457			.vmux   = 0,458			.gpio0  = 0x07f8,459		}, {460			.type   = CX88_VMUX_DEBUG,461			.vmux   = 0,462			.gpio0  = 0x07f9,  // mono from tuner chip463		}, {464			.type   = CX88_VMUX_COMPOSITE1,465			.vmux   = 1,466			.gpio0  = 0x000007fa,467		}, {468			.type   = CX88_VMUX_SVIDEO,469			.vmux   = 2,470			.gpio0  = 0x000007fa,471		} },472		.radio = {473			.type   = CX88_RADIO,474			.gpio0  = 0x000007f8,475		},476	},477	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q] = {478		.name		= "DViCO FusionHDTV 3 Gold-Q",479		.tuner_type     = TUNER_MICROTUNE_4042FI5,480		.radio_type     = UNSET,481		.tuner_addr	= ADDR_UNSET,482		.radio_addr	= ADDR_UNSET,483		/*484		 * GPIO[0] resets DT3302 DTV receiver485		 *     0 - reset asserted486		 *     1 - normal operation487		 * GPIO[1] mutes analog audio output connector488		 *     0 - enable selected source489		 *     1 - mute490		 * GPIO[2] selects source for analog audio output connector491		 *     0 - analog audio input connector on tab492		 *     1 - analog DAC output from CX23881 chip493		 * GPIO[3] selects RF input connector on tuner module494		 *     0 - RF connector labeled CABLE495		 *     1 - RF connector labeled ANT496		 * GPIO[4] selects high RF for QAM256 mode497		 *     0 - normal RF498		 *     1 - high RF499		 */500		.input          = { {501			.type   = CX88_VMUX_TELEVISION,502			.vmux   = 0,503			.gpio0	= 0x0f0d,504		}, {505			.type   = CX88_VMUX_CABLE,506			.vmux   = 0,507			.gpio0	= 0x0f05,508		}, {509			.type   = CX88_VMUX_COMPOSITE1,510			.vmux   = 1,511			.gpio0	= 0x0f00,512		}, {513			.type   = CX88_VMUX_SVIDEO,514			.vmux   = 2,515			.gpio0	= 0x0f00,516		} },517		.mpeg           = CX88_MPEG_DVB,518	},519	[CX88_BOARD_HAUPPAUGE_DVB_T1] = {520		.name           = "Hauppauge Nova-T DVB-T",521		.tuner_type     = UNSET,522		.radio_type     = UNSET,523		.tuner_addr	= ADDR_UNSET,524		.radio_addr	= ADDR_UNSET,525		.input          = { {526			.type   = CX88_VMUX_DVB,527			.vmux   = 0,528		} },529		.mpeg           = CX88_MPEG_DVB,530	},531	[CX88_BOARD_CONEXANT_DVB_T1] = {532		.name           = "Conexant DVB-T reference design",533		.tuner_type     = UNSET,534		.radio_type     = UNSET,535		.tuner_addr	= ADDR_UNSET,536		.radio_addr	= ADDR_UNSET,537		.input          = { {538			.type   = CX88_VMUX_DVB,539			.vmux   = 0,540		} },541		.mpeg           = CX88_MPEG_DVB,542	},543	[CX88_BOARD_PROVIDEO_PV259] = {544		.name		= "Provideo PV259",545		.tuner_type     = TUNER_PHILIPS_FQ1216ME,546		.radio_type     = UNSET,547		.tuner_addr	= ADDR_UNSET,548		.radio_addr	= ADDR_UNSET,549		.input          = { {550			.type   = CX88_VMUX_TELEVISION,551			.vmux   = 0,552			.audioroute = 1,553		} },554		.mpeg           = CX88_MPEG_BLACKBIRD,555	},556	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS] = {557		.name           = "DViCO FusionHDTV DVB-T Plus",558		.tuner_type     = UNSET, /* No analog tuner */559		.radio_type     = UNSET,560		.tuner_addr	= ADDR_UNSET,561		.radio_addr	= ADDR_UNSET,562		.input          = { {563			.type   = CX88_VMUX_COMPOSITE1,564			.vmux   = 1,565			.gpio0  = 0x000027df,566		}, {567			.type   = CX88_VMUX_SVIDEO,568			.vmux   = 2,569			.gpio0  = 0x000027df,570		} },571		.mpeg           = CX88_MPEG_DVB,572	},573	[CX88_BOARD_DNTV_LIVE_DVB_T] = {574		.name		= "digitalnow DNTV Live! DVB-T",575		.tuner_type     = UNSET,576		.radio_type     = UNSET,577		.tuner_addr	= ADDR_UNSET,578		.radio_addr	= ADDR_UNSET,579		.input		= { {580			.type   = CX88_VMUX_COMPOSITE1,581			.vmux   = 1,582			.gpio0  = 0x00000700,583			.gpio2  = 0x00000101,584		}, {585			.type   = CX88_VMUX_SVIDEO,586			.vmux   = 2,587			.gpio0  = 0x00000700,588			.gpio2  = 0x00000101,589		} },590		.mpeg           = CX88_MPEG_DVB,591	},592	[CX88_BOARD_PCHDTV_HD3000] = {593		.name           = "pcHDTV HD3000 HDTV",594		.tuner_type     = TUNER_THOMSON_DTT761X,595		.radio_type     = UNSET,596		.tuner_addr	= ADDR_UNSET,597		.radio_addr	= ADDR_UNSET,598		.tda9887_conf   = TDA9887_PRESENT,599		/* GPIO[2] = audio source for analog audio out connector600		 *  0 = analog audio input connector601		 *  1 = CX88 audio DACs602		 *603		 * GPIO[7] = input to CX88's audio/chroma ADC604		 *  0 = FM 10.7 MHz IF605		 *  1 = Sound 4.5 MHz IF606		 *607		 * GPIO[1,5,6] = Oren 51132 pins 27,35,28 respectively608		 *609		 * GPIO[16] = Remote control input610		 */611		.input          = { {612			.type   = CX88_VMUX_TELEVISION,613			.vmux   = 0,614			.gpio0  = 0x00008484,615		}, {616			.type   = CX88_VMUX_COMPOSITE1,617			.vmux   = 1,618			.gpio0  = 0x00008400,619		}, {620			.type   = CX88_VMUX_SVIDEO,621			.vmux   = 2,622			.gpio0  = 0x00008400,623		} },624		.radio = {625			.type   = CX88_RADIO,626			.gpio0  = 0x00008404,627		},628		.mpeg           = CX88_MPEG_DVB,629	},630	[CX88_BOARD_HAUPPAUGE_ROSLYN] = {631		// entry added by Kaustubh D. Bhalerao <bhalerao.1@osu.edu>632		// GPIO values obtained from regspy, courtesy Sean Covel633		.name           = "Hauppauge WinTV 28xxx (Roslyn) models",634		.tuner_type     = UNSET,635		.radio_type     = UNSET,636		.tuner_addr	= ADDR_UNSET,637		.radio_addr	= ADDR_UNSET,638		.input          = { {639			.type   = CX88_VMUX_TELEVISION,640			.vmux   = 0,641			.gpio0  = 0xed1a,642			.gpio2  = 0x00ff,643		}, {644			.type   = CX88_VMUX_DEBUG,645			.vmux   = 0,646			.gpio0  = 0xff01,647		}, {648			.type   = CX88_VMUX_COMPOSITE1,649			.vmux   = 1,650			.gpio0  = 0xff02,651		}, {652			.type   = CX88_VMUX_SVIDEO,653			.vmux   = 2,654			.gpio0  = 0xed92,655			.gpio2  = 0x00ff,656		} },657		.radio = {658			 .type   = CX88_RADIO,659			 .gpio0  = 0xed96,660			 .gpio2  = 0x00ff,661		 },662		.mpeg           = CX88_MPEG_BLACKBIRD,663	},664	[CX88_BOARD_DIGITALLOGIC_MEC] = {665		.name           = "Digital-Logic MICROSPACE Entertainment Center (MEC)",666		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,667		.radio_type     = UNSET,668		.tuner_addr	= ADDR_UNSET,669		.radio_addr	= ADDR_UNSET,670		.tda9887_conf   = TDA9887_PRESENT,671		.input          = { {672			.type   = CX88_VMUX_TELEVISION,673			.vmux   = 0,674			.gpio0  = 0x00009d80,675			.audioroute = 1,676		}, {677			.type   = CX88_VMUX_COMPOSITE1,678			.vmux   = 1,679			.gpio0  = 0x00009d76,680			.audioroute = 1,681		}, {682			.type   = CX88_VMUX_SVIDEO,683			.vmux   = 2,684			.gpio0  = 0x00009d76,685			.audioroute = 1,686		} },687		.radio = {688			.type   = CX88_RADIO,689			.gpio0  = 0x00009d00,690			.audioroute = 1,691		},692		.mpeg           = CX88_MPEG_BLACKBIRD,693	},694	[CX88_BOARD_IODATA_GVBCTV7E] = {695		.name           = "IODATA GV/BCTV7E",696		.tuner_type     = TUNER_PHILIPS_FQ1286,697		.radio_type     = UNSET,698		.tuner_addr	= ADDR_UNSET,699		.radio_addr	= ADDR_UNSET,700		.tda9887_conf   = TDA9887_PRESENT,701		.input          = { {702			.type   = CX88_VMUX_TELEVISION,703			.vmux   = 1,704			.gpio1  = 0x0000e03f,705		}, {706			.type   = CX88_VMUX_COMPOSITE1,707			.vmux   = 2,708			.gpio1  = 0x0000e07f,709		}, {710			.type   = CX88_VMUX_SVIDEO,711			.vmux   = 3,712			.gpio1  = 0x0000e07f,713		} }714	},715	[CX88_BOARD_PIXELVIEW_PLAYTV_ULTRA_PRO] = {716		.name           = "PixelView PlayTV Ultra Pro (Stereo)",717		/* May be also TUNER_YMEC_TVF_5533MF for NTSC/M or PAL/M */718		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,719		.radio_type     = UNSET,720		.tuner_addr	= ADDR_UNSET,721		.radio_addr	= ADDR_UNSET,722		/*723		 * Some variants use a tda9874 and so need the724		 * tvaudio module.725		 */726		.audio_chip     = CX88_AUDIO_TVAUDIO,727		.input          = { {728			.type   = CX88_VMUX_TELEVISION,729			.vmux   = 0,730			.gpio0  = 0xbf61,  /* internal decoder */731		}, {732			.type   = CX88_VMUX_COMPOSITE1,733			.vmux   = 1,734			.gpio0	= 0xbf63,735		}, {736			.type   = CX88_VMUX_SVIDEO,737			.vmux   = 2,738			.gpio0	= 0xbf63,739		} },740		.radio = {741			 .type  = CX88_RADIO,742			 .gpio0 = 0xbf60,743		 },744	},745	[CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T] = {746		.name           = "DViCO FusionHDTV 3 Gold-T",747		.tuner_type     = TUNER_THOMSON_DTT761X,748		.radio_type     = UNSET,749		.tuner_addr	= ADDR_UNSET,750		.radio_addr	= ADDR_UNSET,751		.tda9887_conf   = TDA9887_PRESENT,752		.input          = { {753			.type   = CX88_VMUX_TELEVISION,754			.vmux   = 0,755			.gpio0  = 0x97ed,756		}, {757			.type   = CX88_VMUX_COMPOSITE1,758			.vmux   = 1,759			.gpio0  = 0x97e9,760		}, {761			.type   = CX88_VMUX_SVIDEO,762			.vmux   = 2,763			.gpio0  = 0x97e9,764		} },765		.mpeg           = CX88_MPEG_DVB,766	},767	[CX88_BOARD_ADSTECH_DVB_T_PCI] = {768		.name           = "ADS Tech Instant TV DVB-T PCI",769		.tuner_type     = UNSET,770		.radio_type     = UNSET,771		.tuner_addr	= ADDR_UNSET,772		.radio_addr	= ADDR_UNSET,773		.input          = { {774			.type   = CX88_VMUX_COMPOSITE1,775			.vmux   = 1,776			.gpio0  = 0x0700,777			.gpio2  = 0x0101,778		}, {779			.type   = CX88_VMUX_SVIDEO,780			.vmux   = 2,781			.gpio0  = 0x0700,782			.gpio2  = 0x0101,783		} },784		.mpeg           = CX88_MPEG_DVB,785	},786	[CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1] = {787		.name           = "TerraTec Cinergy 1400 DVB-T",788		.tuner_type     = UNSET,789		.input          = { {790			.type   = CX88_VMUX_DVB,791			.vmux   = 0,792		}, {793			.type   = CX88_VMUX_COMPOSITE1,794			.vmux   = 2,795		}, {796			.type   = CX88_VMUX_SVIDEO,797			.vmux   = 2,798		} },799		.mpeg           = CX88_MPEG_DVB,800	},801	[CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD] = {802		.name           = "DViCO FusionHDTV 5 Gold",803		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H062F */804		.radio_type     = UNSET,805		.tuner_addr	= ADDR_UNSET,806		.radio_addr	= ADDR_UNSET,807		.tda9887_conf   = TDA9887_PRESENT,808		.input          = { {809			.type   = CX88_VMUX_TELEVISION,810			.vmux   = 0,811			.gpio0  = 0x87fd,812		}, {813			.type   = CX88_VMUX_COMPOSITE1,814			.vmux   = 1,815			.gpio0  = 0x87f9,816		}, {817			.type   = CX88_VMUX_SVIDEO,818			.vmux   = 2,819			.gpio0  = 0x87f9,820		} },821		.mpeg           = CX88_MPEG_DVB,822	},823	[CX88_BOARD_AVERMEDIA_ULTRATV_MC_550] = {824		.name           = "AverMedia UltraTV Media Center PCI 550",825		.tuner_type     = TUNER_PHILIPS_FM1236_MK3,826		.radio_type     = UNSET,827		.tuner_addr     = ADDR_UNSET,828		.radio_addr     = ADDR_UNSET,829		.tda9887_conf   = TDA9887_PRESENT,830		.input          = { {831			.type   = CX88_VMUX_COMPOSITE1,832			.vmux   = 0,833			.gpio0  = 0x0000cd73,834			.audioroute = 1,835		}, {836			.type   = CX88_VMUX_SVIDEO,837			.vmux   = 1,838			.gpio0  = 0x0000cd73,839			.audioroute = 1,840		}, {841			.type   = CX88_VMUX_TELEVISION,842			.vmux   = 3,843			.gpio0  = 0x0000cdb3,844			.audioroute = 1,845		} },846		.radio = {847			.type   = CX88_RADIO,848			.vmux   = 2,849			.gpio0  = 0x0000cdf3,850			.audioroute = 1,851		},852		.mpeg           = CX88_MPEG_BLACKBIRD,853	},854	[CX88_BOARD_KWORLD_VSTREAM_EXPERT_DVD] = {855		 /* Alexander Wold <awold@bigfoot.com> */856		 .name           = "Kworld V-Stream Xpert DVD",857		 .tuner_type     = UNSET,858		 .input          = { {859			 .type   = CX88_VMUX_COMPOSITE1,860			 .vmux   = 1,861			 .gpio0  = 0x03000000,862			 .gpio1  = 0x01000000,863			 .gpio2  = 0x02000000,864			 .gpio3  = 0x00100000,865		 }, {866			 .type   = CX88_VMUX_SVIDEO,867			 .vmux   = 2,868			 .gpio0  = 0x03000000,869			 .gpio1  = 0x01000000,870			 .gpio2  = 0x02000000,871			 .gpio3  = 0x00100000,872		 } },873	},874	[CX88_BOARD_ATI_HDTVWONDER] = {875		.name           = "ATI HDTV Wonder",876		.tuner_type     = TUNER_PHILIPS_TUV1236D,877		.radio_type     = UNSET,878		.tuner_addr	= ADDR_UNSET,879		.radio_addr	= ADDR_UNSET,880		.input          = { {881			.type   = CX88_VMUX_TELEVISION,882			.vmux   = 0,883			.gpio0  = 0x00000ff7,884			.gpio1  = 0x000000ff,885			.gpio2  = 0x00000001,886			.gpio3  = 0x00000000,887		}, {888			.type   = CX88_VMUX_COMPOSITE1,889			.vmux   = 1,890			.gpio0  = 0x00000ffe,891			.gpio1  = 0x000000ff,892			.gpio2  = 0x00000001,893			.gpio3  = 0x00000000,894		}, {895			.type   = CX88_VMUX_SVIDEO,896			.vmux   = 2,897			.gpio0  = 0x00000ffe,898			.gpio1  = 0x000000ff,899			.gpio2  = 0x00000001,900			.gpio3  = 0x00000000,901		} },902		.mpeg           = CX88_MPEG_DVB,903	},904	[CX88_BOARD_WINFAST_DTV1000] = {905		.name           = "WinFast DTV1000-T",906		.tuner_type     = UNSET,907		.radio_type     = UNSET,908		.tuner_addr	= ADDR_UNSET,909		.radio_addr	= ADDR_UNSET,910		.input          = { {911			.type   = CX88_VMUX_DVB,912			.vmux   = 0,913		}, {914			.type   = CX88_VMUX_COMPOSITE1,915			.vmux   = 1,916		}, {917			.type   = CX88_VMUX_SVIDEO,918			.vmux   = 2,919		} },920		.mpeg           = CX88_MPEG_DVB,921	},922	[CX88_BOARD_AVERTV_303] = {923		.name           = "AVerTV 303 (M126)",924		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,925		.radio_type     = UNSET,926		.tuner_addr	= ADDR_UNSET,927		.radio_addr	= ADDR_UNSET,928		.tda9887_conf   = TDA9887_PRESENT,929		.input          = { {930			.type   = CX88_VMUX_TELEVISION,931			.vmux   = 0,932			.gpio0  = 0x00ff,933			.gpio1  = 0xe09f,934			.gpio2  = 0x0010,935			.gpio3  = 0x0000,936		}, {937			.type   = CX88_VMUX_COMPOSITE1,938			.vmux   = 1,939			.gpio0  = 0x00ff,940			.gpio1  = 0xe05f,941			.gpio2  = 0x0010,942			.gpio3  = 0x0000,943		}, {944			.type   = CX88_VMUX_SVIDEO,945			.vmux   = 2,946			.gpio0  = 0x00ff,947			.gpio1  = 0xe05f,948			.gpio2  = 0x0010,949			.gpio3  = 0x0000,950		} },951	},952	[CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1] = {953		.name		= "Hauppauge Nova-S-Plus DVB-S",954		.tuner_type	= UNSET,955		.radio_type	= UNSET,956		.tuner_addr	= ADDR_UNSET,957		.radio_addr	= ADDR_UNSET,958		.audio_chip	= CX88_AUDIO_WM8775,959		.i2sinputcntl   = 2,960		.input		= { {961			.type	= CX88_VMUX_DVB,962			.vmux	= 0,963			/* 2: Line-In */964			.audioroute = 2,965		}, {966			.type	= CX88_VMUX_COMPOSITE1,967			.vmux	= 1,968			/* 2: Line-In */969			.audioroute = 2,970		}, {971			.type	= CX88_VMUX_SVIDEO,972			.vmux	= 2,973			/* 2: Line-In */974			.audioroute = 2,975		} },976		.mpeg           = CX88_MPEG_DVB,977	},978	[CX88_BOARD_HAUPPAUGE_NOVASE2_S1] = {979		.name		= "Hauppauge Nova-SE2 DVB-S",980		.tuner_type	= UNSET,981		.radio_type	= UNSET,982		.tuner_addr	= ADDR_UNSET,983		.radio_addr	= ADDR_UNSET,984		.input		= { {985			.type	= CX88_VMUX_DVB,986			.vmux	= 0,987		} },988		.mpeg           = CX88_MPEG_DVB,989	},990	[CX88_BOARD_KWORLD_DVBS_100] = {991		.name		= "KWorld DVB-S 100",992		.tuner_type	= UNSET,993		.radio_type	= UNSET,994		.tuner_addr	= ADDR_UNSET,995		.radio_addr	= ADDR_UNSET,996		.audio_chip = CX88_AUDIO_WM8775,997		.input		= { {998			.type	= CX88_VMUX_DVB,999			.vmux	= 0,1000			/* 2: Line-In */1001			.audioroute = 2,1002		}, {1003			.type	= CX88_VMUX_COMPOSITE1,1004			.vmux	= 1,1005			/* 2: Line-In */1006			.audioroute = 2,1007		}, {1008			.type	= CX88_VMUX_SVIDEO,1009			.vmux	= 2,1010			/* 2: Line-In */1011			.audioroute = 2,1012		} },1013		.mpeg           = CX88_MPEG_DVB,1014	},1015	[CX88_BOARD_HAUPPAUGE_HVR1100] = {1016		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid",1017		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1018		.radio_type	= UNSET,1019		.tuner_addr	= ADDR_UNSET,1020		.radio_addr	= ADDR_UNSET,1021		.tda9887_conf   = TDA9887_PRESENT,1022		.input		= { {1023			.type   = CX88_VMUX_TELEVISION,1024			.vmux   = 0,1025		}, {1026			.type	= CX88_VMUX_COMPOSITE1,1027			.vmux	= 1,1028		}, {1029			.type	= CX88_VMUX_SVIDEO,1030			.vmux	= 2,1031		} },1032		/* fixme: Add radio support */1033		.mpeg           = CX88_MPEG_DVB,1034	},1035	[CX88_BOARD_HAUPPAUGE_HVR1100LP] = {1036		.name		= "Hauppauge WinTV-HVR1100 DVB-T/Hybrid (Low Profile)",1037		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1038		.radio_type	= UNSET,1039		.tuner_addr	= ADDR_UNSET,1040		.radio_addr	= ADDR_UNSET,1041		.tda9887_conf   = TDA9887_PRESENT,1042		.input		= { {1043			.type   = CX88_VMUX_TELEVISION,1044			.vmux   = 0,1045		}, {1046			.type	= CX88_VMUX_COMPOSITE1,1047			.vmux	= 1,1048		} },1049		/* fixme: Add radio support */1050		.mpeg           = CX88_MPEG_DVB,1051	},1052	[CX88_BOARD_DNTV_LIVE_DVB_T_PRO] = {1053		.name           = "digitalnow DNTV Live! DVB-T Pro",1054		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1055		.radio_type     = UNSET,1056		.tuner_addr	= ADDR_UNSET,1057		.radio_addr	= ADDR_UNSET,1058		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |1059				  TDA9887_PORT2_ACTIVE,1060		.input          = { {1061			.type   = CX88_VMUX_TELEVISION,1062			.vmux   = 0,1063			.gpio0  = 0xf80808,1064		}, {1065			.type   = CX88_VMUX_COMPOSITE1,1066			.vmux   = 1,1067			.gpio0	= 0xf80808,1068		}, {1069			.type   = CX88_VMUX_SVIDEO,1070			.vmux   = 2,1071			.gpio0	= 0xf80808,1072		} },1073		.radio = {1074			 .type  = CX88_RADIO,1075			 .gpio0 = 0xf80808,1076		},1077		.mpeg           = CX88_MPEG_DVB,1078	},1079	[CX88_BOARD_KWORLD_DVB_T_CX22702] = {1080		/* Kworld V-stream Xpert DVB-T with Thomson tuner */1081		/* DTT 7579 Conexant CX22702-19 Conexant CX2388x  */1082		/* Manenti Marco <marco_manenti@colman.it> */1083		.name           = "KWorld/VStream XPert DVB-T with cx22702",1084		.tuner_type     = UNSET,1085		.radio_type     = UNSET,1086		.tuner_addr	= ADDR_UNSET,1087		.radio_addr	= ADDR_UNSET,1088		.input          = { {1089			.type   = CX88_VMUX_COMPOSITE1,1090			.vmux   = 1,1091			.gpio0  = 0x0700,1092			.gpio2  = 0x0101,1093		}, {1094			.type   = CX88_VMUX_SVIDEO,1095			.vmux   = 2,1096			.gpio0  = 0x0700,1097			.gpio2  = 0x0101,1098		} },1099		.mpeg           = CX88_MPEG_DVB,1100	},1101	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL] = {1102		.name           = "DViCO FusionHDTV DVB-T Dual Digital",1103		.tuner_type     = UNSET, /* No analog tuner */1104		.radio_type     = UNSET,1105		.tuner_addr	= ADDR_UNSET,1106		.radio_addr	= ADDR_UNSET,1107		.input          = { {1108			.type   = CX88_VMUX_COMPOSITE1,1109			.vmux   = 1,1110			.gpio0  = 0x000067df,1111		 }, {1112			.type   = CX88_VMUX_SVIDEO,1113			.vmux   = 2,1114			.gpio0  = 0x000067df,1115		} },1116		.mpeg           = CX88_MPEG_DVB,1117	},1118	[CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT] = {1119		.name           = "KWorld HardwareMpegTV XPert",1120		.tuner_type     = TUNER_PHILIPS_TDA8290,1121		.radio_type     = UNSET,1122		.tuner_addr	= ADDR_UNSET,1123		.radio_addr	= ADDR_UNSET,1124		.input          = { {1125			.type   = CX88_VMUX_TELEVISION,1126			.vmux   = 0,1127			.gpio0  = 0x3de2,1128			.gpio2  = 0x00ff,1129		}, {1130			.type   = CX88_VMUX_COMPOSITE1,1131			.vmux   = 1,1132			.gpio0  = 0x3de6,1133			.audioroute = 1,1134		}, {1135			.type   = CX88_VMUX_SVIDEO,1136			.vmux   = 2,1137			.gpio0  = 0x3de6,1138			.audioroute = 1,1139		} },1140		.radio = {1141			.type   = CX88_RADIO,1142			.gpio0  = 0x3de6,1143			.gpio2  = 0x00ff,1144		},1145		.mpeg           = CX88_MPEG_BLACKBIRD,1146	},1147	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID] = {1148		.name           = "DViCO FusionHDTV DVB-T Hybrid",1149		.tuner_type     = TUNER_THOMSON_FE6600,1150		.radio_type     = UNSET,1151		.tuner_addr	= ADDR_UNSET,1152		.radio_addr	= ADDR_UNSET,1153		.input          = { {1154			.type   = CX88_VMUX_TELEVISION,1155			.vmux   = 0,1156			.gpio0  = 0x0000a75f,1157		}, {1158			.type   = CX88_VMUX_COMPOSITE1,1159			.vmux   = 1,1160			.gpio0  = 0x0000a75b,1161		}, {1162			.type   = CX88_VMUX_SVIDEO,1163			.vmux   = 2,1164			.gpio0  = 0x0000a75b,1165		} },1166		.mpeg           = CX88_MPEG_DVB,1167	},1168	[CX88_BOARD_PCHDTV_HD5500] = {1169		.name           = "pcHDTV HD5500 HDTV",1170		.tuner_type     = TUNER_LG_TDVS_H06XF, /* TDVS-H064F */1171		.radio_type     = UNSET,1172		.tuner_addr	= ADDR_UNSET,1173		.radio_addr	= ADDR_UNSET,1174		.tda9887_conf   = TDA9887_PRESENT,1175		.input          = { {1176			.type   = CX88_VMUX_TELEVISION,1177			.vmux   = 0,1178			.gpio0  = 0x87fd,1179		}, {1180			.type   = CX88_VMUX_COMPOSITE1,1181			.vmux   = 1,1182			.gpio0  = 0x87f9,1183		}, {1184			.type   = CX88_VMUX_SVIDEO,1185			.vmux   = 2,1186			.gpio0  = 0x87f9,1187		} },1188		.mpeg           = CX88_MPEG_DVB,1189	},1190	[CX88_BOARD_KWORLD_MCE200_DELUXE] = {1191		/*1192		 * FIXME: tested TV input only, disabled composite,1193		 * svideo and radio until they can be tested also.1194		 */1195		.name           = "Kworld MCE 200 Deluxe",1196		.tuner_type     = TUNER_TENA_9533_DI,1197		.radio_type     = UNSET,1198		.tda9887_conf   = TDA9887_PRESENT,1199		.tuner_addr     = ADDR_UNSET,1200		.radio_addr     = ADDR_UNSET,1201		.input          = { {1202			.type   = CX88_VMUX_TELEVISION,1203			.vmux   = 0,1204			.gpio0  = 0x0000BDE61205		} },1206		.mpeg           = CX88_MPEG_BLACKBIRD,1207	},1208	[CX88_BOARD_PIXELVIEW_PLAYTV_P7000] = {1209		/* FIXME: SVideo, Composite and FM inputs are untested */1210		.name           = "PixelView PlayTV P7000",1211		.tuner_type     = TUNER_PHILIPS_FM1216ME_MK3,1212		.radio_type     = UNSET,1213		.tuner_addr	= ADDR_UNSET,1214		.radio_addr	= ADDR_UNSET,1215		.tda9887_conf   = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE |1216				  TDA9887_PORT2_ACTIVE,1217		.input          = { {1218			.type   = CX88_VMUX_TELEVISION,1219			.vmux   = 0,1220			.gpio0  = 0x5da6,1221		} },1222		.mpeg           = CX88_MPEG_BLACKBIRD,1223	},1224	[CX88_BOARD_NPGTECH_REALTV_TOP10FM] = {1225		.name           = "NPG Tech Real TV FM Top 10",1226		.tuner_type     = TUNER_TNF_5335MF, /* Actually a TNF9535 */1227		.radio_type     = UNSET,1228		.tuner_addr	= ADDR_UNSET,1229		.radio_addr	= ADDR_UNSET,1230		.input          = { {1231			.type   = CX88_VMUX_TELEVISION,1232			.vmux   = 0,1233			.gpio0	= 0x0788,1234		}, {1235			.type   = CX88_VMUX_COMPOSITE1,1236			.vmux   = 1,1237			.gpio0	= 0x078b,1238		}, {1239			.type   = CX88_VMUX_SVIDEO,1240			.vmux   = 2,1241			.gpio0	= 0x078b,1242		} },1243		.radio = {1244			 .type  = CX88_RADIO,1245			 .gpio0 = 0x074a,1246		},1247	},1248	[CX88_BOARD_WINFAST_DTV2000H] = {1249		.name           = "WinFast DTV2000 H",1250		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1251		.radio_type     = UNSET,1252		.tuner_addr     = ADDR_UNSET,1253		.radio_addr     = ADDR_UNSET,1254		.tda9887_conf   = TDA9887_PRESENT,1255		.input          = { {1256			.type   = CX88_VMUX_TELEVISION,1257			.vmux   = 0,1258			.gpio0  = 0x00017304,1259			.gpio1  = 0x00008203,1260			.gpio2  = 0x00017304,1261			.gpio3  = 0x02000000,1262		}, {1263			.type   = CX88_VMUX_COMPOSITE1,1264			.vmux   = 1,1265			.gpio0  = 0x0001d701,1266			.gpio1  = 0x0000b207,1267			.gpio2  = 0x0001d701,1268			.gpio3  = 0x02000000,1269		}, {1270			.type   = CX88_VMUX_COMPOSITE2,1271			.vmux   = 2,1272			.gpio0  = 0x0001d503,1273			.gpio1  = 0x0000b207,1274			.gpio2  = 0x0001d503,1275			.gpio3  = 0x02000000,1276		}, {1277			.type   = CX88_VMUX_SVIDEO,1278			.vmux   = 3,1279			.gpio0  = 0x0001d701,1280			.gpio1  = 0x0000b207,1281			.gpio2  = 0x0001d701,1282			.gpio3  = 0x02000000,1283		} },1284		.radio = {1285			 .type  = CX88_RADIO,1286			 .gpio0 = 0x00015702,1287			 .gpio1 = 0x0000f207,1288			 .gpio2 = 0x00015702,1289			 .gpio3 = 0x02000000,1290		},1291		.mpeg           = CX88_MPEG_DVB,1292	},1293	[CX88_BOARD_WINFAST_DTV2000H_J] = {1294		.name           = "WinFast DTV2000 H rev. J",1295		.tuner_type     = TUNER_PHILIPS_FMD1216MEX_MK3,1296		.radio_type     = UNSET,1297		.tuner_addr     = ADDR_UNSET,1298		.radio_addr     = ADDR_UNSET,1299		.tda9887_conf   = TDA9887_PRESENT,1300		.input          = { {1301			.type   = CX88_VMUX_TELEVISION,1302			.vmux   = 0,1303			.gpio0  = 0x00017300,1304			.gpio1  = 0x00008207,1305			.gpio2	= 0x00000000,1306			.gpio3  = 0x02000000,1307		}, {1308			.type   = CX88_VMUX_TELEVISION,1309			.vmux   = 0,1310			.gpio0  = 0x00018300,1311			.gpio1  = 0x0000f207,1312			.gpio2	= 0x00017304,1313			.gpio3  = 0x02000000,1314		}, {1315			.type   = CX88_VMUX_COMPOSITE1,1316			.vmux   = 1,1317			.gpio0  = 0x00018301,1318			.gpio1  = 0x0000f207,1319			.gpio2	= 0x00017304,1320			.gpio3  = 0x02000000,1321		}, {1322			.type   = CX88_VMUX_SVIDEO,1323			.vmux   = 2,1324			.gpio0  = 0x00018301,1325			.gpio1  = 0x0000f207,1326			.gpio2	= 0x00017304,1327			.gpio3  = 0x02000000,1328		} },1329		.radio = {1330			 .type  = CX88_RADIO,1331			 .gpio0 = 0x00015702,1332			 .gpio1 = 0x0000f207,1333			 .gpio2 = 0x00015702,1334			 .gpio3 = 0x02000000,1335		},1336		.mpeg           = CX88_MPEG_DVB,1337	},1338	[CX88_BOARD_GENIATECH_DVBS] = {1339		.name          = "Geniatech DVB-S",1340		.tuner_type    = UNSET,1341		.radio_type    = UNSET,1342		.tuner_addr    = ADDR_UNSET,1343		.radio_addr    = ADDR_UNSET,1344		.input  = { {1345			.type  = CX88_VMUX_DVB,1346			.vmux  = 0,1347		}, {1348			.type  = CX88_VMUX_COMPOSITE1,1349			.vmux  = 1,1350		} },1351		.mpeg           = CX88_MPEG_DVB,1352	},1353	[CX88_BOARD_HAUPPAUGE_HVR3000] = {1354		.name           = "Hauppauge WinTV-HVR3000 TriMode Analog/DVB-S/DVB-T",1355		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1356		.radio_type     = UNSET,1357		.tuner_addr     = ADDR_UNSET,1358		.radio_addr     = ADDR_UNSET,1359		.tda9887_conf   = TDA9887_PRESENT,1360		.audio_chip     = CX88_AUDIO_WM8775,1361		.input          = { {1362			.type   = CX88_VMUX_TELEVISION,1363			.vmux   = 0,1364			.gpio0  = 0x84bf,1365			/* 1: TV Audio / FM Mono */1366			.audioroute = 1,1367		}, {1368			.type   = CX88_VMUX_COMPOSITE1,1369			.vmux   = 1,1370			.gpio0  = 0x84bf,1371			/* 2: Line-In */1372			.audioroute = 2,1373		}, {1374			.type   = CX88_VMUX_SVIDEO,1375			.vmux   = 2,1376			.gpio0  = 0x84bf,1377			/* 2: Line-In */1378			.audioroute = 2,1379		} },1380		.radio = {1381			.type   = CX88_RADIO,1382			.gpio0	= 0x84bf,1383			/* 4: FM Stereo (untested) */1384			.audioroute = 8,1385		},1386		.mpeg           = CX88_MPEG_DVB,1387		.num_frontends	= 2,1388	},1389	[CX88_BOARD_NORWOOD_MICRO] = {1390		.name           = "Norwood Micro TV Tuner",1391		.tuner_type     = TUNER_TNF_5335MF,1392		.radio_type     = UNSET,1393		.tuner_addr     = ADDR_UNSET,1394		.radio_addr     = ADDR_UNSET,1395		.input          = { {1396			.type   = CX88_VMUX_TELEVISION,1397			.vmux   = 0,1398			.gpio0  = 0x0709,1399		}, {1400			.type   = CX88_VMUX_COMPOSITE1,1401			.vmux   = 1,1402			.gpio0  = 0x070b,1403		}, {1404			.type   = CX88_VMUX_SVIDEO,1405			.vmux   = 2,1406			.gpio0  = 0x070b,1407		} },1408	},1409	[CX88_BOARD_TE_DTV_250_OEM_SWANN] = {1410		.name           = "Shenzhen Tungsten Ages Tech TE-DTV-250 / Swann OEM",1411		.tuner_type     = TUNER_LG_PAL_NEW_TAPC,1412		.radio_type     = UNSET,1413		.tuner_addr     = ADDR_UNSET,1414		.radio_addr     = ADDR_UNSET,1415		.input          = { {1416			.type   = CX88_VMUX_TELEVISION,1417			.vmux   = 0,1418			.gpio0  = 0x003fffff,1419			.gpio1  = 0x00e00000,1420			.gpio2  = 0x003fffff,1421			.gpio3  = 0x02000000,1422		}, {1423			.type   = CX88_VMUX_COMPOSITE1,1424			.vmux   = 1,1425			.gpio0  = 0x003fffff,1426			.gpio1  = 0x00e00000,1427			.gpio2  = 0x003fffff,1428			.gpio3  = 0x02000000,1429		}, {1430			.type   = CX88_VMUX_SVIDEO,1431			.vmux   = 2,1432			.gpio0  = 0x003fffff,1433			.gpio1  = 0x00e00000,1434			.gpio2  = 0x003fffff,1435			.gpio3  = 0x02000000,1436		} },1437	},1438	[CX88_BOARD_HAUPPAUGE_HVR1300] = {1439		.name		= "Hauppauge WinTV-HVR1300 DVB-T/Hybrid MPEG Encoder",1440		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1441		.radio_type	= UNSET,1442		.tuner_addr	= ADDR_UNSET,1443		.radio_addr	= ADDR_UNSET,1444		.tda9887_conf   = TDA9887_PRESENT,1445		.audio_chip     = CX88_AUDIO_WM8775,1446		/*1447		 * gpio0 as reported by Mike Crash <mike AT mikecrash.com>1448		 */1449		.input		= { {1450			.type   = CX88_VMUX_TELEVISION,1451			.vmux   = 0,1452			.gpio0	= 0xef88,1453			/* 1: TV Audio / FM Mono */1454			.audioroute = 1,1455		}, {1456			.type	= CX88_VMUX_COMPOSITE1,1457			.vmux	= 1,1458			.gpio0	= 0xef88,1459			/* 2: Line-In */1460			.audioroute = 2,1461		}, {1462			.type	= CX88_VMUX_SVIDEO,1463			.vmux	= 2,1464			.gpio0	= 0xef88,1465			/* 2: Line-In */1466			.audioroute = 2,1467		} },1468		.mpeg           = CX88_MPEG_DVB | CX88_MPEG_BLACKBIRD,1469		.radio = {1470			.type   = CX88_RADIO,1471			.gpio0	= 0xef88,1472			/* 4: FM Stereo (untested) */1473			.audioroute = 8,1474		},1475	},1476	[CX88_BOARD_SAMSUNG_SMT_7020] = {1477		.name		= "Samsung SMT 7020 DVB-S",1478		.tuner_type	= UNSET,1479		.radio_type	= UNSET,1480		.tuner_addr	= ADDR_UNSET,1481		.radio_addr	= ADDR_UNSET,1482		.input		= { {1483			.type	= CX88_VMUX_DVB,1484			.vmux	= 0,1485		} },1486		.mpeg           = CX88_MPEG_DVB,1487	},1488	[CX88_BOARD_ADSTECH_PTV_390] = {1489		.name           = "ADS Tech Instant Video PCI",1490		.tuner_type     = UNSET,1491		.radio_type     = UNSET,1492		.tuner_addr     = ADDR_UNSET,1493		.radio_addr     = ADDR_UNSET,1494		.input          = { {1495			.type   = CX88_VMUX_DEBUG,1496			.vmux   = 3,1497			.gpio0  = 0x04ff,1498		}, {1499			.type   = CX88_VMUX_COMPOSITE1,1500			.vmux   = 1,1501			.gpio0  = 0x07fa,1502		}, {1503			.type   = CX88_VMUX_SVIDEO,1504			.vmux   = 2,1505			.gpio0  = 0x07fa,1506		} },1507	},1508	[CX88_BOARD_PINNACLE_PCTV_HD_800i] = {1509		.name           = "Pinnacle PCTV HD 800i",1510		.tuner_type     = TUNER_XC5000,1511		.radio_type     = UNSET,1512		.tuner_addr	= ADDR_UNSET,1513		.radio_addr	= ADDR_UNSET,1514		.input          = { {1515			.type   = CX88_VMUX_TELEVISION,1516			.vmux   = 0,1517			.gpio0  = 0x04fb,1518			.gpio1  = 0x10ff,1519		}, {1520			.type   = CX88_VMUX_COMPOSITE1,1521			.vmux   = 1,1522			.gpio0  = 0x04fb,1523			.gpio1  = 0x10ef,1524			.audioroute = 1,1525		}, {1526			.type   = CX88_VMUX_SVIDEO,1527			.vmux   = 2,1528			.gpio0  = 0x04fb,1529			.gpio1  = 0x10ef,1530			.audioroute = 1,1531		} },1532		.mpeg           = CX88_MPEG_DVB,1533	},1534	[CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO] = {1535		.name           = "DViCO FusionHDTV 5 PCI nano",1536		/* xc3008 tuner, digital only for now */1537		.tuner_type     = UNSET,1538		.radio_type     = UNSET,1539		.tuner_addr	= ADDR_UNSET,1540		.radio_addr	= ADDR_UNSET,1541		.input          = { {1542			.type   = CX88_VMUX_TELEVISION,1543			.vmux   = 0,1544			.gpio0  = 0x000027df, /* Unconfirmed */1545		}, {1546			.type   = CX88_VMUX_COMPOSITE1,1547			.vmux   = 1,1548			.gpio0  = 0x000027df, /* Unconfirmed */1549			.audioroute = 1,1550		}, {1551			.type   = CX88_VMUX_SVIDEO,1552			.vmux   = 2,1553			.gpio0  = 0x000027df, /* Unconfirmed */1554			.audioroute = 1,1555		} },1556		.mpeg           = CX88_MPEG_DVB,1557	},1558	[CX88_BOARD_PINNACLE_HYBRID_PCTV] = {1559		.name           = "Pinnacle Hybrid PCTV",1560		.tuner_type     = TUNER_XC2028,1561		.tuner_addr     = 0x61,1562		.radio_type     = UNSET,1563		.radio_addr     = ADDR_UNSET,1564		.input          = { {1565			.type   = CX88_VMUX_TELEVISION,1566			.vmux   = 0,1567			.gpio0  = 0x004ff,1568			.gpio1  = 0x010ff,1569			.gpio2  = 0x00001,1570		}, {1571			.type   = CX88_VMUX_COMPOSITE1,1572			.vmux   = 1,1573			.gpio0  = 0x004fb,1574			.gpio1  = 0x010ef,1575			.audioroute = 1,1576		}, {1577			.type   = CX88_VMUX_SVIDEO,1578			.vmux   = 2,1579			.gpio0  = 0x004fb,1580			.gpio1  = 0x010ef,1581			.audioroute = 1,1582		} },1583		.radio = {1584			.type   = CX88_RADIO,1585			.gpio0  = 0x004ff,1586			.gpio1  = 0x010ff,1587			.gpio2  = 0x0ff,1588		},1589		.mpeg           = CX88_MPEG_DVB,1590	},1591	/* Terry Wu <terrywu2009@gmail.com> */1592	/* TV Audio :      set GPIO 2, 18, 19 value to 0, 1, 0 */1593	/* FM Audio :      set GPIO 2, 18, 19 value to 0, 0, 0 */1594	/* Line-in Audio : set GPIO 2, 18, 19 value to 0, 1, 1 */1595	/* Mute Audio :    set GPIO 2 value to 1               */1596	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL] = {1597		.name           = "Leadtek TV2000 XP Global",1598		.tuner_type     = TUNER_XC2028,1599		.tuner_addr     = 0x61,1600		.radio_type     = UNSET,1601		.radio_addr     = ADDR_UNSET,1602		.input          = { {1603			.type   = CX88_VMUX_TELEVISION,1604			.vmux   = 0,1605			.gpio0  = 0x0400,       /* pin 2 = 0 */1606			.gpio1  = 0x0000,1607			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */1608			.gpio3  = 0x0000,1609		}, {1610			.type   = CX88_VMUX_COMPOSITE1,1611			.vmux   = 1,1612			.gpio0  = 0x0400,       /* pin 2 = 0 */1613			.gpio1  = 0x0000,1614			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */1615			.gpio3  = 0x0000,1616		}, {1617			.type   = CX88_VMUX_SVIDEO,1618			.vmux   = 2,1619			.gpio0  = 0x0400,       /* pin 2 = 0 */1620			.gpio1  = 0x0000,1621			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */1622			.gpio3  = 0x0000,1623		} },1624		.radio = {1625			.type   = CX88_RADIO,1626			.gpio0  = 0x0400,        /* pin 2 = 0 */1627			.gpio1  = 0x0000,1628			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */1629			.gpio3  = 0x0000,1630		},1631	},1632	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36] = {1633		.name           = "Leadtek TV2000 XP Global (SC4100)",1634		.tuner_type     = TUNER_XC4000,1635		.tuner_addr     = 0x61,1636		.radio_type     = UNSET,1637		.radio_addr     = ADDR_UNSET,1638		.input          = { {1639			.type   = CX88_VMUX_TELEVISION,1640			.vmux   = 0,1641			.gpio0  = 0x0400,       /* pin 2 = 0 */1642			.gpio1  = 0x0000,1643			.gpio2  = 0x0C04,       /* pin 18 = 1, pin 19 = 0 */1644			.gpio3  = 0x0000,1645		}, {1646			.type   = CX88_VMUX_COMPOSITE1,1647			.vmux   = 1,1648			.gpio0  = 0x0400,       /* pin 2 = 0 */1649			.gpio1  = 0x0000,1650			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */1651			.gpio3  = 0x0000,1652		}, {1653			.type   = CX88_VMUX_SVIDEO,1654			.vmux   = 2,1655			.gpio0  = 0x0400,       /* pin 2 = 0 */1656			.gpio1  = 0x0000,1657			.gpio2  = 0x0C0C,       /* pin 18 = 1, pin 19 = 1 */1658			.gpio3  = 0x0000,1659		} },1660		.radio = {1661			.type   = CX88_RADIO,1662			.gpio0  = 0x0400,        /* pin 2 = 0 */1663			.gpio1  = 0x0000,1664			.gpio2  = 0x0C00,       /* pin 18 = 0, pin 19 = 0 */1665			.gpio3  = 0x0000,1666		},1667	},1668	[CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43] = {1669		.name           = "Leadtek TV2000 XP Global (XC4100)",1670		.tuner_type     = TUNER_XC4000,1671		.tuner_addr     = 0x61,1672		.radio_type     = UNSET,1673		.radio_addr     = ADDR_UNSET,1674		.input          = { {1675			.type   = CX88_VMUX_TELEVISION,1676			.vmux   = 0,1677			.gpio0  = 0x0400,       /* pin 2 = 0 */1678			.gpio1  = 0x6040,       /* pin 14 = 1, pin 13 = 0 */1679			.gpio2  = 0x0000,1680			.gpio3  = 0x0000,1681		}, {1682			.type   = CX88_VMUX_COMPOSITE1,1683			.vmux   = 1,1684			.gpio0  = 0x0400,       /* pin 2 = 0 */1685			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */1686			.gpio2  = 0x0000,1687			.gpio3  = 0x0000,1688		}, {1689			.type   = CX88_VMUX_SVIDEO,1690			.vmux   = 2,1691			.gpio0  = 0x0400,       /* pin 2 = 0 */1692			.gpio1  = 0x6060,       /* pin 14 = 1, pin 13 = 1 */1693			.gpio2  = 0x0000,1694			.gpio3  = 0x0000,1695		} },1696		.radio = {1697			.type   = CX88_RADIO,1698			.gpio0  = 0x0400,        /* pin 2 = 0 */1699			.gpio1  = 0x6000,        /* pin 14 = 1, pin 13 = 0 */1700			.gpio2  = 0x0000,1701			.gpio3  = 0x0000,1702		},1703	},1704	[CX88_BOARD_POWERCOLOR_REAL_ANGEL] = {1705		/* Long names may confuse LIRC. */1706		.name           = "PowerColor RA330",1707		.tuner_type     = TUNER_XC2028,1708		.tuner_addr     = 0x61,1709		.input          = { {1710			/*1711			 * Due to the way the cx88 driver is written,1712			 * there is no way to deactivate audio pass-1713			 * through without this entry. Furthermore, if1714			 * the TV mux entry is first, you get audio1715			 * from the tuner on boot for a little while.1716			 */1717			.type   = CX88_VMUX_DEBUG,1718			.vmux   = 3,1719			.gpio0 = 0x00ff,1720			.gpio1 = 0xf39d,1721			.gpio3 = 0x0000,1722		}, {1723			.type   = CX88_VMUX_TELEVISION,1724			.vmux   = 0,1725			.gpio0 = 0x00ff,1726			.gpio1 = 0xf35d,1727			.gpio3 = 0x0000,1728		}, {1729			.type   = CX88_VMUX_COMPOSITE1,1730			.vmux   = 1,1731			.gpio0 = 0x00ff,1732			.gpio1 = 0xf37d,1733			.gpio3 = 0x0000,1734		}, {1735			.type   = CX88_VMUX_SVIDEO,1736			.vmux   = 2,1737			.gpio0  = 0x000ff,1738			.gpio1  = 0x0f37d,1739			.gpio3  = 0x00000,1740		} },1741		.radio = {1742			.type   = CX88_RADIO,1743			.gpio0  = 0x000ff,1744			.gpio1  = 0x0f35d,1745			.gpio3  = 0x00000,1746		},1747	},1748	[CX88_BOARD_GENIATECH_X8000_MT] = {1749		/* Also PowerColor Real Angel 330 and Geniatech X800 OEM */1750		.name           = "Geniatech X8000-MT DVBT",1751		.tuner_type     = TUNER_XC2028,1752		.tuner_addr     = 0x61,1753		.input          = { {1754			.type   = CX88_VMUX_TELEVISION,1755			.vmux   = 0,1756			.gpio0  = 0x00000000,1757			.gpio1  = 0x00e3e341,1758			.gpio2  = 0x00000000,1759			.gpio3  = 0x00000000,1760		}, {1761			.type   = CX88_VMUX_COMPOSITE1,1762			.vmux   = 1,1763			.gpio0  = 0x00000000,1764			.gpio1  = 0x00e3e361,1765			.gpio2  = 0x00000000,1766			.gpio3  = 0x00000000,1767		}, {1768			.type   = CX88_VMUX_SVIDEO,1769			.vmux   = 2,1770			.gpio0  = 0x00000000,1771			.gpio1  = 0x00e3e361,1772			.gpio2  = 0x00000000,1773			.gpio3  = 0x00000000,1774		} },1775		.radio = {1776			.type   = CX88_RADIO,1777			.gpio0  = 0x00000000,1778			.gpio1  = 0x00e3e341,1779			.gpio2  = 0x00000000,1780			.gpio3  = 0x00000000,1781		},1782		.mpeg           = CX88_MPEG_DVB,1783	},1784	[CX88_BOARD_NOTONLYTV_LV3H] = {1785		.name           = "NotOnlyTV LV3H",1786		.tuner_type     = TUNER_XC2028,1787		.radio_type     = UNSET,1788		.tuner_addr     = 0x61,1789		.radio_addr     = ADDR_UNSET,1790		/* if gpio1:bit9 is enabled, DVB-T won't work */1791 1792		.input          = { {1793			.type   = CX88_VMUX_TELEVISION,1794			.vmux   = 0,1795			.gpio0  = 0x0000,1796			.gpio1  = 0xa141,1797			.gpio2  = 0x0000,1798		}, {1799			.type   = CX88_VMUX_COMPOSITE1,1800			.vmux   = 1,1801			.gpio0  = 0x0000,1802			.gpio1  = 0xa161,1803			.gpio2  = 0x0000,1804		}, {1805			.type   = CX88_VMUX_SVIDEO,1806			.vmux   = 2,1807			.gpio0  = 0x0000,1808			.gpio1  = 0xa161,1809			.gpio2  = 0x0000,1810		} },1811		.radio = {1812			.type   = CX88_RADIO,1813			.gpio0  = 0x0000,1814			.gpio1  = 0xa141,1815			.gpio2  = 0x0000,1816		},1817		.mpeg           = CX88_MPEG_DVB,1818	},1819	[CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO] = {1820		.name           = "DViCO FusionHDTV DVB-T PRO",1821		.tuner_type     = TUNER_XC2028,1822		.tuner_addr     = 0x61,1823		.radio_type     = UNSET,1824		.radio_addr     = ADDR_UNSET,1825		.input          = { {1826			.type   = CX88_VMUX_COMPOSITE1,1827			.vmux   = 1,1828			.gpio0  = 0x000067df,1829		}, {1830			.type   = CX88_VMUX_SVIDEO,1831			.vmux   = 2,1832			.gpio0  = 0x000067df,1833		} },1834		.mpeg           = CX88_MPEG_DVB,1835	},1836	[CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD] = {1837		.name           = "DViCO FusionHDTV 7 Gold",1838		.tuner_type     = TUNER_XC5000,1839		.radio_type     = UNSET,1840		.tuner_addr	= ADDR_UNSET,1841		.radio_addr	= ADDR_UNSET,1842		.input          = { {1843			.type   = CX88_VMUX_TELEVISION,1844			.vmux   = 0,1845			.gpio0  = 0x10df,1846		}, {1847			.type   = CX88_VMUX_COMPOSITE1,1848			.vmux   = 1,1849			.gpio0  = 0x16d9,1850		}, {1851			.type   = CX88_VMUX_SVIDEO,1852			.vmux   = 2,1853			.gpio0  = 0x16d9,1854		} },1855		.mpeg           = CX88_MPEG_DVB,1856	},1857	[CX88_BOARD_PROLINK_PV_8000GT] = {1858		.name           = "Prolink Pixelview MPEG 8000GT",1859		.tuner_type     = TUNER_XC2028,1860		.tuner_addr     = 0x61,1861		.input          = { {1862			.type   = CX88_VMUX_TELEVISION,1863			.vmux   = 0,1864			.gpio0 = 0x0ff,1865			.gpio2 = 0x0cfb,1866		}, {1867			.type   = CX88_VMUX_COMPOSITE1,1868			.vmux   = 1,1869			.gpio2 = 0x0cfb,1870		}, {1871			.type   = CX88_VMUX_SVIDEO,1872			.vmux   = 2,1873			.gpio2 = 0x0cfb,1874		} },1875		.radio = {1876			.type   = CX88_RADIO,1877			.gpio2 = 0x0cfb,1878		},1879	},1880	[CX88_BOARD_PROLINK_PV_GLOBAL_XTREME] = {1881		.name           = "Prolink Pixelview Global Extreme",1882		.tuner_type     = TUNER_XC2028,1883		.tuner_addr     = 0x61,1884		.input          = { {1885			.type   = CX88_VMUX_TELEVISION,1886			.vmux   = 0,1887			.gpio0 = 0x04fb,1888			.gpio1 = 0x04080,1889			.gpio2 = 0x0cf7,1890		}, {1891			.type   = CX88_VMUX_COMPOSITE1,1892			.vmux   = 1,1893			.gpio0 = 0x04fb,1894			.gpio1 = 0x04080,1895			.gpio2 = 0x0cfb,1896		}, {1897			.type   = CX88_VMUX_SVIDEO,1898			.vmux   = 2,1899			.gpio0 = 0x04fb,1900			.gpio1 = 0x04080,1901			.gpio2 = 0x0cfb,1902		} },1903		.radio = {1904			.type   = CX88_RADIO,1905			.gpio0 = 0x04ff,1906			.gpio1 = 0x04080,1907			.gpio2 = 0x0cf7,1908		},1909	},1910	/*1911	 * Both radio, analog and ATSC work with this board.1912	 * However, for analog to work, s5h1409 gate should be open,1913	 * otherwise, tuner-xc3028 won't be detected.1914	 * A proper fix require using the newer i2c methods to add1915	 * tuner-xc3028 without doing an i2c probe.1916	 */1917	[CX88_BOARD_KWORLD_ATSC_120] = {1918		.name           = "Kworld PlusTV HD PCI 120 (ATSC 120)",1919		.tuner_type     = TUNER_XC2028,1920		.radio_type     = UNSET,1921		.tuner_addr	= ADDR_UNSET,1922		.radio_addr	= ADDR_UNSET,1923		.input          = { {1924			.type   = CX88_VMUX_TELEVISION,1925			.vmux   = 0,1926			.gpio0  = 0x000000ff,1927			.gpio1  = 0x0000f35d,1928			.gpio2  = 0x00000000,1929		}, {1930			.type   = CX88_VMUX_COMPOSITE1,1931			.vmux   = 1,1932			.gpio0  = 0x000000ff,1933			.gpio1  = 0x0000f37e,1934			.gpio2  = 0x00000000,1935		}, {1936			.type   = CX88_VMUX_SVIDEO,1937			.vmux   = 2,1938			.gpio0  = 0x000000ff,1939			.gpio1  = 0x0000f37e,1940			.gpio2  = 0x00000000,1941		} },1942		.radio = {1943			.type   = CX88_RADIO,1944			.gpio0  = 0x000000ff,1945			.gpio1  = 0x0000f35d,1946			.gpio2  = 0x00000000,1947		},1948		.mpeg           = CX88_MPEG_DVB,1949	},1950	[CX88_BOARD_HAUPPAUGE_HVR4000] = {1951		.name           = "Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid",1952		.tuner_type     = TUNER_PHILIPS_FMD1216ME_MK3,1953		.radio_type     = UNSET,1954		.tuner_addr     = ADDR_UNSET,1955		.radio_addr     = ADDR_UNSET,1956		.tda9887_conf   = TDA9887_PRESENT,1957		.audio_chip     = CX88_AUDIO_WM8775,1958		/*1959		 * GPIO0 (WINTV2000)1960		 *1961		 * Analogue     SAT     DVB-T1962		 * Antenna      0xc4bf  0xc4bb1963		 * Composite    0xc4bf  0xc4bb1964		 * S-Video      0xc4bf  0xc4bb1965		 * Composite1   0xc4ff  0xc4fb1966		 * S-Video1     0xc4ff  0xc4fb1967		 *1968		 * BIT  VALUE   FUNCTION GP{x}_IO1969		 * 0    1       I:?1970		 * 1    1       I:?1971		 * 2    1       O:MPEG PORT 0=DVB-T 1=DVB-S1972		 * 3    1       I:?1973		 * 4    1       I:?1974		 * 5    1       I:?1975		 * 6    0       O:INPUT SELECTOR 0=INTERNAL 1=EXPANSION1976		 * 7    1       O:DVB-T DEMOD RESET LOW1977		 *1978		 * BIT  VALUE   FUNCTION GP{x}_OE1979		 * 8    0       I1980		 * 9    0       I1981		 * a    1       O1982		 * b    0       I1983		 * c    0       I1984		 * d    0       I1985		 * e    1       O1986		 * f    1       O1987		 *1988		 * WM8775 ADC1989		 *1990		 * 1: TV Audio / FM Mono1991		 * 2: Line-In1992		 * 3: Line-In Expansion1993		 * 4: FM Stereo1994		 */1995		.input          = { {1996			.type   = CX88_VMUX_TELEVISION,1997			.vmux   = 0,1998			.gpio0  = 0xc4bf,1999			/* 1: TV Audio / FM Mono */2000			.audioroute = 1,2001		}, {2002			.type   = CX88_VMUX_COMPOSITE1,2003			.vmux   = 1,2004			.gpio0  = 0xc4bf,2005			/* 2: Line-In */2006			.audioroute = 2,2007		}, {2008			.type   = CX88_VMUX_SVIDEO,2009			.vmux   = 2,2010			.gpio0  = 0xc4bf,2011			/* 2: Line-In */2012			.audioroute = 2,2013		} },2014		.radio = {2015			.type   = CX88_RADIO,2016			.gpio0	= 0xc4bf,2017			/* 4: FM Stereo */2018			.audioroute = 8,2019		},2020		.mpeg           = CX88_MPEG_DVB,2021		.num_frontends	= 2,2022	},2023	[CX88_BOARD_HAUPPAUGE_HVR4000LITE] = {2024		.name           = "Hauppauge WinTV-HVR4000(Lite) DVB-S/S2",2025		.tuner_type     = UNSET,2026		.radio_type     = UNSET,2027		.tuner_addr     = ADDR_UNSET,2028		.radio_addr     = ADDR_UNSET,2029		.input          = { {2030			.type   = CX88_VMUX_DVB,2031			.vmux   = 0,2032		} },2033		.mpeg           = CX88_MPEG_DVB,2034	},2035	[CX88_BOARD_TEVII_S420] = {2036		.name           = "TeVii S420 DVB-S",2037		.tuner_type     = UNSET,2038		.radio_type     = UNSET,2039		.tuner_addr     = ADDR_UNSET,2040		.radio_addr     = ADDR_UNSET,2041		.input          = { {2042			.type   = CX88_VMUX_DVB,2043			.vmux   = 0,2044		} },2045		.mpeg           = CX88_MPEG_DVB,2046	},2047	[CX88_BOARD_TEVII_S460] = {2048		.name           = "TeVii S460 DVB-S/S2",2049		.tuner_type     = UNSET,2050		.radio_type     = UNSET,2051		.tuner_addr     = ADDR_UNSET,2052		.radio_addr     = ADDR_UNSET,2053		.input          = { {2054			.type   = CX88_VMUX_DVB,2055			.vmux   = 0,2056		} },2057		.mpeg           = CX88_MPEG_DVB,2058	},2059	[CX88_BOARD_TEVII_S464] = {2060		.name           = "TeVii S464 DVB-S/S2",2061		.tuner_type     = UNSET,2062		.radio_type     = UNSET,2063		.tuner_addr     = ADDR_UNSET,2064		.radio_addr     = ADDR_UNSET,2065		.input          = { {2066			.type   = CX88_VMUX_DVB,2067			.vmux   = 0,2068		} },2069		.mpeg           = CX88_MPEG_DVB,2070	},2071	[CX88_BOARD_OMICOM_SS4_PCI] = {2072		.name           = "Omicom SS4 DVB-S/S2 PCI",2073		.tuner_type     = UNSET,2074		.radio_type     = UNSET,2075		.tuner_addr     = ADDR_UNSET,2076		.radio_addr     = ADDR_UNSET,2077		.input          = { {2078			.type   = CX88_VMUX_DVB,2079			.vmux   = 0,2080		} },2081		.mpeg           = CX88_MPEG_DVB,2082	},2083	[CX88_BOARD_TBS_8910] = {2084		.name           = "TBS 8910 DVB-S",2085		.tuner_type     = UNSET,2086		.radio_type     = UNSET,2087		.tuner_addr     = ADDR_UNSET,2088		.radio_addr     = ADDR_UNSET,2089		.input          = { {2090			.type   = CX88_VMUX_DVB,2091			.vmux   = 0,2092		} },2093		.mpeg           = CX88_MPEG_DVB,2094	},2095	[CX88_BOARD_TBS_8920] = {2096		.name           = "TBS 8920 DVB-S/S2",2097		.tuner_type     = UNSET,2098		.radio_type     = UNSET,2099		.tuner_addr     = ADDR_UNSET,2100		.radio_addr     = ADDR_UNSET,2101		.input          = { {2102			.type   = CX88_VMUX_DVB,2103			.vmux   = 0,2104			.gpio0  = 0x8080,2105		} },2106		.mpeg           = CX88_MPEG_DVB,2107	},2108	[CX88_BOARD_PROF_6200] = {2109		.name           = "Prof 6200 DVB-S",2110		.tuner_type     = UNSET,2111		.radio_type     = UNSET,2112		.tuner_addr     = ADDR_UNSET,2113		.radio_addr     = ADDR_UNSET,2114		.input          = { {2115			.type   = CX88_VMUX_DVB,2116			.vmux   = 0,2117		} },2118		.mpeg           = CX88_MPEG_DVB,2119	},2120	[CX88_BOARD_PROF_7300] = {2121		.name           = "PROF 7300 DVB-S/S2",2122		.tuner_type     = UNSET,2123		.radio_type     = UNSET,2124		.tuner_addr     = ADDR_UNSET,2125		.radio_addr     = ADDR_UNSET,2126		.input          = { {2127			.type   = CX88_VMUX_DVB,2128			.vmux   = 0,2129		} },2130		.mpeg           = CX88_MPEG_DVB,2131	},2132	[CX88_BOARD_SATTRADE_ST4200] = {2133		.name           = "SATTRADE ST4200 DVB-S/S2",2134		.tuner_type     = UNSET,2135		.radio_type     = UNSET,2136		.tuner_addr     = ADDR_UNSET,2137		.radio_addr     = ADDR_UNSET,2138		.input          = { {2139			.type   = CX88_VMUX_DVB,2140			.vmux   = 0,2141		} },2142		.mpeg           = CX88_MPEG_DVB,2143	},2144	[CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII] = {2145		.name           = "Terratec Cinergy HT PCI MKII",2146		.tuner_type     = TUNER_XC2028,2147		.tuner_addr     = 0x61,2148		.radio_type     = UNSET,2149		.radio_addr     = ADDR_UNSET,2150		.input          = { {2151			.type   = CX88_VMUX_TELEVISION,2152			.vmux   = 0,2153			.gpio0  = 0x004ff,2154			.gpio1  = 0x010ff,2155			.gpio2  = 0x00001,2156		}, {2157			.type   = CX88_VMUX_COMPOSITE1,2158			.vmux   = 1,2159			.gpio0  = 0x004fb,2160			.gpio1  = 0x010ef,2161			.audioroute = 1,2162		}, {2163			.type   = CX88_VMUX_SVIDEO,2164			.vmux   = 2,2165			.gpio0  = 0x004fb,2166			.gpio1  = 0x010ef,2167			.audioroute = 1,2168		} },2169		.radio = {2170			.type   = CX88_RADIO,2171			.gpio0  = 0x004ff,2172			.gpio1  = 0x010ff,2173			.gpio2  = 0x0ff,2174		},2175		.mpeg           = CX88_MPEG_DVB,2176	},2177	[CX88_BOARD_HAUPPAUGE_IRONLY] = {2178		.name           = "Hauppauge WinTV-IR Only",2179		.tuner_type     = UNSET,2180		.radio_type     = UNSET,2181		.tuner_addr	= ADDR_UNSET,2182		.radio_addr	= ADDR_UNSET,2183	},2184	[CX88_BOARD_WINFAST_DTV1800H] = {2185		.name           = "Leadtek WinFast DTV1800 Hybrid",2186		.tuner_type     = TUNER_XC2028,2187		.radio_type     = UNSET,2188		.tuner_addr     = 0x61,2189		.radio_addr     = ADDR_UNSET,2190		/*2191		 * GPIO setting2192		 *2193		 *  2: mute (0=off,1=on)2194		 * 12: tuner reset pin2195		 * 13: audio source (0=tuner audio,1=line in)2196		 * 14: FM (0=on,1=off ???)2197		 */2198		.input          = { {2199			.type   = CX88_VMUX_TELEVISION,2200			.vmux   = 0,2201			.gpio0  = 0x0400,       /* pin 2 = 0 */2202			.gpio1  = 0x6040,       /* pin 13 = 0, pin 14 = 1 */2203			.gpio2  = 0x0000,2204		}, {2205			.type   = CX88_VMUX_COMPOSITE1,2206			.vmux   = 1,2207			.gpio0  = 0x0400,       /* pin 2 = 0 */2208			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */2209			.gpio2  = 0x0000,2210		}, {2211			.type   = CX88_VMUX_SVIDEO,2212			.vmux   = 2,2213			.gpio0  = 0x0400,       /* pin 2 = 0 */2214			.gpio1  = 0x6060,       /* pin 13 = 1, pin 14 = 1 */2215			.gpio2  = 0x0000,2216		} },2217		.radio = {2218			.type   = CX88_RADIO,2219			.gpio0  = 0x0400,       /* pin 2 = 0 */2220			.gpio1  = 0x6000,       /* pin 13 = 0, pin 14 = 0 */2221			.gpio2  = 0x0000,2222		},2223		.mpeg           = CX88_MPEG_DVB,2224	},2225	[CX88_BOARD_WINFAST_DTV1800H_XC4000] = {2226		.name		= "Leadtek WinFast DTV1800 H (XC4000)",2227		.tuner_type	= TUNER_XC4000,2228		.radio_type	= UNSET,2229		.tuner_addr	= 0x61,2230		.radio_addr	= ADDR_UNSET,2231		/*2232		 * GPIO setting2233		 *2234		 *  2: mute (0=off,1=on)2235		 * 12: tuner reset pin2236		 * 13: audio source (0=tuner audio,1=line in)2237		 * 14: FM (0=on,1=off ???)2238		 */2239		.input		= { {2240			.type	= CX88_VMUX_TELEVISION,2241			.vmux	= 0,2242			.gpio0	= 0x0400,	/* pin 2 = 0 */2243			.gpio1	= 0x6040,	/* pin 13 = 0, pin 14 = 1 */2244			.gpio2	= 0x0000,2245		}, {2246			.type	= CX88_VMUX_COMPOSITE1,2247			.vmux	= 1,2248			.gpio0	= 0x0400,	/* pin 2 = 0 */2249			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */2250			.gpio2	= 0x0000,2251		}, {2252			.type	= CX88_VMUX_SVIDEO,2253			.vmux	= 2,2254			.gpio0	= 0x0400,	/* pin 2 = 0 */2255			.gpio1	= 0x6060,	/* pin 13 = 1, pin 14 = 1 */2256			.gpio2	= 0x0000,2257		} },2258		.radio = {2259			.type	= CX88_RADIO,2260			.gpio0	= 0x0400,	/* pin 2 = 0 */2261			.gpio1	= 0x6000,	/* pin 13 = 0, pin 14 = 0 */2262			.gpio2	= 0x0000,2263		},2264		.mpeg		= CX88_MPEG_DVB,2265	},2266	[CX88_BOARD_WINFAST_DTV2000H_PLUS] = {2267		.name		= "Leadtek WinFast DTV2000 H PLUS",2268		.tuner_type	= TUNER_XC4000,2269		.radio_type	= UNSET,2270		.tuner_addr	= 0x61,2271		.radio_addr	= ADDR_UNSET,2272		/*2273		 * GPIO2274		 *   2: 1: mute audio2275		 *  12: 0: reset XC40002276		 *  13: 1: audio input is line in (0: tuner)2277		 *  14: 0: FM radio2278		 *  16: 0: RF input is cable2279		 */2280		.input		= { {2281			.type	= CX88_VMUX_TELEVISION,2282			.vmux	= 0,2283			.gpio0	= 0x0403,2284			.gpio1	= 0xF0D7,2285			.gpio2	= 0x0101,2286			.gpio3	= 0x0000,2287		}, {2288			.type	= CX88_VMUX_CABLE,2289			.vmux	= 0,2290			.gpio0	= 0x0403,2291			.gpio1	= 0xF0D7,2292			.gpio2	= 0x0100,2293			.gpio3	= 0x0000,2294		}, {2295			.type	= CX88_VMUX_COMPOSITE1,2296			.vmux	= 1,2297			.gpio0	= 0x0403,	/* was 0x0407 */2298			.gpio1	= 0xF0F7,2299			.gpio2	= 0x0101,2300			.gpio3	= 0x0000,2301		}, {2302			.type	= CX88_VMUX_SVIDEO,2303			.vmux	= 2,2304			.gpio0	= 0x0403,	/* was 0x0407 */2305			.gpio1	= 0xF0F7,2306			.gpio2	= 0x0101,2307			.gpio3	= 0x0000,2308		} },2309		.radio = {2310			.type	= CX88_RADIO,2311			.gpio0	= 0x0403,2312			.gpio1	= 0xF097,2313			.gpio2	= 0x0100,2314			.gpio3	= 0x0000,2315		},2316		.mpeg		= CX88_MPEG_DVB,2317	},2318	[CX88_BOARD_PROF_7301] = {2319		.name           = "Prof 7301 DVB-S/S2",2320		.tuner_type     = UNSET,2321		.radio_type     = UNSET,2322		.tuner_addr     = ADDR_UNSET,2323		.radio_addr     = ADDR_UNSET,2324		.input          = { {2325			.type   = CX88_VMUX_DVB,2326			.vmux   = 0,2327		} },2328		.mpeg           = CX88_MPEG_DVB,2329	},2330	[CX88_BOARD_TWINHAN_VP1027_DVBS] = {2331		.name		= "Twinhan VP-1027 DVB-S",2332		.tuner_type     = UNSET,2333		.radio_type     = UNSET,2334		.tuner_addr     = ADDR_UNSET,2335		.radio_addr     = ADDR_UNSET,2336		.input          = { {2337		       .type   = CX88_VMUX_DVB,2338		       .vmux   = 0,2339		} },2340		.mpeg           = CX88_MPEG_DVB,2341	},2342};2343 2344/* ------------------------------------------------------------------ */2345/* PCI subsystem IDs                                                  */2346 2347static const struct cx88_subid cx88_subids[] = {2348	{2349		.subvendor = 0x0070,2350		.subdevice = 0x3400,2351		.card      = CX88_BOARD_HAUPPAUGE,2352	}, {2353		.subvendor = 0x0070,2354		.subdevice = 0x3401,2355		.card      = CX88_BOARD_HAUPPAUGE,2356	}, {2357		.subvendor = 0x14c7,2358		.subdevice = 0x0106,2359		.card      = CX88_BOARD_GDI,2360	}, {2361		.subvendor = 0x14c7,2362		.subdevice = 0x0107, /* with mpeg encoder */2363		.card      = CX88_BOARD_GDI,2364	}, {2365		.subvendor = PCI_VENDOR_ID_ATI,2366		.subdevice = 0x00f8,2367		.card      = CX88_BOARD_ATI_WONDER_PRO,2368	}, {2369		.subvendor = PCI_VENDOR_ID_ATI,2370		.subdevice = 0x00f9,2371		.card      = CX88_BOARD_ATI_WONDER_PRO,2372	}, {2373		.subvendor = 0x107d,2374		.subdevice = 0x6611,2375		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,2376	}, {2377		.subvendor = 0x107d,2378		.subdevice = 0x6613,	/* NTSC */2379		.card      = CX88_BOARD_WINFAST2000XP_EXPERT,2380	}, {2381		.subvendor = 0x107d,2382		.subdevice = 0x6620,2383		.card      = CX88_BOARD_WINFAST_DV2000,2384	}, {2385		.subvendor = 0x107d,2386		.subdevice = 0x663b,2387		.card      = CX88_BOARD_LEADTEK_PVR2000,2388	}, {2389		.subvendor = 0x107d,2390		.subdevice = 0x663c,2391		.card      = CX88_BOARD_LEADTEK_PVR2000,2392	}, {2393		.subvendor = 0x1461,2394		.subdevice = 0x000b,2395		.card      = CX88_BOARD_AVERTV_STUDIO_303,2396	}, {2397		.subvendor = 0x1462,2398		.subdevice = 0x8606,2399		.card      = CX88_BOARD_MSI_TVANYWHERE_MASTER,2400	}, {2401		.subvendor = 0x10fc,2402		.subdevice = 0xd003,2403		.card      = CX88_BOARD_IODATA_GVVCP3PCI,2404	}, {2405		.subvendor = 0x1043,2406		.subdevice = 0x4823,  /* with mpeg encoder */2407		.card      = CX88_BOARD_ASUS_PVR_416,2408	}, {2409		.subvendor = 0x17de,2410		.subdevice = 0x08a6,2411		.card      = CX88_BOARD_KWORLD_DVB_T,2412	}, {2413		.subvendor = 0x18ac,2414		.subdevice = 0xd810,2415		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,2416	}, {2417		.subvendor = 0x18ac,2418		.subdevice = 0xd820,2419		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_T,2420	}, {2421		.subvendor = 0x18ac,2422		.subdevice = 0xdb00,2423		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1,2424	}, {2425		.subvendor = 0x0070,2426		.subdevice = 0x9002,2427		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,2428	}, {2429		.subvendor = 0x14f1,2430		.subdevice = 0x0187,2431		.card      = CX88_BOARD_CONEXANT_DVB_T1,2432	}, {2433		.subvendor = 0x1540,2434		.subdevice = 0x2580,2435		.card      = CX88_BOARD_PROVIDEO_PV259,2436	}, {2437		.subvendor = 0x18ac,2438		.subdevice = 0xdb10,2439		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,2440	}, {2441		.subvendor = 0x1554,2442		.subdevice = 0x4811,2443		.card      = CX88_BOARD_PIXELVIEW,2444	}, {2445		.subvendor = 0x7063,2446		.subdevice = 0x3000, /* HD-3000 card */2447		.card      = CX88_BOARD_PCHDTV_HD3000,2448	}, {2449		.subvendor = 0x17de,2450		.subdevice = 0xa8a6,2451		.card      = CX88_BOARD_DNTV_LIVE_DVB_T,2452	}, {2453		.subvendor = 0x0070,2454		.subdevice = 0x2801,2455		.card      = CX88_BOARD_HAUPPAUGE_ROSLYN,2456	}, {2457		.subvendor = 0x14f1,2458		.subdevice = 0x0342,2459		.card      = CX88_BOARD_DIGITALLOGIC_MEC,2460	}, {2461		.subvendor = 0x10fc,2462		.subdevice = 0xd035,2463		.card      = CX88_BOARD_IODATA_GVBCTV7E,2464	}, {2465		.subvendor = 0x1421,2466		.subdevice = 0x0334,2467		.card      = CX88_BOARD_ADSTECH_DVB_T_PCI,2468	}, {2469		.subvendor = 0x153b,2470		.subdevice = 0x1166,2471		.card      = CX88_BOARD_TERRATEC_CINERGY_1400_DVB_T1,2472	}, {2473		.subvendor = 0x18ac,2474		.subdevice = 0xd500,2475		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_GOLD,2476	}, {2477		.subvendor = 0x1461,2478		.subdevice = 0x8011,2479		.card      = CX88_BOARD_AVERMEDIA_ULTRATV_MC_550,2480	}, {2481		.subvendor = PCI_VENDOR_ID_ATI,2482		.subdevice = 0xa101,2483		.card      = CX88_BOARD_ATI_HDTVWONDER,2484	}, {2485		.subvendor = 0x107d,2486		.subdevice = 0x665f,2487		.card      = CX88_BOARD_WINFAST_DTV1000,2488	}, {2489		.subvendor = 0x1461,2490		.subdevice = 0x000a,2491		.card      = CX88_BOARD_AVERTV_303,2492	}, {2493		.subvendor = 0x0070,2494		.subdevice = 0x9200,2495		.card      = CX88_BOARD_HAUPPAUGE_NOVASE2_S1,2496	}, {2497		.subvendor = 0x0070,2498		.subdevice = 0x9201,2499		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,2500	}, {2501		.subvendor = 0x0070,2502		.subdevice = 0x9202,2503		.card      = CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1,2504	}, {2505		.subvendor = 0x17de,2506		.subdevice = 0x08b2,2507		.card      = CX88_BOARD_KWORLD_DVBS_100,2508	}, {2509		.subvendor = 0x0070,2510		.subdevice = 0x9400,2511		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,2512	}, {2513		.subvendor = 0x0070,2514		.subdevice = 0x9402,2515		.card      = CX88_BOARD_HAUPPAUGE_HVR1100,2516	}, {2517		.subvendor = 0x0070,2518		.subdevice = 0x9800,2519		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,2520	}, {2521		.subvendor = 0x0070,2522		.subdevice = 0x9802,2523		.card      = CX88_BOARD_HAUPPAUGE_HVR1100LP,2524	}, {2525		.subvendor = 0x0070,2526		.subdevice = 0x9001,2527		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,2528	}, {2529		.subvendor = 0x1822,2530		.subdevice = 0x0025,2531		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,2532	}, {2533		.subvendor = 0x17de,2534		.subdevice = 0x08a1,2535		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,2536	}, {2537		.subvendor = 0x18ac,2538		.subdevice = 0xdb50,2539		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,2540	}, {2541		.subvendor = 0x18ac,2542		.subdevice = 0xdb54,2543		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL,2544		/* Re-branded DViCO: DigitalNow DVB-T Dual */2545	}, {2546		.subvendor = 0x18ac,2547		.subdevice = 0xdb11,2548		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS,2549		/* Re-branded DViCO: UltraView DVB-T Plus */2550	}, {2551		.subvendor = 0x18ac,2552		.subdevice = 0xdb30,2553		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO,2554	}, {2555		.subvendor = 0x17de,2556		.subdevice = 0x0840,2557		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,2558	}, {2559		.subvendor = 0x1421,2560		.subdevice = 0x0305,2561		.card      = CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT,2562	}, {2563		.subvendor = 0x18ac,2564		.subdevice = 0xdb40,2565		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,2566	}, {2567		.subvendor = 0x18ac,2568		.subdevice = 0xdb44,2569		.card      = CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID,2570	}, {2571		.subvendor = 0x7063,2572		.subdevice = 0x5500,2573		.card      = CX88_BOARD_PCHDTV_HD5500,2574	}, {2575		.subvendor = 0x17de,2576		.subdevice = 0x0841,2577		.card      = CX88_BOARD_KWORLD_MCE200_DELUXE,2578	}, {2579		.subvendor = 0x1822,2580		.subdevice = 0x0019,2581		.card      = CX88_BOARD_DNTV_LIVE_DVB_T_PRO,2582	}, {2583		.subvendor = 0x1554,2584		.subdevice = 0x4813,2585		.card      = CX88_BOARD_PIXELVIEW_PLAYTV_P7000,2586	}, {2587		.subvendor = 0x14f1,2588		.subdevice = 0x0842,2589		.card      = CX88_BOARD_NPGTECH_REALTV_TOP10FM,2590	}, {2591		.subvendor = 0x107d,2592		.subdevice = 0x665e,2593		.card      = CX88_BOARD_WINFAST_DTV2000H,2594	}, {2595		.subvendor = 0x107d,2596		.subdevice = 0x6f2b,2597		.card      = CX88_BOARD_WINFAST_DTV2000H_J,2598	}, {2599		.subvendor = 0x18ac,2600		.subdevice = 0xd800, /* FusionHDTV 3 Gold (original revision) */2601		.card      = CX88_BOARD_DVICO_FUSIONHDTV_3_GOLD_Q,2602	}, {2603		.subvendor = 0x14f1,2604		.subdevice = 0x0084,2605		.card      = CX88_BOARD_GENIATECH_DVBS,2606	}, {2607		.subvendor = 0x0070,2608		.subdevice = 0x1404,2609		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,2610	}, {2611		.subvendor = 0x18ac,2612		.subdevice = 0xdc00,2613		.card      = CX88_BOARD_SAMSUNG_SMT_7020,2614	}, {2615		.subvendor = 0x18ac,2616		.subdevice = 0xdccd,2617		.card      = CX88_BOARD_SAMSUNG_SMT_7020,2618	}, {2619		.subvendor = 0x1461,2620		.subdevice = 0xc111, /* AverMedia M150-D */2621		/* This board is known to work with the ASUS PVR416 config */2622		.card      = CX88_BOARD_ASUS_PVR_416,2623	}, {2624		.subvendor = 0xc180,2625		.subdevice = 0xc980,2626		.card      = CX88_BOARD_TE_DTV_250_OEM_SWANN,2627	}, {2628		.subvendor = 0x0070,2629		.subdevice = 0x9600,2630		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,2631	}, {2632		.subvendor = 0x0070,2633		.subdevice = 0x9601,2634		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,2635	}, {2636		.subvendor = 0x0070,2637		.subdevice = 0x9602,2638		.card      = CX88_BOARD_HAUPPAUGE_HVR1300,2639	}, {2640		.subvendor = 0x107d,2641		.subdevice = 0x6632,2642		.card      = CX88_BOARD_LEADTEK_PVR2000,2643	}, {2644		.subvendor = 0x12ab,2645		.subdevice = 0x2300, /* Club3D Zap TV2100 */2646		.card      = CX88_BOARD_KWORLD_DVB_T_CX22702,2647	}, {2648		.subvendor = 0x0070,2649		.subdevice = 0x9000,2650		.card      = CX88_BOARD_HAUPPAUGE_DVB_T1,2651	}, {2652		.subvendor = 0x0070,2653		.subdevice = 0x1400,2654		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,2655	}, {2656		.subvendor = 0x0070,2657		.subdevice = 0x1401,2658		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,2659	}, {2660		.subvendor = 0x0070,2661		.subdevice = 0x1402,2662		.card      = CX88_BOARD_HAUPPAUGE_HVR3000,2663	}, {2664		.subvendor = 0x1421,2665		.subdevice = 0x0341, /* ADS Tech InstantTV DVB-S */2666		.card      = CX88_BOARD_KWORLD_DVBS_100,2667	}, {2668		.subvendor = 0x1421,2669		.subdevice = 0x0390,2670		.card      = CX88_BOARD_ADSTECH_PTV_390,2671	}, {2672		.subvendor = 0x11bd,2673		.subdevice = 0x0051,2674		.card      = CX88_BOARD_PINNACLE_PCTV_HD_800i,2675	}, {2676		.subvendor = 0x18ac,2677		.subdevice = 0xd530,2678		.card      = CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO,2679	}, {2680		.subvendor = 0x12ab,2681		.subdevice = 0x1788,2682		.card      = CX88_BOARD_PINNACLE_HYBRID_PCTV,2683	}, {2684		.subvendor = 0x14f1,2685		.subdevice = 0xea3d,2686		.card      = CX88_BOARD_POWERCOLOR_REAL_ANGEL,2687	}, {2688		.subvendor = 0x107d,2689		.subdevice = 0x6f18,2690		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,2691	}, {2692		/* Also NotOnlyTV LV3H (version 1.11 is silkscreened on the board) */2693		.subvendor = 0x14f1,2694		.subdevice = 0x8852,2695		.card      = CX88_BOARD_GENIATECH_X8000_MT,2696	}, {2697		.subvendor = 0x18ac,2698		.subdevice = 0xd610,2699		.card      = CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD,2700	}, {2701		.subvendor = 0x1554,2702		.subdevice = 0x4935,2703		.card      = CX88_BOARD_PROLINK_PV_8000GT,2704	}, {2705		.subvendor = 0x1554,2706		.subdevice = 0x4976,2707		.card      = CX88_BOARD_PROLINK_PV_GLOBAL_XTREME,2708	}, {2709		.subvendor = 0x17de,2710		.subdevice = 0x08c1,2711		.card      = CX88_BOARD_KWORLD_ATSC_120,2712	}, {2713		.subvendor = 0x0070,2714		.subdevice = 0x6900,2715		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,2716	}, {2717		.subvendor = 0x0070,2718		.subdevice = 0x6904,2719		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,2720	}, {2721		.subvendor = 0x0070,2722		.subdevice = 0x6902,2723		.card      = CX88_BOARD_HAUPPAUGE_HVR4000,2724	}, {2725		.subvendor = 0x0070,2726		.subdevice = 0x6905,2727		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,2728	}, {2729		.subvendor = 0x0070,2730		.subdevice = 0x6906,2731		.card      = CX88_BOARD_HAUPPAUGE_HVR4000LITE,2732	}, {2733		.subvendor = 0xd420,2734		.subdevice = 0x9022,2735		.card      = CX88_BOARD_TEVII_S420,2736	}, {2737		.subvendor = 0xd460,2738		.subdevice = 0x9022,2739		.card      = CX88_BOARD_TEVII_S460,2740	}, {2741		.subvendor = 0xd464,2742		.subdevice = 0x9022,2743		.card      = CX88_BOARD_TEVII_S464,2744	}, {2745		.subvendor = 0xA044,2746		.subdevice = 0x2011,2747		.card      = CX88_BOARD_OMICOM_SS4_PCI,2748	}, {2749		.subvendor = 0x8910,2750		.subdevice = 0x8888,2751		.card      = CX88_BOARD_TBS_8910,2752	}, {2753		.subvendor = 0x8920,2754		.subdevice = 0x8888,2755		.card      = CX88_BOARD_TBS_8920,2756	}, {2757		.subvendor = 0xb022,2758		.subdevice = 0x3022,2759		.card      = CX88_BOARD_PROF_6200,2760	}, {2761		.subvendor = 0xB033,2762		.subdevice = 0x3033,2763		.card      = CX88_BOARD_PROF_7300,2764	}, {2765		.subvendor = 0xb200,2766		.subdevice = 0x4200,2767		.card      = CX88_BOARD_SATTRADE_ST4200,2768	}, {2769		.subvendor = 0x153b,2770		.subdevice = 0x1177,2771		.card      = CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII,2772	}, {2773		.subvendor = 0x0070,2774		.subdevice = 0x9290,2775		.card      = CX88_BOARD_HAUPPAUGE_IRONLY,2776	}, {2777		.subvendor = 0x107d,2778		.subdevice = 0x6654,2779		.card      = CX88_BOARD_WINFAST_DTV1800H,2780	}, {2781		/* WinFast DTV1800 H with XC4000 tuner */2782		.subvendor = 0x107d,2783		.subdevice = 0x6f38,2784		.card      = CX88_BOARD_WINFAST_DTV1800H_XC4000,2785	}, {2786		.subvendor = 0x107d,2787		.subdevice = 0x6f42,2788		.card      = CX88_BOARD_WINFAST_DTV2000H_PLUS,2789	}, {2790		/* PVR2000 PAL Model [107d:6630] */2791		.subvendor = 0x107d,2792		.subdevice = 0x6630,2793		.card      = CX88_BOARD_LEADTEK_PVR2000,2794	}, {2795		/* PVR2000 PAL Model [107d:6638] */2796		.subvendor = 0x107d,2797		.subdevice = 0x6638,2798		.card      = CX88_BOARD_LEADTEK_PVR2000,2799	}, {2800		/* PVR2000 NTSC Model [107d:6631] */2801		.subvendor = 0x107d,2802		.subdevice = 0x6631,2803		.card      = CX88_BOARD_LEADTEK_PVR2000,2804	}, {2805		/* PVR2000 NTSC Model [107d:6637] */2806		.subvendor = 0x107d,2807		.subdevice = 0x6637,2808		.card      = CX88_BOARD_LEADTEK_PVR2000,2809	}, {2810		/* PVR2000 NTSC Model [107d:663d] */2811		.subvendor = 0x107d,2812		.subdevice = 0x663d,2813		.card      = CX88_BOARD_LEADTEK_PVR2000,2814	}, {2815		/* DV2000 NTSC Model [107d:6621] */2816		.subvendor = 0x107d,2817		.subdevice = 0x6621,2818		.card      = CX88_BOARD_WINFAST_DV2000,2819	}, {2820		/* TV2000 XP Global [107d:6618]  */2821		.subvendor = 0x107d,2822		.subdevice = 0x6618,2823		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,2824	}, {2825		/* TV2000 XP Global [107d:6618] */2826		.subvendor = 0x107d,2827		.subdevice = 0x6619,2828		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL,2829	}, {2830		/* WinFast TV2000 XP Global with XC4000 tuner */2831		.subvendor = 0x107d,2832		.subdevice = 0x6f36,2833		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36,2834	}, {2835		/* WinFast TV2000 XP Global with XC4000 tuner and different GPIOs */2836		.subvendor = 0x107d,2837		.subdevice = 0x6f43,2838		.card      = CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43,2839	}, {2840		.subvendor = 0xb034,2841		.subdevice = 0x3034,2842		.card      = CX88_BOARD_PROF_7301,2843	}, {2844		.subvendor = 0x1822,2845		.subdevice = 0x0023,2846		.card      = CX88_BOARD_TWINHAN_VP1027_DVBS,2847	},2848};2849 2850/*2851 * some leadtek specific stuff2852 */2853static void leadtek_eeprom(struct cx88_core *core, u8 *eeprom_data)2854{2855	if (eeprom_data[4] != 0x7d ||2856	    eeprom_data[5] != 0x10 ||2857	    eeprom_data[7] != 0x66) {2858		pr_warn("Leadtek eeprom invalid.\n");2859		return;2860	}2861 2862	/* Terry Wu <terrywu2009@gmail.com> */2863	switch (eeprom_data[6]) {2864	case 0x13: /* SSID 6613 for TV2000 XP Expert NTSC Model */2865	case 0x21: /* SSID 6621 for DV2000 NTSC Model */2866	case 0x31: /* SSID 6631 for PVR2000 NTSC Model */2867	case 0x37: /* SSID 6637 for PVR2000 NTSC Model */2868	case 0x3d: /* SSID 6637 for PVR2000 NTSC Model */2869		core->board.tuner_type = TUNER_PHILIPS_FM1236_MK3;2870		break;2871	default:2872		core->board.tuner_type = TUNER_PHILIPS_FM1216ME_MK3;2873		break;2874	}2875 2876	pr_info("Leadtek Winfast 2000XP Expert config: tuner=%d, eeprom[0]=0x%02x\n",2877		core->board.tuner_type, eeprom_data[0]);2878}2879 2880static void hauppauge_eeprom(struct cx88_core *core, u8 *eeprom_data)2881{2882	struct tveeprom tv;2883 2884	tveeprom_hauppauge_analog(&tv, eeprom_data);2885	core->board.tuner_type = tv.tuner_type;2886	core->tuner_formats = tv.tuner_formats;2887	core->board.radio.type = tv.has_radio ? CX88_RADIO : 0;2888	core->model = tv.model;2889 2890	/* Make sure we support the board model */2891	switch (tv.model) {2892	case 14009: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in) */2893	case 14019: /* WinTV-HVR3000 (Retail, IR Blaster, b/panel video, 3.5mm audio in) */2894	case 14029: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge) */2895	case 14109: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - low profile) */2896	case 14129: /* WinTV-HVR3000 (Retail, IR, b/panel video, 3.5mm audio in - 880 bridge - LP) */2897	case 14559: /* WinTV-HVR3000 (OEM, no IR, b/panel video, 3.5mm audio in) */2898	case 14569: /* WinTV-HVR3000 (OEM, no IR, no back panel video) */2899	case 14659: /* WinTV-HVR3000 (OEM, no IR, b/panel video, RCA audio in - Low profile) */2900	case 14669: /* WinTV-HVR3000 (OEM, no IR, no b/panel video - Low profile) */2901	case 28552: /* WinTV-PVR 'Roslyn' (No IR) */2902	case 34519: /* WinTV-PCI-FM */2903	case 69009:2904		/* WinTV-HVR4000 (DVBS/S2/T, Video and IR, back panel inputs) */2905	case 69100: /* WinTV-HVR4000LITE (DVBS/S2, IR) */2906	case 69500: /* WinTV-HVR4000LITE (DVBS/S2, No IR) */2907	case 69559:2908		/* WinTV-HVR4000 (DVBS/S2/T, Video no IR, back panel inputs) */2909	case 69569: /* WinTV-HVR4000 (DVBS/S2/T, Video no IR) */2910	case 90002: /* Nova-T-PCI (9002) */2911	case 92001: /* Nova-S-Plus (Video and IR) */2912	case 92002: /* Nova-S-Plus (Video and IR) */2913	case 90003: /* Nova-T-PCI (9002 No RF out) */2914	case 90500: /* Nova-T-PCI (oem) */2915	case 90501: /* Nova-T-PCI (oem/IR) */2916	case 92000: /* Nova-SE2 (OEM, No Video or IR) */2917	case 92900: /* WinTV-IROnly (No analog or digital Video inputs) */2918	case 94009: /* WinTV-HVR1100 (Video and IR Retail) */2919	case 94501: /* WinTV-HVR1100 (Video and IR OEM) */2920	case 96009: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX) */2921	case 96019: /* WinTV-HVR1300 (PAL Video, MPEG Video and IR RX/TX) */2922	case 96559: /* WinTV-HVR1300 (PAL Video, MPEG Video no IR) */2923	case 96569: /* WinTV-HVR1300 () */2924	case 96659: /* WinTV-HVR1300 () */2925	case 98559: /* WinTV-HVR1100LP (Video no IR, Retail - Low Profile) */2926		/* known */2927		break;2928	case CX88_BOARD_SAMSUNG_SMT_7020:2929		cx_set(MO_GP0_IO, 0x008989FF);2930		break;2931	default:2932		pr_warn("warning: unknown hauppauge model #%d\n", tv.model);2933		break;2934	}2935 2936	pr_info("hauppauge eeprom: model=%d\n", tv.model);2937}2938 2939/*2940 * some GDI (was: Modular Technology) specific stuff2941 */2942 2943static const struct {2944	int  id;2945	int  fm;2946	const char *name;2947} gdi_tuner[] = {2948	[0x01] = { .id   = UNSET,2949		   .name = "NTSC_M" },2950	[0x02] = { .id   = UNSET,2951		   .name = "PAL_B" },2952	[0x03] = { .id   = UNSET,2953		   .name = "PAL_I" },2954	[0x04] = { .id   = UNSET,2955		   .name = "PAL_D" },2956	[0x05] = { .id   = UNSET,2957		   .name = "SECAM" },2958 2959	[0x10] = { .id   = UNSET,2960		   .fm   = 1,2961		   .name = "TEMIC_4049" },2962	[0x11] = { .id   = TUNER_TEMIC_4136FY5,2963		   .name = "TEMIC_4136" },2964	[0x12] = { .id   = UNSET,2965		   .name = "TEMIC_4146" },2966 2967	[0x20] = { .id   = TUNER_PHILIPS_FQ1216ME,2968		   .fm   = 1,2969		   .name = "PHILIPS_FQ1216_MK3" },2970	[0x21] = { .id   = UNSET, .fm = 1,2971		   .name = "PHILIPS_FQ1236_MK3" },2972	[0x22] = { .id   = UNSET,2973		   .name = "PHILIPS_FI1236_MK3" },2974	[0x23] = { .id   = UNSET,2975		   .name = "PHILIPS_FI1216_MK3" },2976};2977 2978static void gdi_eeprom(struct cx88_core *core, u8 *eeprom_data)2979{2980	const char *name = (eeprom_data[0x0d] < ARRAY_SIZE(gdi_tuner))2981		? gdi_tuner[eeprom_data[0x0d]].name : NULL;2982 2983	pr_info("GDI: tuner=%s\n", name ? name : "unknown");2984	if (!name)2985		return;2986	core->board.tuner_type = gdi_tuner[eeprom_data[0x0d]].id;2987	core->board.radio.type = gdi_tuner[eeprom_data[0x0d]].fm ?2988		CX88_RADIO : 0;2989}2990 2991/*2992 * some Divco specific stuff2993 */2994static int cx88_dvico_xc2028_callback(struct cx88_core *core,2995				      int command, int arg)2996{2997	switch (command) {2998	case XC2028_TUNER_RESET:2999		switch (core->boardnr) {3000		case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:3001			/* GPIO-4 xc3028 tuner */3002 3003			cx_set(MO_GP0_IO, 0x00001000);3004			cx_clear(MO_GP0_IO, 0x00000010);3005			msleep(100);3006			cx_set(MO_GP0_IO, 0x00000010);3007			msleep(100);3008			break;3009		default:3010			cx_write(MO_GP0_IO, 0x101000);3011			mdelay(5);3012			cx_set(MO_GP0_IO, 0x101010);3013		}3014		break;3015	default:3016		return -EINVAL;3017	}3018 3019	return 0;3020}3021 3022/*3023 * some Geniatech specific stuff3024 */3025 3026static int cx88_xc3028_geniatech_tuner_callback(struct cx88_core *core,3027						int command, int mode)3028{3029	switch (command) {3030	case XC2028_TUNER_RESET:3031		switch (INPUT(core->input).type) {3032		case CX88_RADIO:3033			break;3034		case CX88_VMUX_DVB:3035			cx_write(MO_GP1_IO, 0x030302);3036			mdelay(50);3037			break;3038		default:3039			cx_write(MO_GP1_IO, 0x030301);3040			mdelay(50);3041		}3042		cx_write(MO_GP1_IO, 0x101010);3043		mdelay(50);3044		cx_write(MO_GP1_IO, 0x101000);3045		mdelay(50);3046		cx_write(MO_GP1_IO, 0x101010);3047		mdelay(50);3048		return 0;3049	}3050	return -EINVAL;3051}3052 3053static int cx88_xc3028_winfast1800h_callback(struct cx88_core *core,3054					     int command, int arg)3055{3056	switch (command) {3057	case XC2028_TUNER_RESET:3058		/* GPIO 12 (xc3028 tuner reset) */3059		cx_set(MO_GP1_IO, 0x1010);3060		mdelay(50);3061		cx_clear(MO_GP1_IO, 0x10);3062		mdelay(75);3063		cx_set(MO_GP1_IO, 0x10);3064		mdelay(75);3065		return 0;3066	}3067	return -EINVAL;3068}3069 3070static int cx88_xc4000_winfast2000h_plus_callback(struct cx88_core *core,3071						  int command, int arg)3072{3073	switch (command) {3074	case XC4000_TUNER_RESET:3075		/* GPIO 12 (xc4000 tuner reset) */3076		cx_set(MO_GP1_IO, 0x1010);3077		mdelay(50);3078		cx_clear(MO_GP1_IO, 0x10);3079		mdelay(75);3080		cx_set(MO_GP1_IO, 0x10);3081		mdelay(75);3082		return 0;3083	}3084	return -EINVAL;3085}3086 3087/*3088 * some Divco specific stuff3089 */3090static int cx88_pv_8000gt_callback(struct cx88_core *core,3091				   int command, int arg)3092{3093	switch (command) {3094	case XC2028_TUNER_RESET:3095		cx_write(MO_GP2_IO, 0xcf7);3096		mdelay(50);3097		cx_write(MO_GP2_IO, 0xef5);3098		mdelay(50);3099		cx_write(MO_GP2_IO, 0xcf7);3100		break;3101	default:3102		return -EINVAL;3103	}3104 3105	return 0;3106}3107 3108/*3109 * some DViCO specific stuff3110 */3111 3112static void dvico_fusionhdtv_hybrid_init(struct cx88_core *core)3113{3114	struct i2c_msg msg = { .addr = 0x45, .flags = 0 };3115	int i, err;3116	static u8 init_bufs[13][5] = {3117		{ 0x10, 0x00, 0x20, 0x01, 0x03 },3118		{ 0x10, 0x10, 0x01, 0x00, 0x21 },3119		{ 0x10, 0x10, 0x10, 0x00, 0xCA },3120		{ 0x10, 0x10, 0x12, 0x00, 0x08 },3121		{ 0x10, 0x10, 0x13, 0x00, 0x0A },3122		{ 0x10, 0x10, 0x16, 0x01, 0xC0 },3123		{ 0x10, 0x10, 0x22, 0x01, 0x3D },3124		{ 0x10, 0x10, 0x73, 0x01, 0x2E },3125		{ 0x10, 0x10, 0x72, 0x00, 0xC5 },3126		{ 0x10, 0x10, 0x71, 0x01, 0x97 },3127		{ 0x10, 0x10, 0x70, 0x00, 0x0F },3128		{ 0x10, 0x10, 0xB0, 0x00, 0x01 },3129		{ 0x03, 0x0C },3130	};3131 3132	for (i = 0; i < ARRAY_SIZE(init_bufs); i++) {3133		msg.buf = init_bufs[i];3134		msg.len = (i != 12 ? 5 : 2);3135		err = i2c_transfer(&core->i2c_adap, &msg, 1);3136		if (err != 1) {3137			pr_warn("dvico_fusionhdtv_hybrid_init buf %d failed (err = %d)!\n",3138				i, err);3139			return;3140		}3141	}3142}3143 3144static int cx88_xc2028_tuner_callback(struct cx88_core *core,3145				      int command, int arg)3146{3147	/* Board-specific callbacks */3148	switch (core->boardnr) {3149	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:3150	case CX88_BOARD_GENIATECH_X8000_MT:3151	case CX88_BOARD_KWORLD_ATSC_120:3152		return cx88_xc3028_geniatech_tuner_callback(core,3153							command, arg);3154	case CX88_BOARD_PROLINK_PV_8000GT:3155	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:3156		return cx88_pv_8000gt_callback(core, command, arg);3157	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:3158	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:3159		return cx88_dvico_xc2028_callback(core, command, arg);3160	case CX88_BOARD_NOTONLYTV_LV3H:3161	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:3162	case CX88_BOARD_WINFAST_DTV1800H:3163		return cx88_xc3028_winfast1800h_callback(core, command, arg);3164	}3165 3166	switch (command) {3167	case XC2028_TUNER_RESET:3168		switch (INPUT(core->input).type) {3169		case CX88_RADIO:3170			dprintk(1, "setting GPIO to radio!\n");3171			cx_write(MO_GP0_IO, 0x4ff);3172			mdelay(250);3173			cx_write(MO_GP2_IO, 0xff);3174			mdelay(250);3175			break;3176		case CX88_VMUX_DVB:	/* Digital TV*/3177		default:		/* Analog TV */3178			dprintk(1, "setting GPIO to TV!\n");3179			break;3180		}3181		cx_write(MO_GP1_IO, 0x101010);3182		mdelay(250);3183		cx_write(MO_GP1_IO, 0x101000);3184		mdelay(250);3185		cx_write(MO_GP1_IO, 0x101010);3186		mdelay(250);3187		return 0;3188	}3189	return -EINVAL;3190}3191 3192static int cx88_xc4000_tuner_callback(struct cx88_core *core,3193				      int command, int arg)3194{3195	/* Board-specific callbacks */3196	switch (core->boardnr) {3197	case CX88_BOARD_WINFAST_DTV1800H_XC4000:3198	case CX88_BOARD_WINFAST_DTV2000H_PLUS:3199	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:3200	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:3201		return cx88_xc4000_winfast2000h_plus_callback(core,3202							      command, arg);3203	}3204	return -EINVAL;3205}3206 3207/*3208 * Tuner callback function. Currently only needed for the Pinnacle3209 * PCTV HD 800i with an xc5000 silicon tuner. This is used for both3210 * analog tuner attach (tuner-core.c) and dvb tuner attach (cx88-dvb.c)3211 */3212static int cx88_xc5000_tuner_callback(struct cx88_core *core,3213				      int command, int arg)3214{3215	switch (core->boardnr) {3216	case CX88_BOARD_PINNACLE_PCTV_HD_800i:3217		if (command == 0) { /* This is the reset command from xc5000 */3218 3219			/*3220			 * djh - According to the engineer at PCTV Systems,3221			 * the xc5000 reset pin is supposed to be on GPIO12.3222			 * However, despite three nights of effort, pulling3223			 * that GPIO low didn't reset the xc5000.  While3224			 * pulling MO_SRST_IO low does reset the xc5000, this3225			 * also resets in the s5h1409 being reset as well.3226			 * This causes tuning to always fail since the internal3227			 * state of the s5h1409 does not match the driver's3228			 * state.  Given that the only two conditions in which3229			 * the driver performs a reset is during firmware load3230			 * and powering down the chip, I am taking out the3231			 * reset.  We know that the chip is being reset3232			 * when the cx88 comes online, and not being able to3233			 * do power management for this board is worse than3234			 * not having any tuning at all.3235			 */3236			return 0;3237		}3238 3239		dprintk(1, "xc5000: unknown tuner callback command.\n");3240		return -EINVAL;3241	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:3242		if (command == 0) { /* This is the reset command from xc5000 */3243			cx_clear(MO_GP0_IO, 0x00000010);3244			usleep_range(10000, 20000);3245			cx_set(MO_GP0_IO, 0x00000010);3246			return 0;3247		}3248 3249		dprintk(1, "xc5000: unknown tuner callback command.\n");3250		return -EINVAL;3251	}3252	return 0; /* Should never be here */3253}3254 3255int cx88_tuner_callback(void *priv, int component, int command, int arg)3256{3257	struct i2c_algo_bit_data *i2c_algo = priv;3258	struct cx88_core *core;3259 3260	if (!i2c_algo) {3261		pr_err("Error - i2c private data undefined.\n");3262		return -EINVAL;3263	}3264 3265	core = i2c_algo->data;3266 3267	if (!core) {3268		pr_err("Error - device struct undefined.\n");3269		return -EINVAL;3270	}3271 3272	if (component != DVB_FRONTEND_COMPONENT_TUNER)3273		return -EINVAL;3274 3275	switch (core->board.tuner_type) {3276	case TUNER_XC2028:3277		dprintk(1, "Calling XC2028/3028 callback\n");3278		return cx88_xc2028_tuner_callback(core, command, arg);3279	case TUNER_XC4000:3280		dprintk(1, "Calling XC4000 callback\n");3281		return cx88_xc4000_tuner_callback(core, command, arg);3282	case TUNER_XC5000:3283		dprintk(1, "Calling XC5000 callback\n");3284		return cx88_xc5000_tuner_callback(core, command, arg);3285	}3286	pr_err("Error: Calling callback for tuner %d\n",3287	       core->board.tuner_type);3288	return -EINVAL;3289}3290EXPORT_SYMBOL(cx88_tuner_callback);3291 3292/* ----------------------------------------------------------------------- */3293 3294static void cx88_card_list(struct cx88_core *core, struct pci_dev *pci)3295{3296	int i;3297 3298	if (!pci->subsystem_vendor && !pci->subsystem_device) {3299		pr_err("Your board has no valid PCI Subsystem ID and thus can't\n");3300		pr_err("be autodetected.  Please pass card=<n> insmod option to\n");3301		pr_err("workaround that.  Redirect complaints to the vendor of\n");3302		pr_err("the TV card\n");3303	} else {3304		pr_err("Your board isn't known (yet) to the driver.  You can\n");3305		pr_err("try to pick one of the existing card configs via\n");3306		pr_err("card=<n> insmod option.  Updating to the latest\n");3307		pr_err("version might help as well.\n");3308	}3309	pr_err("Here is a list of valid choices for the card=<n> insmod option:\n");3310	for (i = 0; i < ARRAY_SIZE(cx88_boards); i++)3311		pr_err("    card=%d -> %s\n", i, cx88_boards[i].name);3312}3313 3314static void cx88_card_setup_pre_i2c(struct cx88_core *core)3315{3316	switch (core->boardnr) {3317	case CX88_BOARD_HAUPPAUGE_HVR1300:3318		/*3319		 * Bring the 702 demod up before i2c scanning/attach or3320		 * devices are hidden.3321		 *3322		 * We leave here with the 702 on the bus3323		 *3324		 * "reset the IR receiver on GPIO[3]"3325		 * Reported by Mike Crash <mike AT mikecrash.com>3326		 */3327		cx_write(MO_GP0_IO, 0x0000ef88);3328		udelay(1000);3329		cx_clear(MO_GP0_IO, 0x00000088);3330		udelay(50);3331		cx_set(MO_GP0_IO, 0x00000088); /* 702 out of reset */3332		udelay(1000);3333		break;3334 3335	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:3336	case CX88_BOARD_PROLINK_PV_8000GT:3337		cx_write(MO_GP2_IO, 0xcf7);3338		msleep(50);3339		cx_write(MO_GP2_IO, 0xef5);3340		msleep(50);3341		cx_write(MO_GP2_IO, 0xcf7);3342		usleep_range(10000, 20000);3343		break;3344 3345	case CX88_BOARD_DVICO_FUSIONHDTV_7_GOLD:3346		/* Enable the xc5000 tuner */3347		cx_set(MO_GP0_IO, 0x00001010);3348		break;3349 3350	case CX88_BOARD_WINFAST_DTV2000H_J:3351	case CX88_BOARD_HAUPPAUGE_HVR3000:3352	case CX88_BOARD_HAUPPAUGE_HVR4000:3353		/* Init GPIO */3354		cx_write(MO_GP0_IO, core->board.input[0].gpio0);3355		udelay(1000);3356		cx_clear(MO_GP0_IO, 0x00000080);3357		udelay(50);3358		cx_set(MO_GP0_IO, 0x00000080); /* 702 out of reset */3359		udelay(1000);3360		break;3361 3362	case CX88_BOARD_NOTONLYTV_LV3H:3363	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:3364	case CX88_BOARD_WINFAST_DTV1800H:3365		cx88_xc3028_winfast1800h_callback(core, XC2028_TUNER_RESET, 0);3366		break;3367 3368	case CX88_BOARD_WINFAST_DTV1800H_XC4000:3369	case CX88_BOARD_WINFAST_DTV2000H_PLUS:3370	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F36:3371	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL_6F43:3372		cx88_xc4000_winfast2000h_plus_callback(core,3373						       XC4000_TUNER_RESET, 0);3374		break;3375 3376	case CX88_BOARD_TWINHAN_VP1027_DVBS:3377		cx_write(MO_GP0_IO, 0x00003230);3378		cx_write(MO_GP0_IO, 0x00003210);3379		usleep_range(10000, 20000);3380		cx_write(MO_GP0_IO, 0x00001230);3381		break;3382	}3383}3384 3385/*3386 * Sets board-dependent xc3028 configuration3387 */3388void cx88_setup_xc3028(struct cx88_core *core, struct xc2028_ctrl *ctl)3389{3390	memset(ctl, 0, sizeof(*ctl));3391 3392	ctl->fname   = XC2028_DEFAULT_FIRMWARE;3393	ctl->max_len = 64;3394 3395	switch (core->boardnr) {3396	case CX88_BOARD_POWERCOLOR_REAL_ANGEL:3397		/* Now works with firmware version 2.7 */3398		if (core->i2c_algo.udelay < 16)3399			core->i2c_algo.udelay = 16;3400		break;3401	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:3402	case CX88_BOARD_WINFAST_DTV1800H:3403		ctl->demod = XC3028_FE_ZARLINK456;3404		break;3405	case CX88_BOARD_KWORLD_ATSC_120:3406	case CX88_BOARD_DVICO_FUSIONHDTV_5_PCI_NANO:3407		ctl->demod = XC3028_FE_OREN538;3408		break;3409	case CX88_BOARD_GENIATECH_X8000_MT:3410		/*3411		 * FIXME: For this board, the xc3028 never recovers after being3412		 * powered down (the reset GPIO probably is not set properly).3413		 * We don't have access to the hardware so we cannot determine3414		 * which GPIO is used for xc3028, so just disable power xc30283415		 * power management for now3416		 */3417		ctl->disable_power_mgmt = 1;3418		break;3419	case CX88_BOARD_NOTONLYTV_LV3H:3420		ctl->demod			= XC3028_FE_ZARLINK456;3421		ctl->fname			= XC3028L_DEFAULT_FIRMWARE;3422		ctl->read_not_reliable	= 1;3423		break;3424	case CX88_BOARD_WINFAST_TV2000_XP_GLOBAL:3425	case CX88_BOARD_PROLINK_PV_GLOBAL_XTREME:3426	case CX88_BOARD_PROLINK_PV_8000GT:3427		/*3428		 * Those boards uses non-MTS firmware3429		 */3430		break;3431	case CX88_BOARD_PINNACLE_HYBRID_PCTV:3432	case CX88_BOARD_TERRATEC_CINERGY_HT_PCI_MKII:3433		ctl->demod = XC3028_FE_ZARLINK456;3434		ctl->mts = 1;3435		break;3436	default:3437		ctl->demod = XC3028_FE_OREN538;3438		ctl->mts = 1;3439	}3440}3441EXPORT_SYMBOL_GPL(cx88_setup_xc3028);3442 3443static void cx88_card_setup(struct cx88_core *core)3444{3445	static u8 eeprom[256];3446	struct tuner_setup tun_setup;3447	unsigned int mode_mask = T_RADIO | T_ANALOG_TV;3448 3449	memset(&tun_setup, 0, sizeof(tun_setup));3450 3451	if (!core->i2c_rc) {3452		core->i2c_client.addr = 0xa0 >> 1;3453		tveeprom_read(&core->i2c_client, eeprom, sizeof(eeprom));3454	}3455 3456	switch (core->boardnr) {3457	case CX88_BOARD_HAUPPAUGE:3458	case CX88_BOARD_HAUPPAUGE_ROSLYN:3459		if (!core->i2c_rc)3460			hauppauge_eeprom(core, eeprom + 8);3461		break;3462	case CX88_BOARD_GDI:3463		if (!core->i2c_rc)3464			gdi_eeprom(core, eeprom);3465		break;3466	case CX88_BOARD_LEADTEK_PVR2000:3467	case CX88_BOARD_WINFAST_DV2000:3468	case CX88_BOARD_WINFAST2000XP_EXPERT:3469		if (!core->i2c_rc)3470			leadtek_eeprom(core, eeprom);3471		break;3472	case CX88_BOARD_HAUPPAUGE_NOVASPLUS_S1:3473	case CX88_BOARD_HAUPPAUGE_NOVASE2_S1:3474	case CX88_BOARD_HAUPPAUGE_DVB_T1:3475	case CX88_BOARD_HAUPPAUGE_HVR1100:3476	case CX88_BOARD_HAUPPAUGE_HVR1100LP:3477	case CX88_BOARD_HAUPPAUGE_HVR3000:3478	case CX88_BOARD_HAUPPAUGE_HVR1300:3479	case CX88_BOARD_HAUPPAUGE_HVR4000:3480	case CX88_BOARD_HAUPPAUGE_HVR4000LITE:3481	case CX88_BOARD_HAUPPAUGE_IRONLY:3482		if (!core->i2c_rc)3483			hauppauge_eeprom(core, eeprom);3484		break;3485	case CX88_BOARD_KWORLD_DVBS_100:3486		cx_write(MO_GP0_IO, 0x000007f8);3487		cx_write(MO_GP1_IO, 0x00000001);3488		break;3489	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PRO:3490		/* GPIO0:0 is hooked to demod reset */3491		/* GPIO0:4 is hooked to xc3028 reset */3492		cx_write(MO_GP0_IO, 0x00111100);3493		usleep_range(10000, 20000);3494		cx_write(MO_GP0_IO, 0x00111111);3495		break;3496	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_DUAL:3497		/* GPIO0:6 is hooked to FX2 reset pin */3498		cx_set(MO_GP0_IO, 0x00004040);3499		cx_clear(MO_GP0_IO, 0x00000040);3500		msleep(1000);3501		cx_set(MO_GP0_IO, 0x00004040);3502		fallthrough;3503	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T1:3504	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_PLUS:3505	case CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID:3506		/* GPIO0:0 is hooked to mt352 reset pin */3507		cx_set(MO_GP0_IO, 0x00000101);3508		cx_clear(MO_GP0_IO, 0x00000001);3509		usleep_range(10000, 20000);3510		cx_set(MO_GP0_IO, 0x00000101);3511		if (!core->i2c_rc &&3512		    core->boardnr == CX88_BOARD_DVICO_FUSIONHDTV_DVB_T_HYBRID)3513			dvico_fusionhdtv_hybrid_init(core);3514		break;3515	case CX88_BOARD_KWORLD_DVB_T:3516	case CX88_BOARD_DNTV_LIVE_DVB_T:3517		cx_set(MO_GP0_IO, 0x00000707);3518		cx_set(MO_GP2_IO, 0x00000101);3519		cx_clear(MO_GP2_IO, 0x00000001);3520		usleep_range(10000, 20000);3521		cx_clear(MO_GP0_IO, 0x00000007);3522		cx_set(MO_GP2_IO, 0x00000101);3523		break;3524	case CX88_BOARD_DNTV_LIVE_DVB_T_PRO:3525		cx_write(MO_GP0_IO, 0x00080808);3526		break;3527	case CX88_BOARD_ATI_HDTVWONDER:3528		if (!core->i2c_rc) {3529			/* enable tuner */3530			int i;3531			static const u8 buffer[][2] = {3532				{0x10, 0x12},3533				{0x13, 0x04},3534				{0x16, 0x00},3535				{0x14, 0x04},3536				{0x17, 0x00}3537			};3538			core->i2c_client.addr = 0x0a;3539 3540			for (i = 0; i < ARRAY_SIZE(buffer); i++)3541				if (i2c_master_send(&core->i2c_client,3542						    buffer[i], 2) != 2)3543					pr_warn("Unable to enable tuner(%i).\n",3544						i);3545		}3546		break;3547	case CX88_BOARD_MSI_TVANYWHERE_MASTER:3548	{3549		struct v4l2_priv_tun_config tea5767_cfg;3550		struct tea5767_ctrl ctl;3551 3552		memset(&ctl, 0, sizeof(ctl));3553 3554		ctl.high_cut  = 1;3555		ctl.st_noise  = 1;3556		ctl.deemph_75 = 1;3557		ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;3558 3559		tea5767_cfg.tuner = TUNER_TEA5767;3560		tea5767_cfg.priv  = &ctl;3561 3562		call_all(core, tuner, s_config, &tea5767_cfg);3563		break;3564	}3565	case  CX88_BOARD_TEVII_S420:3566	case  CX88_BOARD_TEVII_S460:3567	case  CX88_BOARD_TEVII_S464:3568	case  CX88_BOARD_OMICOM_SS4_PCI:3569	case  CX88_BOARD_TBS_8910:3570	case  CX88_BOARD_TBS_8920:3571	case  CX88_BOARD_PROF_6200:3572	case  CX88_BOARD_PROF_7300:3573	case  CX88_BOARD_PROF_7301:3574	case  CX88_BOARD_SATTRADE_ST4200:3575		cx_write(MO_GP0_IO, 0x8000);3576		msleep(100);3577		cx_write(MO_SRST_IO, 0);3578		usleep_range(10000, 20000);3579		cx_write(MO_GP0_IO, 0x8080);3580		msleep(100);3581		cx_write(MO_SRST_IO, 1);3582		msleep(100);3583		break;3584	} /*end switch() */3585 3586	/* Setup tuners */3587	if (core->board.radio_type != UNSET) {3588		tun_setup.mode_mask      = T_RADIO;3589		tun_setup.type           = core->board.radio_type;3590		tun_setup.addr           = core->board.radio_addr;3591		tun_setup.tuner_callback = cx88_tuner_callback;3592		call_all(core, tuner, s_type_addr, &tun_setup);3593		mode_mask &= ~T_RADIO;3594	}3595 3596	if (core->board.tuner_type != UNSET) {3597		tun_setup.mode_mask      = mode_mask;3598		tun_setup.type           = core->board.tuner_type;3599		tun_setup.addr           = core->board.tuner_addr;3600		tun_setup.tuner_callback = cx88_tuner_callback;3601 3602		call_all(core, tuner, s_type_addr, &tun_setup);3603	}3604 3605	if (core->board.tda9887_conf) {3606		struct v4l2_priv_tun_config tda9887_cfg;3607 3608		tda9887_cfg.tuner = TUNER_TDA9887;3609		tda9887_cfg.priv  = &core->board.tda9887_conf;3610 3611		call_all(core, tuner, s_config, &tda9887_cfg);3612	}3613 3614	if (core->board.tuner_type == TUNER_XC2028) {3615		struct v4l2_priv_tun_config  xc2028_cfg;3616		struct xc2028_ctrl           ctl;3617 3618		/* Fills device-dependent initialization parameters */3619		cx88_setup_xc3028(core, &ctl);3620 3621		/* Sends parameters to xc2028/3028 tuner */3622		memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));3623		xc2028_cfg.tuner = TUNER_XC2028;3624		xc2028_cfg.priv  = &ctl;3625		dprintk(1, "Asking xc2028/3028 to load firmware %s\n",3626			ctl.fname);3627		call_all(core, tuner, s_config, &xc2028_cfg);3628	}3629	call_all(core, tuner, standby);3630}3631 3632/* ------------------------------------------------------------------ */3633 3634static int cx88_pci_quirks(const char *name, struct pci_dev *pci)3635{3636	unsigned int lat = UNSET;3637	u8 ctrl = 0;3638	u8 value;3639 3640	/* check pci quirks */3641	if (pci_pci_problems & PCIPCI_TRITON) {3642		pr_info("quirk: PCIPCI_TRITON -- set TBFX\n");3643		ctrl |= CX88X_EN_TBFX;3644	}3645	if (pci_pci_problems & PCIPCI_NATOMA) {3646		pr_info("quirk: PCIPCI_NATOMA -- set TBFX\n");3647		ctrl |= CX88X_EN_TBFX;3648	}3649	if (pci_pci_problems & PCIPCI_VIAETBF) {3650		pr_info("quirk: PCIPCI_VIAETBF -- set TBFX\n");3651		ctrl |= CX88X_EN_TBFX;3652	}3653	if (pci_pci_problems & PCIPCI_VSFX) {3654		pr_info("quirk: PCIPCI_VSFX -- set VSFX\n");3655		ctrl |= CX88X_EN_VSFX;3656	}3657#ifdef PCIPCI_ALIMAGIK3658	if (pci_pci_problems & PCIPCI_ALIMAGIK) {3659		pr_info("quirk: PCIPCI_ALIMAGIK -- latency fixup\n");3660		lat = 0x0A;3661	}3662#endif3663 3664	/* check insmod options */3665	if (latency != UNSET)3666		lat = latency;3667 3668	/* apply stuff */3669	if (ctrl) {3670		pci_read_config_byte(pci, CX88X_DEVCTRL, &value);3671		value |= ctrl;3672		pci_write_config_byte(pci, CX88X_DEVCTRL, value);3673	}3674	if (lat != UNSET) {3675		pr_info("setting pci latency timer to %d\n", latency);3676		pci_write_config_byte(pci, PCI_LATENCY_TIMER, latency);3677	}3678	return 0;3679}3680 3681int cx88_get_resources(const struct cx88_core *core, struct pci_dev *pci)3682{3683	if (request_mem_region(pci_resource_start(pci, 0),3684			       pci_resource_len(pci, 0),3685			       core->name))3686		return 0;3687	pr_err("func %d: Can't get MMIO memory @ 0x%llx, subsystem: %04x:%04x\n",3688	       PCI_FUNC(pci->devfn),3689	       (unsigned long long)pci_resource_start(pci, 0),3690	       pci->subsystem_vendor, pci->subsystem_device);3691	return -EBUSY;3692}3693 3694/*3695 * Allocate and initialize the cx88 core struct.  One should hold the3696 * devlist mutex before calling this.3697 */3698struct cx88_core *cx88_core_create(struct pci_dev *pci, int nr)3699{3700	struct cx88_core *core;3701	int i;3702 3703	core = kzalloc(sizeof(*core), GFP_KERNEL);3704	if (!core)3705		return NULL;3706 3707	refcount_set(&core->refcount, 1);3708	core->pci_bus  = pci->bus->number;3709	core->pci_slot = PCI_SLOT(pci->devfn);3710	core->pci_irqmask = PCI_INT_RISC_RD_BERRINT | PCI_INT_RISC_WR_BERRINT |3711			    PCI_INT_BRDG_BERRINT | PCI_INT_SRC_DMA_BERRINT |3712			    PCI_INT_DST_DMA_BERRINT | PCI_INT_IPB_DMA_BERRINT;3713	mutex_init(&core->lock);3714 3715	core->nr = nr;3716	sprintf(core->name, "cx88[%d]", core->nr);3717 3718	/*3719	 * Note: Setting initial standard here would cause first call to3720	 * cx88_set_tvnorm() to return without programming any registers.  Leave3721	 * it blank for at this point and it will get set later in3722	 * cx8800_initdev()3723	 */3724	core->tvnorm  = 0;3725 3726	core->width   = 320;3727	core->height  = 240;3728	core->field   = V4L2_FIELD_INTERLACED;3729 3730	strscpy(core->v4l2_dev.name, core->name, sizeof(core->v4l2_dev.name));3731	if (v4l2_device_register(NULL, &core->v4l2_dev)) {3732		kfree(core);3733		return NULL;3734	}3735 3736	if (v4l2_ctrl_handler_init(&core->video_hdl, 13)) {3737		v4l2_device_unregister(&core->v4l2_dev);3738		kfree(core);3739		return NULL;3740	}3741 3742	if (v4l2_ctrl_handler_init(&core->audio_hdl, 13)) {3743		v4l2_ctrl_handler_free(&core->video_hdl);3744		v4l2_device_unregister(&core->v4l2_dev);3745		kfree(core);3746		return NULL;3747	}3748 3749	if (cx88_get_resources(core, pci) != 0) {3750		v4l2_ctrl_handler_free(&core->video_hdl);3751		v4l2_ctrl_handler_free(&core->audio_hdl);3752		v4l2_device_unregister(&core->v4l2_dev);3753		kfree(core);3754		return NULL;3755	}3756 3757	/* PCI stuff */3758	cx88_pci_quirks(core->name, pci);3759	core->lmmio = ioremap(pci_resource_start(pci, 0),3760			      pci_resource_len(pci, 0));3761	core->bmmio = (u8 __iomem *)core->lmmio;3762 3763	if (!core->lmmio) {3764		release_mem_region(pci_resource_start(pci, 0),3765				   pci_resource_len(pci, 0));3766		v4l2_ctrl_handler_free(&core->video_hdl);3767		v4l2_ctrl_handler_free(&core->audio_hdl);3768		v4l2_device_unregister(&core->v4l2_dev);3769		kfree(core);3770		return NULL;3771	}3772 3773	/* board config */3774	core->boardnr = UNSET;3775	if (card[core->nr] < ARRAY_SIZE(cx88_boards))3776		core->boardnr = card[core->nr];3777	for (i = 0; core->boardnr == UNSET && i < ARRAY_SIZE(cx88_subids); i++)3778		if (pci->subsystem_vendor == cx88_subids[i].subvendor &&3779		    pci->subsystem_device == cx88_subids[i].subdevice)3780			core->boardnr = cx88_subids[i].card;3781	if (core->boardnr == UNSET) {3782		core->boardnr = CX88_BOARD_UNKNOWN;3783		cx88_card_list(core, pci);3784	}3785 3786	core->board = cx88_boards[core->boardnr];3787 3788	if (!core->board.num_frontends && (core->board.mpeg & CX88_MPEG_DVB))3789		core->board.num_frontends = 1;3790 3791	pr_info("subsystem: %04x:%04x, board: %s [card=%d,%s], frontend(s): %d\n",3792		pci->subsystem_vendor, pci->subsystem_device, core->board.name,3793		core->boardnr, card[core->nr] == core->boardnr ?3794		"insmod option" : "autodetected",3795		core->board.num_frontends);3796 3797	if (tuner[core->nr] != UNSET)3798		core->board.tuner_type = tuner[core->nr];3799	if (radio[core->nr] != UNSET)3800		core->board.radio_type = radio[core->nr];3801 3802	dprintk(1, "TV tuner type %d, Radio tuner type %d\n",3803		core->board.tuner_type, core->board.radio_type);3804 3805	/* init hardware */3806	cx88_reset(core);3807	cx88_card_setup_pre_i2c(core);3808	cx88_i2c_init(core, pci);3809 3810	/* load tuner module, if needed */3811	if (core->board.tuner_type != UNSET) {3812		/*3813		 * Ignore 0x6b and 0x6f on cx88 boards.3814		 * FusionHDTV5 RT Gold has an ir receiver at 0x6b3815		 * and an RTC at 0x6f which can get corrupted if probed.3816		 */3817		static const unsigned short tv_addrs[] = {3818			0x42, 0x43, 0x4a, 0x4b,		/* tda8290 */3819			0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,3820			0x68, 0x69, 0x6a, 0x6c, 0x6d, 0x6e,3821			I2C_CLIENT_END3822		};3823		int has_demod = (core->board.tda9887_conf & TDA9887_PRESENT);3824 3825		/*3826		 * I don't trust the radio_type as is stored in the card3827		 * definitions, so we just probe for it.3828		 * The radio_type is sometimes missing, or set to UNSET but3829		 * later code configures a tea5767.3830		 */3831		v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,3832				    "tuner", 0,3833				    v4l2_i2c_tuner_addrs(ADDRS_RADIO));3834		if (has_demod)3835			v4l2_i2c_new_subdev(&core->v4l2_dev,3836					    &core->i2c_adap, "tuner",3837				0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));3838		if (core->board.tuner_addr == ADDR_UNSET) {3839			v4l2_i2c_new_subdev(&core->v4l2_dev,3840					    &core->i2c_adap, "tuner",3841				0, has_demod ? tv_addrs + 4 : tv_addrs);3842		} else {3843			v4l2_i2c_new_subdev(&core->v4l2_dev, &core->i2c_adap,3844					    "tuner", core->board.tuner_addr,3845					    NULL);3846		}3847	}3848 3849	cx88_card_setup(core);3850	if (!disable_ir) {3851		cx88_i2c_init_ir(core);3852		cx88_ir_init(core, pci);3853	}3854 3855	return core;3856}3857