Commit 6240d6467077a12c24878bab645d8e2983e4975a

Authored by blueswir1
1 parent 19f8e5dd

Fix setting counter limit to 0 (Robert Reif)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3834 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 8 additions and 7 deletions
hw/slavio_timer.c
@@ -175,7 +175,6 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, @@ -175,7 +175,6 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr,
175 { 175 {
176 SLAVIO_TIMERState *s = opaque; 176 SLAVIO_TIMERState *s = opaque;
177 uint32_t saddr; 177 uint32_t saddr;
178 - int reload = 0;  
179 178
180 DPRINTF("write " TARGET_FMT_plx " %08x\n", addr, val); 179 DPRINTF("write " TARGET_FMT_plx " %08x\n", addr, val);
181 saddr = (addr & TIMER_MAXADDR) >> 2; 180 saddr = (addr & TIMER_MAXADDR) >> 2;
@@ -191,9 +190,10 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, @@ -191,9 +190,10 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr,
191 // set limit, reset counter 190 // set limit, reset counter
192 qemu_irq_lower(s->irq); 191 qemu_irq_lower(s->irq);
193 s->limit = val & TIMER_MAX_COUNT32; 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 break; 198 break;
199 case TIMER_COUNTER: 199 case TIMER_COUNTER:
@@ -209,9 +209,10 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, @@ -209,9 +209,10 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr,
209 case TIMER_COUNTER_NORST: 209 case TIMER_COUNTER_NORST:
210 // set limit without resetting counter 210 // set limit without resetting counter
211 s->limit = val & TIMER_MAX_COUNT32; 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 break; 216 break;
216 case TIMER_STATUS: 217 case TIMER_STATUS:
217 if (slavio_timer_is_user(s)) { 218 if (slavio_timer_is_user(s)) {