Commit 33093a0afc069cc505e35b2580260faad4a6ecd4
1 parent
0c34a5d7
Parallel port reset
Attached patch adds a reset handler to parallel port, so it gets correct register values after a reset. (Hervé Poussineau) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5942 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
11 additions
and
5 deletions
hw/parallel.c
| @@ -418,8 +418,10 @@ static uint32_t parallel_ioport_ecp_read(void *opaque, uint32_t addr) | @@ -418,8 +418,10 @@ static uint32_t parallel_ioport_ecp_read(void *opaque, uint32_t addr) | ||
| 418 | return ret; | 418 | return ret; |
| 419 | } | 419 | } |
| 420 | 420 | ||
| 421 | -static void parallel_reset(ParallelState *s, qemu_irq irq, CharDriverState *chr) | 421 | +static void parallel_reset(void *opaque) |
| 422 | { | 422 | { |
| 423 | + ParallelState *s = opaque; | ||
| 424 | + | ||
| 423 | s->datar = ~0; | 425 | s->datar = ~0; |
| 424 | s->dataw = ~0; | 426 | s->dataw = ~0; |
| 425 | s->status = PARA_STS_BUSY; | 427 | s->status = PARA_STS_BUSY; |
| @@ -430,9 +432,7 @@ static void parallel_reset(ParallelState *s, qemu_irq irq, CharDriverState *chr) | @@ -430,9 +432,7 @@ static void parallel_reset(ParallelState *s, qemu_irq irq, CharDriverState *chr) | ||
| 430 | s->control = PARA_CTR_SELECT; | 432 | s->control = PARA_CTR_SELECT; |
| 431 | s->control |= PARA_CTR_INIT; | 433 | s->control |= PARA_CTR_INIT; |
| 432 | s->control |= 0xc0; | 434 | s->control |= 0xc0; |
| 433 | - s->irq = irq; | ||
| 434 | s->irq_pending = 0; | 435 | s->irq_pending = 0; |
| 435 | - s->chr = chr; | ||
| 436 | s->hw_driver = 0; | 436 | s->hw_driver = 0; |
| 437 | s->epp_timeout = 0; | 437 | s->epp_timeout = 0; |
| 438 | s->last_read_offset = ~0U; | 438 | s->last_read_offset = ~0U; |
| @@ -447,7 +447,10 @@ ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | @@ -447,7 +447,10 @@ ParallelState *parallel_init(int base, qemu_irq irq, CharDriverState *chr) | ||
| 447 | s = qemu_mallocz(sizeof(ParallelState)); | 447 | s = qemu_mallocz(sizeof(ParallelState)); |
| 448 | if (!s) | 448 | if (!s) |
| 449 | return NULL; | 449 | return NULL; |
| 450 | - parallel_reset(s, irq, chr); | 450 | + s->irq = irq; |
| 451 | + s->chr = chr; | ||
| 452 | + parallel_reset(s); | ||
| 453 | + qemu_register_reset(parallel_reset, s); | ||
| 451 | 454 | ||
| 452 | if (qemu_chr_ioctl(chr, CHR_IOCTL_PP_READ_STATUS, &dummy) == 0) { | 455 | if (qemu_chr_ioctl(chr, CHR_IOCTL_PP_READ_STATUS, &dummy) == 0) { |
| 453 | s->hw_driver = 1; | 456 | s->hw_driver = 1; |
| @@ -538,8 +541,11 @@ ParallelState *parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq | @@ -538,8 +541,11 @@ ParallelState *parallel_mm_init(target_phys_addr_t base, int it_shift, qemu_irq | ||
| 538 | s = qemu_mallocz(sizeof(ParallelState)); | 541 | s = qemu_mallocz(sizeof(ParallelState)); |
| 539 | if (!s) | 542 | if (!s) |
| 540 | return NULL; | 543 | return NULL; |
| 541 | - parallel_reset(s, irq, chr); | 544 | + s->irq = irq; |
| 545 | + s->chr = chr; | ||
| 542 | s->it_shift = it_shift; | 546 | s->it_shift = it_shift; |
| 547 | + parallel_reset(s); | ||
| 548 | + qemu_register_reset(parallel_reset, s); | ||
| 543 | 549 | ||
| 544 | io_sw = cpu_register_io_memory(0, parallel_mm_read_sw, parallel_mm_write_sw, s); | 550 | io_sw = cpu_register_io_memory(0, parallel_mm_read_sw, parallel_mm_write_sw, s); |
| 545 | cpu_register_physical_memory(base, 8 << it_shift, io_sw); | 551 | cpu_register_physical_memory(base, 8 << it_shift, io_sw); |