2 i2c-i801.c - Part of lm_sensors, Linux kernel modules for hardware
4 Copyright (c) 1998 - 2002 Frodo Looijaard <frodol@dds.nl>,
5 Philip Edelbrock <phil@netroedge.com>, and Mark D. Studebaker
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 SUPPORTED DEVICES PCI ID
29 82801DB 24C3 (HW PEC supported, 32 byte buffer not supported)
30 82801EB 24D3 (HW PEC supported, 32 byte buffer not supported)
36 This driver supports several versions of Intel's I/O Controller Hubs (ICH).
37 For SMBus support, they are similar to the PIIX4 and are part
38 of Intel's '810' and other chipsets.
39 See the file Documentation/i2c/busses/i2c-i801 for details.
40 I2C Block Read and Process Call are not supported.
43 /* Note: we assume there can only be one I801, with one SMBus interface */
45 #include <linux/module.h>
46 #include <linux/pci.h>
47 #include <linux/kernel.h>
48 #include <linux/stddef.h>
49 #include <linux/delay.h>
50 #include <linux/sched.h>
51 #include <linux/ioport.h>
52 #include <linux/init.h>
53 #include <linux/i2c.h>
56 /* I801 SMBus address offsets */
57 #define SMBHSTSTS (0 + i801_smba)
58 #define SMBHSTCNT (2 + i801_smba)
59 #define SMBHSTCMD (3 + i801_smba)
60 #define SMBHSTADD (4 + i801_smba)
61 #define SMBHSTDAT0 (5 + i801_smba)
62 #define SMBHSTDAT1 (6 + i801_smba)
63 #define SMBBLKDAT (7 + i801_smba)
64 #define SMBPEC (8 + i801_smba) /* ICH4 only */
65 #define SMBAUXSTS (12 + i801_smba) /* ICH4 only */
66 #define SMBAUXCTL (13 + i801_smba) /* ICH4 only */
68 /* PCI Address Constants */
70 #define SMBHSTCFG 0x040
73 /* Host configuration bits for SMBHSTCFG */
74 #define SMBHSTCFG_HST_EN 1
75 #define SMBHSTCFG_SMB_SMI_EN 2
76 #define SMBHSTCFG_I2C_EN 4
79 #define MAX_TIMEOUT 100
80 #define ENABLE_INT9 0 /* set to 0x01 to enable - untested */
82 /* I801 command constants */
83 #define I801_QUICK 0x00
84 #define I801_BYTE 0x04
85 #define I801_BYTE_DATA 0x08
86 #define I801_WORD_DATA 0x0C
87 #define I801_PROC_CALL 0x10 /* later chips only, unimplemented */
88 #define I801_BLOCK_DATA 0x14
89 #define I801_I2C_BLOCK_DATA 0x18 /* unimplemented */
90 #define I801_BLOCK_LAST 0x34
91 #define I801_I2C_BLOCK_LAST 0x38 /* unimplemented */
92 #define I801_START 0x40
93 #define I801_PEC_EN 0x80 /* ICH4 only */
96 static int i801_transaction(void);
97 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
98 int command, int hwpec);
100 static unsigned long i801_smba;
101 static struct pci_driver i801_driver;
102 static struct pci_dev *I801_dev;
105 static int __devinit i801_setup(struct pci_dev *dev)
111 if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) ||
112 (dev->device == PCI_DEVICE_ID_INTEL_82801EB_3) ||
113 (dev->device == PCI_DEVICE_ID_INTEL_ESB_4))
118 err = pci_enable_device(dev);
120 dev_err(&dev->dev, "Failed to enable SMBus device (%d)\n",
125 /* Determine the address of the SMBus area */
126 i801_smba = pci_resource_start(dev, SMBBAR);
128 dev_err(&dev->dev, "SMBus base address uninitialized, "
134 err = pci_request_region(dev, SMBBAR, i801_driver.name);
136 dev_err(&dev->dev, "Failed to request SMBus region "
137 "0x%lx-0x%lx\n", i801_smba,
138 pci_resource_end(dev, SMBBAR));
142 pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
143 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
144 if (!(temp & SMBHSTCFG_HST_EN)) {
145 dev_warn(&dev->dev, "enabling SMBus device\n");
146 temp |= SMBHSTCFG_HST_EN;
148 pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
150 if (temp & SMBHSTCFG_SMB_SMI_EN)
151 dev_dbg(&dev->dev, "I801 using Interrupt SMI# for SMBus.\n");
153 dev_dbg(&dev->dev, "I801 using PCI Interrupt for SMBus.\n");
155 pci_read_config_byte(I801_dev, SMBREV, &temp);
156 dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp);
157 dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba);
162 pci_disable_device(dev);
167 static int i801_transaction(void)
173 dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
174 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
175 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
178 /* Make sure the SMBus host is ready to start transmitting */
179 /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
180 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
181 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting...\n",
183 outb_p(temp, SMBHSTSTS);
184 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
185 dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
188 dev_dbg(&I801_dev->dev, "Successfull!\n");
192 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
194 /* We will always wait for a fraction of a second! */
197 temp = inb_p(SMBHSTSTS);
198 } while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
200 /* If the SMBus is still busy, we give up */
201 if (timeout >= MAX_TIMEOUT) {
202 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
208 dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
213 dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
214 "until next hard reset. (sorry!)\n");
215 /* Clock stops and slave is stuck in mid-transmission */
220 dev_dbg(&I801_dev->dev, "Error: no response!\n");
223 if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
224 outb_p(inb(SMBHSTSTS), SMBHSTSTS);
226 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
227 dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
230 dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
231 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
232 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
237 /* All-inclusive block transaction function */
238 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
239 int command, int hwpec)
246 unsigned char hostc, errmask;
248 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
249 if (read_write == I2C_SMBUS_WRITE) {
250 /* set I2C_EN bit in configuration register */
251 pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
252 pci_write_config_byte(I801_dev, SMBHSTCFG,
253 hostc | SMBHSTCFG_I2C_EN);
255 dev_err(&I801_dev->dev,
256 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
261 if (read_write == I2C_SMBUS_WRITE) {
262 len = data->block[0];
267 outb_p(len, SMBHSTDAT0);
268 outb_p(data->block[1], SMBBLKDAT);
270 len = 32; /* max for reads */
273 if(isich4 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
274 /* set 32 byte buffer */
277 for (i = 1; i <= len; i++) {
278 if (i == len && read_write == I2C_SMBUS_READ)
279 smbcmd = I801_BLOCK_LAST;
281 smbcmd = I801_BLOCK_DATA;
282 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
284 dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
285 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
286 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
287 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
289 /* Make sure the SMBus host is ready to start transmitting */
290 temp = inb_p(SMBHSTSTS);
292 /* Erronenous conditions before transaction:
293 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
296 /* Erronenous conditions during transaction:
297 * Failed, Bus_Err, Dev_Err, Intr */
300 if (temp & errmask) {
301 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
302 "Resetting...\n", temp);
303 outb_p(temp, SMBHSTSTS);
304 if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
305 dev_err(&I801_dev->dev,
306 "Reset failed! (%02x)\n", temp);
311 /* if die in middle of block transaction, fail */
318 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
320 /* We will always wait for a fraction of a second! */
324 temp = inb_p(SMBHSTSTS);
326 while ((!(temp & 0x80))
327 && (timeout++ < MAX_TIMEOUT));
329 /* If the SMBus is still busy, we give up */
330 if (timeout >= MAX_TIMEOUT) {
332 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
337 dev_dbg(&I801_dev->dev,
338 "Error: Failed bus transaction\n");
339 } else if (temp & 0x08) {
341 dev_err(&I801_dev->dev, "Bus collision!\n");
342 } else if (temp & 0x04) {
344 dev_dbg(&I801_dev->dev, "Error: no response!\n");
347 if (i == 1 && read_write == I2C_SMBUS_READ) {
348 len = inb_p(SMBHSTDAT0);
353 data->block[0] = len;
356 /* Retrieve/store value in SMBBLKDAT */
357 if (read_write == I2C_SMBUS_READ)
358 data->block[i] = inb_p(SMBBLKDAT);
359 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
360 outb_p(data->block[i+1], SMBBLKDAT);
361 if ((temp & 0x9e) != 0x00)
362 outb_p(temp, SMBHSTSTS); /* signals SMBBLKDAT ready */
364 if ((temp = (0x1e & inb_p(SMBHSTSTS))) != 0x00) {
365 dev_dbg(&I801_dev->dev,
366 "Bad status (%02x) at end of transaction\n",
369 dev_dbg(&I801_dev->dev, "Block (post %d): CNT=%02x, CMD=%02x, "
370 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
371 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
372 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
379 /* wait for INTR bit as advised by Intel */
383 temp = inb_p(SMBHSTSTS);
384 } while ((!(temp & 0x02))
385 && (timeout++ < MAX_TIMEOUT));
387 if (timeout >= MAX_TIMEOUT) {
388 dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
390 outb_p(temp, SMBHSTSTS);
394 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
395 /* restore saved configuration register value */
396 pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
401 /* Return -1 on error. */
402 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
403 unsigned short flags, char read_write, u8 command,
404 int size, union i2c_smbus_data * data)
410 hwpec = isich4 && (flags & I2C_CLIENT_PEC)
411 && size != I2C_SMBUS_QUICK
412 && size != I2C_SMBUS_I2C_BLOCK_DATA;
415 case I2C_SMBUS_QUICK:
416 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
421 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
423 if (read_write == I2C_SMBUS_WRITE)
424 outb_p(command, SMBHSTCMD);
427 case I2C_SMBUS_BYTE_DATA:
428 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
430 outb_p(command, SMBHSTCMD);
431 if (read_write == I2C_SMBUS_WRITE)
432 outb_p(data->byte, SMBHSTDAT0);
433 xact = I801_BYTE_DATA;
435 case I2C_SMBUS_WORD_DATA:
436 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
438 outb_p(command, SMBHSTCMD);
439 if (read_write == I2C_SMBUS_WRITE) {
440 outb_p(data->word & 0xff, SMBHSTDAT0);
441 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
443 xact = I801_WORD_DATA;
445 case I2C_SMBUS_BLOCK_DATA:
446 case I2C_SMBUS_I2C_BLOCK_DATA:
447 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
449 outb_p(command, SMBHSTCMD);
452 case I2C_SMBUS_PROC_CALL:
454 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
458 outb_p(hwpec, SMBAUXCTL); /* enable/disable hardware PEC */
461 ret = i801_block_transaction(data, read_write, size, hwpec);
463 outb_p(xact | ENABLE_INT9, SMBHSTCNT);
464 ret = i801_transaction();
467 /* Some BIOSes don't like it when PEC is enabled at reboot or resume
468 time, so we forcibly disable it after every transaction. */
470 outb_p(0, SMBAUXCTL);
476 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
479 switch (xact & 0x7f) {
480 case I801_BYTE: /* Result put in SMBHSTDAT0 */
482 data->byte = inb_p(SMBHSTDAT0);
485 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
492 static u32 i801_func(struct i2c_adapter *adapter)
494 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
495 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
496 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
497 | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0);
500 static struct i2c_algorithm smbus_algorithm = {
501 .smbus_xfer = i801_access,
502 .functionality = i801_func,
505 static struct i2c_adapter i801_adapter = {
506 .owner = THIS_MODULE,
507 .class = I2C_CLASS_HWMON,
508 .algo = &smbus_algorithm,
511 static struct pci_device_id i801_ids[] = {
512 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
513 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
514 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
515 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
516 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
517 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
518 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
519 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
520 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
521 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
522 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
526 MODULE_DEVICE_TABLE (pci, i801_ids);
528 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
532 if ((err = i801_setup(dev)))
535 /* set up the driverfs linkage to our parent device */
536 i801_adapter.dev.parent = &dev->dev;
538 snprintf(i801_adapter.name, I2C_NAME_SIZE,
539 "SMBus I801 adapter at %04lx", i801_smba);
540 return i2c_add_adapter(&i801_adapter);
543 static void __devexit i801_remove(struct pci_dev *dev)
545 i2c_del_adapter(&i801_adapter);
546 pci_release_region(dev, SMBBAR);
547 pci_disable_device(dev);
550 static struct pci_driver i801_driver = {
551 .name = "i801_smbus",
552 .id_table = i801_ids,
554 .remove = __devexit_p(i801_remove),
557 static int __init i2c_i801_init(void)
559 return pci_register_driver(&i801_driver);
562 static void __exit i2c_i801_exit(void)
564 pci_unregister_driver(&i801_driver);
567 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
568 "Philip Edelbrock <phil@netroedge.com>, "
569 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
570 MODULE_DESCRIPTION("I801 SMBus driver");
571 MODULE_LICENSE("GPL");
573 module_init(i2c_i801_init);
574 module_exit(i2c_i801_exit);