summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBharat Nihalani <bnihalani@nvidia.com>2011-10-19 18:54:25 +0530
committerSimone Willett <swillett@nvidia.com>2011-10-25 13:24:24 -0700
commit2af190f7b5842c2bc53694d2d94cd79c4ec50afe (patch)
treebea018fa80b09885d21ce74140abc1d5a04f36d9
parent52e2306c6d94b9ee448df7ea736f3d5a0af3152e (diff)
Revert "ARM: tegra: power: Clean Tegra3 LP2 entry procedure"
This reverts commit 11d1031e894c67145fb2bffee6f3af19ae4205d3. Bug 889103 Change-Id: I6114d3d59f1d4b7da712d6038da7f87d9bdedb0d Reviewed-on: http://git-master/r/59117 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/cpuidle-t3.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/arch/arm/mach-tegra/cpuidle-t3.c b/arch/arm/mach-tegra/cpuidle-t3.c
index f45ae3e7fc9d..386adf26b398 100644
--- a/arch/arm/mach-tegra/cpuidle-t3.c
+++ b/arch/arm/mach-tegra/cpuidle-t3.c
@@ -267,6 +267,8 @@ void tegra_idle_enter_lp2_cpu_0(struct cpuidle_device *dev,
void tegra_idle_enter_lp2_cpu_n(struct cpuidle_device *dev,
struct cpuidle_state *state)
{
+ u32 twd_ctrl;
+ u32 twd_load;
s64 request;
s64 sleep_time;
ktime_t enter;
@@ -283,6 +285,8 @@ void tegra_idle_enter_lp2_cpu_n(struct cpuidle_device *dev,
tegra_flow_wfi(dev);
return;
}
+ sleep_time = request - tegra_lp2_exit_latency;
+ tegra_lp2_set_trigger(sleep_time);
idle_stats.tear_down_count[cpu_number(dev->cpu)]++;
@@ -298,6 +302,8 @@ void tegra_idle_enter_lp2_cpu_n(struct cpuidle_device *dev,
stop_critical_timings();
/* gic_cpu_exit(0); - we want to wake cpu_n on gic interrupt */
barrier();
+ twd_ctrl = readl(twd_base + 0x8);
+ twd_load = readl(twd_base + 0);
spin_lock(&lp2_map_lock);
tegra_cpu_lp2_map |= (1 << dev->cpu);
@@ -321,6 +327,8 @@ void tegra_idle_enter_lp2_cpu_n(struct cpuidle_device *dev,
tegra_cpu_lp2_map &= ~(1 << dev->cpu);
spin_unlock(&lp2_map_lock);
+ writel(twd_ctrl, twd_base + 0x8);
+ writel(twd_load, twd_base + 0);
gic_cpu_init(0, IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x100);
tegra_unmask_irq(IRQ_LOCALTIMER);
@@ -328,14 +336,16 @@ void tegra_idle_enter_lp2_cpu_n(struct cpuidle_device *dev,
writel(smp_processor_id(), EVP_CPU_RSVD_VECTOR);
start_critical_timings();
+ if (sleep_time)
+ tegra_lp2_set_trigger(0);
/*
* TODO: is it worth going back to wfi if no interrupt is pending
* and the requested sleep time has not passed?
*/
exit = ktime_get();
- sleep_time = ktime_to_us(ktime_sub(exit, enter));
- idle_stats.in_lp2_time[cpu_number(dev->cpu)] += sleep_time;
+ idle_stats.in_lp2_time[cpu_number(dev->cpu)] +=
+ ktime_to_us(ktime_sub(exit, enter));
return;
}