x86/pci: removing subsys_initcall ordering dependencies
authorRobert Richter <robert.richter@amd.com>
Wed, 2 Jul 2008 20:50:29 +0000 (22:50 +0200)
committerIngo Molnar <mingo@elte.hu>
Wed, 9 Jul 2008 09:45:03 +0000 (11:45 +0200)
So far subsys_initcalls has been executed in this order depending on
the object order in the Makefile:

arch/x86/pci/visws.c:subsys_initcall(pcibios_init);
arch/x86/pci/numa.c:subsys_initcall(pci_numa_init);
arch/x86/pci/acpi.c:subsys_initcall(pci_acpi_init);
arch/x86/pci/legacy.c:subsys_initcall(pci_legacy_init);
arch/x86/pci/irq.c:subsys_initcall(pcibios_irq_init);
arch/x86/pci/common.c:subsys_initcall(pcibios_init);

This patch removes the ordering dependency. There is now only one
subsys_initcall function that contains subsystem initialization code
with a defined order.

Signed-off-by: Robert Richter <robert.richter@amd.com>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/pci/Makefile
arch/x86/pci/acpi.c
arch/x86/pci/common.c
arch/x86/pci/init.c
arch/x86/pci/irq.c
arch/x86/pci/legacy.c
arch/x86/pci/numa.c
arch/x86/pci/pci.h
arch/x86/pci/visws.c

index 1ba1236094a4dabd8580695fdee6fce2f2f2ec99..99d9f095e4d4e0767fba700618faf60a19eb936a 100644 (file)
@@ -6,10 +6,6 @@ obj-$(CONFIG_PCI_DIRECT)       += direct.o
 obj-$(CONFIG_PCI_OLPC)         += olpc.o
 
 pci-y                          := fixup.o
-
-# Do not change the ordering here. There is a nasty init function
-# ordering dependency which breaks when you move acpi.o below
-# legacy/irq.o
 pci-$(CONFIG_ACPI)             += acpi.o
 pci-y                          += legacy.o irq.o
 
index 4fa52d3dc848fb4fa1ec442c6ecc9c5b2959f954..19af06927fbceeb59c7aeb2ca9b7b71248225a4a 100644 (file)
@@ -223,7 +223,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do
        return bus;
 }
 
-static int __init pci_acpi_init(void)
+int __init pci_acpi_init(void)
 {
        struct pci_dev *dev = NULL;
 
@@ -257,4 +257,3 @@ static int __init pci_acpi_init(void)
 
        return 0;
 }
-subsys_initcall(pci_acpi_init);
index 6e64aaf00d1dd9473fff8cfd0e6e09074a31443c..20b9f59f95df85203009cce11d688f2510cbeab3 100644 (file)
@@ -384,7 +384,7 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum)
 
 extern u8 pci_cache_line_size;
 
-static int __init pcibios_init(void)
+int __init pcibios_init(void)
 {
        struct cpuinfo_x86 *c = &boot_cpu_data;
 
@@ -411,8 +411,6 @@ static int __init pcibios_init(void)
        return 0;
 }
 
-subsys_initcall(pcibios_init);
-
 char * __devinit  pcibios_setup(char *str)
 {
        if (!strcmp(str, "off")) {
index b821f4462d991a6b850886bcd7a9997f14428d46..d6c950f818585aea6df65e38e18c2f85ab217941 100644 (file)
@@ -4,7 +4,7 @@
 
 /* arch_initcall has too random ordering, so call the initializers
    in the right sequence from here. */
-static __init int pci_access_init(void)
+static __init int pci_arch_init(void)
 {
 #ifdef CONFIG_PCI_DIRECT
        int type = 0;
@@ -40,4 +40,4 @@ static __init int pci_access_init(void)
 
        return 0;
 }
-arch_initcall(pci_access_init);
+arch_initcall(pci_arch_init);
index f0859de23e20b47c21b0f620a37a2afa37188086..dc568c6b83f8b5a5203bc0452c06427ae9b97b2a 100644 (file)
@@ -1107,7 +1107,7 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = {
        { }
 };
 
-static int __init pcibios_irq_init(void)
+int __init pcibios_irq_init(void)
 {
        DBG(KERN_DEBUG "PCI: IRQ init\n");
 
@@ -1142,9 +1142,6 @@ static int __init pcibios_irq_init(void)
        return 0;
 }
 
-subsys_initcall(pcibios_irq_init);
-
-
 static void pirq_penalize_isa_irq(int irq, int active)
 {
        /*
index a67921ce60af1faabf9c8ccbf538b546103ebb04..3c1d795cbbe9286f4567f868e5a2d07345cbcd0f 100644 (file)
@@ -55,4 +55,13 @@ static int __init pci_legacy_init(void)
        return 0;
 }
 
-subsys_initcall(pci_legacy_init);
+int __init pci_subsys_init(void)
+{
+#ifdef CONFIG_ACPI
+       pci_acpi_init();
+#endif
+       pci_legacy_init();
+       pcibios_irq_init();
+       pcibios_init();
+}
+subsys_initcall(pci_subsys_init);
index 99f1ecd485b5d2a228222b4f05915064b3bcd43c..e1620dc8649afdf84a0a0505e0b3925c42c720f7 100644 (file)
@@ -177,4 +177,10 @@ static int __init pci_numa_init(void)
        return 0;
 }
 
-subsys_initcall(pci_numa_init);
+static __init int pci_subsys_init(void)
+{
+       pci_numa_init();
+       pcibios_irq_init();
+       pcibios_init();
+}
+subsys_initcall(pci_subsys_init);
index ba263e626a68762bf4e4c470fe325fa01c4f45ee..58241748470f0e673d73b37444e670bff5f8383e 100644 (file)
@@ -39,9 +39,6 @@ enum pci_bf_sort_state {
        pci_dmi_bf,
 };
 
-extern void __init dmi_check_pciprobe(void);
-extern void __init dmi_check_skip_isa_align(void);
-
 /* pci-i386.c */
 
 extern unsigned int pcibios_max_latency;
@@ -99,10 +96,18 @@ extern struct pci_raw_ops *raw_pci_ext_ops;
 
 extern struct pci_raw_ops pci_direct_conf1;
 
+/* arch_initcall level */
 extern int pci_direct_probe(void);
 extern void pci_direct_init(int type);
 extern void pci_pcbios_init(void);
 extern int pci_olpc_init(void);
+extern void __init dmi_check_pciprobe(void);
+extern void __init dmi_check_skip_isa_align(void);
+
+/* some common used subsys_initcalls */
+extern int __init pci_acpi_init(void);
+extern int __init pcibios_irq_init(void);
+extern int __init pcibios_init(void);
 
 /* pci-mmconfig.c */
 
index c3dc9f26812cce622843c0e3fb3fdba93793c6da..16e52063ecb39ba2ec236a87dfb9bbbcd8483cda 100644 (file)
@@ -105,4 +105,9 @@ static int __init pci_visws_init(void)
        return 0;
 }
 
-subsys_initcall(pci_visws_init);
+static __init int pci_subsys_init(void)
+{
+       pci_visws_init();
+       pcibios_init();
+}
+subsys_initcall(pci_subsys_init);