svn commit: r351218 - head/sys/arm/ti

Emmanuel Vadot manu at FreeBSD.org
Mon Aug 19 14:33:22 UTC 2019


Author: manu
Date: Mon Aug 19 14:33:22 2019
New Revision: 351218
URL: https://svnweb.freebsd.org/changeset/base/351218

Log:
  ti: sdhci: Correct voltage caps
  
  ti,dual-volt property say that the eMMC support 1.8V and 3.3V not 3.0V
  Use the correct caps for the mmc stack.
  Note that the MMCHS_SD_CAPA register can only be written once after bootup
  so if one is using a u-boot compiled with eMMC support (this is the default)
  this code is a no-op but just in case someone have u-boot compiled without
  eMMC support this make eMMC works when the kernel is booted.
  
  MFC after:	1 week

Modified:
  head/sys/arm/ti/ti_sdhci.c

Modified: head/sys/arm/ti/ti_sdhci.c
==============================================================================
--- head/sys/arm/ti/ti_sdhci.c	Mon Aug 19 14:28:54 2019	(r351217)
+++ head/sys/arm/ti/ti_sdhci.c	Mon Aug 19 14:33:22 2019	(r351218)
@@ -482,15 +482,14 @@ ti_sdhci_hw_init(device_t dev)
 	 * The attach() routine has examined fdt data and set flags in
 	 * slot.host.caps to reflect what voltages we can handle.  Set those
 	 * values in the CAPA register.  The manual says that these values can
-	 * only be set once, "before initialization" whatever that means, and
-	 * that they survive a reset.  So maybe doing this will be a no-op if
-	 * u-boot has already initialized the hardware.
+	 * only be set once, and that they survive a reset so unless u-boot didn't
+	 * set this register this code is a no-op.
 	 */
 	regval = ti_mmchs_read_4(sc, MMCHS_SD_CAPA);
 	if (sc->slot.host.caps & MMC_OCR_LOW_VOLTAGE)
 		regval |= MMCHS_SD_CAPA_VS18;
-	if (sc->slot.host.caps & (MMC_OCR_290_300 | MMC_OCR_300_310))
-		regval |= MMCHS_SD_CAPA_VS30;
+	if (sc->slot.host.caps & (MMC_OCR_320_330 | MMC_OCR_330_340))
+		regval |= MMCHS_SD_CAPA_VS33;
 	ti_mmchs_write_4(sc, MMCHS_SD_CAPA, regval);
 
 	/* Set initial host configuration (1-bit, std speed, pwr off). */
@@ -524,17 +523,20 @@ ti_sdhci_attach(device_t dev)
 	}
 
 	/*
-	 * The hardware can inherently do dual-voltage (1p8v, 3p0v) on the first
+	 * The hardware can inherently do dual-voltage (1p8v, 3p3v) on the first
 	 * device, and only 1p8v on other devices unless an external transceiver
 	 * is used.  The only way we could know about a transceiver is fdt data.
 	 * Note that we have to do this before calling ti_sdhci_hw_init() so
 	 * that it can set the right values in the CAPA register, which can only
 	 * be done once and never reset.
 	 */
-	sc->slot.host.caps |= MMC_OCR_LOW_VOLTAGE;
-	if (sc->mmchs_clk_id == MMC1_CLK || OF_hasprop(node, "ti,dual-volt")) {
-		sc->slot.host.caps |= MMC_OCR_290_300 | MMC_OCR_300_310;
-	}
+	if (OF_hasprop(node, "ti,dual-volt")) {
+		sc->slot.host.caps |= MMC_OCR_LOW_VOLTAGE | MMC_OCR_320_330 | MMC_OCR_330_340;
+	} else if (OF_hasprop(node, "no-1-8-v")) {
+		sc->slot.host.caps |= MMC_OCR_320_330 | MMC_OCR_330_340;
+	} else
+		sc->slot.host.caps |= MMC_OCR_LOW_VOLTAGE;
+
 
 	/*
 	 * Set the offset from the device's memory start to the MMCHS registers.


More information about the svn-src-all mailing list