powerpc/mpic_timer: fix the time is not accurate caused by GTCRR toggle bit
authorWang Dongsheng <dongsheng.wang@freescale.com>
Mon, 6 Jan 2014 05:23:30 +0000 (13:23 +0800)
committerScott Wood <scottwood@freescale.com>
Thu, 9 Jan 2014 23:52:13 +0000 (17:52 -0600)
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>
arch/powerpc/sysdev/mpic_timer.c

index 22d7d57eead9d88fca57629de658a5629fd2d6bf..70dcf9c5b8fb5fafbfb05191e6411ee629a6b75c 100644 (file)
@@ -41,6 +41,7 @@
 #define MPIC_TIMER_TCR_ROVR_OFFSET     24
 
 #define TIMER_STOP                     0x80000000
+#define GTCCR_TOG                      0x80000000
 #define TIMERS_PER_GROUP               4
 #define MAX_TICKS                      (~0U >> 1)
 #define MAX_TICKS_CASCADE              (~0U)
@@ -327,11 +328,13 @@ void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time)
        casc_priv = priv->timer[handle->num].cascade_handle;
        if (casc_priv) {
                tmp_ticks = in_be32(&priv->regs[handle->num].gtccr);
+               tmp_ticks &= ~GTCCR_TOG;
                ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE;
                tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr);
                ticks += tmp_ticks;
        } else {
                ticks = in_be32(&priv->regs[handle->num].gtccr);
+               ticks &= ~GTCCR_TOG;
        }
 
        convert_ticks_to_time(priv, ticks, time);