Skip to content

Commit 75c4be1

Browse files
JasonLin-RealTekjhedberg
authored andcommitted
soc: realtek: ec: Implement power saving
Impelment RTS5912 power saving (heavy sleep) Remove the power state of "suspend_to_ram" Signed-off-by: Lin Yu-Cheng <[email protected]>
1 parent 83e350b commit 75c4be1

File tree

4 files changed

+24
-34
lines changed

4 files changed

+24
-34
lines changed

dts/arm/realtek/ec/rts5912.dtsi

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <zephyr/dt-bindings/pwm/pwm.h>
1313
#include <mem.h>
1414
#include <zephyr/dt-bindings/i2c/i2c.h>
15+
#include <freq.h>
1516

1617
/ {
1718
cpus {
@@ -21,7 +22,7 @@
2122
cpu0: cpu@0 {
2223
compatible = "arm,cortex-m33f";
2324
reg = <0>;
24-
cpu-power-states = <&idle &suspend_to_ram>;
25+
cpu-power-states = <&idle>;
2526
};
2627

2728
power-states {
@@ -31,11 +32,6 @@
3132
min-residency-us = <100000000>;
3233
};
3334

34-
suspend_to_ram: suspend_to_ram {
35-
compatible = "zephyr,power-state";
36-
power-state-name = "suspend-to-ram";
37-
min-residency-us = <250000000>;
38-
};
3935
};
4036
};
4137

soc/realtek/ec/rts5912/power.c

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,12 @@
1111
#include <reg/reg_system.h>
1212
#include "device_power.h"
1313

14-
#define RTS5912_SCCON_REG_BASE ((SYSTEM_Type *)(DT_REG_ADDR(DT_NODELABEL(sccon))))
15-
1614
static void realtek_WFI(void)
1715
{
1816
__DSB();
1917
__WFI();
2018
}
2119

22-
static void rts5912_light_sleep(void)
23-
{
24-
SYSTEM_Type *sys_reg = RTS5912_SCCON_REG_BASE;
25-
26-
before_rts5912_sleep();
27-
28-
sys_reg->SLPCTRL &= ~SYSTEM_SLPCTRL_SLPMDSEL_Msk;
29-
30-
realtek_WFI();
31-
32-
after_rts5912_sleep();
33-
}
34-
3520
static void rts5912_heavy_sleep(void)
3621
{
3722
SYSTEM_Type *sys_reg = RTS5912_SCCON_REG_BASE;
@@ -50,7 +35,7 @@ static void rts5912_heavy_sleep(void)
5035
sys_reg->SYSCLK |= SYSTEM_SYSCLK_SRC_Msk; /* Switch system clock to PLL */
5136
}
5237

53-
sys_reg->SLPCTRL |= SYSTEM_SLPCTRL_SLPMDSEL_Msk; /* Heavy Sleep mode */
38+
sys_reg->SLPCTRL |= (SYSTEM_SLPCTRL_SLPMDSEL_Msk | SYSTEM_SLPCTRL_GPIOWKEN_Msk);
5439

5540
realtek_WFI();
5641

@@ -69,9 +54,6 @@ void pm_state_set(enum pm_state state, uint8_t substate_id)
6954

7055
switch (state) {
7156
case PM_STATE_SUSPEND_TO_IDLE:
72-
rts5912_light_sleep();
73-
break;
74-
case PM_STATE_SUSPEND_TO_RAM:
7557
rts5912_heavy_sleep();
7658
break;
7759
default:
@@ -83,6 +65,4 @@ void pm_state_exit_post_ops(enum pm_state state, uint8_t substate_id)
8365
{
8466
ARG_UNUSED(state);
8567
ARG_UNUSED(substate_id);
86-
87-
irq_unlock(0);
8868
}

soc/realtek/ec/rts5912/reg/reg_system.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,4 +334,10 @@ typedef struct {
334334

335335
#define RTS5912_SCCON_REG_BASE ((SYSTEM_Type *)(DT_REG_ADDR(DT_NODELABEL(sccon))))
336336

337+
#define RTS5912_PUF_ADDRESS 0x40010800UL
338+
#define RTS5912_TRNG_OFFSET 0x600UL
339+
#define RTS5912_OTP_OFFSET 0x680UL
340+
#define RTS5912_CFG_PDSTB (RTS5912_PUF_ADDRESS + RTS5912_OTP_OFFSET + 0x0024UL)
341+
#define RTS5912_RNG_RUN (RTS5912_PUF_ADDRESS + RTS5912_TRNG_OFFSET + 0x0020UL)
342+
337343
#endif /* ZEPHYR_SOC_REALTEK_RTS5912_REG_SYSTEM_H */

soc/realtek/ec/rts5912/soc.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88
#include <zephyr/kernel.h>
99
#include <zephyr/device.h>
1010
#include <zephyr/init.h>
11+
#include <zephyr/pm/policy.h>
1112
#include <zephyr/logging/log.h>
1213
#include "debug_swj.h"
14+
#include <reg/reg_system.h>
1315

1416
LOG_MODULE_REGISTER(soc, CONFIG_SOC_LOG_LEVEL);
1517

@@ -28,15 +30,21 @@ bool z_arm_on_enter_cpu_idle(void)
2830
*/
2931
void soc_early_init_hook(void)
3032
{
31-
if (!IS_ENABLED(CONFIG_RTS5912_DEBUG_SWJ)) {
32-
return;
33-
}
34-
33+
SYSTEM_Type *sys_reg = RTS5912_SCCON_REG_BASE;
3534
int ret;
3635

3736
/* Apply device related preinit configuration */
38-
ret = swj_connector_init();
39-
if (ret < 0) {
40-
LOG_ERR("SWJ init failed");
37+
if (IS_ENABLED(CONFIG_RTS5912_DEBUG_SWJ)) {
38+
ret = swj_connector_init();
39+
if (ret < 0) {
40+
LOG_ERR("SWJ init failed %d", ret);
41+
}
42+
}
43+
44+
if (IS_ENABLED(CONFIG_PM)) {
45+
/* turn off TRNG/ OTP/ LDO3 power */
46+
sys_write32(0ul, RTS5912_RNG_RUN);
47+
sys_write32(0ul, RTS5912_CFG_PDSTB);
48+
sys_reg->LDOCTRL &= ~SYSTEM_LDOCTRL_LDO3EN_Msk;
4149
}
4250
}

0 commit comments

Comments
 (0)