[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Qemu-arm] [PATCH] hw/arm/spitz: Move problematic nand_
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [Qemu-arm] [PATCH] hw/arm/spitz: Move problematic nand_init() code to realize function |
Date: |
Thu, 19 Jul 2018 22:35:25 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 |
On 07/19/2018 10:15 AM, Thomas Huth wrote:
> 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 <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
> ---
> hw/arm/spitz.c | 15 +++++++++++----
> 1 file changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/hw/arm/spitz.c b/hw/arm/spitz.c
> index 3cc27a1..c4bc3de 100644
> --- a/hw/arm/spitz.c
> +++ b/hw/arm/spitz.c
> @@ -169,16 +169,22 @@ static void sl_nand_init(Object *obj)
> {
> SLNANDState *s = SL_NAND(obj);
> SysBusDevice *dev = SYS_BUS_DEVICE(obj);
> - DriveInfo *nand;
>
> 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() */
> nand = drive_get(IF_MTD, 0, 0);
> s->nand = nand_init(nand ? blk_by_legacy_dinfo(nand) : NULL,
> 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 */
> @@ -1079,6 +1085,7 @@ static void sl_nand_class_init(ObjectClass *klass, void
> *data)
>
> dc->vmsd = &vmstate_sl_nand_info;
> dc->props = sl_nand_properties;
> + dc->realize = sl_nand_realize;
> /* Reason: init() method uses drive_get() */
> dc->user_creatable = false;
> }
>