summaryrefslogtreecommitdiff
path: root/chip
diff options
context:
space:
mode:
Diffstat (limited to 'chip')
-rw-r--r--chip/npcx/flash.c11
-rw-r--r--chip/stm32/bkpdata.c10
2 files changed, 16 insertions, 5 deletions
diff --git a/chip/npcx/flash.c b/chip/npcx/flash.c
index 5bb8d209b4..b2b51d15df 100644
--- a/chip/npcx/flash.c
+++ b/chip/npcx/flash.c
@@ -60,8 +60,11 @@ static void flash_pinmux(int enable)
static void flash_execute_cmd(uint8_t code, uint8_t cts)
{
- /* Flash mutex must be held while executing UMA commands. */
- ASSERT(flash_lock.lock);
+ /*
+ * Flash mutex must be held while executing UMA commands after
+ * task_start().
+ */
+ ASSERT(!task_start_called() || flash_lock.lock);
/* set UMA_CODE */
NPCX_UMA_CODE = code;
@@ -723,6 +726,10 @@ int flash_pre_init(void)
void flash_lock_mapped_storage(int lock)
{
+ /* Must not call mutex_lock() before task_start(). */
+ if (!task_start_called())
+ return;
+
if (lock)
mutex_lock(&flash_lock);
else
diff --git a/chip/stm32/bkpdata.c b/chip/stm32/bkpdata.c
index 2b26ace7ea..c31c1a9185 100644
--- a/chip/stm32/bkpdata.c
+++ b/chip/stm32/bkpdata.c
@@ -23,6 +23,7 @@ uint16_t bkpdata_read(enum bkpdata_index index)
int bkpdata_write(enum bkpdata_index index, uint16_t value)
{
+ int use_mutex = task_start_called();
static struct mutex bkpdata_write_mutex;
if (index < 0 || index >= STM32_BKP_ENTRIES)
@@ -30,9 +31,11 @@ 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.
+ * read/mask/write races. Must not call mutex_lock() before
+ * task_start().
*/
- 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 +45,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;
}