[PATCH 2/6] net: phy: add of_phy_device_connect

Sebastian Hesselbarth sebastian.hesselbarth at gmail.com
Wed Feb 5 17:40:05 EST 2014


This implements a of_phy_device_connect to allow DT enabled drivers
to connect to a PHY device by using the PHY's DT node only. It
currently assumes that each PHY node is a child of the corresponding
mdio bus.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth at gmail.com>
---
I haven't looked closely at the Linux fixed-phy discussion, so the
actual implementation might have to change for PHYs without mdio parent
bus. Anyway, for now it is sufficient to only support mdio bus attached
PHYs.

Cc: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
Cc: Michael Grzeschik <mgr at pengutronix.de>
Cc: barebox at lists.infradead.org
---
 drivers/net/phy/phy.c | 31 +++++++++++++++++++++++++++++++
 include/linux/phy.h   | 14 ++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index faa5c26c227d..879939d4a2f0 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -331,6 +331,37 @@ fail:
 	return ret;
 }
 
+#if defined(CONFIG_OFTREE)
+int of_phy_device_connect(struct eth_device *edev, struct device_node *phy_np,
+			  void (*adjust_link) (struct eth_device *edev),
+			  u32 flags, phy_interface_t interface)
+{
+	struct device_node *bus_np;
+	struct mii_bus *miibus;
+	int phy_addr = -ENODEV;
+
+	if (!phy_np)
+		return -EINVAL;
+
+	of_property_read_u32(phy_np, "reg", &phy_addr);
+
+	bus_np = of_get_parent(phy_np);
+	if (!bus_np)
+		return -ENODEV;
+
+	for_each_mii_bus(miibus) {
+		if (miibus->parent && miibus->parent->device_node == bus_np)
+			return phy_device_connect(edev, miibus, phy_addr,
+					  adjust_link, flags, interface);
+	}
+
+	dev_err(&edev->dev, "unable to mdio bus for phy %s\n",
+		phy_np->full_name);
+
+	return -ENODEV;
+}
+#endif
+
 /* Generic PHY support and helper functions */
 
 /**
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 9994e1107de5..76375f06f41f 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -280,6 +280,20 @@ int phy_device_connect(struct eth_device *dev, struct mii_bus *bus, int addr,
 		       void (*adjust_link) (struct eth_device *edev),
 		       u32 flags, phy_interface_t interface);
 
+#if defined(CONFIG_OFTREE)
+int of_phy_device_connect(struct eth_device *edev, struct device_node *phy_np,
+			  void (*adjust_link) (struct eth_device *edev),
+			  u32 flags, phy_interface_t interface);
+#else
+static inline int of_phy_device_connect(struct eth_device *edev,
+				struct device_node *phy_np,
+				void (*adjust_link) (struct eth_device *edev),
+				u32 flags, phy_interface_t interface)
+{
+	return -ENOSYS;
+}
+#endif
+
 int phy_update_status(struct phy_device *phydev);
 int phy_wait_aneg_done(struct phy_device *phydev);
 
-- 
1.8.5.3




More information about the barebox mailing list