From cb5022fdbaafcc1e6f7c9a14bdb73aa9ccfcaec5 Mon Sep 17 00:00:00 2001 From: Andrew Boie Date: Thu, 7 Jan 2016 08:52:32 -0800 Subject: [PATCH] ipm_quark_se: lock irqs while waiting for status bit to clear Change-Id: Ieb0ac7a32a91826dca39ddb6bec80081c7d2c888 Signed-off-by: Andrew Boie --- drivers/ipm/ipm_quark_se.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/ipm/ipm_quark_se.c b/drivers/ipm/ipm_quark_se.c index b5b0d5e9755..14675954795 100644 --- a/drivers/ipm/ipm_quark_se.c +++ b/drivers/ipm/ipm_quark_se.c @@ -63,6 +63,7 @@ void quark_se_ipm_isr(void *param) struct quark_se_ipm_config_info *config; struct quark_se_ipm_driver_data *driver_data; volatile struct quark_se_ipm *ipm; + unsigned int key; ARG_UNUSED(param); sts = quark_se_ipm_sts_get(); @@ -81,6 +82,8 @@ void quark_se_ipm_isr(void *param) driver_data->callback(driver_data->callback_ctx, ipm->ctrl.ctrl, &ipm->data); + key = irq_lock(); + ipm->sts.irq = 1; /* Clear the interrupt bit */ ipm->sts.sts = 1; /* Clear channel status bit */ @@ -90,6 +93,7 @@ void quark_se_ipm_isr(void *param) while (quark_se_ipm_sts_get() & (0x3 << (channel * 2))) { /* Busy-wait */ } + irq_unlock(key); }