mirror of https://gitee.com/openkylin/linux.git
ARM: OMAP2+: Manage MPU state properly for omap_enter_idle_coupled()
Based on more testing, commit 8ca5ee624b4c ("ARM: OMAP2+: Restore MPU power domain if cpu_cluster_pm_enter() fails") is a poor fix for handling cpu_cluster_pm_enter() returned errors. We should not override the cpuidle states with a hardcoded PWRDM_POWER_ON value. Instead, we should use a configured idle state that does not cause the context to be lost. Otherwise we end up configuring a potentially improper state for the MPUSS. We also want to update the returned state index for the selected state. Let's just select the highest power idle state C1 to ensure no context loss is allowed on cpu_cluster_pm_enter() errors. With these changes we can now unconditionally call omap4_enter_lowpower() for WFI like we did earlier before commit55be2f5033
("ARM: OMAP2+: Handle errors for cpu_pm"). And we can return the selected state index. Fixes:8f04aea048
("ARM: OMAP2+: Restore MPU power domain if cpu_cluster_pm_enter() fails") Fixes:55be2f5033
("ARM: OMAP2+: Handle errors for cpu_pm") Signed-off-by: Tony Lindgren <tony@atomide.com>
This commit is contained in:
parent
3650b228f8
commit
294a3317be
|
@ -175,8 +175,11 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
|
||||||
if (mpuss_can_lose_context) {
|
if (mpuss_can_lose_context) {
|
||||||
error = cpu_cluster_pm_enter();
|
error = cpu_cluster_pm_enter();
|
||||||
if (error) {
|
if (error) {
|
||||||
omap_set_pwrdm_state(mpu_pd, PWRDM_POWER_ON);
|
index = 0;
|
||||||
goto cpu_cluster_pm_out;
|
cx = state_ptr + index;
|
||||||
|
pwrdm_set_logic_retst(mpu_pd, cx->mpu_logic_state);
|
||||||
|
omap_set_pwrdm_state(mpu_pd, cx->mpu_state);
|
||||||
|
mpuss_can_lose_context = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,7 +187,6 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,
|
||||||
omap4_enter_lowpower(dev->cpu, cx->cpu_state);
|
omap4_enter_lowpower(dev->cpu, cx->cpu_state);
|
||||||
cpu_done[dev->cpu] = true;
|
cpu_done[dev->cpu] = true;
|
||||||
|
|
||||||
cpu_cluster_pm_out:
|
|
||||||
/* Wakeup CPU1 only if it is not offlined */
|
/* Wakeup CPU1 only if it is not offlined */
|
||||||
if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {
|
if (dev->cpu == 0 && cpumask_test_cpu(1, cpu_online_mask)) {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue