blob: bb1d7291cf21620654cf846fa27efc98bda84baa [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 Copyright (c) 1998 - 2002 Frodo Looijaard <frodol@dds.nl>,
3 Philip Edelbrock <phil@netroedge.com>, and Mark D. Studebaker
4 <mdsxyz123@yahoo.com>
Jean Delvare84c1af42012-03-26 21:47:19 +02005 Copyright (C) 2007 - 2012 Jean Delvare <khali@linux-fr.org>
David Woodhouse0cd96eb2010-10-31 21:06:59 +01006 Copyright (C) 2010 Intel Corporation,
7 David Woodhouse <dwmw2@infradead.org>
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22*/
23
24/*
Jean Delvareae7b0492008-01-27 18:14:49 +010025 Supports the following Intel I/O Controller Hubs (ICH):
26
27 I/O Block I2C
28 region SMBus Block proc. block
29 Chip name PCI ID size PEC buffer call read
30 ----------------------------------------------------------------------
31 82801AA (ICH) 0x2413 16 no no no no
32 82801AB (ICH0) 0x2423 16 no no no no
33 82801BA (ICH2) 0x2443 16 no no no no
34 82801CA (ICH3) 0x2483 32 soft no no no
35 82801DB (ICH4) 0x24c3 32 hard yes no no
36 82801E (ICH5) 0x24d3 32 hard yes yes yes
37 6300ESB 0x25a4 32 hard yes yes yes
38 82801F (ICH6) 0x266a 32 hard yes yes yes
39 6310ESB/6320ESB 0x269b 32 hard yes yes yes
40 82801G (ICH7) 0x27da 32 hard yes yes yes
41 82801H (ICH8) 0x283e 32 hard yes yes yes
42 82801I (ICH9) 0x2930 32 hard yes yes yes
Seth Heasleycb04e952010-10-04 13:27:14 -070043 EP80579 (Tolapai) 0x5032 32 hard yes yes yes
Gaston, Jason Dd28dc712008-02-24 20:03:42 +010044 ICH10 0x3a30 32 hard yes yes yes
45 ICH10 0x3a60 32 hard yes yes yes
Seth Heasleycb04e952010-10-04 13:27:14 -070046 5/3400 Series (PCH) 0x3b30 32 hard yes yes yes
Seth Heasley662cda82011-03-20 14:50:53 +010047 6 Series (PCH) 0x1c22 32 hard yes yes yes
Seth Heasleye30d9852010-10-31 21:06:59 +010048 Patsburg (PCH) 0x1d22 32 hard yes yes yes
David Woodhouse55fee8d2010-10-31 21:07:00 +010049 Patsburg (PCH) IDF 0x1d70 32 hard yes yes yes
50 Patsburg (PCH) IDF 0x1d71 32 hard yes yes yes
51 Patsburg (PCH) IDF 0x1d72 32 hard yes yes yes
Seth Heasley662cda82011-03-20 14:50:53 +010052 DH89xxCC (PCH) 0x2330 32 hard yes yes yes
Seth Heasley6e2a8512011-05-24 20:58:49 +020053 Panther Point (PCH) 0x1e22 32 hard yes yes yes
Seth Heasley062737f2012-03-26 21:47:19 +020054 Lynx Point (PCH) 0x8c22 32 hard yes yes yes
James Ralston4a8f1dd2012-09-10 10:14:02 +020055 Lynx Point-LP (PCH) 0x9c22 32 hard yes yes yes
Jean Delvareae7b0492008-01-27 18:14:49 +010056
57 Features supported by this driver:
58 Software PEC no
59 Hardware PEC yes
60 Block buffer yes
61 Block process call transaction no
Jean Delvare63420642008-01-27 18:14:50 +010062 I2C block read transaction yes (doesn't use the block buffer)
David Woodhouse55fee8d2010-10-31 21:07:00 +010063 Slave mode no
Daniel Kurtz636752b2012-07-24 14:13:58 +020064 Interrupt processing yes
Jean Delvareae7b0492008-01-27 18:14:49 +010065
66 See the file Documentation/i2c/busses/i2c-i801 for details.
Linus Torvalds1da177e2005-04-16 15:20:36 -070067*/
68
Daniel Kurtz636752b2012-07-24 14:13:58 +020069#include <linux/interrupt.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070070#include <linux/module.h>
71#include <linux/pci.h>
72#include <linux/kernel.h>
73#include <linux/stddef.h>
74#include <linux/delay.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070075#include <linux/ioport.h>
76#include <linux/init.h>
77#include <linux/i2c.h>
Jean Delvare54fb4a052008-07-14 22:38:33 +020078#include <linux/acpi.h>
Jean Delvare1561bfe2009-01-07 14:29:17 +010079#include <linux/io.h>
Hans de Goedefa5bfab2009-03-30 21:46:44 +020080#include <linux/dmi.h>
Ben Hutchings665a96b2011-01-10 22:11:22 +010081#include <linux/slab.h>
Daniel Kurtz636752b2012-07-24 14:13:58 +020082#include <linux/wait.h>
Jean Delvare3ad7ea12012-10-05 22:23:53 +020083#include <linux/err.h>
84
85#if defined CONFIG_I2C_MUX || defined CONFIG_I2C_MUX_MODULE
86#include <linux/gpio.h>
87#include <linux/i2c-mux-gpio.h>
88#include <linux/platform_device.h>
89#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070090
Linus Torvalds1da177e2005-04-16 15:20:36 -070091/* I801 SMBus address offsets */
David Woodhouse0cd96eb2010-10-31 21:06:59 +010092#define SMBHSTSTS(p) (0 + (p)->smba)
93#define SMBHSTCNT(p) (2 + (p)->smba)
94#define SMBHSTCMD(p) (3 + (p)->smba)
95#define SMBHSTADD(p) (4 + (p)->smba)
96#define SMBHSTDAT0(p) (5 + (p)->smba)
97#define SMBHSTDAT1(p) (6 + (p)->smba)
98#define SMBBLKDAT(p) (7 + (p)->smba)
99#define SMBPEC(p) (8 + (p)->smba) /* ICH3 and later */
100#define SMBAUXSTS(p) (12 + (p)->smba) /* ICH4 and later */
101#define SMBAUXCTL(p) (13 + (p)->smba) /* ICH4 and later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700102
103/* PCI Address Constants */
Jean Delvare6dcc19d2006-06-12 21:53:02 +0200104#define SMBBAR 4
Daniel Kurtz636752b2012-07-24 14:13:58 +0200105#define SMBPCISTS 0x006
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106#define SMBHSTCFG 0x040
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107
Daniel Kurtz636752b2012-07-24 14:13:58 +0200108/* Host status bits for SMBPCISTS */
109#define SMBPCISTS_INTS 0x08
110
Linus Torvalds1da177e2005-04-16 15:20:36 -0700111/* Host configuration bits for SMBHSTCFG */
112#define SMBHSTCFG_HST_EN 1
113#define SMBHSTCFG_SMB_SMI_EN 2
114#define SMBHSTCFG_I2C_EN 4
115
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300116/* Auxiliary control register bits, ICH4+ only */
Oleg Ryjkovca8b9e32007-07-12 14:12:31 +0200117#define SMBAUXCTL_CRC 1
118#define SMBAUXCTL_E32B 2
119
Linus Torvalds1da177e2005-04-16 15:20:36 -0700120/* Other settings */
Jean Delvare84c1af42012-03-26 21:47:19 +0200121#define MAX_RETRIES 400
Linus Torvalds1da177e2005-04-16 15:20:36 -0700122
123/* I801 command constants */
124#define I801_QUICK 0x00
125#define I801_BYTE 0x04
126#define I801_BYTE_DATA 0x08
127#define I801_WORD_DATA 0x0C
Jean Delvareae7b0492008-01-27 18:14:49 +0100128#define I801_PROC_CALL 0x10 /* unimplemented */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700129#define I801_BLOCK_DATA 0x14
Jean Delvare63420642008-01-27 18:14:50 +0100130#define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */
Daniel Kurtzedbeea62012-07-24 14:13:58 +0200131
132/* I801 Host Control register bits */
133#define SMBHSTCNT_INTREN 0x01
134#define SMBHSTCNT_KILL 0x02
135#define SMBHSTCNT_LAST_BYTE 0x20
136#define SMBHSTCNT_START 0x40
137#define SMBHSTCNT_PEC_EN 0x80 /* ICH3 and later */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700138
Oleg Ryjkovca8b9e32007-07-12 14:12:31 +0200139/* I801 Hosts Status register bits */
140#define SMBHSTSTS_BYTE_DONE 0x80
141#define SMBHSTSTS_INUSE_STS 0x40
142#define SMBHSTSTS_SMBALERT_STS 0x20
143#define SMBHSTSTS_FAILED 0x10
144#define SMBHSTSTS_BUS_ERR 0x08
145#define SMBHSTSTS_DEV_ERR 0x04
146#define SMBHSTSTS_INTR 0x02
147#define SMBHSTSTS_HOST_BUSY 0x01
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148
Daniel Kurtz70a1cc12012-07-24 14:13:58 +0200149#define STATUS_ERROR_FLAGS (SMBHSTSTS_FAILED | SMBHSTSTS_BUS_ERR | \
150 SMBHSTSTS_DEV_ERR)
151
152#define STATUS_FLAGS (SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR | \
153 STATUS_ERROR_FLAGS)
Jean Delvarecf898dc2008-07-14 22:38:33 +0200154
Jean Delvarea6e5e2b2011-05-01 18:18:49 +0200155/* Older devices have their ID defined in <linux/pci_ids.h> */
156#define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22
157#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22
David Woodhouse55fee8d2010-10-31 21:07:00 +0100158/* Patsburg also has three 'Integrated Device Function' SMBus controllers */
159#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0 0x1d70
160#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1 0x1d71
161#define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2 0x1d72
Seth Heasley6e2a8512011-05-24 20:58:49 +0200162#define PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS 0x1e22
Jean Delvarea6e5e2b2011-05-01 18:18:49 +0200163#define PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS 0x2330
164#define PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS 0x3b30
Seth Heasley062737f2012-03-26 21:47:19 +0200165#define PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS 0x8c22
James Ralston4a8f1dd2012-09-10 10:14:02 +0200166#define PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS 0x9c22
David Woodhouse55fee8d2010-10-31 21:07:00 +0100167
Jean Delvare3ad7ea12012-10-05 22:23:53 +0200168struct i801_mux_config {
169 char *gpio_chip;
170 unsigned values[3];
171 int n_values;
172 unsigned classes[3];
173 unsigned gpios[2]; /* Relative to gpio_chip->base */
174 int n_gpios;
175};
176
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100177struct i801_priv {
178 struct i2c_adapter adapter;
179 unsigned long smba;
180 unsigned char original_hstcfg;
181 struct pci_dev *pci_dev;
182 unsigned int features;
Daniel Kurtz636752b2012-07-24 14:13:58 +0200183
184 /* isr processing */
185 wait_queue_head_t waitq;
186 u8 status;
Daniel Kurtzd3ff6ce2012-07-24 14:13:59 +0200187
188 /* Command state used by isr for byte-by-byte block transactions */
189 u8 cmd;
190 bool is_read;
191 int count;
192 int len;
193 u8 *data;
Jean Delvare3ad7ea12012-10-05 22:23:53 +0200194
195#if defined CONFIG_I2C_MUX || defined CONFIG_I2C_MUX_MODULE
196 const struct i801_mux_config *mux_drvdata;
197 unsigned mux_priv[2];
198 struct platform_device *mux_pdev;
199#endif
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100200};
201
Jean Delvared6072f82005-09-25 16:37:04 +0200202static struct pci_driver i801_driver;
Jean Delvare369f6f42008-01-27 18:14:50 +0100203
204#define FEATURE_SMBUS_PEC (1 << 0)
205#define FEATURE_BLOCK_BUFFER (1 << 1)
206#define FEATURE_BLOCK_PROC (1 << 2)
207#define FEATURE_I2C_BLOCK_READ (1 << 3)
Daniel Kurtz636752b2012-07-24 14:13:58 +0200208#define FEATURE_IRQ (1 << 4)
Jean Delvaree7198fb2011-05-24 20:58:49 +0200209/* Not really a feature, but it's convenient to handle it as such */
210#define FEATURE_IDF (1 << 15)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700211
Jean Delvareadff6872010-05-21 18:40:54 +0200212static const char *i801_feature_names[] = {
213 "SMBus PEC",
214 "Block buffer",
215 "Block process call",
216 "I2C block read",
Daniel Kurtz636752b2012-07-24 14:13:58 +0200217 "Interrupt",
Jean Delvareadff6872010-05-21 18:40:54 +0200218};
219
220static unsigned int disable_features;
221module_param(disable_features, uint, S_IRUGO | S_IWUSR);
222MODULE_PARM_DESC(disable_features, "Disable selected driver features");
223
Jean Delvarecf898dc2008-07-14 22:38:33 +0200224/* Make sure the SMBus host is ready to start transmitting.
225 Return 0 if it is, -EBUSY if it is not. */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100226static int i801_check_pre(struct i801_priv *priv)
Jean Delvarecf898dc2008-07-14 22:38:33 +0200227{
228 int status;
229
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100230 status = inb_p(SMBHSTSTS(priv));
Jean Delvarecf898dc2008-07-14 22:38:33 +0200231 if (status & SMBHSTSTS_HOST_BUSY) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100232 dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n");
Jean Delvarecf898dc2008-07-14 22:38:33 +0200233 return -EBUSY;
234 }
235
236 status &= STATUS_FLAGS;
237 if (status) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100238 dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n",
Jean Delvarecf898dc2008-07-14 22:38:33 +0200239 status);
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100240 outb_p(status, SMBHSTSTS(priv));
241 status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
Jean Delvarecf898dc2008-07-14 22:38:33 +0200242 if (status) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100243 dev_err(&priv->pci_dev->dev,
Jean Delvarecf898dc2008-07-14 22:38:33 +0200244 "Failed clearing status flags (%02x)\n",
245 status);
246 return -EBUSY;
247 }
248 }
249
250 return 0;
251}
252
Jean Delvare6cad93c2012-07-24 14:13:58 +0200253/*
254 * Convert the status register to an error code, and clear it.
255 * Note that status only contains the bits we want to clear, not the
256 * actual register value.
257 */
258static int i801_check_post(struct i801_priv *priv, int status)
Jean Delvarecf898dc2008-07-14 22:38:33 +0200259{
260 int result = 0;
261
Daniel Kurtz636752b2012-07-24 14:13:58 +0200262 /*
263 * If the SMBus is still busy, we give up
264 * Note: This timeout condition only happens when using polling
265 * transactions. For interrupt operation, NAK/timeout is indicated by
266 * DEV_ERR.
267 */
Jean Delvare6cad93c2012-07-24 14:13:58 +0200268 if (unlikely(status < 0)) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100269 dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
Jean Delvarecf898dc2008-07-14 22:38:33 +0200270 /* try to stop the current command */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100271 dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n");
272 outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL,
273 SMBHSTCNT(priv));
Jean Delvare84c1af42012-03-26 21:47:19 +0200274 usleep_range(1000, 2000);
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100275 outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL),
276 SMBHSTCNT(priv));
Jean Delvarecf898dc2008-07-14 22:38:33 +0200277
278 /* Check if it worked */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100279 status = inb_p(SMBHSTSTS(priv));
Jean Delvarecf898dc2008-07-14 22:38:33 +0200280 if ((status & SMBHSTSTS_HOST_BUSY) ||
281 !(status & SMBHSTSTS_FAILED))
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100282 dev_err(&priv->pci_dev->dev,
Jean Delvarecf898dc2008-07-14 22:38:33 +0200283 "Failed terminating the transaction\n");
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100284 outb_p(STATUS_FLAGS, SMBHSTSTS(priv));
Jean Delvarecf898dc2008-07-14 22:38:33 +0200285 return -ETIMEDOUT;
286 }
287
288 if (status & SMBHSTSTS_FAILED) {
289 result = -EIO;
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100290 dev_err(&priv->pci_dev->dev, "Transaction failed\n");
Jean Delvarecf898dc2008-07-14 22:38:33 +0200291 }
292 if (status & SMBHSTSTS_DEV_ERR) {
293 result = -ENXIO;
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100294 dev_dbg(&priv->pci_dev->dev, "No response\n");
Jean Delvarecf898dc2008-07-14 22:38:33 +0200295 }
296 if (status & SMBHSTSTS_BUS_ERR) {
297 result = -EAGAIN;
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100298 dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n");
Jean Delvarecf898dc2008-07-14 22:38:33 +0200299 }
300
Jean Delvare6cad93c2012-07-24 14:13:58 +0200301 /* Clear status flags except BYTE_DONE, to be cleared by caller */
302 outb_p(status, SMBHSTSTS(priv));
Jean Delvarecf898dc2008-07-14 22:38:33 +0200303
304 return result;
305}
306
Jean Delvare6cad93c2012-07-24 14:13:58 +0200307/* Wait for BUSY being cleared and either INTR or an error flag being set */
308static int i801_wait_intr(struct i801_priv *priv)
309{
310 int timeout = 0;
311 int status;
312
313 /* We will always wait for a fraction of a second! */
314 do {
315 usleep_range(250, 500);
316 status = inb_p(SMBHSTSTS(priv));
317 } while (((status & SMBHSTSTS_HOST_BUSY) ||
318 !(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR))) &&
319 (timeout++ < MAX_RETRIES));
320
321 if (timeout > MAX_RETRIES) {
322 dev_dbg(&priv->pci_dev->dev, "INTR Timeout!\n");
323 return -ETIMEDOUT;
324 }
325 return status & (STATUS_ERROR_FLAGS | SMBHSTSTS_INTR);
326}
327
328/* Wait for either BYTE_DONE or an error flag being set */
329static int i801_wait_byte_done(struct i801_priv *priv)
330{
331 int timeout = 0;
332 int status;
333
334 /* We will always wait for a fraction of a second! */
335 do {
336 usleep_range(250, 500);
337 status = inb_p(SMBHSTSTS(priv));
338 } while (!(status & (STATUS_ERROR_FLAGS | SMBHSTSTS_BYTE_DONE)) &&
339 (timeout++ < MAX_RETRIES));
340
341 if (timeout > MAX_RETRIES) {
342 dev_dbg(&priv->pci_dev->dev, "BYTE_DONE Timeout!\n");
343 return -ETIMEDOUT;
344 }
345 return status & STATUS_ERROR_FLAGS;
346}
347
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100348static int i801_transaction(struct i801_priv *priv, int xact)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700349{
Jean Delvare2b738092008-07-14 22:38:32 +0200350 int status;
Jean Delvarecf898dc2008-07-14 22:38:33 +0200351 int result;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700352
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100353 result = i801_check_pre(priv);
Jean Delvarecf898dc2008-07-14 22:38:33 +0200354 if (result < 0)
355 return result;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700356
Daniel Kurtz636752b2012-07-24 14:13:58 +0200357 if (priv->features & FEATURE_IRQ) {
358 outb_p(xact | SMBHSTCNT_INTREN | SMBHSTCNT_START,
359 SMBHSTCNT(priv));
360 wait_event(priv->waitq, (status = priv->status));
361 priv->status = 0;
362 return i801_check_post(priv, status);
363 }
364
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200365 /* the current contents of SMBHSTCNT can be overwritten, since PEC,
Daniel Kurtz37af8712012-07-24 14:13:58 +0200366 * SMBSCMD are passed in xact */
Daniel Kurtzedbeea62012-07-24 14:13:58 +0200367 outb_p(xact | SMBHSTCNT_START, SMBHSTCNT(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700368
Jean Delvare6cad93c2012-07-24 14:13:58 +0200369 status = i801_wait_intr(priv);
370 return i801_check_post(priv, status);
Oleg Ryjkovca8b9e32007-07-12 14:12:31 +0200371}
372
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100373static int i801_block_transaction_by_block(struct i801_priv *priv,
374 union i2c_smbus_data *data,
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200375 char read_write, int hwpec)
376{
377 int i, len;
David Brownell97140342008-07-14 22:38:25 +0200378 int status;
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200379
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100380 inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200381
382 /* Use 32-byte buffer to process this transaction */
383 if (read_write == I2C_SMBUS_WRITE) {
384 len = data->block[0];
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100385 outb_p(len, SMBHSTDAT0(priv));
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200386 for (i = 0; i < len; i++)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100387 outb_p(data->block[i+1], SMBBLKDAT(priv));
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200388 }
389
Daniel Kurtz37af8712012-07-24 14:13:58 +0200390 status = i801_transaction(priv, I801_BLOCK_DATA |
Daniel Kurtzedbeea62012-07-24 14:13:58 +0200391 (hwpec ? SMBHSTCNT_PEC_EN : 0));
David Brownell97140342008-07-14 22:38:25 +0200392 if (status)
393 return status;
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200394
395 if (read_write == I2C_SMBUS_READ) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100396 len = inb_p(SMBHSTDAT0(priv));
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200397 if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
David Brownell97140342008-07-14 22:38:25 +0200398 return -EPROTO;
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200399
400 data->block[0] = len;
401 for (i = 0; i < len; i++)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100402 data->block[i + 1] = inb_p(SMBBLKDAT(priv));
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200403 }
404 return 0;
405}
406
Daniel Kurtzd3ff6ce2012-07-24 14:13:59 +0200407static void i801_isr_byte_done(struct i801_priv *priv)
408{
409 if (priv->is_read) {
410 /* For SMBus block reads, length is received with first byte */
411 if (((priv->cmd & 0x1c) == I801_BLOCK_DATA) &&
412 (priv->count == 0)) {
413 priv->len = inb_p(SMBHSTDAT0(priv));
414 if (priv->len < 1 || priv->len > I2C_SMBUS_BLOCK_MAX) {
415 dev_err(&priv->pci_dev->dev,
416 "Illegal SMBus block read size %d\n",
417 priv->len);
418 /* FIXME: Recover */
419 priv->len = I2C_SMBUS_BLOCK_MAX;
420 } else {
421 dev_dbg(&priv->pci_dev->dev,
422 "SMBus block read size is %d\n",
423 priv->len);
424 }
425 priv->data[-1] = priv->len;
426 }
427
428 /* Read next byte */
429 if (priv->count < priv->len)
430 priv->data[priv->count++] = inb(SMBBLKDAT(priv));
431 else
432 dev_dbg(&priv->pci_dev->dev,
433 "Discarding extra byte on block read\n");
434
435 /* Set LAST_BYTE for last byte of read transaction */
436 if (priv->count == priv->len - 1)
437 outb_p(priv->cmd | SMBHSTCNT_LAST_BYTE,
438 SMBHSTCNT(priv));
439 } else if (priv->count < priv->len - 1) {
440 /* Write next byte, except for IRQ after last byte */
441 outb_p(priv->data[++priv->count], SMBBLKDAT(priv));
442 }
443
444 /* Clear BYTE_DONE to continue with next byte */
445 outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
446}
447
Daniel Kurtzefa3cb12012-07-24 14:13:57 +0200448/*
Daniel Kurtzd3ff6ce2012-07-24 14:13:59 +0200449 * There are two kinds of interrupts:
450 *
451 * 1) i801 signals transaction completion with one of these interrupts:
452 * INTR - Success
453 * DEV_ERR - Invalid command, NAK or communication timeout
454 * BUS_ERR - SMI# transaction collision
455 * FAILED - transaction was canceled due to a KILL request
456 * When any of these occur, update ->status and wake up the waitq.
457 * ->status must be cleared before kicking off the next transaction.
458 *
459 * 2) For byte-by-byte (I2C read/write) transactions, one BYTE_DONE interrupt
460 * occurs for each byte of a byte-by-byte to prepare the next byte.
Daniel Kurtz636752b2012-07-24 14:13:58 +0200461 */
462static irqreturn_t i801_isr(int irq, void *dev_id)
463{
464 struct i801_priv *priv = dev_id;
465 u16 pcists;
466 u8 status;
467
468 /* Confirm this is our interrupt */
469 pci_read_config_word(priv->pci_dev, SMBPCISTS, &pcists);
470 if (!(pcists & SMBPCISTS_INTS))
471 return IRQ_NONE;
472
473 status = inb_p(SMBHSTSTS(priv));
474 if (status != 0x42)
475 dev_dbg(&priv->pci_dev->dev, "irq: status = %02x\n", status);
476
Daniel Kurtzd3ff6ce2012-07-24 14:13:59 +0200477 if (status & SMBHSTSTS_BYTE_DONE)
478 i801_isr_byte_done(priv);
479
Daniel Kurtz636752b2012-07-24 14:13:58 +0200480 /*
481 * Clear irq sources and report transaction result.
482 * ->status must be cleared before the next transaction is started.
483 */
484 status &= SMBHSTSTS_INTR | STATUS_ERROR_FLAGS;
485 if (status) {
486 outb_p(status, SMBHSTSTS(priv));
487 priv->status |= status;
488 wake_up(&priv->waitq);
489 }
490
491 return IRQ_HANDLED;
492}
493
494/*
Daniel Kurtzefa3cb12012-07-24 14:13:57 +0200495 * For "byte-by-byte" block transactions:
496 * I2C write uses cmd=I801_BLOCK_DATA, I2C_EN=1
497 * I2C read uses cmd=I801_I2C_BLOCK_DATA
498 */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100499static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
500 union i2c_smbus_data *data,
Jean Delvare63420642008-01-27 18:14:50 +0100501 char read_write, int command,
502 int hwpec)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700503{
504 int i, len;
505 int smbcmd;
Jean Delvare2b738092008-07-14 22:38:32 +0200506 int status;
Jean Delvarecf898dc2008-07-14 22:38:33 +0200507 int result;
Jean Delvarecf898dc2008-07-14 22:38:33 +0200508
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100509 result = i801_check_pre(priv);
Jean Delvarecf898dc2008-07-14 22:38:33 +0200510 if (result < 0)
511 return result;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700512
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200513 len = data->block[0];
Linus Torvalds1da177e2005-04-16 15:20:36 -0700514
515 if (read_write == I2C_SMBUS_WRITE) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100516 outb_p(len, SMBHSTDAT0(priv));
517 outb_p(data->block[1], SMBBLKDAT(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700518 }
519
Daniel Kurtzefa3cb12012-07-24 14:13:57 +0200520 if (command == I2C_SMBUS_I2C_BLOCK_DATA &&
521 read_write == I2C_SMBUS_READ)
522 smbcmd = I801_I2C_BLOCK_DATA;
523 else
524 smbcmd = I801_BLOCK_DATA;
525
Daniel Kurtzd3ff6ce2012-07-24 14:13:59 +0200526 if (priv->features & FEATURE_IRQ) {
527 priv->is_read = (read_write == I2C_SMBUS_READ);
528 if (len == 1 && priv->is_read)
529 smbcmd |= SMBHSTCNT_LAST_BYTE;
530 priv->cmd = smbcmd | SMBHSTCNT_INTREN;
531 priv->len = len;
532 priv->count = 0;
533 priv->data = &data->block[1];
534
535 outb_p(priv->cmd | SMBHSTCNT_START, SMBHSTCNT(priv));
536 wait_event(priv->waitq, (status = priv->status));
537 priv->status = 0;
538 return i801_check_post(priv, status);
539 }
540
Linus Torvalds1da177e2005-04-16 15:20:36 -0700541 for (i = 1; i <= len; i++) {
Daniel Kurtzefa3cb12012-07-24 14:13:57 +0200542 if (i == len && read_write == I2C_SMBUS_READ)
Daniel Kurtzedbeea62012-07-24 14:13:58 +0200543 smbcmd |= SMBHSTCNT_LAST_BYTE;
Daniel Kurtz37af8712012-07-24 14:13:58 +0200544 outb_p(smbcmd, SMBHSTCNT(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700545
Linus Torvalds1da177e2005-04-16 15:20:36 -0700546 if (i == 1)
Daniel Kurtzedbeea62012-07-24 14:13:58 +0200547 outb_p(inb(SMBHSTCNT(priv)) | SMBHSTCNT_START,
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100548 SMBHSTCNT(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700549
Jean Delvare6cad93c2012-07-24 14:13:58 +0200550 status = i801_wait_byte_done(priv);
551 if (status)
552 goto exit;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700553
Jean Delvare63420642008-01-27 18:14:50 +0100554 if (i == 1 && read_write == I2C_SMBUS_READ
555 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100556 len = inb_p(SMBHSTDAT0(priv));
Jean Delvarecf898dc2008-07-14 22:38:33 +0200557 if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100558 dev_err(&priv->pci_dev->dev,
Jean Delvarecf898dc2008-07-14 22:38:33 +0200559 "Illegal SMBus block read size %d\n",
560 len);
561 /* Recover */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100562 while (inb_p(SMBHSTSTS(priv)) &
563 SMBHSTSTS_HOST_BUSY)
564 outb_p(SMBHSTSTS_BYTE_DONE,
565 SMBHSTSTS(priv));
566 outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
David Brownell97140342008-07-14 22:38:25 +0200567 return -EPROTO;
Jean Delvarecf898dc2008-07-14 22:38:33 +0200568 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700569 data->block[0] = len;
570 }
571
572 /* Retrieve/store value in SMBBLKDAT */
573 if (read_write == I2C_SMBUS_READ)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100574 data->block[i] = inb_p(SMBBLKDAT(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700575 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100576 outb_p(data->block[i+1], SMBBLKDAT(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577
Jean Delvarecf898dc2008-07-14 22:38:33 +0200578 /* signals SMBBLKDAT ready */
Jean Delvare6cad93c2012-07-24 14:13:58 +0200579 outb_p(SMBHSTSTS_BYTE_DONE, SMBHSTSTS(priv));
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200580 }
Jean Delvarecf898dc2008-07-14 22:38:33 +0200581
Jean Delvare6cad93c2012-07-24 14:13:58 +0200582 status = i801_wait_intr(priv);
583exit:
584 return i801_check_post(priv, status);
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200585}
586
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100587static int i801_set_block_buffer_mode(struct i801_priv *priv)
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200588{
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100589 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv));
590 if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0)
David Brownell97140342008-07-14 22:38:25 +0200591 return -EIO;
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200592 return 0;
593}
594
595/* Block transaction function */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100596static int i801_block_transaction(struct i801_priv *priv,
597 union i2c_smbus_data *data, char read_write,
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200598 int command, int hwpec)
599{
600 int result = 0;
601 unsigned char hostc;
602
603 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
604 if (read_write == I2C_SMBUS_WRITE) {
605 /* set I2C_EN bit in configuration register */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100606 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc);
607 pci_write_config_byte(priv->pci_dev, SMBHSTCFG,
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200608 hostc | SMBHSTCFG_I2C_EN);
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100609 } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) {
610 dev_err(&priv->pci_dev->dev,
Jean Delvare63420642008-01-27 18:14:50 +0100611 "I2C block read is unsupported!\n");
David Brownell97140342008-07-14 22:38:25 +0200612 return -EOPNOTSUPP;
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200613 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614 }
615
Jean Delvare63420642008-01-27 18:14:50 +0100616 if (read_write == I2C_SMBUS_WRITE
617 || command == I2C_SMBUS_I2C_BLOCK_DATA) {
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200618 if (data->block[0] < 1)
619 data->block[0] = 1;
620 if (data->block[0] > I2C_SMBUS_BLOCK_MAX)
621 data->block[0] = I2C_SMBUS_BLOCK_MAX;
622 } else {
Jean Delvare63420642008-01-27 18:14:50 +0100623 data->block[0] = 32; /* max for SMBus block reads */
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200624 }
625
Jean Delvarec074c392010-03-13 20:56:53 +0100626 /* Experience has shown that the block buffer can only be used for
627 SMBus (not I2C) block transactions, even though the datasheet
628 doesn't mention this limitation. */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100629 if ((priv->features & FEATURE_BLOCK_BUFFER)
Jean Delvarec074c392010-03-13 20:56:53 +0100630 && command != I2C_SMBUS_I2C_BLOCK_DATA
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100631 && i801_set_block_buffer_mode(priv) == 0)
632 result = i801_block_transaction_by_block(priv, data,
633 read_write, hwpec);
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200634 else
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100635 result = i801_block_transaction_byte_by_byte(priv, data,
636 read_write,
Jean Delvare63420642008-01-27 18:14:50 +0100637 command, hwpec);
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200638
Jean Delvare63420642008-01-27 18:14:50 +0100639 if (command == I2C_SMBUS_I2C_BLOCK_DATA
640 && read_write == I2C_SMBUS_WRITE) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700641 /* restore saved configuration register value */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100642 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700643 }
644 return result;
645}
646
David Brownell97140342008-07-14 22:38:25 +0200647/* Return negative errno on error. */
Ivo Manca3fb21c62010-05-21 18:40:55 +0200648static s32 i801_access(struct i2c_adapter *adap, u16 addr,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 unsigned short flags, char read_write, u8 command,
Ivo Manca3fb21c62010-05-21 18:40:55 +0200650 int size, union i2c_smbus_data *data)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700651{
Jean Delvaree8aac4a2005-10-26 21:34:42 +0200652 int hwpec;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700653 int block = 0;
654 int ret, xact = 0;
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100655 struct i801_priv *priv = i2c_get_adapdata(adap);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100657 hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC)
Jean Delvaree8aac4a2005-10-26 21:34:42 +0200658 && size != I2C_SMBUS_QUICK
659 && size != I2C_SMBUS_I2C_BLOCK_DATA;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660
661 switch (size) {
662 case I2C_SMBUS_QUICK:
663 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100664 SMBHSTADD(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700665 xact = I801_QUICK;
666 break;
667 case I2C_SMBUS_BYTE:
668 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100669 SMBHSTADD(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700670 if (read_write == I2C_SMBUS_WRITE)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100671 outb_p(command, SMBHSTCMD(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700672 xact = I801_BYTE;
673 break;
674 case I2C_SMBUS_BYTE_DATA:
675 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100676 SMBHSTADD(priv));
677 outb_p(command, SMBHSTCMD(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700678 if (read_write == I2C_SMBUS_WRITE)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100679 outb_p(data->byte, SMBHSTDAT0(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700680 xact = I801_BYTE_DATA;
681 break;
682 case I2C_SMBUS_WORD_DATA:
683 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100684 SMBHSTADD(priv));
685 outb_p(command, SMBHSTCMD(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700686 if (read_write == I2C_SMBUS_WRITE) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100687 outb_p(data->word & 0xff, SMBHSTDAT0(priv));
688 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700689 }
690 xact = I801_WORD_DATA;
691 break;
692 case I2C_SMBUS_BLOCK_DATA:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700693 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100694 SMBHSTADD(priv));
695 outb_p(command, SMBHSTCMD(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700696 block = 1;
697 break;
Jean Delvare63420642008-01-27 18:14:50 +0100698 case I2C_SMBUS_I2C_BLOCK_DATA:
699 /* NB: page 240 of ICH5 datasheet shows that the R/#W
700 * bit should be cleared here, even when reading */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100701 outb_p((addr & 0x7f) << 1, SMBHSTADD(priv));
Jean Delvare63420642008-01-27 18:14:50 +0100702 if (read_write == I2C_SMBUS_READ) {
703 /* NB: page 240 of ICH5 datasheet also shows
704 * that DATA1 is the cmd field when reading */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100705 outb_p(command, SMBHSTDAT1(priv));
Jean Delvare63420642008-01-27 18:14:50 +0100706 } else
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100707 outb_p(command, SMBHSTCMD(priv));
Jean Delvare63420642008-01-27 18:14:50 +0100708 block = 1;
709 break;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710 default:
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100711 dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n",
712 size);
David Brownell97140342008-07-14 22:38:25 +0200713 return -EOPNOTSUPP;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700714 }
715
Oleg Ryjkovca8b9e32007-07-12 14:12:31 +0200716 if (hwpec) /* enable/disable hardware PEC */
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100717 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv));
Oleg Ryjkovca8b9e32007-07-12 14:12:31 +0200718 else
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100719 outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC),
720 SMBAUXCTL(priv));
Jean Delvaree8aac4a2005-10-26 21:34:42 +0200721
Ivo Manca3fb21c62010-05-21 18:40:55 +0200722 if (block)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100723 ret = i801_block_transaction(priv, data, read_write, size,
724 hwpec);
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200725 else
Daniel Kurtz37af8712012-07-24 14:13:58 +0200726 ret = i801_transaction(priv, xact);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700727
Jean Delvarec79cfba2006-04-20 02:43:18 -0700728 /* Some BIOSes don't like it when PEC is enabled at reboot or resume
Oleg Ryjkov7edcb9a2007-07-12 14:12:31 +0200729 time, so we forcibly disable it after every transaction. Turn off
730 E32B for the same reason. */
Jean Delvarea0921b62008-01-27 18:14:50 +0100731 if (hwpec || block)
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100732 outb_p(inb_p(SMBAUXCTL(priv)) &
733 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
Jean Delvarec79cfba2006-04-20 02:43:18 -0700734
Ivo Manca3fb21c62010-05-21 18:40:55 +0200735 if (block)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700736 return ret;
Ivo Manca3fb21c62010-05-21 18:40:55 +0200737 if (ret)
David Brownell97140342008-07-14 22:38:25 +0200738 return ret;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700739 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
740 return 0;
741
742 switch (xact & 0x7f) {
743 case I801_BYTE: /* Result put in SMBHSTDAT0 */
744 case I801_BYTE_DATA:
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100745 data->byte = inb_p(SMBHSTDAT0(priv));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700746 break;
747 case I801_WORD_DATA:
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100748 data->word = inb_p(SMBHSTDAT0(priv)) +
749 (inb_p(SMBHSTDAT1(priv)) << 8);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700750 break;
751 }
752 return 0;
753}
754
755
756static u32 i801_func(struct i2c_adapter *adapter)
757{
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100758 struct i801_priv *priv = i2c_get_adapdata(adapter);
759
Linus Torvalds1da177e2005-04-16 15:20:36 -0700760 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
Jean Delvare369f6f42008-01-27 18:14:50 +0100761 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
762 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK |
David Woodhouse0cd96eb2010-10-31 21:06:59 +0100763 ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) |
764 ((priv->features & FEATURE_I2C_BLOCK_READ) ?
Jean Delvare63420642008-01-27 18:14:50 +0100765 I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700766}
767
Jean Delvare8f9082c2006-09-03 22:39:46 +0200768static const struct i2c_algorithm smbus_algorithm = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700769 .smbus_xfer = i801_access,
770 .functionality = i801_func,
771};
772
Axel Lin3527bd52012-01-12 20:32:04 +0100773static DEFINE_PCI_DEVICE_TABLE(i801_ids) = {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
775 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
776 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
777 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
778 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
779 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
780 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
781 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
782 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
Jason Gastonb0a70b52005-04-16 15:24:45 -0700783 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
Jason Gaston8254fc42006-01-09 10:58:08 -0800784 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
Jason Gastonadbc2a12006-11-22 15:19:12 -0800785 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
Seth Heasleycb04e952010-10-04 13:27:14 -0700786 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) },
Gaston, Jason Dd28dc712008-02-24 20:03:42 +0100787 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) },
788 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) },
Seth Heasleycb04e952010-10-04 13:27:14 -0700789 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS) },
790 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS) },
Seth Heasleye30d9852010-10-31 21:06:59 +0100791 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) },
David Woodhouse55fee8d2010-10-31 21:07:00 +0100792 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0) },
793 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1) },
794 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2) },
Seth Heasley662cda82011-03-20 14:50:53 +0100795 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_DH89XXCC_SMBUS) },
Seth Heasley6e2a8512011-05-24 20:58:49 +0200796 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PANTHERPOINT_SMBUS) },
Seth Heasley062737f2012-03-26 21:47:19 +0200797 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_SMBUS) },
James Ralston4a8f1dd2012-09-10 10:14:02 +0200798 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_LYNXPOINT_LP_SMBUS) },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 { 0, }
800};
801
Ivo Manca3fb21c62010-05-21 18:40:55 +0200802MODULE_DEVICE_TABLE(pci, i801_ids);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700803
Jean Delvare8eacfce2011-05-24 20:58:49 +0200804#if defined CONFIG_X86 && defined CONFIG_DMI
Jean Delvare1561bfe2009-01-07 14:29:17 +0100805static unsigned char apanel_addr;
806
807/* Scan the system ROM for the signature "FJKEYINF" */
808static __init const void __iomem *bios_signature(const void __iomem *bios)
809{
810 ssize_t offset;
811 const unsigned char signature[] = "FJKEYINF";
812
813 for (offset = 0; offset < 0x10000; offset += 0x10) {
814 if (check_signature(bios + offset, signature,
815 sizeof(signature)-1))
816 return bios + offset;
817 }
818 return NULL;
819}
820
821static void __init input_apanel_init(void)
822{
823 void __iomem *bios;
824 const void __iomem *p;
825
826 bios = ioremap(0xF0000, 0x10000); /* Can't fail */
827 p = bios_signature(bios);
828 if (p) {
829 /* just use the first address */
830 apanel_addr = readb(p + 8 + 3) >> 1;
831 }
832 iounmap(bios);
833}
Jean Delvare1561bfe2009-01-07 14:29:17 +0100834
Hans de Goedefa5bfab2009-03-30 21:46:44 +0200835struct dmi_onboard_device_info {
836 const char *name;
837 u8 type;
838 unsigned short i2c_addr;
839 const char *i2c_type;
840};
841
842static struct dmi_onboard_device_info __devinitdata dmi_devices[] = {
843 { "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" },
844 { "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" },
845 { "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" },
846};
847
848static void __devinit dmi_check_onboard_device(u8 type, const char *name,
849 struct i2c_adapter *adap)
850{
851 int i;
852 struct i2c_board_info info;
853
854 for (i = 0; i < ARRAY_SIZE(dmi_devices); i++) {
855 /* & ~0x80, ignore enabled/disabled bit */
856 if ((type & ~0x80) != dmi_devices[i].type)
857 continue;
Jean Delvarefaabd472010-07-09 16:22:51 +0200858 if (strcasecmp(name, dmi_devices[i].name))
Hans de Goedefa5bfab2009-03-30 21:46:44 +0200859 continue;
860
861 memset(&info, 0, sizeof(struct i2c_board_info));
862 info.addr = dmi_devices[i].i2c_addr;
863 strlcpy(info.type, dmi_devices[i].i2c_type, I2C_NAME_SIZE);
864 i2c_new_device(adap, &info);
865 break;
866 }
867}
868
869/* We use our own function to check for onboard devices instead of
870 dmi_find_device() as some buggy BIOS's have the devices we are interested
871 in marked as disabled */
872static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
873 void *adap)
874{
875 int i, count;
876
877 if (dm->type != 10)
878 return;
879
880 count = (dm->length - sizeof(struct dmi_header)) / 2;
881 for (i = 0; i < count; i++) {
882 const u8 *d = (char *)(dm + 1) + (i * 2);
883 const char *name = ((char *) dm) + dm->length;
884 u8 type = d[0];
885 u8 s = d[1];
886
887 if (!s)
888 continue;
889 s--;
890 while (s > 0 && name[0]) {
891 name += strlen(name) + 1;
892 s--;
893 }
894 if (name[0] == 0) /* Bogus string reference */
895 continue;
896
897 dmi_check_onboard_device(type, name, adap);
898 }
899}
Hans de Goedefa5bfab2009-03-30 21:46:44 +0200900
Jean Delvaree7198fb2011-05-24 20:58:49 +0200901/* Register optional slaves */
902static void __devinit i801_probe_optional_slaves(struct i801_priv *priv)
903{
904 /* Only register slaves on main SMBus channel */
905 if (priv->features & FEATURE_IDF)
906 return;
907
Jean Delvaree7198fb2011-05-24 20:58:49 +0200908 if (apanel_addr) {
909 struct i2c_board_info info;
910
911 memset(&info, 0, sizeof(struct i2c_board_info));
912 info.addr = apanel_addr;
913 strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
914 i2c_new_device(&priv->adapter, &info);
915 }
Jean Delvare8eacfce2011-05-24 20:58:49 +0200916
Jean Delvaree7198fb2011-05-24 20:58:49 +0200917 if (dmi_name_in_vendors("FUJITSU"))
918 dmi_walk(dmi_check_onboard_devices, &priv->adapter);
Jean Delvaree7198fb2011-05-24 20:58:49 +0200919}
Jean Delvare8eacfce2011-05-24 20:58:49 +0200920#else
921static void __init input_apanel_init(void) {}
922static void __devinit i801_probe_optional_slaves(struct i801_priv *priv) {}
923#endif /* CONFIG_X86 && CONFIG_DMI */
Jean Delvaree7198fb2011-05-24 20:58:49 +0200924
Jean Delvare3ad7ea12012-10-05 22:23:53 +0200925#if defined CONFIG_I2C_MUX || defined CONFIG_I2C_MUX_MODULE
926static struct i801_mux_config i801_mux_config_asus_z8_d12 = {
927 .gpio_chip = "gpio_ich",
928 .values = { 0x02, 0x03 },
929 .n_values = 2,
930 .classes = { I2C_CLASS_SPD, I2C_CLASS_SPD },
931 .gpios = { 52, 53 },
932 .n_gpios = 2,
933};
934
935static struct i801_mux_config i801_mux_config_asus_z8_d18 = {
936 .gpio_chip = "gpio_ich",
937 .values = { 0x02, 0x03, 0x01 },
938 .n_values = 3,
939 .classes = { I2C_CLASS_SPD, I2C_CLASS_SPD, I2C_CLASS_SPD },
940 .gpios = { 52, 53 },
941 .n_gpios = 2,
942};
943
944static struct dmi_system_id __devinitdata mux_dmi_table[] = {
945 {
946 .matches = {
947 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
948 DMI_MATCH(DMI_BOARD_NAME, "Z8NA-D6(C)"),
949 },
950 .driver_data = &i801_mux_config_asus_z8_d12,
951 },
952 {
953 .matches = {
954 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
955 DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)E-D12(X)"),
956 },
957 .driver_data = &i801_mux_config_asus_z8_d12,
958 },
959 {
960 .matches = {
961 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
962 DMI_MATCH(DMI_BOARD_NAME, "Z8NH-D12"),
963 },
964 .driver_data = &i801_mux_config_asus_z8_d12,
965 },
966 {
967 .matches = {
968 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
969 DMI_MATCH(DMI_BOARD_NAME, "Z8PH-D12/IFB"),
970 },
971 .driver_data = &i801_mux_config_asus_z8_d12,
972 },
973 {
974 .matches = {
975 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
976 DMI_MATCH(DMI_BOARD_NAME, "Z8NR-D12"),
977 },
978 .driver_data = &i801_mux_config_asus_z8_d12,
979 },
980 {
981 .matches = {
982 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
983 DMI_MATCH(DMI_BOARD_NAME, "Z8P(N)H-D12"),
984 },
985 .driver_data = &i801_mux_config_asus_z8_d12,
986 },
987 {
988 .matches = {
989 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
990 DMI_MATCH(DMI_BOARD_NAME, "Z8PG-D18"),
991 },
992 .driver_data = &i801_mux_config_asus_z8_d18,
993 },
994 {
995 .matches = {
996 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
997 DMI_MATCH(DMI_BOARD_NAME, "Z8PE-D18"),
998 },
999 .driver_data = &i801_mux_config_asus_z8_d18,
1000 },
1001 {
1002 .matches = {
1003 DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."),
1004 DMI_MATCH(DMI_BOARD_NAME, "Z8PS-D12"),
1005 },
1006 .driver_data = &i801_mux_config_asus_z8_d12,
1007 },
1008 { }
1009};
1010
1011static int __devinit match_gpio_chip_by_label(struct gpio_chip *chip,
1012 void *data)
1013{
1014 return !strcmp(chip->label, data);
1015}
1016
1017/* Setup multiplexing if needed */
1018static int __devinit i801_add_mux(struct i801_priv *priv)
1019{
1020 struct device *dev = &priv->adapter.dev;
1021 const struct i801_mux_config *mux_config;
1022 struct gpio_chip *gpio;
1023 struct i2c_mux_gpio_platform_data gpio_data;
1024 int i, err;
1025
1026 if (!priv->mux_drvdata)
1027 return 0;
1028 mux_config = priv->mux_drvdata;
1029
1030 /* Find GPIO chip */
1031 gpio = gpiochip_find(mux_config->gpio_chip, match_gpio_chip_by_label);
1032 if (gpio) {
1033 dev_info(dev,
1034 "GPIO chip %s found, SMBus multiplexing enabled\n",
1035 mux_config->gpio_chip);
1036 } else {
1037 dev_err(dev,
1038 "GPIO chip %s not found, SMBus multiplexing disabled\n",
1039 mux_config->gpio_chip);
1040 return -ENODEV;
1041 }
1042
1043 /* Find absolute GPIO pin numbers */
1044 if (ARRAY_SIZE(priv->mux_priv) < mux_config->n_gpios) {
1045 dev_err(dev, "i801_priv.mux_priv too small (%zu, need %d)\n",
1046 ARRAY_SIZE(priv->mux_priv), mux_config->n_gpios);
1047 return -ENODEV;
1048 }
1049 for (i = 0; i < mux_config->n_gpios; i++)
1050 priv->mux_priv[i] = gpio->base + mux_config->gpios[i];
1051
1052 /* Prepare the platform data */
1053 memset(&gpio_data, 0, sizeof(struct i2c_mux_gpio_platform_data));
1054 gpio_data.parent = priv->adapter.nr;
1055 gpio_data.values = mux_config->values;
1056 gpio_data.n_values = mux_config->n_values;
1057 gpio_data.classes = mux_config->classes;
1058 gpio_data.gpios = priv->mux_priv;
1059 gpio_data.n_gpios = mux_config->n_gpios;
1060 gpio_data.idle = I2C_MUX_GPIO_NO_IDLE;
1061
1062 /* Register the mux device */
1063 priv->mux_pdev = platform_device_register_data(dev, "i2c-mux-gpio",
1064 priv->mux_priv[0], &gpio_data,
1065 sizeof(struct i2c_mux_gpio_platform_data));
1066 if (IS_ERR(priv->mux_pdev)) {
1067 err = PTR_ERR(priv->mux_pdev);
1068 priv->mux_pdev = NULL;
1069 dev_err(dev, "Failed to register i2c-mux-gpio device\n");
1070 return err;
1071 }
1072
1073 return 0;
1074}
1075
1076static void __devexit i801_del_mux(struct i801_priv *priv)
1077{
1078 if (priv->mux_pdev)
1079 platform_device_unregister(priv->mux_pdev);
1080}
1081
1082static unsigned int __devinit i801_get_adapter_class(struct i801_priv *priv)
1083{
1084 const struct dmi_system_id *id;
1085 const struct i801_mux_config *mux_config;
1086 unsigned int class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
1087 int i;
1088
1089 id = dmi_first_match(mux_dmi_table);
1090 if (id) {
1091 /* Remove from branch classes from trunk */
1092 mux_config = id->driver_data;
1093 for (i = 0; i < mux_config->n_values; i++)
1094 class &= ~mux_config->classes[i];
1095
1096 /* Remember for later */
1097 priv->mux_drvdata = mux_config;
1098 }
1099
1100 return class;
1101}
1102#else
1103static inline int i801_add_mux(struct i801_priv *priv) { return 0; }
1104static inline void i801_del_mux(struct i801_priv *priv) { }
1105
1106static inline unsigned int i801_get_adapter_class(struct i801_priv *priv)
1107{
1108 return I2C_CLASS_HWMON | I2C_CLASS_SPD;
1109}
1110#endif
1111
Ivo Manca3fb21c62010-05-21 18:40:55 +02001112static int __devinit i801_probe(struct pci_dev *dev,
1113 const struct pci_device_id *id)
Linus Torvalds1da177e2005-04-16 15:20:36 -07001114{
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001115 unsigned char temp;
Jean Delvareadff6872010-05-21 18:40:54 +02001116 int err, i;
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001117 struct i801_priv *priv;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001118
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001119 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1120 if (!priv)
1121 return -ENOMEM;
1122
1123 i2c_set_adapdata(&priv->adapter, priv);
1124 priv->adapter.owner = THIS_MODULE;
Jean Delvare3ad7ea12012-10-05 22:23:53 +02001125 priv->adapter.class = i801_get_adapter_class(priv);
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001126 priv->adapter.algo = &smbus_algorithm;
1127
1128 priv->pci_dev = dev;
Jean Delvare250d1bd2006-12-10 21:21:33 +01001129 switch (dev->device) {
Jean Delvaree7198fb2011-05-24 20:58:49 +02001130 case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF0:
1131 case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF1:
1132 case PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS_IDF2:
1133 priv->features |= FEATURE_IDF;
1134 /* fall through */
Jean Delvaree0e8398c2010-05-21 18:40:55 +02001135 default:
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001136 priv->features |= FEATURE_I2C_BLOCK_READ;
Jean Delvare63420642008-01-27 18:14:50 +01001137 /* fall through */
1138 case PCI_DEVICE_ID_INTEL_82801DB_3:
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001139 priv->features |= FEATURE_SMBUS_PEC;
1140 priv->features |= FEATURE_BLOCK_BUFFER;
Jean Delvaree0e8398c2010-05-21 18:40:55 +02001141 /* fall through */
1142 case PCI_DEVICE_ID_INTEL_82801CA_3:
1143 case PCI_DEVICE_ID_INTEL_82801BA_2:
1144 case PCI_DEVICE_ID_INTEL_82801AB_3:
1145 case PCI_DEVICE_ID_INTEL_82801AA_3:
Jean Delvare250d1bd2006-12-10 21:21:33 +01001146 break;
Jean Delvare250d1bd2006-12-10 21:21:33 +01001147 }
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001148
Jean Delvare29b60852012-07-24 14:13:59 +02001149 /* IRQ processing tested on CougarPoint PCH, ICH5, ICH7-M and ICH10 */
1150 if (dev->device == PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS ||
1151 dev->device == PCI_DEVICE_ID_INTEL_82801EB_3 ||
1152 dev->device == PCI_DEVICE_ID_INTEL_ICH7_17 ||
1153 dev->device == PCI_DEVICE_ID_INTEL_ICH8_5 ||
1154 dev->device == PCI_DEVICE_ID_INTEL_ICH9_6 ||
1155 dev->device == PCI_DEVICE_ID_INTEL_ICH10_4 ||
1156 dev->device == PCI_DEVICE_ID_INTEL_ICH10_5)
Daniel Kurtz636752b2012-07-24 14:13:58 +02001157 priv->features |= FEATURE_IRQ;
1158
Jean Delvareadff6872010-05-21 18:40:54 +02001159 /* Disable features on user request */
1160 for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) {
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001161 if (priv->features & disable_features & (1 << i))
Jean Delvareadff6872010-05-21 18:40:54 +02001162 dev_notice(&dev->dev, "%s disabled by user\n",
1163 i801_feature_names[i]);
1164 }
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001165 priv->features &= ~disable_features;
Jean Delvareadff6872010-05-21 18:40:54 +02001166
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001167 err = pci_enable_device(dev);
1168 if (err) {
1169 dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
1170 err);
1171 goto exit;
1172 }
1173
1174 /* Determine the address of the SMBus area */
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001175 priv->smba = pci_resource_start(dev, SMBBAR);
1176 if (!priv->smba) {
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001177 dev_err(&dev->dev, "SMBus base address uninitialized, "
1178 "upgrade BIOS\n");
1179 err = -ENODEV;
Daniel Ritzd6fcb3b2006-06-27 18:40:54 +02001180 goto exit;
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001181 }
1182
Jean Delvare54fb4a052008-07-14 22:38:33 +02001183 err = acpi_check_resource_conflict(&dev->resource[SMBBAR]);
Jean Delvare18669ea2009-10-04 22:53:45 +02001184 if (err) {
1185 err = -ENODEV;
Jean Delvare54fb4a052008-07-14 22:38:33 +02001186 goto exit;
Jean Delvare18669ea2009-10-04 22:53:45 +02001187 }
Jean Delvare54fb4a052008-07-14 22:38:33 +02001188
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001189 err = pci_request_region(dev, SMBBAR, i801_driver.name);
1190 if (err) {
1191 dev_err(&dev->dev, "Failed to request SMBus region "
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001192 "0x%lx-0x%Lx\n", priv->smba,
Andrew Morton598736c2006-06-30 01:56:20 -07001193 (unsigned long long)pci_resource_end(dev, SMBBAR));
Daniel Ritzd6fcb3b2006-06-27 18:40:54 +02001194 goto exit;
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001195 }
1196
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001197 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp);
1198 priv->original_hstcfg = temp;
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001199 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
1200 if (!(temp & SMBHSTCFG_HST_EN)) {
1201 dev_info(&dev->dev, "Enabling SMBus device\n");
1202 temp |= SMBHSTCFG_HST_EN;
1203 }
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001204 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp);
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001205
Daniel Kurtz636752b2012-07-24 14:13:58 +02001206 if (temp & SMBHSTCFG_SMB_SMI_EN) {
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001207 dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
Daniel Kurtz636752b2012-07-24 14:13:58 +02001208 /* Disable SMBus interrupt feature if SMBus using SMI# */
1209 priv->features &= ~FEATURE_IRQ;
Daniel Kurtz636752b2012-07-24 14:13:58 +02001210 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001211
Jean Delvarea0921b62008-01-27 18:14:50 +01001212 /* Clear special mode bits */
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001213 if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER))
1214 outb_p(inb_p(SMBAUXCTL(priv)) &
1215 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
Jean Delvarea0921b62008-01-27 18:14:50 +01001216
Daniel Kurtz636752b2012-07-24 14:13:58 +02001217 if (priv->features & FEATURE_IRQ) {
1218 init_waitqueue_head(&priv->waitq);
1219
1220 err = request_irq(dev->irq, i801_isr, IRQF_SHARED,
1221 i801_driver.name, priv);
1222 if (err) {
1223 dev_err(&dev->dev, "Failed to allocate irq %d: %d\n",
1224 dev->irq, err);
1225 goto exit_release;
1226 }
Jean Delvare29b60852012-07-24 14:13:59 +02001227 dev_info(&dev->dev, "SMBus using PCI Interrupt\n");
Daniel Kurtz636752b2012-07-24 14:13:58 +02001228 }
1229
Robert P. J. Day405ae7d2007-02-17 19:13:42 +01001230 /* set up the sysfs linkage to our parent device */
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001231 priv->adapter.dev.parent = &dev->dev;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001232
Jean Delvare7e2193a2009-12-06 17:06:27 +01001233 /* Retry up to 3 times on lost arbitration */
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001234 priv->adapter.retries = 3;
Jean Delvare7e2193a2009-12-06 17:06:27 +01001235
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001236 snprintf(priv->adapter.name, sizeof(priv->adapter.name),
1237 "SMBus I801 adapter at %04lx", priv->smba);
1238 err = i2c_add_adapter(&priv->adapter);
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001239 if (err) {
1240 dev_err(&dev->dev, "Failed to add SMBus adapter\n");
Daniel Kurtz636752b2012-07-24 14:13:58 +02001241 goto exit_free_irq;
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001242 }
Jean Delvare1561bfe2009-01-07 14:29:17 +01001243
Jean Delvaree7198fb2011-05-24 20:58:49 +02001244 i801_probe_optional_slaves(priv);
Jean Delvare3ad7ea12012-10-05 22:23:53 +02001245 /* We ignore errors - multiplexing is optional */
1246 i801_add_mux(priv);
Jean Delvare1561bfe2009-01-07 14:29:17 +01001247
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001248 pci_set_drvdata(dev, priv);
Daniel Kurtz636752b2012-07-24 14:13:58 +02001249
Daniel Ritzd6fcb3b2006-06-27 18:40:54 +02001250 return 0;
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001251
Daniel Kurtz636752b2012-07-24 14:13:58 +02001252exit_free_irq:
1253 if (priv->features & FEATURE_IRQ)
1254 free_irq(dev->irq, priv);
Daniel Ritzd6fcb3b2006-06-27 18:40:54 +02001255exit_release:
1256 pci_release_region(dev, SMBBAR);
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001257exit:
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001258 kfree(priv);
Jean Delvare02dd7ae2006-06-12 21:53:41 +02001259 return err;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001260}
1261
1262static void __devexit i801_remove(struct pci_dev *dev)
1263{
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001264 struct i801_priv *priv = pci_get_drvdata(dev);
1265
Jean Delvare3ad7ea12012-10-05 22:23:53 +02001266 i801_del_mux(priv);
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001267 i2c_del_adapter(&priv->adapter);
1268 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
Daniel Kurtz636752b2012-07-24 14:13:58 +02001269
1270 if (priv->features & FEATURE_IRQ)
1271 free_irq(dev->irq, priv);
Jean Delvare6dcc19d2006-06-12 21:53:02 +02001272 pci_release_region(dev, SMBBAR);
Daniel Kurtz636752b2012-07-24 14:13:58 +02001273
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001274 pci_set_drvdata(dev, NULL);
1275 kfree(priv);
Daniel Ritzd6fcb3b2006-06-27 18:40:54 +02001276 /*
1277 * do not call pci_disable_device(dev) since it can cause hard hangs on
1278 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
1279 */
Linus Torvalds1da177e2005-04-16 15:20:36 -07001280}
1281
Jean Delvarea5aaea32007-03-22 19:49:01 +01001282#ifdef CONFIG_PM
1283static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
1284{
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001285 struct i801_priv *priv = pci_get_drvdata(dev);
1286
Jean Delvarea5aaea32007-03-22 19:49:01 +01001287 pci_save_state(dev);
David Woodhouse0cd96eb2010-10-31 21:06:59 +01001288 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
Jean Delvarea5aaea32007-03-22 19:49:01 +01001289 pci_set_power_state(dev, pci_choose_state(dev, mesg));
1290 return 0;
1291}
1292
1293static int i801_resume(struct pci_dev *dev)
1294{
1295 pci_set_power_state(dev, PCI_D0);
1296 pci_restore_state(dev);
1297 return pci_enable_device(dev);
1298}
1299#else
1300#define i801_suspend NULL
1301#define i801_resume NULL
1302#endif
1303
Linus Torvalds1da177e2005-04-16 15:20:36 -07001304static struct pci_driver i801_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001305 .name = "i801_smbus",
1306 .id_table = i801_ids,
1307 .probe = i801_probe,
1308 .remove = __devexit_p(i801_remove),
Jean Delvarea5aaea32007-03-22 19:49:01 +01001309 .suspend = i801_suspend,
1310 .resume = i801_resume,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001311};
1312
1313static int __init i2c_i801_init(void)
1314{
Jean Delvare6aa14642011-05-24 20:58:49 +02001315 if (dmi_name_in_vendors("FUJITSU"))
1316 input_apanel_init();
Linus Torvalds1da177e2005-04-16 15:20:36 -07001317 return pci_register_driver(&i801_driver);
1318}
1319
1320static void __exit i2c_i801_exit(void)
1321{
1322 pci_unregister_driver(&i801_driver);
1323}
1324
Jean Delvare63420642008-01-27 18:14:50 +01001325MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>, "
1326 "Jean Delvare <khali@linux-fr.org>");
Linus Torvalds1da177e2005-04-16 15:20:36 -07001327MODULE_DESCRIPTION("I801 SMBus driver");
1328MODULE_LICENSE("GPL");
1329
1330module_init(i2c_i801_init);
1331module_exit(i2c_i801_exit);