--- a/drivers/net/phy/mdio-boardinfo.c +++ b/drivers/net/phy/mdio-boardinfo.c @@ -15,8 +15,11 @@ #include "mdio-boardinfo.h" -static LIST_HEAD(mdio_board_list); -static DEFINE_MUTEX(mdio_board_lock); +LIST_HEAD(mdio_board_list); +EXPORT_SYMBOL_GPL(mdio_board_list); + +DEFINE_MUTEX(mdio_board_lock); +EXPORT_SYMBOL_GPL(mdio_board_lock); /** * mdiobus_setup_mdiodev_from_board_info - create and setup MDIO devices --- a/drivers/net/phy/mdio-boardinfo.h +++ b/drivers/net/phy/mdio-boardinfo.h @@ -20,4 +20,7 @@ void mdiobus_setup_mdiodev_from_board_in (struct mii_bus *bus, struct mdio_board_info *bi)); +extern struct mutex mdio_board_lock; +extern struct list_head mdio_board_list; + #endif /* __MDIO_BOARD_INFO_H */ --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -456,6 +456,17 @@ void mdiobus_free(struct mii_bus *bus) } EXPORT_SYMBOL(mdiobus_free); +static void mdiobus_setup_phydev_from_boardinfo(struct mii_bus *bus, + struct phy_device *phydev, + struct mdio_board_info *bi) +{ + if (strcmp(bus->id, bi->bus_id) || + bi->mdio_addr != phydev->mdio.addr) + return; + + phydev->mdio.dev.platform_data = (void *) bi->platform_data; +} + /** * mdiobus_scan - scan a bus for MDIO devices. * @bus: mii_bus to scan @@ -471,6 +482,7 @@ EXPORT_SYMBOL(mdiobus_free); struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) { struct phy_device *phydev; + struct mdio_board_entry *be; int err; phydev = get_phy_device(bus, addr, false); @@ -483,6 +495,12 @@ struct phy_device *mdiobus_scan(struct m */ of_mdiobus_link_mdiodev(bus, &phydev->mdio); + mutex_lock(&mdio_board_lock); + list_for_each_entry(be, &mdio_board_list, list) + mdiobus_setup_phydev_from_boardinfo(bus, phydev, + &be->board_info); + mutex_unlock(&mdio_board_lock); + err = phy_device_register(phydev); if (err) { phy_device_free(phydev);