]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: mdio: common handling of phy device reset properties
authorBuday Csaba <buday.csaba@prolan.hu>
Tue, 18 Nov 2025 13:58:53 +0000 (14:58 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 21 Nov 2025 01:41:39 +0000 (17:41 -0800)
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>
drivers/net/mdio/fwnode_mdio.c
drivers/net/phy/mdio-private.h
drivers/net/phy/mdio_bus.c
drivers/net/phy/mdio_device.c

index 9b41d4697a4052cfdc253758395a82f650e6a8a9..ba709151826540abce739ad17d7f450536d7cce8 100644 (file)
@@ -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
         */
index 44e2e090725321f4fec455d1cf229967444aa736..8bc6d9088af1df69a5574452726a11177a2c5615 100644 (file)
@@ -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 */
index 575b8bb5bb7a97346c7e0617446aa85a3d47d326..ef041ad66852dc6abf852ca7dd89d08919c1c435 100644 (file)
@@ -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;
 
index 0e04bddd3619145dc3e2b1a34f633d165acf7561..a4d9c6ccf8766283280c9344fd3b3f705cbc8cf5 100644 (file)
@@ -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;