blob: 8fe8557ba7ed4ba89afb811a0854dbfdec25beb8 [file] [log] [blame]
/*
* Copyright (c) 2024 Ambiq LLC
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <soc.h>
#include <zephyr/drivers/interrupt_controller/gic.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
#include <zephyr/pm/pm.h>
#include <zephyr/init.h>
/* ambiq-sdk includes */
#include <am_mcu_apollo.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);
__disable_irq();
__set_BASEPRI(0);
switch (state) {
case PM_STATE_SUSPEND_TO_IDLE:
/* Put ARM core to normal sleep. */
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_NORMAL);
break;
case PM_STATE_SUSPEND_TO_RAM:
/* Put ARM core to deep sleep. */
/* Cotex-m: power down, register value preserve.*/
/* Cache: power down*/
/* Flash: power down*/
/* Sram: retention*/
am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
break;
default:
LOG_DBG("Unsupported power state %u", state);
break;
}
}
/**
* @brief PM State Exit Post Operations
*
* For PM_STATE_SUSPEND_TO_IDLE:
* Nothing is needed after soc woken up.
*
* For PM_STATE_SUSPEND_TO_RAM:
* Flash, cache, sram automatically switch
* to active state on wake up
*
* @param state PM State
* @param substate_id Unused
*
*/
void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
{
ARG_UNUSED(substate_id);
__enable_irq();
irq_unlock(0);
}
static int ambiq_power_init(void)
{
am_hal_pwrctrl_mcu_memory_config_t sMcuMemCfg = {
.eCacheCfg = AM_HAL_PWRCTRL_CACHE_NONE,
.bRetainCache = true,
.eDTCMCfg = AM_HAL_PWRCTRL_DTCM_384K,
.eRetainDTCM = AM_HAL_PWRCTRL_DTCM_384K,
.bEnableNVM0 = true,
.bRetainNVM0 = false
};
am_hal_pwrctrl_sram_memcfg_t sSRAMCfg = {
.eSRAMCfg = AM_HAL_PWRCTRL_SRAM_ALL,
.eActiveWithMCU = AM_HAL_PWRCTRL_SRAM_NONE,
.eActiveWithGFX = AM_HAL_PWRCTRL_SRAM_NONE,
.eActiveWithDISP = AM_HAL_PWRCTRL_SRAM_NONE,
.eActiveWithDSP = AM_HAL_PWRCTRL_SRAM_NONE,
.eSRAMRetain = AM_HAL_PWRCTRL_SRAM_ALL
};
am_hal_pwrctrl_dsp_memory_config_t sDSPMemCfg = {
.bEnableICache = false,
.bRetainCache = false,
.bEnableRAM = false,
.bActiveRAM = false,
.bRetainRAM = false
};
am_hal_pwrctrl_mcu_memory_config(&sMcuMemCfg);
am_hal_pwrctrl_sram_config(&sSRAMCfg);
am_hal_pwrctrl_dsp_memory_config(AM_HAL_DSP0, &sDSPMemCfg);
am_hal_pwrctrl_periph_disable(AM_HAL_PWRCTRL_PERIPH_CRYPTO);
return 0;
}
SYS_INIT(ambiq_power_init, PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);