projects
/
platform
/
adaptation
/
renesas_rcar
/
renesas_kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ARM: OMAP2+: INTC: Acknowledge stuck active interrupts
[platform/adaptation/renesas_rcar/renesas_kernel.git]
/
arch
/
arm
/
mach-omap2
/
irq.c
diff --git
a/arch/arm/mach-omap2/irq.c
b/arch/arm/mach-omap2/irq.c
index
e022a86
..
6037a9a
100644
(file)
--- a/
arch/arm/mach-omap2/irq.c
+++ b/
arch/arm/mach-omap2/irq.c
@@
-222,6
+222,7
@@
void __init ti81xx_init_irq(void)
static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs)
{
u32 irqnr;
static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs)
{
u32 irqnr;
+ int handled_irq = 0;
do {
irqnr = readl_relaxed(base_addr + 0x98);
do {
irqnr = readl_relaxed(base_addr + 0x98);
@@
-249,8
+250,15
@@
out:
if (irqnr) {
irqnr = irq_find_mapping(domain, irqnr);
handle_IRQ(irqnr, regs);
if (irqnr) {
irqnr = irq_find_mapping(domain, irqnr);
handle_IRQ(irqnr, regs);
+ handled_irq = 1;
}
} while (irqnr);
}
} while (irqnr);
+
+ /* If an irq is masked or deasserted while active, we will
+ * keep ending up here with no irq handled. So remove it from
+ * the INTC with an ack.*/
+ if (!handled_irq)
+ omap_ack_irq(NULL);
}
asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs)
}
asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs)