Revision 8034ce7d hw/pxa2xx_timer.c
b/hw/pxa2xx_timer.c | ||
---|---|---|
64 | 64 |
|
65 | 65 |
typedef struct { |
66 | 66 |
uint32_t value; |
67 |
int level; |
|
68 | 67 |
qemu_irq irq; |
69 | 68 |
QEMUTimer *qtimer; |
70 | 69 |
int num; |
... | ... | |
278 | 277 |
s->irq_enabled = value & 0xfff; |
279 | 278 |
break; |
280 | 279 |
case OSSR: /* Status register */ |
280 |
value &= s->events; |
|
281 | 281 |
s->events &= ~value; |
282 |
for (i = 0; i < 4; i ++, value >>= 1) { |
|
283 |
if (s->timer[i].level && (value & 1)) { |
|
284 |
s->timer[i].level = 0; |
|
282 |
for (i = 0; i < 4; i ++, value >>= 1) |
|
283 |
if (value & 1) |
|
285 | 284 |
qemu_irq_lower(s->timer[i].irq); |
286 |
} |
|
287 |
} |
|
288 |
if (pxa2xx_timer_has_tm4(s)) { |
|
289 |
for (i = 0; i < 8; i ++, value >>= 1) |
|
290 |
if (s->tm4[i].tm.level && (value & 1)) |
|
291 |
s->tm4[i].tm.level = 0; |
|
292 |
if (!(s->events & 0xff0)) |
|
293 |
qemu_irq_lower(s->irq4); |
|
294 |
} |
|
285 |
if (pxa2xx_timer_has_tm4(s) && !(s->events & 0xff0) && value) |
|
286 |
qemu_irq_lower(s->irq4); |
|
295 | 287 |
break; |
296 | 288 |
case OWER: /* XXX: Reset on OSMR3 match? */ |
297 | 289 |
s->reset3 = value; |
... | ... | |
351 | 343 |
PXA2xxTimerInfo *i = t->info; |
352 | 344 |
|
353 | 345 |
if (i->irq_enabled & (1 << t->num)) { |
354 |
t->level = 1; |
|
355 | 346 |
i->events |= 1 << t->num; |
356 | 347 |
qemu_irq_raise(t->irq); |
357 | 348 |
} |
... | ... | |
411 | 402 |
sysbus_init_irq(dev, &s->timer[i].irq); |
412 | 403 |
s->timer[i].info = s; |
413 | 404 |
s->timer[i].num = i; |
414 |
s->timer[i].level = 0; |
|
415 | 405 |
s->timer[i].qtimer = qemu_new_timer(vm_clock, |
416 | 406 |
pxa2xx_timer_tick, &s->timer[i]); |
417 | 407 |
} |
... | ... | |
422 | 412 |
s->tm4[i].tm.value = 0; |
423 | 413 |
s->tm4[i].tm.info = s; |
424 | 414 |
s->tm4[i].tm.num = i + 4; |
425 |
s->tm4[i].tm.level = 0; |
|
426 | 415 |
s->tm4[i].freq = 0; |
427 | 416 |
s->tm4[i].control = 0x0; |
428 | 417 |
s->tm4[i].tm.qtimer = qemu_new_timer(vm_clock, |
... | ... | |
439 | 428 |
|
440 | 429 |
static const VMStateDescription vmstate_pxa2xx_timer0_regs = { |
441 | 430 |
.name = "pxa2xx_timer0", |
442 |
.version_id = 1,
|
|
443 |
.minimum_version_id = 1,
|
|
444 |
.minimum_version_id_old = 1,
|
|
431 |
.version_id = 2,
|
|
432 |
.minimum_version_id = 2,
|
|
433 |
.minimum_version_id_old = 2,
|
|
445 | 434 |
.fields = (VMStateField[]) { |
446 | 435 |
VMSTATE_UINT32(value, PXA2xxTimer0), |
447 |
VMSTATE_INT32(level, PXA2xxTimer0), |
|
448 | 436 |
VMSTATE_END_OF_LIST(), |
449 | 437 |
}, |
450 | 438 |
}; |
Also available in: Unified diff