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