Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

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