Commit 3bdd58a4dfaf284868e7b34f29ae74c60ad23ac9
1 parent
9617efe8
Correct the number of PXA255 GPIO lines. Reuse the PXA timers struct for PXA27x additional timers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2789 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
17 additions
and
22 deletions
hw/pxa2xx.c
| @@ -1645,7 +1645,7 @@ struct pxa2xx_state_s *pxa255_init(unsigned int sdram_size, | @@ -1645,7 +1645,7 @@ struct pxa2xx_state_s *pxa255_init(unsigned int sdram_size, | ||
| 1645 | 1645 | ||
| 1646 | pxa25x_timer_init(0x40a00000, &s->pic[PXA2XX_PIC_OST_0], s->env); | 1646 | pxa25x_timer_init(0x40a00000, &s->pic[PXA2XX_PIC_OST_0], s->env); |
| 1647 | 1647 | ||
| 1648 | - s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 121); | 1648 | + s->gpio = pxa2xx_gpio_init(0x40e00000, s->env, s->pic, 85); |
| 1649 | 1649 | ||
| 1650 | s->mmc = pxa2xx_mmci_init(0x41100000, s->pic[PXA2XX_PIC_MMC], s->dma); | 1650 | s->mmc = pxa2xx_mmci_init(0x41100000, s->pic[PXA2XX_PIC_MMC], s->dma); |
| 1651 | 1651 |
hw/pxa2xx_timer.c
| @@ -66,12 +66,7 @@ struct pxa2xx_timer0_s { | @@ -66,12 +66,7 @@ struct pxa2xx_timer0_s { | ||
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | struct pxa2xx_timer4_s { | 68 | struct pxa2xx_timer4_s { |
| 69 | - uint32_t value; | ||
| 70 | - int level; | ||
| 71 | - qemu_irq irq; | ||
| 72 | - QEMUTimer *qtimer; | ||
| 73 | - int num; | ||
| 74 | - void *info; | 69 | + struct pxa2xx_timer0_s tm; |
| 75 | int32_t oldclock; | 70 | int32_t oldclock; |
| 76 | int32_t clock; | 71 | int32_t clock; |
| 77 | uint64_t lastload; | 72 | uint64_t lastload; |
| @@ -134,7 +129,7 @@ static void pxa2xx_timer_update4(void *opaque, uint64_t now_qemu, int n) | @@ -134,7 +129,7 @@ static void pxa2xx_timer_update4(void *opaque, uint64_t now_qemu, int n) | ||
| 134 | s->tm4[counter].lastload, | 129 | s->tm4[counter].lastload, |
| 135 | s->tm4[counter].freq, ticks_per_sec); | 130 | s->tm4[counter].freq, ticks_per_sec); |
| 136 | 131 | ||
| 137 | - new_qemu = now_qemu + muldiv64((uint32_t) (s->tm4[n].value - now_vm), | 132 | + new_qemu = now_qemu + muldiv64((uint32_t) (s->tm4[n].tm.value - now_vm), |
| 138 | ticks_per_sec, s->tm4[counter].freq); | 133 | ticks_per_sec, s->tm4[counter].freq); |
| 139 | qemu_mod_timer(s->timer[n].qtimer, new_qemu); | 134 | qemu_mod_timer(s->timer[n].qtimer, new_qemu); |
| 140 | } | 135 | } |
| @@ -162,7 +157,7 @@ static uint32_t pxa2xx_timer_read(void *opaque, target_phys_addr_t offset) | @@ -162,7 +157,7 @@ static uint32_t pxa2xx_timer_read(void *opaque, target_phys_addr_t offset) | ||
| 162 | case OSMR4: | 157 | case OSMR4: |
| 163 | if (!s->tm4) | 158 | if (!s->tm4) |
| 164 | goto badreg; | 159 | goto badreg; |
| 165 | - return s->tm4[tm].value; | 160 | + return s->tm4[tm].tm.value; |
| 166 | case OSCR: | 161 | case OSCR: |
| 167 | return s->clock + muldiv64(qemu_get_clock(vm_clock) - | 162 | return s->clock + muldiv64(qemu_get_clock(vm_clock) - |
| 168 | s->lastload, s->freq, ticks_per_sec); | 163 | s->lastload, s->freq, ticks_per_sec); |
| @@ -245,7 +240,7 @@ static void pxa2xx_timer_write(void *opaque, target_phys_addr_t offset, | @@ -245,7 +240,7 @@ static void pxa2xx_timer_write(void *opaque, target_phys_addr_t offset, | ||
| 245 | case OSMR4: | 240 | case OSMR4: |
| 246 | if (!s->tm4) | 241 | if (!s->tm4) |
| 247 | goto badreg; | 242 | goto badreg; |
| 248 | - s->tm4[tm].value = value; | 243 | + s->tm4[tm].tm.value = value; |
| 249 | pxa2xx_timer_update4(s, qemu_get_clock(vm_clock), tm); | 244 | pxa2xx_timer_update4(s, qemu_get_clock(vm_clock), tm); |
| 250 | break; | 245 | break; |
| 251 | case OSCR: | 246 | case OSCR: |
| @@ -282,10 +277,10 @@ static void pxa2xx_timer_write(void *opaque, target_phys_addr_t offset, | @@ -282,10 +277,10 @@ static void pxa2xx_timer_write(void *opaque, target_phys_addr_t offset, | ||
| 282 | } | 277 | } |
| 283 | if (s->tm4) { | 278 | if (s->tm4) { |
| 284 | for (i = 0; i < 8; i ++, value >>= 1) | 279 | for (i = 0; i < 8; i ++, value >>= 1) |
| 285 | - if (s->tm4[i].level && (value & 1)) | ||
| 286 | - s->tm4[i].level = 0; | 280 | + if (s->tm4[i].tm.level && (value & 1)) |
| 281 | + s->tm4[i].tm.level = 0; | ||
| 287 | if (!(s->events & 0xff0)) | 282 | if (!(s->events & 0xff0)) |
| 288 | - qemu_irq_lower(s->tm4->irq); | 283 | + qemu_irq_lower(s->tm4->tm.irq); |
| 289 | } | 284 | } |
| 290 | break; | 285 | break; |
| 291 | case OWER: /* XXX: Reset on OSMR3 match? */ | 286 | case OWER: /* XXX: Reset on OSMR3 match? */ |
| @@ -362,13 +357,13 @@ static void pxa2xx_timer_tick(void *opaque) | @@ -362,13 +357,13 @@ static void pxa2xx_timer_tick(void *opaque) | ||
| 362 | static void pxa2xx_timer_tick4(void *opaque) | 357 | static void pxa2xx_timer_tick4(void *opaque) |
| 363 | { | 358 | { |
| 364 | struct pxa2xx_timer4_s *t = (struct pxa2xx_timer4_s *) opaque; | 359 | struct pxa2xx_timer4_s *t = (struct pxa2xx_timer4_s *) opaque; |
| 365 | - pxa2xx_timer_info *i = (pxa2xx_timer_info *) t->info; | 360 | + pxa2xx_timer_info *i = (pxa2xx_timer_info *) t->tm.info; |
| 366 | 361 | ||
| 367 | - pxa2xx_timer_tick(opaque); | 362 | + pxa2xx_timer_tick(&t->tm); |
| 368 | if (t->control & (1 << 3)) | 363 | if (t->control & (1 << 3)) |
| 369 | t->clock = 0; | 364 | t->clock = 0; |
| 370 | if (t->control & (1 << 6)) | 365 | if (t->control & (1 << 6)) |
| 371 | - pxa2xx_timer_update4(i, qemu_get_clock(vm_clock), t->num - 4); | 366 | + pxa2xx_timer_update4(i, qemu_get_clock(vm_clock), t->tm.num - 4); |
| 372 | } | 367 | } |
| 373 | 368 | ||
| 374 | static pxa2xx_timer_info *pxa2xx_timer_init(target_phys_addr_t base, | 369 | static pxa2xx_timer_info *pxa2xx_timer_init(target_phys_addr_t base, |
| @@ -420,14 +415,14 @@ void pxa27x_timer_init(target_phys_addr_t base, | @@ -420,14 +415,14 @@ void pxa27x_timer_init(target_phys_addr_t base, | ||
| 420 | s->tm4 = (struct pxa2xx_timer4_s *) qemu_mallocz(8 * | 415 | s->tm4 = (struct pxa2xx_timer4_s *) qemu_mallocz(8 * |
| 421 | sizeof(struct pxa2xx_timer4_s)); | 416 | sizeof(struct pxa2xx_timer4_s)); |
| 422 | for (i = 0; i < 8; i ++) { | 417 | for (i = 0; i < 8; i ++) { |
| 423 | - s->tm4[i].value = 0; | ||
| 424 | - s->tm4[i].irq = irq4; | ||
| 425 | - s->tm4[i].info = s; | ||
| 426 | - s->tm4[i].num = i + 4; | ||
| 427 | - s->tm4[i].level = 0; | 418 | + s->tm4[i].tm.value = 0; |
| 419 | + s->tm4[i].tm.irq = irq4; | ||
| 420 | + s->tm4[i].tm.info = s; | ||
| 421 | + s->tm4[i].tm.num = i + 4; | ||
| 422 | + s->tm4[i].tm.level = 0; | ||
| 428 | s->tm4[i].freq = 0; | 423 | s->tm4[i].freq = 0; |
| 429 | s->tm4[i].control = 0x0; | 424 | s->tm4[i].control = 0x0; |
| 430 | - s->tm4[i].qtimer = qemu_new_timer(vm_clock, | 425 | + s->tm4[i].tm.qtimer = qemu_new_timer(vm_clock, |
| 431 | pxa2xx_timer_tick4, &s->tm4[i]); | 426 | pxa2xx_timer_tick4, &s->tm4[i]); |
| 432 | } | 427 | } |
| 433 | } | 428 | } |