diff options
| author | Buday Csaba <buday.csaba@prolan.hu> | 2025-11-18 14:58:53 +0100 |
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-11-20 17:41:39 -0800 |
| commit | acde7ad968f6c536397b39b23e4c70dc466fbc59 (patch) | |
| tree | 71526a0edf64a8b2430c2342acc9e1bd4cf40931 /drivers/net/phy/mdio_device.c | |
| parent | 02aeff20e8f5ab5f7ebc64858239787d420d73c4 (diff) | |
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 <buday.csaba@prolan.hu>
Link: https://patch.msgid.link/17c216efd7a47be17db104378b6aacfc8741d8b9.1763473655.git.buday.csaba@prolan.hu
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/phy/mdio_device.c')
| -rw-r--r-- | drivers/net/phy/mdio_device.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/net/phy/mdio_device.c b/drivers/net/phy/mdio_device.c index 0e04bddd3619..a4d9c6ccf876 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; |