Merge branch 'for_paulus' of master.kernel.org:/pub/scm/linux/kernel/git/galak/powerpc
[pandora-kernel.git] / drivers / i2c / busses / i2c-i801.c
1 /*
2     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     This driver supports several versions of Intel's I/O Controller Hubs (ICH).
37     For SMBus support, they are similar to the PIIX4 and are part
38     of Intel's '810' and other chipsets.
39     See the doc/busses/i2c-i801 file for details.
40     I2C Block Read and Process Call are not supported.
41 */
42
43 /* Note: we assume there can only be one I801, with one SMBus interface */
44
45 #include <linux/module.h>
46 #include <linux/pci.h>
47 #include <linux/kernel.h>
48 #include <linux/stddef.h>
49 #include <linux/delay.h>
50 #include <linux/sched.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 SMBBA           0x020
70 #define SMBHSTCFG       0x040
71 #define SMBREV          0x008
72
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
77
78 /* Other settings */
79 #define MAX_TIMEOUT             100
80 #define ENABLE_INT9             0       /* set to 0x01 to enable - untested */
81
82 /* I801 command constants */
83 #define I801_QUICK              0x00
84 #define I801_BYTE               0x04
85 #define I801_BYTE_DATA          0x08
86 #define I801_WORD_DATA          0x0C
87 #define I801_PROC_CALL          0x10    /* later chips only, unimplemented */
88 #define I801_BLOCK_DATA         0x14
89 #define I801_I2C_BLOCK_DATA     0x18    /* unimplemented */
90 #define I801_BLOCK_LAST         0x34
91 #define I801_I2C_BLOCK_LAST     0x38    /* unimplemented */
92 #define I801_START              0x40
93 #define I801_PEC_EN             0x80    /* ICH4 only */
94
95 /* insmod parameters */
96
97 /* If force_addr is set to anything different from 0, we forcibly enable
98    the I801 at the given address. VERY DANGEROUS! */
99 static u16 force_addr;
100 module_param(force_addr, ushort, 0);
101 MODULE_PARM_DESC(force_addr,
102                  "Forcibly enable the I801 at the given address. "
103                  "EXTREMELY DANGEROUS!");
104
105 static int i801_transaction(void);
106 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
107                                   int command, int hwpec);
108
109 static unsigned short i801_smba;
110 static struct pci_driver i801_driver;
111 static struct pci_dev *I801_dev;
112 static int isich4;
113
114 static int i801_setup(struct pci_dev *dev)
115 {
116         int error_return = 0;
117         unsigned char temp;
118
119         /* Note: we keep on searching until we have found 'function 3' */
120         if(PCI_FUNC(dev->devfn) != 3)
121                 return -ENODEV;
122
123         I801_dev = dev;
124         if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) ||
125             (dev->device == PCI_DEVICE_ID_INTEL_82801EB_3) ||
126             (dev->device == PCI_DEVICE_ID_INTEL_ESB_4))
127                 isich4 = 1;
128         else
129                 isich4 = 0;
130
131         /* Determine the address of the SMBus areas */
132         if (force_addr) {
133                 i801_smba = force_addr & 0xfff0;
134         } else {
135                 pci_read_config_word(I801_dev, SMBBA, &i801_smba);
136                 i801_smba &= 0xfff0;
137                 if(i801_smba == 0) {
138                         dev_err(&dev->dev, "SMB base address uninitialized "
139                                 "- upgrade BIOS or use force_addr=0xaddr\n");
140                         return -ENODEV;
141                 }
142         }
143
144         if (!request_region(i801_smba, (isich4 ? 16 : 8), i801_driver.name)) {
145                 dev_err(&dev->dev, "I801_smb region 0x%x already in use!\n",
146                         i801_smba);
147                 error_return = -EBUSY;
148                 goto END;
149         }
150
151         pci_read_config_byte(I801_dev, SMBHSTCFG, &temp);
152         temp &= ~SMBHSTCFG_I2C_EN;      /* SMBus timing */
153         pci_write_config_byte(I801_dev, SMBHSTCFG, temp);
154
155         /* If force_addr is set, we program the new address here. Just to make
156            sure, we disable the device first. */
157         if (force_addr) {
158                 pci_write_config_byte(I801_dev, SMBHSTCFG, temp & 0xfe);
159                 pci_write_config_word(I801_dev, SMBBA, i801_smba);
160                 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 0x01);
161                 dev_warn(&dev->dev, "WARNING: I801 SMBus interface set to "
162                         "new address %04x!\n", i801_smba);
163         } else if ((temp & 1) == 0) {
164                 pci_write_config_byte(I801_dev, SMBHSTCFG, temp | 1);
165                 dev_warn(&dev->dev, "enabling SMBus device\n");
166         }
167
168         if (temp & 0x02)
169                 dev_dbg(&dev->dev, "I801 using Interrupt SMI# for SMBus.\n");
170         else
171                 dev_dbg(&dev->dev, "I801 using PCI Interrupt for SMBus.\n");
172
173         pci_read_config_byte(I801_dev, SMBREV, &temp);
174         dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp);
175         dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba);
176
177 END:
178         return error_return;
179 }
180
181 static int i801_transaction(void)
182 {
183         int temp;
184         int result = 0;
185         int timeout = 0;
186
187         dev_dbg(&I801_dev->dev, "Transaction (pre): CNT=%02x, CMD=%02x, "
188                 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
189                 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
190                 inb_p(SMBHSTDAT1));
191
192         /* Make sure the SMBus host is ready to start transmitting */
193         /* 0x1f = Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
194         if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
195                 dev_dbg(&I801_dev->dev, "SMBus busy (%02x). Resetting...\n",
196                         temp);
197                 outb_p(temp, SMBHSTSTS);
198                 if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
199                         dev_dbg(&I801_dev->dev, "Failed! (%02x)\n", temp);
200                         return -1;
201                 } else {
202                         dev_dbg(&I801_dev->dev, "Successfull!\n");
203                 }
204         }
205
206         outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
207
208         /* We will always wait for a fraction of a second! */
209         do {
210                 msleep(1);
211                 temp = inb_p(SMBHSTSTS);
212         } while ((temp & 0x01) && (timeout++ < MAX_TIMEOUT));
213
214         /* If the SMBus is still busy, we give up */
215         if (timeout >= MAX_TIMEOUT) {
216                 dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
217                 result = -1;
218         }
219
220         if (temp & 0x10) {
221                 result = -1;
222                 dev_dbg(&I801_dev->dev, "Error: Failed bus transaction\n");
223         }
224
225         if (temp & 0x08) {
226                 result = -1;
227                 dev_err(&I801_dev->dev, "Bus collision! SMBus may be locked "
228                         "until next hard reset. (sorry!)\n");
229                 /* Clock stops and slave is stuck in mid-transmission */
230         }
231
232         if (temp & 0x04) {
233                 result = -1;
234                 dev_dbg(&I801_dev->dev, "Error: no response!\n");
235         }
236
237         if ((inb_p(SMBHSTSTS) & 0x1f) != 0x00)
238                 outb_p(inb(SMBHSTSTS), SMBHSTSTS);
239
240         if ((temp = (0x1f & inb_p(SMBHSTSTS))) != 0x00) {
241                 dev_dbg(&I801_dev->dev, "Failed reset at end of transaction "
242                         "(%02x)\n", temp);
243         }
244         dev_dbg(&I801_dev->dev, "Transaction (post): CNT=%02x, CMD=%02x, "
245                 "ADD=%02x, DAT0=%02x, DAT1=%02x\n", inb_p(SMBHSTCNT),
246                 inb_p(SMBHSTCMD), inb_p(SMBHSTADD), inb_p(SMBHSTDAT0),
247                 inb_p(SMBHSTDAT1));
248         return result;
249 }
250
251 /* All-inclusive block transaction function */
252 static int i801_block_transaction(union i2c_smbus_data *data, char read_write,
253                                   int command, int hwpec)
254 {
255         int i, len;
256         int smbcmd;
257         int temp;
258         int result = 0;
259         int timeout;
260         unsigned char hostc, errmask;
261
262         if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
263                 if (read_write == I2C_SMBUS_WRITE) {
264                         /* set I2C_EN bit in configuration register */
265                         pci_read_config_byte(I801_dev, SMBHSTCFG, &hostc);
266                         pci_write_config_byte(I801_dev, SMBHSTCFG,
267                                               hostc | SMBHSTCFG_I2C_EN);
268                 } else {
269                         dev_err(&I801_dev->dev,
270                                 "I2C_SMBUS_I2C_BLOCK_READ not DB!\n");
271                         return -1;
272                 }
273         }
274
275         if (read_write == I2C_SMBUS_WRITE) {
276                 len = data->block[0];
277                 if (len < 1)
278                         len = 1;
279                 if (len > 32)
280                         len = 32;
281                 outb_p(len, SMBHSTDAT0);
282                 outb_p(data->block[1], SMBBLKDAT);
283         } else {
284                 len = 32;       /* max for reads */
285         }
286
287         if(isich4 && command != I2C_SMBUS_I2C_BLOCK_DATA) {
288                 /* set 32 byte buffer */
289         }
290
291         for (i = 1; i <= len; i++) {
292                 if (i == len && read_write == I2C_SMBUS_READ)
293                         smbcmd = I801_BLOCK_LAST;
294                 else
295                         smbcmd = I801_BLOCK_DATA;
296                 outb_p(smbcmd | ENABLE_INT9, SMBHSTCNT);
297
298                 dev_dbg(&I801_dev->dev, "Block (pre %d): CNT=%02x, CMD=%02x, "
299                         "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
300                         inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
301                         inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
302
303                 /* Make sure the SMBus host is ready to start transmitting */
304                 temp = inb_p(SMBHSTSTS);
305                 if (i == 1) {
306                         /* Erronenous conditions before transaction: 
307                          * Byte_Done, Failed, Bus_Err, Dev_Err, Intr, Host_Busy */
308                         errmask=0x9f; 
309                 } else {
310                         /* Erronenous conditions during transaction: 
311                          * Failed, Bus_Err, Dev_Err, Intr */
312                         errmask=0x1e; 
313                 }
314                 if (temp & errmask) {
315                         dev_dbg(&I801_dev->dev, "SMBus busy (%02x). "
316                                 "Resetting...\n", temp);
317                         outb_p(temp, SMBHSTSTS);
318                         if (((temp = inb_p(SMBHSTSTS)) & errmask) != 0x00) {
319                                 dev_err(&I801_dev->dev,
320                                         "Reset failed! (%02x)\n", temp);
321                                 result = -1;
322                                 goto END;
323                         }
324                         if (i != 1) {
325                                 /* if die in middle of block transaction, fail */
326                                 result = -1;
327                                 goto END;
328                         }
329                 }
330
331                 if (i == 1)
332                         outb_p(inb(SMBHSTCNT) | I801_START, SMBHSTCNT);
333
334                 /* We will always wait for a fraction of a second! */
335                 timeout = 0;
336                 do {
337                         temp = inb_p(SMBHSTSTS);
338                         msleep(1);
339                 }
340                     while ((!(temp & 0x80))
341                            && (timeout++ < MAX_TIMEOUT));
342
343                 /* If the SMBus is still busy, we give up */
344                 if (timeout >= MAX_TIMEOUT) {
345                         result = -1;
346                         dev_dbg(&I801_dev->dev, "SMBus Timeout!\n");
347                 }
348
349                 if (temp & 0x10) {
350                         result = -1;
351                         dev_dbg(&I801_dev->dev,
352                                 "Error: Failed bus transaction\n");
353                 } else if (temp & 0x08) {
354                         result = -1;
355                         dev_err(&I801_dev->dev, "Bus collision!\n");
356                 } else if (temp & 0x04) {
357                         result = -1;
358                         dev_dbg(&I801_dev->dev, "Error: no response!\n");
359                 }
360
361                 if (i == 1 && read_write == I2C_SMBUS_READ) {
362                         len = inb_p(SMBHSTDAT0);
363                         if (len < 1)
364                                 len = 1;
365                         if (len > 32)
366                                 len = 32;
367                         data->block[0] = len;
368                 }
369
370                 /* Retrieve/store value in SMBBLKDAT */
371                 if (read_write == I2C_SMBUS_READ)
372                         data->block[i] = inb_p(SMBBLKDAT);
373                 if (read_write == I2C_SMBUS_WRITE && i+1 <= len)
374                         outb_p(data->block[i+1], SMBBLKDAT);
375                 if ((temp & 0x9e) != 0x00)
376                         outb_p(temp, SMBHSTSTS);  /* signals SMBBLKDAT ready */
377
378                 if ((temp = (0x1e & inb_p(SMBHSTSTS))) != 0x00) {
379                         dev_dbg(&I801_dev->dev,
380                                 "Bad status (%02x) at end of transaction\n",
381                                 temp);
382                 }
383                 dev_dbg(&I801_dev->dev, "Block (post %d): CNT=%02x, CMD=%02x, "
384                         "ADD=%02x, DAT0=%02x, BLKDAT=%02x\n", i,
385                         inb_p(SMBHSTCNT), inb_p(SMBHSTCMD), inb_p(SMBHSTADD),
386                         inb_p(SMBHSTDAT0), inb_p(SMBBLKDAT));
387
388                 if (result < 0)
389                         goto END;
390         }
391
392         if (hwpec) {
393                 /* wait for INTR bit as advised by Intel */
394                 timeout = 0;
395                 do {
396                         temp = inb_p(SMBHSTSTS);
397                         msleep(1);
398                 } while ((!(temp & 0x02))
399                            && (timeout++ < MAX_TIMEOUT));
400
401                 if (timeout >= MAX_TIMEOUT) {
402                         dev_dbg(&I801_dev->dev, "PEC Timeout!\n");
403                 }
404                 outb_p(temp, SMBHSTSTS); 
405         }
406         result = 0;
407 END:
408         if (command == I2C_SMBUS_I2C_BLOCK_DATA) {
409                 /* restore saved configuration register value */
410                 pci_write_config_byte(I801_dev, SMBHSTCFG, hostc);
411         }
412         return result;
413 }
414
415 /* Return -1 on error. */
416 static s32 i801_access(struct i2c_adapter * adap, u16 addr,
417                        unsigned short flags, char read_write, u8 command,
418                        int size, union i2c_smbus_data * data)
419 {
420         int hwpec;
421         int block = 0;
422         int ret, xact = 0;
423
424         hwpec = isich4 && (flags & I2C_CLIENT_PEC)
425                 && size != I2C_SMBUS_QUICK
426                 && size != I2C_SMBUS_I2C_BLOCK_DATA;
427
428         switch (size) {
429         case I2C_SMBUS_QUICK:
430                 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
431                        SMBHSTADD);
432                 xact = I801_QUICK;
433                 break;
434         case I2C_SMBUS_BYTE:
435                 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
436                        SMBHSTADD);
437                 if (read_write == I2C_SMBUS_WRITE)
438                         outb_p(command, SMBHSTCMD);
439                 xact = I801_BYTE;
440                 break;
441         case I2C_SMBUS_BYTE_DATA:
442                 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
443                        SMBHSTADD);
444                 outb_p(command, SMBHSTCMD);
445                 if (read_write == I2C_SMBUS_WRITE)
446                         outb_p(data->byte, SMBHSTDAT0);
447                 xact = I801_BYTE_DATA;
448                 break;
449         case I2C_SMBUS_WORD_DATA:
450                 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
451                        SMBHSTADD);
452                 outb_p(command, SMBHSTCMD);
453                 if (read_write == I2C_SMBUS_WRITE) {
454                         outb_p(data->word & 0xff, SMBHSTDAT0);
455                         outb_p((data->word & 0xff00) >> 8, SMBHSTDAT1);
456                 }
457                 xact = I801_WORD_DATA;
458                 break;
459         case I2C_SMBUS_BLOCK_DATA:
460         case I2C_SMBUS_I2C_BLOCK_DATA:
461                 outb_p(((addr & 0x7f) << 1) | (read_write & 0x01),
462                        SMBHSTADD);
463                 outb_p(command, SMBHSTCMD);
464                 block = 1;
465                 break;
466         case I2C_SMBUS_PROC_CALL:
467         default:
468                 dev_err(&I801_dev->dev, "Unsupported transaction %d\n", size);
469                 return -1;
470         }
471
472         outb_p(hwpec, SMBAUXCTL);       /* enable/disable hardware PEC */
473
474         if(block)
475                 ret = i801_block_transaction(data, read_write, size, hwpec);
476         else {
477                 outb_p(xact | ENABLE_INT9, SMBHSTCNT);
478                 ret = i801_transaction();
479         }
480
481         /* Some BIOSes don't like it when PEC is enabled at reboot or resume
482            time, so we forcibly disable it after every transaction. */
483         if (hwpec)
484                 outb_p(0, SMBAUXCTL);
485
486         if(block)
487                 return ret;
488         if(ret)
489                 return -1;
490         if ((read_write == I2C_SMBUS_WRITE) || (xact == I801_QUICK))
491                 return 0;
492
493         switch (xact & 0x7f) {
494         case I801_BYTE: /* Result put in SMBHSTDAT0 */
495         case I801_BYTE_DATA:
496                 data->byte = inb_p(SMBHSTDAT0);
497                 break;
498         case I801_WORD_DATA:
499                 data->word = inb_p(SMBHSTDAT0) + (inb_p(SMBHSTDAT1) << 8);
500                 break;
501         }
502         return 0;
503 }
504
505
506 static u32 i801_func(struct i2c_adapter *adapter)
507 {
508         return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
509             I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
510             I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_WRITE_I2C_BLOCK
511              | (isich4 ? I2C_FUNC_SMBUS_HWPEC_CALC : 0);
512 }
513
514 static struct i2c_algorithm smbus_algorithm = {
515         .smbus_xfer     = i801_access,
516         .functionality  = i801_func,
517 };
518
519 static struct i2c_adapter i801_adapter = {
520         .owner          = THIS_MODULE,
521         .class          = I2C_CLASS_HWMON,
522         .algo           = &smbus_algorithm,
523 };
524
525 static struct pci_device_id i801_ids[] = {
526         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) },
527         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) },
528         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) },
529         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_3) },
530         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_3) },
531         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_3) },
532         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_4) },
533         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_16) },
534         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_17) },
535         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB2_17) },
536         { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_5) },
537         { 0, }
538 };
539
540 MODULE_DEVICE_TABLE (pci, i801_ids);
541
542 static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
543 {
544
545         if (i801_setup(dev)) {
546                 dev_warn(&dev->dev,
547                         "I801 not detected, module not inserted.\n");
548                 return -ENODEV;
549         }
550
551         /* set up the driverfs linkage to our parent device */
552         i801_adapter.dev.parent = &dev->dev;
553
554         snprintf(i801_adapter.name, I2C_NAME_SIZE,
555                 "SMBus I801 adapter at %04x", i801_smba);
556         return i2c_add_adapter(&i801_adapter);
557 }
558
559 static void __devexit i801_remove(struct pci_dev *dev)
560 {
561         i2c_del_adapter(&i801_adapter);
562         release_region(i801_smba, (isich4 ? 16 : 8));
563 }
564
565 static struct pci_driver i801_driver = {
566         .name           = "i801_smbus",
567         .id_table       = i801_ids,
568         .probe          = i801_probe,
569         .remove         = __devexit_p(i801_remove),
570 };
571
572 static int __init i2c_i801_init(void)
573 {
574         return pci_register_driver(&i801_driver);
575 }
576
577 static void __exit i2c_i801_exit(void)
578 {
579         pci_unregister_driver(&i801_driver);
580 }
581
582 MODULE_AUTHOR ("Frodo Looijaard <frodol@dds.nl>, "
583                 "Philip Edelbrock <phil@netroedge.com>, "
584                 "and Mark D. Studebaker <mdsxyz123@yahoo.com>");
585 MODULE_DESCRIPTION("I801 SMBus driver");
586 MODULE_LICENSE("GPL");
587
588 module_init(i2c_i801_init);
589 module_exit(i2c_i801_exit);