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/module.h>
45 #include <linux/pci.h>
46 #include <linux/kernel.h>
47 #include <linux/stddef.h>
48 #include <linux/delay.h>
49 #include <linux/sched.h>
50 #include <linux/ioport.h>
51 #include <linux/init.h>
52 #include <linux/i2c.h>
55 /* I801 SMBus address offsets */
56 #define SMBHSTSTS (0 + i801_smba)
57 #define SMBHSTCNT (2 + i801_smba)
58 #define SMBHSTCMD (3 + i801_smba)
59 #define SMBHSTADD (4 + i801_smba)
60 #define SMBHSTDAT0 (5 + i801_smba)
61 #define SMBHSTDAT1 (6 + i801_smba)
62 #define SMBBLKDAT (7 + i801_smba)
63 #define SMBPEC (8 + i801_smba) /* ICH4 only */
64 #define SMBAUXSTS (12 + i801_smba) /* ICH4 only */
65 #define SMBAUXCTL (13 + i801_smba) /* ICH4 only */
67 /* PCI Address Constants */
69 #define SMBHSTCFG 0x040
72 /* Host configuration bits for SMBHSTCFG */
73 #define SMBHSTCFG_HST_EN 1
74 #define SMBHSTCFG_SMB_SMI_EN 2
75 #define SMBHSTCFG_I2C_EN 4
78 #define MAX_TIMEOUT 100
79 #define ENABLE_INT9 0 /* set to 0x01 to enable - untested */
81 /* I801 command constants */
82 #define I801_QUICK 0x00
83 #define I801_BYTE 0x04
84 #define I801_BYTE_DATA 0x08
85 #define I801_WORD_DATA 0x0C
86 #define I801_PROC_CALL 0x10 /* later chips only, unimplemented */
87 #define I801_BLOCK_DATA 0x14
88 #define I801_I2C_BLOCK_DATA 0x18 /* unimplemented */
89 #define I801_BLOCK_LAST 0x34
90 #define I801_I2C_BLOCK_LAST 0x38 /* unimplemented */
91 #define I801_START 0x40
92 #define I801_PEC_EN 0x80 /* ICH4 only */
94 /* insmod parameters */
96 /* If force_addr is set to anything different from 0, we forcibly enable
97 the I801 at the given address. VERY DANGEROUS! */
98 static u16 force_addr;
99 module_param(force_addr, ushort, 0);
100 MODULE_PARM_DESC(force_addr,
101 "Forcibly enable the I801 at the given address. "
102 "EXTREMELY DANGEROUS!");
104 static int i801_transaction(void);
105 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
106 int command, int hwpec);
108 static unsigned short i801_smba;
109 static struct pci_driver i801_driver;
110 static struct pci_dev *I801_dev;
113 static int i801_setup(struct pci_dev *dev)
115 int error_return = 0;
118 /* Note: we keep on searching until we have found 'function 3' */
119 if(PCI_FUNC(dev->devfn) != 3)
123 if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) ||
124 (dev->device == PCI_DEVICE_ID_INTEL_82801EB_3) ||
125 (dev->device == PCI_DEVICE_ID_INTEL_ESB_4))
130 /* Determine the address of the SMBus areas */
132 i801_smba = force_addr & 0xfff0;
134 pci_read_config_word(I801_dev, SMBBA, &i801_smba);
137 dev_err(&dev->dev, "SMB base address uninitialized "
138 "- upgrade BIOS or use force_addr=0xaddr\n");
143 if (!request_region(i801_smba, (isich4 ? 16 : 8), i801_driver.name)) {
144 dev_err(&dev->dev, "I801_smb region 0x%x already in use!\n",
146 error_return = -EBUSY;
150 pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
151 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
152 pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
154 /* If force_addr is set, we program the new address here. Just to make
155 sure, we disable the device first. */
157 pci_write_config_byte(I801_dev, SMBHSTCFG, temp & 0xfe);
158 pci_write_config_word(I801_dev, SMBBA, i801_smba);
159 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 0x01);
160 dev_warn(&dev->dev, "WARNING: I801 SMBus interface set to "
161 "new address %04x!\n", i801_smba);
162 } else if ((temp & 1) == 0) {
163 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 1);
164 dev_warn(&dev->dev, "enabling SMBus device\n");
168 dev_dbg(&dev->dev, "I801 using Interrupt SMI# for SMBus.\n");
170 dev_dbg(&dev->dev, "I801 using PCI Interrupt for SMBus.\n");
172 pci_read_config_byte(I801_dev, SMBREV, &temp);
173 dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp);
174 dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba);
180 static int i801_transaction(void)
186 dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
187 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
188 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
191 /* Make sure the SMBus host is ready to start transmitting */
192 /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
193 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
194 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting...\n",
196 outb_p(temp, SMBHSTSTS);
197 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
198 dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
201 dev_dbg(&I801_dev->dev, "Successfull!\n");
205 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
207 /* We will always wait for a fraction of a second! */
210 temp = inb_p(SMBHSTSTS);
211 } while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
213 /* If the SMBus is still busy, we give up */
214 if (timeout >= MAX_TIMEOUT) {
215 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
221 dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
226 dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
227 "until next hard reset. (sorry!)\n");
228 /* Clock stops and slave is stuck in mid-transmission */
233 dev_dbg(&I801_dev->dev, "Error: no response!\n");
236 if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
237 outb_p(inb(SMBHSTSTS), SMBHSTSTS);
239 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
240 dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
243 dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
244 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
245 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
250 /* All-inclusive block transaction function */
251 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
252 int command, int hwpec)
259 unsigned char hostc, errmask;
261 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
262 if (read_write == I2C_SMBUS_WRITE) {
263 /* set I2C_EN bit in configuration register */
264 pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
265 pci_write_config_byte(I801_dev, SMBHSTCFG,
266 hostc | SMBHSTCFG_I2C_EN);
268 dev_err(&I801_dev->dev,
269 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
274 if (read_write == I2C_SMBUS_WRITE) {
275 len = data->block[0];
280 outb_p(len, SMBHSTDAT0);
281 outb_p(data->block[1], SMBBLKDAT);
283 len = 32; /* max for reads */
286 if(isich4 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
287 /* set 32 byte buffer */
290 for (i = 1; i <= len; i++) {
291 if (i == len && read_write == I2C_SMBUS_READ)
292 smbcmd = I801_BLOCK_LAST;
294 smbcmd = I801_BLOCK_DATA;
295 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
297 dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
298 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
299 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
300 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
302 /* Make sure the SMBus host is ready to start transmitting */
303 temp = inb_p(SMBHSTSTS);
305 /* Erronenous conditions before transaction:
306 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
309 /* Erronenous conditions during transaction:
310 * Failed, Bus_Err, Dev_Err, Intr */
313 if (temp & errmask) {
314 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
315 "Resetting...\n", temp);
316 outb_p(temp, SMBHSTSTS);
317 if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
318 dev_err(&I801_dev->dev,
319 "Reset failed! (%02x)\n", temp);
324 /* if die in middle of block transaction, fail */
331 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
333 /* We will always wait for a fraction of a second! */
336 temp = inb_p(SMBHSTSTS);
339 while ((!(temp & 0x80))
340 && (timeout++ < MAX_TIMEOUT));
342 /* If the SMBus is still busy, we give up */
343 if (timeout >= MAX_TIMEOUT) {
345 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
350 dev_dbg(&I801_dev->dev,
351 "Error: Failed bus transaction\n");
352 } else if (temp & 0x08) {
354 dev_err(&I801_dev->dev, "Bus collision!\n");
355 } else if (temp & 0x04) {
357 dev_dbg(&I801_dev->dev, "Error: no response!\n");
360 if (i == 1 && read_write == I2C_SMBUS_READ) {
361 len = inb_p(SMBHSTDAT0);
366 data->block[0] = len;
369 /* Retrieve/store value in SMBBLKDAT */
370 if (read_write == I2C_SMBUS_READ)
371 data->block[i] = inb_p(SMBBLKDAT);
372 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
373 outb_p(data->block[i+1], SMBBLKDAT);
374 if ((temp & 0x9e) != 0x00)
375 outb_p(temp, SMBHSTSTS); /* signals SMBBLKDAT ready */
377 if ((temp = (0x1e & inb_p(SMBHSTSTS))) != 0x00) {
378 dev_dbg(&I801_dev->dev,
379 "Bad status (%02x) at end of transaction\n",
382 dev_dbg(&I801_dev->dev, "Block (post %d): CNT=%02x, CMD=%02x, "
383 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
384 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
385 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
392 /* wait for INTR bit as advised by Intel */
395 temp = inb_p(SMBHSTSTS);
397 } while ((!(temp & 0x02))
398 && (timeout++ < MAX_TIMEOUT));
400 if (timeout >= MAX_TIMEOUT) {
401 dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
403 outb_p(temp, SMBHSTSTS);
407 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
408 /* restore saved configuration register value */
409 pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
414 /* Return -1 on error. */
415 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
416 unsigned short flags, char read_write, u8 command,
417 int size, union i2c_smbus_data * data)
423 hwpec = isich4 && (flags & I2C_CLIENT_PEC)
424 && size != I2C_SMBUS_QUICK
425 && size != I2C_SMBUS_I2C_BLOCK_DATA;
428 case I2C_SMBUS_QUICK:
429 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
434 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
436 if (read_write == I2C_SMBUS_WRITE)
437 outb_p(command, SMBHSTCMD);
440 case I2C_SMBUS_BYTE_DATA:
441 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
443 outb_p(command, SMBHSTCMD);
444 if (read_write == I2C_SMBUS_WRITE)
445 outb_p(data->byte, SMBHSTDAT0);
446 xact = I801_BYTE_DATA;
448 case I2C_SMBUS_WORD_DATA:
449 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
451 outb_p(command, SMBHSTCMD);
452 if (read_write == I2C_SMBUS_WRITE) {
453 outb_p(data->word & 0xff, SMBHSTDAT0);
454 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
456 xact = I801_WORD_DATA;
458 case I2C_SMBUS_BLOCK_DATA:
459 case I2C_SMBUS_I2C_BLOCK_DATA:
460 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
462 outb_p(command, SMBHSTCMD);
465 case I2C_SMBUS_PROC_CALL:
467 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
472 outb_p(1, SMBAUXCTL); /* enable hardware PEC */
475 ret = i801_block_transaction(data, read_write, size, hwpec);
477 outb_p(xact | ENABLE_INT9, SMBHSTCNT);
478 ret = i801_transaction();
482 outb_p(0, SMBAUXCTL); /* disable hardware PEC */
488 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
491 switch (xact & 0x7f) {
492 case I801_BYTE: /* Result put in SMBHSTDAT0 */
494 data->byte = inb_p(SMBHSTDAT0);
497 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
504 static u32 i801_func(struct i2c_adapter *adapter)
506 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
507 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
508 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
509 | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0);
512 static struct i2c_algorithm smbus_algorithm = {
513 .smbus_xfer = i801_access,
514 .functionality = i801_func,
517 static struct i2c_adapter i801_adapter = {
518 .owner = THIS_MODULE,
519 .class = I2C_CLASS_HWMON,
520 .algo = &smbus_algorithm,
523 static struct pci_device_id i801_ids[] = {
524 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
525 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
526 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
527 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
528 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
529 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
530 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
531 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
532 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
533 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
537 MODULE_DEVICE_TABLE (pci, i801_ids);
539 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
542 if (i801_setup(dev)) {
544 "I801 not detected, module not inserted.\n");
548 /* set up the driverfs linkage to our parent device */
549 i801_adapter.dev.parent = &dev->dev;
551 snprintf(i801_adapter.name, I2C_NAME_SIZE,
552 "SMBus I801 adapter at %04x", i801_smba);
553 return i2c_add_adapter(&i801_adapter);
556 static void __devexit i801_remove(struct pci_dev *dev)
558 i2c_del_adapter(&i801_adapter);
559 release_region(i801_smba, (isich4 ? 16 : 8));
562 static struct pci_driver i801_driver = {
563 .name = "i801_smbus",
564 .id_table = i801_ids,
566 .remove = __devexit_p(i801_remove),
569 static int __init i2c_i801_init(void)
571 return pci_register_driver(&i801_driver);
574 static void __exit i2c_i801_exit(void)
576 pci_unregister_driver(&i801_driver);
579 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
580 "Philip Edelbrock <phil@netroedge.com>, "
581 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
582 MODULE_DESCRIPTION("I801 SMBus driver");
583 MODULE_LICENSE("GPL");
585 module_init(i2c_i801_init);
586 module_exit(i2c_i801_exit);