ACPI: Change the ordering of PCI root bridge driver registrarion
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 20 Dec 2012 23:36:40 +0000 (00:36 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 3 Jan 2013 12:09:37 +0000 (13:09 +0100)
Instead of running acpi_pci_root_init() from a separate subsys
initcall, call it directly from acpi_scan_init() before scanning the
ACPI namespace for the first time, so that the PCI root bridge
driver's .add() routine, acpi_pci_root_start(), is always run
before binding ACPI drivers or attaching "companion" device objects
to struct acpi_device objects below the root bridge's device node in
the ACPI namespace.

The first, simpler reason for doing this is that it makes the
situation during boot more similar to the situation during hotplug,
in which the ACPI PCI root bridge driver is always present.

The second reason is that acpi_pci_root_init() causes struct pci_dev
objects to be created for all PCI devices below the bridge and
these objects may be necessary for whatever is done with the other
ACPI device nodes in that namespace scope.  For example, devices
created by acpi_create_platform_device() sometimes may need to be
added to the device hierarchy as children of PCI bridges.  For this
purpose, however, the struct pci_dev objects representing those
bridges need to exist before the platform devices in question are
registered.

Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
Acked-by: Toshi Kani <toshi.kani@hp.com>
drivers/acpi/internal.h
drivers/acpi/pci_root.c
drivers/acpi/scan.c

index 3c407cdc1ec1ce95acd5b6ce071e41f12d2344d2..e050254ae143cde4cf96d828edf43ab4ab851089 100644 (file)
@@ -67,6 +67,7 @@ struct acpi_ec {
 
 extern struct acpi_ec *first_ec;
 
+int acpi_pci_root_init(void);
 int acpi_ec_init(void);
 int acpi_ec_ecdt_probe(void);
 int acpi_boot_ec_enable(void);
index 7928d4dc705618a833ccce3172ed5113307d4cff..a233fe93dfac2b74c878f14f0179f1c2cd349da5 100644 (file)
@@ -699,7 +699,7 @@ static int acpi_pci_root_remove(struct acpi_device *device, int type)
        return 0;
 }
 
-static int __init acpi_pci_root_init(void)
+int __init acpi_pci_root_init(void)
 {
        acpi_hest_init();
 
@@ -712,5 +712,3 @@ static int __init acpi_pci_root_init(void)
 
        return 0;
 }
-
-subsys_initcall(acpi_pci_root_init);
index 726f0d1ace4b3e90a3d348bdacfaf54500643f4c..a7e81ac2cd0cbbb9aa81d5c83643d0f0088c13fa 100644 (file)
@@ -1831,6 +1831,7 @@ int __init acpi_scan_init(void)
        }
 
        acpi_power_init();
+       acpi_pci_root_init();
 
        /*
         * Enumerate devices in the ACPI namespace.