[PATCH] mmc: sdhci-sirf: fix 8bit width enable by overwriting set_bus_width

Ulf Hansson ulf.hansson at linaro.org
Tue Aug 19 04:22:59 PDT 2014


On 19 August 2014 09:07, Barry Song <Barry.Song at csr.com> wrote:
> From: Minda Chen <Minda.Chen at csr.com>
>
> 8bit-width enable bit of CSR MMC hosts is 3, while stardard hosts use
> bit 5. this patch fixes the functionality of 8bit transfer in CSR mmc
> controllers and improve performance for mmc0 a lot.
>
> Signed-off-by: Minda Chen <Minda.Chen at csr.com>
> Signed-off-by: Barry Song <Baohua.Song at csr.com>
> ---
>  drivers/mmc/host/sdhci-sirf.c | 27 ++++++++++++++++++++++++++-
>  1 file changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sdhci-sirf.c b/drivers/mmc/host/sdhci-sirf.c
> index 1700453..376f45f 100644
> --- a/drivers/mmc/host/sdhci-sirf.c
> +++ b/drivers/mmc/host/sdhci-sirf.c
> @@ -15,6 +15,8 @@
>  #include <linux/mmc/slot-gpio.h>
>  #include "sdhci-pltfm.h"
>
> +#define SDHCI_SIRF_8BITBUS BIT(3)
> +
>  struct sdhci_sirf_priv {
>         struct clk *clk;
>         int gpio_cd;
> @@ -27,10 +29,33 @@ static unsigned int sdhci_sirf_get_max_clk(struct sdhci_host *host)
>         return clk_get_rate(priv->clk);
>  }
>
> +static void sdhci_sirf_set_bus_width(struct sdhci_host *host, int width)
> +{
> +        u8 ctrl;
> +
> +        ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL);
> +        if (width == MMC_BUS_WIDTH_8) {
> +                ctrl &= ~SDHCI_CTRL_4BITBUS;
> +                /*
> +                 * 8bit-width enable bit of CSR MMC hosts is 3,
> +                 * while stardard hosts use bit 5
> +                 */

Don't you need to check for host->version >= SDHCI_SPEC_300 here as well?

> +                ctrl |= SDHCI_SIRF_8BITBUS;
> +        } else {
> +                if (host->version >= SDHCI_SPEC_300)
> +                        ctrl &= ~SDHCI_SIRF_8BITBUS;
> +                if (width == MMC_BUS_WIDTH_4)
> +                        ctrl |= SDHCI_CTRL_4BITBUS;
> +                else
> +                        ctrl &= ~SDHCI_CTRL_4BITBUS;
> +        }
> +        sdhci_writeb(host, ctrl, SDHCI_HOST_CONTROL);
> +}
> +
>  static struct sdhci_ops sdhci_sirf_ops = {
>         .set_clock = sdhci_set_clock,
>         .get_max_clock  = sdhci_sirf_get_max_clk,
> -       .set_bus_width = sdhci_set_bus_width,
> +       .set_bus_width = sdhci_sirf_set_bus_width,
>         .reset = sdhci_reset,
>         .set_uhs_signaling = sdhci_set_uhs_signaling,
>  };
> --
> 2.0.4
>

Kind regards
Uffe



More information about the linux-arm-kernel mailing list