14630b130b30be6420394ba31121e111c8771ca08Aaron Sierra/*
24630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  lpc_ich.c - LPC interface for Intel ICH
34630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *
44630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  LPC bridge function of the Intel ICH contains many other
54630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  functional units, such as Interrupt controllers, Timers,
64630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  Power Management, System Management, GPIO, RTC, and LPC
74630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  Configuration Registers.
84630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *
94630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  This driver is derived from lpc_sch.
104630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
114630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  Copyright (c) 2011 Extreme Engineering Solution, Inc.
124630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  Author: Aaron Sierra <asierra@xes-inc.com>
134630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *
144630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  This program is free software; you can redistribute it and/or modify
154630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  it under the terms of the GNU General Public License 2 as published
164630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  by the Free Software Foundation.
174630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *
184630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  This program is distributed in the hope that it will be useful,
194630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  but WITHOUT ANY WARRANTY; without even the implied warranty of
204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
214630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  GNU General Public License for more details.
224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *
234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  You should have received a copy of the GNU General Public License
244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  along with this program; see the file COPYING.  If not, write to
254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
264630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *
274630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *  This driver supports the following I/O Controller hubs:
284630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	(See the intel documentation on http://developer.intel.com.)
294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 290655-003, 290677-014: 82801AA (ICH), 82801AB (ICHO)
304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 290687-002, 298242-027: 82801BA (ICH2)
314630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 290733-003, 290739-013: 82801CA (ICH3-S)
324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 290716-001, 290718-007: 82801CAM (ICH3-M)
334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 290744-001, 290745-025: 82801DB (ICH4)
344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 252337-001, 252663-008: 82801DBM (ICH4-M)
354630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 273599-001, 273645-002: 82801E (C-ICH)
364630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 252516-001, 252517-028: 82801EB (ICH5), 82801ER (ICH5R)
374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 300641-004, 300884-013: 6300ESB
384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 301473-002, 301474-026: 82801F (ICH6)
394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 313082-001, 313075-006: 631xESB, 632xESB
404630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 307013-003, 307014-024: 82801G (ICH7)
414630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 322896-001, 322897-001: NM10
424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 313056-003, 313057-017: 82801H (ICH8)
434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 316972-004, 316973-012: 82801I (ICH9)
444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 319973-002, 319974-002: 82801J (ICH10)
454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 322169-001, 322170-003: 5 Series, 3400 Series (PCH)
464630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 320066-003, 320257-008: EP80597 (IICH)
474630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number 324645-001, 324646-001: Cougar Point (CPT)
484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number TBD : Patsburg (PBG)
494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number TBD : DH89xxCC
504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number TBD : Panther Point
514630b130b30be6420394ba31121e111c8771ca08Aaron Sierra *	document number TBD : Lynx Point
527fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston *	document number TBD : Lynx Point-LP
536e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston *	document number TBD : Wellsburg
548477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston *	document number TBD : Avoton SoC
55283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley *	document number TBD : Coleto Creek
565e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston *	document number TBD : Wildcat Point-LP
57fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston *	document number TBD : 9 Series
584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra */
594630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
614630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/kernel.h>
634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/module.h>
644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/errno.h>
654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/acpi.h>
664630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/pci.h>
674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/mfd/core.h>
684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#include <linux/mfd/lpc_ich.h>
694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#define ACPIBASE		0x40
714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#define ACPIBASE_GPE_OFF	0x28
724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra#define ACPIBASE_GPE_END	0x2f
73887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define ACPIBASE_SMI_OFF	0x30
74887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define ACPIBASE_SMI_END	0x33
75eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser#define ACPIBASE_PMC_OFF	0x08
76eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser#define ACPIBASE_PMC_END	0x0c
77887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define ACPIBASE_TCO_OFF	0x60
78887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define ACPIBASE_TCO_END	0x7f
79eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser#define ACPICTRL_PMCBASE	0x44
804630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
81887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define ACPIBASE_GCS_OFF	0x3410
82887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define ACPIBASE_GCS_END	0x3414
83887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
8401560f6bb958b821ceec98590a7147d610a62625Aaron Sierra#define GPIOBASE_ICH0		0x58
8501560f6bb958b821ceec98590a7147d610a62625Aaron Sierra#define GPIOCTRL_ICH0		0x5C
8601560f6bb958b821ceec98590a7147d610a62625Aaron Sierra#define GPIOBASE_ICH6		0x48
8701560f6bb958b821ceec98590a7147d610a62625Aaron Sierra#define GPIOCTRL_ICH6		0x4C
884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
89887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define RCBABASE		0xf0
90887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
91887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define wdt_io_res(i) wdt_res(0, i)
92887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define wdt_mem_res(i) wdt_res(ICH_RES_MEM_OFF, i)
93887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra#define wdt_res(b, i) (&wdt_ich_res[(b) + (i)])
94887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
9501560f6bb958b821ceec98590a7147d610a62625Aaron Sierrastruct lpc_ich_priv {
9601560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	int chipset;
97429b941abd503c8936e116c819362323aafdbd50Peter Tyser
98429b941abd503c8936e116c819362323aafdbd50Peter Tyser	int abase;		/* ACPI base */
99eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	int actrl_pbase;	/* ACPI control or PMC base */
100429b941abd503c8936e116c819362323aafdbd50Peter Tyser	int gbase;		/* GPIO base */
101429b941abd503c8936e116c819362323aafdbd50Peter Tyser	int gctrl;		/* GPIO control */
102429b941abd503c8936e116c819362323aafdbd50Peter Tyser
103eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	int abase_save;		/* Cached ACPI base value */
104eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	int actrl_pbase_save;		/* Cached ACPI control or PMC base value */
105429b941abd503c8936e116c819362323aafdbd50Peter Tyser	int gctrl_save;		/* Cached GPIO control value */
10601560f6bb958b821ceec98590a7147d610a62625Aaron Sierra};
1074630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
108887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierrastatic struct resource wdt_ich_res[] = {
109887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	/* ACPI - TCO */
110887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	{
111887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.flags = IORESOURCE_IO,
112887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	},
113887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	/* ACPI - SMI */
114887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	{
115887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.flags = IORESOURCE_IO,
116887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	},
117eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	/* GCS or PMC */
118887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	{
119887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.flags = IORESOURCE_MEM,
120887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	},
121887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra};
122887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
1234630b130b30be6420394ba31121e111c8771ca08Aaron Sierrastatic struct resource gpio_ich_res[] = {
1244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	/* GPIO */
1254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{
1264630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.flags = IORESOURCE_IO,
1274630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
1284630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	/* ACPI - GPE0 */
1294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{
1304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.flags = IORESOURCE_IO,
1314630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
1324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
1334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
1344630b130b30be6420394ba31121e111c8771ca08Aaron Sierraenum lpc_cells {
135887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	LPC_WDT = 0,
136887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	LPC_GPIO,
1374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
1384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
1394630b130b30be6420394ba31121e111c8771ca08Aaron Sierrastatic struct mfd_cell lpc_ich_cells[] = {
140887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	[LPC_WDT] = {
141887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.name = "iTCO_wdt",
142887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.num_resources = ARRAY_SIZE(wdt_ich_res),
143887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.resources = wdt_ich_res,
144887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.ignore_resource_conflicts = true,
145887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	},
1464630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_GPIO] = {
1474630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "gpio_ich",
1484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.num_resources = ARRAY_SIZE(gpio_ich_res),
1494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.resources = gpio_ich_res,
1504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.ignore_resource_conflicts = true,
1514630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
1524630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
1534630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
1544630b130b30be6420394ba31121e111c8771ca08Aaron Sierra/* chipset related info */
1554630b130b30be6420394ba31121e111c8771ca08Aaron Sierraenum lpc_chipsets {
1564630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH = 0,	/* ICH */
1574630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH0,	/* ICH0 */
1584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH2,	/* ICH2 */
1594630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH2M,	/* ICH2-M */
1604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH3,	/* ICH3-S */
1614630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH3M,	/* ICH3-M */
1624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH4,	/* ICH4 */
1634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH4M,	/* ICH4-M */
1644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_CICH,	/* C-ICH */
1654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH5,	/* ICH5 & ICH5R */
1664630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_6300ESB,	/* 6300ESB */
1674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH6,	/* ICH6 & ICH6R */
1684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH6M,	/* ICH6-M */
1694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH6W,	/* ICH6W & ICH6RW */
1704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_631XESB,	/* 631xESB/632xESB */
1714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH7,	/* ICH7 & ICH7R */
1724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH7DH,	/* ICH7DH */
1734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH7M,	/* ICH7-M & ICH7-U */
1744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH7MDH,	/* ICH7-M DH */
1754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_NM10,	/* NM10 */
1764630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH8,	/* ICH8 & ICH8R */
1774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH8DH,	/* ICH8DH */
1784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH8DO,	/* ICH8DO */
1794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH8M,	/* ICH8M */
1804630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH8ME,	/* ICH8M-E */
1814630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH9,	/* ICH9 */
1824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH9R,	/* ICH9R */
1834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH9DH,	/* ICH9DH */
1844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH9DO,	/* ICH9DO */
1854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH9M,	/* ICH9M */
1864630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH9ME,	/* ICH9M-E */
1874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH10,	/* ICH10 */
1884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH10R,	/* ICH10R */
1894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH10D,	/* ICH10D */
1904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_ICH10DO,	/* ICH10DO */
1914630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_PCH,	/* PCH Desktop Full Featured */
1924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_PCHM,	/* PCH Mobile Full Featured */
1934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_P55,	/* P55 */
1944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_PM55,	/* PM55 */
1954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_H55,	/* H55 */
1964630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_QM57,	/* QM57 */
1974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_H57,	/* H57 */
1984630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_HM55,	/* HM55 */
1994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_Q57,	/* Q57 */
2004630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_HM57,	/* HM57 */
2014630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_PCHMSFF,	/* PCH Mobile SFF Full Featured */
2024630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_QS57,	/* QS57 */
2034630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_3400,	/* 3400 */
2044630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_3420,	/* 3420 */
2054630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_3450,	/* 3450 */
2064630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_EP80579,	/* EP80579 */
2074630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_CPT,	/* Cougar Point */
2084630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_CPTD,	/* Cougar Point Desktop */
2094630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_CPTM,	/* Cougar Point Mobile */
2104630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_PBG,	/* Patsburg */
2114630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_DH89XXCC,	/* DH89xxCC */
2124630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_PPT,	/* Panther Point */
2134630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	LPC_LPT,	/* Lynx Point */
2147fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	LPC_LPT_LP,	/* Lynx Point-LP */
2156e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	LPC_WBG,	/* Wellsburg */
2168477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	LPC_AVN,	/* Avoton SoC */
2176111ec70357022ccd037399c13f69900431850b4Peter Tyser	LPC_BAYTRAIL,   /* Bay Trail SoC */
218283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley	LPC_COLETO,	/* Coleto Creek */
2195e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	LPC_WPT_LP,	/* Wildcat Point-LP */
220ff0c9da013d2c9f1ec232926a54e536ab48c6678Alan Cox	LPC_BRASWELL,	/* Braswell SoC */
221fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	LPC_9S,		/* 9 Series */
2224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
2234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
224a1ca138ff05f1f7b5f752fae0df6e34f0f58f16cJingoo Hanstatic struct lpc_ich_info lpc_chipset_info[] = {
2254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH] = {
2264630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH",
227887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2284630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH0] = {
2304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH0",
231887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH2] = {
2344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH2",
235887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2364630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH2M] = {
2384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH2-M",
239887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2404630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2414630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH3] = {
2424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH3-S",
243887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH3M] = {
2464630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH3-M",
247887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH4] = {
2504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH4",
251887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2524630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2534630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH4M] = {
2544630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH4-M",
255887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2564630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2574630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_CICH] = {
2584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "C-ICH",
259887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2614630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH5] = {
2624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH5 or ICH5R",
263887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_6300ESB] = {
2664630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "6300ESB",
267887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 1,
2684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH6] = {
2704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH6 or ICH6R",
271887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
2724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V6_GPIO,
2734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH6M] = {
2754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH6-M",
276887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
2774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V6_GPIO,
2784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH6W] = {
2804630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH6W or ICH6RW",
281887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
2824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V6_GPIO,
2834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_631XESB] = {
2854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "631xESB/632xESB",
286887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
2874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V6_GPIO,
2884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH7] = {
2904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH7 or ICH7R",
291887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
2924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
2934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH7DH] = {
2954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH7DH",
296887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
2974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
2984630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
2994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH7M] = {
3004630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH7-M or ICH7-U",
301887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3024630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3034630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3044630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH7MDH] = {
3054630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH7-M DH",
306887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3074630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3084630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3094630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_NM10] = {
3104630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "NM10",
311887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
312117bbfe25cfc2e968be1f7976ac460a5cd3d734ePeter Tyser		.gpio_version = ICH_V7_GPIO,
3134630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3144630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH8] = {
3154630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH8 or ICH8R",
316887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3174630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3184630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3194630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH8DH] = {
3204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH8DH",
321887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH8DO] = {
3254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH8DO",
326887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3274630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3284630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH8M] = {
3304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH8M",
331887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH8ME] = {
3354630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH8M-E",
336887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V7_GPIO,
3384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH9] = {
3404630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH9",
341887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V9_GPIO,
3434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH9R] = {
3454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH9R",
346887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3474630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V9_GPIO,
3484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH9DH] = {
3504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH9DH",
351887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3524630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V9_GPIO,
3534630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3544630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH9DO] = {
3554630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH9DO",
356887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3574630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V9_GPIO,
3584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3594630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH9M] = {
3604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH9M",
361887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V9_GPIO,
3634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH9ME] = {
3654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH9M-E",
366887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V9_GPIO,
3684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH10] = {
3704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH10",
371887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V10CONS_GPIO,
3734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH10R] = {
3754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH10R",
376887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V10CONS_GPIO,
3784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH10D] = {
3804630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH10D",
381887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V10CORP_GPIO,
3834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_ICH10DO] = {
3854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "ICH10DO",
386887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V10CORP_GPIO,
3884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_PCH] = {
3904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "PCH Desktop Full Featured",
391887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
3934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_PCHM] = {
3954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "PCH Mobile Full Featured",
396887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
3974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
3984630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
3994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_P55] = {
4004630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "P55",
401887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4024630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4034630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4044630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_PM55] = {
4054630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "PM55",
406887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4074630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4084630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4094630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_H55] = {
4104630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "H55",
411887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4124630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4134630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4144630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_QM57] = {
4154630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "QM57",
416887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4174630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4184630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4194630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_H57] = {
4204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "H57",
421887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_HM55] = {
4254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "HM55",
426887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4274630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4284630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_Q57] = {
4304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Q57",
431887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_HM57] = {
4354630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "HM57",
436887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_PCHMSFF] = {
4404630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "PCH Mobile SFF Full Featured",
441887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_QS57] = {
4454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "QS57",
446887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4474630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_3400] = {
4504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "3400",
451887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4524630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4534630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4544630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_3420] = {
4554630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "3420",
456887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4574630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4594630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_3450] = {
4604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "3450",
461887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_EP80579] = {
4654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "EP80579",
466887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_CPT] = {
4694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Cougar Point",
470887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_CPTD] = {
4744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Cougar Point Desktop",
475887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4764630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_CPTM] = {
4794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Cougar Point Mobile",
480887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4814630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.gpio_version = ICH_V5_GPIO,
4824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_PBG] = {
4844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Patsburg",
485887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4864630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_DH89XXCC] = {
4884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "DH89xxCC",
489887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4914630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_PPT] = {
4924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Panther Point",
493887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
49462cf2cdb99c7e870ab857bdd617e728790f8c43cGuenter Roeck		.gpio_version = ICH_V5_GPIO,
4954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
4964630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	[LPC_LPT] = {
4974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		.name = "Lynx Point",
498887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		.iTCO_version = 2,
4994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	},
5007fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	[LPC_LPT_LP] = {
5017fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston		.name = "Lynx Point_LP",
5027fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston		.iTCO_version = 2,
5037fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	},
5046e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	[LPC_WBG] = {
5056e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston		.name = "Wellsburg",
5066e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston		.iTCO_version = 2,
5076e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	},
5088477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	[LPC_AVN] = {
5098477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston		.name = "Avoton SoC",
510c48cf59878685cc06b71bb2a3ca17b61103c8de7Peter Tyser		.iTCO_version = 3,
511facd9939403cb5769190054a600474399e776e3aVincent Donnefort		.gpio_version = AVOTON_GPIO,
5128477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	},
5136111ec70357022ccd037399c13f69900431850b4Peter Tyser	[LPC_BAYTRAIL] = {
5146111ec70357022ccd037399c13f69900431850b4Peter Tyser		.name = "Bay Trail SoC",
5156111ec70357022ccd037399c13f69900431850b4Peter Tyser		.iTCO_version = 3,
5166111ec70357022ccd037399c13f69900431850b4Peter Tyser	},
517283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley	[LPC_COLETO] = {
518283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley		.name = "Coleto Creek",
519283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley		.iTCO_version = 2,
520283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley	},
5215e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	[LPC_WPT_LP] = {
522a8822df9043b6ff9751bca8acd8f0f64dd727706James Ralston		.name = "Wildcat Point_LP",
5235e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston		.iTCO_version = 2,
5245e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	},
525ff0c9da013d2c9f1ec232926a54e536ab48c6678Alan Cox	[LPC_BRASWELL] = {
526ff0c9da013d2c9f1ec232926a54e536ab48c6678Alan Cox		.name = "Braswell SoC",
527ff0c9da013d2c9f1ec232926a54e536ab48c6678Alan Cox		.iTCO_version = 3,
528ff0c9da013d2c9f1ec232926a54e536ab48c6678Alan Cox	},
529fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	[LPC_9S] = {
530fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston		.name = "9 Series",
531fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston		.iTCO_version = 2,
532fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	},
5334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
5344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
5354630b130b30be6420394ba31121e111c8771ca08Aaron Sierra/*
5364630b130b30be6420394ba31121e111c8771ca08Aaron Sierra * This data only exists for exporting the supported PCI ids
5374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra * via MODULE_DEVICE_TABLE.  We do not actually register a
5384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra * pci_driver, because the I/O Controller Hub has also other
5394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra * functions that probably will be registered by other drivers.
5404630b130b30be6420394ba31121e111c8771ca08Aaron Sierra */
54136fcd06c4638acacee7135906cab60f11ea1ffacJingoo Hanstatic const struct pci_device_id lpc_ich_ids[] = {
5424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2410), LPC_ICH},
5434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2420), LPC_ICH0},
5444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2440), LPC_ICH2},
5454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x244c), LPC_ICH2M},
5464630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2480), LPC_ICH3},
5474630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x248c), LPC_ICH3M},
5484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x24c0), LPC_ICH4},
5494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x24cc), LPC_ICH4M},
5504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2450), LPC_CICH},
5514630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x24d0), LPC_ICH5},
5524630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x25a1), LPC_6300ESB},
5534630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2640), LPC_ICH6},
5544630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2641), LPC_ICH6M},
5554630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2642), LPC_ICH6W},
5564630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2670), LPC_631XESB},
5574630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2671), LPC_631XESB},
5584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2672), LPC_631XESB},
5594630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2673), LPC_631XESB},
5604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2674), LPC_631XESB},
5614630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2675), LPC_631XESB},
5624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2676), LPC_631XESB},
5634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2677), LPC_631XESB},
5644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2678), LPC_631XESB},
5654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2679), LPC_631XESB},
5664630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x267a), LPC_631XESB},
5674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x267b), LPC_631XESB},
5684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x267c), LPC_631XESB},
5694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x267d), LPC_631XESB},
5704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x267e), LPC_631XESB},
5714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x267f), LPC_631XESB},
5724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x27b8), LPC_ICH7},
5734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x27b0), LPC_ICH7DH},
5744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x27b9), LPC_ICH7M},
5754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x27bd), LPC_ICH7MDH},
5764630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x27bc), LPC_NM10},
5774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2810), LPC_ICH8},
5784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2812), LPC_ICH8DH},
5794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2814), LPC_ICH8DO},
5804630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2815), LPC_ICH8M},
5814630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2811), LPC_ICH8ME},
5824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2918), LPC_ICH9},
5834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2916), LPC_ICH9R},
5844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2912), LPC_ICH9DH},
5854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2914), LPC_ICH9DO},
5864630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2919), LPC_ICH9M},
5874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2917), LPC_ICH9ME},
5884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3a18), LPC_ICH10},
5894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3a16), LPC_ICH10R},
5904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3a1a), LPC_ICH10D},
5914630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3a14), LPC_ICH10DO},
5924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b00), LPC_PCH},
5934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b01), LPC_PCHM},
5944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b02), LPC_P55},
5954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b03), LPC_PM55},
5964630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b06), LPC_H55},
5974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b07), LPC_QM57},
5984630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b08), LPC_H57},
5994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b09), LPC_HM55},
6004630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b0a), LPC_Q57},
6014630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b0b), LPC_HM57},
6024630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b0d), LPC_PCHMSFF},
6034630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b0f), LPC_QS57},
6044630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b12), LPC_3400},
6054630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b14), LPC_3420},
6064630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x3b16), LPC_3450},
6074630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x5031), LPC_EP80579},
6084630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c41), LPC_CPT},
6094630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c42), LPC_CPTD},
6104630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c43), LPC_CPTM},
6114630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c44), LPC_CPT},
6124630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c45), LPC_CPT},
6134630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c46), LPC_CPT},
6144630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c47), LPC_CPT},
6154630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c48), LPC_CPT},
6164630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c49), LPC_CPT},
6174630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c4a), LPC_CPT},
6184630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c4b), LPC_CPT},
6194630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c4c), LPC_CPT},
6204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c4d), LPC_CPT},
6214630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c4e), LPC_CPT},
6224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c4f), LPC_CPT},
6234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c50), LPC_CPT},
6244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c51), LPC_CPT},
6254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c52), LPC_CPT},
6264630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c53), LPC_CPT},
6274630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c54), LPC_CPT},
6284630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c55), LPC_CPT},
6294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c56), LPC_CPT},
6304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c57), LPC_CPT},
6314630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c58), LPC_CPT},
6324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c59), LPC_CPT},
6334630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c5a), LPC_CPT},
6344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c5b), LPC_CPT},
6354630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c5c), LPC_CPT},
6364630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c5d), LPC_CPT},
6374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c5e), LPC_CPT},
6384630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1c5f), LPC_CPT},
6394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1d40), LPC_PBG},
6404630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1d41), LPC_PBG},
6414630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x2310), LPC_DH89XXCC},
6424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e40), LPC_PPT},
6434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e41), LPC_PPT},
6444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e42), LPC_PPT},
6454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e43), LPC_PPT},
6464630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e44), LPC_PPT},
6474630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e45), LPC_PPT},
6484630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e46), LPC_PPT},
6494630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e47), LPC_PPT},
6504630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e48), LPC_PPT},
6514630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e49), LPC_PPT},
6524630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e4a), LPC_PPT},
6534630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e4b), LPC_PPT},
6544630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e4c), LPC_PPT},
6554630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e4d), LPC_PPT},
6564630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e4e), LPC_PPT},
6574630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e4f), LPC_PPT},
6584630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e50), LPC_PPT},
6594630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e51), LPC_PPT},
6604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e52), LPC_PPT},
6614630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e53), LPC_PPT},
6624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e54), LPC_PPT},
6634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e55), LPC_PPT},
6644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e56), LPC_PPT},
6654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e57), LPC_PPT},
6664630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e58), LPC_PPT},
6674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e59), LPC_PPT},
6684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e5a), LPC_PPT},
6694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e5b), LPC_PPT},
6704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e5c), LPC_PPT},
6714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e5d), LPC_PPT},
6724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e5e), LPC_PPT},
6734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x1e5f), LPC_PPT},
6744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c40), LPC_LPT},
6754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c41), LPC_LPT},
6764630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c42), LPC_LPT},
6774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c43), LPC_LPT},
6784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c44), LPC_LPT},
6794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c45), LPC_LPT},
6804630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c46), LPC_LPT},
6814630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c47), LPC_LPT},
6824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c48), LPC_LPT},
6834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c49), LPC_LPT},
6844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c4a), LPC_LPT},
6854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c4b), LPC_LPT},
6864630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c4c), LPC_LPT},
6874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c4d), LPC_LPT},
6884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c4e), LPC_LPT},
6894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c4f), LPC_LPT},
6904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c50), LPC_LPT},
6914630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c51), LPC_LPT},
6924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c52), LPC_LPT},
6934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c53), LPC_LPT},
6944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c54), LPC_LPT},
6954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c55), LPC_LPT},
6964630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c56), LPC_LPT},
6974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c57), LPC_LPT},
6984630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c58), LPC_LPT},
6994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c59), LPC_LPT},
7004630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c5a), LPC_LPT},
7014630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c5b), LPC_LPT},
7024630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c5c), LPC_LPT},
7034630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c5d), LPC_LPT},
7044630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c5e), LPC_LPT},
7054630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ PCI_VDEVICE(INTEL, 0x8c5f), LPC_LPT},
7067fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c40), LPC_LPT_LP},
7077fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c41), LPC_LPT_LP},
7087fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c42), LPC_LPT_LP},
7097fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c43), LPC_LPT_LP},
7107fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c44), LPC_LPT_LP},
7117fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c45), LPC_LPT_LP},
7127fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c46), LPC_LPT_LP},
7137fb9c1a4851562e9f9b522ff929c0742797f301aJames Ralston	{ PCI_VDEVICE(INTEL, 0x9c47), LPC_LPT_LP},
7146e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d40), LPC_WBG},
7156e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d41), LPC_WBG},
7166e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d42), LPC_WBG},
7176e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d43), LPC_WBG},
7186e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d44), LPC_WBG},
7196e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d45), LPC_WBG},
7206e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d46), LPC_WBG},
7216e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d47), LPC_WBG},
7226e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d48), LPC_WBG},
7236e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d49), LPC_WBG},
7246e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d4a), LPC_WBG},
7256e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d4b), LPC_WBG},
7266e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d4c), LPC_WBG},
7276e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d4d), LPC_WBG},
7286e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d4e), LPC_WBG},
7296e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d4f), LPC_WBG},
7306e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d50), LPC_WBG},
7316e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d51), LPC_WBG},
7326e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d52), LPC_WBG},
7336e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d53), LPC_WBG},
7346e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d54), LPC_WBG},
7356e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d55), LPC_WBG},
7366e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d56), LPC_WBG},
7376e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d57), LPC_WBG},
7386e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d58), LPC_WBG},
7396e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d59), LPC_WBG},
7406e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d5a), LPC_WBG},
7416e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d5b), LPC_WBG},
7426e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d5c), LPC_WBG},
7436e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d5d), LPC_WBG},
7446e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d5e), LPC_WBG},
7456e6680e3effbf7cff444405a990dbc355dc3a96fJames Ralston	{ PCI_VDEVICE(INTEL, 0x8d5f), LPC_WBG},
7468477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	{ PCI_VDEVICE(INTEL, 0x1f38), LPC_AVN},
7478477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	{ PCI_VDEVICE(INTEL, 0x1f39), LPC_AVN},
7488477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	{ PCI_VDEVICE(INTEL, 0x1f3a), LPC_AVN},
7498477128fe0c3c455e9dfb1ba7ad7e6d09489d33cJames Ralston	{ PCI_VDEVICE(INTEL, 0x1f3b), LPC_AVN},
7506111ec70357022ccd037399c13f69900431850b4Peter Tyser	{ PCI_VDEVICE(INTEL, 0x0f1c), LPC_BAYTRAIL},
751283aae8ab88e695a660c610d6535ca44bc5b8835Seth Heasley	{ PCI_VDEVICE(INTEL, 0x2390), LPC_COLETO},
7525e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc1), LPC_WPT_LP},
7535e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc2), LPC_WPT_LP},
7545e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc3), LPC_WPT_LP},
7555e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc5), LPC_WPT_LP},
7565e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc6), LPC_WPT_LP},
7575e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc7), LPC_WPT_LP},
7585e90169c5a02da69a1ef721bea7a823e9e48fcb6James Ralston	{ PCI_VDEVICE(INTEL, 0x9cc9), LPC_WPT_LP},
759ff0c9da013d2c9f1ec232926a54e536ab48c6678Alan Cox	{ PCI_VDEVICE(INTEL, 0x229c), LPC_BRASWELL},
760fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	{ PCI_VDEVICE(INTEL, 0x8cc1), LPC_9S},
761fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	{ PCI_VDEVICE(INTEL, 0x8cc2), LPC_9S},
762fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	{ PCI_VDEVICE(INTEL, 0x8cc3), LPC_9S},
763fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	{ PCI_VDEVICE(INTEL, 0x8cc4), LPC_9S},
764fea31042ff613145c7784e2ce454bf3c151b97baJames Ralston	{ PCI_VDEVICE(INTEL, 0x8cc6), LPC_9S},
7654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	{ 0, },			/* End of list */
7664630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
7674630b130b30be6420394ba31121e111c8771ca08Aaron SierraMODULE_DEVICE_TABLE(pci, lpc_ich_ids);
7684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
7694630b130b30be6420394ba31121e111c8771ca08Aaron Sierrastatic void lpc_ich_restore_config_space(struct pci_dev *dev)
7704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
77101560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
77201560f6bb958b821ceec98590a7147d610a62625Aaron Sierra
773eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	if (priv->abase_save >= 0) {
774eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_write_config_byte(dev, priv->abase, priv->abase_save);
775eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		priv->abase_save = -1;
776eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	}
777eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser
778eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	if (priv->actrl_pbase_save >= 0) {
779eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_write_config_byte(dev, priv->actrl_pbase,
780eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser			priv->actrl_pbase_save);
781eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		priv->actrl_pbase_save = -1;
7824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
7834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
784429b941abd503c8936e116c819362323aafdbd50Peter Tyser	if (priv->gctrl_save >= 0) {
785429b941abd503c8936e116c819362323aafdbd50Peter Tyser		pci_write_config_byte(dev, priv->gctrl, priv->gctrl_save);
786429b941abd503c8936e116c819362323aafdbd50Peter Tyser		priv->gctrl_save = -1;
7874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
7884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
7894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
790f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic void lpc_ich_enable_acpi_space(struct pci_dev *dev)
7914630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
79201560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
7934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	u8 reg_save;
7944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
795eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	switch (lpc_chipset_info[priv->chipset].iTCO_version) {
796eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	case 3:
797eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		/*
798eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		 * Some chipsets (eg Avoton) enable the ACPI space in the
799eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		 * ACPI BASE register.
800eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		 */
801eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_read_config_byte(dev, priv->abase, &reg_save);
802eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_write_config_byte(dev, priv->abase, reg_save | 0x2);
803eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		priv->abase_save = reg_save;
804eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		break;
805eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	default:
806eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		/*
807eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		 * Most chipsets enable the ACPI space in the ACPI control
808eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		 * register.
809eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		 */
810eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_read_config_byte(dev, priv->actrl_pbase, &reg_save);
811eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_write_config_byte(dev, priv->actrl_pbase, reg_save | 0x80);
812eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		priv->actrl_pbase_save = reg_save;
813eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		break;
814eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	}
8154630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
8164630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
817f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic void lpc_ich_enable_gpio_space(struct pci_dev *dev)
8184630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
81901560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
8204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	u8 reg_save;
8214630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
822429b941abd503c8936e116c819362323aafdbd50Peter Tyser	pci_read_config_byte(dev, priv->gctrl, &reg_save);
823429b941abd503c8936e116c819362323aafdbd50Peter Tyser	pci_write_config_byte(dev, priv->gctrl, reg_save | 0x10);
824429b941abd503c8936e116c819362323aafdbd50Peter Tyser	priv->gctrl_save = reg_save;
8254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
8264630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
827eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyserstatic void lpc_ich_enable_pmc_space(struct pci_dev *dev)
828eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser{
829eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
830eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	u8 reg_save;
831eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser
832eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	pci_read_config_byte(dev, priv->actrl_pbase, &reg_save);
833eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	pci_write_config_byte(dev, priv->actrl_pbase, reg_save | 0x2);
834eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser
835eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	priv->actrl_pbase_save = reg_save;
836eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser}
837eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser
83801560f6bb958b821ceec98590a7147d610a62625Aaron Sierrastatic void lpc_ich_finalize_cell(struct pci_dev *dev, struct mfd_cell *cell)
8394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
84001560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
84101560f6bb958b821ceec98590a7147d610a62625Aaron Sierra
84201560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	cell->platform_data = &lpc_chipset_info[priv->chipset];
8434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	cell->pdata_size = sizeof(struct lpc_ich_info);
8444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
8454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
8464f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare/*
8474f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare * We don't check for resource conflict globally. There are 2 or 3 independent
8484f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare * GPIO groups and it's enough to have access to one of these to instantiate
8494f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare * the device.
8504f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare */
851f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic int lpc_ich_check_conflict_gpio(struct resource *res)
8524f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare{
8534f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	int ret;
8544f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	u8 use_gpio = 0;
8554f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare
8564f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	if (resource_size(res) >= 0x50 &&
8574f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	    !acpi_check_region(res->start + 0x40, 0x10, "LPC ICH GPIO3"))
8584f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare		use_gpio |= 1 << 2;
8594f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare
8604f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	if (!acpi_check_region(res->start + 0x30, 0x10, "LPC ICH GPIO2"))
8614f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare		use_gpio |= 1 << 1;
8624f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare
8634f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	ret = acpi_check_region(res->start + 0x00, 0x30, "LPC ICH GPIO1");
8644f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	if (!ret)
8654f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare		use_gpio |= 1 << 0;
8664f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare
8674f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	return use_gpio ? use_gpio : ret;
8684f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare}
8694f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare
87001560f6bb958b821ceec98590a7147d610a62625Aaron Sierrastatic int lpc_ich_init_gpio(struct pci_dev *dev)
8714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
87201560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
8734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	u32 base_addr_cfg;
8744630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	u32 base_addr;
8754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	int ret;
8764630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	bool acpi_conflict = false;
8774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	struct resource *res;
8784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
8794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	/* Setup power management base register */
880429b941abd503c8936e116c819362323aafdbd50Peter Tyser	pci_read_config_dword(dev, priv->abase, &base_addr_cfg);
8814630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	base_addr = base_addr_cfg & 0x0000ff80;
8824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	if (!base_addr) {
8830c418844dce21fa7000b51190f393c7d6a7ee12dPaul Bolle		dev_notice(&dev->dev, "I/O space for ACPI uninitialized\n");
8844630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		lpc_ich_cells[LPC_GPIO].num_resources--;
8854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		goto gpe0_done;
8864630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
8874630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
8884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	res = &gpio_ich_res[ICH_RES_GPE0];
8894630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	res->start = base_addr + ACPIBASE_GPE_OFF;
8904630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	res->end = base_addr + ACPIBASE_GPE_END;
8914630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	ret = acpi_check_resource_conflict(res);
8924630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	if (ret) {
8934630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		/*
8944630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		 * This isn't fatal for the GPIO, but we have to make sure that
8954630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		 * the platform_device subsystem doesn't see this resource
8964630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		 * or it will register an invalid region.
8974630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		 */
8984630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		lpc_ich_cells[LPC_GPIO].num_resources--;
8994630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		acpi_conflict = true;
9004630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	} else {
9014630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		lpc_ich_enable_acpi_space(dev);
9024630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
9034630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
9044630b130b30be6420394ba31121e111c8771ca08Aaron Sierragpe0_done:
9054630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	/* Setup GPIO base register */
906429b941abd503c8936e116c819362323aafdbd50Peter Tyser	pci_read_config_dword(dev, priv->gbase, &base_addr_cfg);
9074630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	base_addr = base_addr_cfg & 0x0000ff80;
9084630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	if (!base_addr) {
9090c418844dce21fa7000b51190f393c7d6a7ee12dPaul Bolle		dev_notice(&dev->dev, "I/O space for GPIO uninitialized\n");
9104630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		ret = -ENODEV;
9114630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		goto gpio_done;
9124630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
9134630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
9144630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	/* Older devices provide fewer GPIO and have a smaller resource size. */
9154630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	res = &gpio_ich_res[ICH_RES_GPIO];
9164630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	res->start = base_addr;
91701560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	switch (lpc_chipset_info[priv->chipset].gpio_version) {
9184630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	case ICH_V5_GPIO:
9194630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	case ICH_V10CORP_GPIO:
9204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		res->end = res->start + 128 - 1;
9214630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		break;
9224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	default:
9234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		res->end = res->start + 64 - 1;
9244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		break;
9254630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
9264630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
9274f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	ret = lpc_ich_check_conflict_gpio(res);
9284f600ada70beeb1dfe08e11e871bf31015aa0a3dJean Delvare	if (ret < 0) {
9294630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		/* this isn't necessarily fatal for the GPIO */
9304630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		acpi_conflict = true;
9314630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		goto gpio_done;
9324630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
93301560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	lpc_chipset_info[priv->chipset].use_gpio = ret;
9344630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	lpc_ich_enable_gpio_space(dev);
9354630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
93601560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	lpc_ich_finalize_cell(dev, &lpc_ich_cells[LPC_GPIO]);
9374630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_GPIO],
93855692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown			      1, NULL, 0, NULL);
9394630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
9404630b130b30be6420394ba31121e111c8771ca08Aaron Sierragpio_done:
9414630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	if (acpi_conflict)
9424630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		pr_warn("Resource conflict(s) found affecting %s\n",
9434630b130b30be6420394ba31121e111c8771ca08Aaron Sierra				lpc_ich_cells[LPC_GPIO].name);
9444630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	return ret;
9454630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
9464630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
94701560f6bb958b821ceec98590a7147d610a62625Aaron Sierrastatic int lpc_ich_init_wdt(struct pci_dev *dev)
948887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra{
94901560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv = pci_get_drvdata(dev);
950887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	u32 base_addr_cfg;
951887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	u32 base_addr;
952887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	int ret;
953887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	struct resource *res;
954887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
955887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	/* Setup power management base register */
956429b941abd503c8936e116c819362323aafdbd50Peter Tyser	pci_read_config_dword(dev, priv->abase, &base_addr_cfg);
957887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	base_addr = base_addr_cfg & 0x0000ff80;
958887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	if (!base_addr) {
9590c418844dce21fa7000b51190f393c7d6a7ee12dPaul Bolle		dev_notice(&dev->dev, "I/O space for ACPI uninitialized\n");
960887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		ret = -ENODEV;
961887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		goto wdt_done;
962887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	}
963887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
964887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	res = wdt_io_res(ICH_RES_IO_TCO);
965887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	res->start = base_addr + ACPIBASE_TCO_OFF;
966887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	res->end = base_addr + ACPIBASE_TCO_END;
967887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
968887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	res = wdt_io_res(ICH_RES_IO_SMI);
969887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	res->start = base_addr + ACPIBASE_SMI_OFF;
970887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	res->end = base_addr + ACPIBASE_SMI_END;
971092369efbd6ef6b4a215741ce9f65446bf45beffFeng Tang
972887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	lpc_ich_enable_acpi_space(dev);
973887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
974887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	/*
975eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	 * iTCO v2:
976887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	 * Get the Memory-Mapped GCS register. To get access to it
977887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	 * we have to read RCBA from PCI Config space 0xf0 and use
978887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	 * it as base. GCS = RCBA + ICH6_GCS(0x3410).
979eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	 *
980eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	 * iTCO v3:
981eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	 * Get the Power Management Configuration register.  To get access
982eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	 * to it we have to read the PMC BASE from config space and address
983eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	 * the register at offset 0x8.
984887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	 */
98501560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	if (lpc_chipset_info[priv->chipset].iTCO_version == 1) {
986e294bc91760e11d2f1ebbac1d0a979069edf7adbPeter Hurley		/* Don't register iomem for TCO ver 1 */
987e294bc91760e11d2f1ebbac1d0a979069edf7adbPeter Hurley		lpc_ich_cells[LPC_WDT].num_resources--;
988eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	} else if (lpc_chipset_info[priv->chipset].iTCO_version == 2) {
989887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		pci_read_config_dword(dev, RCBABASE, &base_addr_cfg);
990887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		base_addr = base_addr_cfg & 0xffffc000;
991887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		if (!(base_addr_cfg & 1)) {
9920c418844dce21fa7000b51190f393c7d6a7ee12dPaul Bolle			dev_notice(&dev->dev, "RCBA is disabled by "
9930c418844dce21fa7000b51190f393c7d6a7ee12dPaul Bolle					"hardware/BIOS, device disabled\n");
994887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra			ret = -ENODEV;
995887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra			goto wdt_done;
996887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		}
997eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		res = wdt_mem_res(ICH_RES_MEM_GCS_PMC);
998887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		res->start = base_addr + ACPIBASE_GCS_OFF;
999887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra		res->end = base_addr + ACPIBASE_GCS_END;
1000eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	} else if (lpc_chipset_info[priv->chipset].iTCO_version == 3) {
1001eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		lpc_ich_enable_pmc_space(dev);
1002eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		pci_read_config_dword(dev, ACPICTRL_PMCBASE, &base_addr_cfg);
1003eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		base_addr = base_addr_cfg & 0xfffffe00;
1004eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser
1005eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		res = wdt_mem_res(ICH_RES_MEM_GCS_PMC);
1006eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		res->start = base_addr + ACPIBASE_PMC_OFF;
1007eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser		res->end = base_addr + ACPIBASE_PMC_END;
1008887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	}
1009887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
101001560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	lpc_ich_finalize_cell(dev, &lpc_ich_cells[LPC_WDT]);
1011887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	ret = mfd_add_devices(&dev->dev, -1, &lpc_ich_cells[LPC_WDT],
101255692af5eb587f7592d6c2713e1e0eeaab0f6c31Mark Brown			      1, NULL, 0, NULL);
1013887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
1014887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierrawdt_done:
1015887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra	return ret;
1016887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra}
1017887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
1018f791be492f76dea7b0641ed227a60eeb2fa7e255Bill Pembertonstatic int lpc_ich_probe(struct pci_dev *dev,
10194630b130b30be6420394ba31121e111c8771ca08Aaron Sierra				const struct pci_device_id *id)
10204630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
102101560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	struct lpc_ich_priv *priv;
10224630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	int ret;
10234630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	bool cell_added = false;
10244630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
1025ff7109fa632654eaef657186f2942f5b679023d6Aaron Sierra	priv = devm_kzalloc(&dev->dev,
1026ff7109fa632654eaef657186f2942f5b679023d6Aaron Sierra			    sizeof(struct lpc_ich_priv), GFP_KERNEL);
102701560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	if (!priv)
102801560f6bb958b821ceec98590a7147d610a62625Aaron Sierra		return -ENOMEM;
102901560f6bb958b821ceec98590a7147d610a62625Aaron Sierra
103001560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	priv->chipset = id->driver_data;
103101560f6bb958b821ceec98590a7147d610a62625Aaron Sierra
1032eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	priv->actrl_pbase_save = -1;
1033eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	priv->abase_save = -1;
1034eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser
1035429b941abd503c8936e116c819362323aafdbd50Peter Tyser	priv->abase = ACPIBASE;
1036eb71d4dec4a5e010e34b9d7afdb5af41884c388ePeter Tyser	priv->actrl_pbase = ACPICTRL_PMCBASE;
1037429b941abd503c8936e116c819362323aafdbd50Peter Tyser
1038429b941abd503c8936e116c819362323aafdbd50Peter Tyser	priv->gctrl_save = -1;
103901560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	if (priv->chipset <= LPC_ICH5) {
1040429b941abd503c8936e116c819362323aafdbd50Peter Tyser		priv->gbase = GPIOBASE_ICH0;
1041429b941abd503c8936e116c819362323aafdbd50Peter Tyser		priv->gctrl = GPIOCTRL_ICH0;
104201560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	} else {
1043429b941abd503c8936e116c819362323aafdbd50Peter Tyser		priv->gbase = GPIOBASE_ICH6;
1044429b941abd503c8936e116c819362323aafdbd50Peter Tyser		priv->gctrl = GPIOCTRL_ICH6;
104501560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	}
104601560f6bb958b821ceec98590a7147d610a62625Aaron Sierra
104701560f6bb958b821ceec98590a7147d610a62625Aaron Sierra	pci_set_drvdata(dev, priv);
104801560f6bb958b821ceec98590a7147d610a62625Aaron Sierra
1049f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser	if (lpc_chipset_info[priv->chipset].iTCO_version) {
1050f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser		ret = lpc_ich_init_wdt(dev);
1051f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser		if (!ret)
1052f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser			cell_added = true;
1053f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser	}
1054887c8ec7219fc8eba78bb8f44a74c660934e9b98Aaron Sierra
1055f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser	if (lpc_chipset_info[priv->chipset].gpio_version) {
1056f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser		ret = lpc_ich_init_gpio(dev);
1057f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser		if (!ret)
1058f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser			cell_added = true;
1059f0776b8ce03ceb638c51b62f324844c71c446600Peter Tyser	}
10604630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
10614630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	/*
10624630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	 * We only care if at least one or none of the cells registered
10634630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	 * successfully.
10644630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	 */
10654630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	if (!cell_added) {
10660c418844dce21fa7000b51190f393c7d6a7ee12dPaul Bolle		dev_warn(&dev->dev, "No MFD cells added\n");
10674630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		lpc_ich_restore_config_space(dev);
10684630b130b30be6420394ba31121e111c8771ca08Aaron Sierra		return -ENODEV;
10694630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	}
10704630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
10714630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	return 0;
10724630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
10734630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
10744740f73fe5388ab5d22d552d2a0dacc62418a70cBill Pembertonstatic void lpc_ich_remove(struct pci_dev *dev)
10754630b130b30be6420394ba31121e111c8771ca08Aaron Sierra{
10764630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	mfd_remove_devices(&dev->dev);
10774630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	lpc_ich_restore_config_space(dev);
10784630b130b30be6420394ba31121e111c8771ca08Aaron Sierra}
10794630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
10804630b130b30be6420394ba31121e111c8771ca08Aaron Sierrastatic struct pci_driver lpc_ich_driver = {
10814630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	.name		= "lpc_ich",
10824630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	.id_table	= lpc_ich_ids,
10834630b130b30be6420394ba31121e111c8771ca08Aaron Sierra	.probe		= lpc_ich_probe,
108484449216b01f9c2b4c9b1882f9d6abba07b7b7caBill Pemberton	.remove		= lpc_ich_remove,
10854630b130b30be6420394ba31121e111c8771ca08Aaron Sierra};
10864630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
1087b4d0fe9c906deb00ad0b1690817f96aff21aee29Libo Chenmodule_pci_driver(lpc_ich_driver);
10884630b130b30be6420394ba31121e111c8771ca08Aaron Sierra
10894630b130b30be6420394ba31121e111c8771ca08Aaron SierraMODULE_AUTHOR("Aaron Sierra <asierra@xes-inc.com>");
10904630b130b30be6420394ba31121e111c8771ca08Aaron SierraMODULE_DESCRIPTION("LPC interface for Intel ICH");
10914630b130b30be6420394ba31121e111c8771ca08Aaron SierraMODULE_LICENSE("GPL");
1092