mmc: Support bypass mode with the get_mmc_clk() method
authorSimon Glass <sjg@chromium.org>
Sun, 30 Aug 2015 22:55:15 +0000 (16:55 -0600)
committerSimon Glass <sjg@chromium.org>
Thu, 3 Sep 2015 03:28:23 +0000 (21:28 -0600)
Some SoCs want to adjust the input clock to the DWMMC block as a way of
controlling the MMC bus clock. Update the get_mmc_clk() method to support
this.

Signed-off-by: Simon Glass <sjg@chromium.org>
Acked-by: Jaehoon Chung <jh80.chung@samsung.com>
drivers/mmc/dw_mmc.c
drivers/mmc/exynos_dw_mmc.c
include/dwmmc.h

index 77b87e0365be110beef432eb608d375fa2dc51b1..1117fedefeb19a6fac62e8792db1b0c96136c4ff 100644 (file)
@@ -266,7 +266,7 @@ static int dwmci_setup_bus(struct dwmci_host *host, u32 freq)
         * host->bus_hz should be set by user.
         */
        if (host->get_mmc_clk)
-               sclk = host->get_mmc_clk(host);
+               sclk = host->get_mmc_clk(host, freq);
        else if (host->bus_hz)
                sclk = host->bus_hz;
        else {
index cde2ba7118f16adbae2262bdadc9f4929f298c89..863bbb3f64b27ea6ef1e860a7a7bd743426567ba 100644 (file)
@@ -39,7 +39,7 @@ static void exynos_dwmci_clksel(struct dwmci_host *host)
        dwmci_writel(host, DWMCI_CLKSEL, priv->sdr_timing);
 }
 
-unsigned int exynos_dwmci_get_clk(struct dwmci_host *host)
+unsigned int exynos_dwmci_get_clk(struct dwmci_host *host, uint freq)
 {
        unsigned long sclk;
        int8_t clk_div;
index 7a7555a73ab2c7a5291b5b2f5ee5e263998d4eae..25cf42c606c993331ee82cfc314df27524b108d3 100644 (file)
@@ -163,7 +163,21 @@ struct dwmci_host {
 
        void (*clksel)(struct dwmci_host *host);
        void (*board_init)(struct dwmci_host *host);
-       unsigned int (*get_mmc_clk)(struct dwmci_host *host);
+
+       /**
+        * Get / set a particular MMC clock frequency
+        *
+        * This is used to request the current clock frequency of the clock
+        * that drives the DWMMC peripheral. The caller will then use this
+        * information to work out the divider it needs to achieve the
+        * required MMC bus clock frequency. If you want to handle the
+        * clock external to DWMMC, use @freq to select the frequency and
+        * return that value too. Then DWMMC will put itself in bypass mode.
+        *
+        * @host:       DWMMC host
+        * @freq:       Frequency the host is trying to achieve
+        */
+       unsigned int (*get_mmc_clk)(struct dwmci_host *host, uint freq);
 
        struct mmc_config cfg;
 };