diff options
author | Alex Frid <afrid@nvidia.com> | 2012-01-31 20:49:40 -0800 |
---|---|---|
committer | Rohan Somvanshi <rsomvanshi@nvidia.com> | 2012-02-13 06:46:28 -0800 |
commit | d29994a7691e1d710c587a89f07e8923f5e78313 (patch) | |
tree | 9dc15ff96064d970bad1de9f61539f737e6e174a /arch/arm/mach-tegra/cpuidle-t3.c | |
parent | e1373e441ab235da02fe48c2b9fe99adfb494428 (diff) |
ARM: tegra: power: Don't over-sleep LP2 on secondary CPUs
Adjust Tegra3 secondary CPU LP2 time for exit latency to avoid
scheduler event over-sleep.
Signed-off-by: Alex Frid <afrid@nvidia.com>
Reviewed-on: http://git-master/r/78635
(cherry picked from commit 433a3e356a0281efb1caf9b78bb1576008a58ed2)
Change-Id: Ifd298f0a4364fe4775ae209d76b2eda24b1bfefc
Signed-off-by: Pritesh Raithatha <praithatha@nvidia.com>
Reviewed-on: http://git-master/r/82709
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: Aleksandr Frid <afrid@nvidia.com>
Tested-by: Aleksandr Frid <afrid@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/cpuidle-t3.c')
-rw-r--r-- | arch/arm/mach-tegra/cpuidle-t3.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/arch/arm/mach-tegra/cpuidle-t3.c b/arch/arm/mach-tegra/cpuidle-t3.c index 3ac93fdd3906..e75ded720198 100644 --- a/arch/arm/mach-tegra/cpuidle-t3.c +++ b/arch/arm/mach-tegra/cpuidle-t3.c @@ -305,14 +305,21 @@ static void tegra3_idle_enter_lp2_cpu_n(struct cpuidle_device *dev, s64 sleep_time; ktime_t entry_time; struct tegra_twd_context twd_context; - unsigned long twd_rate = clk_get_rate(twd_clk); bool sleep_completed = false; if (!tegra_twd_get_state(&twd_context)) { + unsigned long twd_rate = clk_get_rate(twd_clk); + if ((twd_context.twd_ctrl & TWD_TIMER_CONTROL_ENABLE) && (twd_context.twd_ctrl & TWD_TIMER_CONTROL_IT_ENABLE)) { request = div_u64((u64)twd_context.twd_cnt * 1000000, twd_rate); + if (request >= state->target_residency) { + twd_context.twd_cnt -= state->exit_latency * + (twd_rate / 1000000); + writel(twd_context.twd_cnt, + twd_base + TWD_TIMER_COUNTER); + } } } @@ -348,8 +355,8 @@ static void tegra3_idle_enter_lp2_cpu_n(struct cpuidle_device *dev, * adjust the exit latency based on measurement */ int offset = sleep_time - request; - int latency = (15 * lp2_exit_latencies[cpu_number(dev->cpu)] + - offset) / 16; + int latency = lp2_exit_latencies[cpu_number(dev->cpu)] + + offset / 16; latency = clamp(latency, 0, 10000); lp2_exit_latencies[cpu_number(dev->cpu)] = latency; state->exit_latency = latency; /* for idle governor */ |