summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/mach-tegra/cpuidle-t3.c13
-rw-r--r--arch/arm/mach-tegra/timer.c9
-rw-r--r--arch/arm/mach-tegra/timer.h4
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