From: Bernhard Beschow <[email protected]> Extract an eSDHC (little endian) device model since the uSDHC device model will get an uSDHC-specific MMIO quirk.
Signed-off-by: Bernhard Beschow <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Tested-by: BALATON Zoltan <[email protected]> Message-ID: <[email protected]> Signed-off-by: Philippe Mathieu-Daudé <[email protected]> --- include/hw/sd/sdhci.h | 1 + hw/arm/fsl-imx25.c | 7 ++----- hw/sd/sdhci.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/include/hw/sd/sdhci.h b/include/hw/sd/sdhci.h index 3eb0684a890..32c52c7d0be 100644 --- a/include/hw/sd/sdhci.h +++ b/include/hw/sd/sdhci.h @@ -129,6 +129,7 @@ DECLARE_INSTANCE_CHECKER(SDHCIState, SYSBUS_SDHCI, TYPE_SYSBUS_SDHCI) #define TYPE_FSL_ESDHC_BE "fsl-esdhc-be" +#define TYPE_FSL_ESDHC_LE "fsl-esdhc-le" #define TYPE_IMX_USDHC "imx-usdhc" diff --git a/hw/arm/fsl-imx25.c b/hw/arm/fsl-imx25.c index 9e02063533c..7f65f4ca4bb 100644 --- a/hw/arm/fsl-imx25.c +++ b/hw/arm/fsl-imx25.c @@ -68,7 +68,8 @@ static void fsl_imx25_init(Object *obj) } for (i = 0; i < FSL_IMX25_NUM_ESDHCS; i++) { - object_initialize_child(obj, "sdhc[*]", &s->esdhc[i], TYPE_IMX_USDHC); + object_initialize_child(obj, "sdhc[*]", &s->esdhc[i], + TYPE_FSL_ESDHC_LE); } for (i = 0; i < FSL_IMX25_NUM_USBS; i++) { @@ -239,12 +240,8 @@ static void fsl_imx25_realize(DeviceState *dev, Error **errp) { FSL_IMX25_ESDHC2_ADDR, FSL_IMX25_ESDHC2_IRQ }, }; - object_property_set_uint(OBJECT(&s->esdhc[i]), "sd-spec-version", 2, - &error_abort); object_property_set_uint(OBJECT(&s->esdhc[i]), "capareg", IMX25_ESDHC_CAPABILITIES, &error_abort); - object_property_set_uint(OBJECT(&s->esdhc[i]), "vendor", - SDHCI_VENDOR_FSL, &error_abort); if (!sysbus_realize(SYS_BUS_DEVICE(&s->esdhc[i]), errp)) { return; } diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c index 6277abe8702..6001b71c61d 100644 --- a/hw/sd/sdhci.c +++ b/hw/sd/sdhci.c @@ -1897,6 +1897,32 @@ static void fsl_esdhc_be_init(Object *obj) qdev_prop_set_uint8(dev, "vendor", SDHCI_VENDOR_FSL); } +static const MemoryRegionOps esdhc_mmio_le_ops = { + .read = esdhc_read, + .write = esdhc_write, + .impl = { + .min_access_size = 4, + .max_access_size = 4, + }, + .valid = { + .min_access_size = 1, + .max_access_size = 4, + .unaligned = false + }, + .endianness = DEVICE_LITTLE_ENDIAN, +}; + +static void fsl_esdhc_le_init(Object *obj) +{ + SDHCIState *s = SYSBUS_SDHCI(obj); + DeviceState *dev = DEVICE(obj); + + s->io_ops = &esdhc_mmio_le_ops; + s->quirks = SDHCI_QUIRK_NO_BUSY_IRQ; + qdev_prop_set_uint8(dev, "sd-spec-version", 2); + qdev_prop_set_uint8(dev, "vendor", SDHCI_VENDOR_FSL); +} + static const MemoryRegionOps usdhc_mmio_ops = { .read = esdhc_read, .write = esdhc_write, @@ -1996,6 +2022,11 @@ static const TypeInfo sdhci_types[] = { .parent = TYPE_SYSBUS_SDHCI, .instance_init = fsl_esdhc_be_init, }, + { + .name = TYPE_FSL_ESDHC_LE, + .parent = TYPE_SYSBUS_SDHCI, + .instance_init = fsl_esdhc_le_init, + }, { .name = TYPE_IMX_USDHC, .parent = TYPE_SYSBUS_SDHCI, -- 2.52.0
