struct sunxi_priv_data *gmac = priv;
 
        if (gmac->variant->soc_has_internal_phy) {
-               /* sun8i_dwmac_exit could be called with mdiomux uninit */
-               if (gmac->mux_handle)
-                       mdio_mux_uninit(gmac->mux_handle);
                if (gmac->internal_phy_powered)
                        sun8i_dwmac_unpower_internal_phy(gmac);
        }
 
        sun8i_dwmac_unset_syscon(gmac);
 
-       reset_control_put(gmac->rst_ephy);
-
        clk_disable_unprepare(gmac->tx_clk);
 
        if (gmac->regulator)
 
        return ret;
 dwmac_mux:
+       reset_control_put(gmac->rst_ephy);
+       clk_put(gmac->ephy_clk);
        sun8i_dwmac_unset_syscon(gmac);
 dwmac_remove:
        stmmac_dvr_remove(&pdev->dev);
        return ret;
 }
 
+static int sun8i_dwmac_remove(struct platform_device *pdev)
+{
+       struct net_device *ndev = platform_get_drvdata(pdev);
+       struct stmmac_priv *priv = netdev_priv(ndev);
+       struct sunxi_priv_data *gmac = priv->plat->bsp_priv;
+
+       if (gmac->variant->soc_has_internal_phy) {
+               mdio_mux_uninit(gmac->mux_handle);
+               sun8i_dwmac_unpower_internal_phy(gmac);
+               reset_control_put(gmac->rst_ephy);
+               clk_put(gmac->ephy_clk);
+       }
+
+       stmmac_pltfr_remove(pdev);
+
+       return 0;
+}
+
 static const struct of_device_id sun8i_dwmac_match[] = {
        { .compatible = "allwinner,sun8i-h3-emac",
                .data = &emac_variant_h3 },
 
 static struct platform_driver sun8i_dwmac_driver = {
        .probe  = sun8i_dwmac_probe,
-       .remove = stmmac_pltfr_remove,
+       .remove = sun8i_dwmac_remove,
        .driver = {
                .name           = "dwmac-sun8i",
                .pm             = &stmmac_pltfr_pm_ops,