Commit a6adc30b authored by Dong Aisheng's avatar Dong Aisheng Committed by Stephen Boyd

clk: introduce clk_core_enable_lock and clk_core_disable_lock functions

This can be useful when clock core wants to enable/disable clocks.
Then we don't have to convert the struct clk_core to struct clk to call
clk_enable/clk_disable which is a bit un-align with exist using.

And after introduce clk_core_{enable|disable}_lock, we can refine
clk_enable and clk_disable a bit.

As well as clk_core_{enable|disable}_lock, we also added
clk_core_{prepare|unprepare}_lock and clk_core_prepare_enable/
clk_core_unprepare_disable for clock core to easily use.

Cc: Michael Turquette <mturquette@baylibre.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>
Cc: Shawn Guo <shawnguo@kernel.org>
Signed-off-by: default avatarDong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent 582e2405
...@@ -591,6 +591,13 @@ static void clk_core_unprepare(struct clk_core *core) ...@@ -591,6 +591,13 @@ static void clk_core_unprepare(struct clk_core *core)
clk_core_unprepare(core->parent); clk_core_unprepare(core->parent);
} }
static void clk_core_unprepare_lock(struct clk_core *core)
{
clk_prepare_lock();
clk_core_unprepare(core);
clk_prepare_unlock();
}
/** /**
* clk_unprepare - undo preparation of a clock source * clk_unprepare - undo preparation of a clock source
* @clk: the clk being unprepared * @clk: the clk being unprepared
...@@ -607,9 +614,7 @@ void clk_unprepare(struct clk *clk) ...@@ -607,9 +614,7 @@ void clk_unprepare(struct clk *clk)
if (IS_ERR_OR_NULL(clk)) if (IS_ERR_OR_NULL(clk))
return; return;
clk_prepare_lock(); clk_core_unprepare_lock(clk->core);
clk_core_unprepare(clk->core);
clk_prepare_unlock();
} }
EXPORT_SYMBOL_GPL(clk_unprepare); EXPORT_SYMBOL_GPL(clk_unprepare);
...@@ -645,6 +650,17 @@ static int clk_core_prepare(struct clk_core *core) ...@@ -645,6 +650,17 @@ static int clk_core_prepare(struct clk_core *core)
return 0; return 0;
} }
static int clk_core_prepare_lock(struct clk_core *core)
{
int ret;
clk_prepare_lock();
ret = clk_core_prepare(core);
clk_prepare_unlock();
return ret;
}
/** /**
* clk_prepare - prepare a clock source * clk_prepare - prepare a clock source
* @clk: the clk being prepared * @clk: the clk being prepared
...@@ -659,16 +675,10 @@ static int clk_core_prepare(struct clk_core *core) ...@@ -659,16 +675,10 @@ static int clk_core_prepare(struct clk_core *core)
*/ */
int clk_prepare(struct clk *clk) int clk_prepare(struct clk *clk)
{ {
int ret;
if (!clk) if (!clk)
return 0; return 0;
clk_prepare_lock(); return clk_core_prepare_lock(clk->core);
ret = clk_core_prepare(clk->core);
clk_prepare_unlock();
return ret;
} }
EXPORT_SYMBOL_GPL(clk_prepare); EXPORT_SYMBOL_GPL(clk_prepare);
...@@ -698,6 +708,15 @@ static void clk_core_disable(struct clk_core *core) ...@@ -698,6 +708,15 @@ static void clk_core_disable(struct clk_core *core)
clk_core_disable(core->parent); clk_core_disable(core->parent);
} }
static void clk_core_disable_lock(struct clk_core *core)
{
unsigned long flags;
flags = clk_enable_lock();
clk_core_disable(core);
clk_enable_unlock(flags);
}
/** /**
* clk_disable - gate a clock * clk_disable - gate a clock
* @clk: the clk being gated * @clk: the clk being gated
...@@ -712,14 +731,10 @@ static void clk_core_disable(struct clk_core *core) ...@@ -712,14 +731,10 @@ static void clk_core_disable(struct clk_core *core)
*/ */
void clk_disable(struct clk *clk) void clk_disable(struct clk *clk)
{ {
unsigned long flags;
if (IS_ERR_OR_NULL(clk)) if (IS_ERR_OR_NULL(clk))
return; return;
flags = clk_enable_lock(); clk_core_disable_lock(clk->core);
clk_core_disable(clk->core);
clk_enable_unlock(flags);
} }
EXPORT_SYMBOL_GPL(clk_disable); EXPORT_SYMBOL_GPL(clk_disable);
...@@ -758,6 +773,18 @@ static int clk_core_enable(struct clk_core *core) ...@@ -758,6 +773,18 @@ static int clk_core_enable(struct clk_core *core)
return 0; return 0;
} }
static int clk_core_enable_lock(struct clk_core *core)
{
unsigned long flags;
int ret;
flags = clk_enable_lock();
ret = clk_core_enable(core);
clk_enable_unlock(flags);
return ret;
}
/** /**
* clk_enable - ungate a clock * clk_enable - ungate a clock
* @clk: the clk being ungated * @clk: the clk being ungated
...@@ -773,19 +800,33 @@ static int clk_core_enable(struct clk_core *core) ...@@ -773,19 +800,33 @@ static int clk_core_enable(struct clk_core *core)
*/ */
int clk_enable(struct clk *clk) int clk_enable(struct clk *clk)
{ {
unsigned long flags;
int ret;
if (!clk) if (!clk)
return 0; return 0;
flags = clk_enable_lock(); return clk_core_enable_lock(clk->core);
ret = clk_core_enable(clk->core); }
clk_enable_unlock(flags); EXPORT_SYMBOL_GPL(clk_enable);
static int clk_core_prepare_enable(struct clk_core *core)
{
int ret;
ret = clk_core_prepare_lock(core);
if (ret)
return ret;
ret = clk_core_enable_lock(core);
if (ret)
clk_core_unprepare_lock(core);
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(clk_enable);
static void clk_core_disable_unprepare(struct clk_core *core)
{
clk_core_disable_lock(core);
clk_core_unprepare_lock(core);
}
static int clk_core_round_rate_nolock(struct clk_core *core, static int clk_core_round_rate_nolock(struct clk_core *core,
struct clk_rate_request *req) struct clk_rate_request *req)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment