diff --git a/soc/nxp/rw/power.c b/soc/nxp/rw/power.c index fdc24019dd7..09734d2f505 100644 --- a/soc/nxp/rw/power.c +++ b/soc/nxp/rw/power.c @@ -7,6 +7,10 @@ #include #include #include +#if CONFIG_GPIO && (DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin0)) || \ + DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin1))) +#include +#endif #include "fsl_power.h" @@ -34,6 +38,9 @@ power_sleep_config_t slp_cfg; #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin0)) || DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin1)) pinctrl_soc_pin_t pin_cfg; +#if CONFIG_GPIO +const struct device *gpio; +#endif #endif #if DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin0)) @@ -206,6 +213,15 @@ __weak void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id) ARG_UNUSED(state); ARG_UNUSED(substate_id); +#if CONFIG_GPIO && (DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin0)) || \ + DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin1))) + if (state == PM_STATE_STANDBY) { + /* GPIO_0_24 & GPIO_0_25 are used for wakeup */ + uint32_t pins = PMU->WAKEUP_STATUS & + (PMU_WAKEUP_STATUS_PIN0_MASK | PMU_WAKEUP_STATUS_PIN1_MASK); + gpio_mcux_lpc_trigger_cb(gpio, (pins << 24)); + } +#endif /* Clear PRIMASK */ __enable_irq(); } @@ -247,4 +263,12 @@ void nxp_rw6xx_power_init(void) /* Clear the RTC wakeup bits */ POWER_ClearWakeupStatus(DT_IRQN(DT_NODELABEL(rtc))); POWER_DisableWakeup(DT_IRQN(DT_NODELABEL(rtc))); + +#if CONFIG_GPIO && (DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin0)) || \ + DT_NODE_HAS_STATUS_OKAY(DT_NODELABEL(pin1))) + gpio = DEVICE_DT_GET(DT_NODELABEL(hsgpio0)); + if (!device_is_ready(gpio)) { + return; + } +#endif }