On 03/02/2018 07:00 PM, Hannes Schmelzer wrote:
> From: Hannes Schmelzer <oe5...@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 <oe5...@oevsv.at>
> 
> jh80.ch...@samsung.com

Maybe this is the wrong adding.

> 
> Signed-off-by: Hannes Schmelzer <hannes.schmel...@br-automation.com>
> ---
> 
> 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;
> +

you can combine with above condition..like this.
if (host->quriks & (SDHCI_QUIRK_NO_HISPD_BIT) ||
        host->quirks & SDHCI_QUIRK_NO_BROKEN_HISPD_MODE) ?

>       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
> + */
> +#define SDHCI_QUIRK_BROKEN_HISPD_MODE        BIT(5)
>  #define SDHCI_QUIRK_WAIT_SEND_CMD    (1 << 6)
>  #define SDHCI_QUIRK_USE_WIDE8                (1 << 8)
>  
> 

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

Reply via email to