}
};
-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);
}
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;
}
int iobase = 0x3f0;
int isairq = 6;
int dma_chann = 2;
+ int ret;
register_ioport_read(iobase + 0x01, 5, 1,
&fdctrl_read_port, fdctrl);
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);
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)
.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),
.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),
.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(),