leds: lp3952: Use devm API to cleanup module's resources
authorGeorge Stark <gnstark@salutedevices.com>
Thu, 11 Apr 2024 16:10:28 +0000 (19:10 +0300)
committerLee Jones <lee@kernel.org>
Thu, 11 Apr 2024 16:35:03 +0000 (17:35 +0100)
In this driver LEDs are registered using devm_led_classdev_register()
so they are automatically unregistered after module's remove() is done.
led_classdev_unregister() calls module's led_set_brightness() to turn off
the LEDs and that callback uses resources which were destroyed already
in module's remove() so use devm API instead of remove().
Also drop explicit turning LEDs off from remove() due to they will be off
anyway by led_classdev_unregister().

Signed-off-by: George Stark <gnstark@salutedevices.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20240411161032.609544-5-gnstark@salutedevices.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/leds/leds-lp3952.c

index 5d18bbfd1f2318db2f64326aa3e0207ec371ae5d..ff7bae2447dd1b65f3c92a9ec8a53b4d2c8b60e9 100644 (file)
@@ -207,6 +207,13 @@ static const struct regmap_config lp3952_regmap = {
        .cache_type = REGCACHE_MAPLE,
 };
 
+static void gpio_set_low_action(void *data)
+{
+       struct lp3952_led_array *priv = data;
+
+       gpiod_set_value(priv->enable_gpio, 0);
+}
+
 static int lp3952_probe(struct i2c_client *client)
 {
        int status;
@@ -226,6 +233,10 @@ static int lp3952_probe(struct i2c_client *client)
                return status;
        }
 
+       status = devm_add_action(&client->dev, gpio_set_low_action, priv);
+       if (status)
+               return status;
+
        priv->regmap = devm_regmap_init_i2c(client, &lp3952_regmap);
        if (IS_ERR(priv->regmap)) {
                int err = PTR_ERR(priv->regmap);
@@ -254,15 +265,6 @@ static int lp3952_probe(struct i2c_client *client)
        return 0;
 }
 
-static void lp3952_remove(struct i2c_client *client)
-{
-       struct lp3952_led_array *priv;
-
-       priv = i2c_get_clientdata(client);
-       lp3952_on_off(priv, LP3952_LED_ALL, false);
-       gpiod_set_value(priv->enable_gpio, 0);
-}
-
 static const struct i2c_device_id lp3952_id[] = {
        {LP3952_NAME, 0},
        {}
@@ -274,7 +276,6 @@ static struct i2c_driver lp3952_i2c_driver = {
                        .name = LP3952_NAME,
        },
        .probe = lp3952_probe,
-       .remove = lp3952_remove,
        .id_table = lp3952_id,
 };