From 98dbea0979873a821427acd09fdebf2eadcbe74f Mon Sep 17 00:00:00 2001 From: Flavio Ceolin Date: Mon, 1 Mar 2021 13:44:40 -0800 Subject: [PATCH] power: Get rid of deep sleep and sleep concepts New power states have more granularity than deep sleep and sleep states. Just get rid of this and keep the same behavior for now. Signed-off-by: Flavio Ceolin --- include/power/power.h | 46 ---------------- soc/arm/st_stm32/stm32l4/power.c | 5 -- soc/arm/st_stm32/stm32wb/power.c | 5 -- subsys/power/policy/pm_policy.h | 5 -- subsys/power/policy/policy_dummy.c | 5 -- subsys/power/policy/policy_residency.c | 5 -- .../policy/policy_residency_cc13x2_cc26x2.c | 5 -- subsys/power/power.c | 54 +++++++++---------- .../kernel/profiling/profiling_api/src/main.c | 6 --- tests/subsys/power/power_mgmt/src/main.c | 5 -- .../power/power_mgmt_soc/src/power_mgmt.c | 17 ++---- 11 files changed, 30 insertions(+), 128 deletions(-) diff --git a/include/power/power.h b/include/power/power.h index f73962fb03b..e2eece1a4e8 100644 --- a/include/power/power.h +++ b/include/power/power.h @@ -63,52 +63,6 @@ struct pm_notifier { void (*state_exit)(enum pm_state state); }; -/** - * @brief Check if particular power state is a sleep state. - * - * This function returns true if given power state is a sleep state. - */ -static inline bool pm_is_sleep_state(enum pm_state state) -{ - bool ret = true; - - switch (state) { - case PM_STATE_RUNTIME_IDLE: - __fallthrough; - case PM_STATE_SUSPEND_TO_IDLE: - __fallthrough; - case PM_STATE_STANDBY: - break; - default: - ret = false; - break; - } - - return ret; -} - -/** - * @brief Check if particular power state is a deep sleep state. - * - * This function returns true if given power state is a deep sleep state. - */ -static inline bool pm_is_deep_sleep_state(enum pm_state state) -{ - bool ret = true; - - switch (state) { - case PM_STATE_SUSPEND_TO_RAM: - __fallthrough; - case PM_STATE_SUSPEND_TO_DISK: - break; - default: - ret = false; - break; - } - - return ret; -} - /** * @brief Force usage of given power state. * diff --git a/soc/arm/st_stm32/stm32l4/power.c b/soc/arm/st_stm32/stm32l4/power.c index e1f327111a0..e2ad7bab74e 100644 --- a/soc/arm/st_stm32/stm32l4/power.c +++ b/soc/arm/st_stm32/stm32l4/power.c @@ -118,11 +118,6 @@ void pm_power_state_exit_post_ops(struct pm_state_info info) irq_unlock(0); } -__weak bool pm_policy_low_power_devices(enum pm_state state) -{ - return pm_is_sleep_state(state); -} - /* Initialize STM32 Power */ static int stm32_power_init(const struct device *dev) { diff --git a/soc/arm/st_stm32/stm32wb/power.c b/soc/arm/st_stm32/stm32wb/power.c index 7d538b6cb2e..ea33184ad55 100644 --- a/soc/arm/st_stm32/stm32wb/power.c +++ b/soc/arm/st_stm32/stm32wb/power.c @@ -107,8 +107,3 @@ void pm_power_state_exit_post_ops(struct pm_state_info info) */ irq_unlock(0); } - -__weak bool pm_policy_low_power_devices(enum pm_state state) -{ - return pm_is_sleep_state(state); -} diff --git a/subsys/power/policy/pm_policy.h b/subsys/power/policy/pm_policy.h index 463321c28ec..fb9f9d5634e 100644 --- a/subsys/power/policy/pm_policy.h +++ b/subsys/power/policy/pm_policy.h @@ -43,11 +43,6 @@ void pm_resume_devices(void); */ struct pm_state_info pm_policy_next_state(int32_t ticks); -/** - * @brief Function to determine whether to put devices in low - * power state, given the system PM state. - */ -bool pm_policy_low_power_devices(enum pm_state state); #ifdef __cplusplus } diff --git a/subsys/power/policy/policy_dummy.c b/subsys/power/policy/policy_dummy.c index 02c65e04a81..a9b91d1ec81 100644 --- a/subsys/power/policy/policy_dummy.c +++ b/subsys/power/policy/policy_dummy.c @@ -47,8 +47,3 @@ struct pm_state_info pm_policy_next_state(int32_t ticks) LOG_DBG("No suitable power state found!"); return STATE_ACTIVE; } - -__weak bool pm_policy_low_power_devices(enum pm_state state) -{ - return pm_is_sleep_state(state); -} diff --git a/subsys/power/policy/policy_residency.c b/subsys/power/policy/policy_residency.c index 096247165b4..8074fd7b51f 100644 --- a/subsys/power/policy/policy_residency.c +++ b/subsys/power/policy/policy_residency.c @@ -38,8 +38,3 @@ struct pm_state_info pm_policy_next_state(int32_t ticks) LOG_DBG("No suitable power state found!"); return (struct pm_state_info){PM_STATE_ACTIVE, 0, 0}; } - -__weak bool pm_policy_low_power_devices(enum pm_state state) -{ - return pm_is_sleep_state(state); -} diff --git a/subsys/power/policy/policy_residency_cc13x2_cc26x2.c b/subsys/power/policy/policy_residency_cc13x2_cc26x2.c index bb474924c31..ba7bcf98d90 100644 --- a/subsys/power/policy/policy_residency_cc13x2_cc26x2.c +++ b/subsys/power/policy/policy_residency_cc13x2_cc26x2.c @@ -136,8 +136,3 @@ struct pm_state_info pm_policy_next_state(int32_t ticks) LOG_DBG("No suitable power state found!"); return STATE_ACTIVE; } - -__weak bool pm_policy_low_power_devices(enum pm_state state) -{ - return state == PM_STATE_STANDBY; -} diff --git a/subsys/power/power.c b/subsys/power/power.c index f0e8519d802..232e3c86440 100644 --- a/subsys/power/power.c +++ b/subsys/power/power.c @@ -134,6 +134,7 @@ void pm_power_state_force(struct pm_state_info info) } } +#if CONFIG_PM_DEVICE static enum pm_state _handle_device_abort(struct pm_state_info info) { LOG_DBG("Some devices didn't enter suspend state!"); @@ -142,46 +143,43 @@ static enum pm_state _handle_device_abort(struct pm_state_info info) z_power_state.state = PM_STATE_ACTIVE; return PM_STATE_ACTIVE; } +#endif enum pm_state pm_system_suspend(int32_t ticks) { - bool deep_sleep; -#if CONFIG_PM_DEVICE - bool low_power = false; -#endif - z_power_state = pm_policy_next_state(ticks); if (z_power_state.state == PM_STATE_ACTIVE) { LOG_DBG("No PM operations done."); return z_power_state.state; } - - deep_sleep = pm_is_deep_sleep_state(z_power_state.state); - post_ops_done = 0; - if (deep_sleep) { - /* Suspend peripherals. */ - if (IS_ENABLED(CONFIG_PM_DEVICE) && pm_suspend_devices()) { +#if CONFIG_PM_DEVICE + + bool should_resume_devices = true; + + switch (z_power_state.state) { + case PM_STATE_RUNTIME_IDLE: + __fallthrough; + case PM_STATE_SUSPEND_TO_IDLE: + __fallthrough; + case PM_STATE_STANDBY: + /* low power peripherals. */ + if (pm_low_power_devices()) { + return _handle_device_abort(z_power_state); + } break; + case PM_STATE_SUSPEND_TO_RAM: + __fallthrough; + case PM_STATE_SUSPEND_TO_DISK: + if (pm_suspend_devices()) { return _handle_device_abort(z_power_state); } - /* - * Disable idle exit notification as it is not needed - * in deep sleep mode. - */ -#if CONFIG_PM_DEVICE - } else { - if (pm_policy_low_power_devices(z_power_state.state)) { - /* low power peripherals. */ - if (pm_low_power_devices()) { - return _handle_device_abort(z_power_state); - } - - low_power = true; - } -#endif + break; + default: + should_resume_devices = false; + break; } - +#endif pm_debug_start_timer(); /* Enter power state */ pm_state_notify(true); @@ -190,7 +188,7 @@ enum pm_state pm_system_suspend(int32_t ticks) /* Wake up sequence starts here */ #if CONFIG_PM_DEVICE - if (deep_sleep || low_power) { + if (should_resume_devices) { /* Turn on peripherals and restore device states as necessary */ pm_resume_devices(); } diff --git a/tests/kernel/profiling/profiling_api/src/main.c b/tests/kernel/profiling/profiling_api/src/main.c index 3f25f5ad07c..34278998e87 100644 --- a/tests/kernel/profiling/profiling_api/src/main.c +++ b/tests/kernel/profiling/profiling_api/src/main.c @@ -54,12 +54,6 @@ struct pm_state_info pm_policy_next_state(int32_t ticks) return (struct pm_state_info){PM_STATE_ACTIVE, 0, 0}; } -/* Our PM device policy handler */ -bool pm_policy_low_power_devices(enum pm_state state) -{ - return pm_is_sleep_state(state); -} - /*work handler*/ static void work_handler(struct k_work *w) { diff --git a/tests/subsys/power/power_mgmt/src/main.c b/tests/subsys/power/power_mgmt/src/main.c index f2218fb74ce..247d5467bb5 100644 --- a/tests/subsys/power/power_mgmt/src/main.c +++ b/tests/subsys/power/power_mgmt/src/main.c @@ -59,11 +59,6 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info info) irq_unlock(0); } -__weak bool pm_policy_low_power_devices(enum pm_state state) -{ - return pm_is_sleep_state(state); -} - /* Our PM policy handler */ struct pm_state_info pm_policy_next_state(int ticks) { diff --git a/tests/subsys/power/power_mgmt_soc/src/power_mgmt.c b/tests/subsys/power/power_mgmt_soc/src/power_mgmt.c index a43762b0174..503e0537291 100644 --- a/tests/subsys/power/power_mgmt_soc/src/power_mgmt.c +++ b/tests/subsys/power/power_mgmt_soc/src/power_mgmt.c @@ -14,7 +14,7 @@ #define LOG_LEVEL LOG_LEVEL_DBG LOG_MODULE_REGISTER(pwrmgmt_test); -#define SLP_STATES_SUPPORTED 2ul +#define SLP_STATES_SUPPORTED (PM_STATE_SOFT_OFF + 1) /* Thread properties */ #undef TASK_STACK_SIZE @@ -78,13 +78,8 @@ static void notify_pm_state_entry(enum pm_state state) return; } - if (pm_is_sleep_state(state)) { - pm_counters[0].entry_cnt++; - pm_latency_check(); - } else if (pm_is_deep_sleep_state(state)) { - pm_counters[1].entry_cnt++; - pm_latency_check(); - } + pm_counters[(int)state].entry_cnt++; + pm_latency_check(); } static void notify_pm_state_exit(enum pm_state state) @@ -93,11 +88,7 @@ static void notify_pm_state_exit(enum pm_state state) return; } - if (pm_is_sleep_state(state)) { - pm_counters[0].exit_cnt++; - } else if (pm_is_deep_sleep_state(state)) { - pm_counters[1].exit_cnt++; - } + pm_counters[(int)state].exit_cnt++; } static struct pm_notifier notifier = {