2 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 doc/busses/i2c-i801 file 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 */
95 /* insmod parameters */
97 /* If force_addr is set to anything different from 0, we forcibly enable
98 the I801 at the given address. VERY DANGEROUS! */
99 static u16 force_addr;
100 module_param(force_addr, ushort, 0);
101 MODULE_PARM_DESC(force_addr,
102 "Forcibly enable the I801 at the given address. "
103 "EXTREMELY DANGEROUS!");
105 static int i801_transaction(void);
106 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
107 int command, int hwpec);
109 static unsigned short i801_smba;
110 static struct pci_driver i801_driver;
111 static struct pci_dev *I801_dev;
114 static int i801_setup(struct pci_dev *dev)
116 int error_return = 0;
119 /* Note: we keep on searching until we have found 'function 3' */
120 if(PCI_FUNC(dev->devfn) != 3)
124 if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) ||
125 (dev->device == PCI_DEVICE_ID_INTEL_82801EB_3) ||
126 (dev->device == PCI_DEVICE_ID_INTEL_ESB_4))
131 /* Determine the address of the SMBus areas */
133 i801_smba = force_addr & 0xfff0;
135 pci_read_config_word(I801_dev, SMBBA, &i801_smba);
138 dev_err(&dev->dev, "SMB base address uninitialized "
139 "- upgrade BIOS or use force_addr=0xaddr\n");
144 if (!request_region(i801_smba, (isich4 ? 16 : 8), i801_driver.name)) {
145 dev_err(&dev->dev, "I801_smb region 0x%x already in use!\n",
147 error_return = -EBUSY;
151 pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
152 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
153 pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
155 /* If force_addr is set, we program the new address here. Just to make
156 sure, we disable the device first. */
158 pci_write_config_byte(I801_dev, SMBHSTCFG, temp & 0xfe);
159 pci_write_config_word(I801_dev, SMBBA, i801_smba);
160 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 0x01);
161 dev_warn(&dev->dev, "WARNING: I801 SMBus interface set to "
162 "new address %04x!\n", i801_smba);
163 } else if ((temp & 1) == 0) {
164 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 1);
165 dev_warn(&dev->dev, "enabling SMBus device\n");
169 dev_dbg(&dev->dev, "I801 using Interrupt SMI# for SMBus.\n");
171 dev_dbg(&dev->dev, "I801 using PCI Interrupt for SMBus.\n");
173 pci_read_config_byte(I801_dev, SMBREV, &temp);
174 dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp);
175 dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba);
181 static int i801_transaction(void)
187 dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
188 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
189 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
192 /* Make sure the SMBus host is ready to start transmitting */
193 /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
194 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
195 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting...\n",
197 outb_p(temp, SMBHSTSTS);
198 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
199 dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
202 dev_dbg(&I801_dev->dev, "Successfull!\n");
206 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
208 /* We will always wait for a fraction of a second! */
211 temp = inb_p(SMBHSTSTS);
212 } while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
214 /* If the SMBus is still busy, we give up */
215 if (timeout >= MAX_TIMEOUT) {
216 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
222 dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
227 dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
228 "until next hard reset. (sorry!)\n");
229 /* Clock stops and slave is stuck in mid-transmission */
234 dev_dbg(&I801_dev->dev, "Error: no response!\n");
237 if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
238 outb_p(inb(SMBHSTSTS), SMBHSTSTS);
240 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
241 dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
244 dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
245 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
246 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
251 /* All-inclusive block transaction function */
252 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
253 int command, int hwpec)
260 unsigned char hostc, errmask;
262 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
263 if (read_write == I2C_SMBUS_WRITE) {
264 /* set I2C_EN bit in configuration register */
265 pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
266 pci_write_config_byte(I801_dev, SMBHSTCFG,
267 hostc | SMBHSTCFG_I2C_EN);
269 dev_err(&I801_dev->dev,
270 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
275 if (read_write == I2C_SMBUS_WRITE) {
276 len = data->block[0];
281 outb_p(len, SMBHSTDAT0);
282 outb_p(data->block[1], SMBBLKDAT);
284 len = 32; /* max for reads */
287 if(isich4 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
288 /* set 32 byte buffer */
291 for (i = 1; i <= len; i++) {
292 if (i == len && read_write == I2C_SMBUS_READ)
293 smbcmd = I801_BLOCK_LAST;
295 smbcmd = I801_BLOCK_DATA;
296 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
298 dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
299 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
300 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
301 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
303 /* Make sure the SMBus host is ready to start transmitting */
304 temp = inb_p(SMBHSTSTS);
306 /* Erronenous conditions before transaction:
307 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
310 /* Erronenous conditions during transaction:
311 * Failed, Bus_Err, Dev_Err, Intr */
314 if (temp & errmask) {
315 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
316 "Resetting...\n", temp);
317 outb_p(temp, SMBHSTSTS);
318 if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
319 dev_err(&I801_dev->dev,
320 "Reset failed! (%02x)\n", temp);
325 /* if die in middle of block transaction, fail */
332 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
334 /* We will always wait for a fraction of a second! */
337 temp = inb_p(SMBHSTSTS);
340 while ((!(temp & 0x80))
341 && (timeout++ < MAX_TIMEOUT));
343 /* If the SMBus is still busy, we give up */
344 if (timeout >= MAX_TIMEOUT) {
346 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
351 dev_dbg(&I801_dev->dev,
352 "Error: Failed bus transaction\n");
353 } else if (temp & 0x08) {
355 dev_err(&I801_dev->dev, "Bus collision!\n");
356 } else if (temp & 0x04) {
358 dev_dbg(&I801_dev->dev, "Error: no response!\n");
361 if (i == 1 && read_write == I2C_SMBUS_READ) {
362 len = inb_p(SMBHSTDAT0);
367 data->block[0] = len;
370 /* Retrieve/store value in SMBBLKDAT */
371 if (read_write == I2C_SMBUS_READ)
372 data->block[i] = inb_p(SMBBLKDAT);
373 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
374 outb_p(data->block[i+1], SMBBLKDAT);
375 if ((temp & 0x9e) != 0x00)
376 outb_p(temp, SMBHSTSTS); /* signals SMBBLKDAT ready */
378 if ((temp = (0x1e & inb_p(SMBHSTSTS))) != 0x00) {
379 dev_dbg(&I801_dev->dev,
380 "Bad status (%02x) at end of transaction\n",
383 dev_dbg(&I801_dev->dev, "Block (post %d): CNT=%02x, CMD=%02x, "
384 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
385 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
386 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
393 /* wait for INTR bit as advised by Intel */
396 temp = inb_p(SMBHSTSTS);
398 } while ((!(temp & 0x02))
399 && (timeout++ < MAX_TIMEOUT));
401 if (timeout >= MAX_TIMEOUT) {
402 dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
404 outb_p(temp, SMBHSTSTS);
408 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
409 /* restore saved configuration register value */
410 pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
415 /* Return -1 on error. */
416 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
417 unsigned short flags, char read_write, u8 command,
418 int size, union i2c_smbus_data * data)
424 hwpec = isich4 && (flags & I2C_CLIENT_PEC)
425 && size != I2C_SMBUS_QUICK
426 && size != I2C_SMBUS_I2C_BLOCK_DATA;
429 case I2C_SMBUS_QUICK:
430 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
435 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
437 if (read_write == I2C_SMBUS_WRITE)
438 outb_p(command, SMBHSTCMD);
441 case I2C_SMBUS_BYTE_DATA:
442 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
444 outb_p(command, SMBHSTCMD);
445 if (read_write == I2C_SMBUS_WRITE)
446 outb_p(data->byte, SMBHSTDAT0);
447 xact = I801_BYTE_DATA;
449 case I2C_SMBUS_WORD_DATA:
450 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
452 outb_p(command, SMBHSTCMD);
453 if (read_write == I2C_SMBUS_WRITE) {
454 outb_p(data->word & 0xff, SMBHSTDAT0);
455 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
457 xact = I801_WORD_DATA;
459 case I2C_SMBUS_BLOCK_DATA:
460 case I2C_SMBUS_I2C_BLOCK_DATA:
461 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
463 outb_p(command, SMBHSTCMD);
466 case I2C_SMBUS_PROC_CALL:
468 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
472 outb_p(hwpec, SMBAUXCTL); /* enable/disable hardware PEC */
475 ret = i801_block_transaction(data, read_write, size, hwpec);
477 outb_p(xact | ENABLE_INT9, SMBHSTCNT);
478 ret = i801_transaction();
481 /* Some BIOSes don't like it when PEC is enabled at reboot or resume
482 time, so we forcibly disable it after every transaction. */
484 outb_p(0, SMBAUXCTL);
490 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
493 switch (xact & 0x7f) {
494 case I801_BYTE: /* Result put in SMBHSTDAT0 */
496 data->byte = inb_p(SMBHSTDAT0);
499 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
506 static u32 i801_func(struct i2c_adapter *adapter)
508 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
509 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
510 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
511 | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0);
514 static struct i2c_algorithm smbus_algorithm = {
515 .smbus_xfer = i801_access,
516 .functionality = i801_func,
519 static struct i2c_adapter i801_adapter = {
520 .owner = THIS_MODULE,
521 .class = I2C_CLASS_HWMON,
522 .algo = &smbus_algorithm,
525 static struct pci_device_id i801_ids[] = {
526 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
527 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
528 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
529 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
530 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
531 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
532 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
533 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
534 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
535 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
536 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
540 MODULE_DEVICE_TABLE (pci, i801_ids);
542 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
545 if (i801_setup(dev)) {
547 "I801 not detected, module not inserted.\n");
551 /* set up the driverfs linkage to our parent device */
552 i801_adapter.dev.parent = &dev->dev;
554 snprintf(i801_adapter.name, I2C_NAME_SIZE,
555 "SMBus I801 adapter at %04x", i801_smba);
556 return i2c_add_adapter(&i801_adapter);
559 static void __devexit i801_remove(struct pci_dev *dev)
561 i2c_del_adapter(&i801_adapter);
562 release_region(i801_smba, (isich4 ? 16 : 8));
565 static struct pci_driver i801_driver = {
566 .name = "i801_smbus",
567 .id_table = i801_ids,
569 .remove = __devexit_p(i801_remove),
572 static int __init i2c_i801_init(void)
574 return pci_register_driver(&i801_driver);
577 static void __exit i2c_i801_exit(void)
579 pci_unregister_driver(&i801_driver);
582 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
583 "Philip Edelbrock <phil@netroedge.com>, "
584 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
585 MODULE_DESCRIPTION("I801 SMBus driver");
586 MODULE_LICENSE("GPL");
588 module_init(i2c_i801_init);
589 module_exit(i2c_i801_exit);