Commit 48ff60a2 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

i2c: get i2c-piix4 driver to actually bind to a PCI device.

parent 66ba06f1
......@@ -49,18 +49,6 @@ struct sd {
const char *name;
};
/* Note: We assume all devices are identical
to the Intel PIIX4; we only mention it during detection. */
static struct sd supported[] = {
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, 3, "PIIX4"},
{PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_OSB4, 0, "OSB4"},
{PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5, 0, "CSB5"},
{PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3, 3, "440MX"},
{PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_3, 0, "Victory66"},
{0, 0, 0, NULL}
};
/* PIIX4 SMBus address offsets */
#define SMBHSTSTS (0 + piix4_smba)
#define SMBHSLVSTS (1 + piix4_smba)
......@@ -142,41 +130,16 @@ static int __init ibm_dmi_probe(void)
}
#endif
/* Detect whether a PIIX4 can be found, and initialize it, where necessary.
Note the differences between kernels with the old PCI BIOS interface and
newer kernels with the real PCI interface. In compat.h some things are
defined to make the transition easier. */
int piix4_setup(void)
static int piix4_setup(struct pci_dev *PIIX4_dev, const struct pci_device_id *id)
{
int error_return = 0;
unsigned char temp;
struct sd *num = supported;
struct pci_dev *PIIX4_dev = NULL;
if (pci_present() == 0) {
error_return = -ENODEV;
goto END;
}
/* Look for a supported device/function */
do {
if((PIIX4_dev = pci_find_device(num->mfr, num->dev,
PIIX4_dev))) {
if(PCI_FUNC(PIIX4_dev->devfn) != num->fn)
continue;
break;
}
PIIX4_dev = NULL;
num++;
} while (num->mfr);
/* match up the function */
if (PCI_FUNC(PIIX4_dev->devfn) != id->driver_data)
return -ENODEV;
if (PIIX4_dev == NULL) {
printk
(KERN_ERR "i2c-piix4.o: Error: Can't detect PIIX4 or compatible device!\n");
error_return = -ENODEV;
goto END;
}
printk(KERN_INFO "i2c-piix4.o: Found %s device\n", num->name);
printk(KERN_INFO "i2c-piix4.o: Found %s device\n", PIIX4_dev->dev.name);
#ifdef CONFIG_X86
if(ibm_dmi_probe()) {
......@@ -267,14 +230,14 @@ int piix4_setup(void)
/* Internally used pause function */
void piix4_do_pause(unsigned int amount)
static void piix4_do_pause(unsigned int amount)
{
current->state = TASK_INTERRUPTIBLE;
schedule_timeout(amount);
}
/* Another internally used function */
int piix4_transaction(void)
static int piix4_transaction(void)
{
int temp;
int result = 0;
......@@ -363,7 +326,7 @@ int piix4_transaction(void)
}
/* Return -1 on error. */
s32 piix4_access(struct i2c_adapter * adap, u16 addr,
static s32 piix4_access(struct i2c_adapter * adap, u16 addr,
unsigned short flags, char read_write,
u8 command, int size, union i2c_smbus_data * data)
{
......@@ -456,7 +419,7 @@ s32 piix4_access(struct i2c_adapter * adap, u16 addr,
}
u32 piix4_func(struct i2c_adapter *adapter)
static u32 piix4_func(struct i2c_adapter *adapter)
{
return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
......@@ -480,16 +443,58 @@ static struct i2c_adapter piix4_adapter = {
static struct pci_device_id piix4_ids[] __devinitdata = {
{
.vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82371AB_3,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = 3
},
{
.vendor = PCI_VENDOR_ID_SERVERWORKS,
.device = PCI_DEVICE_ID_SERVERWORKS_OSB4,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = 0,
},
{
.vendor = PCI_VENDOR_ID_SERVERWORKS,
.device = PCI_DEVICE_ID_SERVERWORKS_CSB5,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = 0,
},
{
.vendor = PCI_VENDOR_ID_INTEL,
.device = PCI_DEVICE_ID_INTEL_82443MX_3,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = 3,
},
{
.vendor = PCI_VENDOR_ID_EFAR,
.device = PCI_DEVICE_ID_EFAR_SLC90E66_3,
.subvendor = PCI_ANY_ID,
.subdevice = PCI_ANY_ID,
.driver_data = 0,
},
{ 0, }
};
static int __devinit piix4_probe(struct pci_dev *dev, const struct pci_device_id *id)
{
int retval;
retval = piix4_setup(dev, id);
if (retval)
return retval;
sprintf(piix4_adapter.name, "SMBus PIIX4 adapter at %04x",
piix4_smba);
i2c_add_adapter(&piix4_adapter);
retval = i2c_add_adapter(&piix4_adapter);
return retval;
}
static void __devexit piix4_remove(struct pci_dev *dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment