[PATCH V2] mmc: zynq: parse dt when probing

Michal Simek michal.simek at xilinx.com
Thu Apr 9 09:26:36 CEST 2020


On 09. 04. 20 0:11, Jaehoon Chung wrote:
> On 4/7/20 11:15 PM, Benedikt Grassl wrote:
>> Currently, the entry "bus-width = <8>" in the ZynqMP's sdhci nodes
>> is not evaluated. This results in the bus width staying at its default
>> value (4 bit in HS200 mode).
>> Fix this by calling mmc_of_parse. This function also checks for the
>> "no-1-8-v" and "max-frequency" entries. Remove the handling of those
>> nodes from this driver.
>>
>> Signed-off-by: Benedikt Grassl <Benedikt.Grassl at rohde-schwarz.com>
>> ---
>>  drivers/mmc/sdhci.c      |  3 +--
>>  drivers/mmc/zynq_sdhci.c | 15 ++++++---------
>>  include/sdhci.h          |  1 -
>>  3 files changed, 7 insertions(+), 12 deletions(-)
>>
>> diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
>> index 520c9f9feb..372dc0a820 100644
>> --- a/drivers/mmc/sdhci.c
>> +++ b/drivers/mmc/sdhci.c
>> @@ -839,8 +839,7 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
>>  		cfg->host_caps &= ~MMC_MODE_HS_52MHz;
>>  	}
>>  
>> -	if (!(cfg->voltages & MMC_VDD_165_195) ||
>> -	    (host->quirks & SDHCI_QUIRK_NO_1_8_V))
>> +	if (!(cfg->voltages & MMC_VDD_165_195))
>>  		caps_1 &= ~(SDHCI_SUPPORT_SDR104 | SDHCI_SUPPORT_SDR50 |
>>  			    SDHCI_SUPPORT_DDR50);
>>  
>> diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
>> index da3ff53da1..cfa61af265 100644
>> --- a/drivers/mmc/zynq_sdhci.c
>> +++ b/drivers/mmc/zynq_sdhci.c
>> @@ -22,14 +22,12 @@ DECLARE_GLOBAL_DATA_PTR;
>>  struct arasan_sdhci_plat {
>>  	struct mmc_config cfg;
>>  	struct mmc mmc;
>> -	unsigned int f_max;
>>  };
>>  
>>  struct arasan_sdhci_priv {
>>  	struct sdhci_host *host;
>>  	u8 deviceid;
>>  	u8 bank;
>> -	u8 no_1p8;
>>  };
>>  
>>  #if defined(CONFIG_ARCH_ZYNQMP)
>> @@ -238,8 +236,9 @@ static int arasan_sdhci_probe(struct udevice *dev)
>>  	host->quirks |= SDHCI_QUIRK_BROKEN_HISPD_MODE;
>>  #endif
>>  
>> -	if (priv->no_1p8)
>> -		host->quirks |= SDHCI_QUIRK_NO_1_8_V;
>> +	ret = mmc_of_parse(dev, &plat->cfg);
>> +	if (ret)
>> +		return ret;
>>  
>>  	host->max_clk = clock;
>>  
>> @@ -247,10 +246,12 @@ static int arasan_sdhci_probe(struct udevice *dev)
>>  	host->mmc->dev = dev;
>>  	host->mmc->priv = host;
>>  
>> -	ret = sdhci_setup_cfg(&plat->cfg, host, plat->f_max,
>> +	ret = sdhci_setup_cfg(&plat->cfg, host,
>> +			      CONFIG_ZYNQ_SDHCI_MAX_FREQ,
>>  			      CONFIG_ZYNQ_SDHCI_MIN_FREQ);
> 
> you have removed the parsing "max-frequency" from below code, because it's parsed from mmc_of_parse().
> But It's passing to CONFIG_ZYNQ_SDHCI_MAX_FREQ again. Is it correct?
> Could you check one more?

You are right. I have checked it myself.

This should be the right flow.

diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
index f856f46ba6a2..5ce627bee985 100644
--- a/drivers/mmc/zynq_sdhci.c
+++ b/drivers/mmc/zynq_sdhci.c
@@ -386,6 +386,8 @@ static int arasan_sdhci_probe(struct udevice *dev)
        host->quirks |= SDHCI_QUIRK_BROKEN_HISPD_MODE;
 #endif

+       plat->cfg.f_max = CONFIG_ZYNQ_SDHCI_MAX_FREQ;
+
        ret = mmc_of_parse(dev, &plat->cfg);
        if (ret)
                return ret;
@@ -396,8 +398,7 @@ static int arasan_sdhci_probe(struct udevice *dev)
        host->mmc->dev = dev;
        host->mmc->priv = host;

-       ret = sdhci_setup_cfg(&plat->cfg, host,
-                             CONFIG_ZYNQ_SDHCI_MAX_FREQ,
+       ret = sdhci_setup_cfg(&plat->cfg, host, plat->cfg.f_max,
                              CONFIG_ZYNQ_SDHCI_MIN_FREQ);
        if (ret)
                return ret;


Interesting is that I have checked jz_mmc.c where f_max is rewritten
after mmc_of_parse.

Thanks,
Michal


More information about the U-Boot mailing list