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)
30 82801EB 24D3 (HW PEC supported)
38 This driver supports several versions of Intel's I/O Controller Hubs (ICH).
39 For SMBus support, they are similar to the PIIX4 and are part
40 of Intel's '810' and other chipsets.
41 See the file Documentation/i2c/busses/i2c-i801 for details.
42 I2C Block Read and Process Call are not supported.
45 /* Note: we assume there can only be one I801, with one SMBus interface */
47 #include <linux/module.h>
48 #include <linux/pci.h>
49 #include <linux/kernel.h>
50 #include <linux/stddef.h>
51 #include <linux/delay.h>
52 #include <linux/ioport.h>
53 #include <linux/init.h>
54 #include <linux/i2c.h>
57 /* I801 SMBus address offsets */
58 #define SMBHSTSTS (0 + i801_smba)
59 #define SMBHSTCNT (2 + i801_smba)
60 #define SMBHSTCMD (3 + i801_smba)
61 #define SMBHSTADD (4 + i801_smba)
62 #define SMBHSTDAT0 (5 + i801_smba)
63 #define SMBHSTDAT1 (6 + i801_smba)
64 #define SMBBLKDAT (7 + i801_smba)
65 #define SMBPEC (8 + i801_smba) /* ICH4 only */
66 #define SMBAUXSTS (12 + i801_smba) /* ICH4 only */
67 #define SMBAUXCTL (13 + i801_smba) /* ICH4 only */
69 /* PCI Address Constants */
71 #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
78 /* Auxillary control register bits, ICH4+ only */
79 #define SMBAUXCTL_CRC 1
80 #define SMBAUXCTL_E32B 2
82 /* kill bit for SMBHSTCNT */
83 #define SMBHSTCNT_KILL 2
86 #define MAX_TIMEOUT 100
87 #define ENABLE_INT9 0 /* set to 0x01 to enable - untested */
89 /* I801 command constants */
90 #define I801_QUICK 0x00
91 #define I801_BYTE 0x04
92 #define I801_BYTE_DATA 0x08
93 #define I801_WORD_DATA 0x0C
94 #define I801_PROC_CALL 0x10 /* later chips only, unimplemented */
95 #define I801_BLOCK_DATA 0x14
96 #define I801_I2C_BLOCK_DATA 0x18 /* unimplemented */
97 #define I801_BLOCK_LAST 0x34
98 #define I801_I2C_BLOCK_LAST 0x38 /* unimplemented */
99 #define I801_START 0x40
100 #define I801_PEC_EN 0x80 /* ICH4 only */
102 /* I801 Hosts Status register bits */
103 #define SMBHSTSTS_BYTE_DONE 0x80
104 #define SMBHSTSTS_INUSE_STS 0x40
105 #define SMBHSTSTS_SMBALERT_STS 0x20
106 #define SMBHSTSTS_FAILED 0x10
107 #define SMBHSTSTS_BUS_ERR 0x08
108 #define SMBHSTSTS_DEV_ERR 0x04
109 #define SMBHSTSTS_INTR 0x02
110 #define SMBHSTSTS_HOST_BUSY 0x01
112 static unsigned long i801_smba
;
113 static unsigned char i801_original_hstcfg
;
114 static struct pci_driver i801_driver
;
115 static struct pci_dev
*I801_dev
;
118 static int i801_transaction(int xact
)
124 dev_dbg(&I801_dev
->dev
, "Transaction (pre): CNT=%02x, CMD=%02x, "
125 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT
),
126 inb_p(SMBHSTCMD
), inb_p(SMBHSTADD
), inb_p(SMBHSTDAT0
),
129 /* Make sure the SMBus host is ready to start transmitting */
130 /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
131 if ((temp
= (0x1f & inb_p(SMBHSTSTS
))) != 0x00) {
132 dev_dbg(&I801_dev
->dev
, "SMBus busy (%02x). Resetting...\n",
134 outb_p(temp
, SMBHSTSTS
);
135 if ((temp
= (0x1f & inb_p(SMBHSTSTS
))) != 0x00) {
136 dev_dbg(&I801_dev
->dev
, "Failed! (%02x)\n", temp
);
139 dev_dbg(&I801_dev
->dev
, "Successful!\n");
143 /* the current contents of SMBHSTCNT can be overwritten, since PEC,
144 * INTREN, SMBSCMD are passed in xact */
145 outb_p(xact
| I801_START
, SMBHSTCNT
);
147 /* We will always wait for a fraction of a second! */
150 temp
= inb_p(SMBHSTSTS
);
151 } while ((temp
& SMBHSTSTS_HOST_BUSY
) && (timeout
++ < MAX_TIMEOUT
));
153 /* If the SMBus is still busy, we give up */
154 if (timeout
>= MAX_TIMEOUT
) {
155 dev_dbg(&I801_dev
->dev
, "SMBus Timeout!\n");
157 /* try to stop the current command */
158 dev_dbg(&I801_dev
->dev
, "Terminating the current operation\n");
159 outb_p(inb_p(SMBHSTCNT
) | SMBHSTCNT_KILL
, SMBHSTCNT
);
161 outb_p(inb_p(SMBHSTCNT
) & (~SMBHSTCNT_KILL
), SMBHSTCNT
);
164 if (temp
& SMBHSTSTS_FAILED
) {
166 dev_dbg(&I801_dev
->dev
, "Error: Failed bus transaction\n");
169 if (temp
& SMBHSTSTS_BUS_ERR
) {
171 dev_err(&I801_dev
->dev
, "Bus collision! SMBus may be locked "
172 "until next hard reset. (sorry!)\n");
173 /* Clock stops and slave is stuck in mid-transmission */
176 if (temp
& SMBHSTSTS_DEV_ERR
) {
178 dev_dbg(&I801_dev
->dev
, "Error: no response!\n");
181 if ((inb_p(SMBHSTSTS
) & 0x1f) != 0x00)
182 outb_p(inb(SMBHSTSTS
), SMBHSTSTS
);
184 if ((temp
= (0x1f & inb_p(SMBHSTSTS
))) != 0x00) {
185 dev_dbg(&I801_dev
->dev
, "Failed reset at end of transaction "
188 dev_dbg(&I801_dev
->dev
, "Transaction (post): CNT=%02x, CMD=%02x, "
189 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT
),
190 inb_p(SMBHSTCMD
), inb_p(SMBHSTADD
), inb_p(SMBHSTDAT0
),
195 /* wait for INTR bit as advised by Intel */
196 static void i801_wait_hwpec(void)
203 temp
= inb_p(SMBHSTSTS
);
204 } while ((!(temp
& SMBHSTSTS_INTR
))
205 && (timeout
++ < MAX_TIMEOUT
));
207 if (timeout
>= MAX_TIMEOUT
) {
208 dev_dbg(&I801_dev
->dev
, "PEC Timeout!\n");
210 outb_p(temp
, SMBHSTSTS
);
213 static int i801_block_transaction_by_block(union i2c_smbus_data
*data
,
214 char read_write
, int hwpec
)
218 inb_p(SMBHSTCNT
); /* reset the data buffer index */
220 /* Use 32-byte buffer to process this transaction */
221 if (read_write
== I2C_SMBUS_WRITE
) {
222 len
= data
->block
[0];
223 outb_p(len
, SMBHSTDAT0
);
224 for (i
= 0; i
< len
; i
++)
225 outb_p(data
->block
[i
+1], SMBBLKDAT
);
228 if (i801_transaction(I801_BLOCK_DATA
| ENABLE_INT9
|
229 I801_PEC_EN
* hwpec
))
232 if (read_write
== I2C_SMBUS_READ
) {
233 len
= inb_p(SMBHSTDAT0
);
234 if (len
< 1 || len
> I2C_SMBUS_BLOCK_MAX
)
237 data
->block
[0] = len
;
238 for (i
= 0; i
< len
; i
++)
239 data
->block
[i
+ 1] = inb_p(SMBBLKDAT
);
244 static int i801_block_transaction_byte_by_byte(union i2c_smbus_data
*data
,
245 char read_write
, int hwpec
)
252 unsigned char errmask
;
254 len
= data
->block
[0];
256 if (read_write
== I2C_SMBUS_WRITE
) {
257 outb_p(len
, SMBHSTDAT0
);
258 outb_p(data
->block
[1], SMBBLKDAT
);
261 for (i
= 1; i
<= len
; i
++) {
262 if (i
== len
&& read_write
== I2C_SMBUS_READ
)
263 smbcmd
= I801_BLOCK_LAST
;
265 smbcmd
= I801_BLOCK_DATA
;
266 outb_p(smbcmd
| ENABLE_INT9
, SMBHSTCNT
);
268 dev_dbg(&I801_dev
->dev
, "Block (pre %d): CNT=%02x, CMD=%02x, "
269 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i
,
270 inb_p(SMBHSTCNT
), inb_p(SMBHSTCMD
), inb_p(SMBHSTADD
),
271 inb_p(SMBHSTDAT0
), inb_p(SMBBLKDAT
));
273 /* Make sure the SMBus host is ready to start transmitting */
274 temp
= inb_p(SMBHSTSTS
);
276 /* Erroneous conditions before transaction:
277 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
280 /* Erroneous conditions during transaction:
281 * Failed, Bus_Err, Dev_Err, Intr */
284 if (temp
& errmask
) {
285 dev_dbg(&I801_dev
->dev
, "SMBus busy (%02x). "
286 "Resetting...\n", temp
);
287 outb_p(temp
, SMBHSTSTS
);
288 if (((temp
= inb_p(SMBHSTSTS
)) & errmask
) != 0x00) {
289 dev_err(&I801_dev
->dev
,
290 "Reset failed! (%02x)\n", temp
);
294 /* if die in middle of block transaction, fail */
299 outb_p(inb(SMBHSTCNT
) | I801_START
, SMBHSTCNT
);
301 /* We will always wait for a fraction of a second! */
305 temp
= inb_p(SMBHSTSTS
);
307 while ((!(temp
& SMBHSTSTS_BYTE_DONE
))
308 && (timeout
++ < MAX_TIMEOUT
));
310 /* If the SMBus is still busy, we give up */
311 if (timeout
>= MAX_TIMEOUT
) {
312 /* try to stop the current command */
313 dev_dbg(&I801_dev
->dev
, "Terminating the current "
315 outb_p(inb_p(SMBHSTCNT
) | SMBHSTCNT_KILL
, SMBHSTCNT
);
317 outb_p(inb_p(SMBHSTCNT
) & (~SMBHSTCNT_KILL
),
320 dev_dbg(&I801_dev
->dev
, "SMBus Timeout!\n");
323 if (temp
& SMBHSTSTS_FAILED
) {
325 dev_dbg(&I801_dev
->dev
,
326 "Error: Failed bus transaction\n");
327 } else if (temp
& SMBHSTSTS_BUS_ERR
) {
329 dev_err(&I801_dev
->dev
, "Bus collision!\n");
330 } else if (temp
& SMBHSTSTS_DEV_ERR
) {
332 dev_dbg(&I801_dev
->dev
, "Error: no response!\n");
335 if (i
== 1 && read_write
== I2C_SMBUS_READ
) {
336 len
= inb_p(SMBHSTDAT0
);
337 if (len
< 1 || len
> I2C_SMBUS_BLOCK_MAX
)
339 data
->block
[0] = len
;
342 /* Retrieve/store value in SMBBLKDAT */
343 if (read_write
== I2C_SMBUS_READ
)
344 data
->block
[i
] = inb_p(SMBBLKDAT
);
345 if (read_write
== I2C_SMBUS_WRITE
&& i
+1 <= len
)
346 outb_p(data
->block
[i
+1], SMBBLKDAT
);
347 if ((temp
& 0x9e) != 0x00)
348 outb_p(temp
, SMBHSTSTS
); /* signals SMBBLKDAT ready */
350 if ((temp
= (0x1e & inb_p(SMBHSTSTS
))) != 0x00) {
351 dev_dbg(&I801_dev
->dev
,
352 "Bad status (%02x) at end of transaction\n",
355 dev_dbg(&I801_dev
->dev
, "Block (post %d): CNT=%02x, CMD=%02x, "
356 "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i
,
357 inb_p(SMBHSTCNT
), inb_p(SMBHSTCMD
), inb_p(SMBHSTADD
),
358 inb_p(SMBHSTDAT0
), inb_p(SMBBLKDAT
));
366 static int i801_set_block_buffer_mode(void)
368 outb_p(inb_p(SMBAUXCTL
) | SMBAUXCTL_E32B
, SMBAUXCTL
);
369 if ((inb_p(SMBAUXCTL
) & SMBAUXCTL_E32B
) == 0)
374 /* Block transaction function */
375 static int i801_block_transaction(union i2c_smbus_data
*data
, char read_write
,
376 int command
, int hwpec
)
381 if (command
== I2C_SMBUS_I2C_BLOCK_DATA
) {
382 if (read_write
== I2C_SMBUS_WRITE
) {
383 /* set I2C_EN bit in configuration register */
384 pci_read_config_byte(I801_dev
, SMBHSTCFG
, &hostc
);
385 pci_write_config_byte(I801_dev
, SMBHSTCFG
,
386 hostc
| SMBHSTCFG_I2C_EN
);
388 dev_err(&I801_dev
->dev
,
389 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
394 if (read_write
== I2C_SMBUS_WRITE
) {
395 if (data
->block
[0] < 1)
397 if (data
->block
[0] > I2C_SMBUS_BLOCK_MAX
)
398 data
->block
[0] = I2C_SMBUS_BLOCK_MAX
;
400 data
->block
[0] = 32; /* max for reads */
403 if (isich4
&& i801_set_block_buffer_mode() == 0 )
404 result
= i801_block_transaction_by_block(data
, read_write
,
407 result
= i801_block_transaction_byte_by_byte(data
, read_write
,
410 if (result
== 0 && hwpec
)
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
)
429 hwpec
= isich4
&& (flags
& I2C_CLIENT_PEC
)
430 && size
!= I2C_SMBUS_QUICK
431 && size
!= I2C_SMBUS_I2C_BLOCK_DATA
;
434 case I2C_SMBUS_QUICK
:
435 outb_p(((addr
& 0x7f) << 1) | (read_write
& 0x01),
440 outb_p(((addr
& 0x7f) << 1) | (read_write
& 0x01),
442 if (read_write
== I2C_SMBUS_WRITE
)
443 outb_p(command
, SMBHSTCMD
);
446 case I2C_SMBUS_BYTE_DATA
:
447 outb_p(((addr
& 0x7f) << 1) | (read_write
& 0x01),
449 outb_p(command
, SMBHSTCMD
);
450 if (read_write
== I2C_SMBUS_WRITE
)
451 outb_p(data
->byte
, SMBHSTDAT0
);
452 xact
= I801_BYTE_DATA
;
454 case I2C_SMBUS_WORD_DATA
:
455 outb_p(((addr
& 0x7f) << 1) | (read_write
& 0x01),
457 outb_p(command
, SMBHSTCMD
);
458 if (read_write
== I2C_SMBUS_WRITE
) {
459 outb_p(data
->word
& 0xff, SMBHSTDAT0
);
460 outb_p((data
->word
& 0xff00) >> 8, SMBHSTDAT1
);
462 xact
= I801_WORD_DATA
;
464 case I2C_SMBUS_BLOCK_DATA
:
465 case I2C_SMBUS_I2C_BLOCK_DATA
:
466 outb_p(((addr
& 0x7f) << 1) | (read_write
& 0x01),
468 outb_p(command
, SMBHSTCMD
);
471 case I2C_SMBUS_PROC_CALL
:
473 dev_err(&I801_dev
->dev
, "Unsupported transaction %d\n", size
);
477 if (hwpec
) /* enable/disable hardware PEC */
478 outb_p(inb_p(SMBAUXCTL
) | SMBAUXCTL_CRC
, SMBAUXCTL
);
480 outb_p(inb_p(SMBAUXCTL
) & (~SMBAUXCTL_CRC
), SMBAUXCTL
);
483 ret
= i801_block_transaction(data
, read_write
, size
, hwpec
);
485 ret
= i801_transaction(xact
| ENABLE_INT9
);
487 /* Some BIOSes don't like it when PEC is enabled at reboot or resume
488 time, so we forcibly disable it after every transaction. Turn off
489 E32B for the same reason. */
491 outb_p(inb_p(SMBAUXCTL
) & ~(SMBAUXCTL_CRC
| SMBAUXCTL_E32B
),
498 if ((read_write
== I2C_SMBUS_WRITE
) || (xact
== I801_QUICK
))
501 switch (xact
& 0x7f) {
502 case I801_BYTE
: /* Result put in SMBHSTDAT0 */
504 data
->byte
= inb_p(SMBHSTDAT0
);
507 data
->word
= inb_p(SMBHSTDAT0
) + (inb_p(SMBHSTDAT1
) << 8);
514 static u32
i801_func(struct i2c_adapter
*adapter
)
516 return I2C_FUNC_SMBUS_QUICK
| I2C_FUNC_SMBUS_BYTE
|
517 I2C_FUNC_SMBUS_BYTE_DATA
| I2C_FUNC_SMBUS_WORD_DATA
|
518 I2C_FUNC_SMBUS_BLOCK_DATA
| I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
519 | (isich4
? I2C_FUNC_SMBUS_PEC
: 0);
522 static const struct i2c_algorithm smbus_algorithm
= {
523 .smbus_xfer
= i801_access
,
524 .functionality
= i801_func
,
527 static struct i2c_adapter i801_adapter
= {
528 .owner
= THIS_MODULE
,
529 .id
= I2C_HW_SMBUS_I801
,
530 .class = I2C_CLASS_HWMON
,
531 .algo
= &smbus_algorithm
,
534 static struct pci_device_id i801_ids
[] = {
535 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82801AA_3
) },
536 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82801AB_3
) },
537 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82801BA_2
) },
538 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82801CA_3
) },
539 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82801DB_3
) },
540 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_82801EB_3
) },
541 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ESB_4
) },
542 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ICH6_16
) },
543 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ICH7_17
) },
544 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ESB2_17
) },
545 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ICH8_5
) },
546 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_ICH9_6
) },
547 { PCI_DEVICE(PCI_VENDOR_ID_INTEL
, PCI_DEVICE_ID_INTEL_TOLAPAI_1
) },
551 MODULE_DEVICE_TABLE (pci
, i801_ids
);
553 static int __devinit
i801_probe(struct pci_dev
*dev
, const struct pci_device_id
*id
)
559 switch (dev
->device
) {
560 case PCI_DEVICE_ID_INTEL_82801DB_3
:
561 case PCI_DEVICE_ID_INTEL_82801EB_3
:
562 case PCI_DEVICE_ID_INTEL_ESB_4
:
563 case PCI_DEVICE_ID_INTEL_ICH6_16
:
564 case PCI_DEVICE_ID_INTEL_ICH7_17
:
565 case PCI_DEVICE_ID_INTEL_ESB2_17
:
566 case PCI_DEVICE_ID_INTEL_ICH8_5
:
567 case PCI_DEVICE_ID_INTEL_ICH9_6
:
568 case PCI_DEVICE_ID_INTEL_TOLAPAI_1
:
575 err
= pci_enable_device(dev
);
577 dev_err(&dev
->dev
, "Failed to enable SMBus PCI device (%d)\n",
582 /* Determine the address of the SMBus area */
583 i801_smba
= pci_resource_start(dev
, SMBBAR
);
585 dev_err(&dev
->dev
, "SMBus base address uninitialized, "
591 err
= pci_request_region(dev
, SMBBAR
, i801_driver
.name
);
593 dev_err(&dev
->dev
, "Failed to request SMBus region "
594 "0x%lx-0x%Lx\n", i801_smba
,
595 (unsigned long long)pci_resource_end(dev
, SMBBAR
));
599 pci_read_config_byte(I801_dev
, SMBHSTCFG
, &temp
);
600 i801_original_hstcfg
= temp
;
601 temp
&= ~SMBHSTCFG_I2C_EN
; /* SMBus timing */
602 if (!(temp
& SMBHSTCFG_HST_EN
)) {
603 dev_info(&dev
->dev
, "Enabling SMBus device\n");
604 temp
|= SMBHSTCFG_HST_EN
;
606 pci_write_config_byte(I801_dev
, SMBHSTCFG
, temp
);
608 if (temp
& SMBHSTCFG_SMB_SMI_EN
)
609 dev_dbg(&dev
->dev
, "SMBus using interrupt SMI#\n");
611 dev_dbg(&dev
->dev
, "SMBus using PCI Interrupt\n");
613 /* set up the sysfs linkage to our parent device */
614 i801_adapter
.dev
.parent
= &dev
->dev
;
616 snprintf(i801_adapter
.name
, sizeof(i801_adapter
.name
),
617 "SMBus I801 adapter at %04lx", i801_smba
);
618 err
= i2c_add_adapter(&i801_adapter
);
620 dev_err(&dev
->dev
, "Failed to add SMBus adapter\n");
626 pci_release_region(dev
, SMBBAR
);
631 static void __devexit
i801_remove(struct pci_dev
*dev
)
633 i2c_del_adapter(&i801_adapter
);
634 pci_write_config_byte(I801_dev
, SMBHSTCFG
, i801_original_hstcfg
);
635 pci_release_region(dev
, SMBBAR
);
637 * do not call pci_disable_device(dev) since it can cause hard hangs on
638 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
643 static int i801_suspend(struct pci_dev
*dev
, pm_message_t mesg
)
646 pci_write_config_byte(dev
, SMBHSTCFG
, i801_original_hstcfg
);
647 pci_set_power_state(dev
, pci_choose_state(dev
, mesg
));
651 static int i801_resume(struct pci_dev
*dev
)
653 pci_set_power_state(dev
, PCI_D0
);
654 pci_restore_state(dev
);
655 return pci_enable_device(dev
);
658 #define i801_suspend NULL
659 #define i801_resume NULL
662 static struct pci_driver i801_driver
= {
663 .name
= "i801_smbus",
664 .id_table
= i801_ids
,
666 .remove
= __devexit_p(i801_remove
),
667 .suspend
= i801_suspend
,
668 .resume
= i801_resume
,
671 static int __init
i2c_i801_init(void)
673 return pci_register_driver(&i801_driver
);
676 static void __exit
i2c_i801_exit(void)
678 pci_unregister_driver(&i801_driver
);
681 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
682 "Philip Edelbrock <phil@netroedge.com>, "
683 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
684 MODULE_DESCRIPTION("I801 SMBus driver");
685 MODULE_LICENSE("GPL");
687 module_init(i2c_i801_init
);
688 module_exit(i2c_i801_exit
);