]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: typec: ucsi: glink: fix child node release in probe function
authorJavier Carrasco <javier.carrasco.cruz@gmail.com>
Thu, 13 Jun 2024 12:14:48 +0000 (14:14 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Jun 2024 17:36:29 +0000 (19:36 +0200)
The device_for_each_child_node() macro requires explicit calls to
fwnode_handle_put() in all early exits of the loop if the child node is
not required outside. Otherwise, the child node's refcount is not
decremented and the resource is not released.

The current implementation of pmic_glink_ucsi_probe() makes use of the
device_for_each_child_node(), but does not release the child node on
early returns. Add the missing calls to fwnode_handle_put().

Cc: stable@vger.kernel.org
Fixes: c6165ed2f425 ("usb: ucsi: glink: use the connector orientation GPIO to provide switch events")
Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20240613-ucsi-glink-release-node-v1-1-f7629a56f70a@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/ucsi/ucsi_glink.c

index 985a880e86da433f839cf528c36d8f50b1714ece..2fa973afe4e68bba24d895f748bbe5eed38f8278 100644 (file)
@@ -372,6 +372,7 @@ static int pmic_glink_ucsi_probe(struct auxiliary_device *adev,
                ret = fwnode_property_read_u32(fwnode, "reg", &port);
                if (ret < 0) {
                        dev_err(dev, "missing reg property of %pOFn\n", fwnode);
+                       fwnode_handle_put(fwnode);
                        return ret;
                }
 
@@ -386,9 +387,11 @@ static int pmic_glink_ucsi_probe(struct auxiliary_device *adev,
                if (!desc)
                        continue;
 
-               if (IS_ERR(desc))
+               if (IS_ERR(desc)) {
+                       fwnode_handle_put(fwnode);
                        return dev_err_probe(dev, PTR_ERR(desc),
                                             "unable to acquire orientation gpio\n");
+               }
                ucsi->port_orientation[port] = desc;
        }