diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-tegra/cpuidle-t3.c | 13 | ||||
-rw-r--r-- | arch/arm/mach-tegra/timer.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-tegra/timer.h | 4 |
3 files changed, 20 insertions, 6 deletions
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 |