Skip to content

Commit

Permalink
ARM: mxs: select HAVE_CLK_PREPARE for clock
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Shawn Guo committed Dec 28, 2011
1 parent 5c77f56 commit 6abda3e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
1 change: 1 addition & 0 deletions arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
31 changes: 22 additions & 9 deletions arch/arm/mach-mxs/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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
Expand Down

0 comments on commit 6abda3e

Please sign in to comment.