提交 1a9b3064 编写于 作者: P Peter Maydell

hw/timer/cmsdk-apb-timer: run or stop timer on writes to RELOAD and VALUE

If the CMSDK APB timer is set up with a zero RELOAD value
then it will count down to zero, fire once and then stay
at zero. From the point of view of the ptimer system, the
timer is disabled; but the enable bit in the CTRL register
is still set and if the guest subsequently writes to the
RELOAD or VALUE registers this should cause the timer to
start counting down again.

Add code to the write paths for RELOAD and VALUE so that
we correctly restart the timer in this situation.

Conversely, if the new RELOAD and VALUE are both zero,
we should stop the ptimer.
Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: NRichard Henderson <richard.henderson@linaro.org>
Tested-by: NGuenter Roeck <linux@roeck-us.net>
Message-id: 20180703171044.9503-5-peter.maydell@linaro.org
上级 0e256833
......@@ -126,10 +126,26 @@ static void cmsdk_apb_timer_write(void *opaque, hwaddr offset, uint64_t value,
break;
case A_RELOAD:
/* Writing to reload also sets the current timer value */
if (!value) {
ptimer_stop(s->timer);
}
ptimer_set_limit(s->timer, value, 1);
if (value && (s->ctrl & R_CTRL_EN_MASK)) {
/*
* Make sure timer is running (it might have stopped if this
* was an expired one-shot timer)
*/
ptimer_run(s->timer, 0);
}
break;
case A_VALUE:
if (!value && !ptimer_get_limit(s->timer)) {
ptimer_stop(s->timer);
}
ptimer_set_count(s->timer, value);
if (value && (s->ctrl & R_CTRL_EN_MASK)) {
ptimer_run(s->timer, ptimer_get_limit(s->timer) == 0);
}
break;
case A_INTSTATUS:
/* Just one bit, which is W1C. */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册