Add MemoryRegionOps as a class property. For now it is only used by TYPE_IMX_USDHC. Otherwise the default remains in little endian.
Signed-off-by: Philippe Mathieu-Daudé <phi...@linaro.org> --- include/hw/sd/sdhci.h | 1 + hw/sd/sdhci.c | 22 ++++++++-------------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h index 2709a7a69d5..60a0442c805 100644 --- a/include/hw/sd/sdhci.h +++ b/include/hw/sd/sdhci.h @@ -112,6 +112,7 @@ typedef struct SDHCIClass { SysBusDeviceClass sbd_parent_class; }; + const MemoryRegionOps *io_ops; uint32_t quirks; uint64_t iomem_size; } SDHCIClass; diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c index 59d506cafa3..d87a7bb45a4 100644 --- a/hw/sd/sdhci.c +++ b/hw/sd/sdhci.c @@ -1427,8 +1427,6 @@ void sdhci_initfn(SDHCIState *s) sdhci_raise_insertion_irq, s); s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, sdhci_data_transfer, s); - - s->io_ops = &sdhci_mmio_le_ops; } void sdhci_uninitfn(SDHCIState *s) @@ -1445,6 +1443,7 @@ void sdhci_common_realize(SDHCIState *s, Error **errp) ERRP_GUARD(); SDHCIClass *sc = SYSBUS_SDHCI_GET_CLASS(s); + s->io_ops = sc->io_ops ?: &sdhci_mmio_le_ops; switch (s->endianness) { case DEVICE_LITTLE_ENDIAN: /* s->io_ops is little endian by default */ @@ -1888,17 +1887,11 @@ static const MemoryRegionOps usdhc_mmio_ops = { .endianness = DEVICE_LITTLE_ENDIAN, }; -static void imx_usdhc_init(Object *obj) -{ - SDHCIState *s = SYSBUS_SDHCI(obj); - - s->io_ops = &usdhc_mmio_ops; -} - static void imx_usdhc_class_init(ObjectClass *oc, void *data) { SDHCIClass *sc = SYSBUS_SDHCI_CLASS(oc); + sc->io_ops = &usdhc_mmio_ops; sc->quirks = SDHCI_QUIRK_NO_BUSY_IRQ; sdhci_common_class_init(oc, data); @@ -1955,11 +1948,13 @@ static const MemoryRegionOps sdhci_s3c_mmio_ops = { .endianness = DEVICE_LITTLE_ENDIAN, }; -static void sdhci_s3c_init(Object *obj) +static void sdhci_s3c_class_init(ObjectClass *oc, void *data) { - SDHCIState *s = SYSBUS_SDHCI(obj); + SDHCIClass *sc = SYSBUS_SDHCI_CLASS(oc); - s->io_ops = &sdhci_s3c_mmio_ops; + sc->io_ops = &sdhci_s3c_mmio_ops; + + sdhci_common_class_init(oc, data); } static const TypeInfo sdhci_types[] = { @@ -1981,13 +1976,12 @@ static const TypeInfo sdhci_types[] = { { .name = TYPE_IMX_USDHC, .parent = TYPE_SYSBUS_SDHCI, - .instance_init = imx_usdhc_init, .class_init = imx_usdhc_class_init, }, { .name = TYPE_S3C_SDHCI, .parent = TYPE_SYSBUS_SDHCI, - .instance_init = sdhci_s3c_init, + .class_init = sdhci_s3c_class_init, }, }; -- 2.47.1