| 
5 | 5 | 
 
  | 
6 | 6 | #include <zephyr/sys/poweroff.h>  | 
7 | 7 | #include <zephyr/toolchain.h>  | 
 | 8 | +#include <zephyr/drivers/retained_mem/nrf_retained_mem.h>  | 
8 | 9 | 
 
  | 
9 | 10 | #if defined(CONFIG_SOC_SERIES_NRF51X) || defined(CONFIG_SOC_SERIES_NRF52X)  | 
10 | 11 | #include <hal/nrf_power.h>  | 
 | 
17 | 18 | #include <helpers/nrfx_reset_reason.h>  | 
18 | 19 | #endif  | 
19 | 20 | 
 
  | 
 | 21 | +#if defined(CONFIG_HAS_NORDIC_RAM_CTRL)  | 
 | 22 | +#include <helpers/nrfx_ram_ctrl.h>  | 
 | 23 | +#endif  | 
 | 24 | + | 
20 | 25 | void z_sys_poweroff(void)  | 
21 | 26 | {  | 
 | 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 | + | 
22 | 60 | #if defined(CONFIG_SOC_SERIES_NRF54LX)  | 
23 | 61 | 	nrfx_reset_reason_clear(UINT32_MAX);  | 
24 | 62 | #endif  | 
 | 
0 commit comments