Commit 0fd79588 authored by Wang Dongsheng's avatar Wang Dongsheng Committed by Scott Wood

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: default avatarWang Dongsheng <dongsheng.wang@freescale.com>
Signed-off-by: default avatarScott Wood <scottwood@freescale.com>
parent 7f83a50c
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#define MPIC_TIMER_TCR_ROVR_OFFSET 24 #define MPIC_TIMER_TCR_ROVR_OFFSET 24
#define TIMER_STOP 0x80000000 #define TIMER_STOP 0x80000000
#define GTCCR_TOG 0x80000000
#define TIMERS_PER_GROUP 4 #define TIMERS_PER_GROUP 4
#define MAX_TICKS (~0U >> 1) #define MAX_TICKS (~0U >> 1)
#define MAX_TICKS_CASCADE (~0U) #define MAX_TICKS_CASCADE (~0U)
...@@ -327,11 +328,13 @@ void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time) ...@@ -327,11 +328,13 @@ void mpic_get_remain_time(struct mpic_timer *handle, struct timeval *time)
casc_priv = priv->timer[handle->num].cascade_handle; casc_priv = priv->timer[handle->num].cascade_handle;
if (casc_priv) { if (casc_priv) {
tmp_ticks = in_be32(&priv->regs[handle->num].gtccr); tmp_ticks = in_be32(&priv->regs[handle->num].gtccr);
tmp_ticks &= ~GTCCR_TOG;
ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE; ticks = ((u64)tmp_ticks & UINT_MAX) * (u64)MAX_TICKS_CASCADE;
tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr); tmp_ticks = in_be32(&priv->regs[handle->num - 1].gtccr);
ticks += tmp_ticks; ticks += tmp_ticks;
} else { } else {
ticks = in_be32(&priv->regs[handle->num].gtccr); ticks = in_be32(&priv->regs[handle->num].gtccr);
ticks &= ~GTCCR_TOG;
} }
convert_ticks_to_time(priv, ticks, time); convert_ticks_to_time(priv, ticks, time);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment