[U-Boot] [PATCH v4 3/5] net: mdio-uclass: Add helper functions for scanning the MDIO bus
Alex Marginean
alexandru.marginean at nxp.com
Thu Nov 14 15:04:45 UTC 2019
The patch introduces dm_mdio_phy_scan which is a DM wrapper over
phy_find_by_mask. It also updates dm_eth_phy_connect to scan a MDIO bus
for PHYs if the ethernet node contains a mdio-handle property.
Signed-off-by: Alex Marginean <alexandru.marginean at nxp.com>
---
include/miiphy.h | 14 ++++++++++++
net/mdio-uclass.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
diff --git a/include/miiphy.h b/include/miiphy.h
index e591d93416..a5bdc29a47 100644
--- a/include/miiphy.h
+++ b/include/miiphy.h
@@ -165,6 +165,20 @@ struct phy_device *dm_mdio_phy_connect(struct udevice *mdiodev, int phyaddr,
struct udevice *ethdev,
phy_interface_t interface);
+/**
+ * dm_mdio_phy_scan - Scan for a PHY on the given MDIO bus
+ *
+ * @mdiodev: mdio device to scan
+ * @ethdev: ethernet device to connect to the PHY
+ * @interface: MAC-PHY protocol
+ * @addrmask: bitmask of PHY addresses to scan, use all Fs to scan all addresses
+ *
+ * @return pointer to phy_device, or 0 on error
+ */
+struct phy_device *dm_mdio_phy_scan(struct udevice *mdiodev,
+ struct udevice *ethdev,
+ phy_interface_t interface, uint addrmask);
+
/**
* dm_eth_phy_connect - Connect an Eth device to a PHY based on device tree
*
diff --git a/net/mdio-uclass.c b/net/mdio-uclass.c
index cf736a3ae5..9ca462edb2 100644
--- a/net/mdio-uclass.c
+++ b/net/mdio-uclass.c
@@ -116,6 +116,24 @@ struct phy_device *dm_mdio_phy_connect(struct udevice *mdiodev, int phyaddr,
return phy_connect(pdata->mii_bus, phyaddr, ethdev, interface);
}
+struct phy_device *dm_mdio_phy_scan(struct udevice *mdiodev,
+ struct udevice *ethdev,
+ phy_interface_t interface, uint addrmask)
+{
+ struct mdio_perdev_priv *pdata;
+ struct phy_device *phy;
+
+ pdata = dev_get_uclass_priv(mdiodev);
+
+ phy = phy_find_by_mask(pdata->mii_bus, addrmask, interface);
+ if (phy)
+ phy_connect_dev(phy, ethdev);
+ else
+ dev_dbg(mdiodev, "no PHY detected on bus\n");
+
+ return phy;
+}
+
static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev,
phy_interface_t interface)
{
@@ -156,6 +174,34 @@ static struct phy_device *dm_eth_connect_phy_handle(struct udevice *ethdev,
return phy;
}
+static struct phy_device *dm_eth_connect_mdio_handle(struct udevice *ethdev,
+ phy_interface_t interface)
+{
+ u32 mdio_phandle;
+ ofnode mdio_node;
+ struct udevice *mdiodev;
+ uint mask = 0xffffffff;
+
+ if (ofnode_read_u32(ethdev->node, "mdio-handle", &mdio_phandle)) {
+ dev_dbg(ethdev, "mdio-handle missing in ethernet node\n");
+ return NULL;
+ }
+
+ mdio_node = ofnode_get_by_phandle(mdio_phandle);
+ if (!ofnode_valid(mdio_node)) {
+ dev_dbg(dev, "invalid mdio node\n");
+ return NULL;
+ }
+
+ if (uclass_get_device_by_ofnode(UCLASS_MDIO, mdio_node, &mdiodev)) {
+ dev_dbg(ethdev, "can't find MDIO bus for node %s\n",
+ ofnode_get_name(mdio_node));
+ return NULL;
+ }
+
+ return dm_mdio_phy_scan(mdiodev, ethdev, interface, mask);
+}
+
/* Connect to a PHY linked in eth DT node */
struct phy_device *dm_eth_phy_connect(struct udevice *ethdev)
{
@@ -178,8 +224,19 @@ struct phy_device *dm_eth_phy_connect(struct udevice *ethdev)
if (interface == PHY_INTERFACE_MODE_NONE)
dev_dbg(ethdev, "can't find interface mode, default to NONE\n");
+ /*
+ * The sequence is:
+ * - if there is a phy-handle property, follow that,
+ * - if there is a mdio-handle property, follow that and scan for the
+ * PHY,
+ * - if the above came out empty, return NULL.
+ */
+
phy = dm_eth_connect_phy_handle(ethdev, interface);
+ if (!phy)
+ phy = dm_eth_connect_mdio_handle(ethdev, interface);
+
if (!phy)
return NULL;
--
2.17.1
More information about the U-Boot
mailing list