mmc: spi: Pull out the SSP clock configuration function
authorMarek Vasut <marex@denx.de>
Fri, 3 Aug 2012 15:26:10 +0000 (17:26 +0200)
committerMark Brown <broonie@opensource.wolfsonmicro.com>
Fri, 17 Aug 2012 21:53:00 +0000 (22:53 +0100)
Pull out the MMC clock configuration function and make it
into SSP clock configuration function, so it can be used by
the SPI driver too.

Signed-off-by: Marek Vasut <marex@denx.de>
Acked-by: Chris Ball <cjb@laptop.org>
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
drivers/clk/mxs/Makefile
drivers/clk/mxs/clk-ssp.c [new file with mode: 0644]
drivers/mmc/host/mxs-mmc.c
include/linux/spi/mxs-spi.h

index 7bedeec08524bd54f0d6a085c7c97dd4ee8c3536..a6a22237e860e9de980b1aeed3d86baa0e32cd24 100644 (file)
@@ -2,7 +2,7 @@
 # Makefile for mxs specific clk
 #
 
-obj-y += clk.o clk-pll.o clk-ref.o clk-div.o clk-frac.o
+obj-y += clk.o clk-pll.o clk-ref.o clk-div.o clk-frac.o clk-ssp.o
 
 obj-$(CONFIG_SOC_IMX23) += clk-imx23.o
 obj-$(CONFIG_SOC_IMX28) += clk-imx28.o
diff --git a/drivers/clk/mxs/clk-ssp.c b/drivers/clk/mxs/clk-ssp.c
new file mode 100644 (file)
index 0000000..af7bdbf
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 DENX Software Engineering, GmbH
+ *
+ * Pulled from code:
+ * Portions copyright (C) 2003 Russell King, PXA MMCI Driver
+ * Portions copyright (C) 2004-2005 Pierre Ossman, W83L51xD SD/MMC driver
+ *
+ * Copyright 2008 Embedded Alley Solutions, Inc.
+ * Copyright 2009-2011 Freescale Semiconductor, Inc.
+ *
+ * The code contained herein is licensed under the GNU General Public
+ * License. You may obtain a copy of the GNU General Public License
+ * Version 2 or later at the following locations:
+ *
+ * http://www.opensource.org/licenses/gpl-license.html
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/clk.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/io.h>
+#include <linux/spi/mxs-spi.h>
+
+void mxs_ssp_set_clk_rate(struct mxs_ssp *ssp, unsigned int rate)
+{
+       unsigned int ssp_clk, ssp_sck;
+       u32 clock_divide, clock_rate;
+       u32 val;
+
+       ssp_clk = clk_get_rate(ssp->clk);
+
+       for (clock_divide = 2; clock_divide <= 254; clock_divide += 2) {
+               clock_rate = DIV_ROUND_UP(ssp_clk, rate * clock_divide);
+               clock_rate = (clock_rate > 0) ? clock_rate - 1 : 0;
+               if (clock_rate <= 255)
+                       break;
+       }
+
+       if (clock_divide > 254) {
+               dev_err(ssp->dev,
+                       "%s: cannot set clock to %d\n", __func__, rate);
+               return;
+       }
+
+       ssp_sck = ssp_clk / clock_divide / (1 + clock_rate);
+
+       val = readl(ssp->base + HW_SSP_TIMING(ssp));
+       val &= ~(BM_SSP_TIMING_CLOCK_DIVIDE | BM_SSP_TIMING_CLOCK_RATE);
+       val |= BF_SSP(clock_divide, TIMING_CLOCK_DIVIDE);
+       val |= BF_SSP(clock_rate, TIMING_CLOCK_RATE);
+       writel(val, ssp->base + HW_SSP_TIMING(ssp));
+
+       ssp->clk_rate = ssp_sck;
+
+       dev_dbg(ssp->dev,
+               "%s: clock_divide %d, clock_rate %d, ssp_clk %d, rate_actual %d, rate_requested %d\n",
+               __func__, clock_divide, clock_rate, ssp_clk, ssp_sck, rate);
+}
+EXPORT_SYMBOL_GPL(mxs_ssp_set_clk_rate);
index 7b85e035a4cb969fb154b0c50cb827a43e9fc3a7..0813340fa29ca77af62b9f36318af8e3bfde9871 100644 (file)
@@ -501,43 +501,6 @@ static void mxs_mmc_request(struct mmc_host *mmc, struct mmc_request *mrq)
        mxs_mmc_start_cmd(host, mrq->cmd);
 }
 
-static void mxs_mmc_set_clk_rate(struct mxs_mmc_host *host, unsigned int rate)
-{
-       struct mxs_ssp *ssp = &host->ssp;
-       unsigned int ssp_clk, ssp_sck;
-       u32 clock_divide, clock_rate;
-       u32 val;
-
-       ssp_clk = clk_get_rate(ssp->clk);
-
-       for (clock_divide = 2; clock_divide <= 254; clock_divide += 2) {
-               clock_rate = DIV_ROUND_UP(ssp_clk, rate * clock_divide);
-               clock_rate = (clock_rate > 0) ? clock_rate - 1 : 0;
-               if (clock_rate <= 255)
-                       break;
-       }
-
-       if (clock_divide > 254) {
-               dev_err(mmc_dev(host->mmc),
-                       "%s: cannot set clock to %d\n", __func__, rate);
-               return;
-       }
-
-       ssp_sck = ssp_clk / clock_divide / (1 + clock_rate);
-
-       val = readl(ssp->base + HW_SSP_TIMING(ssp));
-       val &= ~(BM_SSP_TIMING_CLOCK_DIVIDE | BM_SSP_TIMING_CLOCK_RATE);
-       val |= BF_SSP(clock_divide, TIMING_CLOCK_DIVIDE);
-       val |= BF_SSP(clock_rate, TIMING_CLOCK_RATE);
-       writel(val, ssp->base + HW_SSP_TIMING(ssp));
-
-       ssp->clk_rate = ssp_sck;
-
-       dev_dbg(mmc_dev(host->mmc),
-               "%s: clock_divide %d, clock_rate %d, ssp_clk %d, rate_actual %d, rate_requested %d\n",
-               __func__, clock_divide, clock_rate, ssp_clk, ssp_sck, rate);
-}
-
 static void mxs_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
 {
        struct mxs_mmc_host *host = mmc_priv(mmc);
@@ -550,7 +513,7 @@ static void mxs_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
                host->bus_width = 0;
 
        if (ios->clock)
-               mxs_mmc_set_clk_rate(host, ios->clock);
+               mxs_ssp_set_clk_rate(&host->ssp, ios->clock);
 }
 
 static void mxs_mmc_enable_sdio_irq(struct mmc_host *mmc, int enable)
index 475f69fb896f0eacabe9bc03025a687a0a7f1e59..d07f8dc7fdd9f40147c3b302ac02167d739a40a3 100644 (file)
@@ -136,4 +136,6 @@ struct mxs_ssp {
        enum mxs_ssp_id                 devid;
 };
 
+void mxs_ssp_set_clk_rate(struct mxs_ssp *ssp, unsigned int rate);
+
 #endif /* __LINUX_SPI_MXS_SPI_H__ */