Messages in this thread Patch in this message | | | From | Derek Basehore <> | Subject | [PATCH] clk: Remove global clk traversal on fetch parent index | Date | Thu, 20 Dec 2018 16:31:00 -0800 |
| |
It's not required to traverse the entire clk tree when the parents array contains a NULL value. You already have the parent clk_core pointer, so you can just compare the parent->name and parent_names[i] pointers.
In cases where clk names are never registered, this can be a substantial power improvement since a mux having an unregistered parent name will traverse the clk tree on every set_rate. This can happen hundreds of times a second on CPU clks.
Change-Id: I85499d2e576249568ff508e424ca8d5009e6e2b1 Signed-off-by: Derek Basehore <dbasehore@chromium.org> --- drivers/clk/clk.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c index af011974d4ec..57a95c713286 100644 --- a/drivers/clk/clk.c +++ b/drivers/clk/clk.c @@ -1516,9 +1516,18 @@ 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; + + if (!strcmp(parent->name, core->parent_names[i])) { + core->parents[i] = parent; return i; + } + } return -EINVAL; } -- 2.20.1.415.g653613c723-goog
| |