pm: Change parameters of pm_power_state_{set,exit_post_ops}

Just pass state and substate_id instead of the whole info structure
pointer.

Signed-off-by: Carlo Caione <ccaione@baylibre.com>
This commit is contained in:
Carlo Caione 2022-01-21 18:28:10 +01:00 committed by Anas Nashif
commit c5894df5ec
24 changed files with 228 additions and 170 deletions

View file

@ -179,10 +179,10 @@ bool pm_constraint_get(enum pm_state state);
* This function implements the SoC specific details necessary
* to put the processor into available power states.
*
* @param info Power state which should be used in the ongoing
* suspend operation.
* @param state Power state.
* @param substate_id Power substate id.
*/
void pm_power_state_set(struct pm_state_info *info);
void pm_power_state_set(enum pm_state state, uint8_t substate_id);
/**
* @brief Do any SoC or architecture specific post ops after sleep state exits.
@ -192,9 +192,10 @@ void pm_power_state_set(struct pm_state_info *info);
* interrupts after resuming from sleep state. In future, the enabling
* of interrupts may be moved into the kernel.
*
* @param info Power state that the given cpu is leaving.
* @param state Power state.
* @param substate_id Power substate id.
*/
void pm_power_state_exit_post_ops(struct pm_state_info *info);
void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id);
/**
* @}
@ -209,8 +210,8 @@ void pm_power_state_exit_post_ops(struct pm_state_info *info);
#define pm_constraint_release(pm_state)
#define pm_constraint_get(pm_state) (true)
#define pm_power_state_set(info)
#define pm_power_state_exit_post_ops(info)
#define pm_power_state_set(state, substate_id)
#define pm_power_state_exit_post_ops(state, substate_id)
#define pm_power_state_next_get(cpu) \
(&(struct pm_state_info){PM_STATE_ACTIVE, 0, 0})

View file

@ -101,9 +101,11 @@ static void z_power_soc_sleep(void)
* For deep sleep pm_system_suspend has executed all the driver
* power management call backs.
*/
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
z_power_soc_sleep();
break;
@ -123,9 +125,11 @@ __weak void pm_power_state_set(struct pm_state_info *info)
* an ISR on wake except for faults. We re-enable interrupts by setting PRIMASK
* to 0.
*/
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
case PM_STATE_SUSPEND_TO_RAM:
__set_PRIMASK(0);

View file

@ -11,27 +11,31 @@
LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
nrf_power_system_off(NRF_POWER);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
/* Nothing to do. */
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}

View file

@ -11,27 +11,31 @@
LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
nrf_power_system_off(NRF_POWER);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
/* Nothing to do. */
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}

View file

@ -13,27 +13,31 @@
LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
nrf_regulators_system_off(NRF_REGULATORS);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
/* Nothing to do. */
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}

View file

@ -12,27 +12,31 @@
LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
nrf_regulators_system_off(NRF_REGULATORS);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SOFT_OFF:
/* Nothing to do. */
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}

View file

@ -144,12 +144,12 @@ static void npcx_power_enter_system_sleep(int slp_mode, int wk_mode)
}
/* Invoke when enter "Suspend/Low Power" mode. */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", state);
} else {
switch (info->substate_id) {
switch (substate_id) {
case 0: /* Sub-state 0: Deep sleep with instant wake-up */
npcx_power_enter_system_sleep(NPCX_DEEP_SLEEP,
NPCX_INSTANT_WAKE_UP);
@ -166,19 +166,19 @@ __weak void pm_power_state_set(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
break;
}
}
}
/* Handle soc specific activity after exiting "Suspend/Low Power" mode. */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", state);
} else {
switch (info->substate_id) {
switch (substate_id) {
case 0: /* Sub-state 0: Deep sleep with instant wake-up */
/* Restore interrupts */
__enable_irq();
@ -189,7 +189,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
break;
}
}

View file

@ -283,11 +283,13 @@ void cpu_mode_transition(gpc_cpu_mode_t mode, bool enable_standby)
* SOC specific low power mode implementation
* Drop to lowest power state possible given system's request
*/
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(state);
/* Extract set point and GPC mode from the substate ID */
uint8_t set_point = IMX_SPC(info->substate_id);
gpc_cpu_mode_t gpc_mode = IMX_GPC_MODE(info->substate_id);
uint8_t set_point = IMX_SPC(substate_id);
gpc_cpu_mode_t gpc_mode = IMX_GPC_MODE(substate_id);
uint8_t current_set_point = GPC_SP_GetCurrentSetPoint(GPC_SET_POINT_CTRL);
LOG_DBG("Switch to Set Point %d, GPC Mode %d requested", set_point, gpc_mode);
@ -304,9 +306,11 @@ __weak void pm_power_state_set(struct pm_state_info *info)
}
}
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(info);
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
/* Clear PRIMASK */
__enable_irq();
LOG_DBG("Exiting LPM");

View file

@ -22,8 +22,10 @@ LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
APP_DEEPSLEEP_RAM_APD, APP_DEEPSLEEP_RAM_PPD}))
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
/* FIXME: When this function is entered the Kernel has disabled
* interrupts using BASEPRI register. This is incorrect as it prevents
* waking up from any interrupt which priority is not 0. Work around the
@ -36,7 +38,7 @@ __weak void pm_power_state_set(struct pm_state_info *info)
/* Set BASEPRI to 0 */
irq_unlock(0);
switch (info->state) {
switch (state) {
case PM_STATE_RUNTIME_IDLE:
POWER_EnterSleep();
break;
@ -44,15 +46,16 @@ __weak void pm_power_state_set(struct pm_state_info *info)
POWER_EnterDeepSleep(APP_EXCLUDE_FROM_DEEPSLEEP);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(info);
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
/* Clear PRIMASK */
__enable_irq();

View file

@ -25,15 +25,15 @@ __ramfunc static void wait_for_flash_prefetch_and_idle(void)
}
#endif /* CONFIG_XIP */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
switch (state) {
case PM_STATE_RUNTIME_IDLE:
k_cpu_idle();
break;
case PM_STATE_SUSPEND_TO_IDLE:
/* Set partial stop mode and enable deep sleep */
SMC->STOPCTRL = SMC_STOPCTRL_PSTOPO(info->substate_id);
SMC->STOPCTRL = SMC_STOPCTRL_PSTOPO(substate_id);
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
#ifdef CONFIG_XIP
wait_for_flash_prefetch_and_idle();
@ -46,16 +46,16 @@ __weak void pm_power_state_set(struct pm_state_info *info)
}
break;
default:
LOG_WRN("Unsupported power state %u", info->state);
LOG_WRN("Unsupported power state %u", state);
break;
}
}
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(info);
ARG_UNUSED(substate_id);
if (info->state == PM_STATE_SUSPEND_TO_IDLE) {
if (state == PM_STATE_SUSPEND_TO_IDLE) {
/* Disable deep sleep upon exit */
SCB->SCR &= ~(SCB_SCR_SLEEPDEEP_Msk);
}

View file

@ -18,9 +18,11 @@ LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
*/
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
LOG_DBG("SoC entering power state %d", info->state);
ARG_UNUSED(substate_id);
LOG_DBG("SoC entering power state %d", state);
/* FIXME: When this function is entered the Kernel has disabled
* interrupts using BASEPRI register. This is incorrect as it prevents
@ -34,7 +36,7 @@ __weak void pm_power_state_set(struct pm_state_info *info)
/* Set BASEPRI to 0 */
irq_unlock(0);
switch (info->state) {
switch (state) {
case PM_STATE_RUNTIME_IDLE:
EMU_EnterEM1();
break;
@ -45,18 +47,19 @@ __weak void pm_power_state_set(struct pm_state_info *info)
EMU_EnterEM3(true);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
LOG_DBG("SoC leaving power state %d", info->state);
LOG_DBG("SoC leaving power state %d", state);
/* Clear PRIMASK */
__enable_irq();
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(info);
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
}

View file

@ -20,14 +20,14 @@
LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
return;
}
switch (info->substate_id) {
switch (substate_id) {
case 1: /* this corresponds to the STOP0 mode: */
/* enter STOP0 mode */
LL_PWR_SetPowerMode(LL_PWR_MODE_STOP0);
@ -44,18 +44,18 @@ __weak void pm_power_state_set(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power state substate-id %u",
info->substate_id);
substate_id);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power substate %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power substate %u", state);
} else {
switch (info->substate_id) {
switch (substate_id) {
case 1: /* STOP0 */
__fallthrough;
case 2: /* STOP1 */
@ -65,7 +65,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
break;
}
/* need to restore the clock */

View file

@ -28,9 +28,11 @@ LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
#endif
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
LL_RCC_SetClkAfterWakeFromStop(RCC_STOP_WAKEUPCLOCK_SELECTED);
LL_PWR_ClearFlag_WU();
@ -46,15 +48,17 @@ __weak void pm_power_state_set(struct pm_state_info *info)
k_cpu_idle();
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
LL_LPM_DisableSleepOnExit();
LL_LPM_EnableSleep();
@ -67,7 +71,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
/* Nothing to do. */
break;
default:
LOG_DBG("Unsupported power substate-id %u", info->state);
LOG_DBG("Unsupported power substate-id %u", state);
break;
}

View file

@ -28,14 +28,14 @@ LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
#endif
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", state);
return;
}
switch (info->substate_id) {
switch (substate_id) {
case 1: /* this corresponds to the STOP0 mode: */
/* ensure the proper wake-up system clock */
LL_RCC_SetClkAfterWakeFromStop(RCC_STOP_WAKEUPCLOCK_SELECTED);
@ -68,18 +68,18 @@ __weak void pm_power_state_set(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power state substate-id %u",
info->substate_id);
substate_id);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power substate-id %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power substate-id %u", state);
} else {
switch (info->substate_id) {
switch (substate_id) {
case 1: /* STOP0 */
__fallthrough;
case 2: /* STOP1 */
@ -90,7 +90,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
break;
}
/* need to restore the clock */

View file

@ -28,14 +28,14 @@ LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
#endif
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", state);
return;
}
switch (info->substate_id) {
switch (substate_id) {
case 1: /* this corresponds to the STOP0 mode: */
/* ensure the proper wake-up system clock */
LL_RCC_SetClkAfterWakeFromStop(RCC_STOP_WAKEUPCLOCK_SELECTED);
@ -68,18 +68,18 @@ __weak void pm_power_state_set(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power state substate-id %u",
info->substate_id);
substate_id);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power substate-id %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power substate-id %u", state);
} else {
switch (info->substate_id) {
switch (substate_id) {
case 1: /* STOP0 */
__fallthrough;
case 2: /* STOP1 */
@ -90,7 +90,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
break;
}
/* need to restore the clock */

View file

@ -62,22 +62,21 @@ void set_mode_shutdown(uint8_t substate_id)
}
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
set_mode_stop(info->substate_id);
set_mode_stop(substate_id);
break;
case PM_STATE_STANDBY:
/* To be tested */
set_mode_standby(info->substate_id);
set_mode_standby(substate_id);
break;
case PM_STATE_SOFT_OFF:
set_mode_shutdown(info->substate_id);
set_mode_shutdown(substate_id);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
return;
}
@ -89,16 +88,16 @@ __weak void pm_power_state_set(struct pm_state_info *info)
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
if (info->substate_id <= 3) {
if (substate_id <= 3) {
LL_LPM_DisableSleepOnExit();
LL_LPM_EnableSleep();
} else {
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
}
case PM_STATE_STANDBY:
/* To be tested */
@ -113,7 +112,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
case PM_STATE_SUSPEND_TO_DISK:
__fallthrough;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
/* need to restore the clock */

View file

@ -84,9 +84,9 @@ static void shutdown_ble_stack(void)
}
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
if (info->state == PM_STATE_SOFT_OFF) {
if (state == PM_STATE_SOFT_OFF) {
if (IS_ENABLED(CONFIG_BT)) {
shutdown_ble_stack();
@ -99,14 +99,14 @@ __weak void pm_power_state_set(struct pm_state_info *info)
LL_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
} else if (info->state == PM_STATE_SUSPEND_TO_IDLE) {
} else if (state == PM_STATE_SUSPEND_TO_IDLE) {
lpm_hsem_lock();
/* ensure HSI is the wake-up system clock */
LL_RCC_SetClkAfterWakeFromStop(LL_RCC_STOP_WAKEUPCLOCK_HSI);
switch (info->substate_id) {
switch (substate_id) {
case 1:
/* enter STOP0 mode */
LL_PWR_SetPowerMode(LL_PWR_MODE_STOP0);
@ -122,12 +122,12 @@ __weak void pm_power_state_set(struct pm_state_info *info)
default:
/* Release RCC semaphore */
z_stm32_hsem_unlock(CFG_HW_RCC_SEMID);
LOG_DBG("Unsupported power substate-id %u", info->substate_id);
LOG_DBG("Unsupported power substate-id %u", substate_id);
return;
}
} else {
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
return;
}
@ -141,17 +141,17 @@ __weak void pm_power_state_set(struct pm_state_info *info)
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
/* Implementation of STM32 AN5289 algorithm to enter/exit lowpower */
/* Release ENTRY_STOP_MODE semaphore */
LL_HSEM_ReleaseLock(HSEM, CFG_HW_ENTRY_STOP_MODE_SEMID, 0);
z_stm32_hsem_lock(CFG_HW_RCC_SEMID, HSEM_LOCK_WAIT_FOREVER);
if (info->state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", info->state);
if (state != PM_STATE_SUSPEND_TO_IDLE) {
LOG_DBG("Unsupported power state %u", state);
} else {
switch (info->substate_id) {
switch (substate_id) {
case 1: /* STOP0 */
__fallthrough;
case 2: /* STOP1 */
@ -162,7 +162,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
break;
default:
LOG_DBG("Unsupported power substate-id %u",
info->substate_id);
substate_id);
break;
}
/* need to restore the clock */

View file

@ -28,13 +28,13 @@ LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
#endif
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
LL_RCC_SetClkAfterWakeFromStop(RCC_STOP_WAKEUPCLOCK_SELECTED);
LL_PWR_ClearFlag_WU();
switch (info->substate_id) {
switch (substate_id) {
case 1:
LL_PWR_SetPowerMode(LL_PWR_MODE_STOP0);
break;
@ -45,7 +45,7 @@ __weak void pm_power_state_set(struct pm_state_info *info)
LL_PWR_SetPowerMode(LL_PWR_MODE_STOP2);
break;
default:
LOG_DBG("Unsupported power substate-id %u", info->substate_id);
LOG_DBG("Unsupported power substate-id %u", substate_id);
return;
}
LL_LPM_EnableDeepSleep();
@ -53,7 +53,7 @@ __weak void pm_power_state_set(struct pm_state_info *info)
break;
case PM_STATE_SOFT_OFF:
LL_PWR_ClearFlag_WU();
switch (info->substate_id) {
switch (substate_id) {
case 0:
LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY);
break;
@ -61,22 +61,24 @@ __weak void pm_power_state_set(struct pm_state_info *info)
LL_PWR_SetPowerMode(LL_PWR_MODE_SHUTDOWN);
break;
default:
LOG_DBG("Unsupported power substate-id %u", info->substate_id);
LOG_DBG("Unsupported power substate-id %u", substate_id);
return;
}
LL_LPM_EnableDeepSleep();
k_cpu_idle();
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
LL_LPM_DisableSleepOnExit();
LL_LPM_EnableSleep();
@ -87,7 +89,7 @@ __weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
/* Nothing to do. */
break;
default:
LOG_DBG("Unsupported power substate-id %u", info->state);
LOG_DBG("Unsupported power substate-id %u", state);
break;
}

View file

@ -57,12 +57,14 @@ extern PowerCC26X2_ModuleState PowerCC26X2_module;
*/
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
uint32_t modeVIMS;
uint32_t constraints;
LOG_DBG("SoC entering power state %d", info->state);
LOG_DBG("SoC entering power state %d", state);
/* Switch to using PRIMASK instead of BASEPRI register, since
* we are only able to wake up from standby while using PRIMASK.
@ -72,7 +74,7 @@ __weak void pm_power_state_set(struct pm_state_info *info)
/* Set BASEPRI to 0 */
irq_unlock(0);
switch (info->state) {
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
/* query the declared constraints */
constraints = Power_getConstraintMask();
@ -111,16 +113,19 @@ __weak void pm_power_state_set(struct pm_state_info *info)
Power_shutdown(0, 0);
break;
default:
LOG_DBG("Unsupported power state %u", info->state);
LOG_DBG("Unsupported power state %u", state);
break;
}
LOG_DBG("SoC leaving power state %d", info->state);
LOG_DBG("SoC leaving power state %d", state);
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
/*
* System is now in active mode. Reenable interrupts which were disabled
* when OS started idling code.

View file

@ -17,9 +17,11 @@ static void ite_power_soc_deep_doze(void)
}
/* Invoke Low Power/System Off specific Tasks */
__weak void pm_power_state_set(struct pm_state_info *info)
__weak void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
switch (info->state) {
ARG_UNUSED(substate_id);
switch (state) {
/* Deep doze mode */
case PM_STATE_STANDBY:
ite_power_soc_deep_doze();
@ -30,7 +32,8 @@ __weak void pm_power_state_set(struct pm_state_info *info)
}
/* Handle SOC specific activity after Low Power Mode Exit */
__weak void pm_power_state_exit_post_ops(struct pm_state_info *info)
__weak void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(info);
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
}

View file

@ -105,10 +105,10 @@ static void pm_resume_devices(void)
static inline void pm_exit_pos_ops(struct pm_state_info *info)
{
extern __weak void
pm_power_state_exit_post_ops(struct pm_state_info *info);
pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id);
if (pm_power_state_exit_post_ops != NULL) {
pm_power_state_exit_post_ops(info);
pm_power_state_exit_post_ops(info->state, info->substate_id);
} else {
/*
* This function is supposed to be overridden to do SoC or
@ -124,10 +124,10 @@ static inline void pm_exit_pos_ops(struct pm_state_info *info)
static inline void pm_state_set(struct pm_state_info *info)
{
extern __weak void
pm_power_state_set(struct pm_state_info *info);
pm_power_state_set(enum pm_state state, uint8_t substate_id);
if (pm_power_state_set != NULL) {
pm_power_state_set(info);
pm_power_state_set(info->state, info->substate_id);
}
}

View file

@ -16,11 +16,11 @@ static const struct device *dev;
static uint8_t sleep_count;
void pm_power_state_set(struct pm_state_info *info)
void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(info);
ARG_UNUSED(substate_id);
enum pm_device_state state;
enum pm_device_state dev_state;
switch (sleep_count) {
case 1:
@ -28,10 +28,10 @@ void pm_power_state_set(struct pm_state_info *info)
* Devices are suspended before SoC on PM_STATE_SUSPEND_TO_RAM, that is why
* we can check the device state here.
*/
zassert_equal(info->state, PM_STATE_SUSPEND_TO_RAM, "Wrong system state");
zassert_equal(state, PM_STATE_SUSPEND_TO_RAM, "Wrong system state");
(void)pm_device_state_get(dev, &state);
zassert_equal(state, PM_DEVICE_STATE_SUSPENDED, "Wrong device state");
(void)pm_device_state_get(dev, &dev_state);
zassert_equal(dev_state, PM_DEVICE_STATE_SUSPENDED, "Wrong device state");
/* Enable wakeup source. Next time the system is called
* to sleep, this device will still be active.
@ -39,21 +39,24 @@ void pm_power_state_set(struct pm_state_info *info)
(void)pm_device_wakeup_enable((struct device *)dev, true);
break;
case 2:
zassert_equal(info->state, PM_STATE_SUSPEND_TO_RAM, "Wrong system state");
zassert_equal(state, PM_STATE_SUSPEND_TO_RAM, "Wrong system state");
/* Second time this function is called, the system is asked to standby
* and devices were suspended.
*/
(void)pm_device_state_get(dev, &state);
zassert_equal(state, PM_DEVICE_STATE_ACTIVE, "Wrong device state");
(void)pm_device_state_get(dev, &dev_state);
zassert_equal(dev_state, PM_DEVICE_STATE_ACTIVE, "Wrong device state");
break;
default:
break;
}
}
void pm_power_state_exit_post_ops(struct pm_state_info *info)
void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
irq_unlock(0);
}

View file

@ -141,8 +141,11 @@ DEVICE_DT_DEFINE(DT_INST(2, test_device_pm), device_init,
void pm_power_state_set(struct pm_state_info *info)
void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
ARG_UNUSED(state);
enum pm_device_state device_power_state;
/* If testing device order this function does not need to anything */
@ -185,12 +188,15 @@ void pm_power_state_set(struct pm_state_info *info)
/* this function is called when system entering low power state, so
* parameter state should not be PM_STATE_ACTIVE
*/
zassert_false(info->state == PM_STATE_ACTIVE,
zassert_false(state == PM_STATE_ACTIVE,
"Entering low power state with a wrong parameter");
}
void pm_power_state_exit_post_ops(struct pm_state_info *info)
void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
/* pm_system_suspend is entered with irq locked
* unlock irq before leave pm_system_suspend
*/

View file

@ -30,21 +30,23 @@ BUILD_ASSERT(CONFIG_MP_NUM_CPUS == 2, "Invalid number of cpus");
static enum pm_state state_testing[2];
void pm_power_state_set(struct pm_state_info *info)
void pm_power_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
switch (state_testing[_current_cpu->id]) {
case PM_STATE_ACTIVE:
zassert_equal(PM_STATE_ACTIVE, info->state, NULL);
zassert_equal(PM_STATE_ACTIVE, state, NULL);
break;
case PM_STATE_RUNTIME_IDLE:
zassert_equal(PM_STATE_RUNTIME_IDLE, info->state, NULL);
zassert_equal(PM_STATE_RUNTIME_IDLE, state, NULL);
break;
case PM_STATE_SUSPEND_TO_IDLE:
zassert_equal(PM_STATE_SUSPEND_TO_IDLE, info->state, NULL);
zassert_equal(PM_STATE_SUSPEND_TO_IDLE, state, NULL);
break;
case PM_STATE_STANDBY:
zassert_equal(_current_cpu->id, 1U, NULL);
zassert_equal(PM_STATE_STANDBY, info->state, NULL);
zassert_equal(PM_STATE_STANDBY, state, NULL);
break;
default:
zassert_unreachable(NULL);
@ -52,8 +54,11 @@ void pm_power_state_set(struct pm_state_info *info)
}
}
void pm_power_state_exit_post_ops(struct pm_state_info *info)
void pm_power_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
/* pm_system_suspend is entered with irq locked
* unlock irq before leave pm_system_suspend
*/