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
95static int i801_transaction(void);
96static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
97				  int command, int hwpec);
98
99static unsigned long i801_smba;
100static unsigned char i801_original_hstcfg;
101static struct pci_driver i801_driver;
102static struct pci_dev *I801_dev;
103static int isich4;
104
105static 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 */
176static 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;
331END:
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. */
340static 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
430static 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
438static const struct i2c_algorithm smbus_algorithm = {
439	.smbus_xfer	= i801_access,
440	.functionality	= i801_func,
441};
442
443static 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
450static 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
466MODULE_DEVICE_TABLE (pci, i801_ids);
467
468static 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, sizeof(i801_adapter.name),
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
539exit_release:
540	pci_release_region(dev, SMBBAR);
541exit:
542	return err;
543}
544
545static 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
557static 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
565static 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
576static 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
585static int __init i2c_i801_init(void)
586{
587	return pci_register_driver(&i801_driver);
588}
589
590static void __exit i2c_i801_exit(void)
591{
592	pci_unregister_driver(&i801_driver);
593}
594
595MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
596		"Philip Edelbrock <phil@netroedge.com>, "
597		"and Mark D. Studebaker <mdsxyz123@yahoo.com>");
598MODULE_DESCRIPTION("I801 SMBus driver");
599MODULE_LICENSE("GPL");
600
601module_init(i2c_i801_init);
602module_exit(i2c_i801_exit);
603