net: stmmac: dwmac-qcom-ethqos: add platform level clocks management
authorBhupesh Sharma <bhupesh.sharma@linaro.org>
Wed, 17 Nov 2021 11:05:38 +0000 (16:35 +0530)
committerDavid S. Miller <davem@davemloft.net>
Thu, 18 Nov 2021 11:33:10 +0000 (11:33 +0000)
Split clocks settings from init callback into clks_config callback,
which could support platform level clock management.

Cc: David S. Miller <davem@davemloft.net>
Signed-off-by: Bhupesh Sharma <bhupesh.sharma@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c

index 5c74b6279d690c53cb6a6e21e54e212c05b13705..8fea48e477e6f14c2d8de2bc1e68c43beaa2be90 100644 (file)
@@ -447,6 +447,24 @@ static void ethqos_fix_mac_speed(void *priv, unsigned int speed)
        ethqos_configure(ethqos);
 }
 
+static int ethqos_clks_config(void *priv, bool enabled)
+{
+       struct qcom_ethqos *ethqos = priv;
+       int ret = 0;
+
+       if (enabled) {
+               ret = clk_prepare_enable(ethqos->rgmii_clk);
+               if (ret) {
+                       dev_err(&ethqos->pdev->dev, "rgmii_clk enable failed\n");
+                       return ret;
+               }
+       } else {
+               clk_disable_unprepare(ethqos->rgmii_clk);
+       }
+
+       return ret;
+}
+
 static int qcom_ethqos_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
@@ -466,6 +484,8 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
                return PTR_ERR(plat_dat);
        }
 
+       plat_dat->clks_config = ethqos_clks_config;
+
        ethqos = devm_kzalloc(&pdev->dev, sizeof(*ethqos), GFP_KERNEL);
        if (!ethqos) {
                ret = -ENOMEM;
@@ -489,7 +509,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
                goto err_mem;
        }
 
-       ret = clk_prepare_enable(ethqos->rgmii_clk);
+       ret = ethqos_clks_config(ethqos, true);
        if (ret)
                goto err_mem;
 
@@ -512,7 +532,7 @@ static int qcom_ethqos_probe(struct platform_device *pdev)
        return ret;
 
 err_clk:
-       clk_disable_unprepare(ethqos->rgmii_clk);
+       ethqos_clks_config(ethqos, false);
 
 err_mem:
        stmmac_remove_config_dt(pdev, plat_dat);
@@ -530,7 +550,7 @@ static int qcom_ethqos_remove(struct platform_device *pdev)
                return -ENODEV;
 
        ret = stmmac_pltfr_remove(pdev);
-       clk_disable_unprepare(ethqos->rgmii_clk);
+       ethqos_clks_config(ethqos, false);
 
        return ret;
 }