xref: /OK3568_Linux_fs/kernel/drivers/i2c/busses/i2c-i801.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun     Copyright (c) 1998 - 2002  Frodo Looijaard <frodol@dds.nl>,
4*4882a593Smuzhiyun     Philip Edelbrock <phil@netroedge.com>, and Mark D. Studebaker
5*4882a593Smuzhiyun     <mdsxyz123@yahoo.com>
6*4882a593Smuzhiyun     Copyright (C) 2007 - 2014  Jean Delvare <jdelvare@suse.de>
7*4882a593Smuzhiyun     Copyright (C) 2010         Intel Corporation,
8*4882a593Smuzhiyun                                David Woodhouse <dwmw2@infradead.org>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun  * Supports the following Intel I/O Controller Hubs (ICH):
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  *					I/O			Block	I2C
16*4882a593Smuzhiyun  *					region	SMBus	Block	proc.	block
17*4882a593Smuzhiyun  * Chip name			PCI ID	size	PEC	buffer	call	read
18*4882a593Smuzhiyun  * ---------------------------------------------------------------------------
19*4882a593Smuzhiyun  * 82801AA (ICH)		0x2413	16	no	no	no	no
20*4882a593Smuzhiyun  * 82801AB (ICH0)		0x2423	16	no	no	no	no
21*4882a593Smuzhiyun  * 82801BA (ICH2)		0x2443	16	no	no	no	no
22*4882a593Smuzhiyun  * 82801CA (ICH3)		0x2483	32	soft	no	no	no
23*4882a593Smuzhiyun  * 82801DB (ICH4)		0x24c3	32	hard	yes	no	no
24*4882a593Smuzhiyun  * 82801E (ICH5)		0x24d3	32	hard	yes	yes	yes
25*4882a593Smuzhiyun  * 6300ESB			0x25a4	32	hard	yes	yes	yes
26*4882a593Smuzhiyun  * 82801F (ICH6)		0x266a	32	hard	yes	yes	yes
27*4882a593Smuzhiyun  * 6310ESB/6320ESB		0x269b	32	hard	yes	yes	yes
28*4882a593Smuzhiyun  * 82801G (ICH7)		0x27da	32	hard	yes	yes	yes
29*4882a593Smuzhiyun  * 82801H (ICH8)		0x283e	32	hard	yes	yes	yes
30*4882a593Smuzhiyun  * 82801I (ICH9)		0x2930	32	hard	yes	yes	yes
31*4882a593Smuzhiyun  * EP80579 (Tolapai)		0x5032	32	hard	yes	yes	yes
32*4882a593Smuzhiyun  * ICH10			0x3a30	32	hard	yes	yes	yes
33*4882a593Smuzhiyun  * ICH10			0x3a60	32	hard	yes	yes	yes
34*4882a593Smuzhiyun  * 5/3400 Series (PCH)		0x3b30	32	hard	yes	yes	yes
35*4882a593Smuzhiyun  * 6 Series (PCH)		0x1c22	32	hard	yes	yes	yes
36*4882a593Smuzhiyun  * Patsburg (PCH)		0x1d22	32	hard	yes	yes	yes
37*4882a593Smuzhiyun  * Patsburg (PCH) IDF		0x1d70	32	hard	yes	yes	yes
38*4882a593Smuzhiyun  * Patsburg (PCH) IDF		0x1d71	32	hard	yes	yes	yes
39*4882a593Smuzhiyun  * Patsburg (PCH) IDF		0x1d72	32	hard	yes	yes	yes
40*4882a593Smuzhiyun  * DH89xxCC (PCH)		0x2330	32	hard	yes	yes	yes
41*4882a593Smuzhiyun  * Panther Point (PCH)		0x1e22	32	hard	yes	yes	yes
42*4882a593Smuzhiyun  * Lynx Point (PCH)		0x8c22	32	hard	yes	yes	yes
43*4882a593Smuzhiyun  * Lynx Point-LP (PCH)		0x9c22	32	hard	yes	yes	yes
44*4882a593Smuzhiyun  * Avoton (SOC)			0x1f3c	32	hard	yes	yes	yes
45*4882a593Smuzhiyun  * Wellsburg (PCH)		0x8d22	32	hard	yes	yes	yes
46*4882a593Smuzhiyun  * Wellsburg (PCH) MS		0x8d7d	32	hard	yes	yes	yes
47*4882a593Smuzhiyun  * Wellsburg (PCH) MS		0x8d7e	32	hard	yes	yes	yes
48*4882a593Smuzhiyun  * Wellsburg (PCH) MS		0x8d7f	32	hard	yes	yes	yes
49*4882a593Smuzhiyun  * Coleto Creek (PCH)		0x23b0	32	hard	yes	yes	yes
50*4882a593Smuzhiyun  * Wildcat Point (PCH)		0x8ca2	32	hard	yes	yes	yes
51*4882a593Smuzhiyun  * Wildcat Point-LP (PCH)	0x9ca2	32	hard	yes	yes	yes
52*4882a593Smuzhiyun  * BayTrail (SOC)		0x0f12	32	hard	yes	yes	yes
53*4882a593Smuzhiyun  * Braswell (SOC)		0x2292	32	hard	yes	yes	yes
54*4882a593Smuzhiyun  * Sunrise Point-H (PCH) 	0xa123  32	hard	yes	yes	yes
55*4882a593Smuzhiyun  * Sunrise Point-LP (PCH)	0x9d23	32	hard	yes	yes	yes
56*4882a593Smuzhiyun  * DNV (SOC)			0x19df	32	hard	yes	yes	yes
57*4882a593Smuzhiyun  * Emmitsburg (PCH)		0x1bc9	32	hard	yes	yes	yes
58*4882a593Smuzhiyun  * Broxton (SOC)		0x5ad4	32	hard	yes	yes	yes
59*4882a593Smuzhiyun  * Lewisburg (PCH)		0xa1a3	32	hard	yes	yes	yes
60*4882a593Smuzhiyun  * Lewisburg Supersku (PCH)	0xa223	32	hard	yes	yes	yes
61*4882a593Smuzhiyun  * Kaby Lake PCH-H (PCH)	0xa2a3	32	hard	yes	yes	yes
62*4882a593Smuzhiyun  * Gemini Lake (SOC)		0x31d4	32	hard	yes	yes	yes
63*4882a593Smuzhiyun  * Cannon Lake-H (PCH)		0xa323	32	hard	yes	yes	yes
64*4882a593Smuzhiyun  * Cannon Lake-LP (PCH)		0x9da3	32	hard	yes	yes	yes
65*4882a593Smuzhiyun  * Cedar Fork (PCH)		0x18df	32	hard	yes	yes	yes
66*4882a593Smuzhiyun  * Ice Lake-LP (PCH)		0x34a3	32	hard	yes	yes	yes
67*4882a593Smuzhiyun  * Comet Lake (PCH)		0x02a3	32	hard	yes	yes	yes
68*4882a593Smuzhiyun  * Comet Lake-H (PCH)		0x06a3	32	hard	yes	yes	yes
69*4882a593Smuzhiyun  * Elkhart Lake (PCH)		0x4b23	32	hard	yes	yes	yes
70*4882a593Smuzhiyun  * Tiger Lake-LP (PCH)		0xa0a3	32	hard	yes	yes	yes
71*4882a593Smuzhiyun  * Tiger Lake-H (PCH)		0x43a3	32	hard	yes	yes	yes
72*4882a593Smuzhiyun  * Jasper Lake (SOC)		0x4da3	32	hard	yes	yes	yes
73*4882a593Smuzhiyun  * Comet Lake-V (PCH)		0xa3a3	32	hard	yes	yes	yes
74*4882a593Smuzhiyun  * Alder Lake-S (PCH)		0x7aa3	32	hard	yes	yes	yes
75*4882a593Smuzhiyun  *
76*4882a593Smuzhiyun  * Features supported by this driver:
77*4882a593Smuzhiyun  * Software PEC				no
78*4882a593Smuzhiyun  * Hardware PEC				yes
79*4882a593Smuzhiyun  * Block buffer				yes
80*4882a593Smuzhiyun  * Block process call transaction	yes
81*4882a593Smuzhiyun  * I2C block read transaction		yes (doesn't use the block buffer)
82*4882a593Smuzhiyun  * Slave mode				no
83*4882a593Smuzhiyun  * SMBus Host Notify			yes
84*4882a593Smuzhiyun  * Interrupt processing			yes
85*4882a593Smuzhiyun  *
86*4882a593Smuzhiyun  * See the file Documentation/i2c/busses/i2c-i801.rst for details.
87*4882a593Smuzhiyun  */
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun #include <linux/interrupt.h>
90*4882a593Smuzhiyun #include <linux/module.h>
91*4882a593Smuzhiyun #include <linux/pci.h>
92*4882a593Smuzhiyun #include <linux/kernel.h>
93*4882a593Smuzhiyun #include <linux/stddef.h>
94*4882a593Smuzhiyun #include <linux/delay.h>
95*4882a593Smuzhiyun #include <linux/ioport.h>
96*4882a593Smuzhiyun #include <linux/init.h>
97*4882a593Smuzhiyun #include <linux/i2c.h>
98*4882a593Smuzhiyun #include <linux/i2c-smbus.h>
99*4882a593Smuzhiyun #include <linux/acpi.h>
100*4882a593Smuzhiyun #include <linux/io.h>
101*4882a593Smuzhiyun #include <linux/dmi.h>
102*4882a593Smuzhiyun #include <linux/slab.h>
103*4882a593Smuzhiyun #include <linux/string.h>
104*4882a593Smuzhiyun #include <linux/wait.h>
105*4882a593Smuzhiyun #include <linux/err.h>
106*4882a593Smuzhiyun #include <linux/platform_device.h>
107*4882a593Smuzhiyun #include <linux/platform_data/itco_wdt.h>
108*4882a593Smuzhiyun #include <linux/pm_runtime.h>
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI
111*4882a593Smuzhiyun #include <linux/gpio/machine.h>
112*4882a593Smuzhiyun #include <linux/platform_data/i2c-mux-gpio.h>
113*4882a593Smuzhiyun #endif
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun /* I801 SMBus address offsets */
116*4882a593Smuzhiyun #define SMBHSTSTS(p)	(0 + (p)->smba)
117*4882a593Smuzhiyun #define SMBHSTCNT(p)	(2 + (p)->smba)
118*4882a593Smuzhiyun #define SMBHSTCMD(p)	(3 + (p)->smba)
119*4882a593Smuzhiyun #define SMBHSTADD(p)	(4 + (p)->smba)
120*4882a593Smuzhiyun #define SMBHSTDAT0(p)	(5 + (p)->smba)
121*4882a593Smuzhiyun #define SMBHSTDAT1(p)	(6 + (p)->smba)
122*4882a593Smuzhiyun #define SMBBLKDAT(p)	(7 + (p)->smba)
123*4882a593Smuzhiyun #define SMBPEC(p)	(8 + (p)->smba)		/* ICH3 and later */
124*4882a593Smuzhiyun #define SMBAUXSTS(p)	(12 + (p)->smba)	/* ICH4 and later */
125*4882a593Smuzhiyun #define SMBAUXCTL(p)	(13 + (p)->smba)	/* ICH4 and later */
126*4882a593Smuzhiyun #define SMBSLVSTS(p)	(16 + (p)->smba)	/* ICH3 and later */
127*4882a593Smuzhiyun #define SMBSLVCMD(p)	(17 + (p)->smba)	/* ICH3 and later */
128*4882a593Smuzhiyun #define SMBNTFDADD(p)	(20 + (p)->smba)	/* ICH3 and later */
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* PCI Address Constants */
131*4882a593Smuzhiyun #define SMBBAR		4
132*4882a593Smuzhiyun #define SMBPCICTL	0x004
133*4882a593Smuzhiyun #define SMBPCISTS	0x006
134*4882a593Smuzhiyun #define SMBHSTCFG	0x040
135*4882a593Smuzhiyun #define TCOBASE		0x050
136*4882a593Smuzhiyun #define TCOCTL		0x054
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun #define SBREG_BAR		0x10
139*4882a593Smuzhiyun #define SBREG_SMBCTRL		0xc6000c
140*4882a593Smuzhiyun #define SBREG_SMBCTRL_DNV	0xcf000c
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /* Host status bits for SMBPCISTS */
143*4882a593Smuzhiyun #define SMBPCISTS_INTS		BIT(3)
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun /* Control bits for SMBPCICTL */
146*4882a593Smuzhiyun #define SMBPCICTL_INTDIS	BIT(10)
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun /* Host configuration bits for SMBHSTCFG */
149*4882a593Smuzhiyun #define SMBHSTCFG_HST_EN	BIT(0)
150*4882a593Smuzhiyun #define SMBHSTCFG_SMB_SMI_EN	BIT(1)
151*4882a593Smuzhiyun #define SMBHSTCFG_I2C_EN	BIT(2)
152*4882a593Smuzhiyun #define SMBHSTCFG_SPD_WD	BIT(4)
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun /* TCO configuration bits for TCOCTL */
155*4882a593Smuzhiyun #define TCOCTL_EN		BIT(8)
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /* Auxiliary status register bits, ICH4+ only */
158*4882a593Smuzhiyun #define SMBAUXSTS_CRCE		BIT(0)
159*4882a593Smuzhiyun #define SMBAUXSTS_STCO		BIT(1)
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun /* Auxiliary control register bits, ICH4+ only */
162*4882a593Smuzhiyun #define SMBAUXCTL_CRC		BIT(0)
163*4882a593Smuzhiyun #define SMBAUXCTL_E32B		BIT(1)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun /* Other settings */
166*4882a593Smuzhiyun #define MAX_RETRIES		400
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /* I801 command constants */
169*4882a593Smuzhiyun #define I801_QUICK		0x00
170*4882a593Smuzhiyun #define I801_BYTE		0x04
171*4882a593Smuzhiyun #define I801_BYTE_DATA		0x08
172*4882a593Smuzhiyun #define I801_WORD_DATA		0x0C
173*4882a593Smuzhiyun #define I801_PROC_CALL		0x10	/* unimplemented */
174*4882a593Smuzhiyun #define I801_BLOCK_DATA		0x14
175*4882a593Smuzhiyun #define I801_I2C_BLOCK_DATA	0x18	/* ICH5 and later */
176*4882a593Smuzhiyun #define I801_BLOCK_PROC_CALL	0x1C
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /* I801 Host Control register bits */
179*4882a593Smuzhiyun #define SMBHSTCNT_INTREN	BIT(0)
180*4882a593Smuzhiyun #define SMBHSTCNT_KILL		BIT(1)
181*4882a593Smuzhiyun #define SMBHSTCNT_LAST_BYTE	BIT(5)
182*4882a593Smuzhiyun #define SMBHSTCNT_START		BIT(6)
183*4882a593Smuzhiyun #define SMBHSTCNT_PEC_EN	BIT(7)	/* ICH3 and later */
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /* I801 Hosts Status register bits */
186*4882a593Smuzhiyun #define SMBHSTSTS_BYTE_DONE	BIT(7)
187*4882a593Smuzhiyun #define SMBHSTSTS_INUSE_STS	BIT(6)
188*4882a593Smuzhiyun #define SMBHSTSTS_SMBALERT_STS	BIT(5)
189*4882a593Smuzhiyun #define SMBHSTSTS_FAILED	BIT(4)
190*4882a593Smuzhiyun #define SMBHSTSTS_BUS_ERR	BIT(3)
191*4882a593Smuzhiyun #define SMBHSTSTS_DEV_ERR	BIT(2)
192*4882a593Smuzhiyun #define SMBHSTSTS_INTR		BIT(1)
193*4882a593Smuzhiyun #define SMBHSTSTS_HOST_BUSY	BIT(0)
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun /* Host Notify Status register bits */
196*4882a593Smuzhiyun #define SMBSLVSTS_HST_NTFY_STS	BIT(0)
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun /* Host Notify Command register bits */
199*4882a593Smuzhiyun #define SMBSLVCMD_HST_NTFY_INTREN	BIT(0)
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #define STATUS_ERROR_FLAGS	(SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \
202*4882a593Smuzhiyun 				 SMBHSTSTS_DEV_ERR)
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun #define STATUS_FLAGS		(SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR | \
205*4882a593Smuzhiyun 				 STATUS_ERROR_FLAGS)
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /* Older devices have their ID defined in <linux/pci_ids.h> */
208*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS		0x02a3
209*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS		0x06a3
210*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS		0x0f12
211*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_CDF_SMBUS			0x18df
212*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_DNV_SMBUS			0x19df
213*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_EBG_SMBUS			0x1bc9
214*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS		0x1c22
215*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS		0x1d22
216*4882a593Smuzhiyun /* Patsburg also has three 'Integrated Device Function' SMBus controllers */
217*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0		0x1d70
218*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1		0x1d71
219*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2		0x1d72
220*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS		0x1e22
221*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_AVOTON_SMBUS		0x1f3c
222*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS		0x2292
223*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS		0x2330
224*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS		0x23b0
225*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_GEMINILAKE_SMBUS		0x31d4
226*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS		0x34a3
227*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS		0x3b30
228*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS		0x43a3
229*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS		0x4b23
230*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS		0x4da3
231*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_BROXTON_SMBUS		0x5ad4
232*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS		0x7aa3
233*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS		0x8c22
234*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS		0x8ca2
235*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS		0x8d22
236*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0		0x8d7d
237*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1		0x8d7e
238*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2		0x8d7f
239*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS		0x9c22
240*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS	0x9ca2
241*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS	0x9d23
242*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS		0x9da3
243*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS		0xa0a3
244*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS	0xa123
245*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS		0xa1a3
246*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS	0xa223
247*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS	0xa2a3
248*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS		0xa323
249*4882a593Smuzhiyun #define PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS		0xa3a3
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun struct i801_mux_config {
252*4882a593Smuzhiyun 	char *gpio_chip;
253*4882a593Smuzhiyun 	unsigned values[3];
254*4882a593Smuzhiyun 	int n_values;
255*4882a593Smuzhiyun 	unsigned classes[3];
256*4882a593Smuzhiyun 	unsigned gpios[2];		/* Relative to gpio_chip->base */
257*4882a593Smuzhiyun 	int n_gpios;
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun struct i801_priv {
261*4882a593Smuzhiyun 	struct i2c_adapter adapter;
262*4882a593Smuzhiyun 	unsigned long smba;
263*4882a593Smuzhiyun 	unsigned char original_hstcfg;
264*4882a593Smuzhiyun 	unsigned char original_slvcmd;
265*4882a593Smuzhiyun 	struct pci_dev *pci_dev;
266*4882a593Smuzhiyun 	unsigned int features;
267*4882a593Smuzhiyun 
268*4882a593Smuzhiyun 	/* isr processing */
269*4882a593Smuzhiyun 	wait_queue_head_t waitq;
270*4882a593Smuzhiyun 	u8 status;
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	/* Command state used by isr for byte-by-byte block transactions */
273*4882a593Smuzhiyun 	u8 cmd;
274*4882a593Smuzhiyun 	bool is_read;
275*4882a593Smuzhiyun 	int count;
276*4882a593Smuzhiyun 	int len;
277*4882a593Smuzhiyun 	u8 *data;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI
280*4882a593Smuzhiyun 	const struct i801_mux_config *mux_drvdata;
281*4882a593Smuzhiyun 	struct platform_device *mux_pdev;
282*4882a593Smuzhiyun 	struct gpiod_lookup_table *lookup;
283*4882a593Smuzhiyun #endif
284*4882a593Smuzhiyun 	struct platform_device *tco_pdev;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun 	/*
287*4882a593Smuzhiyun 	 * If set to true the host controller registers are reserved for
288*4882a593Smuzhiyun 	 * ACPI AML use. Protected by acpi_lock.
289*4882a593Smuzhiyun 	 */
290*4882a593Smuzhiyun 	bool acpi_reserved;
291*4882a593Smuzhiyun 	struct mutex acpi_lock;
292*4882a593Smuzhiyun };
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun #define FEATURE_SMBUS_PEC	BIT(0)
295*4882a593Smuzhiyun #define FEATURE_BLOCK_BUFFER	BIT(1)
296*4882a593Smuzhiyun #define FEATURE_BLOCK_PROC	BIT(2)
297*4882a593Smuzhiyun #define FEATURE_I2C_BLOCK_READ	BIT(3)
298*4882a593Smuzhiyun #define FEATURE_IRQ		BIT(4)
299*4882a593Smuzhiyun #define FEATURE_HOST_NOTIFY	BIT(5)
300*4882a593Smuzhiyun /* Not really a feature, but it's convenient to handle it as such */
301*4882a593Smuzhiyun #define FEATURE_IDF		BIT(15)
302*4882a593Smuzhiyun #define FEATURE_TCO_SPT		BIT(16)
303*4882a593Smuzhiyun #define FEATURE_TCO_CNL		BIT(17)
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun static const char *i801_feature_names[] = {
306*4882a593Smuzhiyun 	"SMBus PEC",
307*4882a593Smuzhiyun 	"Block buffer",
308*4882a593Smuzhiyun 	"Block process call",
309*4882a593Smuzhiyun 	"I2C block read",
310*4882a593Smuzhiyun 	"Interrupt",
311*4882a593Smuzhiyun 	"SMBus Host Notify",
312*4882a593Smuzhiyun };
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun static unsigned int disable_features;
315*4882a593Smuzhiyun module_param(disable_features, uint, S_IRUGO | S_IWUSR);
316*4882a593Smuzhiyun MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n"
317*4882a593Smuzhiyun 	"\t\t  0x01  disable SMBus PEC\n"
318*4882a593Smuzhiyun 	"\t\t  0x02  disable the block buffer\n"
319*4882a593Smuzhiyun 	"\t\t  0x08  disable the I2C block read functionality\n"
320*4882a593Smuzhiyun 	"\t\t  0x10  don't use interrupts\n"
321*4882a593Smuzhiyun 	"\t\t  0x20  disable SMBus Host Notify ");
322*4882a593Smuzhiyun 
323*4882a593Smuzhiyun /* Make sure the SMBus host is ready to start transmitting.
324*4882a593Smuzhiyun    Return 0 if it is, -EBUSY if it is not. */
i801_check_pre(struct i801_priv * priv)325*4882a593Smuzhiyun static int i801_check_pre(struct i801_priv *priv)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	int status;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 	status = inb_p(SMBHSTSTS(priv));
330*4882a593Smuzhiyun 	if (status & SMBHSTSTS_HOST_BUSY) {
331*4882a593Smuzhiyun 		dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n");
332*4882a593Smuzhiyun 		return -EBUSY;
333*4882a593Smuzhiyun 	}
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	status &= STATUS_FLAGS;
336*4882a593Smuzhiyun 	if (status) {
337*4882a593Smuzhiyun 		dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n",
338*4882a593Smuzhiyun 			status);
339*4882a593Smuzhiyun 		outb_p(status, SMBHSTSTS(priv));
340*4882a593Smuzhiyun 		status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
341*4882a593Smuzhiyun 		if (status) {
342*4882a593Smuzhiyun 			dev_err(&priv->pci_dev->dev,
343*4882a593Smuzhiyun 				"Failed clearing status flags (%02x)\n",
344*4882a593Smuzhiyun 				status);
345*4882a593Smuzhiyun 			return -EBUSY;
346*4882a593Smuzhiyun 		}
347*4882a593Smuzhiyun 	}
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun 	/*
350*4882a593Smuzhiyun 	 * Clear CRC status if needed.
351*4882a593Smuzhiyun 	 * During normal operation, i801_check_post() takes care
352*4882a593Smuzhiyun 	 * of it after every operation.  We do it here only in case
353*4882a593Smuzhiyun 	 * the hardware was already in this state when the driver
354*4882a593Smuzhiyun 	 * started.
355*4882a593Smuzhiyun 	 */
356*4882a593Smuzhiyun 	if (priv->features & FEATURE_SMBUS_PEC) {
357*4882a593Smuzhiyun 		status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE;
358*4882a593Smuzhiyun 		if (status) {
359*4882a593Smuzhiyun 			dev_dbg(&priv->pci_dev->dev,
360*4882a593Smuzhiyun 				"Clearing aux status flags (%02x)\n", status);
361*4882a593Smuzhiyun 			outb_p(status, SMBAUXSTS(priv));
362*4882a593Smuzhiyun 			status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE;
363*4882a593Smuzhiyun 			if (status) {
364*4882a593Smuzhiyun 				dev_err(&priv->pci_dev->dev,
365*4882a593Smuzhiyun 					"Failed clearing aux status flags (%02x)\n",
366*4882a593Smuzhiyun 					status);
367*4882a593Smuzhiyun 				return -EBUSY;
368*4882a593Smuzhiyun 			}
369*4882a593Smuzhiyun 		}
370*4882a593Smuzhiyun 	}
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun 	return 0;
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun /*
376*4882a593Smuzhiyun  * Convert the status register to an error code, and clear it.
377*4882a593Smuzhiyun  * Note that status only contains the bits we want to clear, not the
378*4882a593Smuzhiyun  * actual register value.
379*4882a593Smuzhiyun  */
i801_check_post(struct i801_priv * priv,int status)380*4882a593Smuzhiyun static int i801_check_post(struct i801_priv *priv, int status)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun 	int result = 0;
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	/*
385*4882a593Smuzhiyun 	 * If the SMBus is still busy, we give up
386*4882a593Smuzhiyun 	 * Note: This timeout condition only happens when using polling
387*4882a593Smuzhiyun 	 * transactions.  For interrupt operation, NAK/timeout is indicated by
388*4882a593Smuzhiyun 	 * DEV_ERR.
389*4882a593Smuzhiyun 	 */
390*4882a593Smuzhiyun 	if (unlikely(status < 0)) {
391*4882a593Smuzhiyun 		dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
392*4882a593Smuzhiyun 		/* try to stop the current command */
393*4882a593Smuzhiyun 		dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n");
394*4882a593Smuzhiyun 		outb_p(SMBHSTCNT_KILL, SMBHSTCNT(priv));
395*4882a593Smuzhiyun 		usleep_range(1000, 2000);
396*4882a593Smuzhiyun 		outb_p(0, SMBHSTCNT(priv));
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 		/* Check if it worked */
399*4882a593Smuzhiyun 		status = inb_p(SMBHSTSTS(priv));
400*4882a593Smuzhiyun 		if ((status & SMBHSTSTS_HOST_BUSY) ||
401*4882a593Smuzhiyun 		    !(status & SMBHSTSTS_FAILED))
402*4882a593Smuzhiyun 			dev_err(&priv->pci_dev->dev,
403*4882a593Smuzhiyun 				"Failed terminating the transaction\n");
404*4882a593Smuzhiyun 		outb_p(STATUS_FLAGS, SMBHSTSTS(priv));
405*4882a593Smuzhiyun 		return -ETIMEDOUT;
406*4882a593Smuzhiyun 	}
407*4882a593Smuzhiyun 
408*4882a593Smuzhiyun 	if (status & SMBHSTSTS_FAILED) {
409*4882a593Smuzhiyun 		result = -EIO;
410*4882a593Smuzhiyun 		dev_err(&priv->pci_dev->dev, "Transaction failed\n");
411*4882a593Smuzhiyun 	}
412*4882a593Smuzhiyun 	if (status & SMBHSTSTS_DEV_ERR) {
413*4882a593Smuzhiyun 		/*
414*4882a593Smuzhiyun 		 * This may be a PEC error, check and clear it.
415*4882a593Smuzhiyun 		 *
416*4882a593Smuzhiyun 		 * AUXSTS is handled differently from HSTSTS.
417*4882a593Smuzhiyun 		 * For HSTSTS, i801_isr() or i801_wait_intr()
418*4882a593Smuzhiyun 		 * has already cleared the error bits in hardware,
419*4882a593Smuzhiyun 		 * and we are passed a copy of the original value
420*4882a593Smuzhiyun 		 * in "status".
421*4882a593Smuzhiyun 		 * For AUXSTS, the hardware register is left
422*4882a593Smuzhiyun 		 * for us to handle here.
423*4882a593Smuzhiyun 		 * This is asymmetric, slightly iffy, but safe,
424*4882a593Smuzhiyun 		 * since all this code is serialized and the CRCE
425*4882a593Smuzhiyun 		 * bit is harmless as long as it's cleared before
426*4882a593Smuzhiyun 		 * the next operation.
427*4882a593Smuzhiyun 		 */
428*4882a593Smuzhiyun 		if ((priv->features & FEATURE_SMBUS_PEC) &&
429*4882a593Smuzhiyun 		    (inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE)) {
430*4882a593Smuzhiyun 			outb_p(SMBAUXSTS_CRCE, SMBAUXSTS(priv));
431*4882a593Smuzhiyun 			result = -EBADMSG;
432*4882a593Smuzhiyun 			dev_dbg(&priv->pci_dev->dev, "PEC error\n");
433*4882a593Smuzhiyun 		} else {
434*4882a593Smuzhiyun 			result = -ENXIO;
435*4882a593Smuzhiyun 			dev_dbg(&priv->pci_dev->dev, "No response\n");
436*4882a593Smuzhiyun 		}
437*4882a593Smuzhiyun 	}
438*4882a593Smuzhiyun 	if (status & SMBHSTSTS_BUS_ERR) {
439*4882a593Smuzhiyun 		result = -EAGAIN;
440*4882a593Smuzhiyun 		dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n");
441*4882a593Smuzhiyun 	}
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	/* Clear status flags except BYTE_DONE, to be cleared by caller */
444*4882a593Smuzhiyun 	outb_p(status, SMBHSTSTS(priv));
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun 	return result;
447*4882a593Smuzhiyun }
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun /* Wait for BUSY being cleared and either INTR or an error flag being set */
i801_wait_intr(struct i801_priv * priv)450*4882a593Smuzhiyun static int i801_wait_intr(struct i801_priv *priv)
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun 	int timeout = 0;
453*4882a593Smuzhiyun 	int status;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	/* We will always wait for a fraction of a second! */
456*4882a593Smuzhiyun 	do {
457*4882a593Smuzhiyun 		usleep_range(250, 500);
458*4882a593Smuzhiyun 		status = inb_p(SMBHSTSTS(priv));
459*4882a593Smuzhiyun 	} while (((status & SMBHSTSTS_HOST_BUSY) ||
460*4882a593Smuzhiyun 		  !(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR))) &&
461*4882a593Smuzhiyun 		 (timeout++ < MAX_RETRIES));
462*4882a593Smuzhiyun 
463*4882a593Smuzhiyun 	if (timeout > MAX_RETRIES) {
464*4882a593Smuzhiyun 		dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n");
465*4882a593Smuzhiyun 		return -ETIMEDOUT;
466*4882a593Smuzhiyun 	}
467*4882a593Smuzhiyun 	return status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR);
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun 
470*4882a593Smuzhiyun /* Wait for either BYTE_DONE or an error flag being set */
i801_wait_byte_done(struct i801_priv * priv)471*4882a593Smuzhiyun static int i801_wait_byte_done(struct i801_priv *priv)
472*4882a593Smuzhiyun {
473*4882a593Smuzhiyun 	int timeout = 0;
474*4882a593Smuzhiyun 	int status;
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 	/* We will always wait for a fraction of a second! */
477*4882a593Smuzhiyun 	do {
478*4882a593Smuzhiyun 		usleep_range(250, 500);
479*4882a593Smuzhiyun 		status = inb_p(SMBHSTSTS(priv));
480*4882a593Smuzhiyun 	} while (!(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_BYTE_DONE)) &&
481*4882a593Smuzhiyun 		 (timeout++ < MAX_RETRIES));
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	if (timeout > MAX_RETRIES) {
484*4882a593Smuzhiyun 		dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n");
485*4882a593Smuzhiyun 		return -ETIMEDOUT;
486*4882a593Smuzhiyun 	}
487*4882a593Smuzhiyun 	return status & STATUS_ERROR_FLAGS;
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun 
i801_transaction(struct i801_priv * priv,int xact)490*4882a593Smuzhiyun static int i801_transaction(struct i801_priv *priv, int xact)
491*4882a593Smuzhiyun {
492*4882a593Smuzhiyun 	int status;
493*4882a593Smuzhiyun 	int result;
494*4882a593Smuzhiyun 	const struct i2c_adapter *adap = &priv->adapter;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	result = i801_check_pre(priv);
497*4882a593Smuzhiyun 	if (result < 0)
498*4882a593Smuzhiyun 		return result;
499*4882a593Smuzhiyun 
500*4882a593Smuzhiyun 	if (priv->features & FEATURE_IRQ) {
501*4882a593Smuzhiyun 		outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START,
502*4882a593Smuzhiyun 		       SMBHSTCNT(priv));
503*4882a593Smuzhiyun 		result = wait_event_timeout(priv->waitq,
504*4882a593Smuzhiyun 					    (status = priv->status),
505*4882a593Smuzhiyun 					    adap->timeout);
506*4882a593Smuzhiyun 		if (!result) {
507*4882a593Smuzhiyun 			status = -ETIMEDOUT;
508*4882a593Smuzhiyun 			dev_warn(&priv->pci_dev->dev,
509*4882a593Smuzhiyun 				 "Timeout waiting for interrupt!\n");
510*4882a593Smuzhiyun 		}
511*4882a593Smuzhiyun 		priv->status = 0;
512*4882a593Smuzhiyun 		return i801_check_post(priv, status);
513*4882a593Smuzhiyun 	}
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun 	/* the current contents of SMBHSTCNT can be overwritten, since PEC,
516*4882a593Smuzhiyun 	 * SMBSCMD are passed in xact */
517*4882a593Smuzhiyun 	outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv));
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun 	status = i801_wait_intr(priv);
520*4882a593Smuzhiyun 	return i801_check_post(priv, status);
521*4882a593Smuzhiyun }
522*4882a593Smuzhiyun 
i801_block_transaction_by_block(struct i801_priv * priv,union i2c_smbus_data * data,char read_write,int command,int hwpec)523*4882a593Smuzhiyun static int i801_block_transaction_by_block(struct i801_priv *priv,
524*4882a593Smuzhiyun 					   union i2c_smbus_data *data,
525*4882a593Smuzhiyun 					   char read_write, int command,
526*4882a593Smuzhiyun 					   int hwpec)
527*4882a593Smuzhiyun {
528*4882a593Smuzhiyun 	int i, len;
529*4882a593Smuzhiyun 	int status;
530*4882a593Smuzhiyun 	int xact = hwpec ? SMBHSTCNT_PEC_EN : 0;
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun 	switch (command) {
533*4882a593Smuzhiyun 	case I2C_SMBUS_BLOCK_PROC_CALL:
534*4882a593Smuzhiyun 		xact |= I801_BLOCK_PROC_CALL;
535*4882a593Smuzhiyun 		break;
536*4882a593Smuzhiyun 	case I2C_SMBUS_BLOCK_DATA:
537*4882a593Smuzhiyun 		xact |= I801_BLOCK_DATA;
538*4882a593Smuzhiyun 		break;
539*4882a593Smuzhiyun 	default:
540*4882a593Smuzhiyun 		return -EOPNOTSUPP;
541*4882a593Smuzhiyun 	}
542*4882a593Smuzhiyun 
543*4882a593Smuzhiyun 	inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun 	/* Use 32-byte buffer to process this transaction */
546*4882a593Smuzhiyun 	if (read_write == I2C_SMBUS_WRITE) {
547*4882a593Smuzhiyun 		len = data->block[0];
548*4882a593Smuzhiyun 		outb_p(len, SMBHSTDAT0(priv));
549*4882a593Smuzhiyun 		for (i = 0; i < len; i++)
550*4882a593Smuzhiyun 			outb_p(data->block[i+1], SMBBLKDAT(priv));
551*4882a593Smuzhiyun 	}
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	status = i801_transaction(priv, xact);
554*4882a593Smuzhiyun 	if (status)
555*4882a593Smuzhiyun 		return status;
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun 	if (read_write == I2C_SMBUS_READ ||
558*4882a593Smuzhiyun 	    command == I2C_SMBUS_BLOCK_PROC_CALL) {
559*4882a593Smuzhiyun 		len = inb_p(SMBHSTDAT0(priv));
560*4882a593Smuzhiyun 		if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
561*4882a593Smuzhiyun 			return -EPROTO;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 		data->block[0] = len;
564*4882a593Smuzhiyun 		for (i = 0; i < len; i++)
565*4882a593Smuzhiyun 			data->block[i + 1] = inb_p(SMBBLKDAT(priv));
566*4882a593Smuzhiyun 	}
567*4882a593Smuzhiyun 	return 0;
568*4882a593Smuzhiyun }
569*4882a593Smuzhiyun 
i801_isr_byte_done(struct i801_priv * priv)570*4882a593Smuzhiyun static void i801_isr_byte_done(struct i801_priv *priv)
571*4882a593Smuzhiyun {
572*4882a593Smuzhiyun 	if (priv->is_read) {
573*4882a593Smuzhiyun 		/* For SMBus block reads, length is received with first byte */
574*4882a593Smuzhiyun 		if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) &&
575*4882a593Smuzhiyun 		    (priv->count == 0)) {
576*4882a593Smuzhiyun 			priv->len = inb_p(SMBHSTDAT0(priv));
577*4882a593Smuzhiyun 			if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) {
578*4882a593Smuzhiyun 				dev_err(&priv->pci_dev->dev,
579*4882a593Smuzhiyun 					"Illegal SMBus block read size %d\n",
580*4882a593Smuzhiyun 					priv->len);
581*4882a593Smuzhiyun 				/* FIXME: Recover */
582*4882a593Smuzhiyun 				priv->len = I2C_SMBUS_BLOCK_MAX;
583*4882a593Smuzhiyun 			} else {
584*4882a593Smuzhiyun 				dev_dbg(&priv->pci_dev->dev,
585*4882a593Smuzhiyun 					"SMBus block read size is %d\n",
586*4882a593Smuzhiyun 					priv->len);
587*4882a593Smuzhiyun 			}
588*4882a593Smuzhiyun 			priv->data[-1] = priv->len;
589*4882a593Smuzhiyun 		}
590*4882a593Smuzhiyun 
591*4882a593Smuzhiyun 		/* Read next byte */
592*4882a593Smuzhiyun 		if (priv->count < priv->len)
593*4882a593Smuzhiyun 			priv->data[priv->count++] = inb(SMBBLKDAT(priv));
594*4882a593Smuzhiyun 		else
595*4882a593Smuzhiyun 			dev_dbg(&priv->pci_dev->dev,
596*4882a593Smuzhiyun 				"Discarding extra byte on block read\n");
597*4882a593Smuzhiyun 
598*4882a593Smuzhiyun 		/* Set LAST_BYTE for last byte of read transaction */
599*4882a593Smuzhiyun 		if (priv->count == priv->len - 1)
600*4882a593Smuzhiyun 			outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE,
601*4882a593Smuzhiyun 			       SMBHSTCNT(priv));
602*4882a593Smuzhiyun 	} else if (priv->count < priv->len - 1) {
603*4882a593Smuzhiyun 		/* Write next byte, except for IRQ after last byte */
604*4882a593Smuzhiyun 		outb_p(priv->data[++priv->count], SMBBLKDAT(priv));
605*4882a593Smuzhiyun 	}
606*4882a593Smuzhiyun 
607*4882a593Smuzhiyun 	/* Clear BYTE_DONE to continue with next byte */
608*4882a593Smuzhiyun 	outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun 
i801_host_notify_isr(struct i801_priv * priv)611*4882a593Smuzhiyun static irqreturn_t i801_host_notify_isr(struct i801_priv *priv)
612*4882a593Smuzhiyun {
613*4882a593Smuzhiyun 	unsigned short addr;
614*4882a593Smuzhiyun 
615*4882a593Smuzhiyun 	addr = inb_p(SMBNTFDADD(priv)) >> 1;
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun 	/*
618*4882a593Smuzhiyun 	 * With the tested platforms, reading SMBNTFDDAT (22 + (p)->smba)
619*4882a593Smuzhiyun 	 * always returns 0. Our current implementation doesn't provide
620*4882a593Smuzhiyun 	 * data, so we just ignore it.
621*4882a593Smuzhiyun 	 */
622*4882a593Smuzhiyun 	i2c_handle_smbus_host_notify(&priv->adapter, addr);
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun 	/* clear Host Notify bit and return */
625*4882a593Smuzhiyun 	outb_p(SMBSLVSTS_HST_NTFY_STS, SMBSLVSTS(priv));
626*4882a593Smuzhiyun 	return IRQ_HANDLED;
627*4882a593Smuzhiyun }
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun /*
630*4882a593Smuzhiyun  * There are three kinds of interrupts:
631*4882a593Smuzhiyun  *
632*4882a593Smuzhiyun  * 1) i801 signals transaction completion with one of these interrupts:
633*4882a593Smuzhiyun  *      INTR - Success
634*4882a593Smuzhiyun  *      DEV_ERR - Invalid command, NAK or communication timeout
635*4882a593Smuzhiyun  *      BUS_ERR - SMI# transaction collision
636*4882a593Smuzhiyun  *      FAILED - transaction was canceled due to a KILL request
637*4882a593Smuzhiyun  *    When any of these occur, update ->status and wake up the waitq.
638*4882a593Smuzhiyun  *    ->status must be cleared before kicking off the next transaction.
639*4882a593Smuzhiyun  *
640*4882a593Smuzhiyun  * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt
641*4882a593Smuzhiyun  *    occurs for each byte of a byte-by-byte to prepare the next byte.
642*4882a593Smuzhiyun  *
643*4882a593Smuzhiyun  * 3) Host Notify interrupts
644*4882a593Smuzhiyun  */
i801_isr(int irq,void * dev_id)645*4882a593Smuzhiyun static irqreturn_t i801_isr(int irq, void *dev_id)
646*4882a593Smuzhiyun {
647*4882a593Smuzhiyun 	struct i801_priv *priv = dev_id;
648*4882a593Smuzhiyun 	u16 pcists;
649*4882a593Smuzhiyun 	u8 status;
650*4882a593Smuzhiyun 
651*4882a593Smuzhiyun 	/* Confirm this is our interrupt */
652*4882a593Smuzhiyun 	pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists);
653*4882a593Smuzhiyun 	if (!(pcists & SMBPCISTS_INTS))
654*4882a593Smuzhiyun 		return IRQ_NONE;
655*4882a593Smuzhiyun 
656*4882a593Smuzhiyun 	if (priv->features & FEATURE_HOST_NOTIFY) {
657*4882a593Smuzhiyun 		status = inb_p(SMBSLVSTS(priv));
658*4882a593Smuzhiyun 		if (status & SMBSLVSTS_HST_NTFY_STS)
659*4882a593Smuzhiyun 			return i801_host_notify_isr(priv);
660*4882a593Smuzhiyun 	}
661*4882a593Smuzhiyun 
662*4882a593Smuzhiyun 	status = inb_p(SMBHSTSTS(priv));
663*4882a593Smuzhiyun 	if (status & SMBHSTSTS_BYTE_DONE)
664*4882a593Smuzhiyun 		i801_isr_byte_done(priv);
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun 	/*
667*4882a593Smuzhiyun 	 * Clear irq sources and report transaction result.
668*4882a593Smuzhiyun 	 * ->status must be cleared before the next transaction is started.
669*4882a593Smuzhiyun 	 */
670*4882a593Smuzhiyun 	status &= SMBHSTSTS_INTR | STATUS_ERROR_FLAGS;
671*4882a593Smuzhiyun 	if (status) {
672*4882a593Smuzhiyun 		outb_p(status, SMBHSTSTS(priv));
673*4882a593Smuzhiyun 		priv->status = status;
674*4882a593Smuzhiyun 		wake_up(&priv->waitq);
675*4882a593Smuzhiyun 	}
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun 	return IRQ_HANDLED;
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun /*
681*4882a593Smuzhiyun  * For "byte-by-byte" block transactions:
682*4882a593Smuzhiyun  *   I2C write uses cmd=I801_BLOCK_DATA, I2C_EN=1
683*4882a593Smuzhiyun  *   I2C read uses cmd=I801_I2C_BLOCK_DATA
684*4882a593Smuzhiyun  */
i801_block_transaction_byte_by_byte(struct i801_priv * priv,union i2c_smbus_data * data,char read_write,int command,int hwpec)685*4882a593Smuzhiyun static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
686*4882a593Smuzhiyun 					       union i2c_smbus_data *data,
687*4882a593Smuzhiyun 					       char read_write, int command,
688*4882a593Smuzhiyun 					       int hwpec)
689*4882a593Smuzhiyun {
690*4882a593Smuzhiyun 	int i, len;
691*4882a593Smuzhiyun 	int smbcmd;
692*4882a593Smuzhiyun 	int status;
693*4882a593Smuzhiyun 	int result;
694*4882a593Smuzhiyun 	const struct i2c_adapter *adap = &priv->adapter;
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	if (command == I2C_SMBUS_BLOCK_PROC_CALL)
697*4882a593Smuzhiyun 		return -EOPNOTSUPP;
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun 	result = i801_check_pre(priv);
700*4882a593Smuzhiyun 	if (result < 0)
701*4882a593Smuzhiyun 		return result;
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun 	len = data->block[0];
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	if (read_write == I2C_SMBUS_WRITE) {
706*4882a593Smuzhiyun 		outb_p(len, SMBHSTDAT0(priv));
707*4882a593Smuzhiyun 		outb_p(data->block[1], SMBBLKDAT(priv));
708*4882a593Smuzhiyun 	}
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun 	if (command == I2C_SMBUS_I2C_BLOCK_DATA &&
711*4882a593Smuzhiyun 	    read_write == I2C_SMBUS_READ)
712*4882a593Smuzhiyun 		smbcmd = I801_I2C_BLOCK_DATA;
713*4882a593Smuzhiyun 	else
714*4882a593Smuzhiyun 		smbcmd = I801_BLOCK_DATA;
715*4882a593Smuzhiyun 
716*4882a593Smuzhiyun 	if (priv->features & FEATURE_IRQ) {
717*4882a593Smuzhiyun 		priv->is_read = (read_write == I2C_SMBUS_READ);
718*4882a593Smuzhiyun 		if (len == 1 && priv->is_read)
719*4882a593Smuzhiyun 			smbcmd |= SMBHSTCNT_LAST_BYTE;
720*4882a593Smuzhiyun 		priv->cmd = smbcmd | SMBHSTCNT_INTREN;
721*4882a593Smuzhiyun 		priv->len = len;
722*4882a593Smuzhiyun 		priv->count = 0;
723*4882a593Smuzhiyun 		priv->data = &data->block[1];
724*4882a593Smuzhiyun 
725*4882a593Smuzhiyun 		outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv));
726*4882a593Smuzhiyun 		result = wait_event_timeout(priv->waitq,
727*4882a593Smuzhiyun 					    (status = priv->status),
728*4882a593Smuzhiyun 					    adap->timeout);
729*4882a593Smuzhiyun 		if (!result) {
730*4882a593Smuzhiyun 			status = -ETIMEDOUT;
731*4882a593Smuzhiyun 			dev_warn(&priv->pci_dev->dev,
732*4882a593Smuzhiyun 				 "Timeout waiting for interrupt!\n");
733*4882a593Smuzhiyun 		}
734*4882a593Smuzhiyun 		priv->status = 0;
735*4882a593Smuzhiyun 		return i801_check_post(priv, status);
736*4882a593Smuzhiyun 	}
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun 	for (i = 1; i <= len; i++) {
739*4882a593Smuzhiyun 		if (i == len && read_write == I2C_SMBUS_READ)
740*4882a593Smuzhiyun 			smbcmd |= SMBHSTCNT_LAST_BYTE;
741*4882a593Smuzhiyun 		outb_p(smbcmd, SMBHSTCNT(priv));
742*4882a593Smuzhiyun 
743*4882a593Smuzhiyun 		if (i == 1)
744*4882a593Smuzhiyun 			outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START,
745*4882a593Smuzhiyun 			       SMBHSTCNT(priv));
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 		status = i801_wait_byte_done(priv);
748*4882a593Smuzhiyun 		if (status)
749*4882a593Smuzhiyun 			goto exit;
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun 		if (i == 1 && read_write == I2C_SMBUS_READ
752*4882a593Smuzhiyun 		 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
753*4882a593Smuzhiyun 			len = inb_p(SMBHSTDAT0(priv));
754*4882a593Smuzhiyun 			if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) {
755*4882a593Smuzhiyun 				dev_err(&priv->pci_dev->dev,
756*4882a593Smuzhiyun 					"Illegal SMBus block read size %d\n",
757*4882a593Smuzhiyun 					len);
758*4882a593Smuzhiyun 				/* Recover */
759*4882a593Smuzhiyun 				while (inb_p(SMBHSTSTS(priv)) &
760*4882a593Smuzhiyun 				       SMBHSTSTS_HOST_BUSY)
761*4882a593Smuzhiyun 					outb_p(SMBHSTSTS_BYTE_DONE,
762*4882a593Smuzhiyun 					       SMBHSTSTS(priv));
763*4882a593Smuzhiyun 				outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
764*4882a593Smuzhiyun 				return -EPROTO;
765*4882a593Smuzhiyun 			}
766*4882a593Smuzhiyun 			data->block[0] = len;
767*4882a593Smuzhiyun 		}
768*4882a593Smuzhiyun 
769*4882a593Smuzhiyun 		/* Retrieve/store value in SMBBLKDAT */
770*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_READ)
771*4882a593Smuzhiyun 			data->block[i] = inb_p(SMBBLKDAT(priv));
772*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
773*4882a593Smuzhiyun 			outb_p(data->block[i+1], SMBBLKDAT(priv));
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun 		/* signals SMBBLKDAT ready */
776*4882a593Smuzhiyun 		outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
777*4882a593Smuzhiyun 	}
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun 	status = i801_wait_intr(priv);
780*4882a593Smuzhiyun exit:
781*4882a593Smuzhiyun 	return i801_check_post(priv, status);
782*4882a593Smuzhiyun }
783*4882a593Smuzhiyun 
i801_set_block_buffer_mode(struct i801_priv * priv)784*4882a593Smuzhiyun static int i801_set_block_buffer_mode(struct i801_priv *priv)
785*4882a593Smuzhiyun {
786*4882a593Smuzhiyun 	outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv));
787*4882a593Smuzhiyun 	if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0)
788*4882a593Smuzhiyun 		return -EIO;
789*4882a593Smuzhiyun 	return 0;
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun /* Block transaction function */
i801_block_transaction(struct i801_priv * priv,union i2c_smbus_data * data,char read_write,int command,int hwpec)793*4882a593Smuzhiyun static int i801_block_transaction(struct i801_priv *priv,
794*4882a593Smuzhiyun 				  union i2c_smbus_data *data, char read_write,
795*4882a593Smuzhiyun 				  int command, int hwpec)
796*4882a593Smuzhiyun {
797*4882a593Smuzhiyun 	int result = 0;
798*4882a593Smuzhiyun 	unsigned char hostc;
799*4882a593Smuzhiyun 
800*4882a593Smuzhiyun 	if (read_write == I2C_SMBUS_READ && command == I2C_SMBUS_BLOCK_DATA)
801*4882a593Smuzhiyun 		data->block[0] = I2C_SMBUS_BLOCK_MAX;
802*4882a593Smuzhiyun 	else if (data->block[0] < 1 || data->block[0] > I2C_SMBUS_BLOCK_MAX)
803*4882a593Smuzhiyun 		return -EPROTO;
804*4882a593Smuzhiyun 
805*4882a593Smuzhiyun 	if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
806*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_WRITE) {
807*4882a593Smuzhiyun 			/* set I2C_EN bit in configuration register */
808*4882a593Smuzhiyun 			pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc);
809*4882a593Smuzhiyun 			pci_write_config_byte(priv->pci_dev, SMBHSTCFG,
810*4882a593Smuzhiyun 					      hostc | SMBHSTCFG_I2C_EN);
811*4882a593Smuzhiyun 		} else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) {
812*4882a593Smuzhiyun 			dev_err(&priv->pci_dev->dev,
813*4882a593Smuzhiyun 				"I2C block read is unsupported!\n");
814*4882a593Smuzhiyun 			return -EOPNOTSUPP;
815*4882a593Smuzhiyun 		}
816*4882a593Smuzhiyun 	}
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	/* Experience has shown that the block buffer can only be used for
819*4882a593Smuzhiyun 	   SMBus (not I2C) block transactions, even though the datasheet
820*4882a593Smuzhiyun 	   doesn't mention this limitation. */
821*4882a593Smuzhiyun 	if ((priv->features & FEATURE_BLOCK_BUFFER)
822*4882a593Smuzhiyun 	 && command != I2C_SMBUS_I2C_BLOCK_DATA
823*4882a593Smuzhiyun 	 && i801_set_block_buffer_mode(priv) == 0)
824*4882a593Smuzhiyun 		result = i801_block_transaction_by_block(priv, data,
825*4882a593Smuzhiyun 							 read_write,
826*4882a593Smuzhiyun 							 command, hwpec);
827*4882a593Smuzhiyun 	else
828*4882a593Smuzhiyun 		result = i801_block_transaction_byte_by_byte(priv, data,
829*4882a593Smuzhiyun 							     read_write,
830*4882a593Smuzhiyun 							     command, hwpec);
831*4882a593Smuzhiyun 
832*4882a593Smuzhiyun 	if (command == I2C_SMBUS_I2C_BLOCK_DATA
833*4882a593Smuzhiyun 	 && read_write == I2C_SMBUS_WRITE) {
834*4882a593Smuzhiyun 		/* restore saved configuration register value */
835*4882a593Smuzhiyun 		pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc);
836*4882a593Smuzhiyun 	}
837*4882a593Smuzhiyun 	return result;
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun 
840*4882a593Smuzhiyun /* Return negative errno on error. */
i801_access(struct i2c_adapter * adap,u16 addr,unsigned short flags,char read_write,u8 command,int size,union i2c_smbus_data * data)841*4882a593Smuzhiyun static s32 i801_access(struct i2c_adapter *adap, u16 addr,
842*4882a593Smuzhiyun 		       unsigned short flags, char read_write, u8 command,
843*4882a593Smuzhiyun 		       int size, union i2c_smbus_data *data)
844*4882a593Smuzhiyun {
845*4882a593Smuzhiyun 	int hwpec;
846*4882a593Smuzhiyun 	int block = 0;
847*4882a593Smuzhiyun 	int ret = 0, xact = 0;
848*4882a593Smuzhiyun 	struct i801_priv *priv = i2c_get_adapdata(adap);
849*4882a593Smuzhiyun 
850*4882a593Smuzhiyun 	mutex_lock(&priv->acpi_lock);
851*4882a593Smuzhiyun 	if (priv->acpi_reserved) {
852*4882a593Smuzhiyun 		mutex_unlock(&priv->acpi_lock);
853*4882a593Smuzhiyun 		return -EBUSY;
854*4882a593Smuzhiyun 	}
855*4882a593Smuzhiyun 
856*4882a593Smuzhiyun 	pm_runtime_get_sync(&priv->pci_dev->dev);
857*4882a593Smuzhiyun 
858*4882a593Smuzhiyun 	hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC)
859*4882a593Smuzhiyun 		&& size != I2C_SMBUS_QUICK
860*4882a593Smuzhiyun 		&& size != I2C_SMBUS_I2C_BLOCK_DATA;
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun 	switch (size) {
863*4882a593Smuzhiyun 	case I2C_SMBUS_QUICK:
864*4882a593Smuzhiyun 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
865*4882a593Smuzhiyun 		       SMBHSTADD(priv));
866*4882a593Smuzhiyun 		xact = I801_QUICK;
867*4882a593Smuzhiyun 		break;
868*4882a593Smuzhiyun 	case I2C_SMBUS_BYTE:
869*4882a593Smuzhiyun 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
870*4882a593Smuzhiyun 		       SMBHSTADD(priv));
871*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_WRITE)
872*4882a593Smuzhiyun 			outb_p(command, SMBHSTCMD(priv));
873*4882a593Smuzhiyun 		xact = I801_BYTE;
874*4882a593Smuzhiyun 		break;
875*4882a593Smuzhiyun 	case I2C_SMBUS_BYTE_DATA:
876*4882a593Smuzhiyun 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
877*4882a593Smuzhiyun 		       SMBHSTADD(priv));
878*4882a593Smuzhiyun 		outb_p(command, SMBHSTCMD(priv));
879*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_WRITE)
880*4882a593Smuzhiyun 			outb_p(data->byte, SMBHSTDAT0(priv));
881*4882a593Smuzhiyun 		xact = I801_BYTE_DATA;
882*4882a593Smuzhiyun 		break;
883*4882a593Smuzhiyun 	case I2C_SMBUS_WORD_DATA:
884*4882a593Smuzhiyun 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
885*4882a593Smuzhiyun 		       SMBHSTADD(priv));
886*4882a593Smuzhiyun 		outb_p(command, SMBHSTCMD(priv));
887*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_WRITE) {
888*4882a593Smuzhiyun 			outb_p(data->word & 0xff, SMBHSTDAT0(priv));
889*4882a593Smuzhiyun 			outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv));
890*4882a593Smuzhiyun 		}
891*4882a593Smuzhiyun 		xact = I801_WORD_DATA;
892*4882a593Smuzhiyun 		break;
893*4882a593Smuzhiyun 	case I2C_SMBUS_BLOCK_DATA:
894*4882a593Smuzhiyun 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
895*4882a593Smuzhiyun 		       SMBHSTADD(priv));
896*4882a593Smuzhiyun 		outb_p(command, SMBHSTCMD(priv));
897*4882a593Smuzhiyun 		block = 1;
898*4882a593Smuzhiyun 		break;
899*4882a593Smuzhiyun 	case I2C_SMBUS_I2C_BLOCK_DATA:
900*4882a593Smuzhiyun 		/*
901*4882a593Smuzhiyun 		 * NB: page 240 of ICH5 datasheet shows that the R/#W
902*4882a593Smuzhiyun 		 * bit should be cleared here, even when reading.
903*4882a593Smuzhiyun 		 * However if SPD Write Disable is set (Lynx Point and later),
904*4882a593Smuzhiyun 		 * the read will fail if we don't set the R/#W bit.
905*4882a593Smuzhiyun 		 */
906*4882a593Smuzhiyun 		outb_p(((addr & 0x7f) << 1) |
907*4882a593Smuzhiyun 		       ((priv->original_hstcfg & SMBHSTCFG_SPD_WD) ?
908*4882a593Smuzhiyun 			(read_write & 0x01) : 0),
909*4882a593Smuzhiyun 		       SMBHSTADD(priv));
910*4882a593Smuzhiyun 		if (read_write == I2C_SMBUS_READ) {
911*4882a593Smuzhiyun 			/* NB: page 240 of ICH5 datasheet also shows
912*4882a593Smuzhiyun 			 * that DATA1 is the cmd field when reading */
913*4882a593Smuzhiyun 			outb_p(command, SMBHSTDAT1(priv));
914*4882a593Smuzhiyun 		} else
915*4882a593Smuzhiyun 			outb_p(command, SMBHSTCMD(priv));
916*4882a593Smuzhiyun 		block = 1;
917*4882a593Smuzhiyun 		break;
918*4882a593Smuzhiyun 	case I2C_SMBUS_BLOCK_PROC_CALL:
919*4882a593Smuzhiyun 		/*
920*4882a593Smuzhiyun 		 * Bit 0 of the slave address register always indicate a write
921*4882a593Smuzhiyun 		 * command.
922*4882a593Smuzhiyun 		 */
923*4882a593Smuzhiyun 		outb_p((addr & 0x7f) << 1, SMBHSTADD(priv));
924*4882a593Smuzhiyun 		outb_p(command, SMBHSTCMD(priv));
925*4882a593Smuzhiyun 		block = 1;
926*4882a593Smuzhiyun 		break;
927*4882a593Smuzhiyun 	default:
928*4882a593Smuzhiyun 		dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n",
929*4882a593Smuzhiyun 			size);
930*4882a593Smuzhiyun 		ret = -EOPNOTSUPP;
931*4882a593Smuzhiyun 		goto out;
932*4882a593Smuzhiyun 	}
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun 	if (hwpec)	/* enable/disable hardware PEC */
935*4882a593Smuzhiyun 		outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv));
936*4882a593Smuzhiyun 	else
937*4882a593Smuzhiyun 		outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC),
938*4882a593Smuzhiyun 		       SMBAUXCTL(priv));
939*4882a593Smuzhiyun 
940*4882a593Smuzhiyun 	if (block)
941*4882a593Smuzhiyun 		ret = i801_block_transaction(priv, data, read_write, size,
942*4882a593Smuzhiyun 					     hwpec);
943*4882a593Smuzhiyun 	else
944*4882a593Smuzhiyun 		ret = i801_transaction(priv, xact);
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	/* Some BIOSes don't like it when PEC is enabled at reboot or resume
947*4882a593Smuzhiyun 	   time, so we forcibly disable it after every transaction. Turn off
948*4882a593Smuzhiyun 	   E32B for the same reason. */
949*4882a593Smuzhiyun 	if (hwpec || block)
950*4882a593Smuzhiyun 		outb_p(inb_p(SMBAUXCTL(priv)) &
951*4882a593Smuzhiyun 		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun 	if (block)
954*4882a593Smuzhiyun 		goto out;
955*4882a593Smuzhiyun 	if (ret)
956*4882a593Smuzhiyun 		goto out;
957*4882a593Smuzhiyun 	if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
958*4882a593Smuzhiyun 		goto out;
959*4882a593Smuzhiyun 
960*4882a593Smuzhiyun 	switch (xact & 0x7f) {
961*4882a593Smuzhiyun 	case I801_BYTE:	/* Result put in SMBHSTDAT0 */
962*4882a593Smuzhiyun 	case I801_BYTE_DATA:
963*4882a593Smuzhiyun 		data->byte = inb_p(SMBHSTDAT0(priv));
964*4882a593Smuzhiyun 		break;
965*4882a593Smuzhiyun 	case I801_WORD_DATA:
966*4882a593Smuzhiyun 		data->word = inb_p(SMBHSTDAT0(priv)) +
967*4882a593Smuzhiyun 			     (inb_p(SMBHSTDAT1(priv)) << 8);
968*4882a593Smuzhiyun 		break;
969*4882a593Smuzhiyun 	}
970*4882a593Smuzhiyun 
971*4882a593Smuzhiyun out:
972*4882a593Smuzhiyun 	/* Unlock the SMBus device for use by BIOS/ACPI */
973*4882a593Smuzhiyun 	outb_p(SMBHSTSTS_INUSE_STS, SMBHSTSTS(priv));
974*4882a593Smuzhiyun 
975*4882a593Smuzhiyun 	pm_runtime_mark_last_busy(&priv->pci_dev->dev);
976*4882a593Smuzhiyun 	pm_runtime_put_autosuspend(&priv->pci_dev->dev);
977*4882a593Smuzhiyun 	mutex_unlock(&priv->acpi_lock);
978*4882a593Smuzhiyun 	return ret;
979*4882a593Smuzhiyun }
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 
i801_func(struct i2c_adapter * adapter)982*4882a593Smuzhiyun static u32 i801_func(struct i2c_adapter *adapter)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun 	struct i801_priv *priv = i2c_get_adapdata(adapter);
985*4882a593Smuzhiyun 
986*4882a593Smuzhiyun 	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
987*4882a593Smuzhiyun 	       I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
988*4882a593Smuzhiyun 	       I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK |
989*4882a593Smuzhiyun 	       ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) |
990*4882a593Smuzhiyun 	       ((priv->features & FEATURE_BLOCK_PROC) ?
991*4882a593Smuzhiyun 		I2C_FUNC_SMBUS_BLOCK_PROC_CALL : 0) |
992*4882a593Smuzhiyun 	       ((priv->features & FEATURE_I2C_BLOCK_READ) ?
993*4882a593Smuzhiyun 		I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0) |
994*4882a593Smuzhiyun 	       ((priv->features & FEATURE_HOST_NOTIFY) ?
995*4882a593Smuzhiyun 		I2C_FUNC_SMBUS_HOST_NOTIFY : 0);
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun 
i801_enable_host_notify(struct i2c_adapter * adapter)998*4882a593Smuzhiyun static void i801_enable_host_notify(struct i2c_adapter *adapter)
999*4882a593Smuzhiyun {
1000*4882a593Smuzhiyun 	struct i801_priv *priv = i2c_get_adapdata(adapter);
1001*4882a593Smuzhiyun 
1002*4882a593Smuzhiyun 	if (!(priv->features & FEATURE_HOST_NOTIFY))
1003*4882a593Smuzhiyun 		return;
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun 	if (!(SMBSLVCMD_HST_NTFY_INTREN & priv->original_slvcmd))
1006*4882a593Smuzhiyun 		outb_p(SMBSLVCMD_HST_NTFY_INTREN | priv->original_slvcmd,
1007*4882a593Smuzhiyun 		       SMBSLVCMD(priv));
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun 	/* clear Host Notify bit to allow a new notification */
1010*4882a593Smuzhiyun 	outb_p(SMBSLVSTS_HST_NTFY_STS, SMBSLVSTS(priv));
1011*4882a593Smuzhiyun }
1012*4882a593Smuzhiyun 
i801_disable_host_notify(struct i801_priv * priv)1013*4882a593Smuzhiyun static void i801_disable_host_notify(struct i801_priv *priv)
1014*4882a593Smuzhiyun {
1015*4882a593Smuzhiyun 	if (!(priv->features & FEATURE_HOST_NOTIFY))
1016*4882a593Smuzhiyun 		return;
1017*4882a593Smuzhiyun 
1018*4882a593Smuzhiyun 	outb_p(priv->original_slvcmd, SMBSLVCMD(priv));
1019*4882a593Smuzhiyun }
1020*4882a593Smuzhiyun 
1021*4882a593Smuzhiyun static const struct i2c_algorithm smbus_algorithm = {
1022*4882a593Smuzhiyun 	.smbus_xfer	= i801_access,
1023*4882a593Smuzhiyun 	.functionality	= i801_func,
1024*4882a593Smuzhiyun };
1025*4882a593Smuzhiyun 
1026*4882a593Smuzhiyun static const struct pci_device_id i801_ids[] = {
1027*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
1028*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
1029*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
1030*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
1031*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
1032*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
1033*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
1034*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
1035*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
1036*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
1037*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
1038*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
1039*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) },
1040*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) },
1041*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) },
1042*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS) },
1043*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS) },
1044*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) },
1045*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0) },
1046*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) },
1047*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) },
1048*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
1049*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
1050*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) },
1051*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) },
1052*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMBUS) },
1053*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS) },
1054*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0) },
1055*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1) },
1056*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) },
1057*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) },
1058*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_GEMINILAKE_SMBUS) },
1059*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_SMBUS) },
1060*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) },
1061*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS) },
1062*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BRASWELL_SMBUS) },
1063*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS) },
1064*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS) },
1065*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CDF_SMBUS) },
1066*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DNV_SMBUS) },
1067*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EBG_SMBUS) },
1068*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BROXTON_SMBUS) },
1069*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS) },
1070*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS) },
1071*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS) },
1072*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS) },
1073*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS) },
1074*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS) },
1075*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS) },
1076*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS) },
1077*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS) },
1078*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS) },
1079*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS) },
1080*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS) },
1081*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS) },
1082*4882a593Smuzhiyun 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS) },
1083*4882a593Smuzhiyun 	{ 0, }
1084*4882a593Smuzhiyun };
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, i801_ids);
1087*4882a593Smuzhiyun 
1088*4882a593Smuzhiyun #if defined CONFIG_X86 && defined CONFIG_DMI
1089*4882a593Smuzhiyun static unsigned char apanel_addr;
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun /* Scan the system ROM for the signature "FJKEYINF" */
bios_signature(const void __iomem * bios)1092*4882a593Smuzhiyun static __init const void __iomem *bios_signature(const void __iomem *bios)
1093*4882a593Smuzhiyun {
1094*4882a593Smuzhiyun 	ssize_t offset;
1095*4882a593Smuzhiyun 	const unsigned char signature[] = "FJKEYINF";
1096*4882a593Smuzhiyun 
1097*4882a593Smuzhiyun 	for (offset = 0; offset < 0x10000; offset += 0x10) {
1098*4882a593Smuzhiyun 		if (check_signature(bios + offset, signature,
1099*4882a593Smuzhiyun 				    sizeof(signature)-1))
1100*4882a593Smuzhiyun 			return bios + offset;
1101*4882a593Smuzhiyun 	}
1102*4882a593Smuzhiyun 	return NULL;
1103*4882a593Smuzhiyun }
1104*4882a593Smuzhiyun 
input_apanel_init(void)1105*4882a593Smuzhiyun static void __init input_apanel_init(void)
1106*4882a593Smuzhiyun {
1107*4882a593Smuzhiyun 	void __iomem *bios;
1108*4882a593Smuzhiyun 	const void __iomem *p;
1109*4882a593Smuzhiyun 
1110*4882a593Smuzhiyun 	bios = ioremap(0xF0000, 0x10000); /* Can't fail */
1111*4882a593Smuzhiyun 	p = bios_signature(bios);
1112*4882a593Smuzhiyun 	if (p) {
1113*4882a593Smuzhiyun 		/* just use the first address */
1114*4882a593Smuzhiyun 		apanel_addr = readb(p + 8 + 3) >> 1;
1115*4882a593Smuzhiyun 	}
1116*4882a593Smuzhiyun 	iounmap(bios);
1117*4882a593Smuzhiyun }
1118*4882a593Smuzhiyun 
1119*4882a593Smuzhiyun struct dmi_onboard_device_info {
1120*4882a593Smuzhiyun 	const char *name;
1121*4882a593Smuzhiyun 	u8 type;
1122*4882a593Smuzhiyun 	unsigned short i2c_addr;
1123*4882a593Smuzhiyun 	const char *i2c_type;
1124*4882a593Smuzhiyun };
1125*4882a593Smuzhiyun 
1126*4882a593Smuzhiyun static const struct dmi_onboard_device_info dmi_devices[] = {
1127*4882a593Smuzhiyun 	{ "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" },
1128*4882a593Smuzhiyun 	{ "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" },
1129*4882a593Smuzhiyun 	{ "Hades",  DMI_DEV_TYPE_OTHER, 0x73, "fschds" },
1130*4882a593Smuzhiyun };
1131*4882a593Smuzhiyun 
dmi_check_onboard_device(u8 type,const char * name,struct i2c_adapter * adap)1132*4882a593Smuzhiyun static void dmi_check_onboard_device(u8 type, const char *name,
1133*4882a593Smuzhiyun 				     struct i2c_adapter *adap)
1134*4882a593Smuzhiyun {
1135*4882a593Smuzhiyun 	int i;
1136*4882a593Smuzhiyun 	struct i2c_board_info info;
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(dmi_devices); i++) {
1139*4882a593Smuzhiyun 		/* & ~0x80, ignore enabled/disabled bit */
1140*4882a593Smuzhiyun 		if ((type & ~0x80) != dmi_devices[i].type)
1141*4882a593Smuzhiyun 			continue;
1142*4882a593Smuzhiyun 		if (strcasecmp(name, dmi_devices[i].name))
1143*4882a593Smuzhiyun 			continue;
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun 		memset(&info, 0, sizeof(struct i2c_board_info));
1146*4882a593Smuzhiyun 		info.addr = dmi_devices[i].i2c_addr;
1147*4882a593Smuzhiyun 		strlcpy(info.type, dmi_devices[i].i2c_type, I2C_NAME_SIZE);
1148*4882a593Smuzhiyun 		i2c_new_client_device(adap, &info);
1149*4882a593Smuzhiyun 		break;
1150*4882a593Smuzhiyun 	}
1151*4882a593Smuzhiyun }
1152*4882a593Smuzhiyun 
1153*4882a593Smuzhiyun /* We use our own function to check for onboard devices instead of
1154*4882a593Smuzhiyun    dmi_find_device() as some buggy BIOS's have the devices we are interested
1155*4882a593Smuzhiyun    in marked as disabled */
dmi_check_onboard_devices(const struct dmi_header * dm,void * adap)1156*4882a593Smuzhiyun static void dmi_check_onboard_devices(const struct dmi_header *dm, void *adap)
1157*4882a593Smuzhiyun {
1158*4882a593Smuzhiyun 	int i, count;
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 	if (dm->type != 10)
1161*4882a593Smuzhiyun 		return;
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 	count = (dm->length - sizeof(struct dmi_header)) / 2;
1164*4882a593Smuzhiyun 	for (i = 0; i < count; i++) {
1165*4882a593Smuzhiyun 		const u8 *d = (char *)(dm + 1) + (i * 2);
1166*4882a593Smuzhiyun 		const char *name = ((char *) dm) + dm->length;
1167*4882a593Smuzhiyun 		u8 type = d[0];
1168*4882a593Smuzhiyun 		u8 s = d[1];
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun 		if (!s)
1171*4882a593Smuzhiyun 			continue;
1172*4882a593Smuzhiyun 		s--;
1173*4882a593Smuzhiyun 		while (s > 0 && name[0]) {
1174*4882a593Smuzhiyun 			name += strlen(name) + 1;
1175*4882a593Smuzhiyun 			s--;
1176*4882a593Smuzhiyun 		}
1177*4882a593Smuzhiyun 		if (name[0] == 0) /* Bogus string reference */
1178*4882a593Smuzhiyun 			continue;
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 		dmi_check_onboard_device(type, name, adap);
1181*4882a593Smuzhiyun 	}
1182*4882a593Smuzhiyun }
1183*4882a593Smuzhiyun 
1184*4882a593Smuzhiyun /* NOTE: Keep this list in sync with drivers/platform/x86/dell-smo8800.c */
1185*4882a593Smuzhiyun static const char *const acpi_smo8800_ids[] = {
1186*4882a593Smuzhiyun 	"SMO8800",
1187*4882a593Smuzhiyun 	"SMO8801",
1188*4882a593Smuzhiyun 	"SMO8810",
1189*4882a593Smuzhiyun 	"SMO8811",
1190*4882a593Smuzhiyun 	"SMO8820",
1191*4882a593Smuzhiyun 	"SMO8821",
1192*4882a593Smuzhiyun 	"SMO8830",
1193*4882a593Smuzhiyun 	"SMO8831",
1194*4882a593Smuzhiyun };
1195*4882a593Smuzhiyun 
check_acpi_smo88xx_device(acpi_handle obj_handle,u32 nesting_level,void * context,void ** return_value)1196*4882a593Smuzhiyun static acpi_status check_acpi_smo88xx_device(acpi_handle obj_handle,
1197*4882a593Smuzhiyun 					     u32 nesting_level,
1198*4882a593Smuzhiyun 					     void *context,
1199*4882a593Smuzhiyun 					     void **return_value)
1200*4882a593Smuzhiyun {
1201*4882a593Smuzhiyun 	struct acpi_device_info *info;
1202*4882a593Smuzhiyun 	acpi_status status;
1203*4882a593Smuzhiyun 	char *hid;
1204*4882a593Smuzhiyun 	int i;
1205*4882a593Smuzhiyun 
1206*4882a593Smuzhiyun 	status = acpi_get_object_info(obj_handle, &info);
1207*4882a593Smuzhiyun 	if (ACPI_FAILURE(status))
1208*4882a593Smuzhiyun 		return AE_OK;
1209*4882a593Smuzhiyun 
1210*4882a593Smuzhiyun 	if (!(info->valid & ACPI_VALID_HID))
1211*4882a593Smuzhiyun 		goto smo88xx_not_found;
1212*4882a593Smuzhiyun 
1213*4882a593Smuzhiyun 	hid = info->hardware_id.string;
1214*4882a593Smuzhiyun 	if (!hid)
1215*4882a593Smuzhiyun 		goto smo88xx_not_found;
1216*4882a593Smuzhiyun 
1217*4882a593Smuzhiyun 	i = match_string(acpi_smo8800_ids, ARRAY_SIZE(acpi_smo8800_ids), hid);
1218*4882a593Smuzhiyun 	if (i < 0)
1219*4882a593Smuzhiyun 		goto smo88xx_not_found;
1220*4882a593Smuzhiyun 
1221*4882a593Smuzhiyun 	kfree(info);
1222*4882a593Smuzhiyun 
1223*4882a593Smuzhiyun 	*((bool *)return_value) = true;
1224*4882a593Smuzhiyun 	return AE_CTRL_TERMINATE;
1225*4882a593Smuzhiyun 
1226*4882a593Smuzhiyun smo88xx_not_found:
1227*4882a593Smuzhiyun 	kfree(info);
1228*4882a593Smuzhiyun 	return AE_OK;
1229*4882a593Smuzhiyun }
1230*4882a593Smuzhiyun 
is_dell_system_with_lis3lv02d(void)1231*4882a593Smuzhiyun static bool is_dell_system_with_lis3lv02d(void)
1232*4882a593Smuzhiyun {
1233*4882a593Smuzhiyun 	bool found;
1234*4882a593Smuzhiyun 	const char *vendor;
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun 	vendor = dmi_get_system_info(DMI_SYS_VENDOR);
1237*4882a593Smuzhiyun 	if (!vendor || strcmp(vendor, "Dell Inc."))
1238*4882a593Smuzhiyun 		return false;
1239*4882a593Smuzhiyun 
1240*4882a593Smuzhiyun 	/*
1241*4882a593Smuzhiyun 	 * Check that ACPI device SMO88xx is present and is functioning.
1242*4882a593Smuzhiyun 	 * Function acpi_get_devices() already filters all ACPI devices
1243*4882a593Smuzhiyun 	 * which are not present or are not functioning.
1244*4882a593Smuzhiyun 	 * ACPI device SMO88xx represents our ST microelectronics lis3lv02d
1245*4882a593Smuzhiyun 	 * accelerometer but unfortunately ACPI does not provide any other
1246*4882a593Smuzhiyun 	 * information (like I2C address).
1247*4882a593Smuzhiyun 	 */
1248*4882a593Smuzhiyun 	found = false;
1249*4882a593Smuzhiyun 	acpi_get_devices(NULL, check_acpi_smo88xx_device, NULL,
1250*4882a593Smuzhiyun 			 (void **)&found);
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun 	return found;
1253*4882a593Smuzhiyun }
1254*4882a593Smuzhiyun 
1255*4882a593Smuzhiyun /*
1256*4882a593Smuzhiyun  * Accelerometer's I2C address is not specified in DMI nor ACPI,
1257*4882a593Smuzhiyun  * so it is needed to define mapping table based on DMI product names.
1258*4882a593Smuzhiyun  */
1259*4882a593Smuzhiyun static const struct {
1260*4882a593Smuzhiyun 	const char *dmi_product_name;
1261*4882a593Smuzhiyun 	unsigned short i2c_addr;
1262*4882a593Smuzhiyun } dell_lis3lv02d_devices[] = {
1263*4882a593Smuzhiyun 	/*
1264*4882a593Smuzhiyun 	 * Dell platform team told us that these Latitude devices have
1265*4882a593Smuzhiyun 	 * ST microelectronics accelerometer at I2C address 0x29.
1266*4882a593Smuzhiyun 	 */
1267*4882a593Smuzhiyun 	{ "Latitude E5250",     0x29 },
1268*4882a593Smuzhiyun 	{ "Latitude E5450",     0x29 },
1269*4882a593Smuzhiyun 	{ "Latitude E5550",     0x29 },
1270*4882a593Smuzhiyun 	{ "Latitude E6440",     0x29 },
1271*4882a593Smuzhiyun 	{ "Latitude E6440 ATG", 0x29 },
1272*4882a593Smuzhiyun 	{ "Latitude E6540",     0x29 },
1273*4882a593Smuzhiyun 	/*
1274*4882a593Smuzhiyun 	 * Additional individual entries were added after verification.
1275*4882a593Smuzhiyun 	 */
1276*4882a593Smuzhiyun 	{ "Latitude 5480",      0x29 },
1277*4882a593Smuzhiyun 	{ "Vostro V131",        0x1d },
1278*4882a593Smuzhiyun 	{ "Vostro 5568",        0x29 },
1279*4882a593Smuzhiyun };
1280*4882a593Smuzhiyun 
register_dell_lis3lv02d_i2c_device(struct i801_priv * priv)1281*4882a593Smuzhiyun static void register_dell_lis3lv02d_i2c_device(struct i801_priv *priv)
1282*4882a593Smuzhiyun {
1283*4882a593Smuzhiyun 	struct i2c_board_info info;
1284*4882a593Smuzhiyun 	const char *dmi_product_name;
1285*4882a593Smuzhiyun 	int i;
1286*4882a593Smuzhiyun 
1287*4882a593Smuzhiyun 	dmi_product_name = dmi_get_system_info(DMI_PRODUCT_NAME);
1288*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(dell_lis3lv02d_devices); ++i) {
1289*4882a593Smuzhiyun 		if (strcmp(dmi_product_name,
1290*4882a593Smuzhiyun 			   dell_lis3lv02d_devices[i].dmi_product_name) == 0)
1291*4882a593Smuzhiyun 			break;
1292*4882a593Smuzhiyun 	}
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun 	if (i == ARRAY_SIZE(dell_lis3lv02d_devices)) {
1295*4882a593Smuzhiyun 		dev_warn(&priv->pci_dev->dev,
1296*4882a593Smuzhiyun 			 "Accelerometer lis3lv02d is present on SMBus but its"
1297*4882a593Smuzhiyun 			 " address is unknown, skipping registration\n");
1298*4882a593Smuzhiyun 		return;
1299*4882a593Smuzhiyun 	}
1300*4882a593Smuzhiyun 
1301*4882a593Smuzhiyun 	memset(&info, 0, sizeof(struct i2c_board_info));
1302*4882a593Smuzhiyun 	info.addr = dell_lis3lv02d_devices[i].i2c_addr;
1303*4882a593Smuzhiyun 	strlcpy(info.type, "lis3lv02d", I2C_NAME_SIZE);
1304*4882a593Smuzhiyun 	i2c_new_client_device(&priv->adapter, &info);
1305*4882a593Smuzhiyun }
1306*4882a593Smuzhiyun 
1307*4882a593Smuzhiyun /* Register optional slaves */
i801_probe_optional_slaves(struct i801_priv * priv)1308*4882a593Smuzhiyun static void i801_probe_optional_slaves(struct i801_priv *priv)
1309*4882a593Smuzhiyun {
1310*4882a593Smuzhiyun 	/* Only register slaves on main SMBus channel */
1311*4882a593Smuzhiyun 	if (priv->features & FEATURE_IDF)
1312*4882a593Smuzhiyun 		return;
1313*4882a593Smuzhiyun 
1314*4882a593Smuzhiyun 	if (apanel_addr) {
1315*4882a593Smuzhiyun 		struct i2c_board_info info;
1316*4882a593Smuzhiyun 
1317*4882a593Smuzhiyun 		memset(&info, 0, sizeof(struct i2c_board_info));
1318*4882a593Smuzhiyun 		info.addr = apanel_addr;
1319*4882a593Smuzhiyun 		strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
1320*4882a593Smuzhiyun 		i2c_new_client_device(&priv->adapter, &info);
1321*4882a593Smuzhiyun 	}
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun 	if (dmi_name_in_vendors("FUJITSU"))
1324*4882a593Smuzhiyun 		dmi_walk(dmi_check_onboard_devices, &priv->adapter);
1325*4882a593Smuzhiyun 
1326*4882a593Smuzhiyun 	if (is_dell_system_with_lis3lv02d())
1327*4882a593Smuzhiyun 		register_dell_lis3lv02d_i2c_device(priv);
1328*4882a593Smuzhiyun 
1329*4882a593Smuzhiyun 	/* Instantiate SPD EEPROMs unless the SMBus is multiplexed */
1330*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_I2C_MUX_GPIO)
1331*4882a593Smuzhiyun 	if (!priv->mux_drvdata)
1332*4882a593Smuzhiyun #endif
1333*4882a593Smuzhiyun 		i2c_register_spd(&priv->adapter);
1334*4882a593Smuzhiyun }
1335*4882a593Smuzhiyun #else
input_apanel_init(void)1336*4882a593Smuzhiyun static void __init input_apanel_init(void) {}
i801_probe_optional_slaves(struct i801_priv * priv)1337*4882a593Smuzhiyun static void i801_probe_optional_slaves(struct i801_priv *priv) {}
1338*4882a593Smuzhiyun #endif	/* CONFIG_X86 && CONFIG_DMI */
1339*4882a593Smuzhiyun 
1340*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_I2C_MUX_GPIO) && defined CONFIG_DMI
1341*4882a593Smuzhiyun static struct i801_mux_config i801_mux_config_asus_z8_d12 = {
1342*4882a593Smuzhiyun 	.gpio_chip = "gpio_ich",
1343*4882a593Smuzhiyun 	.values = { 0x02, 0x03 },
1344*4882a593Smuzhiyun 	.n_values = 2,
1345*4882a593Smuzhiyun 	.classes = { I2C_CLASS_SPD, I2C_CLASS_SPD },
1346*4882a593Smuzhiyun 	.gpios = { 52, 53 },
1347*4882a593Smuzhiyun 	.n_gpios = 2,
1348*4882a593Smuzhiyun };
1349*4882a593Smuzhiyun 
1350*4882a593Smuzhiyun static struct i801_mux_config i801_mux_config_asus_z8_d18 = {
1351*4882a593Smuzhiyun 	.gpio_chip = "gpio_ich",
1352*4882a593Smuzhiyun 	.values = { 0x02, 0x03, 0x01 },
1353*4882a593Smuzhiyun 	.n_values = 3,
1354*4882a593Smuzhiyun 	.classes = { I2C_CLASS_SPD, I2C_CLASS_SPD, I2C_CLASS_SPD },
1355*4882a593Smuzhiyun 	.gpios = { 52, 53 },
1356*4882a593Smuzhiyun 	.n_gpios = 2,
1357*4882a593Smuzhiyun };
1358*4882a593Smuzhiyun 
1359*4882a593Smuzhiyun static const struct dmi_system_id mux_dmi_table[] = {
1360*4882a593Smuzhiyun 	{
1361*4882a593Smuzhiyun 		.matches = {
1362*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1363*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"),
1364*4882a593Smuzhiyun 		},
1365*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1366*4882a593Smuzhiyun 	},
1367*4882a593Smuzhiyun 	{
1368*4882a593Smuzhiyun 		.matches = {
1369*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1370*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"),
1371*4882a593Smuzhiyun 		},
1372*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1373*4882a593Smuzhiyun 	},
1374*4882a593Smuzhiyun 	{
1375*4882a593Smuzhiyun 		.matches = {
1376*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1377*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"),
1378*4882a593Smuzhiyun 		},
1379*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1380*4882a593Smuzhiyun 	},
1381*4882a593Smuzhiyun 	{
1382*4882a593Smuzhiyun 		.matches = {
1383*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1384*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"),
1385*4882a593Smuzhiyun 		},
1386*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1387*4882a593Smuzhiyun 	},
1388*4882a593Smuzhiyun 	{
1389*4882a593Smuzhiyun 		.matches = {
1390*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1391*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"),
1392*4882a593Smuzhiyun 		},
1393*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1394*4882a593Smuzhiyun 	},
1395*4882a593Smuzhiyun 	{
1396*4882a593Smuzhiyun 		.matches = {
1397*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1398*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"),
1399*4882a593Smuzhiyun 		},
1400*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1401*4882a593Smuzhiyun 	},
1402*4882a593Smuzhiyun 	{
1403*4882a593Smuzhiyun 		.matches = {
1404*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1405*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"),
1406*4882a593Smuzhiyun 		},
1407*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d18,
1408*4882a593Smuzhiyun 	},
1409*4882a593Smuzhiyun 	{
1410*4882a593Smuzhiyun 		.matches = {
1411*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1412*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"),
1413*4882a593Smuzhiyun 		},
1414*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d18,
1415*4882a593Smuzhiyun 	},
1416*4882a593Smuzhiyun 	{
1417*4882a593Smuzhiyun 		.matches = {
1418*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1419*4882a593Smuzhiyun 			DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"),
1420*4882a593Smuzhiyun 		},
1421*4882a593Smuzhiyun 		.driver_data = &i801_mux_config_asus_z8_d12,
1422*4882a593Smuzhiyun 	},
1423*4882a593Smuzhiyun 	{ }
1424*4882a593Smuzhiyun };
1425*4882a593Smuzhiyun 
1426*4882a593Smuzhiyun /* Setup multiplexing if needed */
i801_add_mux(struct i801_priv * priv)1427*4882a593Smuzhiyun static int i801_add_mux(struct i801_priv *priv)
1428*4882a593Smuzhiyun {
1429*4882a593Smuzhiyun 	struct device *dev = &priv->adapter.dev;
1430*4882a593Smuzhiyun 	const struct i801_mux_config *mux_config;
1431*4882a593Smuzhiyun 	struct i2c_mux_gpio_platform_data gpio_data;
1432*4882a593Smuzhiyun 	struct gpiod_lookup_table *lookup;
1433*4882a593Smuzhiyun 	int err, i;
1434*4882a593Smuzhiyun 
1435*4882a593Smuzhiyun 	if (!priv->mux_drvdata)
1436*4882a593Smuzhiyun 		return 0;
1437*4882a593Smuzhiyun 	mux_config = priv->mux_drvdata;
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun 	/* Prepare the platform data */
1440*4882a593Smuzhiyun 	memset(&gpio_data, 0, sizeof(struct i2c_mux_gpio_platform_data));
1441*4882a593Smuzhiyun 	gpio_data.parent = priv->adapter.nr;
1442*4882a593Smuzhiyun 	gpio_data.values = mux_config->values;
1443*4882a593Smuzhiyun 	gpio_data.n_values = mux_config->n_values;
1444*4882a593Smuzhiyun 	gpio_data.classes = mux_config->classes;
1445*4882a593Smuzhiyun 	gpio_data.idle = I2C_MUX_GPIO_NO_IDLE;
1446*4882a593Smuzhiyun 
1447*4882a593Smuzhiyun 	/* Register GPIO descriptor lookup table */
1448*4882a593Smuzhiyun 	lookup = devm_kzalloc(dev,
1449*4882a593Smuzhiyun 			      struct_size(lookup, table, mux_config->n_gpios + 1),
1450*4882a593Smuzhiyun 			      GFP_KERNEL);
1451*4882a593Smuzhiyun 	if (!lookup)
1452*4882a593Smuzhiyun 		return -ENOMEM;
1453*4882a593Smuzhiyun 	lookup->dev_id = "i2c-mux-gpio";
1454*4882a593Smuzhiyun 	for (i = 0; i < mux_config->n_gpios; i++) {
1455*4882a593Smuzhiyun 		lookup->table[i] = (struct gpiod_lookup)
1456*4882a593Smuzhiyun 			GPIO_LOOKUP(mux_config->gpio_chip,
1457*4882a593Smuzhiyun 				    mux_config->gpios[i], "mux", 0);
1458*4882a593Smuzhiyun 	}
1459*4882a593Smuzhiyun 	gpiod_add_lookup_table(lookup);
1460*4882a593Smuzhiyun 	priv->lookup = lookup;
1461*4882a593Smuzhiyun 
1462*4882a593Smuzhiyun 	/*
1463*4882a593Smuzhiyun 	 * Register the mux device, we use PLATFORM_DEVID_NONE here
1464*4882a593Smuzhiyun 	 * because since we are referring to the GPIO chip by name we are
1465*4882a593Smuzhiyun 	 * anyways in deep trouble if there is more than one of these
1466*4882a593Smuzhiyun 	 * devices, and there should likely only be one platform controller
1467*4882a593Smuzhiyun 	 * hub.
1468*4882a593Smuzhiyun 	 */
1469*4882a593Smuzhiyun 	priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio",
1470*4882a593Smuzhiyun 				PLATFORM_DEVID_NONE, &gpio_data,
1471*4882a593Smuzhiyun 				sizeof(struct i2c_mux_gpio_platform_data));
1472*4882a593Smuzhiyun 	if (IS_ERR(priv->mux_pdev)) {
1473*4882a593Smuzhiyun 		err = PTR_ERR(priv->mux_pdev);
1474*4882a593Smuzhiyun 		gpiod_remove_lookup_table(lookup);
1475*4882a593Smuzhiyun 		priv->mux_pdev = NULL;
1476*4882a593Smuzhiyun 		dev_err(dev, "Failed to register i2c-mux-gpio device\n");
1477*4882a593Smuzhiyun 		return err;
1478*4882a593Smuzhiyun 	}
1479*4882a593Smuzhiyun 
1480*4882a593Smuzhiyun 	return 0;
1481*4882a593Smuzhiyun }
1482*4882a593Smuzhiyun 
i801_del_mux(struct i801_priv * priv)1483*4882a593Smuzhiyun static void i801_del_mux(struct i801_priv *priv)
1484*4882a593Smuzhiyun {
1485*4882a593Smuzhiyun 	if (priv->mux_pdev)
1486*4882a593Smuzhiyun 		platform_device_unregister(priv->mux_pdev);
1487*4882a593Smuzhiyun 	if (priv->lookup)
1488*4882a593Smuzhiyun 		gpiod_remove_lookup_table(priv->lookup);
1489*4882a593Smuzhiyun }
1490*4882a593Smuzhiyun 
i801_get_adapter_class(struct i801_priv * priv)1491*4882a593Smuzhiyun static unsigned int i801_get_adapter_class(struct i801_priv *priv)
1492*4882a593Smuzhiyun {
1493*4882a593Smuzhiyun 	const struct dmi_system_id *id;
1494*4882a593Smuzhiyun 	const struct i801_mux_config *mux_config;
1495*4882a593Smuzhiyun 	unsigned int class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
1496*4882a593Smuzhiyun 	int i;
1497*4882a593Smuzhiyun 
1498*4882a593Smuzhiyun 	id = dmi_first_match(mux_dmi_table);
1499*4882a593Smuzhiyun 	if (id) {
1500*4882a593Smuzhiyun 		/* Remove branch classes from trunk */
1501*4882a593Smuzhiyun 		mux_config = id->driver_data;
1502*4882a593Smuzhiyun 		for (i = 0; i < mux_config->n_values; i++)
1503*4882a593Smuzhiyun 			class &= ~mux_config->classes[i];
1504*4882a593Smuzhiyun 
1505*4882a593Smuzhiyun 		/* Remember for later */
1506*4882a593Smuzhiyun 		priv->mux_drvdata = mux_config;
1507*4882a593Smuzhiyun 	}
1508*4882a593Smuzhiyun 
1509*4882a593Smuzhiyun 	return class;
1510*4882a593Smuzhiyun }
1511*4882a593Smuzhiyun #else
i801_add_mux(struct i801_priv * priv)1512*4882a593Smuzhiyun static inline int i801_add_mux(struct i801_priv *priv) { return 0; }
i801_del_mux(struct i801_priv * priv)1513*4882a593Smuzhiyun static inline void i801_del_mux(struct i801_priv *priv) { }
1514*4882a593Smuzhiyun 
i801_get_adapter_class(struct i801_priv * priv)1515*4882a593Smuzhiyun static inline unsigned int i801_get_adapter_class(struct i801_priv *priv)
1516*4882a593Smuzhiyun {
1517*4882a593Smuzhiyun 	return I2C_CLASS_HWMON | I2C_CLASS_SPD;
1518*4882a593Smuzhiyun }
1519*4882a593Smuzhiyun #endif
1520*4882a593Smuzhiyun 
1521*4882a593Smuzhiyun static const struct itco_wdt_platform_data spt_tco_platform_data = {
1522*4882a593Smuzhiyun 	.name = "Intel PCH",
1523*4882a593Smuzhiyun 	.version = 4,
1524*4882a593Smuzhiyun };
1525*4882a593Smuzhiyun 
1526*4882a593Smuzhiyun static DEFINE_SPINLOCK(p2sb_spinlock);
1527*4882a593Smuzhiyun 
1528*4882a593Smuzhiyun static struct platform_device *
i801_add_tco_spt(struct i801_priv * priv,struct pci_dev * pci_dev,struct resource * tco_res)1529*4882a593Smuzhiyun i801_add_tco_spt(struct i801_priv *priv, struct pci_dev *pci_dev,
1530*4882a593Smuzhiyun 		 struct resource *tco_res)
1531*4882a593Smuzhiyun {
1532*4882a593Smuzhiyun 	struct resource *res;
1533*4882a593Smuzhiyun 	unsigned int devfn;
1534*4882a593Smuzhiyun 	u64 base64_addr;
1535*4882a593Smuzhiyun 	u32 base_addr;
1536*4882a593Smuzhiyun 	u8 hidden;
1537*4882a593Smuzhiyun 
1538*4882a593Smuzhiyun 	/*
1539*4882a593Smuzhiyun 	 * We must access the NO_REBOOT bit over the Primary to Sideband
1540*4882a593Smuzhiyun 	 * bridge (P2SB). The BIOS prevents the P2SB device from being
1541*4882a593Smuzhiyun 	 * enumerated by the PCI subsystem, so we need to unhide/hide it
1542*4882a593Smuzhiyun 	 * to lookup the P2SB BAR.
1543*4882a593Smuzhiyun 	 */
1544*4882a593Smuzhiyun 	spin_lock(&p2sb_spinlock);
1545*4882a593Smuzhiyun 
1546*4882a593Smuzhiyun 	devfn = PCI_DEVFN(PCI_SLOT(pci_dev->devfn), 1);
1547*4882a593Smuzhiyun 
1548*4882a593Smuzhiyun 	/* Unhide the P2SB device, if it is hidden */
1549*4882a593Smuzhiyun 	pci_bus_read_config_byte(pci_dev->bus, devfn, 0xe1, &hidden);
1550*4882a593Smuzhiyun 	if (hidden)
1551*4882a593Smuzhiyun 		pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, 0x0);
1552*4882a593Smuzhiyun 
1553*4882a593Smuzhiyun 	pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR, &base_addr);
1554*4882a593Smuzhiyun 	base64_addr = base_addr & 0xfffffff0;
1555*4882a593Smuzhiyun 
1556*4882a593Smuzhiyun 	pci_bus_read_config_dword(pci_dev->bus, devfn, SBREG_BAR + 0x4, &base_addr);
1557*4882a593Smuzhiyun 	base64_addr |= (u64)base_addr << 32;
1558*4882a593Smuzhiyun 
1559*4882a593Smuzhiyun 	/* Hide the P2SB device, if it was hidden before */
1560*4882a593Smuzhiyun 	if (hidden)
1561*4882a593Smuzhiyun 		pci_bus_write_config_byte(pci_dev->bus, devfn, 0xe1, hidden);
1562*4882a593Smuzhiyun 	spin_unlock(&p2sb_spinlock);
1563*4882a593Smuzhiyun 
1564*4882a593Smuzhiyun 	res = &tco_res[1];
1565*4882a593Smuzhiyun 	if (pci_dev->device == PCI_DEVICE_ID_INTEL_DNV_SMBUS)
1566*4882a593Smuzhiyun 		res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL_DNV;
1567*4882a593Smuzhiyun 	else
1568*4882a593Smuzhiyun 		res->start = (resource_size_t)base64_addr + SBREG_SMBCTRL;
1569*4882a593Smuzhiyun 
1570*4882a593Smuzhiyun 	res->end = res->start + 3;
1571*4882a593Smuzhiyun 	res->flags = IORESOURCE_MEM;
1572*4882a593Smuzhiyun 
1573*4882a593Smuzhiyun 	return platform_device_register_resndata(&pci_dev->dev, "iTCO_wdt", -1,
1574*4882a593Smuzhiyun 					tco_res, 2, &spt_tco_platform_data,
1575*4882a593Smuzhiyun 					sizeof(spt_tco_platform_data));
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun 
1578*4882a593Smuzhiyun static const struct itco_wdt_platform_data cnl_tco_platform_data = {
1579*4882a593Smuzhiyun 	.name = "Intel PCH",
1580*4882a593Smuzhiyun 	.version = 6,
1581*4882a593Smuzhiyun };
1582*4882a593Smuzhiyun 
1583*4882a593Smuzhiyun static struct platform_device *
i801_add_tco_cnl(struct i801_priv * priv,struct pci_dev * pci_dev,struct resource * tco_res)1584*4882a593Smuzhiyun i801_add_tco_cnl(struct i801_priv *priv, struct pci_dev *pci_dev,
1585*4882a593Smuzhiyun 		 struct resource *tco_res)
1586*4882a593Smuzhiyun {
1587*4882a593Smuzhiyun 	return platform_device_register_resndata(&pci_dev->dev,
1588*4882a593Smuzhiyun 			"iTCO_wdt", -1, tco_res, 1, &cnl_tco_platform_data,
1589*4882a593Smuzhiyun 			sizeof(cnl_tco_platform_data));
1590*4882a593Smuzhiyun }
1591*4882a593Smuzhiyun 
i801_add_tco(struct i801_priv * priv)1592*4882a593Smuzhiyun static void i801_add_tco(struct i801_priv *priv)
1593*4882a593Smuzhiyun {
1594*4882a593Smuzhiyun 	struct pci_dev *pci_dev = priv->pci_dev;
1595*4882a593Smuzhiyun 	struct resource tco_res[2], *res;
1596*4882a593Smuzhiyun 	u32 tco_base, tco_ctl;
1597*4882a593Smuzhiyun 
1598*4882a593Smuzhiyun 	/* If we have ACPI based watchdog use that instead */
1599*4882a593Smuzhiyun 	if (acpi_has_watchdog())
1600*4882a593Smuzhiyun 		return;
1601*4882a593Smuzhiyun 
1602*4882a593Smuzhiyun 	if (!(priv->features & (FEATURE_TCO_SPT | FEATURE_TCO_CNL)))
1603*4882a593Smuzhiyun 		return;
1604*4882a593Smuzhiyun 
1605*4882a593Smuzhiyun 	pci_read_config_dword(pci_dev, TCOBASE, &tco_base);
1606*4882a593Smuzhiyun 	pci_read_config_dword(pci_dev, TCOCTL, &tco_ctl);
1607*4882a593Smuzhiyun 	if (!(tco_ctl & TCOCTL_EN))
1608*4882a593Smuzhiyun 		return;
1609*4882a593Smuzhiyun 
1610*4882a593Smuzhiyun 	memset(tco_res, 0, sizeof(tco_res));
1611*4882a593Smuzhiyun 	/*
1612*4882a593Smuzhiyun 	 * Always populate the main iTCO IO resource here. The second entry
1613*4882a593Smuzhiyun 	 * for NO_REBOOT MMIO is filled by the SPT specific function.
1614*4882a593Smuzhiyun 	 */
1615*4882a593Smuzhiyun 	res = &tco_res[0];
1616*4882a593Smuzhiyun 	res->start = tco_base & ~1;
1617*4882a593Smuzhiyun 	res->end = res->start + 32 - 1;
1618*4882a593Smuzhiyun 	res->flags = IORESOURCE_IO;
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun 	if (priv->features & FEATURE_TCO_CNL)
1621*4882a593Smuzhiyun 		priv->tco_pdev = i801_add_tco_cnl(priv, pci_dev, tco_res);
1622*4882a593Smuzhiyun 	else
1623*4882a593Smuzhiyun 		priv->tco_pdev = i801_add_tco_spt(priv, pci_dev, tco_res);
1624*4882a593Smuzhiyun 
1625*4882a593Smuzhiyun 	if (IS_ERR(priv->tco_pdev))
1626*4882a593Smuzhiyun 		dev_warn(&pci_dev->dev, "failed to create iTCO device\n");
1627*4882a593Smuzhiyun }
1628*4882a593Smuzhiyun 
1629*4882a593Smuzhiyun #ifdef CONFIG_ACPI
i801_acpi_is_smbus_ioport(const struct i801_priv * priv,acpi_physical_address address)1630*4882a593Smuzhiyun static bool i801_acpi_is_smbus_ioport(const struct i801_priv *priv,
1631*4882a593Smuzhiyun 				      acpi_physical_address address)
1632*4882a593Smuzhiyun {
1633*4882a593Smuzhiyun 	return address >= priv->smba &&
1634*4882a593Smuzhiyun 	       address <= pci_resource_end(priv->pci_dev, SMBBAR);
1635*4882a593Smuzhiyun }
1636*4882a593Smuzhiyun 
1637*4882a593Smuzhiyun static acpi_status
i801_acpi_io_handler(u32 function,acpi_physical_address address,u32 bits,u64 * value,void * handler_context,void * region_context)1638*4882a593Smuzhiyun i801_acpi_io_handler(u32 function, acpi_physical_address address, u32 bits,
1639*4882a593Smuzhiyun 		     u64 *value, void *handler_context, void *region_context)
1640*4882a593Smuzhiyun {
1641*4882a593Smuzhiyun 	struct i801_priv *priv = handler_context;
1642*4882a593Smuzhiyun 	struct pci_dev *pdev = priv->pci_dev;
1643*4882a593Smuzhiyun 	acpi_status status;
1644*4882a593Smuzhiyun 
1645*4882a593Smuzhiyun 	/*
1646*4882a593Smuzhiyun 	 * Once BIOS AML code touches the OpRegion we warn and inhibit any
1647*4882a593Smuzhiyun 	 * further access from the driver itself. This device is now owned
1648*4882a593Smuzhiyun 	 * by the system firmware.
1649*4882a593Smuzhiyun 	 */
1650*4882a593Smuzhiyun 	mutex_lock(&priv->acpi_lock);
1651*4882a593Smuzhiyun 
1652*4882a593Smuzhiyun 	if (!priv->acpi_reserved && i801_acpi_is_smbus_ioport(priv, address)) {
1653*4882a593Smuzhiyun 		priv->acpi_reserved = true;
1654*4882a593Smuzhiyun 
1655*4882a593Smuzhiyun 		dev_warn(&pdev->dev, "BIOS is accessing SMBus registers\n");
1656*4882a593Smuzhiyun 		dev_warn(&pdev->dev, "Driver SMBus register access inhibited\n");
1657*4882a593Smuzhiyun 
1658*4882a593Smuzhiyun 		/*
1659*4882a593Smuzhiyun 		 * BIOS is accessing the host controller so prevent it from
1660*4882a593Smuzhiyun 		 * suspending automatically from now on.
1661*4882a593Smuzhiyun 		 */
1662*4882a593Smuzhiyun 		pm_runtime_get_sync(&pdev->dev);
1663*4882a593Smuzhiyun 	}
1664*4882a593Smuzhiyun 
1665*4882a593Smuzhiyun 	if ((function & ACPI_IO_MASK) == ACPI_READ)
1666*4882a593Smuzhiyun 		status = acpi_os_read_port(address, (u32 *)value, bits);
1667*4882a593Smuzhiyun 	else
1668*4882a593Smuzhiyun 		status = acpi_os_write_port(address, (u32)*value, bits);
1669*4882a593Smuzhiyun 
1670*4882a593Smuzhiyun 	mutex_unlock(&priv->acpi_lock);
1671*4882a593Smuzhiyun 
1672*4882a593Smuzhiyun 	return status;
1673*4882a593Smuzhiyun }
1674*4882a593Smuzhiyun 
i801_acpi_probe(struct i801_priv * priv)1675*4882a593Smuzhiyun static int i801_acpi_probe(struct i801_priv *priv)
1676*4882a593Smuzhiyun {
1677*4882a593Smuzhiyun 	struct acpi_device *adev;
1678*4882a593Smuzhiyun 	acpi_status status;
1679*4882a593Smuzhiyun 
1680*4882a593Smuzhiyun 	adev = ACPI_COMPANION(&priv->pci_dev->dev);
1681*4882a593Smuzhiyun 	if (adev) {
1682*4882a593Smuzhiyun 		status = acpi_install_address_space_handler(adev->handle,
1683*4882a593Smuzhiyun 				ACPI_ADR_SPACE_SYSTEM_IO, i801_acpi_io_handler,
1684*4882a593Smuzhiyun 				NULL, priv);
1685*4882a593Smuzhiyun 		if (ACPI_SUCCESS(status))
1686*4882a593Smuzhiyun 			return 0;
1687*4882a593Smuzhiyun 	}
1688*4882a593Smuzhiyun 
1689*4882a593Smuzhiyun 	return acpi_check_resource_conflict(&priv->pci_dev->resource[SMBBAR]);
1690*4882a593Smuzhiyun }
1691*4882a593Smuzhiyun 
i801_acpi_remove(struct i801_priv * priv)1692*4882a593Smuzhiyun static void i801_acpi_remove(struct i801_priv *priv)
1693*4882a593Smuzhiyun {
1694*4882a593Smuzhiyun 	struct acpi_device *adev;
1695*4882a593Smuzhiyun 
1696*4882a593Smuzhiyun 	adev = ACPI_COMPANION(&priv->pci_dev->dev);
1697*4882a593Smuzhiyun 	if (!adev)
1698*4882a593Smuzhiyun 		return;
1699*4882a593Smuzhiyun 
1700*4882a593Smuzhiyun 	acpi_remove_address_space_handler(adev->handle,
1701*4882a593Smuzhiyun 		ACPI_ADR_SPACE_SYSTEM_IO, i801_acpi_io_handler);
1702*4882a593Smuzhiyun 
1703*4882a593Smuzhiyun 	mutex_lock(&priv->acpi_lock);
1704*4882a593Smuzhiyun 	if (priv->acpi_reserved)
1705*4882a593Smuzhiyun 		pm_runtime_put(&priv->pci_dev->dev);
1706*4882a593Smuzhiyun 	mutex_unlock(&priv->acpi_lock);
1707*4882a593Smuzhiyun }
1708*4882a593Smuzhiyun #else
i801_acpi_probe(struct i801_priv * priv)1709*4882a593Smuzhiyun static inline int i801_acpi_probe(struct i801_priv *priv) { return 0; }
i801_acpi_remove(struct i801_priv * priv)1710*4882a593Smuzhiyun static inline void i801_acpi_remove(struct i801_priv *priv) { }
1711*4882a593Smuzhiyun #endif
1712*4882a593Smuzhiyun 
i801_setup_hstcfg(struct i801_priv * priv)1713*4882a593Smuzhiyun static unsigned char i801_setup_hstcfg(struct i801_priv *priv)
1714*4882a593Smuzhiyun {
1715*4882a593Smuzhiyun 	unsigned char hstcfg = priv->original_hstcfg;
1716*4882a593Smuzhiyun 
1717*4882a593Smuzhiyun 	hstcfg &= ~SMBHSTCFG_I2C_EN;	/* SMBus timing */
1718*4882a593Smuzhiyun 	hstcfg |= SMBHSTCFG_HST_EN;
1719*4882a593Smuzhiyun 	pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hstcfg);
1720*4882a593Smuzhiyun 	return hstcfg;
1721*4882a593Smuzhiyun }
1722*4882a593Smuzhiyun 
i801_probe(struct pci_dev * dev,const struct pci_device_id * id)1723*4882a593Smuzhiyun static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
1724*4882a593Smuzhiyun {
1725*4882a593Smuzhiyun 	unsigned char temp;
1726*4882a593Smuzhiyun 	int err, i;
1727*4882a593Smuzhiyun 	struct i801_priv *priv;
1728*4882a593Smuzhiyun 
1729*4882a593Smuzhiyun 	priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
1730*4882a593Smuzhiyun 	if (!priv)
1731*4882a593Smuzhiyun 		return -ENOMEM;
1732*4882a593Smuzhiyun 
1733*4882a593Smuzhiyun 	i2c_set_adapdata(&priv->adapter, priv);
1734*4882a593Smuzhiyun 	priv->adapter.owner = THIS_MODULE;
1735*4882a593Smuzhiyun 	priv->adapter.class = i801_get_adapter_class(priv);
1736*4882a593Smuzhiyun 	priv->adapter.algo = &smbus_algorithm;
1737*4882a593Smuzhiyun 	priv->adapter.dev.parent = &dev->dev;
1738*4882a593Smuzhiyun 	ACPI_COMPANION_SET(&priv->adapter.dev, ACPI_COMPANION(&dev->dev));
1739*4882a593Smuzhiyun 	priv->adapter.retries = 3;
1740*4882a593Smuzhiyun 	mutex_init(&priv->acpi_lock);
1741*4882a593Smuzhiyun 
1742*4882a593Smuzhiyun 	priv->pci_dev = dev;
1743*4882a593Smuzhiyun 	switch (dev->device) {
1744*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_H_SMBUS:
1745*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_SMBUS:
1746*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_LEWISBURG_SMBUS:
1747*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_LEWISBURG_SSKU_SMBUS:
1748*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_DNV_SMBUS:
1749*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_KABYLAKE_PCH_H_SMBUS:
1750*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_COMETLAKE_V_SMBUS:
1751*4882a593Smuzhiyun 		priv->features |= FEATURE_BLOCK_PROC;
1752*4882a593Smuzhiyun 		priv->features |= FEATURE_I2C_BLOCK_READ;
1753*4882a593Smuzhiyun 		priv->features |= FEATURE_IRQ;
1754*4882a593Smuzhiyun 		priv->features |= FEATURE_SMBUS_PEC;
1755*4882a593Smuzhiyun 		priv->features |= FEATURE_BLOCK_BUFFER;
1756*4882a593Smuzhiyun 		priv->features |= FEATURE_TCO_SPT;
1757*4882a593Smuzhiyun 		priv->features |= FEATURE_HOST_NOTIFY;
1758*4882a593Smuzhiyun 		break;
1759*4882a593Smuzhiyun 
1760*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_CANNONLAKE_H_SMBUS:
1761*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_CANNONLAKE_LP_SMBUS:
1762*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_CDF_SMBUS:
1763*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_ICELAKE_LP_SMBUS:
1764*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_COMETLAKE_SMBUS:
1765*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_COMETLAKE_H_SMBUS:
1766*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_ELKHART_LAKE_SMBUS:
1767*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_TIGERLAKE_LP_SMBUS:
1768*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_TIGERLAKE_H_SMBUS:
1769*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_JASPER_LAKE_SMBUS:
1770*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_EBG_SMBUS:
1771*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_ALDER_LAKE_S_SMBUS:
1772*4882a593Smuzhiyun 		priv->features |= FEATURE_BLOCK_PROC;
1773*4882a593Smuzhiyun 		priv->features |= FEATURE_I2C_BLOCK_READ;
1774*4882a593Smuzhiyun 		priv->features |= FEATURE_IRQ;
1775*4882a593Smuzhiyun 		priv->features |= FEATURE_SMBUS_PEC;
1776*4882a593Smuzhiyun 		priv->features |= FEATURE_BLOCK_BUFFER;
1777*4882a593Smuzhiyun 		priv->features |= FEATURE_TCO_CNL;
1778*4882a593Smuzhiyun 		priv->features |= FEATURE_HOST_NOTIFY;
1779*4882a593Smuzhiyun 		break;
1780*4882a593Smuzhiyun 
1781*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0:
1782*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1:
1783*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2:
1784*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS0:
1785*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS1:
1786*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2:
1787*4882a593Smuzhiyun 		priv->features |= FEATURE_IDF;
1788*4882a593Smuzhiyun 		fallthrough;
1789*4882a593Smuzhiyun 	default:
1790*4882a593Smuzhiyun 		priv->features |= FEATURE_BLOCK_PROC;
1791*4882a593Smuzhiyun 		priv->features |= FEATURE_I2C_BLOCK_READ;
1792*4882a593Smuzhiyun 		priv->features |= FEATURE_IRQ;
1793*4882a593Smuzhiyun 		fallthrough;
1794*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_82801DB_3:
1795*4882a593Smuzhiyun 		priv->features |= FEATURE_SMBUS_PEC;
1796*4882a593Smuzhiyun 		priv->features |= FEATURE_BLOCK_BUFFER;
1797*4882a593Smuzhiyun 		fallthrough;
1798*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_82801CA_3:
1799*4882a593Smuzhiyun 		priv->features |= FEATURE_HOST_NOTIFY;
1800*4882a593Smuzhiyun 		fallthrough;
1801*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_82801BA_2:
1802*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_82801AB_3:
1803*4882a593Smuzhiyun 	case PCI_DEVICE_ID_INTEL_82801AA_3:
1804*4882a593Smuzhiyun 		break;
1805*4882a593Smuzhiyun 	}
1806*4882a593Smuzhiyun 
1807*4882a593Smuzhiyun 	/* Disable features on user request */
1808*4882a593Smuzhiyun 	for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) {
1809*4882a593Smuzhiyun 		if (priv->features & disable_features & (1 << i))
1810*4882a593Smuzhiyun 			dev_notice(&dev->dev, "%s disabled by user\n",
1811*4882a593Smuzhiyun 				   i801_feature_names[i]);
1812*4882a593Smuzhiyun 	}
1813*4882a593Smuzhiyun 	priv->features &= ~disable_features;
1814*4882a593Smuzhiyun 
1815*4882a593Smuzhiyun 	err = pcim_enable_device(dev);
1816*4882a593Smuzhiyun 	if (err) {
1817*4882a593Smuzhiyun 		dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
1818*4882a593Smuzhiyun 			err);
1819*4882a593Smuzhiyun 		return err;
1820*4882a593Smuzhiyun 	}
1821*4882a593Smuzhiyun 	pcim_pin_device(dev);
1822*4882a593Smuzhiyun 
1823*4882a593Smuzhiyun 	/* Determine the address of the SMBus area */
1824*4882a593Smuzhiyun 	priv->smba = pci_resource_start(dev, SMBBAR);
1825*4882a593Smuzhiyun 	if (!priv->smba) {
1826*4882a593Smuzhiyun 		dev_err(&dev->dev,
1827*4882a593Smuzhiyun 			"SMBus base address uninitialized, upgrade BIOS\n");
1828*4882a593Smuzhiyun 		return -ENODEV;
1829*4882a593Smuzhiyun 	}
1830*4882a593Smuzhiyun 
1831*4882a593Smuzhiyun 	if (i801_acpi_probe(priv))
1832*4882a593Smuzhiyun 		return -ENODEV;
1833*4882a593Smuzhiyun 
1834*4882a593Smuzhiyun 	err = pcim_iomap_regions(dev, 1 << SMBBAR,
1835*4882a593Smuzhiyun 				 dev_driver_string(&dev->dev));
1836*4882a593Smuzhiyun 	if (err) {
1837*4882a593Smuzhiyun 		dev_err(&dev->dev,
1838*4882a593Smuzhiyun 			"Failed to request SMBus region 0x%lx-0x%Lx\n",
1839*4882a593Smuzhiyun 			priv->smba,
1840*4882a593Smuzhiyun 			(unsigned long long)pci_resource_end(dev, SMBBAR));
1841*4882a593Smuzhiyun 		i801_acpi_remove(priv);
1842*4882a593Smuzhiyun 		return err;
1843*4882a593Smuzhiyun 	}
1844*4882a593Smuzhiyun 
1845*4882a593Smuzhiyun 	pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &priv->original_hstcfg);
1846*4882a593Smuzhiyun 	temp = i801_setup_hstcfg(priv);
1847*4882a593Smuzhiyun 	if (!(priv->original_hstcfg & SMBHSTCFG_HST_EN))
1848*4882a593Smuzhiyun 		dev_info(&dev->dev, "Enabling SMBus device\n");
1849*4882a593Smuzhiyun 
1850*4882a593Smuzhiyun 	if (temp & SMBHSTCFG_SMB_SMI_EN) {
1851*4882a593Smuzhiyun 		dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
1852*4882a593Smuzhiyun 		/* Disable SMBus interrupt feature if SMBus using SMI# */
1853*4882a593Smuzhiyun 		priv->features &= ~FEATURE_IRQ;
1854*4882a593Smuzhiyun 	}
1855*4882a593Smuzhiyun 	if (temp & SMBHSTCFG_SPD_WD)
1856*4882a593Smuzhiyun 		dev_info(&dev->dev, "SPD Write Disable is set\n");
1857*4882a593Smuzhiyun 
1858*4882a593Smuzhiyun 	/* Clear special mode bits */
1859*4882a593Smuzhiyun 	if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER))
1860*4882a593Smuzhiyun 		outb_p(inb_p(SMBAUXCTL(priv)) &
1861*4882a593Smuzhiyun 		       ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
1862*4882a593Smuzhiyun 
1863*4882a593Smuzhiyun 	/* Remember original Host Notify setting */
1864*4882a593Smuzhiyun 	if (priv->features & FEATURE_HOST_NOTIFY)
1865*4882a593Smuzhiyun 		priv->original_slvcmd = inb_p(SMBSLVCMD(priv));
1866*4882a593Smuzhiyun 
1867*4882a593Smuzhiyun 	/* Default timeout in interrupt mode: 200 ms */
1868*4882a593Smuzhiyun 	priv->adapter.timeout = HZ / 5;
1869*4882a593Smuzhiyun 
1870*4882a593Smuzhiyun 	if (dev->irq == IRQ_NOTCONNECTED)
1871*4882a593Smuzhiyun 		priv->features &= ~FEATURE_IRQ;
1872*4882a593Smuzhiyun 
1873*4882a593Smuzhiyun 	if (priv->features & FEATURE_IRQ) {
1874*4882a593Smuzhiyun 		u16 pcictl, pcists;
1875*4882a593Smuzhiyun 
1876*4882a593Smuzhiyun 		/* Complain if an interrupt is already pending */
1877*4882a593Smuzhiyun 		pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists);
1878*4882a593Smuzhiyun 		if (pcists & SMBPCISTS_INTS)
1879*4882a593Smuzhiyun 			dev_warn(&dev->dev, "An interrupt is pending!\n");
1880*4882a593Smuzhiyun 
1881*4882a593Smuzhiyun 		/* Check if interrupts have been disabled */
1882*4882a593Smuzhiyun 		pci_read_config_word(priv->pci_dev, SMBPCICTL, &pcictl);
1883*4882a593Smuzhiyun 		if (pcictl & SMBPCICTL_INTDIS) {
1884*4882a593Smuzhiyun 			dev_info(&dev->dev, "Interrupts are disabled\n");
1885*4882a593Smuzhiyun 			priv->features &= ~FEATURE_IRQ;
1886*4882a593Smuzhiyun 		}
1887*4882a593Smuzhiyun 	}
1888*4882a593Smuzhiyun 
1889*4882a593Smuzhiyun 	if (priv->features & FEATURE_IRQ) {
1890*4882a593Smuzhiyun 		init_waitqueue_head(&priv->waitq);
1891*4882a593Smuzhiyun 
1892*4882a593Smuzhiyun 		err = devm_request_irq(&dev->dev, dev->irq, i801_isr,
1893*4882a593Smuzhiyun 				       IRQF_SHARED,
1894*4882a593Smuzhiyun 				       dev_driver_string(&dev->dev), priv);
1895*4882a593Smuzhiyun 		if (err) {
1896*4882a593Smuzhiyun 			dev_err(&dev->dev, "Failed to allocate irq %d: %d\n",
1897*4882a593Smuzhiyun 				dev->irq, err);
1898*4882a593Smuzhiyun 			priv->features &= ~FEATURE_IRQ;
1899*4882a593Smuzhiyun 		}
1900*4882a593Smuzhiyun 	}
1901*4882a593Smuzhiyun 	dev_info(&dev->dev, "SMBus using %s\n",
1902*4882a593Smuzhiyun 		 priv->features & FEATURE_IRQ ? "PCI interrupt" : "polling");
1903*4882a593Smuzhiyun 
1904*4882a593Smuzhiyun 	i801_add_tco(priv);
1905*4882a593Smuzhiyun 
1906*4882a593Smuzhiyun 	snprintf(priv->adapter.name, sizeof(priv->adapter.name),
1907*4882a593Smuzhiyun 		"SMBus I801 adapter at %04lx", priv->smba);
1908*4882a593Smuzhiyun 	err = i2c_add_adapter(&priv->adapter);
1909*4882a593Smuzhiyun 	if (err) {
1910*4882a593Smuzhiyun 		i801_acpi_remove(priv);
1911*4882a593Smuzhiyun 		return err;
1912*4882a593Smuzhiyun 	}
1913*4882a593Smuzhiyun 
1914*4882a593Smuzhiyun 	i801_enable_host_notify(&priv->adapter);
1915*4882a593Smuzhiyun 
1916*4882a593Smuzhiyun 	i801_probe_optional_slaves(priv);
1917*4882a593Smuzhiyun 	/* We ignore errors - multiplexing is optional */
1918*4882a593Smuzhiyun 	i801_add_mux(priv);
1919*4882a593Smuzhiyun 
1920*4882a593Smuzhiyun 	pci_set_drvdata(dev, priv);
1921*4882a593Smuzhiyun 
1922*4882a593Smuzhiyun 	dev_pm_set_driver_flags(&dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);
1923*4882a593Smuzhiyun 	pm_runtime_set_autosuspend_delay(&dev->dev, 1000);
1924*4882a593Smuzhiyun 	pm_runtime_use_autosuspend(&dev->dev);
1925*4882a593Smuzhiyun 	pm_runtime_put_autosuspend(&dev->dev);
1926*4882a593Smuzhiyun 	pm_runtime_allow(&dev->dev);
1927*4882a593Smuzhiyun 
1928*4882a593Smuzhiyun 	return 0;
1929*4882a593Smuzhiyun }
1930*4882a593Smuzhiyun 
i801_remove(struct pci_dev * dev)1931*4882a593Smuzhiyun static void i801_remove(struct pci_dev *dev)
1932*4882a593Smuzhiyun {
1933*4882a593Smuzhiyun 	struct i801_priv *priv = pci_get_drvdata(dev);
1934*4882a593Smuzhiyun 
1935*4882a593Smuzhiyun 	pm_runtime_forbid(&dev->dev);
1936*4882a593Smuzhiyun 	pm_runtime_get_noresume(&dev->dev);
1937*4882a593Smuzhiyun 
1938*4882a593Smuzhiyun 	i801_disable_host_notify(priv);
1939*4882a593Smuzhiyun 	i801_del_mux(priv);
1940*4882a593Smuzhiyun 	i2c_del_adapter(&priv->adapter);
1941*4882a593Smuzhiyun 	i801_acpi_remove(priv);
1942*4882a593Smuzhiyun 	pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
1943*4882a593Smuzhiyun 
1944*4882a593Smuzhiyun 	platform_device_unregister(priv->tco_pdev);
1945*4882a593Smuzhiyun 
1946*4882a593Smuzhiyun 	/*
1947*4882a593Smuzhiyun 	 * do not call pci_disable_device(dev) since it can cause hard hangs on
1948*4882a593Smuzhiyun 	 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
1949*4882a593Smuzhiyun 	 */
1950*4882a593Smuzhiyun }
1951*4882a593Smuzhiyun 
i801_shutdown(struct pci_dev * dev)1952*4882a593Smuzhiyun static void i801_shutdown(struct pci_dev *dev)
1953*4882a593Smuzhiyun {
1954*4882a593Smuzhiyun 	struct i801_priv *priv = pci_get_drvdata(dev);
1955*4882a593Smuzhiyun 
1956*4882a593Smuzhiyun 	/* Restore config registers to avoid hard hang on some systems */
1957*4882a593Smuzhiyun 	i801_disable_host_notify(priv);
1958*4882a593Smuzhiyun 	pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
1959*4882a593Smuzhiyun }
1960*4882a593Smuzhiyun 
1961*4882a593Smuzhiyun #ifdef CONFIG_PM_SLEEP
i801_suspend(struct device * dev)1962*4882a593Smuzhiyun static int i801_suspend(struct device *dev)
1963*4882a593Smuzhiyun {
1964*4882a593Smuzhiyun 	struct i801_priv *priv = dev_get_drvdata(dev);
1965*4882a593Smuzhiyun 
1966*4882a593Smuzhiyun 	pci_write_config_byte(priv->pci_dev, SMBHSTCFG, priv->original_hstcfg);
1967*4882a593Smuzhiyun 	return 0;
1968*4882a593Smuzhiyun }
1969*4882a593Smuzhiyun 
i801_resume(struct device * dev)1970*4882a593Smuzhiyun static int i801_resume(struct device *dev)
1971*4882a593Smuzhiyun {
1972*4882a593Smuzhiyun 	struct i801_priv *priv = dev_get_drvdata(dev);
1973*4882a593Smuzhiyun 
1974*4882a593Smuzhiyun 	i801_setup_hstcfg(priv);
1975*4882a593Smuzhiyun 	i801_enable_host_notify(&priv->adapter);
1976*4882a593Smuzhiyun 
1977*4882a593Smuzhiyun 	return 0;
1978*4882a593Smuzhiyun }
1979*4882a593Smuzhiyun #endif
1980*4882a593Smuzhiyun 
1981*4882a593Smuzhiyun static SIMPLE_DEV_PM_OPS(i801_pm_ops, i801_suspend, i801_resume);
1982*4882a593Smuzhiyun 
1983*4882a593Smuzhiyun static struct pci_driver i801_driver = {
1984*4882a593Smuzhiyun 	.name		= "i801_smbus",
1985*4882a593Smuzhiyun 	.id_table	= i801_ids,
1986*4882a593Smuzhiyun 	.probe		= i801_probe,
1987*4882a593Smuzhiyun 	.remove		= i801_remove,
1988*4882a593Smuzhiyun 	.shutdown	= i801_shutdown,
1989*4882a593Smuzhiyun 	.driver		= {
1990*4882a593Smuzhiyun 		.pm	= &i801_pm_ops,
1991*4882a593Smuzhiyun 	},
1992*4882a593Smuzhiyun };
1993*4882a593Smuzhiyun 
i2c_i801_init(void)1994*4882a593Smuzhiyun static int __init i2c_i801_init(void)
1995*4882a593Smuzhiyun {
1996*4882a593Smuzhiyun 	if (dmi_name_in_vendors("FUJITSU"))
1997*4882a593Smuzhiyun 		input_apanel_init();
1998*4882a593Smuzhiyun 	return pci_register_driver(&i801_driver);
1999*4882a593Smuzhiyun }
2000*4882a593Smuzhiyun 
i2c_i801_exit(void)2001*4882a593Smuzhiyun static void __exit i2c_i801_exit(void)
2002*4882a593Smuzhiyun {
2003*4882a593Smuzhiyun 	pci_unregister_driver(&i801_driver);
2004*4882a593Smuzhiyun }
2005*4882a593Smuzhiyun 
2006*4882a593Smuzhiyun MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>");
2007*4882a593Smuzhiyun MODULE_AUTHOR("Jean Delvare <jdelvare@suse.de>");
2008*4882a593Smuzhiyun MODULE_DESCRIPTION("I801 SMBus driver");
2009*4882a593Smuzhiyun MODULE_LICENSE("GPL");
2010*4882a593Smuzhiyun 
2011*4882a593Smuzhiyun module_init(i2c_i801_init);
2012*4882a593Smuzhiyun module_exit(i2c_i801_exit);
2013