zephyr/soc/renesas/smartbond/da1469x/power.c

60 lines
1.2 KiB
C

/*
* Copyright (c) 2023 Renesas Electronics Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/init.h>
#include <zephyr/pm/pm.h>
#include <zephyr/logging/log.h>
#include <DA1469xAB.h>
#include <da1469x_clock.h>
#include <da1469x_sleep.h>
LOG_MODULE_DECLARE(soc, CONFIG_SOC_LOG_LEVEL);
void pm_state_set(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
switch (state) {
case PM_STATE_STANDBY:
/* We enter here with interrupts disabled by BASEPRI which prevents wfi from
* waking up on interrupts. Need to disable interrupts by PRIMASK instead and
* reset BASEPRI to 0.
*/
__disable_irq();
arch_irq_unlock(0);
da1469x_sleep();
break;
default:
LOG_DBG("Unsupported power state %u", state);
break;
}
}
void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(state);
ARG_UNUSED(substate_id);
if (state == PM_STATE_STANDBY) {
__enable_irq();
}
}
static int renesas_da1469x_pm_init(void)
{
static const struct da1469x_sleep_config sleep_cfg = {
.enable_xtal_on_wakeup = DT_NODE_HAS_STATUS(DT_NODELABEL(xtal32m), okay),
};
da1469x_sleep_config(&sleep_cfg);
return 0;
}
SYS_INIT(renesas_da1469x_pm_init, PRE_KERNEL_2, 2);