diff mbox series

[U-Boot,2/2] mmc: sdhci: Add support for dt caps & caps mask

Message ID 4bbaca25a0daab2bd68caeefc6ca0e86e444446a.1566472608.git.michal.simek@xilinx.com
State Superseded
Delegated to: Peng Fan
Headers show
Series Add sdhci dt caps & caps mask support | expand

Commit Message

Michal Simek Aug. 22, 2019, 11:16 a.m. UTC
From: T Karthik Reddy <t.karthik.reddy@xilinx.com>

The sdhci capabilities registers can be incorrect. The
sdhci-caps-mask and sdhci-caps dt properties specify which bits of
the registers are incorrect and what their values should be. This
patch makes the sdhci driver use those properties to correct the caps.
Also use "dev_read_u64_default" instead of "dev_read_u32_array" for
caps mask.

Signed-off-by: T Karthik Reddy <t.karthik.reddy@xilinx.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
---

 drivers/mmc/sdhci.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)
diff mbox series

Patch

diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
index 2779bca93f08..fbc576fd726e 100644
--- a/drivers/mmc/sdhci.c
+++ b/drivers/mmc/sdhci.c
@@ -711,17 +711,19 @@  int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
 {
 	u32 caps, caps_1 = 0;
 #if CONFIG_IS_ENABLED(DM_MMC)
-	u32 mask[2] = {0};
-	int ret;
-	ret = dev_read_u32_array(host->mmc->dev, "sdhci-caps-mask",
-				 mask, 2);
-	if (ret && ret != -1)
-		return ret;
-
-	caps = ~mask[1] & sdhci_readl(host, SDHCI_CAPABILITIES);
+	u64 dt_caps, dt_caps_mask;
+
+	dt_caps_mask = dev_read_u64_default(host->mmc->dev,
+					    "sdhci-caps-mask", 0);
+	dt_caps = dev_read_u64_default(host->mmc->dev,
+				       "sdhci-caps", 0);
+	caps = ~(u32)dt_caps_mask &
+	       sdhci_readl(host, SDHCI_CAPABILITIES);
+	caps |= (u32)dt_caps;
 #else
 	caps = sdhci_readl(host, SDHCI_CAPABILITIES);
 #endif
+	debug("%s, caps: 0x%x\n", __func__, caps);
 
 #ifdef CONFIG_MMC_SDHCI_SDMA
 	if (!(caps & SDHCI_CAN_DO_SDMA)) {
@@ -762,10 +764,13 @@  int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
 	/* Check whether the clock multiplier is supported or not */
 	if (SDHCI_GET_VERSION(host) >= SDHCI_SPEC_300) {
 #if CONFIG_IS_ENABLED(DM_MMC)
-		caps_1 = ~mask[0] & sdhci_readl(host, SDHCI_CAPABILITIES_1);
+		caps_1 = ~(u32)(dt_caps_mask >> 32) &
+			 sdhci_readl(host, SDHCI_CAPABILITIES_1);
+		caps_1 |= (u32)(dt_caps >> 32);
 #else
 		caps_1 = sdhci_readl(host, SDHCI_CAPABILITIES_1);
 #endif
+		debug("%s, caps_1: 0x%x\n", __func__, caps_1);
 		host->clk_mul = (caps_1 & SDHCI_CLOCK_MUL_MASK) >>
 				SDHCI_CLOCK_MUL_SHIFT;
 	}