From: Buday Csaba Date: Tue, 18 Nov 2025 13:58:53 +0000 (+0100) Subject: net: mdio: common handling of phy device reset properties X-Git-Tag: v6.19-rc1~170^2~111^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=acde7ad968f6c536397b39b23e4c70dc466fbc59;p=thirdparty%2Fkernel%2Flinux.git net: mdio: common handling of phy device reset properties 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 Link: https://patch.msgid.link/17c216efd7a47be17db104378b6aacfc8741d8b9.1763473655.git.buday.csaba@prolan.hu Signed-off-by: Jakub Kicinski --- diff --git a/drivers/net/mdio/fwnode_mdio.c b/drivers/net/mdio/fwnode_mdio.c index 9b41d4697a405..ba70915182654 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 44e2e09072532..8bc6d9088af1d 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 575b8bb5bb7a9..ef041ad66852d 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 0e04bddd36191..a4d9c6ccf8766 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;