diff options
-rw-r--r-- | drivers/cpuidle/lpm-levels.c | 29 |
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) |