diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2009-08-29 11:47:33 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2010-02-19 19:12:33 -0500 |
commit | ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3 (patch) | |
tree | d1d96406b6bfcfb93fcc71ea825c7f5c53cf9f06 /arch | |
parent | b72d0db9dd41da1f2ec6274b03e8909583c64e41 (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.h | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/x86_init.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/visws_quirks.c | 1 | ||||
-rw-r--r-- | arch/x86/kernel/x86_init.c | 1 | ||||
-rw-r--r-- | arch/x86/pci/acpi.c | 1 | ||||
-rw-r--r-- | arch/x86/pci/irq.c | 12 | ||||
-rw-r--r-- | arch/x86/pci/legacy.c | 2 |
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 */ |
112 | extern int __init pci_acpi_init(void); | 112 | extern int __init pci_acpi_init(void); |
113 | extern int __init pcibios_irq_init(void); | 113 | extern void __init pcibios_irq_init(void); |
114 | extern int __init pcibios_init(void); | 114 | extern int __init pcibios_init(void); |
115 | extern int pci_legacy_init(void); | 115 | extern 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 | */ |
105 | struct x86_init_pci { | 106 | struct 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 | ||
56 | int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL; | 56 | int (*pcibios_enable_irq)(struct pci_dev *dev) = pirq_enable_irq; |
57 | void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL; | 57 | void (*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 | ||
1113 | int __init pcibios_irq_init(void) | 1113 | void __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 | ||
1164 | static void pirq_penalize_isa_irq(int irq, int active) | 1160 | static 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; |