xref: /linux/drivers/i2c/busses/i2c-i801.c (revision ba6e8564f459211117ce300eae2c7fdd23befe34)
1 /*
2     i2c-i801.c - Part of lm_sensors, Linux kernel modules for hardware
3               monitoring
4     Copyright (c) 1998 - 2002  Frodo Looijaard <frodol@dds.nl>,
5     Philip Edelbrock <phil@netroedge.com>, and Mark D. Studebaker
6     <mdsxyz123@yahoo.com>
7 
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.
12 
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.
17 
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.
21 */
22 
23 /*
24     SUPPORTED DEVICES	PCI ID
25     82801AA		2413
26     82801AB		2423
27     82801BA		2443
28     82801CA/CAM		2483
29     82801DB		24C3   (HW PEC supported, 32 byte buffer not supported)
30     82801EB		24D3   (HW PEC supported, 32 byte buffer not supported)
31     6300ESB		25A4
32     ICH6		266A
33     ICH7		27DA
34     ESB2		269B
35     ICH8		283E
36     ICH9		2930
37     This driver supports several versions of Intel's I/O Controller Hubs (ICH).
38     For SMBus support, they are similar to the PIIX4 and are part
39     of Intel's '810' and other chipsets.
40     See the file Documentation/i2c/busses/i2c-i801 for details.
41     I2C Block Read and Process Call are not supported.
42 */
43 
44 /* Note: we assume there can only be one I801, with one SMBus interface */
45 
46 #include <linux/module.h>
47 #include <linux/pci.h>
48 #include <linux/kernel.h>
49 #include <linux/stddef.h>
50 #include <linux/delay.h>
51 #include <linux/ioport.h>
52 #include <linux/init.h>
53 #include <linux/i2c.h>
54 #include <asm/io.h>
55 
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 */
67 
68 /* PCI Address Constants */
69 #define SMBBAR		4
70 #define SMBHSTCFG	0x040
71 
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
76 
77 /* Other settings */
78 #define MAX_TIMEOUT		100
79 #define ENABLE_INT9		0	/* set to 0x01 to enable - untested */
80 
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 */
93 
94 
95 static int i801_transaction(void);
96 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
97 				  int command, int hwpec);
98 
99 static unsigned long i801_smba;
100 static unsigned char i801_original_hstcfg;
101 static struct pci_driver i801_driver;
102 static struct pci_dev *I801_dev;
103 static int isich4;
104 
105 static int i801_transaction(void)
106 {
107 	int temp;
108 	int result = 0;
109 	int timeout = 0;
110 
111 	dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
112 		"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
113 		inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
114 		inb_p(SMBHSTDAT1));
115 
116 	/* Make sure the SMBus host is ready to start transmitting */
117 	/* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
118 	if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
119 		dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting...\n",
120 			temp);
121 		outb_p(temp, SMBHSTSTS);
122 		if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
123 			dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
124 			return -1;
125 		} else {
126 			dev_dbg(&I801_dev->dev, "Successful!\n");
127 		}
128 	}
129 
130 	outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
131 
132 	/* We will always wait for a fraction of a second! */
133 	do {
134 		msleep(1);
135 		temp = inb_p(SMBHSTSTS);
136 	} while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
137 
138 	/* If the SMBus is still busy, we give up */
139 	if (timeout >= MAX_TIMEOUT) {
140 		dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
141 		result = -1;
142 	}
143 
144 	if (temp & 0x10) {
145 		result = -1;
146 		dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
147 	}
148 
149 	if (temp & 0x08) {
150 		result = -1;
151 		dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
152 			"until next hard reset. (sorry!)\n");
153 		/* Clock stops and slave is stuck in mid-transmission */
154 	}
155 
156 	if (temp & 0x04) {
157 		result = -1;
158 		dev_dbg(&I801_dev->dev, "Error: no response!\n");
159 	}
160 
161 	if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
162 		outb_p(inb(SMBHSTSTS), SMBHSTSTS);
163 
164 	if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
165 		dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
166 			"(%02x)\n", temp);
167 	}
168 	dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
169 		"ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
170 		inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
171 		inb_p(SMBHSTDAT1));
172 	return result;
173 }
174 
175 /* All-inclusive block transaction function */
176 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
177 				  int command, int hwpec)
178 {
179 	int i, len;
180 	int smbcmd;
181 	int temp;
182 	int result = 0;
183 	int timeout;
184 	unsigned char hostc, errmask;
185 
186 	if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
187 		if (read_write == I2C_SMBUS_WRITE) {
188 			/* set I2C_EN bit in configuration register */
189 			pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
190 			pci_write_config_byte(I801_dev, SMBHSTCFG,
191 					      hostc | SMBHSTCFG_I2C_EN);
192 		} else {
193 			dev_err(&I801_dev->dev,
194 				"I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
195 			return -1;
196 		}
197 	}
198 
199 	if (read_write == I2C_SMBUS_WRITE) {
200 		len = data->block[0];
201 		if (len < 1)
202 			len = 1;
203 		if (len > 32)
204 			len = 32;
205 		outb_p(len, SMBHSTDAT0);
206 		outb_p(data->block[1], SMBBLKDAT);
207 	} else {
208 		len = 32;	/* max for reads */
209 	}
210 
211 	if(isich4 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
212 		/* set 32 byte buffer */
213 	}
214 
215 	for (i = 1; i <= len; i++) {
216 		if (i == len && read_write == I2C_SMBUS_READ)
217 			smbcmd = I801_BLOCK_LAST;
218 		else
219 			smbcmd = I801_BLOCK_DATA;
220 		outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
221 
222 		dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
223 			"ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
224 			inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
225 			inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
226 
227 		/* Make sure the SMBus host is ready to start transmitting */
228 		temp = inb_p(SMBHSTSTS);
229 		if (i == 1) {
230 			/* Erronenous conditions before transaction:
231 			 * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
232 			errmask=0x9f;
233 		} else {
234 			/* Erronenous conditions during transaction:
235 			 * Failed, Bus_Err, Dev_Err, Intr */
236 			errmask=0x1e;
237 		}
238 		if (temp & errmask) {
239 			dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
240 				"Resetting...\n", temp);
241 			outb_p(temp, SMBHSTSTS);
242 			if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
243 				dev_err(&I801_dev->dev,
244 					"Reset failed! (%02x)\n", temp);
245 				result = -1;
246                                 goto END;
247 			}
248 			if (i != 1) {
249 				/* if die in middle of block transaction, fail */
250 				result = -1;
251 				goto END;
252 			}
253 		}
254 
255 		if (i == 1)
256 			outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
257 
258 		/* We will always wait for a fraction of a second! */
259 		timeout = 0;
260 		do {
261 			msleep(1);
262 			temp = inb_p(SMBHSTSTS);
263 		}
264 		    while ((!(temp & 0x80))
265 			   && (timeout++ < MAX_TIMEOUT));
266 
267 		/* If the SMBus is still busy, we give up */
268 		if (timeout >= MAX_TIMEOUT) {
269 			result = -1;
270 			dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
271 		}
272 
273 		if (temp & 0x10) {
274 			result = -1;
275 			dev_dbg(&I801_dev->dev,
276 				"Error: Failed bus transaction\n");
277 		} else if (temp & 0x08) {
278 			result = -1;
279 			dev_err(&I801_dev->dev, "Bus collision!\n");
280 		} else if (temp & 0x04) {
281 			result = -1;
282 			dev_dbg(&I801_dev->dev, "Error: no response!\n");
283 		}
284 
285 		if (i == 1 && read_write == I2C_SMBUS_READ) {
286 			len = inb_p(SMBHSTDAT0);
287 			if (len < 1)
288 				len = 1;
289 			if (len > 32)
290 				len = 32;
291 			data->block[0] = len;
292 		}
293 
294 		/* Retrieve/store value in SMBBLKDAT */
295 		if (read_write == I2C_SMBUS_READ)
296 			data->block[i] = inb_p(SMBBLKDAT);
297 		if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
298 			outb_p(data->block[i+1], SMBBLKDAT);
299 		if ((temp & 0x9e) != 0x00)
300 			outb_p(temp, SMBHSTSTS);  /* signals SMBBLKDAT ready */
301 
302 		if ((temp = (0x1e & inb_p(SMBHSTSTS))) != 0x00) {
303 			dev_dbg(&I801_dev->dev,
304 				"Bad status (%02x) at end of transaction\n",
305 				temp);
306 		}
307 		dev_dbg(&I801_dev->dev, "Block (post %d): CNT=%02x, CMD=%02x, "
308 			"ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
309 			inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
310 			inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
311 
312 		if (result < 0)
313 			goto END;
314 	}
315 
316 	if (hwpec) {
317 		/* wait for INTR bit as advised by Intel */
318 		timeout = 0;
319 		do {
320 			msleep(1);
321 			temp = inb_p(SMBHSTSTS);
322 		} while ((!(temp & 0x02))
323 			   && (timeout++ < MAX_TIMEOUT));
324 
325 		if (timeout >= MAX_TIMEOUT) {
326 			dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
327 		}
328 		outb_p(temp, SMBHSTSTS);
329 	}
330 	result = 0;
331 END:
332 	if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
333 		/* restore saved configuration register value */
334 		pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
335 	}
336 	return result;
337 }
338 
339 /* Return -1 on error. */
340 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
341 		       unsigned short flags, char read_write, u8 command,
342 		       int size, union i2c_smbus_data * data)
343 {
344 	int hwpec;
345 	int block = 0;
346 	int ret, xact = 0;
347 
348 	hwpec = isich4 && (flags & I2C_CLIENT_PEC)
349 		&& size != I2C_SMBUS_QUICK
350 		&& size != I2C_SMBUS_I2C_BLOCK_DATA;
351 
352 	switch (size) {
353 	case I2C_SMBUS_QUICK:
354 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
355 		       SMBHSTADD);
356 		xact = I801_QUICK;
357 		break;
358 	case I2C_SMBUS_BYTE:
359 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
360 		       SMBHSTADD);
361 		if (read_write == I2C_SMBUS_WRITE)
362 			outb_p(command, SMBHSTCMD);
363 		xact = I801_BYTE;
364 		break;
365 	case I2C_SMBUS_BYTE_DATA:
366 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
367 		       SMBHSTADD);
368 		outb_p(command, SMBHSTCMD);
369 		if (read_write == I2C_SMBUS_WRITE)
370 			outb_p(data->byte, SMBHSTDAT0);
371 		xact = I801_BYTE_DATA;
372 		break;
373 	case I2C_SMBUS_WORD_DATA:
374 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
375 		       SMBHSTADD);
376 		outb_p(command, SMBHSTCMD);
377 		if (read_write == I2C_SMBUS_WRITE) {
378 			outb_p(data->word & 0xff, SMBHSTDAT0);
379 			outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
380 		}
381 		xact = I801_WORD_DATA;
382 		break;
383 	case I2C_SMBUS_BLOCK_DATA:
384 	case I2C_SMBUS_I2C_BLOCK_DATA:
385 		outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
386 		       SMBHSTADD);
387 		outb_p(command, SMBHSTCMD);
388 		block = 1;
389 		break;
390 	case I2C_SMBUS_PROC_CALL:
391 	default:
392 		dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
393 		return -1;
394 	}
395 
396 	outb_p(hwpec, SMBAUXCTL);	/* enable/disable hardware PEC */
397 
398 	if(block)
399 		ret = i801_block_transaction(data, read_write, size, hwpec);
400 	else {
401 		outb_p(xact | ENABLE_INT9, SMBHSTCNT);
402 		ret = i801_transaction();
403 	}
404 
405 	/* Some BIOSes don't like it when PEC is enabled at reboot or resume
406 	   time, so we forcibly disable it after every transaction. */
407 	if (hwpec)
408 		outb_p(0, SMBAUXCTL);
409 
410 	if(block)
411 		return ret;
412 	if(ret)
413 		return -1;
414 	if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
415 		return 0;
416 
417 	switch (xact & 0x7f) {
418 	case I801_BYTE:	/* Result put in SMBHSTDAT0 */
419 	case I801_BYTE_DATA:
420 		data->byte = inb_p(SMBHSTDAT0);
421 		break;
422 	case I801_WORD_DATA:
423 		data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
424 		break;
425 	}
426 	return 0;
427 }
428 
429 
430 static u32 i801_func(struct i2c_adapter *adapter)
431 {
432 	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
433 	    I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
434 	    I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
435 	     | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0);
436 }
437 
438 static const struct i2c_algorithm smbus_algorithm = {
439 	.smbus_xfer	= i801_access,
440 	.functionality	= i801_func,
441 };
442 
443 static struct i2c_adapter i801_adapter = {
444 	.owner		= THIS_MODULE,
445 	.id		= I2C_HW_SMBUS_I801,
446 	.class		= I2C_CLASS_HWMON,
447 	.algo		= &smbus_algorithm,
448 };
449 
450 static struct pci_device_id i801_ids[] = {
451 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
452 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
453 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
454 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
455 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
456 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
457 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
458 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
459 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
460 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
461 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
462 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_6) },
463 	{ 0, }
464 };
465 
466 MODULE_DEVICE_TABLE (pci, i801_ids);
467 
468 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
469 {
470 	unsigned char temp;
471 	int err;
472 
473 	I801_dev = dev;
474 	switch (dev->device) {
475 	case PCI_DEVICE_ID_INTEL_82801DB_3:
476 	case PCI_DEVICE_ID_INTEL_82801EB_3:
477 	case PCI_DEVICE_ID_INTEL_ESB_4:
478 	case PCI_DEVICE_ID_INTEL_ICH6_16:
479 	case PCI_DEVICE_ID_INTEL_ICH7_17:
480 	case PCI_DEVICE_ID_INTEL_ESB2_17:
481 	case PCI_DEVICE_ID_INTEL_ICH8_5:
482 	case PCI_DEVICE_ID_INTEL_ICH9_6:
483 		isich4 = 1;
484 		break;
485 	default:
486 		isich4 = 0;
487 	}
488 
489 	err = pci_enable_device(dev);
490 	if (err) {
491 		dev_err(&dev->dev, "Failed to enable SMBus PCI device (%d)\n",
492 			err);
493 		goto exit;
494 	}
495 
496 	/* Determine the address of the SMBus area */
497 	i801_smba = pci_resource_start(dev, SMBBAR);
498 	if (!i801_smba) {
499 		dev_err(&dev->dev, "SMBus base address uninitialized, "
500 			"upgrade BIOS\n");
501 		err = -ENODEV;
502 		goto exit;
503 	}
504 
505 	err = pci_request_region(dev, SMBBAR, i801_driver.name);
506 	if (err) {
507 		dev_err(&dev->dev, "Failed to request SMBus region "
508 			"0x%lx-0x%Lx\n", i801_smba,
509 			(unsigned long long)pci_resource_end(dev, SMBBAR));
510 		goto exit;
511 	}
512 
513 	pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
514 	i801_original_hstcfg = temp;
515 	temp &= ~SMBHSTCFG_I2C_EN;	/* SMBus timing */
516 	if (!(temp & SMBHSTCFG_HST_EN)) {
517 		dev_info(&dev->dev, "Enabling SMBus device\n");
518 		temp |= SMBHSTCFG_HST_EN;
519 	}
520 	pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
521 
522 	if (temp & SMBHSTCFG_SMB_SMI_EN)
523 		dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
524 	else
525 		dev_dbg(&dev->dev, "SMBus using PCI Interrupt\n");
526 
527 	/* set up the sysfs linkage to our parent device */
528 	i801_adapter.dev.parent = &dev->dev;
529 
530 	snprintf(i801_adapter.name, I2C_NAME_SIZE,
531 		"SMBus I801 adapter at %04lx", i801_smba);
532 	err = i2c_add_adapter(&i801_adapter);
533 	if (err) {
534 		dev_err(&dev->dev, "Failed to add SMBus adapter\n");
535 		goto exit_release;
536 	}
537 	return 0;
538 
539 exit_release:
540 	pci_release_region(dev, SMBBAR);
541 exit:
542 	return err;
543 }
544 
545 static void __devexit i801_remove(struct pci_dev *dev)
546 {
547 	i2c_del_adapter(&i801_adapter);
548 	pci_write_config_byte(I801_dev, SMBHSTCFG, i801_original_hstcfg);
549 	pci_release_region(dev, SMBBAR);
550 	/*
551 	 * do not call pci_disable_device(dev) since it can cause hard hangs on
552 	 * some systems during power-off (eg. Fujitsu-Siemens Lifebook E8010)
553 	 */
554 }
555 
556 #ifdef CONFIG_PM
557 static int i801_suspend(struct pci_dev *dev, pm_message_t mesg)
558 {
559 	pci_save_state(dev);
560 	pci_write_config_byte(dev, SMBHSTCFG, i801_original_hstcfg);
561 	pci_set_power_state(dev, pci_choose_state(dev, mesg));
562 	return 0;
563 }
564 
565 static int i801_resume(struct pci_dev *dev)
566 {
567 	pci_set_power_state(dev, PCI_D0);
568 	pci_restore_state(dev);
569 	return pci_enable_device(dev);
570 }
571 #else
572 #define i801_suspend NULL
573 #define i801_resume NULL
574 #endif
575 
576 static struct pci_driver i801_driver = {
577 	.name		= "i801_smbus",
578 	.id_table	= i801_ids,
579 	.probe		= i801_probe,
580 	.remove		= __devexit_p(i801_remove),
581 	.suspend	= i801_suspend,
582 	.resume		= i801_resume,
583 };
584 
585 static int __init i2c_i801_init(void)
586 {
587 	return pci_register_driver(&i801_driver);
588 }
589 
590 static void __exit i2c_i801_exit(void)
591 {
592 	pci_unregister_driver(&i801_driver);
593 }
594 
595 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
596 		"Philip Edelbrock <phil@netroedge.com>, "
597 		"and Mark D. Studebaker <mdsxyz123@yahoo.com>");
598 MODULE_DESCRIPTION("I801 SMBus driver");
599 MODULE_LICENSE("GPL");
600 
601 module_init(i2c_i801_init);
602 module_exit(i2c_i801_exit);
603