aboutsummaryrefslogtreecommitdiff
path: root/drivers/mmc/snps_sdhci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mmc/snps_sdhci.c')
-rw-r--r--drivers/mmc/snps_sdhci.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/drivers/mmc/snps_sdhci.c b/drivers/mmc/snps_sdhci.c
index dd42e7e7..6c9e91eb 100644
--- a/drivers/mmc/snps_sdhci.c
+++ b/drivers/mmc/snps_sdhci.c
@@ -13,6 +13,7 @@
#define HS400_DELAY_LANE 24
volatile int DELAY_LANE = 50;
+volatile int manual_set_delay = 0; //flag for cmd manual setted DELAY_LANE,non-zero is setted. auto clear in cmd
static void sdhci_phy_1_8v_init_no_pull(struct sdhci_host *host)
{
@@ -154,10 +155,14 @@ void snps_set_uhs_timing(struct sdhci_host *host)
{
struct mmc *mmc = (struct mmc *)host->mmc;
u32 reg;
-
+ int restore_delay;
reg = sdhci_readw(host, SDHCI_HOST_CONTROL2);
reg &= ~SDHCI_CTRL_UHS_MASK;
-
+
+ if(manual_set_delay){
+ DELAY_LANE = DELAY_LANE & 0x7f; /*limit bit[0:6]*/
+ printf("%s: manual set delay (%d) active \n",host->name,DELAY_LANE);
+ }
switch (mmc->selected_mode) {
case UHS_SDR50:
case MMC_HS_52:
@@ -175,9 +180,13 @@ void snps_set_uhs_timing(struct sdhci_host *host)
reg |= SDHCI_CTRL_UHS_SDR104;
break;
case MMC_HS_400:
- DELAY_LANE = HS400_DELAY_LANE;
+ restore_delay = DELAY_LANE;
+ if(!manual_set_delay){ /*default not set manual in cmd,when set in cmd,use DELAY_LANE set in cmd*/
+ DELAY_LANE = HS400_DELAY_LANE;
+ }
sdhci_phy_1_8v_init(host);
reg |= SNPS_SDHCI_CTRL_HS400;
+ DELAY_LANE = restore_delay; /*restore for other modes*/
break;
default:
sdhci_phy_3_3v_init(host);
@@ -345,7 +354,10 @@ static int snps_sdhci_probe(struct udevice *dev)
ret = max_clk;
goto err;
}
-
+ //get Maximum Base Clock frequency from dts clock-frequency
+ if(0 == dev_read_u32(dev, "clock-frequency", &max_clk)){
+ host->max_clk = max_clk;
+ }
host->mmc = &plat->mmc;
host->mmc->dev = dev;
host->mmc->priv = host;