Commit fa459711 authored by Stephen Boyd's avatar Stephen Boyd

Revert "clk: avoid circular clock topology"

This reverts commit 858d5881.

Joachim reports that this commit breaks lpc18xx boot. This is
because the hardware has circular clk topology where PLLs can
feed into dividers and the same dividers can feed into the PLLs.
The hardware is designed this way so that you can choose to put
the divider before the PLL or after the PLL depending on what you
configure to be the parent of the divider and what you configure
to be the parent of the PLL.

So let's drop this patch for now because we have hardware that
actually has loops. A future patch could check for circular
parents when we change parents and fail the switch, but that's
probably best left to some debugging Kconfig option so that we
don't suffer the sanity checking cost all the time.
Reported-by: default avatarJoachim Eastwood <manabian@gmail.com>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
parent 56713da3
...@@ -2241,38 +2241,6 @@ static inline void clk_debug_unregister(struct clk_core *core) ...@@ -2241,38 +2241,6 @@ static inline void clk_debug_unregister(struct clk_core *core)
} }
#endif #endif
/**
* __clk_is_ancestor - check if a clk_core is a possible ancestor of another
* @core: clock core
* @ancestor: ancestor clock core
*
* Returns true if there is a possibility that @ancestor can be an ancestor
* of @core, false otherwise.
*
* This function can be used against @core or @ancestor that has not been
* registered yet.
*/
static bool __clk_is_ancestor(struct clk_core *core, struct clk_core *ancestor)
{
struct clk_core *parent;
int i;
for (i = 0; i < core->num_parents; i++) {
parent = clk_core_get_parent_by_index(core, i);
/*
* If ancestor has not been added to clk_{root,orphan}_list
* yet, clk_core_lookup() cannot find it. If parent is NULL,
* compare the name strings, too.
*/
if ((parent && (parent == ancestor ||
__clk_is_ancestor(parent, ancestor))) ||
(!parent && !strcmp(core->parent_names[i], ancestor->name)))
return true;
}
return false;
}
/** /**
* __clk_core_init - initialize the data structures in a struct clk_core * __clk_core_init - initialize the data structures in a struct clk_core
* @core: clk_core being initialized * @core: clk_core being initialized
...@@ -2338,14 +2306,6 @@ static int __clk_core_init(struct clk_core *core) ...@@ -2338,14 +2306,6 @@ static int __clk_core_init(struct clk_core *core)
"%s: invalid NULL in %s's .parent_names\n", "%s: invalid NULL in %s's .parent_names\n",
__func__, core->name); __func__, core->name);
/* If core is an ancestor of itself, it would make a loop. */
if (__clk_is_ancestor(core, core)) {
pr_err("%s: %s would create circular parent\n", __func__,
core->name);
ret = -EINVAL;
goto out;
}
core->parent = __clk_init_parent(core); core->parent = __clk_init_parent(core);
/* /*
......
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