diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-12-29 12:39:50 +0000 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2014-02-15 19:20:15 +0000 |
commit | d9bd24c3bc422acf43f744124d6537921719352f (patch) | |
tree | 695e7b42e837db5abc18fc3b2ed9d53628287071 /arch | |
parent | 5826e620694c056e27dae2f1e1e31005c93ab7e0 (diff) | |
download | lwn-d9bd24c3bc422acf43f744124d6537921719352f.tar.gz lwn-d9bd24c3bc422acf43f744124d6537921719352f.zip |
ARM: fix footbridge clockevent device
commit 4ff859fe1dc0da0f87bbdfff78f527898878fa4a upstream.
The clockevents code was being told that the footbridge clock event
device ticks at 16x the rate which it actually does. This leads to
timekeeping problems since it allows the clocksource to wrap before
the kernel notices. Fix this by using the correct clock.
Fixes: 4e8d76373c9fd ("ARM: footbridge: convert to clockevents/clocksource")
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
[bwh: Backported to 3.2: fold in the relevant parts of commit 838a2ae80a6a
('ARM: use clockevents_config_and_register() where possible')]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-footbridge/dc21285-timer.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/arch/arm/mach-footbridge/dc21285-timer.c b/arch/arm/mach-footbridge/dc21285-timer.c index 121ad1d4fa39..547731b817b8 100644 --- a/arch/arm/mach-footbridge/dc21285-timer.c +++ b/arch/arm/mach-footbridge/dc21285-timer.c @@ -95,17 +95,14 @@ static struct irqaction footbridge_timer_irq = { static void __init footbridge_timer_init(void) { struct clock_event_device *ce = &ckevt_dc21285; + unsigned rate = DIV_ROUND_CLOSEST(mem_fclk_21285, 16); - clocksource_register_hz(&cksrc_dc21285, (mem_fclk_21285 + 8) / 16); + clocksource_register_hz(&cksrc_dc21285, rate); setup_irq(ce->irq, &footbridge_timer_irq); - clockevents_calc_mult_shift(ce, mem_fclk_21285, 5); - ce->max_delta_ns = clockevent_delta2ns(0xffffff, ce); - ce->min_delta_ns = clockevent_delta2ns(0x000004, ce); ce->cpumask = cpumask_of(smp_processor_id()); - - clockevents_register_device(ce); + clockevents_config_and_register(ce, rate, 0x4, 0xffffff); } struct sys_timer footbridge_timer = { |