summaryrefslogtreecommitdiffstats
path: root/bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c')
-rw-r--r--bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c26
1 files changed, 15 insertions, 11 deletions
diff --git a/bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c b/bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c
index 2c619db136..f3745281dd 100644
--- a/bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c
+++ b/bsps/arm/atsam/contrib/libraries/libchip/source/pio_it.c
@@ -90,24 +90,28 @@ static uint32_t _dwNumSources = 0;
static void PIO_Interrupt(Pio *pPio, uint32_t id)
{
uint32_t status;
+ uint32_t status_save;
size_t i;
- status = pPio->PIO_ISR;
- status &= pPio->PIO_IMR;
+ do {
+ status = pPio->PIO_ISR;
+ status &= pPio->PIO_IMR;
+ status_save = status;
- for (i = 0; status != 0 && i < MAX_INTERRUPT_SOURCES; ++i) {
- const InterruptSource *is = &_aIntSources[i];
- const Pin *pin = is->pPin;;
+ for (i = 0; status != 0 && i < MAX_INTERRUPT_SOURCES; ++i) {
+ const InterruptSource *is = &_aIntSources[i];
+ const Pin *pin = is->pPin;;
- if (pin->id == id) {
- uint32_t mask = pin->mask;
+ if (pin->id == id) {
+ uint32_t mask = pin->mask;
- if ((status & mask) != 0) {
- status &= ~mask;
- (*is->handler)(pin, is->arg);
+ if ((status & mask) != 0) {
+ status &= ~mask;
+ (*is->handler)(pin, is->arg);
+ }
}
}
- }
+ } while (status_save != 0);
}
/*----------------------------------------------------------------------------