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