diff options
Diffstat (limited to 'target')
-rw-r--r-- | target/linux/ar71xx/patches-4.14/950-add-boardinfo-platform-data.patch | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/target/linux/ar71xx/patches-4.14/950-add-boardinfo-platform-data.patch b/target/linux/ar71xx/patches-4.14/950-add-boardinfo-platform-data.patch new file mode 100644 index 0000000000..edeac838d9 --- /dev/null +++ b/target/linux/ar71xx/patches-4.14/950-add-boardinfo-platform-data.patch @@ -0,0 +1,67 @@ +--- 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 +@@ -455,6 +455,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 +@@ -470,6 +481,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); +@@ -482,6 +494,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); |