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 <[email protected]>
---
 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

Reply via email to