提交 1ec0e115 编写于 作者: T Tomeu Vizoso 提交者: Thierry Reding

ARM: tegra: cpuidle: implement cpuidle_state.enter_freeze()

This callback is expected to do the same as enter() but it has to
guarantee that interrupts aren't enabled at any point in its execution,
as the tick is frozen.

It will be called when the system goes to suspend-to-idle and will
reduce power usage because CPUs won't be awaken for unnecessary IRQs.

By setting the CPUIDLE_FLAG_TIMER_STOP flag, we can reuse the same code
for both the enter() and enter_freeze() callbacks.
Signed-off-by: NTomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: NThierry Reding <treding@nvidia.com>
上级 fc0cf177
...@@ -45,16 +45,12 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev, ...@@ -45,16 +45,12 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev,
tegra_set_cpu_in_lp2(); tegra_set_cpu_in_lp2();
cpu_pm_enter(); cpu_pm_enter();
tick_broadcast_enter();
call_firmware_op(prepare_idle); call_firmware_op(prepare_idle);
/* Do suspend by ourselves if the firmware does not implement it */ /* Do suspend by ourselves if the firmware does not implement it */
if (call_firmware_op(do_idle, 0) == -ENOSYS) if (call_firmware_op(do_idle, 0) == -ENOSYS)
cpu_suspend(0, tegra30_sleep_cpu_secondary_finish); cpu_suspend(0, tegra30_sleep_cpu_secondary_finish);
tick_broadcast_exit();
cpu_pm_exit(); cpu_pm_exit();
tegra_clear_cpu_in_lp2(); tegra_clear_cpu_in_lp2();
...@@ -62,6 +58,13 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev, ...@@ -62,6 +58,13 @@ static int tegra114_idle_power_down(struct cpuidle_device *dev,
return index; return index;
} }
static void tegra114_idle_enter_freeze(struct cpuidle_device *dev,
struct cpuidle_driver *drv,
int index)
{
tegra114_idle_power_down(dev, drv, index);
}
#endif #endif
static struct cpuidle_driver tegra_idle_driver = { static struct cpuidle_driver tegra_idle_driver = {
...@@ -73,8 +76,10 @@ static struct cpuidle_driver tegra_idle_driver = { ...@@ -73,8 +76,10 @@ static struct cpuidle_driver tegra_idle_driver = {
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
[1] = { [1] = {
.enter = tegra114_idle_power_down, .enter = tegra114_idle_power_down,
.enter_freeze = tegra114_idle_enter_freeze,
.exit_latency = 500, .exit_latency = 500,
.target_residency = 1000, .target_residency = 1000,
.flags = CPUIDLE_FLAG_TIMER_STOP,
.power_usage = 0, .power_usage = 0,
.name = "powered-down", .name = "powered-down",
.desc = "CPU power gated", .desc = "CPU power gated",
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册