From de067308cce5e1adacc29e5d2fa4459a7f380fb2 Mon Sep 17 00:00:00 2001 From: Alex Frid Date: Sat, 28 Jan 2012 17:36:37 -0800 Subject: ARM: tegra: power: Re-factor Tegra3 secondary CPU LP2 entry When Tegra3 secondary CPU is entering LP2, read TWD timer state into context structure, rather than separate local variables. Reviewed-on: http://git-master/r/77957 Change-Id: I237eafc50a11d535b94f334631d039ba9c4bf44b Signed-off-by: Alex Frid Signed-off-by: Varun Wadekar Reviewed-on: http://git-master/r/78899 Reviewed-by: Automatic_Commit_Validation_User --- arch/arm/mach-tegra/cpuidle-t3.c | 13 +++++++------ arch/arm/mach-tegra/timer.c | 9 +++++++++ arch/arm/mach-tegra/timer.h | 4 ++++ 3 files changed, 20 insertions(+), 6 deletions(-) (limited to 'arch') diff --git a/arch/arm/mach-tegra/cpuidle-t3.c b/arch/arm/mach-tegra/cpuidle-t3.c index 8e0122f0bed8..fb51e25e75e9 100644 --- a/arch/arm/mach-tegra/cpuidle-t3.c +++ b/arch/arm/mach-tegra/cpuidle-t3.c @@ -293,14 +293,15 @@ static void tegra3_idle_enter_lp2_cpu_n(struct cpuidle_device *dev, { #ifdef CONFIG_SMP ktime_t entery_time; - u32 twd_cnt; - u32 twd_ctrl = readl(twd_base + TWD_TIMER_CONTROL); + struct tegra_twd_context twd_context; unsigned long twd_rate = clk_get_rate(twd_clk); - if ((twd_ctrl & TWD_TIMER_CONTROL_ENABLE) && - (twd_ctrl & TWD_TIMER_CONTROL_IT_ENABLE)) { - twd_cnt = readl(twd_base + TWD_TIMER_COUNTER); - request = div_u64((u64)twd_cnt * 1000000, twd_rate); + if (!tegra_twd_get_state(&twd_context)) { + 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 < tegra_lp2_exit_latency) { diff --git a/arch/arm/mach-tegra/timer.c b/arch/arm/mach-tegra/timer.c index d869ba3a3e2c..83d0e17b50c1 100644 --- a/arch/arm/mach-tegra/timer.c +++ b/arch/arm/mach-tegra/timer.c @@ -204,6 +204,15 @@ static struct syscore_ops tegra_timer_syscore_ops = { }; #ifdef CONFIG_HAVE_ARM_TWD +int tegra_twd_get_state(struct tegra_twd_context *context) +{ + context->twd_ctrl = readl(twd_base + TWD_TIMER_CONTROL); + context->twd_load = readl(twd_base + TWD_TIMER_LOAD); + context->twd_cnt = readl(twd_base + TWD_TIMER_COUNTER); + + return 0; +} + void tegra_twd_suspend(struct tegra_twd_context *context) { context->twd_ctrl = readl(twd_base + TWD_TIMER_CONTROL); diff --git a/arch/arm/mach-tegra/timer.h b/arch/arm/mach-tegra/timer.h index 04d858fb77ea..4a91792f5d99 100644 --- a/arch/arm/mach-tegra/timer.h +++ b/arch/arm/mach-tegra/timer.h @@ -38,12 +38,16 @@ void __init tegra3_init_timer(u32 *offset, int *irq); struct tegra_twd_context { u32 twd_ctrl; u32 twd_load; + u32 twd_cnt; }; #ifdef CONFIG_HAVE_ARM_TWD +int tegra_twd_get_state(struct tegra_twd_context *context); void tegra_twd_suspend(struct tegra_twd_context *context); void tegra_twd_resume(struct tegra_twd_context *context); #else +static inline int tegra_twd_get_state(struct tegra_twd_context *context) +{ return -ENODEV; } static inline void tegra_twd_suspend(struct tegra_twd_context *context) {} static inline void tegra_twd_resume(struct tegra_twd_context *context) {} #endif -- cgit v1.2.3