Currently, of_clk_get_parent_name() returns a wrong parent clock name
when "clock-indices" property exists and the given index is not found
in the property.  In this case, NULL should be returned.

For example,

        oscillator {
                compatible = "myclocktype";
                #clock-cells = <1>;
                clock-indices = <1>, <3>;
                clock-output-names = "clka", "clkb";
        };

Currently, of_clk_get_parent_name(np, 0) returns "clka", but should
return NULL because "clock-indices" does not contain <0>.

Signed-off-by: Masahiro Yamada <yamada.masah...@socionext.com>
---

 drivers/clk/clk.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 20d8e07..8698074 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -3054,12 +3054,9 @@ EXPORT_SYMBOL_GPL(of_clk_get_parent_count);
 const char *of_clk_get_parent_name(struct device_node *np, int index)
 {
        struct of_phandle_args clkspec;
-       struct property *prop;
        const char *clk_name;
-       const __be32 *vp;
-       u32 pv;
-       int rc;
-       int count;
+       const __be32 *list;
+       int rc, len, i;
        struct clk *clk;
 
        rc = of_parse_phandle_with_args(np, "clocks", "#clock-cells", index,
@@ -3068,17 +3065,20 @@ const char *of_clk_get_parent_name(struct device_node 
*np, int index)
                return NULL;
 
        index = clkspec.args_count ? clkspec.args[0] : 0;
-       count = 0;
 
        /* if there is an indices property, use it to transfer the index
         * specified into an array offset for the clock-output-names property.
         */
-       of_property_for_each_u32(clkspec.np, "clock-indices", prop, vp, pv) {
-               if (index == pv) {
-                       index = count;
-                       break;
-               }
-               count++;
+       list = of_get_property(clkspec.np, "clock-indices", &len);
+       if (list) {
+               len /= sizeof(*list);
+               for (i = 0; i < len; i++)
+                       if (index == be32_to_cpup(list++)) {
+                               index = i;
+                               break;
+                       }
+               if (i == len)
+                       return NULL;
        }
 
        if (of_property_read_string_index(clkspec.np, "clock-output-names",
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to