diff options
Diffstat (limited to 'drivers/acpi/pci_bind.c')
| -rw-r--r-- | drivers/acpi/pci_bind.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/drivers/acpi/pci_bind.c b/drivers/acpi/pci_bind.c index 95650f83ce2e..bc46de3d967f 100644 --- a/drivers/acpi/pci_bind.c +++ b/drivers/acpi/pci_bind.c | |||
| @@ -116,9 +116,6 @@ int acpi_pci_bind(struct acpi_device *device) | |||
| 116 | struct acpi_pci_data *pdata; | 116 | struct acpi_pci_data *pdata; |
| 117 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; | 117 | struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; |
| 118 | acpi_handle handle; | 118 | acpi_handle handle; |
| 119 | struct pci_dev *dev; | ||
| 120 | struct pci_bus *bus; | ||
| 121 | |||
| 122 | 119 | ||
| 123 | if (!device || !device->parent) | 120 | if (!device || !device->parent) |
| 124 | return -EINVAL; | 121 | return -EINVAL; |
| @@ -176,20 +173,9 @@ int acpi_pci_bind(struct acpi_device *device) | |||
| 176 | * Locate matching device in PCI namespace. If it doesn't exist | 173 | * Locate matching device in PCI namespace. If it doesn't exist |
| 177 | * this typically means that the device isn't currently inserted | 174 | * this typically means that the device isn't currently inserted |
| 178 | * (e.g. docking station, port replicator, etc.). | 175 | * (e.g. docking station, port replicator, etc.). |
| 179 | * We cannot simply search the global pci device list, since | ||
| 180 | * PCI devices are added to the global pci list when the root | ||
| 181 | * bridge start ops are run, which may not have happened yet. | ||
| 182 | */ | 176 | */ |
| 183 | bus = pci_find_bus(data->id.segment, data->id.bus); | 177 | data->dev = pci_get_slot(pdata->bus, |
| 184 | if (bus) { | 178 | PCI_DEVFN(data->id.device, data->id.function)); |
| 185 | list_for_each_entry(dev, &bus->devices, bus_list) { | ||
| 186 | if (dev->devfn == PCI_DEVFN(data->id.device, | ||
| 187 | data->id.function)) { | ||
| 188 | data->dev = dev; | ||
| 189 | break; | ||
| 190 | } | ||
| 191 | } | ||
| 192 | } | ||
| 193 | if (!data->dev) { | 179 | if (!data->dev) { |
| 194 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 180 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 195 | "Device %04x:%02x:%02x.%d not present in PCI namespace\n", | 181 | "Device %04x:%02x:%02x.%d not present in PCI namespace\n", |
| @@ -259,9 +245,10 @@ int acpi_pci_bind(struct acpi_device *device) | |||
| 259 | 245 | ||
| 260 | end: | 246 | end: |
| 261 | kfree(buffer.pointer); | 247 | kfree(buffer.pointer); |
| 262 | if (result) | 248 | if (result) { |
| 249 | pci_dev_put(data->dev); | ||
| 263 | kfree(data); | 250 | kfree(data); |
| 264 | 251 | } | |
| 265 | return result; | 252 | return result; |
| 266 | } | 253 | } |
| 267 | 254 | ||
| @@ -303,6 +290,7 @@ static int acpi_pci_unbind(struct acpi_device *device) | |||
| 303 | if (data->dev->subordinate) { | 290 | if (data->dev->subordinate) { |
| 304 | acpi_pci_irq_del_prt(data->id.segment, data->bus->number); | 291 | acpi_pci_irq_del_prt(data->id.segment, data->bus->number); |
| 305 | } | 292 | } |
| 293 | pci_dev_put(data->dev); | ||
| 306 | kfree(data); | 294 | kfree(data); |
| 307 | 295 | ||
| 308 | end: | 296 | end: |
