On Mon, Aug 16, 2010 at 9:41 AM, zhangfei gao <zhangfei....@gmail.com> wrote:
> From fd40adef6ce474d5323edcaa833f675b0eb649cb Mon Sep 17 00:00:00 2001
> From: Zhangfei Gao <zg...@marvell.com>
> Date: Fri, 6 Aug 2010 07:10:01 +0800
> Subject: [PATCH] sdhci: support 10-bit divided clock Mode
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> Cc: Matt Fleming <m...@console-pimps.org>
> Cc: Michał Mirosław <mir...@gmail.com>
> Signed-off-by: Zhangfei Gao <zg...@marvell.com>
> ---
>  drivers/mmc/host/sdhci.c |   22 ++++++++++++++++------
>  drivers/mmc/host/sdhci.h |    5 +++++
>  2 files changed, 21 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
> index 913555e..32dcac9 100644
> --- a/drivers/mmc/host/sdhci.c
> +++ b/drivers/mmc/host/sdhci.c
> @@ -983,7 +983,7 @@ static void sdhci_finish_command(struct sdhci_host *host)
>
>  static void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
>  {
> -       int div;
> +       int div, max_div;
>        u16 clk;
>        unsigned long timeout;
>
> @@ -1001,13 +1001,23 @@ static void sdhci_set_clock(struct sdhci_host
> *host, unsigned int clock)
>        if (clock == 0)
>                goto out;
>
> -       for (div = 1;div < 256;div *= 2) {
> -               if ((host->max_clk / div) <= clock)
> -                       break;
> +       if (host->version >= SDHCI_SPEC_300)
> +               max_div = 2046;
> +       else
> +               max_div = 256;
> +
> +       if(host->max_clk <= clock)
> +               div = 1;
> +       else {
> +               for (div = 2; div < max_div; div += 2) {
> +                       if ((host->max_clk / div) <= clock)
> +                               break;
> +               }
>        }
>        div >>= 1;
>
> -       clk = div << SDHCI_DIVIDER_SHIFT;
> +       clk = (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
> +       clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN) <<
> SDHCI_DIVIDER_HI_SHIFT;
>        clk |= SDHCI_CLOCK_INT_EN;
>        sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
>
> @@ -1707,7 +1717,7 @@ int sdhci_add_host(struct sdhci_host *host)
>        host->version = sdhci_readw(host, SDHCI_HOST_VERSION);
>        host->version = (host->version & SDHCI_SPEC_VER_MASK)
>                                >> SDHCI_SPEC_VER_SHIFT;
> -       if (host->version > SDHCI_SPEC_200) {
> +       if (host->version > SDHCI_SPEC_300) {
>                printk(KERN_ERR "%s: Unknown controller version (%d). "
>                        "You may experience problems.\n", mmc_hostname(mmc),
>                        host->version);
> diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
> index 036cfae..50860dc 100644
> --- a/drivers/mmc/host/sdhci.h
> +++ b/drivers/mmc/host/sdhci.h
> @@ -86,6 +86,10 @@
>
>  #define SDHCI_CLOCK_CONTROL    0x2C
>  #define  SDHCI_DIVIDER_SHIFT   8
> +#define  SDHCI_DIVIDER_HI_SHIFT        6
> +#define  SDHCI_DIV_MASK        0xFF
> +#define  SDHCI_DIV_MASK_LEN    8
> +#define  SDHCI_DIV_HI_MASK     0x300
>  #define  SDHCI_CLOCK_CARD_EN   0x0004
>  #define  SDHCI_CLOCK_INT_STABLE        0x0002
>  #define  SDHCI_CLOCK_INT_EN    0x0001
> @@ -178,6 +182,7 @@
>  #define  SDHCI_SPEC_VER_SHIFT  0
>  #define   SDHCI_SPEC_100       0
>  #define   SDHCI_SPEC_200       1
> +#define   SDHCI_SPEC_300       2
>
>  struct sdhci_ops;
>
> --
> 1.7.0.4
>

The v2 fix add else condition to v1
 if(host->max_clk <= clock)
               div = 1;
> +       else {
--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to