struct stm32_ops {
        int (*set_mode)(struct plat_stmmacenet_data *plat_dat);
-       int (*clk_prepare)(struct stm32_dwmac *dwmac, bool prepare);
        int (*suspend)(struct stm32_dwmac *dwmac);
        void (*resume)(struct stm32_dwmac *dwmac);
        int (*parse_data)(struct stm32_dwmac *dwmac,
        bool clk_rx_enable_in_suspend;
 };
 
-static int stm32_dwmac_init(struct plat_stmmacenet_data *plat_dat)
+static int stm32_dwmac_clk_enable(struct stm32_dwmac *dwmac, bool resume)
 {
-       struct stm32_dwmac *dwmac = plat_dat->bsp_priv;
        int ret;
 
-       if (dwmac->ops->set_mode) {
-               ret = dwmac->ops->set_mode(plat_dat);
-               if (ret)
-                       return ret;
-       }
-
        ret = clk_prepare_enable(dwmac->clk_tx);
        if (ret)
-               return ret;
+               goto err_clk_tx;
 
-       if (!dwmac->ops->clk_rx_enable_in_suspend ||
-           !dwmac->dev->power.is_suspended) {
+       if (!dwmac->ops->clk_rx_enable_in_suspend || !resume) {
                ret = clk_prepare_enable(dwmac->clk_rx);
-               if (ret) {
-                       clk_disable_unprepare(dwmac->clk_tx);
-                       return ret;
-               }
+               if (ret)
+                       goto err_clk_rx;
        }
 
-       if (dwmac->ops->clk_prepare) {
-               ret = dwmac->ops->clk_prepare(dwmac, true);
-               if (ret) {
-                       clk_disable_unprepare(dwmac->clk_rx);
-                       clk_disable_unprepare(dwmac->clk_tx);
-               }
+       ret = clk_prepare_enable(dwmac->syscfg_clk);
+       if (ret)
+               goto err_syscfg_clk;
+
+       if (dwmac->enable_eth_ck) {
+               ret = clk_prepare_enable(dwmac->clk_eth_ck);
+               if (ret)
+                       goto err_clk_eth_ck;
        }
 
        return ret;
+
+err_clk_eth_ck:
+       clk_disable_unprepare(dwmac->syscfg_clk);
+err_syscfg_clk:
+       if (!dwmac->ops->clk_rx_enable_in_suspend || !resume)
+               clk_disable_unprepare(dwmac->clk_rx);
+err_clk_rx:
+       clk_disable_unprepare(dwmac->clk_tx);
+err_clk_tx:
+       return ret;
 }
 
-static int stm32mp1_clk_prepare(struct stm32_dwmac *dwmac, bool prepare)
+static int stm32_dwmac_init(struct plat_stmmacenet_data *plat_dat, bool resume)
 {
-       int ret = 0;
+       struct stm32_dwmac *dwmac = plat_dat->bsp_priv;
+       int ret;
 
-       if (prepare) {
-               ret = clk_prepare_enable(dwmac->syscfg_clk);
+       if (dwmac->ops->set_mode) {
+               ret = dwmac->ops->set_mode(plat_dat);
                if (ret)
                        return ret;
-               if (dwmac->enable_eth_ck) {
-                       ret = clk_prepare_enable(dwmac->clk_eth_ck);
-                       if (ret) {
-                               clk_disable_unprepare(dwmac->syscfg_clk);
-                               return ret;
-                       }
-               }
-       } else {
-               clk_disable_unprepare(dwmac->syscfg_clk);
-               if (dwmac->enable_eth_ck)
-                       clk_disable_unprepare(dwmac->clk_eth_ck);
        }
-       return ret;
+
+       return stm32_dwmac_clk_enable(dwmac, resume);
 }
 
 static int stm32mp1_set_mode(struct plat_stmmacenet_data *plat_dat)
                                 dwmac->ops->syscfg_eth_mask, val << 23);
 }
 
-static void stm32_dwmac_clk_disable(struct stm32_dwmac *dwmac)
+static void stm32_dwmac_clk_disable(struct stm32_dwmac *dwmac, bool suspend)
 {
        clk_disable_unprepare(dwmac->clk_tx);
-       clk_disable_unprepare(dwmac->clk_rx);
+       if (!dwmac->ops->clk_rx_enable_in_suspend || !suspend)
+               clk_disable_unprepare(dwmac->clk_rx);
 
-       if (dwmac->ops->clk_prepare)
-               dwmac->ops->clk_prepare(dwmac, false);
+       clk_disable_unprepare(dwmac->syscfg_clk);
+       if (dwmac->enable_eth_ck)
+               clk_disable_unprepare(dwmac->clk_eth_ck);
 }
 
 static int stm32_dwmac_parse_data(struct stm32_dwmac *dwmac,
 
        plat_dat->bsp_priv = dwmac;
 
-       ret = stm32_dwmac_init(plat_dat);
+       ret = stm32_dwmac_init(plat_dat, false);
        if (ret)
                return ret;
 
        return 0;
 
 err_clk_disable:
-       stm32_dwmac_clk_disable(dwmac);
+       stm32_dwmac_clk_disable(dwmac, false);
 
        return ret;
 }
 
        stmmac_dvr_remove(&pdev->dev);
 
-       stm32_dwmac_clk_disable(priv->plat->bsp_priv);
+       stm32_dwmac_clk_disable(dwmac, false);
 
        if (dwmac->irq_pwr_wakeup >= 0) {
                dev_pm_clear_wake_irq(&pdev->dev);
 
 static int stm32mp1_suspend(struct stm32_dwmac *dwmac)
 {
-       int ret = 0;
-
-       ret = clk_prepare_enable(dwmac->clk_ethstp);
-       if (ret)
-               return ret;
-
-       clk_disable_unprepare(dwmac->clk_tx);
-       clk_disable_unprepare(dwmac->syscfg_clk);
-       if (dwmac->enable_eth_ck)
-               clk_disable_unprepare(dwmac->clk_eth_ck);
-
-       return ret;
+       return clk_prepare_enable(dwmac->clk_ethstp);
 }
 
 static void stm32mp1_resume(struct stm32_dwmac *dwmac)
        clk_disable_unprepare(dwmac->clk_ethstp);
 }
 
-static int stm32mcu_suspend(struct stm32_dwmac *dwmac)
-{
-       clk_disable_unprepare(dwmac->clk_tx);
-       clk_disable_unprepare(dwmac->clk_rx);
-
-       return 0;
-}
-
 #ifdef CONFIG_PM_SLEEP
 static int stm32_dwmac_suspend(struct device *dev)
 {
        int ret;
 
        ret = stmmac_suspend(dev);
+       if (ret)
+               return ret;
+
+       stm32_dwmac_clk_disable(dwmac, true);
 
        if (dwmac->ops->suspend)
                ret = dwmac->ops->suspend(dwmac);
        if (dwmac->ops->resume)
                dwmac->ops->resume(dwmac);
 
-       ret = stm32_dwmac_init(priv->plat);
+       ret = stm32_dwmac_init(priv->plat, true);
        if (ret)
                return ret;
 
 
 static struct stm32_ops stm32mcu_dwmac_data = {
        .set_mode = stm32mcu_set_mode,
-       .suspend = stm32mcu_suspend,
        .syscfg_eth_mask = SYSCFG_MCU_ETH_MASK
 };
 
 static struct stm32_ops stm32mp1_dwmac_data = {
        .set_mode = stm32mp1_set_mode,
-       .clk_prepare = stm32mp1_clk_prepare,
        .suspend = stm32mp1_suspend,
        .resume = stm32mp1_resume,
        .parse_data = stm32mp1_parse_data,