Skip to content

Commit

Permalink
clk: introduce clk_core_enable_lock and clk_core_disable_lock functions
Browse files Browse the repository at this point in the history
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: Dong Aisheng <aisheng.dong@nxp.com>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
  • Loading branch information
Dong Aisheng authored and Stephen Boyd committed Jul 2, 2016
1 parent 582e240 commit a6adc30
Showing 1 changed file with 63 additions and 22 deletions.
85 changes: 63 additions & 22 deletions drivers/clk/clk.c
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,13 @@ static void clk_core_unprepare(struct clk_core *core)
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: the clk being unprepared
Expand All @@ -607,9 +614,7 @@ void clk_unprepare(struct clk *clk)
if (IS_ERR_OR_NULL(clk))
return;

clk_prepare_lock();
clk_core_unprepare(clk->core);
clk_prepare_unlock();
clk_core_unprepare_lock(clk->core);
}
EXPORT_SYMBOL_GPL(clk_unprepare);

Expand Down Expand Up @@ -645,6 +650,17 @@ static int clk_core_prepare(struct clk_core *core)
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: the clk being prepared
Expand All @@ -659,16 +675,10 @@ static int clk_core_prepare(struct clk_core *core)
*/
int clk_prepare(struct clk *clk)
{
int ret;

if (!clk)
return 0;

clk_prepare_lock();
ret = clk_core_prepare(clk->core);
clk_prepare_unlock();

return ret;
return clk_core_prepare_lock(clk->core);
}
EXPORT_SYMBOL_GPL(clk_prepare);

Expand Down Expand Up @@ -698,6 +708,15 @@ static void clk_core_disable(struct clk_core *core)
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: the clk being gated
Expand All @@ -712,14 +731,10 @@ static void clk_core_disable(struct clk_core *core)
*/
void clk_disable(struct clk *clk)
{
unsigned long flags;

if (IS_ERR_OR_NULL(clk))
return;

flags = clk_enable_lock();
clk_core_disable(clk->core);
clk_enable_unlock(flags);
clk_core_disable_lock(clk->core);
}
EXPORT_SYMBOL_GPL(clk_disable);

Expand Down Expand Up @@ -758,6 +773,18 @@ static int clk_core_enable(struct clk_core *core)
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: the clk being ungated
Expand All @@ -773,19 +800,33 @@ static int clk_core_enable(struct clk_core *core)
*/
int clk_enable(struct clk *clk)
{
unsigned long flags;
int ret;

if (!clk)
return 0;

flags = clk_enable_lock();
ret = clk_core_enable(clk->core);
clk_enable_unlock(flags);
return clk_core_enable_lock(clk->core);
}
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;
}
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,
struct clk_rate_request *req)
Expand Down

0 comments on commit a6adc30

Please sign in to comment.