Ideally, there should be one single entry in the OF world. This way, the
DT parsing logic is always identical. At this stage, we call
of_parse_phandle_with_args() in:
- of_parse_clkspec()
- of_clk_get_parent_name()
which kinds of defeats the above statement. Furthermore, when this call
is done from of_clk_get_parent_name(), we fail to parse the
'clock-ranges' property.

Make sure DT world is entered only once by calling of_parse_clkspec()
from of_clk_get_parent_name(). Doing so implies that we do not try the
"clock-ranges" path if we already found a "clocks" property.

Suggested-by: Stephen Boyd <[email protected]>
Fixes: 4472287a3b2f5 ("clk: Introduce of_clk_get_hw_from_clkspec()")
Signed-off-by: Miquel Raynal (Schneider Electric) <[email protected]>
Reviewed-by: Brian Masney <[email protected]>
---
 drivers/clk/clk.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 7d63d81ebc09..45f5d7a4ccc1 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -5219,6 +5219,8 @@ static int of_parse_clkspec(const struct device_node *np, 
int index,
                 * has a "clock-ranges" property, then we can try one of its
                 * clocks.
                 */
+               if (of_property_present(np, "clocks"))
+                       break;
                np = np->parent;
                if (np && !of_property_present(np, "clock-ranges"))
                        break;
@@ -5364,8 +5366,7 @@ const char *of_clk_get_parent_name(const struct 
device_node *np, int index)
        int count;
        struct clk *clk;
 
-       rc = of_parse_phandle_with_args(np, "clocks", "#clock-cells", index,
-                                       &clkspec);
+       rc = of_parse_clkspec(np, index, NULL, &clkspec);
        if (rc)
                return NULL;
 

-- 
2.54.0


Reply via email to