Add support for Ethernet PHY reset using reset controls.

This closely matches how Linux handles Ethernet PHY reset using reset
controls, initially introduced in the Linux commit 71dd6c0dff51 ("net:
phy: add support for reset-controller").

Signed-off-by: Jonas Karlman <[email protected]>
---
 drivers/net/eth-phy-uclass.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/drivers/net/eth-phy-uclass.c b/drivers/net/eth-phy-uclass.c
index 7c60b3e57975..a13e2fc7c50a 100644
--- a/drivers/net/eth-phy-uclass.c
+++ b/drivers/net/eth-phy-uclass.c
@@ -8,6 +8,7 @@
 #include <dm.h>
 #include <log.h>
 #include <net.h>
+#include <reset.h>
 #include <asm-generic/gpio.h>
 #include <dm/device_compat.h>
 #include <dm/device-internal.h>
@@ -18,6 +19,7 @@
 struct eth_phy_device_priv {
        struct mii_dev *mdio_bus;
        struct gpio_desc reset_gpio;
+       struct reset_ctl reset_ctrl;
        u32 reset_assert_delay;
        u32 reset_deassert_delay;
 };
@@ -139,6 +141,13 @@ static int eth_phy_of_to_plat(struct udevice *dev)
                        return ret;
        }
 
+       /* search "resets" in phy node */
+       if (CONFIG_IS_ENABLED(DM_RESET)) {
+               ret = reset_get_by_index(dev, 0, &uc_priv->reset_ctrl);
+               if (ret && ret != -ENOENT)
+                       return ret;
+       }
+
        uc_priv->reset_assert_delay = dev_read_u32_default(dev, 
"reset-assert-us", 0);
        uc_priv->reset_deassert_delay = dev_read_u32_default(dev, 
"reset-deassert-us", 0);
 
@@ -161,6 +170,13 @@ static void eth_phy_reset(struct udevice *dev, int value)
        if (CONFIG_IS_ENABLED(DM_GPIO) && 
dm_gpio_is_valid(&uc_priv->reset_gpio))
                dm_gpio_set_value(&uc_priv->reset_gpio, value);
 
+       if (CONFIG_IS_ENABLED(DM_RESET) && reset_valid(&uc_priv->reset_ctrl)) {
+               if (value)
+                       reset_assert(&uc_priv->reset_ctrl);
+               else
+                       reset_deassert(&uc_priv->reset_ctrl);
+       }
+
        delay = value ? uc_priv->reset_assert_delay : 
uc_priv->reset_deassert_delay;
        if (delay)
                udelay(delay);
-- 
2.55.0

Reply via email to