]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
leds: lm3692x: Put fwnode in any case during ->probe()
authorAndy Shevchenko <andy.shevchenko@gmail.com>
Mon, 10 May 2021 09:50:35 +0000 (12:50 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 14 Jul 2021 14:53:41 +0000 (16:53 +0200)
[ Upstream commit f55db1c7fadc2a29c9fa4ff3aec98dbb111f2206 ]

device_get_next_child_node() bumps a reference counting of a returned variable.
We have to balance it whenever we return to the caller.

Fixes: 9a5c1c64ac0a ("leds: lm3692x: Change DT calls to fwnode calls")
Cc: Dan Murphy <dmurphy@ti.com>
Signed-off-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Pavel Machek <pavel@ucw.cz>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/leds/leds-lm3692x.c

index 1ac9a44570eedd01d7722d711054ccfedb4e5301..cc77ea048d9bedb27d990718dcc063120cbb8e49 100644 (file)
@@ -358,6 +358,7 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
 
        ret = fwnode_property_read_u32(child, "reg", &led->led_enable);
        if (ret) {
+               fwnode_handle_put(child);
                dev_err(&led->client->dev, "reg DT property missing\n");
                return ret;
        }
@@ -368,12 +369,11 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
 
        ret = devm_led_classdev_register_ext(&led->client->dev, &led->led_dev,
                                             &init_data);
-       if (ret) {
+       if (ret)
                dev_err(&led->client->dev, "led register err: %d\n", ret);
-               return ret;
-       }
 
-       return 0;
+       fwnode_handle_put(init_data.fwnode);
+       return ret;
 }
 
 static int lm3692x_probe(struct i2c_client *client,