aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWang Dongsheng <dongsheng.wang@freescale.com>2014-01-06 00:23:30 -0500
committerScott Wood <scottwood@freescale.com>2014-01-09 18:52:13 -0500
commit0fd79588f9e4e544b2ef2b0265e62b4c04fc1003 (patch)
tree5fd2407e442696adcc1cafc498f5294e8311bd32
parent7f83a50ce3ae157619505d7c1464c0c4ff0db058 (diff)
powerpc/mpic_timer: fix the time is not accurate caused by GTCRR toggle bit
When the timer GTCCR toggle bit is inverted, we calculated the rest of the time is not accurate. So we need to ignore this bit. Signed-off-by: Wang Dongsheng <dongsheng.wang@freescale.com> Signed-off-by: Scott Wood <scottwood@freescale.com>
-rw-r--r--arch/powerpc/sysdev/mpic_timer.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/arch/powerpc/sysdev/mpic_timer.c b/arch/powerpc/sysdev/mpic_timer.c
index 22d7d57eead9..70dcf9c5b8fb 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)
@@ -327,11 +328,13 @@ void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time)
327 casc_priv = priv->timer[handle->num].cascade_handle; 328 casc_priv = priv->timer[handle->num].cascade_handle;
328 if (casc_priv) { 329 if (casc_priv) {
329 tmp_ticks = in_be32(&priv->regs[handle->num].gtccr); 330 tmp_ticks = in_be32(&priv->regs[handle->num].gtccr);
331 tmp_ticks &= ~GTCCR_TOG;
330 ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE; 332 ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE;
331 tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr); 333 tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr);
332 ticks += tmp_ticks; 334 ticks += tmp_ticks;
333 } else { 335 } else {
334 ticks = in_be32(&priv->regs[handle->num].gtccr); 336 ticks = in_be32(&priv->regs[handle->num].gtccr);
337 ticks &= ~GTCCR_TOG;
335 } 338 }
336 339
337 convert_ticks_to_time(priv, ticks, time); 340 convert_ticks_to_time(priv, ticks, time);