[U-Boot] [PATCH] mmc: add host_caps checking avoid switch card improperly

Andy Fleming afleming at gmail.com
Sat Nov 26 00:36:58 CET 2011


On Thu, Nov 17, 2011 at 3:31 AM, Macpaul Lin <macpaul at andestech.com> wrote:
> Add a host capability checking to avoid the mmc stack
> switch the card to HIGHSPEED mode when the card supports
> HIGHSPEED while the host doesn't.
>
> This patch avoid furthur transaction problem when the
> mmc/sd card runs different mode to the host.
>
> Signed-off-by: Macpaul Lin <macpaul at andestech.com>
> ---
>  drivers/mmc/mmc.c |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/mmc/mmc.c b/drivers/mmc/mmc.c
> index 21665ec..ce34d05 100644
> --- a/drivers/mmc/mmc.c
> +++ b/drivers/mmc/mmc.c
> @@ -785,6 +785,16 @@ retry_scr:
>        if (!(__be32_to_cpu(switch_status[3]) & SD_HIGHSPEED_SUPPORTED))
>                return 0;
>
> +       /*
> +        * If the host doesn't support SD_HIGHSPEED, do not switch card to
> +        * HIGHSPEED mode even if the card support SD_HIGHSPPED.
> +        * This can avoid furthur problem when the card runs in different
> +        * mode between the host.
> +        */
> +       if (!((mmc->host_caps & MMC_MODE_HS_52MHz) ||
> +               (mmc->host_caps & MMC_MODE_HS)))
> +               return 0;
> +

Isn't this the wrong logic? It seems like you don't want to switch
unless both support high speed. But this logic says to switch if
either one does.

Shouldn't it be:

if (!((mmc->host_caps & MMC_MODE_HS_52MHz) &&
       (mmc->host_caps & MMC_MODE_HS)))
    return 0;

?

Andy
>        err = sd_switch(mmc, SD_SWITCH_SWITCH, 0, 1, (u8 *)switch_status);
>
>        if (err)
> --
> 1.7.3.5
>
>


More information about the U-Boot mailing list