struct stmmac_priv *priv = netdev_priv(dev);
        int ret;
 
-       clk_prepare_enable(priv->stmmac_clk);
-
        stmmac_check_ether_addr(priv);
 
        if (priv->pcs != STMMAC_PCS_RGMII && priv->pcs != STMMAC_PCS_TBI &&
 #ifdef CONFIG_STMMAC_DEBUG_FS
        stmmac_exit_fs();
 #endif
-       clk_disable_unprepare(priv->stmmac_clk);
 
        stmmac_release_ptp(priv);
 
        if ((phyaddr >= 0) && (phyaddr <= 31))
                priv->plat->phy_addr = phyaddr;
 
+       priv->stmmac_clk = devm_clk_get(priv->device, STMMAC_RESOURCE_NAME);
+       if (IS_ERR(priv->stmmac_clk)) {
+               dev_warn(priv->device, "%s: warning: cannot get CSR clock\n",
+                        __func__);
+               goto error_clk_get;
+       }
+       clk_prepare_enable(priv->stmmac_clk);
+
        /* Init MAC and get the capabilities */
        ret = stmmac_hw_init(priv);
        if (ret)
-               goto error_free_netdev;
+               goto error_hw_init;
 
        ndev->netdev_ops = &stmmac_netdev_ops;
 
                goto error_netdev_register;
        }
 
-       priv->stmmac_clk = clk_get(priv->device, STMMAC_RESOURCE_NAME);
-       if (IS_ERR(priv->stmmac_clk)) {
-               pr_warn("%s: warning: cannot get CSR clock\n", __func__);
-               goto error_clk_get;
-       }
-
        /* If a specific clk_csr value is passed from the platform
         * this means that the CSR Clock Range selection cannot be
         * changed at run-time and it is fixed. Viceversa the driver'll try to
        return priv;
 
 error_mdio_register:
-       clk_put(priv->stmmac_clk);
-error_clk_get:
        unregister_netdev(ndev);
 error_netdev_register:
        netif_napi_del(&priv->napi);
-error_free_netdev:
+error_hw_init:
+       clk_disable_unprepare(priv->stmmac_clk);
+error_clk_get:
        free_netdev(ndev);
 
        return NULL;
                stmmac_mdio_unregister(ndev);
        netif_carrier_off(ndev);
        unregister_netdev(ndev);
+       clk_disable_unprepare(priv->stmmac_clk);
        free_netdev(ndev);
 
        return 0;