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)
35 This driver supports several versions of Intel's I/O Controller Hubs (ICH).
36 For SMBus support, they are similar to the PIIX4 and are part
37 of Intel's '810' and other chipsets.
38 See the doc/busses/i2c-i801 file for details.
39 I2C Block Read and Process Call are not supported.
42 /* Note: we assume there can only be one I801, with one SMBus interface */
44 #include <linux/config.h>
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 #ifdef I2C_FUNC_SMBUS_BLOCK_DATA_PEC
60 /* I801 SMBus address offsets */
61 #define SMBHSTSTS (0 + i801_smba)
62 #define SMBHSTCNT (2 + i801_smba)
63 #define SMBHSTCMD (3 + i801_smba)
64 #define SMBHSTADD (4 + i801_smba)
65 #define SMBHSTDAT0 (5 + i801_smba)
66 #define SMBHSTDAT1 (6 + i801_smba)
67 #define SMBBLKDAT (7 + i801_smba)
68 #define SMBPEC (8 + i801_smba) /* ICH4 only */
69 #define SMBAUXSTS (12 + i801_smba) /* ICH4 only */
70 #define SMBAUXCTL (13 + i801_smba) /* ICH4 only */
72 /* PCI Address Constants */
74 #define SMBHSTCFG 0x040
77 /* Host configuration bits for SMBHSTCFG */
78 #define SMBHSTCFG_HST_EN 1
79 #define SMBHSTCFG_SMB_SMI_EN 2
80 #define SMBHSTCFG_I2C_EN 4
83 #define MAX_TIMEOUT 100
84 #define ENABLE_INT9 0 /* set to 0x01 to enable - untested */
86 /* I801 command constants */
87 #define I801_QUICK 0x00
88 #define I801_BYTE 0x04
89 #define I801_BYTE_DATA 0x08
90 #define I801_WORD_DATA 0x0C
91 #define I801_PROC_CALL 0x10 /* later chips only, unimplemented */
92 #define I801_BLOCK_DATA 0x14
93 #define I801_I2C_BLOCK_DATA 0x18 /* unimplemented */
94 #define I801_BLOCK_LAST 0x34
95 #define I801_I2C_BLOCK_LAST 0x38 /* unimplemented */
96 #define I801_START 0x40
97 #define I801_PEC_EN 0x80 /* ICH4 only */
99 /* insmod parameters */
101 /* If force_addr is set to anything different from 0, we forcibly enable
102 the I801 at the given address. VERY DANGEROUS! */
103 static u16 force_addr;
104 module_param(force_addr, ushort, 0);
105 MODULE_PARM_DESC(force_addr,
106 "Forcibly enable the I801 at the given address. "
107 "EXTREMELY DANGEROUS!");
109 static int i801_transaction(void);
110 static int i801_block_transaction(union i2c_smbus_data *data,
111 char read_write, int command);
113 static unsigned short i801_smba;
114 static struct pci_dev *I801_dev;
117 static int i801_setup(struct pci_dev *dev)
119 int error_return = 0;
122 /* Note: we keep on searching until we have found 'function 3' */
123 if(PCI_FUNC(dev->devfn) != 3)
127 if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) ||
128 (dev->device == PCI_DEVICE_ID_INTEL_82801EB_3) ||
129 (dev->device == PCI_DEVICE_ID_INTEL_ESB_4))
134 /* Determine the address of the SMBus areas */
136 i801_smba = force_addr & 0xfff0;
138 pci_read_config_word(I801_dev, SMBBA, &i801_smba);
141 dev_err(&dev->dev, "SMB base address uninitialized"
142 "- upgrade BIOS or use force_addr=0xaddr\n");
147 if (!request_region(i801_smba, (isich4 ? 16 : 8), "i801-smbus")) {
148 dev_err(&dev->dev, "I801_smb region 0x%x already in use!\n",
150 error_return = -EBUSY;
154 pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
155 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
156 pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
158 /* If force_addr is set, we program the new address here. Just to make
159 sure, we disable the device first. */
161 pci_write_config_byte(I801_dev, SMBHSTCFG, temp & 0xfe);
162 pci_write_config_word(I801_dev, SMBBA, i801_smba);
163 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 0x01);
164 dev_warn(&dev->dev, "WARNING: I801 SMBus interface set to "
165 "new address %04x!\n", i801_smba);
166 } else if ((temp & 1) == 0) {
167 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 1);
168 dev_warn(&dev->dev, "enabling SMBus device\n");
172 dev_dbg(&dev->dev, "I801 using Interrupt SMI# for SMBus.\n");
174 dev_dbg(&dev->dev, "I801 using PCI Interrupt for SMBus.\n");
176 pci_read_config_byte(I801_dev, SMBREV, &temp);
177 dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp);
178 dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba);
184 static int i801_transaction(void)
190 dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x,"
191 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
192 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
195 /* Make sure the SMBus host is ready to start transmitting */
196 /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
197 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
198 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting... \n",
200 outb_p(temp, SMBHSTSTS);
201 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
202 dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
205 dev_dbg(&I801_dev->dev, "Successfull!\n");
209 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
211 /* We will always wait for a fraction of a second! */
214 temp = inb_p(SMBHSTSTS);
215 } while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
217 /* If the SMBus is still busy, we give up */
218 if (timeout >= MAX_TIMEOUT) {
219 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
225 dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
230 dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
231 "until next hard reset. (sorry!)\n");
232 /* Clock stops and slave is stuck in mid-transmission */
237 dev_dbg(&I801_dev->dev, "Error: no response!\n");
240 if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
241 outb_p(inb(SMBHSTSTS), SMBHSTSTS);
243 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
244 dev_dbg(&I801_dev->dev, "Failed reset at end of transaction"
247 dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
248 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
249 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
254 /* All-inclusive block transaction function */
255 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
263 unsigned char hostc, errmask;
265 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
266 if (read_write == I2C_SMBUS_WRITE) {
267 /* set I2C_EN bit in configuration register */
268 pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
269 pci_write_config_byte(I801_dev, SMBHSTCFG,
270 hostc | SMBHSTCFG_I2C_EN);
272 dev_err(&I801_dev->dev,
273 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
278 if (read_write == I2C_SMBUS_WRITE) {
279 len = data->block[0];
284 outb_p(len, SMBHSTDAT0);
285 outb_p(data->block[1], SMBBLKDAT);
287 len = 32; /* max for reads */
290 if(isich4 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
291 /* set 32 byte buffer */
294 for (i = 1; i <= len; i++) {
295 if (i == len && read_write == I2C_SMBUS_READ)
296 smbcmd = I801_BLOCK_LAST;
298 smbcmd = I801_BLOCK_DATA;
299 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
301 dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
302 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
303 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
304 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
306 /* Make sure the SMBus host is ready to start transmitting */
307 temp = inb_p(SMBHSTSTS);
309 /* Erronenous conditions before transaction:
310 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
313 /* Erronenous conditions during transaction:
314 * Failed, Bus_Err, Dev_Err, Intr */
317 if (temp & errmask) {
318 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
319 "Resetting... \n", temp);
320 outb_p(temp, SMBHSTSTS);
321 if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
322 dev_err(&I801_dev->dev,
323 "Reset failed! (%02x)\n", temp);
328 /* if die in middle of block transaction, fail */
335 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
337 /* We will always wait for a fraction of a second! */
340 temp = inb_p(SMBHSTSTS);
343 while ((!(temp & 0x80))
344 && (timeout++ < MAX_TIMEOUT));
346 /* If the SMBus is still busy, we give up */
347 if (timeout >= MAX_TIMEOUT) {
349 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
354 dev_dbg(&I801_dev->dev,
355 "Error: Failed bus transaction\n");
356 } else if (temp & 0x08) {
358 dev_err(&I801_dev->dev, "Bus collision!\n");
359 } else if (temp & 0x04) {
361 dev_dbg(&I801_dev->dev, "Error: no response!\n");
364 if (i == 1 && read_write == I2C_SMBUS_READ) {
365 len = inb_p(SMBHSTDAT0);
370 data->block[0] = len;
373 /* Retrieve/store value in SMBBLKDAT */
374 if (read_write == I2C_SMBUS_READ)
375 data->block[i] = inb_p(SMBBLKDAT);
376 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
377 outb_p(data->block[i+1], SMBBLKDAT);
378 if ((temp & 0x9e) != 0x00)
379 outb_p(temp, SMBHSTSTS); /* signals SMBBLKDAT ready */
381 if ((temp = (0x1e & inb_p(SMBHSTSTS))) != 0x00) {
382 dev_dbg(&I801_dev->dev,
383 "Bad status (%02x) at end of transaction\n",
386 dev_dbg(&I801_dev->dev, "Block (post %d): CNT=%02x, CMD=%02x, "
387 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
388 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
389 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
396 if(isich4 && command == I2C_SMBUS_BLOCK_DATA_PEC) {
397 /* wait for INTR bit as advised by Intel */
400 temp = inb_p(SMBHSTSTS);
402 } while ((!(temp & 0x02))
403 && (timeout++ < MAX_TIMEOUT));
405 if (timeout >= MAX_TIMEOUT) {
406 dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
408 outb_p(temp, SMBHSTSTS);
413 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
414 /* restore saved configuration register value */
415 pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
420 /* Return -1 on error. */
421 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
422 unsigned short flags, char read_write, u8 command,
423 int size, union i2c_smbus_data * data)
431 hwpec = (flags & I2C_CLIENT_PEC) != 0;
435 case I2C_SMBUS_QUICK:
436 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
441 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
443 if (read_write == I2C_SMBUS_WRITE)
444 outb_p(command, SMBHSTCMD);
447 case I2C_SMBUS_BYTE_DATA:
448 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
450 outb_p(command, SMBHSTCMD);
451 if (read_write == I2C_SMBUS_WRITE)
452 outb_p(data->byte, SMBHSTDAT0);
453 xact = I801_BYTE_DATA;
455 case I2C_SMBUS_WORD_DATA:
456 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
458 outb_p(command, SMBHSTCMD);
459 if (read_write == I2C_SMBUS_WRITE) {
460 outb_p(data->word & 0xff, SMBHSTDAT0);
461 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
463 xact = I801_WORD_DATA;
465 case I2C_SMBUS_BLOCK_DATA:
466 case I2C_SMBUS_I2C_BLOCK_DATA:
468 case I2C_SMBUS_BLOCK_DATA_PEC:
469 if(hwpec && size == I2C_SMBUS_BLOCK_DATA)
470 size = I2C_SMBUS_BLOCK_DATA_PEC;
472 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
474 outb_p(command, SMBHSTCMD);
477 case I2C_SMBUS_PROC_CALL:
479 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
484 if(isich4 && hwpec) {
485 if(size != I2C_SMBUS_QUICK &&
486 size != I2C_SMBUS_I2C_BLOCK_DATA)
487 outb_p(1, SMBAUXCTL); /* enable HW PEC */
491 ret = i801_block_transaction(data, read_write, size);
493 outb_p(xact | ENABLE_INT9, SMBHSTCNT);
494 ret = i801_transaction();
498 if(isich4 && hwpec) {
499 if(size != I2C_SMBUS_QUICK &&
500 size != I2C_SMBUS_I2C_BLOCK_DATA)
501 outb_p(0, SMBAUXCTL);
509 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
512 switch (xact & 0x7f) {
513 case I801_BYTE: /* Result put in SMBHSTDAT0 */
515 data->byte = inb_p(SMBHSTDAT0);
518 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
525 static u32 i801_func(struct i2c_adapter *adapter)
527 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
528 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
529 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
531 | (isich4 ? I2C_FUNC_SMBUS_BLOCK_DATA_PEC |
532 I2C_FUNC_SMBUS_HWPEC_CALC
538 static struct i2c_algorithm smbus_algorithm = {
539 .name = "Non-I2C SMBus adapter",
540 .id = I2C_ALGO_SMBUS,
541 .smbus_xfer = i801_access,
542 .functionality = i801_func,
545 static struct i2c_adapter i801_adapter = {
546 .owner = THIS_MODULE,
547 .class = I2C_CLASS_HWMON,
548 .algo = &smbus_algorithm,
552 static struct pci_device_id i801_ids[] = {
553 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
554 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
555 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
556 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
557 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
558 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
559 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
560 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
561 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
562 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
566 MODULE_DEVICE_TABLE (pci, i801_ids);
568 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
571 if (i801_setup(dev)) {
573 "I801 not detected, module not inserted.\n");
577 /* set up the driverfs linkage to our parent device */
578 i801_adapter.dev.parent = &dev->dev;
580 snprintf(i801_adapter.name, I2C_NAME_SIZE,
581 "SMBus I801 adapter at %04x", i801_smba);
582 return i2c_add_adapter(&i801_adapter);
585 static void __devexit i801_remove(struct pci_dev *dev)
587 i2c_del_adapter(&i801_adapter);
588 release_region(i801_smba, (isich4 ? 16 : 8));
591 static struct pci_driver i801_driver = {
592 .name = "i801_smbus",
593 .id_table = i801_ids,
595 .remove = __devexit_p(i801_remove),
598 static int __init i2c_i801_init(void)
600 return pci_register_driver(&i801_driver);
603 static void __exit i2c_i801_exit(void)
605 pci_unregister_driver(&i801_driver);
608 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
609 "Philip Edelbrock <phil@netroedge.com>, "
610 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
611 MODULE_DESCRIPTION("I801 SMBus driver");
612 MODULE_LICENSE("GPL");
614 module_init(i2c_i801_init);
615 module_exit(i2c_i801_exit);