]> bbs.cooldavid.org Git - net-next-2.6.git/blame - drivers/i2c/busses/i2c-i801.c
i2c-i801: Handle multiple instances instead of keeping global state
[net-next-2.6.git] / drivers / i2c / busses / i2c-i801.c
CommitLineData
1da177e4 1/*
1da177e4
LT
2 Copyright (c) 1998 - 2002 Frodo Looijaard <frodol@dds.nl>,
3 Philip Edelbrock <phil@netroedge.com>, and Mark D. Studebaker
4 <mdsxyz123@yahoo.com>
cf898dc5 5 Copyright (C) 2007, 2008 Jean Delvare <khali@linux-fr.org>
0cd96eb0
DW
6 Copyright (C) 2010 Intel Corporation,
7 David Woodhouse <dwmw2@infradead.org>
1da177e4
LT
8
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/*
ae7b0497
JD
25 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
cb04e95b 43 EP80579 (Tolapai) 0x5032 32 hard yes yes yes
d28dc711
GJ
44 ICH10 0x3a30 32 hard yes yes yes
45 ICH10 0x3a60 32 hard yes yes yes
cb04e95b 46 5/3400 Series (PCH) 0x3b30 32 hard yes yes yes
39376434 47 Cougar Point (PCH) 0x1c22 32 hard yes yes yes
e30d9859 48 Patsburg (PCH) 0x1d22 32 hard yes yes yes
ae7b0497
JD
49
50 Features supported by this driver:
51 Software PEC no
52 Hardware PEC yes
53 Block buffer yes
54 Block process call transaction no
6342064c 55 I2C block read transaction yes (doesn't use the block buffer)
ae7b0497
JD
56
57 See the file Documentation/i2c/busses/i2c-i801 for details.
1da177e4
LT
58*/
59
1da177e4
LT
60#include <linux/module.h>
61#include <linux/pci.h>
62#include <linux/kernel.h>
63#include <linux/stddef.h>
64#include <linux/delay.h>
1da177e4
LT
65#include <linux/ioport.h>
66#include <linux/init.h>
67#include <linux/i2c.h>
54fb4a05 68#include <linux/acpi.h>
1561bfe5 69#include <linux/io.h>
fa5bfab7 70#include <linux/dmi.h>
1da177e4 71
1da177e4 72/* I801 SMBus address offsets */
0cd96eb0
DW
73#define SMBHSTSTS(p) (0 + (p)->smba)
74#define SMBHSTCNT(p) (2 + (p)->smba)
75#define SMBHSTCMD(p) (3 + (p)->smba)
76#define SMBHSTADD(p) (4 + (p)->smba)
77#define SMBHSTDAT0(p) (5 + (p)->smba)
78#define SMBHSTDAT1(p) (6 + (p)->smba)
79#define SMBBLKDAT(p) (7 + (p)->smba)
80#define SMBPEC(p) (8 + (p)->smba) /* ICH3 and later */
81#define SMBAUXSTS(p) (12 + (p)->smba) /* ICH4 and later */
82#define SMBAUXCTL(p) (13 + (p)->smba) /* ICH4 and later */
1da177e4
LT
83
84/* PCI Address Constants */
6dcc19df 85#define SMBBAR 4
1da177e4 86#define SMBHSTCFG 0x040
1da177e4
LT
87
88/* Host configuration bits for SMBHSTCFG */
89#define SMBHSTCFG_HST_EN 1
90#define SMBHSTCFG_SMB_SMI_EN 2
91#define SMBHSTCFG_I2C_EN 4
92
ca8b9e32
OR
93/* Auxillary control register bits, ICH4+ only */
94#define SMBAUXCTL_CRC 1
95#define SMBAUXCTL_E32B 2
96
97/* kill bit for SMBHSTCNT */
98#define SMBHSTCNT_KILL 2
99
1da177e4
LT
100/* Other settings */
101#define MAX_TIMEOUT 100
102#define ENABLE_INT9 0 /* set to 0x01 to enable - untested */
103
104/* I801 command constants */
105#define I801_QUICK 0x00
106#define I801_BYTE 0x04
107#define I801_BYTE_DATA 0x08
108#define I801_WORD_DATA 0x0C
ae7b0497 109#define I801_PROC_CALL 0x10 /* unimplemented */
1da177e4 110#define I801_BLOCK_DATA 0x14
6342064c 111#define I801_I2C_BLOCK_DATA 0x18 /* ICH5 and later */
1da177e4 112#define I801_BLOCK_LAST 0x34
6342064c 113#define I801_I2C_BLOCK_LAST 0x38 /* ICH5 and later */
1da177e4 114#define I801_START 0x40
ae7b0497 115#define I801_PEC_EN 0x80 /* ICH3 and later */
1da177e4 116
ca8b9e32
OR
117/* I801 Hosts Status register bits */
118#define SMBHSTSTS_BYTE_DONE 0x80
119#define SMBHSTSTS_INUSE_STS 0x40
120#define SMBHSTSTS_SMBALERT_STS 0x20
121#define SMBHSTSTS_FAILED 0x10
122#define SMBHSTSTS_BUS_ERR 0x08
123#define SMBHSTSTS_DEV_ERR 0x04
124#define SMBHSTSTS_INTR 0x02
125#define SMBHSTSTS_HOST_BUSY 0x01
1da177e4 126
cf898dc5
JD
127#define STATUS_FLAGS (SMBHSTSTS_BYTE_DONE | SMBHSTSTS_FAILED | \
128 SMBHSTSTS_BUS_ERR | SMBHSTSTS_DEV_ERR | \
129 SMBHSTSTS_INTR)
130
0cd96eb0
DW
131struct i801_priv {
132 struct i2c_adapter adapter;
133 unsigned long smba;
134 unsigned char original_hstcfg;
135 struct pci_dev *pci_dev;
136 unsigned int features;
137};
138
d6072f84 139static struct pci_driver i801_driver;
369f6f4a
JD
140
141#define FEATURE_SMBUS_PEC (1 << 0)
142#define FEATURE_BLOCK_BUFFER (1 << 1)
143#define FEATURE_BLOCK_PROC (1 << 2)
144#define FEATURE_I2C_BLOCK_READ (1 << 3)
1da177e4 145
adff687d
JD
146static const char *i801_feature_names[] = {
147 "SMBus PEC",
148 "Block buffer",
149 "Block process call",
150 "I2C block read",
151};
152
153static unsigned int disable_features;
154module_param(disable_features, uint, S_IRUGO | S_IWUSR);
155MODULE_PARM_DESC(disable_features, "Disable selected driver features");
156
cf898dc5
JD
157/* Make sure the SMBus host is ready to start transmitting.
158 Return 0 if it is, -EBUSY if it is not. */
0cd96eb0 159static int i801_check_pre(struct i801_priv *priv)
1da177e4 160{
2b73809d 161 int status;
1da177e4 162
0cd96eb0 163 status = inb_p(SMBHSTSTS(priv));
cf898dc5 164 if (status & SMBHSTSTS_HOST_BUSY) {
0cd96eb0 165 dev_err(&priv->pci_dev->dev, "SMBus is busy, can't use it!\n");
cf898dc5
JD
166 return -EBUSY;
167 }
168
169 status &= STATUS_FLAGS;
170 if (status) {
0cd96eb0 171 dev_dbg(&priv->pci_dev->dev, "Clearing status flags (%02x)\n",
2b73809d 172 status);
0cd96eb0
DW
173 outb_p(status, SMBHSTSTS(priv));
174 status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
cf898dc5 175 if (status) {
0cd96eb0 176 dev_err(&priv->pci_dev->dev,
cf898dc5
JD
177 "Failed clearing status flags (%02x)\n",
178 status);
97140342 179 return -EBUSY;
1da177e4
LT
180 }
181 }
182
cf898dc5
JD
183 return 0;
184}
1da177e4 185
cf898dc5 186/* Convert the status register to an error code, and clear it. */
0cd96eb0 187static int i801_check_post(struct i801_priv *priv, int status, int timeout)
cf898dc5
JD
188{
189 int result = 0;
1da177e4
LT
190
191 /* If the SMBus is still busy, we give up */
cf898dc5 192 if (timeout) {
0cd96eb0 193 dev_err(&priv->pci_dev->dev, "Transaction timeout\n");
ca8b9e32 194 /* try to stop the current command */
0cd96eb0
DW
195 dev_dbg(&priv->pci_dev->dev, "Terminating the current operation\n");
196 outb_p(inb_p(SMBHSTCNT(priv)) | SMBHSTCNT_KILL,
197 SMBHSTCNT(priv));
ca8b9e32 198 msleep(1);
0cd96eb0
DW
199 outb_p(inb_p(SMBHSTCNT(priv)) & (~SMBHSTCNT_KILL),
200 SMBHSTCNT(priv));
cf898dc5
JD
201
202 /* Check if it worked */
0cd96eb0 203 status = inb_p(SMBHSTSTS(priv));
cf898dc5
JD
204 if ((status & SMBHSTSTS_HOST_BUSY) ||
205 !(status & SMBHSTSTS_FAILED))
0cd96eb0 206 dev_err(&priv->pci_dev->dev,
cf898dc5 207 "Failed terminating the transaction\n");
0cd96eb0 208 outb_p(STATUS_FLAGS, SMBHSTSTS(priv));
cf898dc5 209 return -ETIMEDOUT;
1da177e4
LT
210 }
211
2b73809d 212 if (status & SMBHSTSTS_FAILED) {
97140342 213 result = -EIO;
0cd96eb0 214 dev_err(&priv->pci_dev->dev, "Transaction failed\n");
cf898dc5
JD
215 }
216 if (status & SMBHSTSTS_DEV_ERR) {
217 result = -ENXIO;
0cd96eb0 218 dev_dbg(&priv->pci_dev->dev, "No response\n");
1da177e4 219 }
2b73809d 220 if (status & SMBHSTSTS_BUS_ERR) {
dcb5c923 221 result = -EAGAIN;
0cd96eb0 222 dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n");
1da177e4
LT
223 }
224
cf898dc5
JD
225 if (result) {
226 /* Clear error flags */
0cd96eb0
DW
227 outb_p(status & STATUS_FLAGS, SMBHSTSTS(priv));
228 status = inb_p(SMBHSTSTS(priv)) & STATUS_FLAGS;
cf898dc5 229 if (status) {
0cd96eb0 230 dev_warn(&priv->pci_dev->dev, "Failed clearing status "
cf898dc5
JD
231 "flags at end of transaction (%02x)\n",
232 status);
233 }
1da177e4
LT
234 }
235
1da177e4
LT
236 return result;
237}
238
0cd96eb0 239static int i801_transaction(struct i801_priv *priv, int xact)
cf898dc5
JD
240{
241 int status;
242 int result;
243 int timeout = 0;
244
0cd96eb0 245 result = i801_check_pre(priv);
cf898dc5
JD
246 if (result < 0)
247 return result;
248
249 /* the current contents of SMBHSTCNT can be overwritten, since PEC,
250 * INTREN, SMBSCMD are passed in xact */
0cd96eb0 251 outb_p(xact | I801_START, SMBHSTCNT(priv));
cf898dc5
JD
252
253 /* We will always wait for a fraction of a second! */
254 do {
255 msleep(1);
0cd96eb0 256 status = inb_p(SMBHSTSTS(priv));
cf898dc5
JD
257 } while ((status & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT));
258
0cd96eb0 259 result = i801_check_post(priv, status, timeout > MAX_TIMEOUT);
cf898dc5
JD
260 if (result < 0)
261 return result;
262
0cd96eb0 263 outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
cf898dc5
JD
264 return 0;
265}
266
ca8b9e32 267/* wait for INTR bit as advised by Intel */
0cd96eb0 268static void i801_wait_hwpec(struct i801_priv *priv)
ca8b9e32
OR
269{
270 int timeout = 0;
2b73809d 271 int status;
ca8b9e32
OR
272
273 do {
274 msleep(1);
0cd96eb0 275 status = inb_p(SMBHSTSTS(priv));
2b73809d 276 } while ((!(status & SMBHSTSTS_INTR))
ca8b9e32
OR
277 && (timeout++ < MAX_TIMEOUT));
278
4ccc28f7 279 if (timeout > MAX_TIMEOUT)
0cd96eb0 280 dev_dbg(&priv->pci_dev->dev, "PEC Timeout!\n");
4ccc28f7 281
0cd96eb0 282 outb_p(status, SMBHSTSTS(priv));
ca8b9e32
OR
283}
284
0cd96eb0
DW
285static int i801_block_transaction_by_block(struct i801_priv *priv,
286 union i2c_smbus_data *data,
7edcb9ab
OR
287 char read_write, int hwpec)
288{
289 int i, len;
97140342 290 int status;
7edcb9ab 291
0cd96eb0 292 inb_p(SMBHSTCNT(priv)); /* reset the data buffer index */
7edcb9ab
OR
293
294 /* Use 32-byte buffer to process this transaction */
295 if (read_write == I2C_SMBUS_WRITE) {
296 len = data->block[0];
0cd96eb0 297 outb_p(len, SMBHSTDAT0(priv));
7edcb9ab 298 for (i = 0; i < len; i++)
0cd96eb0 299 outb_p(data->block[i+1], SMBBLKDAT(priv));
7edcb9ab
OR
300 }
301
0cd96eb0 302 status = i801_transaction(priv, I801_BLOCK_DATA | ENABLE_INT9 |
97140342
DB
303 I801_PEC_EN * hwpec);
304 if (status)
305 return status;
7edcb9ab
OR
306
307 if (read_write == I2C_SMBUS_READ) {
0cd96eb0 308 len = inb_p(SMBHSTDAT0(priv));
7edcb9ab 309 if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
97140342 310 return -EPROTO;
7edcb9ab
OR
311
312 data->block[0] = len;
313 for (i = 0; i < len; i++)
0cd96eb0 314 data->block[i + 1] = inb_p(SMBBLKDAT(priv));
7edcb9ab
OR
315 }
316 return 0;
317}
318
0cd96eb0
DW
319static int i801_block_transaction_byte_by_byte(struct i801_priv *priv,
320 union i2c_smbus_data *data,
6342064c
JD
321 char read_write, int command,
322 int hwpec)
1da177e4
LT
323{
324 int i, len;
325 int smbcmd;
2b73809d 326 int status;
cf898dc5 327 int result;
1da177e4 328 int timeout;
cf898dc5 329
0cd96eb0 330 result = i801_check_pre(priv);
cf898dc5
JD
331 if (result < 0)
332 return result;
1da177e4 333
7edcb9ab 334 len = data->block[0];
1da177e4
LT
335
336 if (read_write == I2C_SMBUS_WRITE) {
0cd96eb0
DW
337 outb_p(len, SMBHSTDAT0(priv));
338 outb_p(data->block[1], SMBBLKDAT(priv));
1da177e4
LT
339 }
340
341 for (i = 1; i <= len; i++) {
6342064c
JD
342 if (i == len && read_write == I2C_SMBUS_READ) {
343 if (command == I2C_SMBUS_I2C_BLOCK_DATA)
344 smbcmd = I801_I2C_BLOCK_LAST;
345 else
346 smbcmd = I801_BLOCK_LAST;
347 } else {
348 if (command == I2C_SMBUS_I2C_BLOCK_DATA
349 && read_write == I2C_SMBUS_READ)
350 smbcmd = I801_I2C_BLOCK_DATA;
351 else
352 smbcmd = I801_BLOCK_DATA;
353 }
0cd96eb0 354 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT(priv));
1da177e4 355
1da177e4 356 if (i == 1)
0cd96eb0
DW
357 outb_p(inb(SMBHSTCNT(priv)) | I801_START,
358 SMBHSTCNT(priv));
1da177e4
LT
359
360 /* We will always wait for a fraction of a second! */
361 timeout = 0;
362 do {
1da177e4 363 msleep(1);
0cd96eb0 364 status = inb_p(SMBHSTSTS(priv));
3fb21c64
IM
365 } while ((!(status & SMBHSTSTS_BYTE_DONE))
366 && (timeout++ < MAX_TIMEOUT));
1da177e4 367
0cd96eb0 368 result = i801_check_post(priv, status, timeout > MAX_TIMEOUT);
cf898dc5
JD
369 if (result < 0)
370 return result;
1da177e4 371
6342064c
JD
372 if (i == 1 && read_write == I2C_SMBUS_READ
373 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
0cd96eb0 374 len = inb_p(SMBHSTDAT0(priv));
cf898dc5 375 if (len < 1 || len > I2C_SMBUS_BLOCK_MAX) {
0cd96eb0 376 dev_err(&priv->pci_dev->dev,
cf898dc5
JD
377 "Illegal SMBus block read size %d\n",
378 len);
379 /* Recover */
0cd96eb0
DW
380 while (inb_p(SMBHSTSTS(priv)) &
381 SMBHSTSTS_HOST_BUSY)
382 outb_p(SMBHSTSTS_BYTE_DONE,
383 SMBHSTSTS(priv));
384 outb_p(SMBHSTSTS_INTR, SMBHSTSTS(priv));
97140342 385 return -EPROTO;
cf898dc5 386 }
1da177e4
LT
387 data->block[0] = len;
388 }
389
390 /* Retrieve/store value in SMBBLKDAT */
391 if (read_write == I2C_SMBUS_READ)
0cd96eb0 392 data->block[i] = inb_p(SMBBLKDAT(priv));
1da177e4 393 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
0cd96eb0 394 outb_p(data->block[i+1], SMBBLKDAT(priv));
1da177e4 395
cf898dc5 396 /* signals SMBBLKDAT ready */
0cd96eb0 397 outb_p(SMBHSTSTS_BYTE_DONE | SMBHSTSTS_INTR, SMBHSTSTS(priv));
1da177e4 398 }
cf898dc5
JD
399
400 return 0;
7edcb9ab 401}
1da177e4 402
0cd96eb0 403static int i801_set_block_buffer_mode(struct i801_priv *priv)
7edcb9ab 404{
0cd96eb0
DW
405 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_E32B, SMBAUXCTL(priv));
406 if ((inb_p(SMBAUXCTL(priv)) & SMBAUXCTL_E32B) == 0)
97140342 407 return -EIO;
7edcb9ab
OR
408 return 0;
409}
410
411/* Block transaction function */
0cd96eb0
DW
412static int i801_block_transaction(struct i801_priv *priv,
413 union i2c_smbus_data *data, char read_write,
7edcb9ab
OR
414 int command, int hwpec)
415{
416 int result = 0;
417 unsigned char hostc;
418
419 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
420 if (read_write == I2C_SMBUS_WRITE) {
421 /* set I2C_EN bit in configuration register */
0cd96eb0
DW
422 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &hostc);
423 pci_write_config_byte(priv->pci_dev, SMBHSTCFG,
7edcb9ab 424 hostc | SMBHSTCFG_I2C_EN);
0cd96eb0
DW
425 } else if (!(priv->features & FEATURE_I2C_BLOCK_READ)) {
426 dev_err(&priv->pci_dev->dev,
6342064c 427 "I2C block read is unsupported!\n");
97140342 428 return -EOPNOTSUPP;
7edcb9ab
OR
429 }
430 }
431
6342064c
JD
432 if (read_write == I2C_SMBUS_WRITE
433 || command == I2C_SMBUS_I2C_BLOCK_DATA) {
7edcb9ab
OR
434 if (data->block[0] < 1)
435 data->block[0] = 1;
436 if (data->block[0] > I2C_SMBUS_BLOCK_MAX)
437 data->block[0] = I2C_SMBUS_BLOCK_MAX;
438 } else {
6342064c 439 data->block[0] = 32; /* max for SMBus block reads */
7edcb9ab
OR
440 }
441
c074c39d
JD
442 /* Experience has shown that the block buffer can only be used for
443 SMBus (not I2C) block transactions, even though the datasheet
444 doesn't mention this limitation. */
0cd96eb0 445 if ((priv->features & FEATURE_BLOCK_BUFFER)
c074c39d 446 && command != I2C_SMBUS_I2C_BLOCK_DATA
0cd96eb0
DW
447 && i801_set_block_buffer_mode(priv) == 0)
448 result = i801_block_transaction_by_block(priv, data,
449 read_write, hwpec);
7edcb9ab 450 else
0cd96eb0
DW
451 result = i801_block_transaction_byte_by_byte(priv, data,
452 read_write,
6342064c 453 command, hwpec);
7edcb9ab
OR
454
455 if (result == 0 && hwpec)
0cd96eb0 456 i801_wait_hwpec(priv);
1da177e4 457
6342064c
JD
458 if (command == I2C_SMBUS_I2C_BLOCK_DATA
459 && read_write == I2C_SMBUS_WRITE) {
1da177e4 460 /* restore saved configuration register value */
0cd96eb0 461 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hostc);
1da177e4
LT
462 }
463 return result;
464}
465
97140342 466/* Return negative errno on error. */
3fb21c64 467static s32 i801_access(struct i2c_adapter *adap, u16 addr,
1da177e4 468 unsigned short flags, char read_write, u8 command,
3fb21c64 469 int size, union i2c_smbus_data *data)
1da177e4 470{
e8aac4a9 471 int hwpec;
1da177e4
LT
472 int block = 0;
473 int ret, xact = 0;
0cd96eb0 474 struct i801_priv *priv = i2c_get_adapdata(adap);
1da177e4 475
0cd96eb0 476 hwpec = (priv->features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC)
e8aac4a9
JD
477 && size != I2C_SMBUS_QUICK
478 && size != I2C_SMBUS_I2C_BLOCK_DATA;
1da177e4
LT
479
480 switch (size) {
481 case I2C_SMBUS_QUICK:
482 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
0cd96eb0 483 SMBHSTADD(priv));
1da177e4
LT
484 xact = I801_QUICK;
485 break;
486 case I2C_SMBUS_BYTE:
487 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
0cd96eb0 488 SMBHSTADD(priv));
1da177e4 489 if (read_write == I2C_SMBUS_WRITE)
0cd96eb0 490 outb_p(command, SMBHSTCMD(priv));
1da177e4
LT
491 xact = I801_BYTE;
492 break;
493 case I2C_SMBUS_BYTE_DATA:
494 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
0cd96eb0
DW
495 SMBHSTADD(priv));
496 outb_p(command, SMBHSTCMD(priv));
1da177e4 497 if (read_write == I2C_SMBUS_WRITE)
0cd96eb0 498 outb_p(data->byte, SMBHSTDAT0(priv));
1da177e4
LT
499 xact = I801_BYTE_DATA;
500 break;
501 case I2C_SMBUS_WORD_DATA:
502 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
0cd96eb0
DW
503 SMBHSTADD(priv));
504 outb_p(command, SMBHSTCMD(priv));
1da177e4 505 if (read_write == I2C_SMBUS_WRITE) {
0cd96eb0
DW
506 outb_p(data->word & 0xff, SMBHSTDAT0(priv));
507 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1(priv));
1da177e4
LT
508 }
509 xact = I801_WORD_DATA;
510 break;
511 case I2C_SMBUS_BLOCK_DATA:
1da177e4 512 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
0cd96eb0
DW
513 SMBHSTADD(priv));
514 outb_p(command, SMBHSTCMD(priv));
1da177e4
LT
515 block = 1;
516 break;
6342064c
JD
517 case I2C_SMBUS_I2C_BLOCK_DATA:
518 /* NB: page 240 of ICH5 datasheet shows that the R/#W
519 * bit should be cleared here, even when reading */
0cd96eb0 520 outb_p((addr & 0x7f) << 1, SMBHSTADD(priv));
6342064c
JD
521 if (read_write == I2C_SMBUS_READ) {
522 /* NB: page 240 of ICH5 datasheet also shows
523 * that DATA1 is the cmd field when reading */
0cd96eb0 524 outb_p(command, SMBHSTDAT1(priv));
6342064c 525 } else
0cd96eb0 526 outb_p(command, SMBHSTCMD(priv));
6342064c
JD
527 block = 1;
528 break;
1da177e4 529 default:
0cd96eb0
DW
530 dev_err(&priv->pci_dev->dev, "Unsupported transaction %d\n",
531 size);
97140342 532 return -EOPNOTSUPP;
1da177e4
LT
533 }
534
ca8b9e32 535 if (hwpec) /* enable/disable hardware PEC */
0cd96eb0 536 outb_p(inb_p(SMBAUXCTL(priv)) | SMBAUXCTL_CRC, SMBAUXCTL(priv));
ca8b9e32 537 else
0cd96eb0
DW
538 outb_p(inb_p(SMBAUXCTL(priv)) & (~SMBAUXCTL_CRC),
539 SMBAUXCTL(priv));
e8aac4a9 540
3fb21c64 541 if (block)
0cd96eb0
DW
542 ret = i801_block_transaction(priv, data, read_write, size,
543 hwpec);
7edcb9ab 544 else
0cd96eb0 545 ret = i801_transaction(priv, xact | ENABLE_INT9);
1da177e4 546
c79cfbac 547 /* Some BIOSes don't like it when PEC is enabled at reboot or resume
7edcb9ab
OR
548 time, so we forcibly disable it after every transaction. Turn off
549 E32B for the same reason. */
a0921b6c 550 if (hwpec || block)
0cd96eb0
DW
551 outb_p(inb_p(SMBAUXCTL(priv)) &
552 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
c79cfbac 553
3fb21c64 554 if (block)
1da177e4 555 return ret;
3fb21c64 556 if (ret)
97140342 557 return ret;
1da177e4
LT
558 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
559 return 0;
560
561 switch (xact & 0x7f) {
562 case I801_BYTE: /* Result put in SMBHSTDAT0 */
563 case I801_BYTE_DATA:
0cd96eb0 564 data->byte = inb_p(SMBHSTDAT0(priv));
1da177e4
LT
565 break;
566 case I801_WORD_DATA:
0cd96eb0
DW
567 data->word = inb_p(SMBHSTDAT0(priv)) +
568 (inb_p(SMBHSTDAT1(priv)) << 8);
1da177e4
LT
569 break;
570 }
571 return 0;
572}
573
574
575static u32 i801_func(struct i2c_adapter *adapter)
576{
0cd96eb0
DW
577 struct i801_priv *priv = i2c_get_adapdata(adapter);
578
1da177e4 579 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
369f6f4a
JD
580 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
581 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK |
0cd96eb0
DW
582 ((priv->features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0) |
583 ((priv->features & FEATURE_I2C_BLOCK_READ) ?
6342064c 584 I2C_FUNC_SMBUS_READ_I2C_BLOCK : 0);
1da177e4
LT
585}
586
8f9082c5 587static const struct i2c_algorithm smbus_algorithm = {
1da177e4
LT
588 .smbus_xfer = i801_access,
589 .functionality = i801_func,
590};
591
4111ecd2 592static const struct pci_device_id i801_ids[] = {
1da177e4
LT
593 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
594 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
595 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
596 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
597 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
598 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
599 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
600 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
601 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
b0a70b57 602 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
8254fc4a 603 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
adbc2a10 604 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
cb04e95b 605 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EP80579_1) },
d28dc711
GJ
606 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_4) },
607 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH10_5) },
cb04e95b
SH
608 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_5_3400_SERIES_SMBUS) },
609 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS) },
e30d9859 610 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS) },
1da177e4
LT
611 { 0, }
612};
613
3fb21c64 614MODULE_DEVICE_TABLE(pci, i801_ids);
1da177e4 615
1561bfe5
JD
616#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
617static unsigned char apanel_addr;
618
619/* Scan the system ROM for the signature "FJKEYINF" */
620static __init const void __iomem *bios_signature(const void __iomem *bios)
621{
622 ssize_t offset;
623 const unsigned char signature[] = "FJKEYINF";
624
625 for (offset = 0; offset < 0x10000; offset += 0x10) {
626 if (check_signature(bios + offset, signature,
627 sizeof(signature)-1))
628 return bios + offset;
629 }
630 return NULL;
631}
632
633static void __init input_apanel_init(void)
634{
635 void __iomem *bios;
636 const void __iomem *p;
637
638 bios = ioremap(0xF0000, 0x10000); /* Can't fail */
639 p = bios_signature(bios);
640 if (p) {
641 /* just use the first address */
642 apanel_addr = readb(p + 8 + 3) >> 1;
643 }
644 iounmap(bios);
645}
646#else
647static void __init input_apanel_init(void) {}
648#endif
649
fa5bfab7
HG
650#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
651struct dmi_onboard_device_info {
652 const char *name;
653 u8 type;
654 unsigned short i2c_addr;
655 const char *i2c_type;
656};
657
658static struct dmi_onboard_device_info __devinitdata dmi_devices[] = {
659 { "Syleus", DMI_DEV_TYPE_OTHER, 0x73, "fscsyl" },
660 { "Hermes", DMI_DEV_TYPE_OTHER, 0x73, "fscher" },
661 { "Hades", DMI_DEV_TYPE_OTHER, 0x73, "fschds" },
662};
663
664static void __devinit dmi_check_onboard_device(u8 type, const char *name,
665 struct i2c_adapter *adap)
666{
667 int i;
668 struct i2c_board_info info;
669
670 for (i = 0; i < ARRAY_SIZE(dmi_devices); i++) {
671 /* & ~0x80, ignore enabled/disabled bit */
672 if ((type & ~0x80) != dmi_devices[i].type)
673 continue;
faabd47f 674 if (strcasecmp(name, dmi_devices[i].name))
fa5bfab7
HG
675 continue;
676
677 memset(&info, 0, sizeof(struct i2c_board_info));
678 info.addr = dmi_devices[i].i2c_addr;
679 strlcpy(info.type, dmi_devices[i].i2c_type, I2C_NAME_SIZE);
680 i2c_new_device(adap, &info);
681 break;
682 }
683}
684
685/* We use our own function to check for onboard devices instead of
686 dmi_find_device() as some buggy BIOS's have the devices we are interested
687 in marked as disabled */
688static void __devinit dmi_check_onboard_devices(const struct dmi_header *dm,
689 void *adap)
690{
691 int i, count;
692
693 if (dm->type != 10)
694 return;
695
696 count = (dm->length - sizeof(struct dmi_header)) / 2;
697 for (i = 0; i < count; i++) {
698 const u8 *d = (char *)(dm + 1) + (i * 2);
699 const char *name = ((char *) dm) + dm->length;
700 u8 type = d[0];
701 u8 s = d[1];
702
703 if (!s)
704 continue;
705 s--;
706 while (s > 0 && name[0]) {
707 name += strlen(name) + 1;
708 s--;
709 }
710 if (name[0] == 0) /* Bogus string reference */
711 continue;
712
713 dmi_check_onboard_device(type, name, adap);
714 }
715}
716#endif
717
3fb21c64
IM
718static int __devinit i801_probe(struct pci_dev *dev,
719 const struct pci_device_id *id)
1da177e4 720{
02dd7ae2 721 unsigned char temp;
adff687d 722 int err, i;
0cd96eb0
DW
723 struct i801_priv *priv;
724
725 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
726 if (!priv)
727 return -ENOMEM;
728
729 i2c_set_adapdata(&priv->adapter, priv);
730 priv->adapter.owner = THIS_MODULE;
731 priv->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
732 priv->adapter.algo = &smbus_algorithm;
1da177e4 733
0cd96eb0 734 priv->pci_dev = dev;
250d1bd3 735 switch (dev->device) {
e0e8398c 736 default:
0cd96eb0 737 priv->features |= FEATURE_I2C_BLOCK_READ;
6342064c
JD
738 /* fall through */
739 case PCI_DEVICE_ID_INTEL_82801DB_3:
0cd96eb0
DW
740 priv->features |= FEATURE_SMBUS_PEC;
741 priv->features |= FEATURE_BLOCK_BUFFER;
e0e8398c
JD
742 /* fall through */
743 case PCI_DEVICE_ID_INTEL_82801CA_3:
744 case PCI_DEVICE_ID_INTEL_82801BA_2:
745 case PCI_DEVICE_ID_INTEL_82801AB_3:
746 case PCI_DEVICE_ID_INTEL_82801AA_3:
250d1bd3 747 break;
250d1bd3 748 }
02dd7ae2 749
adff687d
JD
750 /* Disable features on user request */
751 for (i = 0; i < ARRAY_SIZE(i801_feature_names); i++) {
0cd96eb0 752 if (priv->features & disable_features & (1 << i))
adff687d
JD
753 dev_notice(&dev->dev, "%s disabled by user\n",
754 i801_feature_names[i]);
755 }
0cd96eb0 756 priv->features &= ~disable_features;
adff687d 757
02dd7ae2
JD
758 err = pci_enable_device(dev);
759 if (err) {
760 dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
761 err);
762 goto exit;
763 }
764
765 /* Determine the address of the SMBus area */
0cd96eb0
DW
766 priv->smba = pci_resource_start(dev, SMBBAR);
767 if (!priv->smba) {
02dd7ae2
JD
768 dev_err(&dev->dev, "SMBus base address uninitialized, "
769 "upgrade BIOS\n");
770 err = -ENODEV;
d6fcb3b9 771 goto exit;
02dd7ae2
JD
772 }
773
54fb4a05 774 err = acpi_check_resource_conflict(&dev->resource[SMBBAR]);
18669eab
JD
775 if (err) {
776 err = -ENODEV;
54fb4a05 777 goto exit;
18669eab 778 }
54fb4a05 779
02dd7ae2
JD
780 err = pci_request_region(dev, SMBBAR, i801_driver.name);
781 if (err) {
782 dev_err(&dev->dev, "Failed to request SMBus region "
0cd96eb0 783 "0x%lx-0x%Lx\n", priv->smba,
598736c5 784 (unsigned long long)pci_resource_end(dev, SMBBAR));
d6fcb3b9 785 goto exit;
02dd7ae2
JD
786 }
787
0cd96eb0
DW
788 pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp);
789 priv->original_hstcfg = temp;
02dd7ae2
JD
790 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
791 if (!(temp & SMBHSTCFG_HST_EN)) {
792 dev_info(&dev->dev, "Enabling SMBus device\n");
793 temp |= SMBHSTCFG_HST_EN;
794 }
0cd96eb0 795 pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp);
02dd7ae2
JD
796
797 if (temp & SMBHSTCFG_SMB_SMI_EN)
798 dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
799 else
800 dev_dbg(&dev->dev, "SMBus using PCI Interrupt\n");
1da177e4 801
a0921b6c 802 /* Clear special mode bits */
0cd96eb0
DW
803 if (priv->features & (FEATURE_SMBUS_PEC | FEATURE_BLOCK_BUFFER))
804 outb_p(inb_p(SMBAUXCTL(priv)) &
805 ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B), SMBAUXCTL(priv));
a0921b6c 806
405ae7d3 807 /* set up the sysfs linkage to our parent device */
0cd96eb0 808 priv->adapter.dev.parent = &dev->dev;
1da177e4 809
7e2193a8 810 /* Retry up to 3 times on lost arbitration */
0cd96eb0 811 priv->adapter.retries = 3;
7e2193a8 812
0cd96eb0
DW
813 snprintf(priv->adapter.name, sizeof(priv->adapter.name),
814 "SMBus I801 adapter at %04lx", priv->smba);
815 err = i2c_add_adapter(&priv->adapter);
02dd7ae2
JD
816 if (err) {
817 dev_err(&dev->dev, "Failed to add SMBus adapter\n");
d6fcb3b9 818 goto exit_release;
02dd7ae2 819 }
1561bfe5
JD
820
821 /* Register optional slaves */
822#if defined CONFIG_INPUT_APANEL || defined CONFIG_INPUT_APANEL_MODULE
823 if (apanel_addr) {
824 struct i2c_board_info info;
825
826 memset(&info, 0, sizeof(struct i2c_board_info));
827 info.addr = apanel_addr;
828 strlcpy(info.type, "fujitsu_apanel", I2C_NAME_SIZE);
0cd96eb0 829 i2c_new_device(&priv->adapter, &info);
1561bfe5
JD
830 }
831#endif
fa5bfab7 832#if defined CONFIG_SENSORS_FSCHMD || defined CONFIG_SENSORS_FSCHMD_MODULE
faabd47f 833 if (dmi_name_in_vendors("FUJITSU"))
0cd96eb0 834 dmi_walk(dmi_check_onboard_devices, &priv->adapter);
fa5bfab7 835#endif
1561bfe5 836
0cd96eb0 837 pci_set_drvdata(dev, priv);
d6fcb3b9 838 return 0;
02dd7ae2 839
d6fcb3b9
DR
840exit_release:
841 pci_release_region(dev, SMBBAR);
02dd7ae2 842exit:
0cd96eb0 843 kfree(priv);
02dd7ae2 844 return err;
1da177e4
LT
845}
846
847static void __devexit i801_remove(struct pci_dev *dev)
848{
0cd96eb0
DW
849 struct i801_priv *priv = pci_get_drvdata(dev);
850
851 i2c_del_adapter(&priv->adapter);
852 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
6dcc19df 853 pci_release_region(dev, SMBBAR);
0cd96eb0
DW
854 pci_set_drvdata(dev, NULL);
855 kfree(priv);
d6fcb3b9
DR
856 /*
857 * do not call pci_disable_device(dev) since it can cause hard hangs on
858 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
859 */
1da177e4
LT
860}
861
a5aaea37
JD
862#ifdef CONFIG_PM
863static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
864{
0cd96eb0
DW
865 struct i801_priv *priv = pci_get_drvdata(dev);
866
a5aaea37 867 pci_save_state(dev);
0cd96eb0 868 pci_write_config_byte(dev, SMBHSTCFG, priv->original_hstcfg);
a5aaea37
JD
869 pci_set_power_state(dev, pci_choose_state(dev, mesg));
870 return 0;
871}
872
873static int i801_resume(struct pci_dev *dev)
874{
875 pci_set_power_state(dev, PCI_D0);
876 pci_restore_state(dev);
877 return pci_enable_device(dev);
878}
879#else
880#define i801_suspend NULL
881#define i801_resume NULL
882#endif
883
1da177e4
LT
884static struct pci_driver i801_driver = {
885 .name = "i801_smbus",
886 .id_table = i801_ids,
887 .probe = i801_probe,
888 .remove = __devexit_p(i801_remove),
a5aaea37
JD
889 .suspend = i801_suspend,
890 .resume = i801_resume,
1da177e4
LT
891};
892
893static int __init i2c_i801_init(void)
894{
1561bfe5 895 input_apanel_init();
1da177e4
LT
896 return pci_register_driver(&i801_driver);
897}
898
899static void __exit i2c_i801_exit(void)
900{
901 pci_unregister_driver(&i801_driver);
902}
903
6342064c
JD
904MODULE_AUTHOR("Mark D. Studebaker <mdsxyz123@yahoo.com>, "
905 "Jean Delvare <khali@linux-fr.org>");
1da177e4
LT
906MODULE_DESCRIPTION("I801 SMBus driver");
907MODULE_LICENSE("GPL");
908
909module_init(i2c_i801_init);
910module_exit(i2c_i801_exit);