diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-08-09 09:09:29 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-08-09 09:09:29 -0400 |
commit | 054d5c9238f3c577ad51195c3ee7803613f322cc (patch) | |
tree | ff7d9f5c0e0ddf14230ba28f28ef69a2c0a0debf /arch/powerpc/kernel/irq.c | |
parent | 11e4afb49b7fa1fc8e1ffd850c1806dd86a08204 (diff) | |
parent | 2192482ee5ce5d5d4a6cec0c351b2d3a744606eb (diff) |
Merge branch 'devel-stable' into devel
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r-- | arch/powerpc/kernel/irq.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 77be3d058a65..d3ce67cf03be 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -53,6 +53,8 @@ | |||
53 | #include <linux/bootmem.h> | 53 | #include <linux/bootmem.h> |
54 | #include <linux/pci.h> | 54 | #include <linux/pci.h> |
55 | #include <linux/debugfs.h> | 55 | #include <linux/debugfs.h> |
56 | #include <linux/of.h> | ||
57 | #include <linux/of_irq.h> | ||
56 | 58 | ||
57 | #include <asm/uaccess.h> | 59 | #include <asm/uaccess.h> |
58 | #include <asm/system.h> | 60 | #include <asm/system.h> |
@@ -64,6 +66,8 @@ | |||
64 | #include <asm/ptrace.h> | 66 | #include <asm/ptrace.h> |
65 | #include <asm/machdep.h> | 67 | #include <asm/machdep.h> |
66 | #include <asm/udbg.h> | 68 | #include <asm/udbg.h> |
69 | #include <asm/dbell.h> | ||
70 | |||
67 | #ifdef CONFIG_PPC64 | 71 | #ifdef CONFIG_PPC64 |
68 | #include <asm/paca.h> | 72 | #include <asm/paca.h> |
69 | #include <asm/firmware.h> | 73 | #include <asm/firmware.h> |
@@ -153,14 +157,28 @@ notrace void raw_local_irq_restore(unsigned long en) | |||
153 | if (get_hard_enabled()) | 157 | if (get_hard_enabled()) |
154 | return; | 158 | return; |
155 | 159 | ||
160 | #if defined(CONFIG_BOOKE) && defined(CONFIG_SMP) | ||
161 | /* Check for pending doorbell interrupts and resend to ourself */ | ||
162 | doorbell_check_self(); | ||
163 | #endif | ||
164 | |||
156 | /* | 165 | /* |
157 | * Need to hard-enable interrupts here. Since currently disabled, | 166 | * Need to hard-enable interrupts here. Since currently disabled, |
158 | * no need to take further asm precautions against preemption; but | 167 | * no need to take further asm precautions against preemption; but |
159 | * use local_paca instead of get_paca() to avoid preemption checking. | 168 | * use local_paca instead of get_paca() to avoid preemption checking. |
160 | */ | 169 | */ |
161 | local_paca->hard_enabled = en; | 170 | local_paca->hard_enabled = en; |
171 | |||
172 | #ifndef CONFIG_BOOKE | ||
173 | /* On server, re-trigger the decrementer if it went negative since | ||
174 | * some processors only trigger on edge transitions of the sign bit. | ||
175 | * | ||
176 | * BookE has a level sensitive decrementer (latches in TSR) so we | ||
177 | * don't need that | ||
178 | */ | ||
162 | if ((int)mfspr(SPRN_DEC) < 0) | 179 | if ((int)mfspr(SPRN_DEC) < 0) |
163 | mtspr(SPRN_DEC, 1); | 180 | mtspr(SPRN_DEC, 1); |
181 | #endif /* CONFIG_BOOKE */ | ||
164 | 182 | ||
165 | /* | 183 | /* |
166 | * Force the delivery of pending soft-disabled interrupts on PS3. | 184 | * Force the delivery of pending soft-disabled interrupts on PS3. |
@@ -804,18 +822,6 @@ unsigned int irq_create_of_mapping(struct device_node *controller, | |||
804 | } | 822 | } |
805 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); | 823 | EXPORT_SYMBOL_GPL(irq_create_of_mapping); |
806 | 824 | ||
807 | unsigned int irq_of_parse_and_map(struct device_node *dev, int index) | ||
808 | { | ||
809 | struct of_irq oirq; | ||
810 | |||
811 | if (of_irq_map_one(dev, index, &oirq)) | ||
812 | return NO_IRQ; | ||
813 | |||
814 | return irq_create_of_mapping(oirq.controller, oirq.specifier, | ||
815 | oirq.size); | ||
816 | } | ||
817 | EXPORT_SYMBOL_GPL(irq_of_parse_and_map); | ||
818 | |||
819 | void irq_dispose_mapping(unsigned int virq) | 825 | void irq_dispose_mapping(unsigned int virq) |
820 | { | 826 | { |
821 | struct irq_host *host; | 827 | struct irq_host *host; |