Kaynağa Gözat

hw/sd/sdhci: Set reset value of interrupt registers

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>
BALATON Zoltan 6 ay önce
ebeveyn
işleme
d060b2789f
3 değiştirilmiş dosya ile 6 ekleme ve 0 silme
  1. 1 0
      hw/ppc/e500.c
  2. 4 0
      hw/sd/sdhci.c
  3. 1 0
      include/hw/sd/sdhci.h

+ 1 - 0
hw/ppc/e500.c

@@ -1043,6 +1043,7 @@ void ppce500_init(MachineState *machine)
         dev = qdev_new(TYPE_SYSBUS_SDHCI);
         dev = qdev_new(TYPE_SYSBUS_SDHCI);
         qdev_prop_set_uint8(dev, "sd-spec-version", 2);
         qdev_prop_set_uint8(dev, "sd-spec-version", 2);
         qdev_prop_set_uint8(dev, "endianness", DEVICE_BIG_ENDIAN);
         qdev_prop_set_uint8(dev, "endianness", DEVICE_BIG_ENDIAN);
+        qdev_prop_set_uint8(dev, "vendor", SDHCI_VENDOR_FSL);
         s = SYS_BUS_DEVICE(dev);
         s = SYS_BUS_DEVICE(dev);
         sysbus_realize_and_unref(s, &error_fatal);
         sysbus_realize_and_unref(s, &error_fatal);
         sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC85XX_ESDHC_IRQ));
         sysbus_connect_irq(s, 0, qdev_get_gpio_in(mpicdev, MPC85XX_ESDHC_IRQ));

+ 4 - 0
hw/sd/sdhci.c

@@ -307,6 +307,10 @@ static void sdhci_reset(SDHCIState *s)
     s->data_count = 0;
     s->data_count = 0;
     s->stopped_state = sdhc_not_stopped;
     s->stopped_state = sdhc_not_stopped;
     s->pending_insert_state = false;
     s->pending_insert_state = false;
+    if (s->vendor == SDHCI_VENDOR_FSL) {
+        s->norintstsen = 0x013f;
+        s->errintstsen = 0x117f;
+    }
 }
 }
 
 
 static void sdhci_poweron_reset(DeviceState *dev)
 static void sdhci_poweron_reset(DeviceState *dev)

+ 1 - 0
include/hw/sd/sdhci.h

@@ -110,6 +110,7 @@ typedef struct SDHCIState SDHCIState;
 
 
 #define SDHCI_VENDOR_NONE       0
 #define SDHCI_VENDOR_NONE       0
 #define SDHCI_VENDOR_IMX        1
 #define SDHCI_VENDOR_IMX        1
+#define SDHCI_VENDOR_FSL        2
 
 
 /*
 /*
  * Controller does not provide transfer-complete interrupt when not
  * Controller does not provide transfer-complete interrupt when not