forked from Minki/linux
clk: Remove global clk traversal on fetch parent index
It's not required to traverse the entire clk tree when the parents array contains a NULL value. We already have the parent clk_core pointer, so we can just compare the parent->name and parent_names[i] pointers. This can be a substantial power improvement in cases where the parent clk isn't known and that clk is never registered, because a mux having an unregistered parent name may traverse the clk tree on every clk_set_rate() call in clk_mux_determine_rate_flags(). This can happen hundreds of times a second for CPU clks. This patch is the combination of reverting commit470b5e2f97
("clk: simplify clk_fetch_parent_index() function") and optimizing the resulting code to never call __clk_lookup() because we already have the clk_core pointer we're looking for. That optimization went unnoticed even after commitda0f0b2c3a
("clk: Correct lookup logic in clk_fetch_parent_index()") tried to optimize this path. Signed-off-by: Derek Basehore <dbasehore@chromium.org> [sboyd@kernel.org: More description in commit text] Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
401fbb34f5
commit
ede7785847
@ -1513,10 +1513,20 @@ static int clk_fetch_parent_index(struct clk_core *core,
|
||||
if (!parent)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < core->num_parents; i++)
|
||||
if (clk_core_get_parent_by_index(core, i) == parent)
|
||||
for (i = 0; i < core->num_parents; i++) {
|
||||
if (core->parents[i] == parent)
|
||||
return i;
|
||||
|
||||
if (core->parents[i])
|
||||
continue;
|
||||
|
||||
/* Fallback to comparing globally unique names */
|
||||
if (!strcmp(parent->name, core->parent_names[i])) {
|
||||
core->parents[i] = parent;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user