Now the UCLASS_ETH device "node" field is owerwritten by some network drivers in
case of Ethernet PHYs which are linked to UCLASS_ETH device using
"phy-handle" DT property and when Ethernet PHY driver needs to read some
additional information from DT. In such cases following happens (in
general):

- network drivers
        priv->phydev = phy_connect(priv->bus, priv->phyaddr, dev,
                                   priv->interface);
        <-- phydev is connected to dev which is UCLASS_ETH device

        if (priv->phy_of_handle > 0)
                dev_set_of_offset(priv->phydev->dev, priv->phy_of_handle);
        <-- phydev->dev->node is overwritten by phy-handle DT node

- PHY driver in .config() callback
        int node = dev_of_offset(dev);
        <-- PHY driver uses overwritten dev->node
        const void *fdt = gd->fdt_blob;

         if (fdtdec_get_bool(fdt, node, "property"))
                ...

As result, UCLASS_ETH device can't be used any more for DT accessing.

This patch adds additional ofnode node field to struct phy_device which can
be set explicitly by network drivers and used by PHY drivers, so
overwriting can be avoided. Also add helper function phy_get_ofnode()
which will check and return phy_device->node or dev_ofnode(phydev->dev) for
backward compatibility with existing drivers.

Signed-off-by: Grygorii Strashko <grygorii.stras...@ti.com>
---
Changes in v2:
- struct phy_device->node field initialization added to phy_device_create()

 drivers/net/phy/phy.c |  4 ++++
 include/phy.h         | 13 +++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 4e610bf..eea88f8 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -644,6 +644,10 @@ static struct phy_device *phy_device_create(struct mii_dev 
*bus, int addr,
        dev->link = 0;
        dev->interface = interface;
 
+#ifdef CONFIG_DM_ETH
+       dev->node = ofnode_null();
+#endif
+
        dev->autoneg = AUTONEG_ENABLE;
 
        dev->addr = addr;
diff --git a/include/phy.h b/include/phy.h
index 7c3fc5c..0575ea8 100644
--- a/include/phy.h
+++ b/include/phy.h
@@ -9,6 +9,7 @@
 #ifndef _PHY_H
 #define _PHY_H
 
+#include <dm.h>
 #include <linux/list.h>
 #include <linux/mii.h>
 #include <linux/ethtool.h>
@@ -165,6 +166,7 @@ struct phy_device {
 
 #ifdef CONFIG_DM_ETH
        struct udevice *dev;
+       ofnode node;
 #else
        struct eth_device *dev;
 #endif
@@ -235,11 +237,22 @@ void phy_connect_dev(struct phy_device *phydev, struct 
udevice *dev);
 struct phy_device *phy_connect(struct mii_dev *bus, int addr,
                                struct udevice *dev,
                                phy_interface_t interface);
+static inline ofnode phy_get_ofnode(struct phy_device *phydev)
+{
+       if (ofnode_valid(phydev->node))
+               return phydev->node;
+       else
+               return dev_ofnode(phydev->dev);
+}
 #else
 void phy_connect_dev(struct phy_device *phydev, struct eth_device *dev);
 struct phy_device *phy_connect(struct mii_dev *bus, int addr,
                                struct eth_device *dev,
                                phy_interface_t interface);
+static inline ofnode phy_get_ofnode(struct phy_device *phydev)
+{
+       return ofnode_null();
+}
 #endif
 int phy_startup(struct phy_device *phydev);
 int phy_config(struct phy_device *phydev);
-- 
2.10.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to