Update host capabilities for driver with host controller
information related to UHS modes incase of SD and HS200
mode incase of eMMC.

Signed-off-by: Siva Durga Prasad Paladugu <siva...@xilinx.com>
---
Changes from v1:
- None
---
 drivers/mmc/sdhci.c | 28 +++++++++++++++++++++++++++-
 include/mmc.h       |  7 +++++++
 include/sdhci.h     |  5 +++++
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
index 93cefd8..884b6a6 100644
--- a/drivers/mmc/sdhci.c
+++ b/drivers/mmc/sdhci.c
@@ -517,7 +517,8 @@ static const struct mmc_ops sdhci_ops = {
 int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
                u32 f_max, u32 f_min)
 {
-       u32 caps, caps_1;
+       u32 caps;
+       u32 caps_1 = 0;
 
        caps = sdhci_readl(host, SDHCI_CAPABILITIES);
 
@@ -588,6 +589,31 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct 
sdhci_host *host,
                                SDHCI_CLOCK_MUL_SHIFT;
        }
 
+       if (!(cfg->voltages & MMC_VDD_165_195))
+               caps_1 &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
+                           SDHCI_SUPPORT_DDR50);
+
+       if (caps_1 & (SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
+                     SDHCI_SUPPORT_DDR50))
+               cfg->host_caps |= MMC_MODE_UHS_SDR12 | MMC_MODE_UHS_SDR25;
+
+       if (caps_1 & SDHCI_SUPPORT_SDR104) {
+               cfg->host_caps |= MMC_MODE_UHS_SDR104 | MMC_MODE_UHS_SDR50;
+               /*
+                * SD3.0: SDR104 is supported so (for eMMC) the caps2
+                * field can be promoted to support HS200.
+                */
+               cfg->host_caps |= MMC_MODE_HS200;
+       } else if (caps_1 & SDHCI_SUPPORT_SDR50) {
+               cfg->host_caps |= MMC_MODE_UHS_SDR50;
+       }
+
+       if (caps_1 & SDHCI_SUPPORT_DDR50)
+               cfg->host_caps |= MMC_MODE_UHS_DDR50;
+
+       if (caps_1 & SDHCI_USE_SDR50_TUNING)
+               cfg->host_caps |= MMC_MODE_NEEDS_TUNING;
+
        if (host->host_caps)
                cfg->host_caps |= host->host_caps;
 
diff --git a/include/mmc.h b/include/mmc.h
index fad12d6..5c94eae 100644
--- a/include/mmc.h
+++ b/include/mmc.h
@@ -58,6 +58,13 @@
 #define MMC_MODE_8BIT          (1 << 3)
 #define MMC_MODE_SPI           (1 << 4)
 #define MMC_MODE_DDR_52MHz     (1 << 5)
+#define MMC_MODE_UHS_SDR12     (1 << 6)
+#define MMC_MODE_UHS_SDR25     (1 << 7)
+#define MMC_MODE_UHS_SDR50     (1 << 8)
+#define MMC_MODE_UHS_SDR104    (1 << 9)
+#define MMC_MODE_UHS_DDR50     (1 << 10)
+#define MMC_MODE_NEEDS_TUNING  (1 << 11)
+#define MMC_MODE_HS200         (1 << 12)
 
 #define SD_DATA_4BIT   0x00040000
 
diff --git a/include/sdhci.h b/include/sdhci.h
index 6a43271..685bcf2 100644
--- a/include/sdhci.h
+++ b/include/sdhci.h
@@ -167,6 +167,11 @@
 #define  SDHCI_CAN_64BIT       BIT(28)
 
 #define SDHCI_CAPABILITIES_1   0x44
+#define  SDHCI_SUPPORT_SDR50   0x00000001
+#define  SDHCI_SUPPORT_SDR104  0x00000002
+#define  SDHCI_SUPPORT_DDR50   0x00000004
+#define  SDHCI_USE_SDR50_TUNING                0x00002000
+#define  SDHCI_SUPPORT_HS400   0x80000000 /* Non-standard */
 #define  SDHCI_CLOCK_MUL_MASK  0x00FF0000
 #define  SDHCI_CLOCK_MUL_SHIFT 16
 
-- 
2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to