MODULE_LICENSE("GPL");
 
 struct rtl821x_priv {
+       u16 phycr1;
        u16 phycr2;
 };
 
        if (!priv)
                return -ENOMEM;
 
+       priv->phycr1 = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR1);
+       if (priv->phycr1 < 0)
+               return priv->phycr1;
+
+       priv->phycr1 &= (RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF);
+       if (of_property_read_bool(dev->of_node, "realtek,aldps-enable"))
+               priv->phycr1 |= RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF;
+
        priv->phycr2 = phy_read_paged(phydev, 0xa43, RTL8211F_PHYCR2);
        if (priv->phycr2 < 0)
                return priv->phycr2;
        struct rtl821x_priv *priv = phydev->priv;
        struct device *dev = &phydev->mdio.dev;
        u16 val_txdly, val_rxdly;
-       u16 val;
        int ret;
 
-       val = RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_XTAL_OFF;
-       phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1, val, val);
+       ret = phy_modify_paged_changed(phydev, 0xa43, RTL8211F_PHYCR1,
+                                      RTL8211F_ALDPS_PLL_OFF | RTL8211F_ALDPS_ENABLE | RTL8211F_ALDPS_XTAL_OFF,
+                                      priv->phycr1);
+       if (ret < 0) {
+               dev_err(dev, "aldps mode  configuration failed: %pe\n",
+                       ERR_PTR(ret));
+               return ret;
+       }
 
        switch (phydev->interface) {
        case PHY_INTERFACE_MODE_RGMII: