hw/timer/sh_timer: Switch to transaction-based ptimer API
Switch the sh_timer code away from bottom-half based ptimers to the new transaction-based ptimer API. This just requires adding begin/commit calls around the various places that modify the ptimer state, and using the new ptimer_init() function to create the timer. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Message-id: 20191017132905.5604-3-peter.maydell@linaro.org
This commit is contained in:
parent
c54dd4b701
commit
28015830d9
@ -13,7 +13,6 @@
|
|||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "hw/sh4/sh.h"
|
#include "hw/sh4/sh.h"
|
||||||
#include "qemu/timer.h"
|
#include "qemu/timer.h"
|
||||||
#include "qemu/main-loop.h"
|
|
||||||
#include "hw/ptimer.h"
|
#include "hw/ptimer.h"
|
||||||
|
|
||||||
//#define DEBUG_TIMER
|
//#define DEBUG_TIMER
|
||||||
@ -91,13 +90,18 @@ static void sh_timer_write(void *opaque, hwaddr offset,
|
|||||||
switch (offset >> 2) {
|
switch (offset >> 2) {
|
||||||
case OFFSET_TCOR:
|
case OFFSET_TCOR:
|
||||||
s->tcor = value;
|
s->tcor = value;
|
||||||
|
ptimer_transaction_begin(s->timer);
|
||||||
ptimer_set_limit(s->timer, s->tcor, 0);
|
ptimer_set_limit(s->timer, s->tcor, 0);
|
||||||
|
ptimer_transaction_commit(s->timer);
|
||||||
break;
|
break;
|
||||||
case OFFSET_TCNT:
|
case OFFSET_TCNT:
|
||||||
s->tcnt = value;
|
s->tcnt = value;
|
||||||
|
ptimer_transaction_begin(s->timer);
|
||||||
ptimer_set_count(s->timer, s->tcnt);
|
ptimer_set_count(s->timer, s->tcnt);
|
||||||
|
ptimer_transaction_commit(s->timer);
|
||||||
break;
|
break;
|
||||||
case OFFSET_TCR:
|
case OFFSET_TCR:
|
||||||
|
ptimer_transaction_begin(s->timer);
|
||||||
if (s->enabled) {
|
if (s->enabled) {
|
||||||
/* Pause the timer if it is running. This may cause some
|
/* Pause the timer if it is running. This may cause some
|
||||||
inaccuracy dure to rounding, but avoids a whole lot of other
|
inaccuracy dure to rounding, but avoids a whole lot of other
|
||||||
@ -148,6 +152,7 @@ static void sh_timer_write(void *opaque, hwaddr offset,
|
|||||||
/* Restart the timer if still enabled. */
|
/* Restart the timer if still enabled. */
|
||||||
ptimer_run(s->timer, 0);
|
ptimer_run(s->timer, 0);
|
||||||
}
|
}
|
||||||
|
ptimer_transaction_commit(s->timer);
|
||||||
break;
|
break;
|
||||||
case OFFSET_TCPR:
|
case OFFSET_TCPR:
|
||||||
if (s->feat & TIMER_FEAT_CAPT) {
|
if (s->feat & TIMER_FEAT_CAPT) {
|
||||||
@ -168,12 +173,14 @@ static void sh_timer_start_stop(void *opaque, int enable)
|
|||||||
printf("sh_timer_start_stop %d (%d)\n", enable, s->enabled);
|
printf("sh_timer_start_stop %d (%d)\n", enable, s->enabled);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
ptimer_transaction_begin(s->timer);
|
||||||
if (s->enabled && !enable) {
|
if (s->enabled && !enable) {
|
||||||
ptimer_stop(s->timer);
|
ptimer_stop(s->timer);
|
||||||
}
|
}
|
||||||
if (!s->enabled && enable) {
|
if (!s->enabled && enable) {
|
||||||
ptimer_run(s->timer, 0);
|
ptimer_run(s->timer, 0);
|
||||||
}
|
}
|
||||||
|
ptimer_transaction_commit(s->timer);
|
||||||
s->enabled = !!enable;
|
s->enabled = !!enable;
|
||||||
|
|
||||||
#ifdef DEBUG_TIMER
|
#ifdef DEBUG_TIMER
|
||||||
@ -191,7 +198,6 @@ static void sh_timer_tick(void *opaque)
|
|||||||
static void *sh_timer_init(uint32_t freq, int feat, qemu_irq irq)
|
static void *sh_timer_init(uint32_t freq, int feat, qemu_irq irq)
|
||||||
{
|
{
|
||||||
sh_timer_state *s;
|
sh_timer_state *s;
|
||||||
QEMUBH *bh;
|
|
||||||
|
|
||||||
s = (sh_timer_state *)g_malloc0(sizeof(sh_timer_state));
|
s = (sh_timer_state *)g_malloc0(sizeof(sh_timer_state));
|
||||||
s->freq = freq;
|
s->freq = freq;
|
||||||
@ -203,8 +209,7 @@ static void *sh_timer_init(uint32_t freq, int feat, qemu_irq irq)
|
|||||||
s->enabled = 0;
|
s->enabled = 0;
|
||||||
s->irq = irq;
|
s->irq = irq;
|
||||||
|
|
||||||
bh = qemu_bh_new(sh_timer_tick, s);
|
s->timer = ptimer_init(sh_timer_tick, s, PTIMER_POLICY_DEFAULT);
|
||||||
s->timer = ptimer_init_with_bh(bh, PTIMER_POLICY_DEFAULT);
|
|
||||||
|
|
||||||
sh_timer_write(s, OFFSET_TCOR >> 2, s->tcor);
|
sh_timer_write(s, OFFSET_TCOR >> 2, s->tcor);
|
||||||
sh_timer_write(s, OFFSET_TCNT >> 2, s->tcnt);
|
sh_timer_write(s, OFFSET_TCNT >> 2, s->tcnt);
|
||||||
|
Loading…
Reference in New Issue
Block a user