summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
index 715dbd64fa..b863bc9237 100644
--- a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
+++ b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
@@ -38,6 +38,8 @@
#include <bsp/irq-generic.h>
#include <bsp/vectors.h>
+#include <libcpu/powerpc-utility.h>
+
/*
* Acknowledge a mask of interrupts.
*/
@@ -86,21 +88,18 @@ static void BSP_irq_handle_at_opbintc(void)
/* Get pending interrupts */
ipr = get_ipr();
- /* Acknowledge all pending interrupts now and service them afterwards */
- set_iar(ipr);
+ if (ipr != 0) {
+ /* Acknowledge all pending interrupts now and service them afterwards */
+ set_iar(ipr);
- for (i = 0;
- (i < BSP_OPBINTC_PER_IRQ_NUMBER)
- && (ipr != 0);
- i++) {
- c = (1 << i);
+ do {
+ /* Get highest priority pending interrupt */
+ uint32_t i = 31 - ppc_count_leading_zeros(ipr);
- if ((ipr & c) != 0) {
- /* interrupt is asserted */
- ipr &= ~c;
+ ipr &= ~(1U << i);
bsp_interrupt_handler_dispatch(i+BSP_OPBINTC_IRQ_LOWEST_OFFSET);
- }
+ } while (ipr != 0);
}
}