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