mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	net: of_mdio: add of_mdiobus_link_phydev()
Add a function to 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 augmented by information passed in via DT. Signed-off-by: Daniel Mack <zonque@gmail.com> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									8f8382888c
								
							
						
					
					
						commit
						86f6cf4127
					
				| @ -300,6 +300,12 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) | ||||
| 	if (IS_ERR(phydev) || phydev == NULL) | ||||
| 		return phydev; | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * For DT, see if the auto-probed phy has a correspoding child | ||||
| 	 * in the bus node, and set the of_node pointer in this case. | ||||
| 	 */ | ||||
| 	of_mdiobus_link_phydev(bus, phydev); | ||||
| 
 | ||||
| 	err = phy_device_register(phydev); | ||||
| 	if (err) { | ||||
| 		phy_device_free(phydev); | ||||
|  | ||||
| @ -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) | ||||
| { | ||||
|  | ||||
| @ -25,6 +25,9 @@ struct phy_device *of_phy_attach(struct net_device *dev, | ||||
| 
 | ||||
| extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); | ||||
| 
 | ||||
| extern void of_mdiobus_link_phydev(struct mii_bus *mdio, | ||||
| 				   struct phy_device *phydev); | ||||
| 
 | ||||
| #else /* CONFIG_OF */ | ||||
| static inline int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | ||||
| { | ||||
| @ -60,6 +63,11 @@ static inline struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np) | ||||
| { | ||||
| 	return NULL; | ||||
| } | ||||
| 
 | ||||
| static inline void of_mdiobus_link_phydev(struct mii_bus *mdio, | ||||
| 					  struct phy_device *phydev) | ||||
| { | ||||
| } | ||||
| #endif /* CONFIG_OF */ | ||||
| 
 | ||||
| #if defined(CONFIG_OF) && defined(CONFIG_FIXED_PHY) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Mack
						Daniel Mack