x86: Add pci_init_irq to x86_init
authorThomas Gleixner <tglx@linutronix.de>
Sat, 29 Aug 2009 15:47:33 +0000 (17:47 +0200)
committerH. Peter Anvin <hpa@zytor.com>
Sat, 20 Feb 2010 00:12:33 +0000 (16:12 -0800)
Moorestown wants to reuse pcibios_init_irq but needs to provide its
own implementation of pci_enable_irq. After we distangled the init we
can move the init_irq call to x86_init and remove the pci_enable_irq
!= NULL check in pcibios_init_irq. pci_enable_irq is compile time
initialized to pirq_enable_irq and the special cases which override it
(visws and acpi) set the x86_init function pointer to noop. That
allows MSRT to override pci_enable_irq and otherwise run
pcibios_init_irq unmodified.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
LKML-Reference: <43F901BD926A4E43B106BF17856F07559FB80CFF@orsmsx508.amr.corp.intel.com>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Jacob Pan <jacob.jun.pan@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/include/asm/pci_x86.h
arch/x86/include/asm/x86_init.h
arch/x86/kernel/visws_quirks.c
arch/x86/kernel/x86_init.c
arch/x86/pci/acpi.c
arch/x86/pci/irq.c
arch/x86/pci/legacy.c

index 440124f1224d0f248b86c0b533d149406ec9d02a..46511c5be4561d16a4bbb48f931656aab8ca6dbb 100644 (file)
@@ -110,7 +110,7 @@ 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 void __init pcibios_irq_init(void);
 extern int __init pcibios_init(void);
 extern int pci_legacy_init(void);
 
@@ -187,6 +187,8 @@ static inline void mmio_config_writel(void __iomem *pos, u32 val)
 # else
 #  define x86_default_pci_init         pci_legacy_init
 # endif
+# define x86_default_pci_init_irq      pcibios_irq_init
 #else
 # define x86_default_pci_init          NULL
+# define x86_default_pci_init_irq      NULL
 #endif
index f145d843f03db2ce797677b7f62847866e4af415..34f61cd56f3ba558dcc0ca6633b9fab5fe6bedb6 100644 (file)
@@ -101,9 +101,11 @@ struct x86_init_iommu {
  /*
   * struct x86_init_pci - platform specific pci init functions
  * @init:                      platform specific pci init
+ * @init_irq:                  platform specific pci irq init
  */
 struct x86_init_pci {
        int (*init)(void);
+       void (*init_irq)(void);
 };
 
 /**
index 843e9d30a1e3c64a169a5e9993369d10419d55e8..b48ef6c0d7162f9d0e0bf97935259d1704053531 100644 (file)
@@ -238,6 +238,7 @@ void __init visws_early_detect(void)
        x86_init.irqs.trap_init = visws_trap_init;
        x86_init.timers.timer_init = visws_time_init;
        x86_init.pci.init = pci_visws_init;
+       x86_init.pci.init_irq = x86_init_noop;
 
        /*
         * Install reboot quirks:
index 81faa6d67d69763132753d306bee9d677faf309e..203f26fb7f33a8ac56bc23d1d41ce3d5d2e88a60 100644 (file)
@@ -74,6 +74,7 @@ struct x86_init_ops x86_init __initdata = {
 
        .pci = {
                .init                   = x86_default_pci_init,
+               .init_irq               = x86_default_pci_init_irq,
        },
 };
 
index 73b3fe9aa716325a7c8e23b8d0db8fa806a88fa7..b53f0487e2d3ed8dd5554a2c340e31205e2b594a 100644 (file)
@@ -289,6 +289,7 @@ int __init pci_acpi_init(void)
        acpi_irq_penalty_init();
        pcibios_enable_irq = acpi_pci_irq_enable;
        pcibios_disable_irq = acpi_pci_irq_disable;
+       x86_init.pci.init_irq = x86_init_noop;
 
        if (pci_routeirq) {
                /*
index 0696d506c4ade99b0d43232128a77cea99d65ec8..0f40ff20dd67f8526b39257f6ac0fecd214dccf2 100644 (file)
@@ -53,7 +53,7 @@ struct irq_router_handler {
        int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device);
 };
 
-int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL;
+int (*pcibios_enable_irq)(struct pci_dev *dev) = pirq_enable_irq;
 void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL;
 
 /*
@@ -1110,12 +1110,12 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = {
        { }
 };
 
-int __init pcibios_irq_init(void)
+void __init pcibios_irq_init(void)
 {
        DBG(KERN_DEBUG "PCI: IRQ init\n");
 
-       if (pcibios_enable_irq || raw_pci_ops == NULL)
-               return 0;
+       if (raw_pci_ops == NULL)
+               return;
 
        dmi_check_system(pciirq_dmi_table);
 
@@ -1142,8 +1142,6 @@ int __init pcibios_irq_init(void)
                        pirq_table = NULL;
        }
 
-       pcibios_enable_irq = pirq_enable_irq;
-
        pcibios_fixup_irqs();
 
        if (io_apic_assign_pci_irqs && pci_routeirq) {
@@ -1157,8 +1155,6 @@ int __init pcibios_irq_init(void)
                for_each_pci_dev(dev)
                        pirq_enable_irq(dev);
        }
-
-       return 0;
 }
 
 static void pirq_penalize_isa_irq(int irq, int active)
index 0daf264ddb6ce613df0351cef5ad245e3e6387d0..0db5eaf54560b3ec1d8083ee8e69d8a1057a045c 100644 (file)
@@ -60,7 +60,7 @@ int __init pci_subsys_init(void)
                pci_legacy_init();
 
        pcibios_fixup_peer_bridges();
-       pcibios_irq_init();
+       x86_init.pci.init_irq();
        pcibios_init();
 
        return 0;