lede/target/linux/generic/hack-4.14/710-phy-add-mdio_register_board_info.patch
2018-06-13 10:39:07 +08:00

81 lines
2.3 KiB
Diff

--- a/drivers/net/phy/mdio-boardinfo.c
+++ b/drivers/net/phy/mdio-boardinfo.c
@@ -15,8 +15,10 @@
#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
@@ -15,6 +15,12 @@ struct mdio_board_entry {
struct mdio_board_info board_info;
};
+/* mdio_board_lock protects mdio_board_list
+ * only mdio_bus components are allowed to use these symbols.
+ */
+extern struct mutex mdio_board_lock;
+extern struct list_head mdio_board_list;
+
void mdiobus_setup_mdiodev_from_board_info(struct mii_bus *bus,
int (*cb)
(struct mii_bus *bus,
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -88,6 +88,8 @@ bool mdiobus_is_registered_device(struct mii_bus *bus, int addr)
}
EXPORT_SYMBOL(mdiobus_is_registered_device);
+#include "mdio-boardinfo.h"
+
/**
* mdiobus_alloc_size - allocate a mii_bus structure
* @size: extra amount of memory to allocate for private storage.
@@ -455,6 +457,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 +483,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 +496,12 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
*/
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);