From b459064ec1d47366059e259330481a17b4e59265 Mon Sep 17 00:00:00 2001 From: Gerard Marull-Paretas Date: Tue, 8 Aug 2023 10:59:35 +0200 Subject: [PATCH] soc: arm: st_stm32: wl: add support for sys_poweroff Implement the hook for sys_poweroff based on the SOFT_OFF code. Note that standby mode was a substate of SOFT_OFF, however, it was not supported judging from defined DT states. It can be added later using the STANDBY state. Signed-off-by: Gerard Marull-Paretas --- soc/arm/st_stm32/stm32wl/CMakeLists.txt | 2 ++ soc/arm/st_stm32/stm32wl/Kconfig.series | 1 + soc/arm/st_stm32/stm32wl/power.c | 19 ------------------- soc/arm/st_stm32/stm32wl/poweroff.c | 21 +++++++++++++++++++++ 4 files changed, 24 insertions(+), 19 deletions(-) create mode 100644 soc/arm/st_stm32/stm32wl/poweroff.c diff --git a/soc/arm/st_stm32/stm32wl/CMakeLists.txt b/soc/arm/st_stm32/stm32wl/CMakeLists.txt index 80ba57ceb6b..40ff85ccbbe 100644 --- a/soc/arm/st_stm32/stm32wl/CMakeLists.txt +++ b/soc/arm/st_stm32/stm32wl/CMakeLists.txt @@ -6,3 +6,5 @@ zephyr_sources(soc.c) zephyr_sources_ifdef(CONFIG_PM power.c ) + +zephyr_sources_ifdef(CONFIG_POWEROFF poweroff.c) diff --git a/soc/arm/st_stm32/stm32wl/Kconfig.series b/soc/arm/st_stm32/stm32wl/Kconfig.series index 58dcae421ba..066deab4e92 100644 --- a/soc/arm/st_stm32/stm32wl/Kconfig.series +++ b/soc/arm/st_stm32/stm32wl/Kconfig.series @@ -13,5 +13,6 @@ config SOC_SERIES_STM32WLX select CPU_HAS_ARM_MPU select CLOCK_CONTROL_STM32_CUBE if CLOCK_CONTROL select HAS_PM + select HAS_POWEROFF help Enable support for STM32WL MCU series diff --git a/soc/arm/st_stm32/stm32wl/power.c b/soc/arm/st_stm32/stm32wl/power.c index 5517ec1ff47..aaf43db4817 100644 --- a/soc/arm/st_stm32/stm32wl/power.c +++ b/soc/arm/st_stm32/stm32wl/power.c @@ -51,22 +51,6 @@ void pm_state_set(enum pm_state state, uint8_t substate_id) LL_LPM_EnableDeepSleep(); k_cpu_idle(); break; - case PM_STATE_SOFT_OFF: - LL_PWR_ClearFlag_WU(); - switch (substate_id) { - case 0: - LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY); - break; - case 1: - LL_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); - break; - default: - LOG_DBG("Unsupported power substate-id %u", substate_id); - return; - } - LL_LPM_EnableDeepSleep(); - k_cpu_idle(); - break; default: LOG_DBG("Unsupported power state %u", state); break; @@ -85,9 +69,6 @@ void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id) /* need to restore the clock */ stm32_clock_control_init(NULL); break; - case PM_STATE_SOFT_OFF: - /* Nothing to do. */ - break; default: LOG_DBG("Unsupported power substate-id %u", state); break; diff --git a/soc/arm/st_stm32/stm32wl/poweroff.c b/soc/arm/st_stm32/stm32wl/poweroff.c new file mode 100644 index 00000000000..05d516393ea --- /dev/null +++ b/soc/arm/st_stm32/stm32wl/poweroff.c @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2023 Nordic Semiconductor ASA + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#include +#include + +void z_sys_poweroff(void) +{ + LL_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN); + LL_LPM_EnableDeepSleep(); + + k_cpu_idle(); + + CODE_UNREACHABLE; +}