On Mon, 10 Mar 2025, Philippe Mathieu-Daudé wrote:
Add MemoryRegionOps as a class property. For now it is only
used by TYPE_IMX_USDHC.
Otherwise the default remains in little endian.

I still don't see why you need to do this via the class and not just set it init or realize as it's done already but it should work so

Reviewed-by: BALATON Zoltan <bala...@eik.bme.hu>

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 dfa0c214036..108bc1993c6 100644
--- a/include/hw/sd/sdhci.h
+++ b/include/hw/sd/sdhci.h
@@ -117,6 +117,7 @@ struct SDHCIClass {
        SysBusDeviceClass sbd_parent_class;
    };

+    const MemoryRegionOps *io_ops;
    uint32_t quirks;
    uint64_t iomem_size;
};
diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
index 3467385490d..6868bf68285 100644
--- a/hw/sd/sdhci.c
+++ b/hw/sd/sdhci.c
@@ -1428,8 +1428,6 @@ void sdhci_initfn(SDHCIState *s)
    s->transfer_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
                                     sdhci_data_transfer, s);
    s->quirks = s->sc->quirks;
-
-    s->io_ops = &sdhci_mmio_le_ops;
}

void sdhci_uninitfn(SDHCIState *s)
@@ -1447,6 +1445,7 @@ void sdhci_common_realize(SDHCIState *s, Error **errp)
    SDHCIClass *sc = s->sc;
    const char *class_name = object_get_typename(OBJECT(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 */
@@ -1890,17 +1889,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 = BIT(SDHCI_QUIRK_NO_BUSY_IRQ);

    sdhci_common_class_init(oc, data);
@@ -1957,11 +1950,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[] = {
@@ -1983,13 +1978,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,
    },
};

Reply via email to