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(ðqos->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;
                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;
                goto err_mem;
        }
 
-       ret = clk_prepare_enable(ethqos->rgmii_clk);
+       ret = ethqos_clks_config(ethqos, true);
        if (ret)
                goto err_mem;
 
        return ret;
 
 err_clk:
-       clk_disable_unprepare(ethqos->rgmii_clk);
+       ethqos_clks_config(ethqos, false);
 
 err_mem:
        stmmac_remove_config_dt(pdev, plat_dat);
                return -ENODEV;
 
        ret = stmmac_pltfr_remove(pdev);
-       clk_disable_unprepare(ethqos->rgmii_clk);
+       ethqos_clks_config(ethqos, false);
 
        return ret;
 }