summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/cpuidle-t3.c
diff options
context:
space:
mode:
authorAlex Frid <afrid@nvidia.com>2012-01-31 20:49:40 -0800
committerRohan Somvanshi <rsomvanshi@nvidia.com>2012-02-13 06:46:28 -0800
commitd29994a7691e1d710c587a89f07e8923f5e78313 (patch)
tree9dc15ff96064d970bad1de9f61539f737e6e174a /arch/arm/mach-tegra/cpuidle-t3.c
parente1373e441ab235da02fe48c2b9fe99adfb494428 (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.c13
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 */