Am 01.07.2013 12:18, schrieb Hu Tao: > Signed-off-by: Hu Tao <hu...@cn.fujitsu.com> > --- > hw/block/fdc.c | 62 > ++++++++++++++++++++++++++++++++++++++-------------------- > 1 file changed, 41 insertions(+), 21 deletions(-) > > diff --git a/hw/block/fdc.c b/hw/block/fdc.c > index f8270cb..0fe0cf9 100644 > --- a/hw/block/fdc.c > +++ b/hw/block/fdc.c > @@ -2145,38 +2145,58 @@ static void isabus_fdc_realize(DeviceState *dev, > Error **errp) > add_boot_device_path(isa->bootindexB, dev, "/floppy@1"); > } > > -static int sysbus_fdc_init1(SysBusDevice *dev) > +static void sysbus_fdc_initfn(Object *obj) > { > - FDCtrlSysBus *sys = SYSBUS_FDC(dev); > + FDCtrlSysBus *sys = SYSBUS_FDC(obj); > FDCtrl *fdctrl = &sys->state; > - int ret; > > memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_ops, fdctrl, "fdc", > 0x08); > - sysbus_init_mmio(dev, &fdctrl->iomem); > - sysbus_init_irq(dev, &fdctrl->irq); > - qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1); > - fdctrl->dma_chann = -1; > +} > > - qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */ > - ret = fdctrl_init_common(fdctrl); > +static void sysbus_fdc_realize(DeviceState *dev, Error **errp) > +{ > + FDCtrlSysBus *sys = SYSBUS_FDC(dev); > + FDCtrl *fdctrl = &sys->state; > + SysBusDevice *b = SYS_BUS_DEVICE(dev); > > - return ret; > + > + sysbus_init_mmio(b, &fdctrl->iomem); > + sysbus_init_irq(b, &fdctrl->irq); > + qdev_init_gpio_in(dev, fdctrl_handle_tc, 1); > + fdctrl->dma_chann = -1; > + > + qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */ > + if (fdctrl_init_common(fdctrl) < 0) { > + error_setg(errp, "Floppy init failed."); > + return; > + } > } > > -static int sun4m_fdc_init1(SysBusDevice *dev) > +static void sun4m_fdc_initfn(Object *obj) > { > - FDCtrlSysBus *sys = SYSBUS_FDC(dev); > + FDCtrlSysBus *sys = SYSBUS_FDC(obj); > FDCtrl *fdctrl = &sys->state; > > memory_region_init_io(&fdctrl->iomem, &fdctrl_mem_strict_ops, fdctrl, > "fdctrl", 0x08); > - sysbus_init_mmio(dev, &fdctrl->iomem); > - sysbus_init_irq(dev, &fdctrl->irq); > - qdev_init_gpio_in(DEVICE(dev), fdctrl_handle_tc, 1); > +} > + > +static void sun4m_fdc_realize(DeviceState *dev, Error **errp) > +{ > + FDCtrlSysBus *sys = SYSBUS_FDC(dev); > + FDCtrl *fdctrl = &sys->state; > + SysBusDevice *b = SYS_BUS_DEVICE(dev);
I've renamed this variable to Peter's suggested sbd and posted a follow-up to rename fdctrl_init_common() to fdctrl_realize_common() and to propagate Error** from fdctrl_connect_drives() directly into the realizefn. Andreas > + > + sysbus_init_mmio(b, &fdctrl->iomem); > + sysbus_init_irq(b, &fdctrl->irq); > + qdev_init_gpio_in(dev, fdctrl_handle_tc, 1); > > fdctrl->sun4m = 1; > - qdev_set_legacy_instance_id(DEVICE(dev), 0 /* io */, 2); /* FIXME */ > - return fdctrl_init_common(fdctrl); > + qdev_set_legacy_instance_id(dev, 0 /* io */, 2); /* FIXME */ > + if (fdctrl_init_common(fdctrl) < 0) { > + error_setg(errp, "Floppy init failed."); > + return; > + } > } > > FDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i) > @@ -2247,9 +2267,8 @@ static Property sysbus_fdc_properties[] = { > static void sysbus_fdc_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); > > - k->init = sysbus_fdc_init1; > + dc->realize = sysbus_fdc_realize; > dc->reset = fdctrl_external_reset_sysbus; > dc->vmsd = &vmstate_sysbus_fdc; > dc->props = sysbus_fdc_properties; > @@ -2259,6 +2278,7 @@ static const TypeInfo sysbus_fdc_info = { > .name = TYPE_SYSBUS_FDC, > .parent = TYPE_SYS_BUS_DEVICE, > .instance_size = sizeof(FDCtrlSysBus), > + .instance_init = sysbus_fdc_initfn, > .class_init = sysbus_fdc_class_init, > }; > > @@ -2270,9 +2290,8 @@ static Property sun4m_fdc_properties[] = { > static void sun4m_fdc_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > - SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass); > > - k->init = sun4m_fdc_init1; > + dc->realize = sun4m_fdc_realize; > dc->reset = fdctrl_external_reset_sysbus; > dc->vmsd = &vmstate_sysbus_fdc; > dc->props = sun4m_fdc_properties; > @@ -2282,6 +2301,7 @@ static const TypeInfo sun4m_fdc_info = { > .name = "SUNW,fdtwo", > .parent = TYPE_SYS_BUS_DEVICE, > .instance_size = sizeof(FDCtrlSysBus), > + .instance_init = sun4m_fdc_initfn, > .class_init = sun4m_fdc_class_init, > }; > > -- SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer; HRB 16746 AG Nürnberg