diff --git a/dts/arm/nuvoton/m2l31x.dtsi b/dts/arm/nuvoton/m2l31x.dtsi index 1dd45305500..a0f51195453 100644 --- a/dts/arm/nuvoton/m2l31x.dtsi +++ b/dts/arm/nuvoton/m2l31x.dtsi @@ -48,6 +48,7 @@ clk-pclkdiv = <(NUMAKER_CLK_PCLKDIV_APB0DIV_DIV2 | NUMAKER_CLK_PCLKDIV_APB1DIV_DIV2)>; core-clock = ; + powerdown-mode = ; pcc: peripheral-clock-controller { compatible = "nuvoton,numaker-pcc"; diff --git a/include/zephyr/dt-bindings/clock/numaker_m2l31x_clock.h b/include/zephyr/dt-bindings/clock/numaker_m2l31x_clock.h index fab7f656e4f..85f411cfad9 100644 --- a/include/zephyr/dt-bindings/clock/numaker_m2l31x_clock.h +++ b/include/zephyr/dt-bindings/clock/numaker_m2l31x_clock.h @@ -271,4 +271,17 @@ #define NUMAKER_LPADC0_MODULE 0xB5431218 #define NUMAKER_OPA_MODULE 0xA000001B +#define NUMAKER_CLK_PMUCTL_PDMSEL_PD 0x00000000 +#define NUMAKER_CLK_PMUCTL_PDMSEL_NPD0 0x00000000 +#define NUMAKER_CLK_PMUCTL_PDMSEL_NPD1 0x00000001 +#define NUMAKER_CLK_PMUCTL_PDMSEL_NPD2 0x00000002 +#define NUMAKER_CLK_PMUCTL_PDMSEL_NPD3 0x00000003 +#define NUMAKER_CLK_PMUCTL_PDMSEL_NPD4 0x00000004 +#define NUMAKER_CLK_PMUCTL_PDMSEL_NPD5 0x00000005 +#define NUMAKER_CLK_PMUCTL_PDMSEL_SPD0 0x00000008 +#define NUMAKER_CLK_PMUCTL_PDMSEL_SPD1 0x00000009 +#define NUMAKER_CLK_PMUCTL_PDMSEL_SPD2 0x0000000A +#define NUMAKER_CLK_PMUCTL_PDMSEL_DPD0 0x0000000C +#define NUMAKER_CLK_PMUCTL_PDMSEL_DPD1 0x0000000D + #endif diff --git a/soc/nuvoton/numaker/m2l31x/CMakeLists.txt b/soc/nuvoton/numaker/m2l31x/CMakeLists.txt index c1295bf59ad..6466b0b75e1 100644 --- a/soc/nuvoton/numaker/m2l31x/CMakeLists.txt +++ b/soc/nuvoton/numaker/m2l31x/CMakeLists.txt @@ -6,4 +6,6 @@ zephyr_sources(soc.c) zephyr_include_directories(.) +zephyr_library_sources_ifdef(CONFIG_POWEROFF poweroff.c) + set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm/cortex_m/scripts/linker.ld CACHE INTERNAL "") diff --git a/soc/nuvoton/numaker/m2l31x/Kconfig b/soc/nuvoton/numaker/m2l31x/Kconfig index 58d30415e12..350913a3435 100644 --- a/soc/nuvoton/numaker/m2l31x/Kconfig +++ b/soc/nuvoton/numaker/m2l31x/Kconfig @@ -8,6 +8,7 @@ config SOC_SERIES_M2L31X select CPU_CORTEX_M_HAS_SYSTICK select CPU_CORTEX_M_HAS_VTOR select CPU_HAS_ARM_MPU + select HAS_POWEROFF config SOC_M2L31XXX select HAS_NUMAKER_HAL diff --git a/soc/nuvoton/numaker/m2l31x/poweroff.c b/soc/nuvoton/numaker/m2l31x/poweroff.c new file mode 100644 index 00000000000..94233822154 --- /dev/null +++ b/soc/nuvoton/numaker/m2l31x/poweroff.c @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2024 Nuvoton Technology Corporation. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include + +void z_sys_poweroff(void) +{ + SYS_UnlockReg(); + + /* Clear all wake-up flag */ + CLK->PMUSTS |= CLK_PMUSTS_CLRWK_Msk; + + /* Select Power-down mode */ + CLK_SetPowerDownMode(DT_PROP_OR(DT_NODELABEL(scc), powerdown_mode, CLK_PMUCTL_PDMSEL_SPD0)); + + /* Enable RTC wake-up */ + CLK_ENABLE_RTCWK(); + + /* Enter to Power-down mode */ + CLK_PowerDown(); + + k_cpu_idle(); + + CODE_UNREACHABLE; +} diff --git a/soc/nuvoton/numaker/m2l31x/soc.c b/soc/nuvoton/numaker/m2l31x/soc.c index e766b27cda9..f3274504bb2 100644 --- a/soc/nuvoton/numaker/m2l31x/soc.c +++ b/soc/nuvoton/numaker/m2l31x/soc.c @@ -16,6 +16,9 @@ void z_arm_platform_init(void) /* Unlock protected registers */ SYS_UnlockReg(); + /* Release I/O hold status */ + CLK->IOPDCTL = 1; + /* * ------------------- * Init System Clock