arm, OMAP2: Use WFI for omap2_pm_idle()
arch_cpu_idle() is a very simple idle interface and exposes only a single idle state and is expected to not require RCU and not do any tracing/instrumentation. As such, omap2_pm_idle() is not a valid implementation. Replace it with a simple (shallow) omap2_do_wfi() call. Omap2 doesn't have a cpuidle driver; but adding one would be the recourse to (re)gain the other idle states. Suggested-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Ingo Molnar <mingo@kernel.org> Tested-by: Tony Lindgren <tony@atomide.com> Tested-by: Ulf Hansson <ulf.hansson@linaro.org> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Frederic Weisbecker <frederic@kernel.org> Link: https://lore.kernel.org/r/20230112195541.721697850@infradead.org
This commit is contained in:
committed by
Ingo Molnar
parent
a282e5ef29
commit
259c95afac
@@ -116,50 +116,12 @@ no_sleep:
|
||||
|
||||
static int sti_console_enabled;
|
||||
|
||||
static int omap2_allow_mpu_retention(void)
|
||||
{
|
||||
if (!omap2xxx_cm_mpu_retention_allowed())
|
||||
return 0;
|
||||
if (sti_console_enabled)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void omap2_enter_mpu_retention(void)
|
||||
static void omap2_do_wfi(void)
|
||||
{
|
||||
const int zero = 0;
|
||||
|
||||
/* The peripherals seem not to be able to wake up the MPU when
|
||||
* it is in retention mode. */
|
||||
if (omap2_allow_mpu_retention()) {
|
||||
/* REVISIT: These write to reserved bits? */
|
||||
omap_prm_clear_mod_irqs(CORE_MOD, PM_WKST1, ~0);
|
||||
omap_prm_clear_mod_irqs(CORE_MOD, OMAP24XX_PM_WKST2, ~0);
|
||||
omap_prm_clear_mod_irqs(WKUP_MOD, PM_WKST, ~0);
|
||||
|
||||
/* Try to enter MPU retention */
|
||||
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_RET);
|
||||
|
||||
} else {
|
||||
/* Block MPU retention */
|
||||
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
|
||||
}
|
||||
|
||||
/* WFI */
|
||||
asm("mcr p15, 0, %0, c7, c0, 4" : : "r" (zero) : "memory", "cc");
|
||||
|
||||
pwrdm_set_next_pwrst(mpu_pwrdm, PWRDM_POWER_ON);
|
||||
}
|
||||
|
||||
static int omap2_can_sleep(void)
|
||||
{
|
||||
if (omap2xxx_cm_fclks_active())
|
||||
return 0;
|
||||
if (__clk_is_enabled(osc_ck))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void omap2_pm_idle(void)
|
||||
@@ -169,16 +131,7 @@ static void omap2_pm_idle(void)
|
||||
if (omap_irq_pending())
|
||||
return;
|
||||
|
||||
error = cpu_cluster_pm_enter();
|
||||
if (error || !omap2_can_sleep()) {
|
||||
omap2_enter_mpu_retention();
|
||||
goto out_cpu_cluster_pm;
|
||||
}
|
||||
|
||||
omap2_enter_full_retention();
|
||||
|
||||
out_cpu_cluster_pm:
|
||||
cpu_cluster_pm_exit();
|
||||
omap2_do_wfi();
|
||||
}
|
||||
|
||||
static void __init prcm_setup_regs(void)
|
||||
|
||||
Reference in New Issue
Block a user