summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/stm32/bkpdata.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/chip/stm32/bkpdata.c b/chip/stm32/bkpdata.c
index 2b26ace7ea..bb1a7a5de3 100644
--- a/chip/stm32/bkpdata.c
+++ b/chip/stm32/bkpdata.c
@@ -24,6 +24,7 @@ uint16_t bkpdata_read(enum bkpdata_index index)
int bkpdata_write(enum bkpdata_index index, uint16_t value)
{
static struct mutex bkpdata_write_mutex;
+ int use_mutex = !in_interrupt_context();
if (index < 0 || index >= STM32_BKP_ENTRIES)
return EC_ERROR_INVAL;
@@ -32,7 +33,8 @@ int bkpdata_write(enum bkpdata_index index, uint16_t value)
* Two entries share a single 32-bit register, lock mutex to prevent
* read/mask/write races.
*/
- mutex_lock(&bkpdata_write_mutex);
+ if (use_mutex)
+ mutex_lock(&bkpdata_write_mutex);
if (index & 1) {
uint32_t val = STM32_BKP_DATA(index >> 1);
val = (val & 0x0000FFFF) | (value << 16);
@@ -42,7 +44,8 @@ int bkpdata_write(enum bkpdata_index index, uint16_t value)
val = (val & 0xFFFF0000) | value;
STM32_BKP_DATA(index >> 1) = val;
}
- mutex_unlock(&bkpdata_write_mutex);
+ if (use_mutex)
+ mutex_unlock(&bkpdata_write_mutex);
return EC_SUCCESS;
}