[U-Boot] [PATCH v2 1/2] mmc: sdhci: add SDHCI_QUIRK_BROKEN_HISPD_MODE

Michal Simek michal.simek at xilinx.com
Mon Mar 5 08:10:06 UTC 2018


On 2.3.2018 11:00, Hannes Schmelzer wrote:
> From: Hannes Schmelzer <oe5hpm at oevsv.at>
> 
> Some IP-core implementations of the SDHCI have different troubles on the
> silicon where they are placed.
> 
> On ZYNQ platform for example Xilinx doesn't accept the hold timing of an
> eMMC chip which operates in High-Speed mode and must be forced to
> operate in non high-speed mode. To get rid of this
> "SDHCI_QUIRK_BROKEN_HISPD_MODE" is introduced.
> 
> For more details about this refer to the Xilinx answer-recor #59999
> https://www.xilinx.com/support/answers/59999.html
> 
> This commit:
> - doesn't set HISPD bit on the host-conroller
> - reflects this fact within the host-controller capabilities
> 
> Upon this the layer above (mmc-driver) can setup the card correctly.
> 
> Otherwise the MMC card will be switched into high-speed mode and causes
> possible timing violation on the host-controller side.
> 
> Signed-off-by: Hannes Schmelzer <oe5hpm at oevsv.at>
> 
> jh80.chung at samsung.com
> 
> Signed-off-by: Hannes Schmelzer <hannes.schmelzer at br-automation.com>

Two SoB lines with email between looks weird.


> ---
> 
> Changes in v2:
> - don't use the SDHCI_QUIRK_NO_HISPD_BIT for getting rid of this,
> since this quirk was designed for another purpose. Instead introduce the
> new SDHCI_QUIRK_BROKEN_HISPD_MODE quirk.
> 
>  drivers/mmc/sdhci.c | 8 ++++++++
>  include/sdhci.h     | 6 ++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c
> index d31793a..2df4214 100644
> --- a/drivers/mmc/sdhci.c
> +++ b/drivers/mmc/sdhci.c
> @@ -465,6 +465,9 @@ static int sdhci_set_ios(struct mmc *mmc)
>  	if (host->quirks & SDHCI_QUIRK_NO_HISPD_BIT)
>  		ctrl &= ~SDHCI_CTRL_HISPD;
>  
> +	if (host->quirks & SDHCI_QUIRK_BROKEN_HISPD_MODE)
> +		ctrl &= ~SDHCI_CTRL_HISPD;
> +
>  	sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
>  
>  	/* If available, call the driver specific "post" set_ios() function */
> @@ -602,6 +605,11 @@ int sdhci_setup_cfg(struct mmc_config *cfg, struct sdhci_host *host,
>  			cfg->host_caps &= ~MMC_MODE_8BIT;
>  	}
>  
> +	if (host->quirks & SDHCI_QUIRK_BROKEN_HISPD_MODE) {
> +		cfg->host_caps &= ~MMC_MODE_HS;
> +		cfg->host_caps &= ~MMC_MODE_HS_52MHz;
> +	}
> +
>  	if (host->host_caps)
>  		cfg->host_caps |= host->host_caps;
>  
> diff --git a/include/sdhci.h b/include/sdhci.h
> index 7e84012..9c75d08 100644
> --- a/include/sdhci.h
> +++ b/include/sdhci.h
> @@ -213,6 +213,12 @@
>  #define SDHCI_QUIRK_BROKEN_R1B		(1 << 2)
>  #define SDHCI_QUIRK_NO_HISPD_BIT	(1 << 3)
>  #define SDHCI_QUIRK_BROKEN_VOLTAGE	(1 << 4)
> +/*
> + * SDHCI_QUIRK_BROKEN_HISPD_MODE
> + * the hardware cannot operate correctly in high-speed mode,
> + * this quirk forces the sdci host-controller to non high-speed mode

typo sdhci

> + */
> +#define SDHCI_QUIRK_BROKEN_HISPD_MODE	BIT(5)
>  #define SDHCI_QUIRK_WAIT_SEND_CMD	(1 << 6)
>  #define SDHCI_QUIRK_USE_WIDE8		(1 << 8)
>  
> 

M


More information about the U-Boot mailing list