aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2009-08-29 11:47:33 -0400
committerH. Peter Anvin <hpa@zytor.com>2010-02-19 19:12:33 -0500
commitab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3 (patch)
treed1d96406b6bfcfb93fcc71ea825c7f5c53cf9f06 /arch
parentb72d0db9dd41da1f2ec6274b03e8909583c64e41 (diff)
x86: Add pci_init_irq to x86_init
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>
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/include/asm/pci_x86.h4
-rw-r--r--arch/x86/include/asm/x86_init.h2
-rw-r--r--arch/x86/kernel/visws_quirks.c1
-rw-r--r--arch/x86/kernel/x86_init.c1
-rw-r--r--arch/x86/pci/acpi.c1
-rw-r--r--arch/x86/pci/irq.c12
-rw-r--r--arch/x86/pci/legacy.c2
7 files changed, 13 insertions, 10 deletions
diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h
index 440124f1224d..46511c5be456 100644
--- a/arch/x86/include/asm/pci_x86.h
+++ b/arch/x86/include/asm/pci_x86.h
@@ -110,7 +110,7 @@ extern void __init dmi_check_skip_isa_align(void);
110 110
111/* some common used subsys_initcalls */ 111/* some common used subsys_initcalls */
112extern int __init pci_acpi_init(void); 112extern int __init pci_acpi_init(void);
113extern int __init pcibios_irq_init(void); 113extern void __init pcibios_irq_init(void);
114extern int __init pcibios_init(void); 114extern int __init pcibios_init(void);
115extern int pci_legacy_init(void); 115extern int pci_legacy_init(void);
116 116
@@ -187,6 +187,8 @@ static inline void mmio_config_writel(void __iomem *pos, u32 val)
187# else 187# else
188# define x86_default_pci_init pci_legacy_init 188# define x86_default_pci_init pci_legacy_init
189# endif 189# endif
190# define x86_default_pci_init_irq pcibios_irq_init
190#else 191#else
191# define x86_default_pci_init NULL 192# define x86_default_pci_init NULL
193# define x86_default_pci_init_irq NULL
192#endif 194#endif
diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index f145d843f03d..34f61cd56f3b 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -101,9 +101,11 @@ struct x86_init_iommu {
101 /* 101 /*
102 * struct x86_init_pci - platform specific pci init functions 102 * struct x86_init_pci - platform specific pci init functions
103 * @init: platform specific pci init 103 * @init: platform specific pci init
104 * @init_irq: platform specific pci irq init
104 */ 105 */
105struct x86_init_pci { 106struct x86_init_pci {
106 int (*init)(void); 107 int (*init)(void);
108 void (*init_irq)(void);
107}; 109};
108 110
109/** 111/**
diff --git a/arch/x86/kernel/visws_quirks.c b/arch/x86/kernel/visws_quirks.c
index 843e9d30a1e3..b48ef6c0d716 100644
--- a/arch/x86/kernel/visws_quirks.c
+++ b/arch/x86/kernel/visws_quirks.c
@@ -238,6 +238,7 @@ void __init visws_early_detect(void)
238 x86_init.irqs.trap_init = visws_trap_init; 238 x86_init.irqs.trap_init = visws_trap_init;
239 x86_init.timers.timer_init = visws_time_init; 239 x86_init.timers.timer_init = visws_time_init;
240 x86_init.pci.init = pci_visws_init; 240 x86_init.pci.init = pci_visws_init;
241 x86_init.pci.init_irq = x86_init_noop;
241 242
242 /* 243 /*
243 * Install reboot quirks: 244 * Install reboot quirks:
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index 81faa6d67d69..203f26fb7f33 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -74,6 +74,7 @@ struct x86_init_ops x86_init __initdata = {
74 74
75 .pci = { 75 .pci = {
76 .init = x86_default_pci_init, 76 .init = x86_default_pci_init,
77 .init_irq = x86_default_pci_init_irq,
77 }, 78 },
78}; 79};
79 80
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 73b3fe9aa716..b53f0487e2d3 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -289,6 +289,7 @@ int __init pci_acpi_init(void)
289 acpi_irq_penalty_init(); 289 acpi_irq_penalty_init();
290 pcibios_enable_irq = acpi_pci_irq_enable; 290 pcibios_enable_irq = acpi_pci_irq_enable;
291 pcibios_disable_irq = acpi_pci_irq_disable; 291 pcibios_disable_irq = acpi_pci_irq_disable;
292 x86_init.pci.init_irq = x86_init_noop;
292 293
293 if (pci_routeirq) { 294 if (pci_routeirq) {
294 /* 295 /*
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
index 0696d506c4ad..0f40ff20dd67 100644
--- a/arch/x86/pci/irq.c
+++ b/arch/x86/pci/irq.c
@@ -53,7 +53,7 @@ struct irq_router_handler {
53 int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device); 53 int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device);
54}; 54};
55 55
56int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL; 56int (*pcibios_enable_irq)(struct pci_dev *dev) = pirq_enable_irq;
57void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL; 57void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL;
58 58
59/* 59/*
@@ -1110,12 +1110,12 @@ static struct dmi_system_id __initdata pciirq_dmi_table[] = {
1110 { } 1110 { }
1111}; 1111};
1112 1112
1113int __init pcibios_irq_init(void) 1113void __init pcibios_irq_init(void)
1114{ 1114{
1115 DBG(KERN_DEBUG "PCI: IRQ init\n"); 1115 DBG(KERN_DEBUG "PCI: IRQ init\n");
1116 1116
1117 if (pcibios_enable_irq || raw_pci_ops == NULL) 1117 if (raw_pci_ops == NULL)
1118 return 0; 1118 return;
1119 1119
1120 dmi_check_system(pciirq_dmi_table); 1120 dmi_check_system(pciirq_dmi_table);
1121 1121
@@ -1142,8 +1142,6 @@ int __init pcibios_irq_init(void)
1142 pirq_table = NULL; 1142 pirq_table = NULL;
1143 } 1143 }
1144 1144
1145 pcibios_enable_irq = pirq_enable_irq;
1146
1147 pcibios_fixup_irqs(); 1145 pcibios_fixup_irqs();
1148 1146
1149 if (io_apic_assign_pci_irqs && pci_routeirq) { 1147 if (io_apic_assign_pci_irqs && pci_routeirq) {
@@ -1157,8 +1155,6 @@ int __init pcibios_irq_init(void)
1157 for_each_pci_dev(dev) 1155 for_each_pci_dev(dev)
1158 pirq_enable_irq(dev); 1156 pirq_enable_irq(dev);
1159 } 1157 }
1160
1161 return 0;
1162} 1158}
1163 1159
1164static void pirq_penalize_isa_irq(int irq, int active) 1160static void pirq_penalize_isa_irq(int irq, int active)
diff --git a/arch/x86/pci/legacy.c b/arch/x86/pci/legacy.c
index 0daf264ddb6c..0db5eaf54560 100644
--- a/arch/x86/pci/legacy.c
+++ b/arch/x86/pci/legacy.c
@@ -60,7 +60,7 @@ int __init pci_subsys_init(void)
60 pci_legacy_init(); 60 pci_legacy_init();
61 61
62 pcibios_fixup_peer_bridges(); 62 pcibios_fixup_peer_bridges();
63 pcibios_irq_init(); 63 x86_init.pci.init_irq();
64 pcibios_init(); 64 pcibios_init();
65 65
66 return 0; 66 return 0;