]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
hw/sd/sdhci: Set reset value of interrupt registers
authorBALATON Zoltan <balaton@eik.bme.hu>
Mon, 10 Feb 2025 16:03:29 +0000 (17:03 +0100)
committerPhilippe Mathieu-Daudé <philmd@linaro.org>
Tue, 11 Mar 2025 19:00:16 +0000 (20:00 +0100)
The interrupt enable registers are not reset to 0 on Freescale eSDHC
but some bits are enabled on reset. At least some U-Boot versions seem
to expect this and not initialise these registers before expecting
interrupts. Use existing vendor property for Freescale eSDHC and set
the reset value of the interrupt registers to match Freescale
documentation.

Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu>
Message-ID: <20250210160329.DDA7F4E600E@zero.eik.bme.hu>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
hw/ppc/e500.c
hw/sd/sdhci.c
include/hw/sd/sdhci.h

index fe8b9f79621b6a7f97360d38b9311e9d4e208746..69269aa24c4f40e9f4d3199b34e6adf1e8414f92 100644 (file)
@@ -1043,6 +1043,7 @@ void ppce500_init(MachineState *machine)
         dev = qdev_new(TYPE_SYSBUS_SDHCI);
         qdev_prop_set_uint8(dev, "sd-spec-version", 2);
         qdev_prop_set_uint8(dev, "endianness", DEVICE_BIG_ENDIAN);
+        qdev_prop_set_uint8(dev, "vendor", SDHCI_VENDOR_FSL);
         s = SYS_BUS_DEVICE(dev);
         sysbus_realize_and_unref(s, &error_fatal);
         sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC85XX_ESDHC_IRQ));
index 1f45a77566c074c967779d12ea42b3ca9da05a1a..fe87e18d5d2cea1c7ab11a4bbde4cf929122f6bb 100644 (file)
@@ -307,6 +307,10 @@ static void sdhci_reset(SDHCIState *s)
     s->data_count = 0;
     s->stopped_state = sdhc_not_stopped;
     s->pending_insert_state = false;
+    if (s->vendor == SDHCI_VENDOR_FSL) {
+        s->norintstsen = 0x013f;
+        s->errintstsen = 0x117f;
+    }
 }
 
 static void sdhci_poweron_reset(DeviceState *dev)
index 38c08e28598077898c38ad2ff3628239f8a84447..f722d8eb1ccec1037469f2ee2cb09064fdd7ca60 100644 (file)
@@ -110,6 +110,7 @@ typedef struct SDHCIState SDHCIState;
 
 #define SDHCI_VENDOR_NONE       0
 #define SDHCI_VENDOR_IMX        1
+#define SDHCI_VENDOR_FSL        2
 
 /*
  * Controller does not provide transfer-complete interrupt when not