Message ID | 20240927-leds_device_for_each_child_node_scoped-v1-6-95c0614b38c8@gmail.com |
---|---|
State | New |
Headers | show |
Series | leds: switch to device_for_each_child_node_scoped() | expand |
Fri, Sep 27, 2024 at 01:20:57AM +0200, Javier Carrasco kirjoitti: > Switch to device_for_each_child_node_scoped() to simplify the code by > removing the need for calls to fwnode_handle_put() in the error paths. > > This also prevents possible memory leaks if new error paths are added > without the required call to fwnode_handle_put(). > > After switching to the scoped variant, there is no longer need for a > jump to 'err_child_out', as an immediate return is possible. ... > if (ret) { > dev_err(priv->dev, "LED without ID number"); > - goto err_child_out; > + return ret; Now return dev_err_probe(...); > } > > if (led->reg > U8_MAX) { > dev_err(priv->dev, "LED value %d is invalid", led->reg); > - ret = -EINVAL; > - goto err_child_out; > + return -EINVAL; Ditto. > } > dev_err(priv->dev, > "failed to register LED device %s, err %d", > led->ldev.name, ret); > - goto err_child_out; > + return ret; Ditto. return dev_err_probe(priv->dev, ret, "failed to register LED device %s\n", led->ldev.name); ... Also notice missed '\n' at the end of the strings (and yes, I know that it's not a problem for dev_*() macros, but still...).
diff --git a/drivers/leds/leds-el15203000.c b/drivers/leds/leds-el15203000.c index d40194a3029f..e26d1654bd0d 100644 --- a/drivers/leds/leds-el15203000.c +++ b/drivers/leds/leds-el15203000.c @@ -237,22 +237,20 @@ static int el15203000_pattern_clear(struct led_classdev *ldev) static int el15203000_probe_dt(struct el15203000 *priv) { struct el15203000_led *led = priv->leds; - struct fwnode_handle *child; int ret; - device_for_each_child_node(priv->dev, child) { + device_for_each_child_node_scoped(priv->dev, child) { struct led_init_data init_data = {}; ret = fwnode_property_read_u32(child, "reg", &led->reg); if (ret) { dev_err(priv->dev, "LED without ID number"); - goto err_child_out; + return ret; } if (led->reg > U8_MAX) { dev_err(priv->dev, "LED value %d is invalid", led->reg); - ret = -EINVAL; - goto err_child_out; + return -EINVAL; } led->priv = priv; @@ -274,17 +272,13 @@ static int el15203000_probe_dt(struct el15203000 *priv) dev_err(priv->dev, "failed to register LED device %s, err %d", led->ldev.name, ret); - goto err_child_out; + return ret; } led++; } return 0; - -err_child_out: - fwnode_handle_put(child); - return ret; } static int el15203000_probe(struct spi_device *spi)
Switch to device_for_each_child_node_scoped() to simplify the code by removing the need for calls to fwnode_handle_put() in the error paths. This also prevents possible memory leaks if new error paths are added without the required call to fwnode_handle_put(). After switching to the scoped variant, there is no longer need for a jump to 'err_child_out', as an immediate return is possible. Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com> --- drivers/leds/leds-el15203000.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)