Add the notifier for the change of mdio bus, since i wanna that a char device represents a mii_bus not a mdio_device.
Signed-off-by: Wei Li <liwei1...@163.com> --- drivers/net/phy/mdio_bus.c | 21 ++++++++++++++++++++- include/linux/mdio.h | 1 + include/linux/phy.h | 2 ++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 24b5511..3821dc8 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -240,10 +240,25 @@ static void mdiobus_release(struct device *d) kfree(bus); } -static struct class mdio_bus_class = { +struct class mdio_bus_class = { .name = "mdio_bus", .dev_release = mdiobus_release, }; +EXPORT_SYMBOL_GPL(mdio_bus_class); + +static BLOCKING_NOTIFIER_HEAD(mdio_bus_notifier_list); + +int mdiobus_register_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register( + &mdio_bus_notifier_list, nb); +} + +int mdiobus_unregister_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister( + &mdio_bus_notifier_list, nb); +} #if IS_ENABLED(CONFIG_OF_MDIO) /* Helper function for of_mdio_find_bus */ @@ -418,6 +433,8 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner) mdiobus_setup_mdiodev_from_board_info(bus, mdiobus_create_device); bus->state = MDIOBUS_REGISTERED; + blocking_notifier_call_chain(&mdio_bus_notifier_list, + BUS_NOTIFY_ADD_DEVICE, &bus->dev); pr_info("%s: probed\n", bus->name); return 0; @@ -446,6 +463,8 @@ void mdiobus_unregister(struct mii_bus *bus) int i; BUG_ON(bus->state != MDIOBUS_REGISTERED); + blocking_notifier_call_chain(&mdio_bus_notifier_list, + BUS_NOTIFY_DEL_DEVICE, &bus->dev); bus->state = MDIOBUS_UNREGISTERED; for (i = 0; i < PHY_MAX_ADDR; i++) { diff --git a/include/linux/mdio.h b/include/linux/mdio.h index 2cfffe5..29ab455 100644 --- a/include/linux/mdio.h +++ b/include/linux/mdio.h @@ -79,6 +79,7 @@ void mdio_device_reset(struct mdio_device *mdiodev, int value); int mdio_driver_register(struct mdio_driver *drv); void mdio_driver_unregister(struct mdio_driver *drv); int mdio_device_bus_match(struct device *dev, struct device_driver *drv); +extern struct class mdio_bus_class; static inline bool mdio_phy_id_is_c45(int phy_id) { diff --git a/include/linux/phy.h b/include/linux/phy.h index f0b5870..39f2609 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -246,6 +246,8 @@ int __mdiobus_register(struct mii_bus *bus, struct module *owner); #define mdiobus_register(bus) __mdiobus_register(bus, THIS_MODULE) void mdiobus_unregister(struct mii_bus *bus); void mdiobus_free(struct mii_bus *bus); +int mdiobus_register_notifier(struct notifier_block *nb); +int mdiobus_unregister_notifier(struct notifier_block *nb); struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv); static inline struct mii_bus *devm_mdiobus_alloc(struct device *dev) { -- 2.1.4