blob: 857b2f38078a70c7b14237fb00d7a65e68160f61 [file] [log] [blame]
/*
* Copyright (c) 2023 Nordic Semiconductor ASA
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/sys/poweroff.h>
#include <zephyr/toolchain.h>
#include <zephyr/drivers/retained_mem/nrf_retained_mem.h>
#if defined(CONFIG_SOC_SERIES_NRF51X) || defined(CONFIG_SOC_SERIES_NRF52X)
#include <hal/nrf_power.h>
#elif defined(CONFIG_SOC_SERIES_NRF54HX)
#include <power.h>
#else
#include <hal/nrf_regulators.h>
#endif
#if defined(CONFIG_SOC_SERIES_NRF54LX)
#include <helpers/nrfx_reset_reason.h>
#endif
#if defined(CONFIG_HAS_NORDIC_RAM_CTRL)
#include <helpers/nrfx_ram_ctrl.h>
#endif
void z_sys_poweroff(void)
{
#if defined(CONFIG_HAS_NORDIC_RAM_CTRL)
uint8_t *ram_start;
size_t ram_size;
#if defined(NRF_MEMORY_RAM_BASE)
ram_start = (uint8_t *)NRF_MEMORY_RAM_BASE;
#else
ram_start = (uint8_t *)NRF_MEMORY_RAM0_BASE;
#endif
ram_size = 0;
#if defined(NRF_MEMORY_RAM_SIZE)
ram_size += NRF_MEMORY_RAM_SIZE;
#endif
#if defined(NRF_MEMORY_RAM0_SIZE)
ram_size += NRF_MEMORY_RAM0_SIZE;
#endif
#if defined(NRF_MEMORY_RAM1_SIZE)
ram_size += NRF_MEMORY_RAM1_SIZE;
#endif
#if defined(NRF_MEMORY_RAM2_SIZE)
ram_size += NRF_MEMORY_RAM2_SIZE;
#endif
/* Disable retention for all memory blocks */
nrfx_ram_ctrl_retention_enable_set(ram_start, ram_size, false);
#endif /* defined(CONFIG_HAS_NORDIC_RAM_CTRL) */
#if defined(CONFIG_RETAINED_MEM_NRF_RAM_CTRL)
/* Restore retention for retained_mem driver regions defined in devicetree */
(void)z_nrf_retained_mem_retention_apply();
#endif
#if defined(CONFIG_SOC_SERIES_NRF54LX)
nrfx_reset_reason_clear(UINT32_MAX);
#endif
#if defined(CONFIG_SOC_SERIES_NRF51X) || defined(CONFIG_SOC_SERIES_NRF52X)
nrf_power_system_off(NRF_POWER);
#elif defined(CONFIG_SOC_SERIES_NRF54HX)
nrf_poweroff();
#else
nrf_regulators_system_off(NRF_REGULATORS);
#endif
CODE_UNREACHABLE;
}