diff options
author | Colin Cross <ccross@android.com> | 2010-09-17 13:51:48 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2010-10-06 16:28:39 -0700 |
commit | 1e6ba98f9315642e95ff0b7d08d32e42f601b444 (patch) | |
tree | 8d95ff598532704616ba9ac0a7d7a1e8e2db6ebc /arch/arm/kernel | |
parent | 71f142dd095287a0fc352f6db10128f29ffd5ba9 (diff) |
[ARM] twd: Fix prescaler getting cleared by set_mode
Change-Id: I98d4b02feeb9784591504c59a82058a58bbd038e
Signed-off-by: Colin Cross <ccross@android.com>
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/smp_twd.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/arch/arm/kernel/smp_twd.c b/arch/arm/kernel/smp_twd.c index 2b4f92788c0e..a0db5474bdbe 100644 --- a/arch/arm/kernel/smp_twd.c +++ b/arch/arm/kernel/smp_twd.c @@ -31,22 +31,23 @@ static unsigned long twd_target_rate; static void twd_set_mode(enum clock_event_mode mode, struct clock_event_device *clk) { - unsigned long ctrl; + unsigned long ctrl = __raw_readl(twd_base + TWD_TIMER_CONTROL); + ctrl |= TWD_TIMER_CONTROL_PRESCALE_MASK; switch (mode) { case CLOCK_EVT_MODE_PERIODIC: /* timer load already set up */ - ctrl = TWD_TIMER_CONTROL_ENABLE | TWD_TIMER_CONTROL_IT_ENABLE + ctrl |= TWD_TIMER_CONTROL_ENABLE | TWD_TIMER_CONTROL_IT_ENABLE | TWD_TIMER_CONTROL_PERIODIC; break; case CLOCK_EVT_MODE_ONESHOT: /* period set, and timer enabled in 'next_event' hook */ - ctrl = TWD_TIMER_CONTROL_IT_ENABLE | TWD_TIMER_CONTROL_ONESHOT; + ctrl |= TWD_TIMER_CONTROL_IT_ENABLE | TWD_TIMER_CONTROL_ONESHOT; break; case CLOCK_EVT_MODE_UNUSED: case CLOCK_EVT_MODE_SHUTDOWN: default: - ctrl = 0; + break; } __raw_writel(ctrl, twd_base + TWD_TIMER_CONTROL); @@ -145,9 +146,8 @@ static void __cpuinit twd_calibrate_rate(unsigned long target_rate, twd_target_rate = target_rate; cpu_rate = twd_timer_rate * periphclk_prescaler; - twd_recalc_prescaler(cpu_rate); - twd_timer_rate = twd_target_rate; + twd_recalc_prescaler(cpu_rate); } printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000, |