Skip to content

Commit 49e3fe1

Browse files
nika-nordicjukkar
authored andcommitted
[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]> (cherry picked from commit b0d7a30)
1 parent ee2e2b8 commit 49e3fe1

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

soc/nordic/common/poweroff.c

Lines changed: 38 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,45 @@
1718
#include <helpers/nrfx_reset_reason.h>
1819
#endif
1920

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

0 commit comments

Comments
 (0)