Skip to content

Commit a18720b

Browse files
committed
[nrf fromlist] soc: nordic: poweroff: add retention management
RAM retention is disabled for all RAM blocks before entering System OFF to achieve lowest power consumption. RAM retention can still be enabled using retained_mem driver. Upstream PR #: 82262 Signed-off-by: Nikodem Kastelik <[email protected]>
1 parent 3f52447 commit a18720b

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

soc/nordic/common/poweroff.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <zephyr/sys/poweroff.h>
77
#include <zephyr/toolchain.h>
8+
#include <zephyr/drivers/retained_mem/nrf_retained_mem.h>
89

910
#if defined(CONFIG_SOC_SERIES_NRF51X) || defined(CONFIG_SOC_SERIES_NRF52X)
1011
#include <hal/nrf_power.h>
@@ -17,8 +18,43 @@
1718
#include <helpers/nrfx_reset_reason.h>
1819
#endif
1920

21+
#include <helpers/nrfx_ram_ctrl.h>
22+
2023
void z_sys_poweroff(void)
2124
{
25+
#if defined(CONFIG_HAS_NORDIC_RAM_CTRL)
26+
uint8_t *ram_start;
27+
size_t ram_size;
28+
29+
#if defined(NRF_MEMORY_RAM_BASE)
30+
ram_start = (uint8_t *)NRF_MEMORY_RAM_BASE;
31+
#else
32+
ram_start = (uint8_t *)NRF_MEMORY_RAM0_BASE;
33+
#endif
34+
35+
ram_size = 0;
36+
#if defined(NRF_MEMORY_RAM_SIZE)
37+
ram_size += NRF_MEMORY_RAM_SIZE;
38+
#endif
39+
#if defined(NRF_MEMORY_RAM0_SIZE)
40+
ram_size += NRF_MEMORY_RAM0_SIZE;
41+
#endif
42+
#if defined(NRF_MEMORY_RAM1_SIZE)
43+
ram_size += NRF_MEMORY_RAM1_SIZE;
44+
#endif
45+
#if defined(NRF_MEMORY_RAM2_SIZE)
46+
ram_size += NRF_MEMORY_RAM2_SIZE;
47+
#endif
48+
49+
/* Disable retention for all memory blocks */
50+
nrfx_ram_ctrl_retention_enable_set(ram_start, ram_size, false);
51+
#endif
52+
53+
#if defined(CONFIG_RETAINED_MEM_NRF_RAM_CTRL)
54+
/* Restore retention for retained_mem driver regions defined in devicetree */
55+
(void)z_nrf_retained_mem_retention_apply();
56+
#endif
57+
2258
#if defined(CONFIG_SOC_SERIES_NRF54LX)
2359
nrfx_reset_reason_clear(UINT32_MAX);
2460
#endif

0 commit comments

Comments
 (0)