hw/arm/spitz: Move problematic nand_init() code to realize function

nand_init() does not only create the NAND device, it also realizes
the device with qdev_init_nofail() already. So we must not call
nand_init() from an instance_init function like sl_nand_init(),
otherwise we get superfluous NAND devices in the QOM tree after
introspecting the 'sl-nand' device. So move the nand_init() to the
realize function of 'sl-nand' instead.

Signed-off-by: Thomas Huth <thuth@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-id: 1532006134-7701-1-git-send-email-thuth@redhat.com
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Thomas Huth 2018-07-23 15:21:26 +01:00 committed by Peter Maydell
parent 9d2b5a58f8
commit 07bc425ea3

View File

@ -169,16 +169,22 @@ static void sl_nand_init(Object *obj)
{ {
SLNANDState *s = SL_NAND(obj); SLNANDState *s = SL_NAND(obj);
SysBusDevice *dev = SYS_BUS_DEVICE(obj); SysBusDevice *dev = SYS_BUS_DEVICE(obj);
DriveInfo *nand;
s->ctl = 0; s->ctl = 0;
memory_region_init_io(&s->iomem, obj, &sl_ops, s, "sl", 0x40);
sysbus_init_mmio(dev, &s->iomem);
}
static void sl_nand_realize(DeviceState *dev, Error **errp)
{
SLNANDState *s = SL_NAND(dev);
DriveInfo *nand;
/* FIXME use a qdev drive property instead of drive_get() */ /* FIXME use a qdev drive property instead of drive_get() */
nand = drive_get(IF_MTD, 0, 0); nand = drive_get(IF_MTD, 0, 0);
s->nand = nand_init(nand ? blk_by_legacy_dinfo(nand) : NULL, s->nand = nand_init(nand ? blk_by_legacy_dinfo(nand) : NULL,
s->manf_id, s->chip_id); s->manf_id, s->chip_id);
memory_region_init_io(&s->iomem, obj, &sl_ops, s, "sl", 0x40);
sysbus_init_mmio(dev, &s->iomem);
} }
/* Spitz Keyboard */ /* Spitz Keyboard */
@ -1079,6 +1085,7 @@ static void sl_nand_class_init(ObjectClass *klass, void *data)
dc->vmsd = &vmstate_sl_nand_info; dc->vmsd = &vmstate_sl_nand_info;
dc->props = sl_nand_properties; dc->props = sl_nand_properties;
dc->realize = sl_nand_realize;
/* Reason: init() method uses drive_get() */ /* Reason: init() method uses drive_get() */
dc->user_creatable = false; dc->user_creatable = false;
} }