aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_bind.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/pci_bind.c')
-rw-r--r--drivers/acpi/pci_bind.c56
1 files changed, 52 insertions, 4 deletions
diff --git a/drivers/acpi/pci_bind.c b/drivers/acpi/pci_bind.c
index 1e2ae6e7a7e4..d83327468358 100644
--- a/drivers/acpi/pci_bind.c
+++ b/drivers/acpi/pci_bind.c
@@ -223,8 +223,6 @@ int acpi_pci_bind(struct acpi_device *device)
223 data->id.segment, data->id.bus, 223 data->id.segment, data->id.bus,
224 data->id.device, data->id.function)); 224 data->id.device, data->id.function));
225 data->bus = data->dev->subordinate; 225 data->bus = data->dev->subordinate;
226 device->ops.bind = acpi_pci_bind;
227 device->ops.unbind = acpi_pci_unbind;
228 } 226 }
229 227
230 /* 228 /*
@@ -354,8 +352,6 @@ acpi_pci_bind_root(struct acpi_device *device,
354 352
355 data->id = *id; 353 data->id = *id;
356 data->bus = bus; 354 data->bus = bus;
357 device->ops.bind = acpi_pci_bind;
358 device->ops.unbind = acpi_pci_unbind;
359 355
360 acpi_get_name(device->handle, ACPI_FULL_PATHNAME, &buffer); 356 acpi_get_name(device->handle, ACPI_FULL_PATHNAME, &buffer);
361 357
@@ -378,3 +374,55 @@ acpi_pci_bind_root(struct acpi_device *device,
378 374
379 return result; 375 return result;
380} 376}
377
378#define ACPI_PCI_BRIDGE_DRIVER_NAME "ACPI PCI Bridge Driver"
379
380static int acpi_pci_bridge_add(struct acpi_device *device);
381static int acpi_pci_bridge_remove(struct acpi_device *device, int type);
382static int acpi_pci_bridge_match(struct acpi_device *device,
383 struct acpi_driver *driver);
384static struct acpi_driver acpi_pci_bridge_driver = {
385 .name = ACPI_PCI_BRIDGE_DRIVER_NAME,
386 .ops = {
387 .add = acpi_pci_bridge_add,
388 .remove = acpi_pci_bridge_remove,
389 .match = acpi_pci_bridge_match,
390 },
391};
392
393static int acpi_pci_bridge_match(struct acpi_device *device,
394 struct acpi_driver *driver)
395{
396 acpi_status status;
397 acpi_handle handle;
398
399 /* pci bridge has _PRT but isn't PNP0A03 */
400 status = acpi_get_handle(device->handle, METHOD_NAME__PRT, &handle);
401 if (ACPI_FAILURE(status))
402 return -ENODEV;
403 if (!acpi_match_ids(device, "PNP0A03"))
404 return -ENODEV;
405 return 0;
406}
407
408static int acpi_pci_bridge_add(struct acpi_device *device)
409{
410 return acpi_pci_bind(device);
411}
412
413static int acpi_pci_bridge_remove(struct acpi_device *device, int type)
414{
415 return acpi_pci_unbind(device);
416}
417
418static int __init acpi_pci_bridge_init(void)
419{
420 if (acpi_pci_disabled)
421 return 0;
422 if (acpi_bus_register_driver(&acpi_pci_bridge_driver) < 0)
423 return -ENODEV;
424 return 0;
425}
426
427/* Should be called after ACPI pci root driver */
428subsys_initcall(acpi_pci_bridge_init);