]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
mmc: sdhci-esdhc: calculate sdclk divider from controller clock
authorLucas Stach <l.stach@pengutronix.de>
Wed, 5 Jun 2013 13:13:25 +0000 (15:13 +0200)
committerChris Ball <cjb@laptop.org>
Thu, 27 Jun 2013 15:29:14 +0000 (11:29 -0400)
The SDCLK is divided down from the host controller clock. Host
controller clock may be different from the maximum SDCLK, so
get it from the platform, instead of just using the max SDCLK.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Chris Ball <cjb@laptop.org>
drivers/mmc/host/sdhci-esdhc-imx.c
drivers/mmc/host/sdhci-esdhc.h
drivers/mmc/host/sdhci-of-esdhc.c

index 98f46704baa64df2bfb73db6dfcb6870b813baab..eb1310ca021e31e60364da9eb8891ec81c00d845 100644 (file)
@@ -391,6 +391,14 @@ static unsigned int esdhc_pltfm_get_min_clock(struct sdhci_host *host)
        return clk_get_rate(pltfm_host->clk) / 256 / 16;
 }
 
+static inline void esdhc_pltfm_set_clock(struct sdhci_host *host,
+                                        unsigned int clock)
+{
+       struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
+
+       esdhc_set_clock(host, clock, clk_get_rate(pltfm_host->clk));
+}
+
 static unsigned int esdhc_pltfm_get_ro(struct sdhci_host *host)
 {
        struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
@@ -438,7 +446,7 @@ static const struct sdhci_ops sdhci_esdhc_ops = {
        .write_l = esdhc_writel_le,
        .write_w = esdhc_writew_le,
        .write_b = esdhc_writeb_le,
-       .set_clock = esdhc_set_clock,
+       .set_clock = esdhc_pltfm_set_clock,
        .get_max_clock = sdhci_pltfm_clk_get_max_clock,
        .get_min_clock = esdhc_pltfm_get_min_clock,
        .get_ro = esdhc_pltfm_get_ro,
index d25f9ab9a54da919a6e54cc05743f74ad83362f1..6f16406c37cd7e2153d169e6a9429b2114f0d0b4 100644 (file)
@@ -42,7 +42,8 @@
 
 #define ESDHC_HOST_CONTROL_RES 0x05
 
-static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
+static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock,
+                                  unsigned int host_clock)
 {
        int pre_div = 2;
        int div = 1;
@@ -56,14 +57,14 @@ static inline void esdhc_set_clock(struct sdhci_host *host, unsigned int clock)
                | ESDHC_CLOCK_MASK);
        sdhci_writel(host, temp, ESDHC_SYSTEM_CONTROL);
 
-       while (host->max_clk / pre_div / 16 > clock && pre_div < 256)
+       while (host_clock / pre_div / 16 > clock && pre_div < 256)
                pre_div *= 2;
 
-       while (host->max_clk / pre_div / div > clock && div < 16)
+       while (host_clock / pre_div / div > clock && div < 16)
                div++;
 
        dev_dbg(mmc_dev(host->mmc), "desired SD clock: %d, actual: %d\n",
-               clock, host->max_clk / pre_div / div);
+               clock, host_clock / pre_div / div);
 
        pre_div >>= 1;
        div--;
index 37e668f5b9922e8a3f288f62c9ac5e0bad590a2a..2b7369729f9190fc04c29fc6f41d43ed0a5b6f67 100644 (file)
@@ -200,7 +200,7 @@ static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock)
        }
 
        /* Set the clock */
-       esdhc_set_clock(host, clock);
+       esdhc_set_clock(host, clock, host->max_clk);
 }
 
 #ifdef CONFIG_PM