summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsteve@digidescorp.com <steve@digidescorp.com>2009-11-17 17:43:39 +0300
committerMichal Simek <monstr@monstr.eu>2009-12-14 10:45:06 +0300
commit33d9ff5985ff015cbaaef85285d19fe580487cf3 (patch)
tree5cfe889e9da8d89dbafc062ef41746697ecce11c
parent833d0d8da41b80e5f7c3b34cb187b12c33ef66c8 (diff)
downloadlinux-33d9ff5985ff015cbaaef85285d19fe580487cf3.tar.xz
microblaze: Fix level interrupt ACKing
Level interrupts need to be ack'd in the unmask handler, as in powerpc. Among other issues, this bug causes the system clock to appear to run at double-speed. Signed-off-by: Steven J. Magnani <steve@digidescorp.com> Signed-off-by: Michal Simek <monstr@monstr.eu>
-rw-r--r--arch/microblaze/kernel/intc.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/arch/microblaze/kernel/intc.c b/arch/microblaze/kernel/intc.c
index 6eea6f92b84e..03172c1da770 100644
--- a/arch/microblaze/kernel/intc.c
+++ b/arch/microblaze/kernel/intc.c
@@ -42,8 +42,16 @@ unsigned int nr_irq;
static void intc_enable_or_unmask(unsigned int irq)
{
+ unsigned long mask = 1 << irq;
pr_debug("enable_or_unmask: %d\n", irq);
- out_be32(INTC_BASE + SIE, 1 << irq);
+ out_be32(INTC_BASE + SIE, mask);
+
+ /* ack level irqs because they can't be acked during
+ * ack function since the handle_level_irq function
+ * acks the irq before calling the interrupt handler
+ */
+ if (irq_desc[irq].status & IRQ_LEVEL)
+ out_be32(INTC_BASE + IAR, mask);
}
static void intc_disable_or_mask(unsigned int irq)