From ab27747484ebd3bdb2d98848a74ff7d7b4248c7a Mon Sep 17 00:00:00 2001 From: "Anton D. Kachalov" Date: Wed, 29 Jul 2015 10:16:49 +0300 Subject: [PATCH] [arm/src/moxart/irq] irq_decode: process several interrupts at once Signed-off-by: Anton D. Kachalov --- arch/arm/src/moxart/moxart_irq.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/arch/arm/src/moxart/moxart_irq.c b/arch/arm/src/moxart/moxart_irq.c index a86c4ce7972..4b6b81a2f6e 100644 --- a/arch/arm/src/moxart/moxart_irq.c +++ b/arch/arm/src/moxart/moxart_irq.c @@ -135,7 +135,7 @@ void up_irqinitialize(void) #endif } -static inline void ftintc010_mask_irq(int irq) +inline void ftintc010_mask_irq(int irq) { /* * 0: masked @@ -274,17 +274,19 @@ void up_decodeirq(uint32_t *regs) /* Detect & deliver the IRQ */ status = getreg32(IRQ_REG(IRQ__STATUS)); - if (!status) - return; + while (status != 0) + { + /* Ack IRQ */ + num = ffs(status) - 1; + up_ack_irq(num); - /* Ack IRQ */ - num = ffs(status) - 1; - up_ack_irq(num); + DEBUGASSERT(current_regs == NULL); + current_regs = regs; - DEBUGASSERT(current_regs == NULL); - current_regs = regs; + irq_dispatch(num, regs); - irq_dispatch(num, regs); + current_regs = NULL; - current_regs = NULL; + status = getreg32(IRQ_REG(IRQ__STATUS)); + } }