diff options
Diffstat (limited to 'drivers/i2c/busses')
-rw-r--r-- | drivers/i2c/busses/i2c-i801.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index b9e6fac8142d..94a30f5de776 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
@@ -66,7 +66,7 @@ | |||
66 | #define SMBAUXCTL (13 + i801_smba) /* ICH4 only */ | 66 | #define SMBAUXCTL (13 + i801_smba) /* ICH4 only */ |
67 | 67 | ||
68 | /* PCI Address Constants */ | 68 | /* PCI Address Constants */ |
69 | #define SMBBA 0x020 | 69 | #define SMBBAR 4 |
70 | #define SMBHSTCFG 0x040 | 70 | #define SMBHSTCFG 0x040 |
71 | #define SMBREV 0x008 | 71 | #define SMBREV 0x008 |
72 | 72 | ||
@@ -97,7 +97,7 @@ static int i801_transaction(void); | |||
97 | static int i801_block_transaction(union i2c_smbus_data *data, char read_write, | 97 | static int i801_block_transaction(union i2c_smbus_data *data, char read_write, |
98 | int command, int hwpec); | 98 | int command, int hwpec); |
99 | 99 | ||
100 | static unsigned short i801_smba; | 100 | static unsigned long i801_smba; |
101 | static struct pci_driver i801_driver; | 101 | static struct pci_driver i801_driver; |
102 | static struct pci_dev *I801_dev; | 102 | static struct pci_dev *I801_dev; |
103 | static int isich4; | 103 | static int isich4; |
@@ -105,6 +105,7 @@ static int isich4; | |||
105 | static int __devinit i801_setup(struct pci_dev *dev) | 105 | static int __devinit i801_setup(struct pci_dev *dev) |
106 | { | 106 | { |
107 | unsigned char temp; | 107 | unsigned char temp; |
108 | int err; | ||
108 | 109 | ||
109 | I801_dev = dev; | 110 | I801_dev = dev; |
110 | if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) || | 111 | if ((dev->device == PCI_DEVICE_ID_INTEL_82801DB_3) || |
@@ -114,19 +115,28 @@ static int __devinit i801_setup(struct pci_dev *dev) | |||
114 | else | 115 | else |
115 | isich4 = 0; | 116 | isich4 = 0; |
116 | 117 | ||
118 | err = pci_enable_device(dev); | ||
119 | if (err) { | ||
120 | dev_err(&dev->dev, "Failed to enable SMBus device (%d)\n", | ||
121 | err); | ||
122 | goto exit; | ||
123 | } | ||
124 | |||
117 | /* Determine the address of the SMBus area */ | 125 | /* Determine the address of the SMBus area */ |
118 | pci_read_config_word(I801_dev, SMBBA, &i801_smba); | 126 | i801_smba = pci_resource_start(dev, SMBBAR); |
119 | i801_smba &= 0xfff0; | ||
120 | if (!i801_smba) { | 127 | if (!i801_smba) { |
121 | dev_err(&dev->dev, "SMBus base address uninitialized, " | 128 | dev_err(&dev->dev, "SMBus base address uninitialized, " |
122 | "upgrade BIOS\n"); | 129 | "upgrade BIOS\n"); |
123 | return -ENODEV; | 130 | err = -ENODEV; |
131 | goto exit_disable; | ||
124 | } | 132 | } |
125 | 133 | ||
126 | if (!request_region(i801_smba, (isich4 ? 16 : 8), i801_driver.name)) { | 134 | err = pci_request_region(dev, SMBBAR, i801_driver.name); |
127 | dev_err(&dev->dev, "I801_smb region 0x%x already in use!\n", | 135 | if (err) { |
128 | i801_smba); | 136 | dev_err(&dev->dev, "Failed to request SMBus region " |
129 | return -EBUSY; | 137 | "0x%lx-0x%lx\n", i801_smba, |
138 | pci_resource_end(dev, SMBBAR)); | ||
139 | goto exit_disable; | ||
130 | } | 140 | } |
131 | 141 | ||
132 | pci_read_config_byte(I801_dev, SMBHSTCFG, &temp); | 142 | pci_read_config_byte(I801_dev, SMBHSTCFG, &temp); |
@@ -147,6 +157,11 @@ static int __devinit i801_setup(struct pci_dev *dev) | |||
147 | dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba); | 157 | dev_dbg(&dev->dev, "I801_smba = 0x%X\n", i801_smba); |
148 | 158 | ||
149 | return 0; | 159 | return 0; |
160 | |||
161 | exit_disable: | ||
162 | pci_disable_device(dev); | ||
163 | exit: | ||
164 | return err; | ||
150 | } | 165 | } |
151 | 166 | ||
152 | static int i801_transaction(void) | 167 | static int i801_transaction(void) |
@@ -521,14 +536,15 @@ static int __devinit i801_probe(struct pci_dev *dev, const struct pci_device_id | |||
521 | i801_adapter.dev.parent = &dev->dev; | 536 | i801_adapter.dev.parent = &dev->dev; |
522 | 537 | ||
523 | snprintf(i801_adapter.name, I2C_NAME_SIZE, | 538 | snprintf(i801_adapter.name, I2C_NAME_SIZE, |
524 | "SMBus I801 adapter at %04x", i801_smba); | 539 | "SMBus I801 adapter at %04lx", i801_smba); |
525 | return i2c_add_adapter(&i801_adapter); | 540 | return i2c_add_adapter(&i801_adapter); |
526 | } | 541 | } |
527 | 542 | ||
528 | static void __devexit i801_remove(struct pci_dev *dev) | 543 | static void __devexit i801_remove(struct pci_dev *dev) |
529 | { | 544 | { |
530 | i2c_del_adapter(&i801_adapter); | 545 | i2c_del_adapter(&i801_adapter); |
531 | release_region(i801_smba, (isich4 ? 16 : 8)); | 546 | pci_release_region(dev, SMBBAR); |
547 | pci_disable_device(dev); | ||
532 | } | 548 | } |
533 | 549 | ||
534 | static struct pci_driver i801_driver = { | 550 | static struct pci_driver i801_driver = { |