[PATCH 2/3] phy: introduce eth_phy_get_node_and_addr()

Rasmus Villemoes rasmus.villemoes at prevas.dk
Thu May 12 09:33:08 CEST 2022


Callers often don't just need to know the address of the phy, but also
need to know its DT node so that a subsequent call of phy_config() can
fetch various DT attributes specific to the given phy. Currently,
phy_get_ofnode() usually incorrectly returns a pointer to the node for
the ethernet controller.

This was fixed for fec_mxc in commit 89b5bd54c1a4, but I'm now hitting
the exact same problem with the dwc_eth_qos driver.

I have a ti,dp83867 phy which requires ti,rx-internal-delay and
ti,tx-internal-delay to be specified, which I do, but the phy driver
fails to fetch the values because of the wrong phy_get_ofnode() value.

So generalize eth_phy_get_addr() a bit so that it also optionally
returns the ofnode where it found the reg value.

Follow-up patches will make use of this in dwc_eth_qos, and further
generalize it even further so it can be used from fec_mxc as
well (i.e., add the fixed-link support).

Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
---
 drivers/net/eth-phy-uclass.c | 9 ++++++++-
 include/eth_phy.h            | 1 +
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/net/eth-phy-uclass.c b/drivers/net/eth-phy-uclass.c
index 27b77444a0..05e1de8be9 100644
--- a/drivers/net/eth-phy-uclass.c
+++ b/drivers/net/eth-phy-uclass.c
@@ -109,7 +109,7 @@ struct mii_dev *eth_phy_get_mdio_bus(struct udevice *eth_dev)
 	return NULL;
 }
 
-int eth_phy_get_addr(struct udevice *dev)
+int eth_phy_get_node_and_addr(struct udevice *dev, ofnode *phy_node)
 {
 	struct ofnode_phandle_args phandle_args;
 	int reg;
@@ -121,10 +121,17 @@ int eth_phy_get_addr(struct udevice *dev)
 	}
 
 	reg = ofnode_read_u32_default(phandle_args.node, "reg", 0);
+	if (phy_node)
+		*phy_node = phandle_args.node;
 
 	return reg;
 }
 
+int eth_phy_get_addr(struct udevice *dev)
+{
+	return eth_phy_get_node_and_addr(dev, NULL);
+}
+
 /* parsing generic properties of devicetree/bindings/net/ethernet-phy.yaml */
 static int eth_phy_of_to_plat(struct udevice *dev)
 {
diff --git a/include/eth_phy.h b/include/eth_phy.h
index be6c881527..caf85c84a7 100644
--- a/include/eth_phy.h
+++ b/include/eth_phy.h
@@ -14,5 +14,6 @@ int eth_phy_binds_nodes(struct udevice *eth_dev);
 int eth_phy_set_mdio_bus(struct udevice *eth_dev, struct mii_dev *mdio_bus);
 struct mii_dev *eth_phy_get_mdio_bus(struct udevice *eth_dev);
 int eth_phy_get_addr(struct udevice *dev);
+int eth_phy_get_node_and_addr(struct udevice *dev, ofnode *phy_node);
 
 #endif
-- 
2.31.1



More information about the U-Boot mailing list