Revision 1d190d5c
b/hw/cs4231a.c | ||
---|---|---|
596 | 596 |
return dma_pos; |
597 | 597 |
} |
598 | 598 |
|
599 |
static void cs_save (QEMUFile *f, void *opaque)
|
|
599 |
static int cs4231a_pre_load (void *opaque)
|
|
600 | 600 |
{ |
601 | 601 |
CSState *s = opaque; |
602 |
unsigned int i; |
|
603 |
uint32_t val; |
|
604 | 602 |
|
605 |
for (i = 0; i < CS_REGS; i++) |
|
606 |
qemu_put_be32s (f, &s->regs[i]); |
|
607 |
|
|
608 |
qemu_put_buffer (f, s->dregs, CS_DREGS); |
|
609 |
val = s->dma_running; qemu_put_be32s (f, &val); |
|
610 |
val = s->audio_free; qemu_put_be32s (f, &val); |
|
611 |
val = s->transferred; qemu_put_be32s (f, &val); |
|
612 |
val = s->aci_counter; qemu_put_be32s (f, &val); |
|
603 |
if (s->dma_running) { |
|
604 |
DMA_release_DREQ (s->dma); |
|
605 |
AUD_set_active_out (s->voice, 0); |
|
606 |
} |
|
607 |
s->dma_running = 0; |
|
608 |
return 0; |
|
613 | 609 |
} |
614 | 610 |
|
615 |
static int cs_load (QEMUFile *f, void *opaque, int version_id)
|
|
611 |
static int cs4231a_post_load (void *opaque, int version_id)
|
|
616 | 612 |
{ |
617 | 613 |
CSState *s = opaque; |
618 |
unsigned int i; |
|
619 |
uint32_t val, dma_running; |
|
620 |
|
|
621 |
if (version_id > 1) |
|
622 |
return -EINVAL; |
|
623 | 614 |
|
624 |
for (i = 0; i < CS_REGS; i++) |
|
625 |
qemu_get_be32s (f, &s->regs[i]); |
|
626 |
|
|
627 |
qemu_get_buffer (f, s->dregs, CS_DREGS); |
|
628 |
|
|
629 |
qemu_get_be32s (f, &dma_running); |
|
630 |
qemu_get_be32s (f, &val); s->audio_free = val; |
|
631 |
qemu_get_be32s (f, &val); s->transferred = val; |
|
632 |
qemu_get_be32s (f, &val); s->aci_counter = val; |
|
633 |
if (dma_running && (s->dregs[Interface_Configuration] & PEN)) |
|
615 |
if (s->dma_running && (s->dregs[Interface_Configuration] & PEN)) { |
|
616 |
s->dma_running = 0; |
|
634 | 617 |
cs_reset_voices (s, s->dregs[FS_And_Playback_Data_Format]); |
618 |
} |
|
635 | 619 |
return 0; |
636 | 620 |
} |
637 | 621 |
|
622 |
static const VMStateDescription vmstate_cs4231a = { |
|
623 |
.name = "cs4231a", |
|
624 |
.version_id = 1, |
|
625 |
.minimum_version_id = 1, |
|
626 |
.minimum_version_id_old = 1, |
|
627 |
.pre_load = cs4231a_pre_load, |
|
628 |
.post_load = cs4231a_post_load, |
|
629 |
.fields = (VMStateField []) { |
|
630 |
VMSTATE_UINT32_ARRAY(regs, CSState, CS_REGS), |
|
631 |
VMSTATE_BUFFER(dregs, CSState), |
|
632 |
VMSTATE_INT32(dma_running, CSState), |
|
633 |
VMSTATE_INT32(audio_free, CSState), |
|
634 |
VMSTATE_INT32(transferred, CSState), |
|
635 |
VMSTATE_INT32(aci_counter, CSState), |
|
636 |
VMSTATE_END_OF_LIST() |
|
637 |
} |
|
638 |
}; |
|
639 |
|
|
638 | 640 |
static int cs4231a_initfn (ISADevice *dev) |
639 | 641 |
{ |
640 | 642 |
CSState *s = DO_UPCAST (CSState, dev, dev); |
... | ... | |
649 | 651 |
|
650 | 652 |
DMA_register_channel (s->dma, cs_dma_read, s); |
651 | 653 |
|
652 |
register_savevm ("cs4231a", 0, 1, cs_save, cs_load, s);
|
|
654 |
vmstate_register (0, &vmstate_cs4231a, s);
|
|
653 | 655 |
qemu_register_reset (cs_reset, s); |
654 | 656 |
cs_reset (s); |
655 | 657 |
|
Also available in: Unified diff