diff options
author | Len Brown <len.brown@intel.com> | 2007-02-03 01:14:35 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2007-02-03 01:14:35 -0500 |
commit | 975a8e3ed2b9eab9f062a1e0ba7fe180e15204e1 (patch) | |
tree | 59b654df0b066b6d6b8ea16f5ae581b8fb45c1d5 /drivers/acpi/pci_root.c | |
parent | 1fcb71b84b05ff3bfd5b5b2eca9a9b3d13a76e3a (diff) | |
parent | bfd80223d73f80e1d1c69dace9151756b3ef3b49 (diff) |
Pull sysfs into test branch
Conflicts:
Documentation/feature-removal-schedule.txt
include/acpi/acpi_drivers.h
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/pci_root.c')
-rw-r--r-- | drivers/acpi/pci_root.c | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 1f06229040ac..4ecf701687e8 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -165,6 +165,21 @@ static acpi_status try_get_root_bridge_busnr(acpi_handle handle, int *busnum) return AE_OK; } +static void acpi_pci_bridge_scan(struct acpi_device *device) +{ + int status; + struct acpi_device *child = NULL; + + if (device->flags.bus_address) + if (device->parent && device->parent->ops.bind) { + status = device->parent->ops.bind(device); + if (!status) { + list_for_each_entry(child, &device->children, node) + acpi_pci_bridge_scan(child); + } + } +} + static int acpi_pci_root_add(struct acpi_device *device) { int result = 0; @@ -173,6 +188,7 @@ static int acpi_pci_root_add(struct acpi_device *device) acpi_status status = AE_OK; unsigned long value = 0; acpi_handle handle = NULL; + struct acpi_device *child; if (!device) @@ -188,9 +204,6 @@ static int acpi_pci_root_add(struct acpi_device *device) strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS); acpi_driver_data(device) = root; - /* - * TBD: Doesn't the bus driver automatically set this? - */ device->ops.bind = acpi_pci_bind; /* @@ -312,6 +325,12 @@ static int acpi_pci_root_add(struct acpi_device *device) result = acpi_pci_irq_add_prt(device->handle, root->id.segment, root->id.bus); + /* + * Scan and bind all _ADR-Based Devices + */ + list_for_each_entry(child, &device->children, node) + acpi_pci_bridge_scan(child); + end: if (result) { if (!list_empty(&root->node)) |