|
@@ -183,6 +183,39 @@ int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np)
|
|
|
}
|
|
|
EXPORT_SYMBOL(of_mdiobus_register);
|
|
|
|
|
|
+/**
|
|
|
+ * of_mdiobus_link_phydev - Find a device node for a phy
|
|
|
+ * @mdio: pointer to mii_bus structure
|
|
|
+ * @phydev: phydev for which the of_node pointer should be set
|
|
|
+ *
|
|
|
+ * Walk the list of subnodes of a mdio bus and look for a node that matches the
|
|
|
+ * phy's address with its 'reg' property. If found, set the of_node pointer for
|
|
|
+ * the phy. This allows auto-probed pyh devices to be supplied with information
|
|
|
+ * passed in via DT.
|
|
|
+ */
|
|
|
+void of_mdiobus_link_phydev(struct mii_bus *mdio,
|
|
|
+ struct phy_device *phydev)
|
|
|
+{
|
|
|
+ struct device *dev = &phydev->dev;
|
|
|
+ struct device_node *child;
|
|
|
+
|
|
|
+ if (dev->of_node || !mdio->dev.of_node)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for_each_available_child_of_node(mdio->dev.of_node, child) {
|
|
|
+ int addr;
|
|
|
+
|
|
|
+ addr = of_mdio_parse_addr(&mdio->dev, child);
|
|
|
+ if (addr < 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (addr == phydev->addr) {
|
|
|
+ dev->of_node = child;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/* Helper function for of_phy_find_device */
|
|
|
static int of_phy_match(struct device *dev, void *phy_np)
|
|
|
{
|