Skip to content

Commit 3114d77

Browse files
ZhaoxiangJinnashif
authored andcommitted
soc: nxp/mcxn: Add power management support for MCXN236
Add power management support for MCXN/MCXN236. Signed-off-by: Zhaoxiang Jin <Zhaoxiang.Jin_1@nxp.com>
1 parent 999e3ab commit 3114d77

File tree

4 files changed

+90
-0
lines changed

4 files changed

+90
-0
lines changed

soc/nxp/mcx/mcxn/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,5 @@ set(SOC_LINKER_SCRIPT ${ZEPHYR_BASE}/include/zephyr/arch/arm/cortex_m/scripts/li
3737

3838
# Build the SoC P-state setter implementation for CPUFreq when selected
3939
zephyr_library_sources_ifdef(CONFIG_CPU_FREQ_PSTATE_SET_SOC cpu_freq_scale.c)
40+
41+
zephyr_sources_ifdef(CONFIG_PM power.c)

soc/nxp/mcx/mcxn/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ config SOC_MCXN236
4444
select SOC_RESET_HOOK
4545
select ARM_TRUSTZONE_M
4646
select HAS_CPU_FREQ
47+
select HAS_PM
4748

4849
if SOC_FAMILY_MCXN
4950

soc/nxp/mcx/mcxn/Kconfig.defconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,11 @@ config FLASH_FILL_BUFFER_SIZE
3737
config I2S_HAS_PLL_SETTING
3838
default n
3939

40+
if PM
41+
42+
configdefault CORTEX_M_SYSTICK_RESET_BY_LPM
43+
default y
44+
45+
endif # PM
46+
4047
endif # SOC_FAMILY_MCXN

soc/nxp/mcx/mcxn/power.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright 2025 NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr/pm/pm.h>
8+
#include <zephyr/device.h>
9+
#include <fsl_cmc.h>
10+
#include <fsl_spc.h>
11+
#include <fsl_wuu.h>
12+
13+
#define WUU_WAKEUP_LPTMR0_IDX 6U
14+
#define MCXN_WAKEUP_DELAY DT_PROP_OR(DT_NODELABEL(spc), wakeup_delay, 0)
15+
#define MCXN_WUU_ADDR (WUU_Type *)DT_REG_ADDR(DT_INST(0, nxp_wuu))
16+
#define MCXN_CMC_ADDR (CMC_Type *)DT_REG_ADDR(DT_INST(0, nxp_cmc))
17+
#define MCXN_SPC_ADDR (SPC_Type *)DT_REG_ADDR(DT_INST(0, nxp_spc))
18+
19+
static void pm_enter_hook(void)
20+
{
21+
CMC_SetPowerModeProtection(MCXN_CMC_ADDR, kCMC_AllowAllLowPowerModes);
22+
CMC_EnableDebugOperation(MCXN_CMC_ADDR, false);
23+
CMC_ConfigFlashMode(MCXN_CMC_ADDR, true, false);
24+
WUU_SetInternalWakeUpModulesConfig(MCXN_WUU_ADDR, WUU_WAKEUP_LPTMR0_IDX,
25+
kWUU_InternalModuleInterrupt);
26+
}
27+
28+
__weak void pm_state_set(enum pm_state state, uint8_t substate_id)
29+
{
30+
pm_enter_hook();
31+
32+
__enable_irq();
33+
__set_BASEPRI(0);
34+
35+
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
36+
37+
switch (state) {
38+
case PM_STATE_RUNTIME_IDLE:
39+
CMC_SetClockMode(MCXN_CMC_ADDR, kCMC_GateCoreClock);
40+
CMC_SetMAINPowerMode(MCXN_CMC_ADDR, kCMC_ActiveOrSleepMode);
41+
CMC_SetWAKEPowerMode(MCXN_CMC_ADDR, kCMC_ActiveOrSleepMode);
42+
__WFI();
43+
break;
44+
45+
case PM_STATE_SUSPEND_TO_IDLE:
46+
CMC_SetClockMode(MCXN_CMC_ADDR, kCMC_GateAllSystemClocksEnterLowPowerMode);
47+
CMC_SetMAINPowerMode(MCXN_CMC_ADDR, kCMC_DeepSleepMode);
48+
CMC_SetWAKEPowerMode(MCXN_CMC_ADDR, kCMC_DeepSleepMode);
49+
__WFI();
50+
break;
51+
52+
case PM_STATE_STANDBY:
53+
SPC_SetLowPowerWakeUpDelay(SPC0, MCXN_WAKEUP_DELAY);
54+
CMC_SetClockMode(MCXN_CMC_ADDR, kCMC_GateAllSystemClocksEnterLowPowerMode);
55+
CMC_SetMAINPowerMode(MCXN_CMC_ADDR, kCMC_PowerDownMode);
56+
CMC_SetWAKEPowerMode(MCXN_CMC_ADDR, kCMC_PowerDownMode);
57+
__WFI();
58+
break;
59+
60+
default:
61+
break;
62+
}
63+
}
64+
65+
__weak void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
66+
{
67+
ARG_UNUSED(state);
68+
ARG_UNUSED(substate_id);
69+
70+
if ((SCB->SCR & SCB_SCR_SLEEPDEEP_Msk) == SCB_SCR_SLEEPDEEP_Msk) {
71+
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
72+
}
73+
74+
__enable_irq();
75+
__ISB();
76+
77+
SPC_ClearPowerDomainLowPowerRequestFlag(MCXN_SPC_ADDR, kSPC_PowerDomain0);
78+
SPC_ClearPowerDomainLowPowerRequestFlag(MCXN_SPC_ADDR, kSPC_PowerDomain1);
79+
SPC_ClearLowPowerRequest(MCXN_SPC_ADDR);
80+
}

0 commit comments

Comments
 (0)