diff --git a/include/pm/pm.h b/include/pm/pm.h index ae8951cb8ef..472adeab03f 100644 --- a/include/pm/pm.h +++ b/include/pm/pm.h @@ -77,7 +77,7 @@ struct pm_notifier { * @param info Power state which should be used in the ongoing * suspend operation. */ -bool pm_power_state_force(uint8_t cpu, struct pm_state_info info); +bool pm_power_state_force(uint8_t cpu, const struct pm_state_info *info); /** * @brief Register a power management notifier @@ -111,7 +111,7 @@ int pm_notifier_unregister(struct pm_notifier *notifier); * @param cpu CPU index. * @return next pm_state_info that will be used */ -struct pm_state_info pm_power_state_next_get(uint8_t cpu); +const struct pm_state_info *pm_power_state_next_get(uint8_t cpu); /** * @} @@ -182,7 +182,7 @@ bool pm_constraint_get(enum pm_state state); * @param info Power state which should be used in the ongoing * suspend operation. */ -void pm_power_state_set(struct pm_state_info info); +void pm_power_state_set(struct pm_state_info *info); /** * @brief Do any SoC or architecture specific post ops after sleep state exits. @@ -194,7 +194,7 @@ void pm_power_state_set(struct pm_state_info info); * * @param info Power state that the given cpu is leaving. */ -void pm_power_state_exit_post_ops(struct pm_state_info info); +void pm_power_state_exit_post_ops(struct pm_state_info *info); /** * @} @@ -212,7 +212,7 @@ void pm_power_state_exit_post_ops(struct pm_state_info info); #define pm_power_state_set(info) #define pm_power_state_exit_post_ops(info) #define pm_power_state_next_get(cpu) \ - ((struct pm_state_info){PM_STATE_ACTIVE, 0, 0}) + (&(struct pm_state_info){PM_STATE_ACTIVE, 0, 0}) #endif /* CONFIG_PM */ diff --git a/samples/boards/nrf/system_off/src/main.c b/samples/boards/nrf/system_off/src/main.c index 91219edc19a..4ae20b809b6 100644 --- a/samples/boards/nrf/system_off/src/main.c +++ b/samples/boards/nrf/system_off/src/main.c @@ -91,7 +91,7 @@ void main(void) * controlled delay. Here we need to override that, then * force entry to deep sleep on any delay. */ - pm_power_state_force(0u, (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); + pm_power_state_force(0u, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); printk("ERROR: System off failed\n"); while (true) { diff --git a/samples/boards/stm32/power_mgmt/stm32wb_ble/src/main.c b/samples/boards/stm32/power_mgmt/stm32wb_ble/src/main.c index 911c65b08bd..c96b5926fb6 100644 --- a/samples/boards/stm32/power_mgmt/stm32wb_ble/src/main.c +++ b/samples/boards/stm32/power_mgmt/stm32wb_ble/src/main.c @@ -118,5 +118,5 @@ void main(void) printk("Device shutdown\n"); - pm_power_state_force(0u, (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); + pm_power_state_force(0u, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); } diff --git a/samples/boards/ti/cc13x2_cc26x2/system_off/src/main.c b/samples/boards/ti/cc13x2_cc26x2/system_off/src/main.c index 0c3bdf270fe..4b6fef43394 100644 --- a/samples/boards/ti/cc13x2_cc26x2/system_off/src/main.c +++ b/samples/boards/ti/cc13x2_cc26x2/system_off/src/main.c @@ -67,7 +67,7 @@ void main(void) /* * Force the SOFT_OFF state. */ - pm_power_state_force(0u, (struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); + pm_power_state_force(0u, &(struct pm_state_info){PM_STATE_SOFT_OFF, 0, 0}); printk("ERROR: System off failed\n"); while (true) { diff --git a/soc/arm/microchip_mec/mec1501/power.c b/soc/arm/microchip_mec/mec1501/power.c index 98029ba2023..7a6f55564db 100644 --- a/soc/arm/microchip_mec/mec1501/power.c +++ b/soc/arm/microchip_mec/mec1501/power.c @@ -101,9 +101,9 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: z_power_soc_sleep(); break; @@ -123,9 +123,9 @@ __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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: case PM_STATE_SUSPEND_TO_RAM: __set_PRIMASK(0); diff --git a/soc/arm/nordic_nrf/nrf51/power.c b/soc/arm/nordic_nrf/nrf51/power.c index dd76e3b06e9..cd53fe284a4 100644 --- a/soc/arm/nordic_nrf/nrf51/power.c +++ b/soc/arm/nordic_nrf/nrf51/power.c @@ -11,27 +11,27 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->state); break; } diff --git a/soc/arm/nordic_nrf/nrf52/power.c b/soc/arm/nordic_nrf/nrf52/power.c index dd76e3b06e9..cd53fe284a4 100644 --- a/soc/arm/nordic_nrf/nrf52/power.c +++ b/soc/arm/nordic_nrf/nrf52/power.c @@ -11,27 +11,27 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->state); break; } diff --git a/soc/arm/nordic_nrf/nrf53/power.c b/soc/arm/nordic_nrf/nrf53/power.c index 38ee3d439aa..25305c38c87 100644 --- a/soc/arm/nordic_nrf/nrf53/power.c +++ b/soc/arm/nordic_nrf/nrf53/power.c @@ -13,27 +13,27 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->state); break; } diff --git a/soc/arm/nordic_nrf/nrf91/power.c b/soc/arm/nordic_nrf/nrf91/power.c index a13631dd2ef..08dba04958d 100644 --- a/soc/arm/nordic_nrf/nrf91/power.c +++ b/soc/arm/nordic_nrf/nrf91/power.c @@ -12,27 +12,27 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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", info->state); break; } diff --git a/soc/arm/nuvoton_npcx/common/power.c b/soc/arm/nuvoton_npcx/common/power.c index 01bc9a21c8c..c3fa6697d66 100644 --- a/soc/arm/nuvoton_npcx/common/power.c +++ b/soc/arm/nuvoton_npcx/common/power.c @@ -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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power state %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power state %u", info->state); } else { - switch (info.substate_id) { + switch (info->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); + info->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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power state %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power state %u", info->state); } else { - switch (info.substate_id) { + switch (info->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); + info->substate_id); break; } } diff --git a/soc/arm/nxp_imx/rt/power_rt11xx.c b/soc/arm/nxp_imx/rt/power_rt11xx.c index 4aaffc218ca..643a77c7721 100644 --- a/soc/arm/nxp_imx/rt/power_rt11xx.c +++ b/soc/arm/nxp_imx/rt/power_rt11xx.c @@ -283,11 +283,11 @@ 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(struct pm_state_info *info) { /* 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(info->substate_id); + gpc_cpu_mode_t gpc_mode = IMX_GPC_MODE(info->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,7 +304,7 @@ __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(struct pm_state_info *info) { ARG_UNUSED(info); /* Clear PRIMASK */ diff --git a/soc/arm/nxp_imx/rt6xx/power.c b/soc/arm/nxp_imx/rt6xx/power.c index 1051453d269..fe86179a393 100644 --- a/soc/arm/nxp_imx/rt6xx/power.c +++ b/soc/arm/nxp_imx/rt6xx/power.c @@ -22,7 +22,7 @@ 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(struct pm_state_info *info) { /* FIXME: When this function is entered the Kernel has disabled * interrupts using BASEPRI register. This is incorrect as it prevents @@ -36,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 (info->state) { case PM_STATE_RUNTIME_IDLE: POWER_EnterSleep(); break; @@ -44,13 +44,13 @@ __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", info->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(struct pm_state_info *info) { ARG_UNUSED(info); diff --git a/soc/arm/nxp_kinetis/ke1xf/power.c b/soc/arm/nxp_kinetis/ke1xf/power.c index d456597ba78..2e72d342c1c 100644 --- a/soc/arm/nxp_kinetis/ke1xf/power.c +++ b/soc/arm/nxp_kinetis/ke1xf/power.c @@ -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(struct pm_state_info *info) { - switch (info.state) { + switch (info->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(info->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", info->state); break; } } -__weak void pm_power_state_exit_post_ops(struct pm_state_info info) +__weak void pm_power_state_exit_post_ops(struct pm_state_info *info) { ARG_UNUSED(info); - if (info.state == PM_STATE_SUSPEND_TO_IDLE) { + if (info->state == PM_STATE_SUSPEND_TO_IDLE) { /* Disable deep sleep upon exit */ SCB->SCR &= ~(SCB_SCR_SLEEPDEEP_Msk); } diff --git a/soc/arm/silabs_exx32/common/soc_power.c b/soc/arm/silabs_exx32/common/soc_power.c index 4f77d16745b..d2bf190b576 100644 --- a/soc/arm/silabs_exx32/common/soc_power.c +++ b/soc/arm/silabs_exx32/common/soc_power.c @@ -18,9 +18,9 @@ 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(struct pm_state_info *info) { - LOG_DBG("SoC entering power state %d", info.state); + LOG_DBG("SoC entering power state %d", info->state); /* FIXME: When this function is entered the Kernel has disabled * interrupts using BASEPRI register. This is incorrect as it prevents @@ -34,7 +34,7 @@ __weak void pm_power_state_set(struct pm_state_info info) /* Set BASEPRI to 0 */ irq_unlock(0); - switch (info.state) { + switch (info->state) { case PM_STATE_RUNTIME_IDLE: EMU_EnterEM1(); break; @@ -45,18 +45,18 @@ __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", info->state); break; } - LOG_DBG("SoC leaving power state %d", info.state); + LOG_DBG("SoC leaving power state %d", info->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(struct pm_state_info *info) { ARG_UNUSED(info); } diff --git a/soc/arm/st_stm32/stm32g0/power.c b/soc/arm/st_stm32/stm32g0/power.c index 4b82fa7cff2..536c0060b77 100644 --- a/soc/arm/st_stm32/stm32g0/power.c +++ b/soc/arm/st_stm32/stm32g0/power.c @@ -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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power state %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power state %u", info->state); return; } - switch (info.substate_id) { + switch (info->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); + info->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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power substate %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power substate %u", info->state); } else { - switch (info.substate_id) { + switch (info->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); + info->substate_id); break; } /* need to restore the clock */ diff --git a/soc/arm/st_stm32/stm32l0/power.c b/soc/arm/st_stm32/stm32l0/power.c index 7f98c465aa6..fff9187203e 100644 --- a/soc/arm/st_stm32/stm32l0/power.c +++ b/soc/arm/st_stm32/stm32l0/power.c @@ -28,9 +28,9 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: LL_RCC_SetClkAfterWakeFromStop(RCC_STOP_WAKEUPCLOCK_SELECTED); LL_PWR_ClearFlag_WU(); @@ -46,15 +46,15 @@ __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", info->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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: LL_LPM_DisableSleepOnExit(); LL_LPM_EnableSleep(); @@ -67,7 +67,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", info->state); break; } diff --git a/soc/arm/st_stm32/stm32l4/power.c b/soc/arm/st_stm32/stm32l4/power.c index dac694aeddc..6220802b190 100644 --- a/soc/arm/st_stm32/stm32l4/power.c +++ b/soc/arm/st_stm32/stm32l4/power.c @@ -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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power state %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power state %u", info->state); return; } - switch (info.substate_id) { + switch (info->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); + info->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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power substate-id %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power substate-id %u", info->state); } else { - switch (info.substate_id) { + switch (info->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); + info->substate_id); break; } /* need to restore the clock */ diff --git a/soc/arm/st_stm32/stm32l5/power.c b/soc/arm/st_stm32/stm32l5/power.c index 07f69e52aa3..b2d8abf33d4 100644 --- a/soc/arm/st_stm32/stm32l5/power.c +++ b/soc/arm/st_stm32/stm32l5/power.c @@ -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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power state %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power state %u", info->state); return; } - switch (info.substate_id) { + switch (info->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); + info->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(struct pm_state_info *info) { - if (info.state != PM_STATE_SUSPEND_TO_IDLE) { - LOG_DBG("Unsupported power substate-id %u", info.state); + if (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power substate-id %u", info->state); } else { - switch (info.substate_id) { + switch (info->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); + info->substate_id); break; } /* need to restore the clock */ diff --git a/soc/arm/st_stm32/stm32u5/power.c b/soc/arm/st_stm32/stm32u5/power.c index 7a6013ab1ca..be9e7211af0 100644 --- a/soc/arm/st_stm32/stm32u5/power.c +++ b/soc/arm/st_stm32/stm32u5/power.c @@ -62,22 +62,22 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: - set_mode_stop(info.substate_id); + set_mode_stop(info->substate_id); break; case PM_STATE_STANDBY: /* To be tested */ - set_mode_standby(info.substate_id); + set_mode_standby(info->substate_id); break; case PM_STATE_SOFT_OFF: - set_mode_shutdown(info.substate_id); + set_mode_shutdown(info->substate_id); break; default: - LOG_DBG("Unsupported power state %u", info.state); + LOG_DBG("Unsupported power state %u", info->state); return; } @@ -89,16 +89,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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: - if (info.substate_id <= 3) { + if (info->substate_id <= 3) { LL_LPM_DisableSleepOnExit(); LL_LPM_EnableSleep(); } else { LOG_DBG("Unsupported power substate-id %u", - info.substate_id); + info->substate_id); } case PM_STATE_STANDBY: /* To be tested */ @@ -113,7 +113,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", info->state); break; } /* need to restore the clock */ diff --git a/soc/arm/st_stm32/stm32wb/power.c b/soc/arm/st_stm32/stm32wb/power.c index bace9fe7bb8..7ca013e1cdd 100644 --- a/soc/arm/st_stm32/stm32wb/power.c +++ b/soc/arm/st_stm32/stm32wb/power.c @@ -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(struct pm_state_info *info) { - if (info.state == PM_STATE_SOFT_OFF) { + if (info->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 (info->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 (info->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", info->substate_id); return; } } else { - LOG_DBG("Unsupported power state %u", info.state); + LOG_DBG("Unsupported power state %u", info->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(struct pm_state_info *info) { /* 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 (info->state != PM_STATE_SUSPEND_TO_IDLE) { + LOG_DBG("Unsupported power state %u", info->state); } else { - switch (info.substate_id) { + switch (info->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); + info->substate_id); break; } /* need to restore the clock */ diff --git a/soc/arm/st_stm32/stm32wl/power.c b/soc/arm/st_stm32/stm32wl/power.c index 09dd3642025..b8123d8e2e6 100644 --- a/soc/arm/st_stm32/stm32wl/power.c +++ b/soc/arm/st_stm32/stm32wl/power.c @@ -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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: LL_RCC_SetClkAfterWakeFromStop(RCC_STOP_WAKEUPCLOCK_SELECTED); LL_PWR_ClearFlag_WU(); - switch (info.substate_id) { + switch (info->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", info->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 (info->substate_id) { case 0: LL_PWR_SetPowerMode(LL_PWR_MODE_STANDBY); break; @@ -61,22 +61,22 @@ __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", info->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", info->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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: LL_LPM_DisableSleepOnExit(); LL_LPM_EnableSleep(); @@ -87,7 +87,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", info->state); break; } diff --git a/soc/arm/ti_simplelink/cc13x2_cc26x2/power.c b/soc/arm/ti_simplelink/cc13x2_cc26x2/power.c index eb2300b1ea9..8611f28ffe3 100644 --- a/soc/arm/ti_simplelink/cc13x2_cc26x2/power.c +++ b/soc/arm/ti_simplelink/cc13x2_cc26x2/power.c @@ -57,12 +57,12 @@ 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(struct pm_state_info *info) { uint32_t modeVIMS; uint32_t constraints; - LOG_DBG("SoC entering power state %d", info.state); + LOG_DBG("SoC entering power state %d", info->state); /* Switch to using PRIMASK instead of BASEPRI register, since * we are only able to wake up from standby while using PRIMASK. @@ -72,7 +72,7 @@ __weak void pm_power_state_set(struct pm_state_info info) /* Set BASEPRI to 0 */ irq_unlock(0); - switch (info.state) { + switch (info->state) { case PM_STATE_SUSPEND_TO_IDLE: /* query the declared constraints */ constraints = Power_getConstraintMask(); @@ -111,15 +111,15 @@ __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", info->state); break; } - LOG_DBG("SoC leaving power state %d", info.state); + LOG_DBG("SoC leaving power state %d", info->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(struct pm_state_info *info) { /* * System is now in active mode. Reenable interrupts which were disabled diff --git a/soc/riscv/riscv-ite/common/power.c b/soc/riscv/riscv-ite/common/power.c index a657fffea25..8445f111309 100644 --- a/soc/riscv/riscv-ite/common/power.c +++ b/soc/riscv/riscv-ite/common/power.c @@ -17,9 +17,9 @@ 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(struct pm_state_info *info) { - switch (info.state) { + switch (info->state) { /* Deep doze mode */ case PM_STATE_STANDBY: ite_power_soc_deep_doze(); @@ -30,7 +30,7 @@ __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(struct pm_state_info *info) { ARG_UNUSED(info); } diff --git a/subsys/pm/pm.c b/subsys/pm/pm.c index f812a245334..fcbbca244f8 100644 --- a/subsys/pm/pm.c +++ b/subsys/pm/pm.c @@ -102,10 +102,10 @@ static void pm_resume_devices(void) } #endif /* CONFIG_PM_DEVICE */ -static inline void exit_pos_ops(struct pm_state_info info) +static inline void 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(struct pm_state_info *info); if (pm_power_state_exit_post_ops != NULL) { pm_power_state_exit_post_ops(info); @@ -121,10 +121,10 @@ static inline void exit_pos_ops(struct pm_state_info info) } } -static inline void pm_state_set(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(struct pm_state_info *info); if (pm_power_state_set != NULL) { pm_power_state_set(info); @@ -173,23 +173,23 @@ void pm_system_resume(void) * and it may schedule another thread. */ if (atomic_test_and_clear_bit(z_post_ops_required, id)) { - exit_pos_ops(z_cpus_pm_state[id]); + exit_pos_ops(&z_cpus_pm_state[id]); pm_state_notify(false); z_cpus_pm_state[id] = (struct pm_state_info){PM_STATE_ACTIVE, 0, 0}; } } -bool pm_power_state_force(uint8_t cpu, struct pm_state_info info) +bool pm_power_state_force(uint8_t cpu, const struct pm_state_info *info) { bool ret = false; - __ASSERT(info.state < PM_STATE_COUNT, - "Invalid power state %d!", info.state); + __ASSERT(info->state < PM_STATE_COUNT, + "Invalid power state %d!", info->state); if (!atomic_test_and_set_bit(z_cpus_pm_state_forced, cpu)) { - z_cpus_pm_state[cpu] = info; + z_cpus_pm_state[cpu] = *info; ret = true; } @@ -261,7 +261,7 @@ bool pm_system_suspend(int32_t ticks) /* Enter power state */ pm_state_notify(true); atomic_set_bit(z_post_ops_required, id); - pm_state_set(z_cpus_pm_state[id]); + pm_state_set(&z_cpus_pm_state[id]); pm_stats_stop(); /* Wake up sequence starts here */ @@ -303,7 +303,7 @@ int pm_notifier_unregister(struct pm_notifier *notifier) return ret; } -struct pm_state_info pm_power_state_next_get(uint8_t cpu) +const struct pm_state_info *pm_power_state_next_get(uint8_t cpu) { - return z_cpus_pm_state[cpu]; + return &z_cpus_pm_state[cpu]; } diff --git a/tests/subsys/pm/device_wakeup_api/src/main.c b/tests/subsys/pm/device_wakeup_api/src/main.c index 6cc8910fd2a..243f8b584b8 100644 --- a/tests/subsys/pm/device_wakeup_api/src/main.c +++ b/tests/subsys/pm/device_wakeup_api/src/main.c @@ -16,7 +16,7 @@ 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(struct pm_state_info *info) { ARG_UNUSED(info); @@ -28,7 +28,7 @@ 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(info->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"); @@ -39,7 +39,7 @@ 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(info->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. @@ -52,7 +52,7 @@ 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(struct pm_state_info *info) { irq_unlock(0); } diff --git a/tests/subsys/pm/power_mgmt/src/main.c b/tests/subsys/pm/power_mgmt/src/main.c index 8d053be4e7a..e2784af08ac 100644 --- a/tests/subsys/pm/power_mgmt/src/main.c +++ b/tests/subsys/pm/power_mgmt/src/main.c @@ -141,7 +141,7 @@ 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(struct pm_state_info *info) { enum pm_device_state device_power_state; @@ -185,11 +185,11 @@ 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(info->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(struct pm_state_info *info) { /* pm_system_suspend is entered with irq locked * unlock irq before leave pm_system_suspend diff --git a/tests/subsys/pm/power_mgmt_multicore/src/main.c b/tests/subsys/pm/power_mgmt_multicore/src/main.c index 8ff4b0e0155..979bb4f8a41 100644 --- a/tests/subsys/pm/power_mgmt_multicore/src/main.c +++ b/tests/subsys/pm/power_mgmt_multicore/src/main.c @@ -30,21 +30,21 @@ 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(struct pm_state_info *info) { switch (state_testing[_current_cpu->id]) { case PM_STATE_ACTIVE: - zassert_equal(PM_STATE_ACTIVE, info.state, NULL); + zassert_equal(PM_STATE_ACTIVE, info->state, NULL); break; case PM_STATE_RUNTIME_IDLE: - zassert_equal(PM_STATE_RUNTIME_IDLE, info.state, NULL); + zassert_equal(PM_STATE_RUNTIME_IDLE, info->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, info->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, info->state, NULL); break; default: zassert_unreachable(NULL); @@ -52,7 +52,7 @@ 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(struct pm_state_info *info) { /* pm_system_suspend is entered with irq locked * unlock irq before leave pm_system_suspend