driver:clk:Add noc clock initialization in isp clock tree driver
authorxingyu.wu <xingyu.wu@starfivetech.com>
Fri, 13 May 2022 10:03:03 +0000 (18:03 +0800)
committersamin <samin.guo@starfivetech.com>
Sun, 15 May 2022 10:57:04 +0000 (18:57 +0800)
Signed-off-by: Xingyu Wu <xingyu.wu@starfivetech.com>
arch/riscv/boot/dts/starfive/jh7110.dtsi [changed mode: 0644->0755]
drivers/clk/starfive/clk-starfive-jh7110-isp.c

old mode 100644 (file)
new mode 100755 (executable)
index 6b84bd7..544254d
                        #clock-cells = <1>;
                        clocks = <&clkgen JH7110_ISP_TOP_CLK_DVP>,
                                 <&clkgen JH7110_ISP_TOP_CLK_ISPCORE_2X>,
-                                <&clkgen JH7110_ISP_TOP_CLK_ISP_AXI>;
+                                <&clkgen JH7110_ISP_TOP_CLK_ISP_AXI>,
+                                <&clkgen JH7110_NOC_BUS_CLK_ISP_AXI>;
                        clock-names = "u0_dom_isp_top_clk_dom_isp_top_clk_dvp",
                                      "u0_dom_isp_top_clk_dom_isp_top_clk_ispcore_2x",
-                                     "u0_dom_isp_top_clk_dom_isp_top_clk_isp_axi";
+                                     "u0_dom_isp_top_clk_dom_isp_top_clk_isp_axi",
+                                     "u0_sft7110_noc_bus_clk_isp_axi";
                        resets = <&rstgen RSTN_U0_DOM_ISP_TOP_N>,
-                                <&rstgen RSTN_U0_DOM_ISP_TOP_AXI>;
-                       reset-names = "rst_isp_top_n", "rst_isp_top_axi";
+                                <&rstgen RSTN_U0_DOM_ISP_TOP_AXI>,
+                                <&rstgen RSTN_U0_NOC_BUS_ISP_AXI_N>;
+                       reset-names = "rst_isp_top_n", "rst_isp_top_axi",
+                                     "rst_isp_noc_bus_n";
                        status = "disabled";
                };
 
index 09a8dc3..2fc7a28 100755 (executable)
@@ -82,8 +82,10 @@ static int __init clk_starfive_jh7110_isp_probe(struct platform_device *pdev)
 {
        struct jh7110_clk_priv *priv;
        unsigned int idx;
+       struct clk *clk_isp_noc_bus;
        struct clk *clk_isp_2x;
        struct clk *clk_isp_axi;
+       struct reset_control *rst_isp_noc_bus;
        struct reset_control *rst_isp_n;
        struct reset_control *rst_isp_axi;
        int ret = 0;
@@ -101,17 +103,45 @@ static int __init clk_starfive_jh7110_isp_probe(struct platform_device *pdev)
 
        starfive_power_domain_set(POWER_DOMAIN_ISP, 1);
 
+       clk_isp_noc_bus = devm_clk_get(priv->dev,
+                       "u0_sft7110_noc_bus_clk_isp_axi");
+       if (!IS_ERR(clk_isp_noc_bus)){
+               ret = clk_prepare_enable(clk_isp_noc_bus);
+               if(ret){
+                       dev_err(priv->dev, "clk_isp_noc_bus enable failed\n");
+                       goto clk_noc_enable_failed;
+               }
+       }else{
+               dev_err(priv->dev, "clk_isp_noc_bus get failed\n");
+               return PTR_ERR(clk_isp_noc_bus);
+       }
+
+       rst_isp_noc_bus = devm_reset_control_get_exclusive(
+                       priv->dev, "rst_isp_noc_bus_n");
+       if (!IS_ERR(rst_isp_noc_bus)) {
+               ret = reset_control_deassert(rst_isp_noc_bus);
+               if(ret){
+                       dev_err(priv->dev, "rst_isp_noc_bus deassert failed.\n");
+                       goto rst_noc_deassert_failed;
+               }
+       }else{
+               dev_err(priv->dev, "rst_isp_noc_bus get failed.\n");
+               ret = PTR_ERR(rst_isp_noc_bus);
+               goto rst_noc_get_failed;
+       }
+
        clk_isp_2x = devm_clk_get(priv->dev,
                        "u0_dom_isp_top_clk_dom_isp_top_clk_ispcore_2x");
        if (!IS_ERR(clk_isp_2x)){
                ret = clk_prepare_enable(clk_isp_2x);
                if(ret){
                        dev_err(priv->dev, "clk_isp_2x enable failed\n");
-                       return ret;
+                       goto clk_2x_enable_failed;
                }
        }else{
                dev_err(priv->dev, "clk_isp_2x get failed\n");
-               return PTR_ERR(clk_isp_2x);
+               ret = PTR_ERR(clk_isp_2x);
+               goto clk_2x_get_failed;
        }
 
        clk_isp_axi = devm_clk_get(priv->dev,
@@ -120,11 +150,12 @@ static int __init clk_starfive_jh7110_isp_probe(struct platform_device *pdev)
                ret = clk_prepare_enable(clk_isp_axi);
                if(ret){
                        dev_err(priv->dev, "clk_isp_axi enable failed\n");
-                       return ret;
+                       goto clk_axi_enable_failed;
                }
        }else{
                dev_err(priv->dev, "clk_isp_axi get failed\n");
-               return PTR_ERR(clk_isp_axi);
+               ret = PTR_ERR(clk_isp_axi);
+               goto clk_axi_get_failed;
        }
 
        rst_isp_n = devm_reset_control_get_exclusive(
@@ -133,11 +164,12 @@ static int __init clk_starfive_jh7110_isp_probe(struct platform_device *pdev)
                ret = reset_control_deassert(rst_isp_n);
                if(ret){
                        dev_err(priv->dev, "rst_isp_n deassert failed.\n");
-                       return ret;
+                       goto rst_n_deassert_failed;
                }
        }else{
                dev_err(priv->dev, "rst_isp_n get failed.\n");
-               return PTR_ERR(rst_isp_n);
+               ret = PTR_ERR(rst_isp_n);
+               goto rst_n_get_failed;
        }
 
        rst_isp_axi = devm_reset_control_get_exclusive(
@@ -146,11 +178,12 @@ static int __init clk_starfive_jh7110_isp_probe(struct platform_device *pdev)
                ret = reset_control_deassert(rst_isp_axi);
                if(ret){
                        dev_err(priv->dev, "rst_isp_axi deassert failed.\n");
-                       return ret;
+                       goto rst_axi_deassert_failed;
                }
        }else{
                dev_err(priv->dev, "rst_isp_axi get failed.\n");
-               return PTR_ERR(rst_isp_axi);
+               ret = PTR_ERR(rst_isp_axi);
+               goto rst_axi_get_failed;
        }
 
        priv->pll[PLL_OFI(JH7110_U3_PCLK_MUX_FUNC_PCLK)] =
@@ -264,8 +297,39 @@ static int __init clk_starfive_jh7110_isp_probe(struct platform_device *pdev)
        if (ret)
                return ret;
 
+       reset_control_put(rst_isp_axi);
+       reset_control_put(rst_isp_n);
+       reset_control_put(rst_isp_noc_bus);
+       devm_clk_put(priv->dev, clk_isp_axi);
+       devm_clk_put(priv->dev, clk_isp_2x);
+       devm_clk_put(priv->dev, clk_isp_noc_bus);
+
        dev_info(&pdev->dev,"starfive JH7110 clk_isp init successfully.");
        return 0;
+
+rst_axi_deassert_failed:
+       reset_control_put(rst_isp_axi);
+rst_axi_get_failed:
+       reset_control_assert(rst_isp_n);
+rst_n_deassert_failed:
+       reset_control_put(rst_isp_n);
+rst_n_get_failed:
+       clk_disable_unprepare(clk_isp_axi);
+clk_axi_enable_failed:
+       devm_clk_put(priv->dev, clk_isp_axi);
+clk_axi_get_failed:
+       clk_disable_unprepare(clk_isp_2x);
+clk_2x_enable_failed:
+       devm_clk_put(priv->dev, clk_isp_2x);
+clk_2x_get_failed:
+rst_noc_deassert_failed:
+       reset_control_put(rst_isp_noc_bus);
+rst_noc_get_failed:
+clk_noc_enable_failed:
+       devm_clk_put(priv->dev, clk_isp_noc_bus);
+
+       return ret;
+
 }
 
 static const struct of_device_id clk_starfive_jh7110_isp_match[] = {