diff options
Diffstat (limited to 'arch/powerpc/sysdev/mpic_timer.c')
-rw-r--r-- | arch/powerpc/sysdev/mpic_timer.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/arch/powerpc/sysdev/mpic_timer.c b/arch/powerpc/sysdev/mpic_timer.c index 22d7d57eead9..9d9b06217f8b 100644 --- a/arch/powerpc/sysdev/mpic_timer.c +++ b/arch/powerpc/sysdev/mpic_timer.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #define MPIC_TIMER_TCR_ROVR_OFFSET 24 | 41 | #define MPIC_TIMER_TCR_ROVR_OFFSET 24 |
42 | 42 | ||
43 | #define TIMER_STOP 0x80000000 | 43 | #define TIMER_STOP 0x80000000 |
44 | #define GTCCR_TOG 0x80000000 | ||
44 | #define TIMERS_PER_GROUP 4 | 45 | #define TIMERS_PER_GROUP 4 |
45 | #define MAX_TICKS (~0U >> 1) | 46 | #define MAX_TICKS (~0U >> 1) |
46 | #define MAX_TICKS_CASCADE (~0U) | 47 | #define MAX_TICKS_CASCADE (~0U) |
@@ -96,8 +97,11 @@ static void convert_ticks_to_time(struct timer_group_priv *priv, | |||
96 | time->tv_sec = (__kernel_time_t)div_u64(ticks, priv->timerfreq); | 97 | time->tv_sec = (__kernel_time_t)div_u64(ticks, priv->timerfreq); |
97 | tmp_sec = (u64)time->tv_sec * (u64)priv->timerfreq; | 98 | tmp_sec = (u64)time->tv_sec * (u64)priv->timerfreq; |
98 | 99 | ||
99 | time->tv_usec = (__kernel_suseconds_t) | 100 | time->tv_usec = 0; |
100 | div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq); | 101 | |
102 | if (tmp_sec <= ticks) | ||
103 | time->tv_usec = (__kernel_suseconds_t) | ||
104 | div_u64((ticks - tmp_sec) * 1000000, priv->timerfreq); | ||
101 | 105 | ||
102 | return; | 106 | return; |
103 | } | 107 | } |
@@ -327,11 +331,13 @@ void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time) | |||
327 | casc_priv = priv->timer[handle->num].cascade_handle; | 331 | casc_priv = priv->timer[handle->num].cascade_handle; |
328 | if (casc_priv) { | 332 | if (casc_priv) { |
329 | tmp_ticks = in_be32(&priv->regs[handle->num].gtccr); | 333 | tmp_ticks = in_be32(&priv->regs[handle->num].gtccr); |
334 | tmp_ticks &= ~GTCCR_TOG; | ||
330 | ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE; | 335 | ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE; |
331 | tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr); | 336 | tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr); |
332 | ticks += tmp_ticks; | 337 | ticks += tmp_ticks; |
333 | } else { | 338 | } else { |
334 | ticks = in_be32(&priv->regs[handle->num].gtccr); | 339 | ticks = in_be32(&priv->regs[handle->num].gtccr); |
340 | ticks &= ~GTCCR_TOG; | ||
335 | } | 341 | } |
336 | 342 | ||
337 | convert_ticks_to_time(priv, ticks, time); | 343 | convert_ticks_to_time(priv, ticks, time); |