summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-09 16:04:04 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2013-07-09 16:42:00 +0200
commit296b60d72a7587d95d6e561bdb2b5a56a0961362 (patch)
treeef46caad9c582d11640477e5b36348664130ef5e
parentbsps/powerpc: Add ppc_count_leading_zeros() (diff)
downloadrtems-296b60d72a7587d95d6e561bdb2b5a56a0961362.tar.bz2
bsp/virtex: Fix interrupt handling
Some modules like the XPS UART Lite use event triggered interrupts. If we acknowledge the interrupts after the interrupt service we may loose these events.
-rw-r--r--c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c14
1 files changed, 5 insertions, 9 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 d5fd79dd7b..715dbd64fa 100644
--- a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
+++ b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
@@ -81,11 +81,13 @@ static void BSP_irq_disable_at_opbintc (rtems_irq_number irqnum)
*/
static void BSP_irq_handle_at_opbintc(void)
{
- uint32_t ipr, mask, i, c;
+ uint32_t ipr, i, c;
+
+ /* Get pending interrupts */
ipr = get_ipr();
- c = 0;
- mask = 0;
+ /* Acknowledge all pending interrupts now and service them afterwards */
+ set_iar(ipr);
for (i = 0;
(i < BSP_OPBINTC_PER_IRQ_NUMBER)
@@ -95,17 +97,11 @@ static void BSP_irq_handle_at_opbintc(void)
if ((ipr & c) != 0) {
/* interrupt is asserted */
- mask |= c;
ipr &= ~c;
bsp_interrupt_handler_dispatch(i+BSP_OPBINTC_IRQ_LOWEST_OFFSET);
}
}
-
- if (mask) {
- /* ack all the interrupts we serviced */
- set_iar(mask);
- }
}
/*