Skip to content

Commit

Permalink
microblaze: Fix level interrupt ACKing
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
steve@digidescorp.com authored and Michal Simek committed Dec 14, 2009
1 parent 833d0d8 commit 33d9ff5
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion arch/microblaze/kernel/intc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 33d9ff5

Please sign in to comment.