The new CPU Idle driver has all necessary features in order to allow the deepest idling state on Tegra30 SoC where the whole CPU cluster is power-gated using the coupled idle state.
Signed-off-by: Dmitry Osipenko <dig...@gmail.com> --- Please note that outer_disable() has a WARN_ON(num_online_cpus > 1) and it doesn't know that we turned off those secondary CPUs, hence the outer_cache.disable() is now invoked directly. arch/arm/mach-tegra/pm.c | 4 ++-- drivers/cpuidle/cpuidle-tegra.c | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c index f9c9bce9e15d..cc941b0c97e8 100644 --- a/arch/arm/mach-tegra/pm.c +++ b/arch/arm/mach-tegra/pm.c @@ -146,8 +146,8 @@ static int tegra_sleep_cpu(unsigned long v2p) * if any of secondary CPU's is online and this is the LP2-idle * code-path only for Tegra20/30. */ - if (trusted_foundations_registered()) - outer_disable(); + if (trusted_foundations_registered() && outer_cache.disable) + outer_cache.disable(); /* * Note that besides of setting up CPU reset vector this firmware diff --git a/drivers/cpuidle/cpuidle-tegra.c b/drivers/cpuidle/cpuidle-tegra.c index 3fad4a0cbc78..31eeef22c0ff 100644 --- a/drivers/cpuidle/cpuidle-tegra.c +++ b/drivers/cpuidle/cpuidle-tegra.c @@ -202,10 +202,8 @@ static int tegra_cpuidle_probe(struct platform_device *pdev) switch (tegra_get_chip_id()) { case TEGRA20: tegra_idle_driver.states[1].disabled = true; - tegra_idle_driver.states[3].disabled = true; - break; + /* fall through */ case TEGRA30: - tegra_idle_driver.states[2].disabled = true; tegra_idle_driver.states[3].disabled = true; break; case TEGRA114: -- 2.22.0