diff --git a/arch/risc-v/src/common/espressif/esp_idle.c b/arch/risc-v/src/common/espressif/esp_idle.c index 1d1384ab7d3ae..2d7d7e262dbb4 100644 --- a/arch/risc-v/src/common/espressif/esp_idle.c +++ b/arch/risc-v/src/common/espressif/esp_idle.c @@ -119,6 +119,10 @@ static void up_idlepm(void) /* Keep working in normal stage */ pm_changestate(PM_IDLE_DOMAIN, PM_NORMAL); + + /* Release the stay above: it only forces this one state change. */ + + pm_relax(PM_IDLE_DOMAIN, PM_NORMAL); newstate = PM_NORMAL; } @@ -158,32 +162,32 @@ static void up_idlepm(void) switch (newstate) { - case PM_NORMAL: - break; + case PM_NORMAL: + break; - case PM_IDLE: - break; + case PM_IDLE: + break; - case PM_STANDBY: - { - /* Enter Force-sleep mode */ + case PM_STANDBY: + { + /* Enter Force-sleep mode */ - esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + - CONFIG_PM_ALARM_NSEC / 1000); - } - break; + esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + + CONFIG_PM_ALARM_NSEC / 1000); + } + break; - case PM_SLEEP: - { - /* Enter Deep-sleep mode */ + case PM_SLEEP: + { + /* Enter Deep-sleep mode */ - esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + - CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); - } - break; + esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + + CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); + } + break; - default: - break; + default: + break; } } else diff --git a/arch/xtensa/src/esp32/esp32_idle.c b/arch/xtensa/src/esp32/esp32_idle.c index 65263a486c3b2..ed366e08cd877 100644 --- a/arch/xtensa/src/esp32/esp32_idle.c +++ b/arch/xtensa/src/esp32/esp32_idle.c @@ -135,6 +135,10 @@ static void esp32_idlepm(void) /* Keep working in normal stage */ pm_changestate(PM_IDLE_DOMAIN, PM_NORMAL); + + /* Release the stay above: it only forces this one state change. */ + + pm_relax(PM_IDLE_DOMAIN, PM_NORMAL); newstate = PM_NORMAL; } @@ -174,31 +178,31 @@ static void esp32_idlepm(void) switch (newstate) { - case PM_NORMAL: - break; + case PM_NORMAL: + break; - case PM_IDLE: - break; + case PM_IDLE: + break; - case PM_STANDBY: - { - /* Enter Force-sleep mode */ + case PM_STANDBY: + { + /* Enter Force-sleep mode */ - esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + - CONFIG_PM_ALARM_NSEC / 1000); - } - break; + esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + + CONFIG_PM_ALARM_NSEC / 1000); + } + break; - case PM_SLEEP: - { - /* Enter Deep-sleep mode */ + case PM_SLEEP: + { + /* Enter Deep-sleep mode */ - esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + - CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); - } + esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + + CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); + } - default: - break; + default: + break; } } else diff --git a/arch/xtensa/src/esp32s2/esp32s2_idle.c b/arch/xtensa/src/esp32s2/esp32s2_idle.c index 351943a84f362..99fd361a302a6 100644 --- a/arch/xtensa/src/esp32s2/esp32s2_idle.c +++ b/arch/xtensa/src/esp32s2/esp32s2_idle.c @@ -100,6 +100,10 @@ static void up_idlepm(void) /* Keep working in normal stage */ pm_changestate(PM_IDLE_DOMAIN, PM_NORMAL); + + /* Release the stay above: it only forces this one state change. */ + + pm_relax(PM_IDLE_DOMAIN, PM_NORMAL); newstate = PM_NORMAL; } @@ -139,31 +143,31 @@ static void up_idlepm(void) switch (newstate) { - case PM_NORMAL: - break; + case PM_NORMAL: + break; - case PM_IDLE: - break; + case PM_IDLE: + break; - case PM_STANDBY: - { - /* Enter Force-sleep mode */ + case PM_STANDBY: + { + /* Enter Force-sleep mode */ - esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + - CONFIG_PM_ALARM_NSEC / 1000); - } - break; + esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + + CONFIG_PM_ALARM_NSEC / 1000); + } + break; - case PM_SLEEP: - { - /* Enter Deep-sleep mode */ + case PM_SLEEP: + { + /* Enter Deep-sleep mode */ - esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + - CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); - } + esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + + CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); + } - default: - break; + default: + break; } } else diff --git a/arch/xtensa/src/esp32s3/esp32s3_idle.c b/arch/xtensa/src/esp32s3/esp32s3_idle.c index 2fd2f8533485b..7b4da12a3e37b 100644 --- a/arch/xtensa/src/esp32s3/esp32s3_idle.c +++ b/arch/xtensa/src/esp32s3/esp32s3_idle.c @@ -100,6 +100,10 @@ static void up_idlepm(void) /* Keep working in normal stage */ pm_changestate(PM_IDLE_DOMAIN, PM_NORMAL); + + /* Release the stay above: it only forces this one state change. */ + + pm_relax(PM_IDLE_DOMAIN, PM_NORMAL); newstate = PM_NORMAL; } @@ -139,31 +143,31 @@ static void up_idlepm(void) switch (newstate) { - case PM_NORMAL: - break; + case PM_NORMAL: + break; - case PM_IDLE: - break; + case PM_IDLE: + break; - case PM_STANDBY: - { - /* Enter Force-sleep mode */ + case PM_STANDBY: + { + /* Enter Force-sleep mode */ - esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + - CONFIG_PM_ALARM_NSEC / 1000); - } - break; + esp_pmstandby(CONFIG_PM_ALARM_SEC * 1000000 + + CONFIG_PM_ALARM_NSEC / 1000); + } + break; - case PM_SLEEP: - { - /* Enter Deep-sleep mode */ + case PM_SLEEP: + { + /* Enter Deep-sleep mode */ - esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + - CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); - } + esp_pmsleep(CONFIG_PM_SLEEP_WAKEUP_SEC * 1000000 + + CONFIG_PM_SLEEP_WAKEUP_NSEC / 1000); + } - default: - break; + default: + break; } } else @@ -228,9 +232,9 @@ void up_idle(void) __asm__ __volatile__ ("waiti 0"); # endif - /* Perform IDLE mode power management */ + /* Perform IDLE mode power management */ - up_idlepm(); + up_idlepm(); #endif /* CONFIG_SUPPRESS_INTERRUPTS || CONFIG_SUPPRESS_TIMER_INTS */ #ifdef CONFIG_ESP32S3_SPEED_UP_ISR