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 Supports the following Intel I/O Controller Hubs (ICH):
27 region SMBus Block proc. block
28 Chip name PCI ID size PEC buffer call read
29 ----------------------------------------------------------------------
30 82801AA (ICH) 0x2413 16 no no no no
31 82801AB (ICH0) 0x2423 16 no no no no
32 82801BA (ICH2) 0x2443 16 no no no no
33 82801CA (ICH3) 0x2483 32 soft no no no
34 82801DB (ICH4) 0x24c3 32 hard yes no no
35 82801E (ICH5) 0x24d3 32 hard yes yes yes
36 6300ESB 0x25a4 32 hard yes yes yes
37 82801F (ICH6) 0x266a 32 hard yes yes yes
38 6310ESB/6320ESB 0x269b 32 hard yes yes yes
39 82801G (ICH7) 0x27da 32 hard yes yes yes
40 82801H (ICH8) 0x283e 32 hard yes yes yes
41 82801I (ICH9) 0x2930 32 hard yes yes yes
42 Tolapai 0x5032 32 hard yes ? ?
44 Features supported by this driver:
48 Block process call transaction no
49 I2C block read transaction no
51 See the file Documentation/i2c/busses/i2c-i801 for details.
54 /* Note: we assume there can only be one I801, with one SMBus interface */
56 #include <linux/module.h>
57 #include <linux/pci.h>
58 #include <linux/kernel.h>
59 #include <linux/stddef.h>
60 #include <linux/delay.h>
61 #include <linux/ioport.h>
62 #include <linux/init.h>
63 #include <linux/i2c.h>
66 /* I801 SMBus address offsets */
67 #define SMBHSTSTS (0 + i801_smba)
68 #define SMBHSTCNT (2 + i801_smba)
69 #define SMBHSTCMD (3 + i801_smba)
70 #define SMBHSTADD (4 + i801_smba)
71 #define SMBHSTDAT0 (5 + i801_smba)
72 #define SMBHSTDAT1 (6 + i801_smba)
73 #define SMBBLKDAT (7 + i801_smba)
74 #define SMBPEC (8 + i801_smba) /* ICH3 and later */
75 #define SMBAUXSTS (12 + i801_smba) /* ICH4 and later */
76 #define SMBAUXCTL (13 + i801_smba) /* ICH4 and later */
78 /* PCI Address Constants */
80 #define SMBHSTCFG 0x040
82 /* Host configuration bits for SMBHSTCFG */
83 #define SMBHSTCFG_HST_EN 1
84 #define SMBHSTCFG_SMB_SMI_EN 2
85 #define SMBHSTCFG_I2C_EN 4
87 /* Auxillary control register bits, ICH4+ only */
88 #define SMBAUXCTL_CRC 1
89 #define SMBAUXCTL_E32B 2
91 /* kill bit for SMBHSTCNT */
92 #define SMBHSTCNT_KILL 2
95 #define MAX_TIMEOUT 100
96 #define ENABLE_INT9 0 /* set to 0x01 to enable - untested */
98 /* I801 command constants */
99 #define I801_QUICK 0x00
100 #define I801_BYTE 0x04
101 #define I801_BYTE_DATA 0x08
102 #define I801_WORD_DATA 0x0C
103 #define I801_PROC_CALL 0x10 /* unimplemented */
104 #define I801_BLOCK_DATA 0x14
105 #define I801_I2C_BLOCK_DATA 0x18 /* unimplemented */
106 #define I801_BLOCK_LAST 0x34
107 #define I801_I2C_BLOCK_LAST 0x38 /* unimplemented */
108 #define I801_START 0x40
109 #define I801_PEC_EN 0x80 /* ICH3 and later */
111 /* I801 Hosts Status register bits */
112 #define SMBHSTSTS_BYTE_DONE 0x80
113 #define SMBHSTSTS_INUSE_STS 0x40
114 #define SMBHSTSTS_SMBALERT_STS 0x20
115 #define SMBHSTSTS_FAILED 0x10
116 #define SMBHSTSTS_BUS_ERR 0x08
117 #define SMBHSTSTS_DEV_ERR 0x04
118 #define SMBHSTSTS_INTR 0x02
119 #define SMBHSTSTS_HOST_BUSY 0x01
121 static unsigned long i801_smba;
122 static unsigned char i801_original_hstcfg;
123 static struct pci_driver i801_driver;
124 static struct pci_dev *I801_dev;
126 #define FEATURE_SMBUS_PEC (1 << 0)
127 #define FEATURE_BLOCK_BUFFER (1 << 1)
128 #define FEATURE_BLOCK_PROC (1 << 2)
129 #define FEATURE_I2C_BLOCK_READ (1 << 3)
130 static unsigned int i801_features;
132 static int i801_transaction(int xact)
138 dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
139 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
140 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
143 /* Make sure the SMBus host is ready to start transmitting */
144 /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
145 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
146 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting...\n",
148 outb_p(temp, SMBHSTSTS);
149 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
150 dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
153 dev_dbg(&I801_dev->dev, "Successful!\n");
157 /* the current contents of SMBHSTCNT can be overwritten, since PEC,
158 * INTREN, SMBSCMD are passed in xact */
159 outb_p(xact | I801_START, SMBHSTCNT);
161 /* We will always wait for a fraction of a second! */
164 temp = inb_p(SMBHSTSTS);
165 } while ((temp & SMBHSTSTS_HOST_BUSY) && (timeout++ < MAX_TIMEOUT));
167 /* If the SMBus is still busy, we give up */
168 if (timeout >= MAX_TIMEOUT) {
169 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
171 /* try to stop the current command */
172 dev_dbg(&I801_dev->dev, "Terminating the current operation\n");
173 outb_p(inb_p(SMBHSTCNT) | SMBHSTCNT_KILL, SMBHSTCNT);
175 outb_p(inb_p(SMBHSTCNT) & (~SMBHSTCNT_KILL), SMBHSTCNT);
178 if (temp & SMBHSTSTS_FAILED) {
180 dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
183 if (temp & SMBHSTSTS_BUS_ERR) {
185 dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
186 "until next hard reset. (sorry!)\n");
187 /* Clock stops and slave is stuck in mid-transmission */
190 if (temp & SMBHSTSTS_DEV_ERR) {
192 dev_dbg(&I801_dev->dev, "Error: no response!\n");
195 if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
196 outb_p(inb(SMBHSTSTS), SMBHSTSTS);
198 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
199 dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
202 dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
203 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
204 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
209 /* wait for INTR bit as advised by Intel */
210 static void i801_wait_hwpec(void)
217 temp = inb_p(SMBHSTSTS);
218 } while ((!(temp & SMBHSTSTS_INTR))
219 && (timeout++ < MAX_TIMEOUT));
221 if (timeout >= MAX_TIMEOUT) {
222 dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
224 outb_p(temp, SMBHSTSTS);
227 static int i801_block_transaction_by_block(union i2c_smbus_data *data,
228 char read_write, int hwpec)
232 inb_p(SMBHSTCNT); /* reset the data buffer index */
234 /* Use 32-byte buffer to process this transaction */
235 if (read_write == I2C_SMBUS_WRITE) {
236 len = data->block[0];
237 outb_p(len, SMBHSTDAT0);
238 for (i = 0; i < len; i++)
239 outb_p(data->block[i+1], SMBBLKDAT);
242 if (i801_transaction(I801_BLOCK_DATA | ENABLE_INT9 |
243 I801_PEC_EN * hwpec))
246 if (read_write == I2C_SMBUS_READ) {
247 len = inb_p(SMBHSTDAT0);
248 if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
251 data->block[0] = len;
252 for (i = 0; i < len; i++)
253 data->block[i + 1] = inb_p(SMBBLKDAT);
258 static int i801_block_transaction_byte_by_byte(union i2c_smbus_data *data,
259 char read_write, int hwpec)
266 unsigned char errmask;
268 len = data->block[0];
270 if (read_write == I2C_SMBUS_WRITE) {
271 outb_p(len, SMBHSTDAT0);
272 outb_p(data->block[1], SMBBLKDAT);
275 for (i = 1; i <= len; i++) {
276 if (i == len && read_write == I2C_SMBUS_READ)
277 smbcmd = I801_BLOCK_LAST;
279 smbcmd = I801_BLOCK_DATA;
280 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
282 dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
283 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
284 inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
285 inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
287 /* Make sure the SMBus host is ready to start transmitting */
288 temp = inb_p(SMBHSTSTS);
290 /* Erroneous conditions before transaction:
291 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
294 /* Erroneous conditions during transaction:
295 * Failed, Bus_Err, Dev_Err, Intr */
298 if (temp & errmask) {
299 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
300 "Resetting...\n", temp);
301 outb_p(temp, SMBHSTSTS);
302 if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
303 dev_err(&I801_dev->dev,
304 "Reset failed! (%02x)\n", temp);
308 /* if die in middle of block transaction, fail */
313 outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
315 /* We will always wait for a fraction of a second! */
319 temp = inb_p(SMBHSTSTS);
321 while ((!(temp & SMBHSTSTS_BYTE_DONE))
322 && (timeout++ < MAX_TIMEOUT));
324 /* If the SMBus is still busy, we give up */
325 if (timeout >= MAX_TIMEOUT) {
326 /* try to stop the current command */
327 dev_dbg(&I801_dev->dev, "Terminating the current "
329 outb_p(inb_p(SMBHSTCNT) | SMBHSTCNT_KILL, SMBHSTCNT);
331 outb_p(inb_p(SMBHSTCNT) & (~SMBHSTCNT_KILL),
334 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
337 if (temp & SMBHSTSTS_FAILED) {
339 dev_dbg(&I801_dev->dev,
340 "Error: Failed bus transaction\n");
341 } else if (temp & SMBHSTSTS_BUS_ERR) {
343 dev_err(&I801_dev->dev, "Bus collision!\n");
344 } else if (temp & SMBHSTSTS_DEV_ERR) {
346 dev_dbg(&I801_dev->dev, "Error: no response!\n");
349 if (i == 1 && read_write == I2C_SMBUS_READ) {
350 len = inb_p(SMBHSTDAT0);
351 if (len < 1 || len > I2C_SMBUS_BLOCK_MAX)
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));
380 static int i801_set_block_buffer_mode(void)
382 outb_p(inb_p(SMBAUXCTL) | SMBAUXCTL_E32B, SMBAUXCTL);
383 if ((inb_p(SMBAUXCTL) & SMBAUXCTL_E32B) == 0)
388 /* Block transaction function */
389 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
390 int command, int hwpec)
395 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
396 if (read_write == I2C_SMBUS_WRITE) {
397 /* set I2C_EN bit in configuration register */
398 pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
399 pci_write_config_byte(I801_dev, SMBHSTCFG,
400 hostc | SMBHSTCFG_I2C_EN);
402 dev_err(&I801_dev->dev,
403 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
408 if (read_write == I2C_SMBUS_WRITE) {
409 if (data->block[0] < 1)
411 if (data->block[0] > I2C_SMBUS_BLOCK_MAX)
412 data->block[0] = I2C_SMBUS_BLOCK_MAX;
414 data->block[0] = 32; /* max for reads */
417 if ((i801_features & FEATURE_BLOCK_BUFFER)
418 && i801_set_block_buffer_mode() == 0)
419 result = i801_block_transaction_by_block(data, read_write,
422 result = i801_block_transaction_byte_by_byte(data, read_write,
425 if (result == 0 && hwpec)
428 if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
429 /* restore saved configuration register value */
430 pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
435 /* Return -1 on error. */
436 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
437 unsigned short flags, char read_write, u8 command,
438 int size, union i2c_smbus_data * data)
444 hwpec = (i801_features & FEATURE_SMBUS_PEC) && (flags & I2C_CLIENT_PEC)
445 && size != I2C_SMBUS_QUICK
446 && size != I2C_SMBUS_I2C_BLOCK_DATA;
449 case I2C_SMBUS_QUICK:
450 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
455 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
457 if (read_write == I2C_SMBUS_WRITE)
458 outb_p(command, SMBHSTCMD);
461 case I2C_SMBUS_BYTE_DATA:
462 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
464 outb_p(command, SMBHSTCMD);
465 if (read_write == I2C_SMBUS_WRITE)
466 outb_p(data->byte, SMBHSTDAT0);
467 xact = I801_BYTE_DATA;
469 case I2C_SMBUS_WORD_DATA:
470 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
472 outb_p(command, SMBHSTCMD);
473 if (read_write == I2C_SMBUS_WRITE) {
474 outb_p(data->word & 0xff, SMBHSTDAT0);
475 outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
477 xact = I801_WORD_DATA;
479 case I2C_SMBUS_BLOCK_DATA:
480 case I2C_SMBUS_I2C_BLOCK_DATA:
481 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
483 outb_p(command, SMBHSTCMD);
486 case I2C_SMBUS_PROC_CALL:
488 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
492 if (hwpec) /* enable/disable hardware PEC */
493 outb_p(inb_p(SMBAUXCTL) | SMBAUXCTL_CRC, SMBAUXCTL);
495 outb_p(inb_p(SMBAUXCTL) & (~SMBAUXCTL_CRC), SMBAUXCTL);
498 ret = i801_block_transaction(data, read_write, size, hwpec);
500 ret = i801_transaction(xact | ENABLE_INT9);
502 /* Some BIOSes don't like it when PEC is enabled at reboot or resume
503 time, so we forcibly disable it after every transaction. Turn off
504 E32B for the same reason. */
506 outb_p(inb_p(SMBAUXCTL) & ~(SMBAUXCTL_CRC | SMBAUXCTL_E32B),
513 if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
516 switch (xact & 0x7f) {
517 case I801_BYTE: /* Result put in SMBHSTDAT0 */
519 data->byte = inb_p(SMBHSTDAT0);
522 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
529 static u32 i801_func(struct i2c_adapter *adapter)
531 return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
532 I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
533 I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK |
534 ((i801_features & FEATURE_SMBUS_PEC) ? I2C_FUNC_SMBUS_PEC : 0);
537 static const struct i2c_algorithm smbus_algorithm = {
538 .smbus_xfer = i801_access,
539 .functionality = i801_func,
542 static struct i2c_adapter i801_adapter = {
543 .owner = THIS_MODULE,
544 .id = I2C_HW_SMBUS_I801,
545 .class = I2C_CLASS_HWMON,
546 .algo = &smbus_algorithm,
549 static struct pci_device_id i801_ids[] = {
550 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
551 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
552 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
553 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
554 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
555 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
556 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
557 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
558 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
559 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
560 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
561 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
562 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TOLAPAI_1) },
566 MODULE_DEVICE_TABLE (pci, i801_ids);
568 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
575 switch (dev->device) {
576 case PCI_DEVICE_ID_INTEL_82801DB_3:
577 case PCI_DEVICE_ID_INTEL_82801EB_3:
578 case PCI_DEVICE_ID_INTEL_ESB_4:
579 case PCI_DEVICE_ID_INTEL_ICH6_16:
580 case PCI_DEVICE_ID_INTEL_ICH7_17:
581 case PCI_DEVICE_ID_INTEL_ESB2_17:
582 case PCI_DEVICE_ID_INTEL_ICH8_5:
583 case PCI_DEVICE_ID_INTEL_ICH9_6:
584 case PCI_DEVICE_ID_INTEL_TOLAPAI_1:
585 i801_features |= FEATURE_SMBUS_PEC;
586 i801_features |= FEATURE_BLOCK_BUFFER;
590 err = pci_enable_device(dev);
592 dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
597 /* Determine the address of the SMBus area */
598 i801_smba = pci_resource_start(dev, SMBBAR);
600 dev_err(&dev->dev, "SMBus base address uninitialized, "
606 err = pci_request_region(dev, SMBBAR, i801_driver.name);
608 dev_err(&dev->dev, "Failed to request SMBus region "
609 "0x%lx-0x%Lx\n", i801_smba,
610 (unsigned long long)pci_resource_end(dev, SMBBAR));
614 pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
615 i801_original_hstcfg = temp;
616 temp &= ~SMBHSTCFG_I2C_EN; /* SMBus timing */
617 if (!(temp & SMBHSTCFG_HST_EN)) {
618 dev_info(&dev->dev, "Enabling SMBus device\n");
619 temp |= SMBHSTCFG_HST_EN;
621 pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
623 if (temp & SMBHSTCFG_SMB_SMI_EN)
624 dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
626 dev_dbg(&dev->dev, "SMBus using PCI Interrupt\n");
628 /* set up the sysfs linkage to our parent device */
629 i801_adapter.dev.parent = &dev->dev;
631 snprintf(i801_adapter.name, sizeof(i801_adapter.name),
632 "SMBus I801 adapter at %04lx", i801_smba);
633 err = i2c_add_adapter(&i801_adapter);
635 dev_err(&dev->dev, "Failed to add SMBus adapter\n");
641 pci_release_region(dev, SMBBAR);
646 static void __devexit i801_remove(struct pci_dev *dev)
648 i2c_del_adapter(&i801_adapter);
649 pci_write_config_byte(I801_dev, SMBHSTCFG, i801_original_hstcfg);
650 pci_release_region(dev, SMBBAR);
652 * do not call pci_disable_device(dev) since it can cause hard hangs on
653 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
658 static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
661 pci_write_config_byte(dev, SMBHSTCFG, i801_original_hstcfg);
662 pci_set_power_state(dev, pci_choose_state(dev, mesg));
666 static int i801_resume(struct pci_dev *dev)
668 pci_set_power_state(dev, PCI_D0);
669 pci_restore_state(dev);
670 return pci_enable_device(dev);
673 #define i801_suspend NULL
674 #define i801_resume NULL
677 static struct pci_driver i801_driver = {
678 .name = "i801_smbus",
679 .id_table = i801_ids,
681 .remove = __devexit_p(i801_remove),
682 .suspend = i801_suspend,
683 .resume = i801_resume,
686 static int __init i2c_i801_init(void)
688 return pci_register_driver(&i801_driver);
691 static void __exit i2c_i801_exit(void)
693 pci_unregister_driver(&i801_driver);
696 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
697 "Philip Edelbrock <phil@netroedge.com>, "
698 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
699 MODULE_DESCRIPTION("I801 SMBus driver");
700 MODULE_LICENSE("GPL");
702 module_init(i2c_i801_init);
703 module_exit(i2c_i801_exit);