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