Revision 6240d646 hw/slavio_timer.c
b/hw/slavio_timer.c | ||
---|---|---|
175 | 175 |
{ |
176 | 176 |
SLAVIO_TIMERState *s = opaque; |
177 | 177 |
uint32_t saddr; |
178 |
int reload = 0; |
|
179 | 178 |
|
180 | 179 |
DPRINTF("write " TARGET_FMT_plx " %08x\n", addr, val); |
181 | 180 |
saddr = (addr & TIMER_MAXADDR) >> 2; |
... | ... | |
191 | 190 |
// set limit, reset counter |
192 | 191 |
qemu_irq_lower(s->irq); |
193 | 192 |
s->limit = val & TIMER_MAX_COUNT32; |
194 |
if (!s->limit) |
|
195 |
s->limit = TIMER_MAX_COUNT32; |
|
196 |
ptimer_set_limit(s->timer, s->limit >> 9, 1); |
|
193 |
if (s->limit == 0) /* free-run */ |
|
194 |
ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1); |
|
195 |
else |
|
196 |
ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); |
|
197 | 197 |
} |
198 | 198 |
break; |
199 | 199 |
case TIMER_COUNTER: |
... | ... | |
209 | 209 |
case TIMER_COUNTER_NORST: |
210 | 210 |
// set limit without resetting counter |
211 | 211 |
s->limit = val & TIMER_MAX_COUNT32; |
212 |
if (!s->limit) |
|
213 |
s->limit = TIMER_MAX_COUNT32; |
|
214 |
ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), reload); |
|
212 |
if (s->limit == 0) /* free-run */ |
|
213 |
ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 0); |
|
214 |
else |
|
215 |
ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 0); |
|
215 | 216 |
break; |
216 | 217 |
case TIMER_STATUS: |
217 | 218 |
if (slavio_timer_is_user(s)) { |
Also available in: Unified diff