aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
Diffstat (limited to 'hw')
-rw-r--r--hw/fdc.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/hw/fdc.c b/hw/fdc.c
index a21e05f0eb..b584b9867c 100644
--- a/hw/fdc.c
+++ b/hw/fdc.c
@@ -699,9 +699,18 @@ static const VMStateDescription vmstate_fdc = {
}
};
-static void fdctrl_external_reset(void *opaque)
+static void fdctrl_external_reset_sysbus(DeviceState *d)
{
- fdctrl_t *s = opaque;
+ fdctrl_sysbus_t *sys = container_of(d, fdctrl_sysbus_t, busdev.qdev);
+ fdctrl_t *s = &sys->state;
+
+ fdctrl_reset(s, 0);
+}
+
+static void fdctrl_external_reset_isa(DeviceState *d)
+{
+ fdctrl_isabus_t *isa = container_of(d, fdctrl_isabus_t, busdev.qdev);
+ fdctrl_t *s = &isa->state;
fdctrl_reset(s, 0);
}
@@ -1923,9 +1932,6 @@ static int fdctrl_init_common(fdctrl_t *fdctrl)
DMA_register_channel(fdctrl->dma_chann, &fdctrl_transfer_handler, fdctrl);
fdctrl_connect_drives(fdctrl);
- fdctrl_external_reset(fdctrl);
- vmstate_register(-1, &vmstate_fdc, fdctrl);
- qemu_register_reset(fdctrl_external_reset, fdctrl);
return 0;
}
@@ -1936,6 +1942,7 @@ static int isabus_fdc_init1(ISADevice *dev)
int iobase = 0x3f0;
int isairq = 6;
int dma_chann = 2;
+ int ret;
register_ioport_read(iobase + 0x01, 5, 1,
&fdctrl_read_port, fdctrl);
@@ -1948,13 +1955,18 @@ static int isabus_fdc_init1(ISADevice *dev)
isa_init_irq(&isa->busdev, &fdctrl->irq, isairq);
fdctrl->dma_chann = dma_chann;
- return fdctrl_init_common(fdctrl);
+ ret = fdctrl_init_common(fdctrl);
+ fdctrl_external_reset_isa(&isa->busdev.qdev);
+
+ return ret;
}
static int sysbus_fdc_init1(SysBusDevice *dev)
{
- fdctrl_t *fdctrl = &(FROM_SYSBUS(fdctrl_sysbus_t, dev)->state);
+ fdctrl_sysbus_t *sys = DO_UPCAST(fdctrl_sysbus_t, busdev, dev);
+ fdctrl_t *fdctrl = &sys->state;
int io;
+ int ret;
io = cpu_register_io_memory(fdctrl_mem_read, fdctrl_mem_write, fdctrl);
sysbus_init_mmio(dev, 0x08, io);
@@ -1962,7 +1974,10 @@ static int sysbus_fdc_init1(SysBusDevice *dev)
qdev_init_gpio_in(&dev->qdev, fdctrl_handle_tc, 1);
fdctrl->dma_chann = -1;
- return fdctrl_init_common(fdctrl);
+ ret = fdctrl_init_common(fdctrl);
+ fdctrl_external_reset_sysbus(&sys->busdev.qdev);
+
+ return ret;
}
static int sun4m_fdc_init1(SysBusDevice *dev)
@@ -1984,6 +1999,8 @@ static ISADeviceInfo isa_fdc_info = {
.init = isabus_fdc_init1,
.qdev.name = "isa-fdc",
.qdev.size = sizeof(fdctrl_isabus_t),
+ .qdev.vmsd = &vmstate_fdc,
+ .qdev.reset = fdctrl_external_reset_isa,
.qdev.props = (Property[]) {
DEFINE_PROP_DRIVE("driveA", fdctrl_isabus_t, state.drives[0].dinfo),
DEFINE_PROP_DRIVE("driveB", fdctrl_isabus_t, state.drives[1].dinfo),
@@ -1995,6 +2012,8 @@ static SysBusDeviceInfo sysbus_fdc_info = {
.init = sysbus_fdc_init1,
.qdev.name = "sysbus-fdc",
.qdev.size = sizeof(fdctrl_sysbus_t),
+ .qdev.vmsd = &vmstate_fdc,
+ .qdev.reset = fdctrl_external_reset_sysbus,
.qdev.props = (Property[]) {
DEFINE_PROP_DRIVE("driveA", fdctrl_sysbus_t, state.drives[0].dinfo),
DEFINE_PROP_DRIVE("driveB", fdctrl_sysbus_t, state.drives[1].dinfo),
@@ -2006,6 +2025,8 @@ static SysBusDeviceInfo sun4m_fdc_info = {
.init = sun4m_fdc_init1,
.qdev.name = "SUNW,fdtwo",
.qdev.size = sizeof(fdctrl_sysbus_t),
+ .qdev.vmsd = &vmstate_fdc,
+ .qdev.reset = fdctrl_external_reset_sysbus,
.qdev.props = (Property[]) {
DEFINE_PROP_DRIVE("drive", fdctrl_sysbus_t, state.drives[0].dinfo),
DEFINE_PROP_END_OF_LIST(),