ARM: mxs: select HAVE_CLK_PREPARE for clock
authorShawn Guo <shawn.guo@linaro.org>
Tue, 20 Dec 2011 08:12:34 +0000 (16:12 +0800)
committerShawn Guo <shawn.guo@linaro.org>
Wed, 28 Dec 2011 13:35:08 +0000 (21:35 +0800)
This patch adds clk_prepare/clk_unprepare for mxs clock api by
renaming the existing non-atomic clk_enable/clk_disable to
clk_prepare/clk_unprepare and adding a pair of dummy
clk_enable/clk_disable.  Then with selecting HAVE_CLK_PREPARE for
mxs clock, we can fix the mutex locking warning that has been
reported for a few times.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
arch/arm/Kconfig
arch/arm/mach-mxs/clock.c

index 776d76b..dc46163 100644 (file)
@@ -442,6 +442,7 @@ config ARCH_MXS
        select ARCH_REQUIRE_GPIOLIB
        select CLKDEV_LOOKUP
        select CLKSRC_MMIO
+       select HAVE_CLK_PREPARE
        help
          Support for Freescale MXS-based family of processors
 
index 755eec0..97a6f4a 100644 (file)
@@ -74,10 +74,15 @@ static int __clk_enable(struct clk *clk)
        return 0;
 }
 
-/* This function increments the reference count on the clock and enables the
- * clock if not already enabled. The parent clock tree is recursively enabled
+/*
+ * The clk_enable/clk_disable could be called by drivers in atomic context,
+ * so they should not really hold mutex.  Instead, clk_prepare/clk_unprepare
+ * can hold a mutex, as the pair will only be called in non-atomic context.
+ * Before migrating to common clk framework, we can have __clk_enable and
+ * __clk_disable called in clk_prepare/clk_unprepare with mutex held and
+ * leave clk_enable/clk_disable as the dummy functions.
  */
-int clk_enable(struct clk *clk)
+int clk_prepare(struct clk *clk)
 {
        int ret = 0;
 
@@ -90,13 +95,9 @@ int clk_enable(struct clk *clk)
 
        return ret;
 }
-EXPORT_SYMBOL(clk_enable);
+EXPORT_SYMBOL(clk_prepare);
 
-/* This function decrements the reference count on the clock and disables
- * the clock when reference count is 0. The parent clock tree is
- * recursively disabled
- */
-void clk_disable(struct clk *clk)
+void clk_unprepare(struct clk *clk)
 {
        if (clk == NULL || IS_ERR(clk))
                return;
@@ -105,6 +106,18 @@ void clk_disable(struct clk *clk)
        __clk_disable(clk);
        mutex_unlock(&clocks_mutex);
 }
+EXPORT_SYMBOL(clk_unprepare);
+
+int clk_enable(struct clk *clk)
+{
+       return 0;
+}
+EXPORT_SYMBOL(clk_enable);
+
+void clk_disable(struct clk *clk)
+{
+       /* nothing to do */
+}
 EXPORT_SYMBOL(clk_disable);
 
 /* Retrieve the *current* clock rate. If the clock itself