Refreshed all patches. Compile-tested on: ar71xx, cns3xxx, imx6, x86_64 Runtime-tested on: ar71xx, cns3xxx, imx6, x86_64 Signed-off-by: Koen Vandeputte <koen.vandeputte@ncentric.com>
		
			
				
	
	
		
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- 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);
 |