aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/irq.c
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2010-08-09 09:09:29 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2010-08-09 09:09:29 -0400
commit054d5c9238f3c577ad51195c3ee7803613f322cc (patch)
treeff7d9f5c0e0ddf14230ba28f28ef69a2c0a0debf /arch/powerpc/kernel/irq.c
parent11e4afb49b7fa1fc8e1ffd850c1806dd86a08204 (diff)
parent2192482ee5ce5d5d4a6cec0c351b2d3a744606eb (diff)
Merge branch 'devel-stable' into devel
Diffstat (limited to 'arch/powerpc/kernel/irq.c')
-rw-r--r--arch/powerpc/kernel/irq.c30
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}
805EXPORT_SYMBOL_GPL(irq_create_of_mapping); 823EXPORT_SYMBOL_GPL(irq_create_of_mapping);
806 824
807unsigned 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}
817EXPORT_SYMBOL_GPL(irq_of_parse_and_map);
818
819void irq_dispose_mapping(unsigned int virq) 825void irq_dispose_mapping(unsigned int virq)
820{ 826{
821 struct irq_host *host; 827 struct irq_host *host;