clk: move clk_disable_unused after clk_core_disable_unprepare function
No function level change, just moving code place. clk_disable_unused function will need to call clk_core_prepare_enable/ clk_core_disable_unprepare when adding CLK_OPS_PARENT_ENABLE features. So move it after clk_core_disable_unprepare to avoid adding forward declared functions later. 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>
This commit is contained in:
parent
a6adc30ba7
commit
7ec986efed
|
@ -172,104 +172,6 @@ static bool clk_core_is_enabled(struct clk_core *core)
|
||||||
return core->ops->is_enabled(core->hw);
|
return core->ops->is_enabled(core->hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clk_unprepare_unused_subtree(struct clk_core *core)
|
|
||||||
{
|
|
||||||
struct clk_core *child;
|
|
||||||
|
|
||||||
lockdep_assert_held(&prepare_lock);
|
|
||||||
|
|
||||||
hlist_for_each_entry(child, &core->children, child_node)
|
|
||||||
clk_unprepare_unused_subtree(child);
|
|
||||||
|
|
||||||
if (core->prepare_count)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (core->flags & CLK_IGNORE_UNUSED)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (clk_core_is_prepared(core)) {
|
|
||||||
trace_clk_unprepare(core);
|
|
||||||
if (core->ops->unprepare_unused)
|
|
||||||
core->ops->unprepare_unused(core->hw);
|
|
||||||
else if (core->ops->unprepare)
|
|
||||||
core->ops->unprepare(core->hw);
|
|
||||||
trace_clk_unprepare_complete(core);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void clk_disable_unused_subtree(struct clk_core *core)
|
|
||||||
{
|
|
||||||
struct clk_core *child;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
lockdep_assert_held(&prepare_lock);
|
|
||||||
|
|
||||||
hlist_for_each_entry(child, &core->children, child_node)
|
|
||||||
clk_disable_unused_subtree(child);
|
|
||||||
|
|
||||||
flags = clk_enable_lock();
|
|
||||||
|
|
||||||
if (core->enable_count)
|
|
||||||
goto unlock_out;
|
|
||||||
|
|
||||||
if (core->flags & CLK_IGNORE_UNUSED)
|
|
||||||
goto unlock_out;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* some gate clocks have special needs during the disable-unused
|
|
||||||
* sequence. call .disable_unused if available, otherwise fall
|
|
||||||
* back to .disable
|
|
||||||
*/
|
|
||||||
if (clk_core_is_enabled(core)) {
|
|
||||||
trace_clk_disable(core);
|
|
||||||
if (core->ops->disable_unused)
|
|
||||||
core->ops->disable_unused(core->hw);
|
|
||||||
else if (core->ops->disable)
|
|
||||||
core->ops->disable(core->hw);
|
|
||||||
trace_clk_disable_complete(core);
|
|
||||||
}
|
|
||||||
|
|
||||||
unlock_out:
|
|
||||||
clk_enable_unlock(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool clk_ignore_unused;
|
|
||||||
static int __init clk_ignore_unused_setup(char *__unused)
|
|
||||||
{
|
|
||||||
clk_ignore_unused = true;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
__setup("clk_ignore_unused", clk_ignore_unused_setup);
|
|
||||||
|
|
||||||
static int clk_disable_unused(void)
|
|
||||||
{
|
|
||||||
struct clk_core *core;
|
|
||||||
|
|
||||||
if (clk_ignore_unused) {
|
|
||||||
pr_warn("clk: Not disabling unused clocks\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
clk_prepare_lock();
|
|
||||||
|
|
||||||
hlist_for_each_entry(core, &clk_root_list, child_node)
|
|
||||||
clk_disable_unused_subtree(core);
|
|
||||||
|
|
||||||
hlist_for_each_entry(core, &clk_orphan_list, child_node)
|
|
||||||
clk_disable_unused_subtree(core);
|
|
||||||
|
|
||||||
hlist_for_each_entry(core, &clk_root_list, child_node)
|
|
||||||
clk_unprepare_unused_subtree(core);
|
|
||||||
|
|
||||||
hlist_for_each_entry(core, &clk_orphan_list, child_node)
|
|
||||||
clk_unprepare_unused_subtree(core);
|
|
||||||
|
|
||||||
clk_prepare_unlock();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
late_initcall_sync(clk_disable_unused);
|
|
||||||
|
|
||||||
/*** helper functions ***/
|
/*** helper functions ***/
|
||||||
|
|
||||||
const char *__clk_get_name(const struct clk *clk)
|
const char *__clk_get_name(const struct clk *clk)
|
||||||
|
@ -828,6 +730,104 @@ static void clk_core_disable_unprepare(struct clk_core *core)
|
||||||
clk_core_unprepare_lock(core);
|
clk_core_unprepare_lock(core);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void clk_unprepare_unused_subtree(struct clk_core *core)
|
||||||
|
{
|
||||||
|
struct clk_core *child;
|
||||||
|
|
||||||
|
lockdep_assert_held(&prepare_lock);
|
||||||
|
|
||||||
|
hlist_for_each_entry(child, &core->children, child_node)
|
||||||
|
clk_unprepare_unused_subtree(child);
|
||||||
|
|
||||||
|
if (core->prepare_count)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (core->flags & CLK_IGNORE_UNUSED)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (clk_core_is_prepared(core)) {
|
||||||
|
trace_clk_unprepare(core);
|
||||||
|
if (core->ops->unprepare_unused)
|
||||||
|
core->ops->unprepare_unused(core->hw);
|
||||||
|
else if (core->ops->unprepare)
|
||||||
|
core->ops->unprepare(core->hw);
|
||||||
|
trace_clk_unprepare_complete(core);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clk_disable_unused_subtree(struct clk_core *core)
|
||||||
|
{
|
||||||
|
struct clk_core *child;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
lockdep_assert_held(&prepare_lock);
|
||||||
|
|
||||||
|
hlist_for_each_entry(child, &core->children, child_node)
|
||||||
|
clk_disable_unused_subtree(child);
|
||||||
|
|
||||||
|
flags = clk_enable_lock();
|
||||||
|
|
||||||
|
if (core->enable_count)
|
||||||
|
goto unlock_out;
|
||||||
|
|
||||||
|
if (core->flags & CLK_IGNORE_UNUSED)
|
||||||
|
goto unlock_out;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* some gate clocks have special needs during the disable-unused
|
||||||
|
* sequence. call .disable_unused if available, otherwise fall
|
||||||
|
* back to .disable
|
||||||
|
*/
|
||||||
|
if (clk_core_is_enabled(core)) {
|
||||||
|
trace_clk_disable(core);
|
||||||
|
if (core->ops->disable_unused)
|
||||||
|
core->ops->disable_unused(core->hw);
|
||||||
|
else if (core->ops->disable)
|
||||||
|
core->ops->disable(core->hw);
|
||||||
|
trace_clk_disable_complete(core);
|
||||||
|
}
|
||||||
|
|
||||||
|
unlock_out:
|
||||||
|
clk_enable_unlock(flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool clk_ignore_unused;
|
||||||
|
static int __init clk_ignore_unused_setup(char *__unused)
|
||||||
|
{
|
||||||
|
clk_ignore_unused = true;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
__setup("clk_ignore_unused", clk_ignore_unused_setup);
|
||||||
|
|
||||||
|
static int clk_disable_unused(void)
|
||||||
|
{
|
||||||
|
struct clk_core *core;
|
||||||
|
|
||||||
|
if (clk_ignore_unused) {
|
||||||
|
pr_warn("clk: Not disabling unused clocks\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
clk_prepare_lock();
|
||||||
|
|
||||||
|
hlist_for_each_entry(core, &clk_root_list, child_node)
|
||||||
|
clk_disable_unused_subtree(core);
|
||||||
|
|
||||||
|
hlist_for_each_entry(core, &clk_orphan_list, child_node)
|
||||||
|
clk_disable_unused_subtree(core);
|
||||||
|
|
||||||
|
hlist_for_each_entry(core, &clk_root_list, child_node)
|
||||||
|
clk_unprepare_unused_subtree(core);
|
||||||
|
|
||||||
|
hlist_for_each_entry(core, &clk_orphan_list, child_node)
|
||||||
|
clk_unprepare_unused_subtree(core);
|
||||||
|
|
||||||
|
clk_prepare_unlock();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
late_initcall_sync(clk_disable_unused);
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue