Browse Source

Marvell/Armada70x0Db: Update CP0 MMC settings

This patch enables switching to 1.8V power supply
on the VCCQ rail of the CP0 MMC interface,
which allows to operate at HS200 in EDK2 and when
booting with ACPI.

Signed-off-by: Marcin Wojtas <mw@semihalf.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
Marcin Wojtas 3 years ago
parent
commit
a3f0291c7a

+ 1 - 1
Platform/Marvell/Armada70x0Db/Armada70x0DbBoardDescLib/Armada70x0DbBoardDescLib.c

@@ -104,7 +104,7 @@ MV_BOARD_SDMMC_DESC mSdMmcDescTemplate[] = {
   { /* SD/MMC 0xF2780000 */
     0,     /* SOC will be filled by MvBoardDescDxe */
     0,     /* SdMmcDevCount will be filled by MvBoardDescDxe */
-    FALSE, /* Xenon1v8Enabled */
+    TRUE,  /* Xenon1v8Enabled */
     FALSE, /* Xenon8BitBusEnabled */
     FALSE, /* XenonSlowModeEnabled */
     0x19,  /* XenonTuningStepDivisor */

+ 59 - 20
Platform/Marvell/Armada70x0Db/NonDiscoverableInitLib/NonDiscoverableInitLib.c

@@ -21,6 +21,37 @@
 
 #include "NonDiscoverableInitLib.h"
 
+STATIC
+EFI_STATUS
+EFIAPI
+ConfigurePins (
+  IN  CONST MV_GPIO_PIN        *VbusPin,
+  IN  UINTN                     PinCount,
+  IN  MV_GPIO_DRIVER_TYPE       DriverType
+  )
+{
+  EMBEDDED_GPIO_MODE   Mode;
+  EMBEDDED_GPIO_PIN    Gpio;
+  EMBEDDED_GPIO       *GpioProtocol;
+  EFI_STATUS           Status;
+  UINTN                Index;
+
+  Status = MvGpioGetProtocol (DriverType, &GpioProtocol);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "%a: Unable to find GPIO protocol\n", __FUNCTION__));
+    return Status;
+  }
+
+  for (Index = 0; Index < PinCount; Index++) {
+    Mode = VbusPin->ActiveHigh ? GPIO_MODE_OUTPUT_1 : GPIO_MODE_OUTPUT_0;
+    Gpio = GPIO (VbusPin->ControllerId, VbusPin->PinNumber);
+    GpioProtocol->Set (GpioProtocol, Gpio, Mode);
+    VbusPin++;
+  }
+
+  return EFI_SUCCESS;
+}
+
 STATIC CONST MV_GPIO_PIN mXhciVbusPins[] = {
   {
     MV_GPIO_DRIVER_TYPE_PCA95XX,
@@ -55,28 +86,30 @@ XhciInit (
   IN  NON_DISCOVERABLE_DEVICE  *This
   )
 {
-  CONST MV_GPIO_PIN   *VbusPin;
-  EMBEDDED_GPIO_MODE   Mode;
-  EMBEDDED_GPIO_PIN    Gpio;
-  EMBEDDED_GPIO       *GpioProtocol;
-  EFI_STATUS           Status;
-  UINTN                Index;
-
-  Status = MvGpioGetProtocol (MV_GPIO_DRIVER_TYPE_PCA95XX, &GpioProtocol);
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "%a: Unable to find GPIO protocol\n", __FUNCTION__));
-    return Status;
-  }
+  return ConfigurePins (mXhciVbusPins,
+           ARRAY_SIZE (mXhciVbusPins),
+           MV_GPIO_DRIVER_TYPE_PCA95XX);
+}
 
-  VbusPin = mXhciVbusPins;
-  for (Index = 0; Index < ARRAY_SIZE (mXhciVbusPins); Index++) {
-    Mode = VbusPin->ActiveHigh ? GPIO_MODE_OUTPUT_1 : GPIO_MODE_OUTPUT_0;
-    Gpio = GPIO (VbusPin->ControllerId, VbusPin->PinNumber);
-    GpioProtocol->Set (GpioProtocol, Gpio, Mode);
-    VbusPin++;
-  }
+STATIC CONST MV_GPIO_PIN mCp0SdMmcPins[] = {
+  {
+    MV_GPIO_DRIVER_TYPE_PCA95XX,
+    ARMADA_70x0_DB_IO_EXPANDER0,
+    ARMADA_70x0_DB_SDMMC_CP0_VCCQ_PIN,
+    TRUE,
+  },
+};
 
-  return EFI_SUCCESS;
+STATIC
+EFI_STATUS
+EFIAPI
+Cp0SdMmcInit (
+  IN  NON_DISCOVERABLE_DEVICE  *This
+  )
+{
+  return ConfigurePins (mCp0SdMmcPins,
+           ARRAY_SIZE (mCp0SdMmcPins),
+           MV_GPIO_DRIVER_TYPE_PCA95XX);
 }
 
 NON_DISCOVERABLE_DEVICE_INIT
@@ -90,5 +123,11 @@ NonDiscoverableDeviceInitializerGet (
         return XhciInit;
   }
 
+  if (Type == NonDiscoverableDeviceTypeSdhci) {
+    switch (Index) {
+    case 1:
+      return Cp0SdMmcInit;
+    }
+  }
   return NULL;
 }

+ 1 - 0
Platform/Marvell/Armada70x0Db/NonDiscoverableInitLib/NonDiscoverableInitLib.h

@@ -13,5 +13,6 @@
 #define ARMADA_70x0_DB_VBUS0_LIMIT_PIN    4
 #define ARMADA_70x0_DB_VBUS1_PIN          1
 #define ARMADA_70x0_DB_VBUS1_LIMIT_PIN    5
+#define ARMADA_70x0_DB_SDMMC_CP0_VCCQ_PIN 15
 
 #endif