summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/cpuidle/lpm-levels.c29
1 files changed, 20 insertions, 9 deletions
diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c
index edd4ba9bc1b4..3e8dd9ed67e1 100644
--- a/drivers/cpuidle/lpm-levels.c
+++ b/drivers/cpuidle/lpm-levels.c
@@ -808,20 +808,31 @@ bool psci_enter_sleep(struct lpm_cluster *cluster, int idx, bool from_idle)
#elif defined(CONFIG_ARM_PSCI)
bool psci_enter_sleep(struct lpm_cluster *cluster, int idx, bool from_idle)
{
- int affinity_level = 0;
- int state_id = get_cluster_id(cluster, &affinity_level);
- int power_state = PSCI_POWER_STATE(cluster->cpu->levels[idx].is_reset);
-
- affinity_level = PSCI_AFFINITY_LEVEL(affinity_level);
if (!idx) {
+ stop_critical_timings();
wfi();
+ start_critical_timings();
return 1;
- }
+ } else {
+ int affinity_level = 0;
+ int state_id = get_cluster_id(cluster, &affinity_level);
+ int power_state =
+ PSCI_POWER_STATE(cluster->cpu->levels[idx].is_reset);
+ bool success = false;
- state_id |= (power_state | affinity_level
- | cluster->cpu->levels[idx].psci_id);
+ affinity_level = PSCI_AFFINITY_LEVEL(affinity_level);
+ state_id |= (power_state | affinity_level
+ | cluster->cpu->levels[idx].psci_id);
- return !cpu_suspend(state_id);
+ update_debug_pc_event(CPU_ENTER, state_id,
+ 0xdeaffeed, 0xdeaffeed, true);
+ stop_critical_timings();
+ success = !cpu_suspend(state_id);
+ start_critical_timings();
+ update_debug_pc_event(CPU_EXIT, state_id,
+ success, 0xdeaffeed, true);
+ return success;
+ }
}
#else
bool psci_enter_sleep(struct lpm_cluster *cluster, int idx, bool from_idle)