[PATCH net-next v3 2/3] net: mdio: common handling of phy device reset properties
From: Buday Csaba <hidden>
Date: 2025-11-18 13:59:06
Also in:
lkml
Subsystem:
ethernet phy library, networking drivers, the rest · Maintainers:
Andrew Lunn, Heiner Kallweit, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Unify the handling of the per device reset properties for `mdio_device`. Merge mdio_device_register_gpiod() and mdio_device_register_reset() into mdio_device_register_reset(), that handles both reset-controllers and reset-gpios. Move reading of the reset firmware properties (reset-assert-us, reset-deassert-us) from fwnode_mdio.c to mdio_device_register_reset(), so all reset related initialization code is kept in one place. Introduce mdio_device_unregister_reset() to release the associated resources. These changes make tracking the reset properties easier. Added kernel-doc for mdio_device_register/unregister_reset(). Signed-off-by: Buday Csaba <redacted> --- V2 -> V3: moved declarations to drivers/net/phy/mdio-private.h V1 -> V2: rebase, no change (leak fix already applied to base) --- drivers/net/mdio/fwnode_mdio.c | 5 ----- drivers/net/phy/mdio-private.h | 2 +- drivers/net/phy/mdio_bus.c | 12 ++-------- drivers/net/phy/mdio_device.c | 40 ++++++++++++++++++++++++++-------- 4 files changed, 34 insertions(+), 25 deletions(-)
diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c
index 9b41d4697..ba7091518 100644
--- a/drivers/net/mdio/fwnode_mdio.c
+++ b/drivers/net/mdio/fwnode_mdio.c@@ -92,11 +92,6 @@ int fwnode_mdiobus_phy_device_register(struct mii_bus *mdio, if (fwnode_property_read_bool(child, "broken-turn-around")) mdio->phy_ignore_ta_mask |= 1 << addr; - fwnode_property_read_u32(child, "reset-assert-us", - &phy->mdio.reset_assert_delay); - fwnode_property_read_u32(child, "reset-deassert-us", - &phy->mdio.reset_deassert_delay); - /* Associate the fwnode with the device structure so it * can be looked up later */
diff --git a/drivers/net/phy/mdio-private.h b/drivers/net/phy/mdio-private.h
index 44e2e0907..8bc6d9088 100644
--- a/drivers/net/phy/mdio-private.h
+++ b/drivers/net/phy/mdio-private.h@@ -6,6 +6,6 @@ */ int mdio_device_register_reset(struct mdio_device *mdiodev); -int mdio_device_register_gpiod(struct mdio_device *mdiodev); +void mdio_device_unregister_reset(struct mdio_device *mdiodev); #endif /* __MDIO_PRIVATE_H */
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 575b8bb5b..ef041ad66 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c@@ -42,16 +42,9 @@ int mdiobus_register_device(struct mdio_device *mdiodev) return -EBUSY; if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) { - err = mdio_device_register_gpiod(mdiodev); - if (err) - return err; - err = mdio_device_register_reset(mdiodev); - if (err) { - gpiod_put(mdiodev->reset_gpio); - mdiodev->reset_gpio = NULL; + if (err) return err; - } /* Assert the reset signal */ mdio_device_reset(mdiodev, 1);
@@ -68,8 +61,7 @@ int mdiobus_unregister_device(struct mdio_device *mdiodev) if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev) return -EINVAL; - gpiod_put(mdiodev->reset_gpio); - reset_control_put(mdiodev->reset_ctrl); + mdio_device_unregister_reset(mdiodev); mdiodev->bus->mdio_map[mdiodev->addr] = NULL;
diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c
index 0e04bddd3..a4d9c6ccf 100644
--- a/drivers/net/phy/mdio_device.c
+++ b/drivers/net/phy/mdio_device.c@@ -119,8 +119,17 @@ void mdio_device_remove(struct mdio_device *mdiodev) } EXPORT_SYMBOL(mdio_device_remove); -int mdio_device_register_gpiod(struct mdio_device *mdiodev) +/** + * mdio_device_register_reset - Read and initialize the reset properties of + * an mdio device + * @mdiodev: mdio_device structure + * + * Return: Zero if successful, negative error code on failure + */ +int mdio_device_register_reset(struct mdio_device *mdiodev) { + struct reset_control *reset; + /* Deassert the optional reset signal */ mdiodev->reset_gpio = gpiod_get_optional(&mdiodev->dev, "reset", GPIOD_OUT_LOW);
@@ -130,22 +139,35 @@ int mdio_device_register_gpiod(struct mdio_device *mdiodev) if (mdiodev->reset_gpio) gpiod_set_consumer_name(mdiodev->reset_gpio, "PHY reset"); - return 0; -} - -int mdio_device_register_reset(struct mdio_device *mdiodev) -{ - struct reset_control *reset; - reset = reset_control_get_optional_exclusive(&mdiodev->dev, "phy"); - if (IS_ERR(reset)) + if (IS_ERR(reset)) { + gpiod_put(mdiodev->reset_gpio); + mdiodev->reset_gpio = NULL; return PTR_ERR(reset); + } mdiodev->reset_ctrl = reset; + /* Read optional firmware properties */ + fwnode_property_read_u32(dev_fwnode(&mdiodev->dev), "reset-assert-us", + &mdiodev->reset_assert_delay); + fwnode_property_read_u32(dev_fwnode(&mdiodev->dev), "reset-deassert-us", + &mdiodev->reset_deassert_delay); + return 0; } +/** + * mdio_device_unregister_reset - uninitialize the reset properties of + * an mdio device + * @mdiodev: mdio_device structure + */ +void mdio_device_unregister_reset(struct mdio_device *mdiodev) +{ + gpiod_put(mdiodev->reset_gpio); + reset_control_put(mdiodev->reset_ctrl); +} + void mdio_device_reset(struct mdio_device *mdiodev, int value) { unsigned int d;
--
2.39.5