net: mdio-uclass: add dm_phy_find_by_ofnode() helper
authorMarek Behún <marek.behun@nic.cz>
Wed, 27 Apr 2022 10:41:49 +0000 (12:41 +0200)
committerStefan Roese <sr@denx.de>
Wed, 4 May 2022 05:05:51 +0000 (07:05 +0200)
Add helper to resolve PHY node from it's ofnode via DM MDIO subsystem.

Signed-off-by: Marek Behún <marek.behun@nic.cz>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Reviewed-by: Stefan Roese <sr@denx.de>
include/miiphy.h
net/mdio-uclass.c

index 110921f..c66a184 100644 (file)
@@ -189,6 +189,15 @@ int dm_mdio_write(struct udevice *mdio_dev, int addr, int devad, int reg, u16 va
 int dm_mdio_reset(struct udevice *mdio_dev);
 
 /**
+ * dm_phy_find_by_ofnode - Find PHY device by ofnode
+ *
+ * @phynode: PHY's ofnode
+ *
+ * Return: pointer to phy_device, or NULL on error
+ */
+struct phy_device *dm_phy_find_by_ofnode(ofnode phynode);
+
+/**
  * dm_mdio_phy_connect - Wrapper over phy_connect for DM MDIO
  *
  * @mdiodev: mdio device the PHY is accesible on
index 7593618..4401492 100644 (file)
@@ -129,6 +129,28 @@ static int dm_mdio_pre_remove(struct udevice *dev)
        return 0;
 }
 
+struct phy_device *dm_phy_find_by_ofnode(ofnode phynode)
+{
+       struct mdio_perdev_priv *pdata;
+       struct udevice *mdiodev;
+       u32 phy_addr;
+
+       if (ofnode_read_u32(phynode, "reg", &phy_addr))
+               return NULL;
+
+       if (uclass_get_device_by_ofnode(UCLASS_MDIO,
+                                       ofnode_get_parent(phynode),
+                                       &mdiodev))
+               return NULL;
+
+       if (device_probe(mdiodev))
+               return NULL;
+
+       pdata = dev_get_uclass_priv(mdiodev);
+
+       return phy_find_by_mask(pdata->mii_bus, BIT(phy_addr));
+}
+
 struct phy_device *dm_mdio_phy_connect(struct udevice *mdiodev, int phyaddr,
                                       struct udevice *ethdev,
                                       phy_interface_t interface)