aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek BehĂșn <marek.behun@nic.cz>2022-04-27 12:41:49 +0200
committerStefan Roese <sr@denx.de>2022-05-04 07:05:51 +0200
commit00b1bad961fff51db71573f5fc6e4e35b47381b2 (patch)
tree5d5a53b7a8c0058b05ccd8a2d9d70972dbbb9279
parenta2b2542992a96662740a39aad66e173a857dff2a (diff)
downloadu-boot-00b1bad961fff51db71573f5fc6e4e35b47381b2.zip
u-boot-00b1bad961fff51db71573f5fc6e4e35b47381b2.tar.gz
u-boot-00b1bad961fff51db71573f5fc6e4e35b47381b2.tar.bz2
net: mdio-uclass: add dm_phy_find_by_ofnode() helper
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>
-rw-r--r--include/miiphy.h9
-rw-r--r--net/mdio-uclass.c22
2 files changed, 31 insertions, 0 deletions
diff --git a/include/miiphy.h b/include/miiphy.h
index 110921f..c66a184 100644
--- a/include/miiphy.h
+++ b/include/miiphy.h
@@ -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
diff --git a/net/mdio-uclass.c b/net/mdio-uclass.c
index 7593618..4401492 100644
--- a/net/mdio-uclass.c
+++ b/net/mdio-uclass.c
@@ -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)