提交 6abda3e1 编写于 作者: S Shawn Guo

ARM: mxs: select HAVE_CLK_PREPARE for clock

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: NShawn Guo <shawn.guo@linaro.org>
上级 5c77f560
...@@ -442,6 +442,7 @@ config ARCH_MXS ...@@ -442,6 +442,7 @@ config ARCH_MXS
select ARCH_REQUIRE_GPIOLIB select ARCH_REQUIRE_GPIOLIB
select CLKDEV_LOOKUP select CLKDEV_LOOKUP
select CLKSRC_MMIO select CLKSRC_MMIO
select HAVE_CLK_PREPARE
help help
Support for Freescale MXS-based family of processors Support for Freescale MXS-based family of processors
......
...@@ -74,10 +74,15 @@ static int __clk_enable(struct clk *clk) ...@@ -74,10 +74,15 @@ static int __clk_enable(struct clk *clk)
return 0; 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; int ret = 0;
...@@ -90,13 +95,9 @@ int clk_enable(struct clk *clk) ...@@ -90,13 +95,9 @@ int clk_enable(struct clk *clk)
return ret; return ret;
} }
EXPORT_SYMBOL(clk_enable); EXPORT_SYMBOL(clk_prepare);
/* This function decrements the reference count on the clock and disables void clk_unprepare(struct clk *clk)
* the clock when reference count is 0. The parent clock tree is
* recursively disabled
*/
void clk_disable(struct clk *clk)
{ {
if (clk == NULL || IS_ERR(clk)) if (clk == NULL || IS_ERR(clk))
return; return;
...@@ -105,6 +106,18 @@ void clk_disable(struct clk *clk) ...@@ -105,6 +106,18 @@ void clk_disable(struct clk *clk)
__clk_disable(clk); __clk_disable(clk);
mutex_unlock(&clocks_mutex); 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); EXPORT_SYMBOL(clk_disable);
/* Retrieve the *current* clock rate. If the clock itself /* Retrieve the *current* clock rate. If the clock itself
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册