summaryrefslogtreecommitdiffstats
path: root/c
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 /c
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.
Diffstat (limited to 'c')
-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);
- }
}
/*