clk: renesas: rzg2l: Add multi clock PM support
authorBiju Das <biju.das.jz@bp.renesas.com>
Sat, 26 Jun 2021 08:13:35 +0000 (09:13 +0100)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Mon, 12 Jul 2021 08:52:03 +0000 (10:52 +0200)
Add multi clock PM support for cpg driver.

Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
Link: https://lore.kernel.org/r/20210626081344.5783-2-biju.das.jz@bp.renesas.com
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
drivers/clk/renesas/renesas-rzg2l-cpg.c

index 5009b9e..1941f13 100644 (file)
@@ -594,42 +594,49 @@ static int rzg2l_cpg_attach_dev(struct generic_pm_domain *unused, struct device
 {
        struct device_node *np = dev->of_node;
        struct of_phandle_args clkspec;
+       bool once = true;
        struct clk *clk;
        int error;
        int i = 0;
 
        while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i,
                                           &clkspec)) {
-               if (rzg2l_cpg_is_pm_clk(&clkspec))
-                       goto found;
-
-               of_node_put(clkspec.np);
+               if (rzg2l_cpg_is_pm_clk(&clkspec)) {
+                       if (once) {
+                               once = false;
+                               error = pm_clk_create(dev);
+                               if (error) {
+                                       of_node_put(clkspec.np);
+                                       goto err;
+                               }
+                       }
+                       clk = of_clk_get_from_provider(&clkspec);
+                       of_node_put(clkspec.np);
+                       if (IS_ERR(clk)) {
+                               error = PTR_ERR(clk);
+                               goto fail_destroy;
+                       }
+
+                       error = pm_clk_add_clk(dev, clk);
+                       if (error) {
+                               dev_err(dev, "pm_clk_add_clk failed %d\n",
+                                       error);
+                               goto fail_put;
+                       }
+               } else {
+                       of_node_put(clkspec.np);
+               }
                i++;
        }
 
        return 0;
 
-found:
-       clk = of_clk_get_from_provider(&clkspec);
-       of_node_put(clkspec.np);
-
-       if (IS_ERR(clk))
-               return PTR_ERR(clk);
-
-       error = pm_clk_create(dev);
-       if (error)
-               goto fail_put;
-
-       error = pm_clk_add_clk(dev, clk);
-       if (error)
-               goto fail_destroy;
-
-       return 0;
+fail_put:
+       clk_put(clk);
 
 fail_destroy:
        pm_clk_destroy(dev);
-fail_put:
-       clk_put(clk);
+err:
        return error;
 }