summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/sysdev/mpic_timer.c
diff options
context:
space:
mode:
authorWang Dongsheng2014-01-06 06:23:30 +0100
committerScott Wood2014-01-10 00:52:13 +0100
commit0fd79588f9e4e544b2ef2b0265e62b4c04fc1003 (patch)
tree5fd2407e442696adcc1cafc498f5294e8311bd32 /arch/powerpc/sysdev/mpic_timer.c
parentpowerpc/p1022ds: add a interrupt for rtc node (diff)
downloadkernel-qcow2-linux-0fd79588f9e4e544b2ef2b0265e62b4c04fc1003.tar.gz
kernel-qcow2-linux-0fd79588f9e4e544b2ef2b0265e62b4c04fc1003.tar.xz
kernel-qcow2-linux-0fd79588f9e4e544b2ef2b0265e62b4c04fc1003.zip
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>
Diffstat (limited to 'arch/powerpc/sysdev/mpic_timer.c')
-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 @@
#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);