diff options
Diffstat (limited to 'arch/m68k/platform/coldfire/sltimers.c')
-rw-r--r-- | arch/m68k/platform/coldfire/sltimers.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/arch/m68k/platform/coldfire/sltimers.c b/arch/m68k/platform/coldfire/sltimers.c index b7f822b552bb..54e1452f853a 100644 --- a/arch/m68k/platform/coldfire/sltimers.c +++ b/arch/m68k/platform/coldfire/sltimers.c | |||
@@ -98,16 +98,19 @@ static struct irqaction mcfslt_timer_irq = { | |||
98 | static cycle_t mcfslt_read_clk(struct clocksource *cs) | 98 | static cycle_t mcfslt_read_clk(struct clocksource *cs) |
99 | { | 99 | { |
100 | unsigned long flags; | 100 | unsigned long flags; |
101 | u32 cycles; | 101 | u32 cycles, scnt; |
102 | u16 scnt; | ||
103 | 102 | ||
104 | local_irq_save(flags); | 103 | local_irq_save(flags); |
105 | scnt = __raw_readl(TA(MCFSLT_SCNT)); | 104 | scnt = __raw_readl(TA(MCFSLT_SCNT)); |
106 | cycles = mcfslt_cnt; | 105 | cycles = mcfslt_cnt; |
106 | if (__raw_readl(TA(MCFSLT_SSR)) & MCFSLT_SSR_TE) { | ||
107 | cycles += mcfslt_cycles_per_jiffy; | ||
108 | scnt = __raw_readl(TA(MCFSLT_SCNT)); | ||
109 | } | ||
107 | local_irq_restore(flags); | 110 | local_irq_restore(flags); |
108 | 111 | ||
109 | /* subtract because slice timers count down */ | 112 | /* subtract because slice timers count down */ |
110 | return cycles - scnt; | 113 | return cycles + ((mcfslt_cycles_per_jiffy - 1) - scnt); |
111 | } | 114 | } |
112 | 115 | ||
113 | static struct clocksource mcfslt_clk = { | 116 | static struct clocksource mcfslt_clk = { |