power: supply: sbs-charger: Don't cancel work that is not initialized
authorChristophe JAILLET <christophe.jaillet@wanadoo.fr>
Sun, 13 Feb 2022 17:07:03 +0000 (18:07 +0100)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Thu, 24 Feb 2022 11:16:21 +0000 (12:16 +0100)
This driver can use an interrupt or polling in order get the charger's
status.

When using polling, a delayed work is used.

However, the remove() function unconditionally call
cancel_delayed_work_sync(), even if the delayed work is not used and is not
initialized.

In order to fix it, use devm_delayed_work_autocancel() and remove the now
useless remove() function.

Fixes: feb583e37f8a ("power: supply: add sbs-charger driver")
Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/sbs-charger.c

index 6fa65d1..b08f7d0 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/interrupt.h>
 #include <linux/regmap.h>
 #include <linux/bitops.h>
+#include <linux/devm-helpers.h>
 
 #define SBS_CHARGER_REG_SPEC_INFO              0x11
 #define SBS_CHARGER_REG_STATUS                 0x13
@@ -209,7 +210,12 @@ static int sbs_probe(struct i2c_client *client,
                if (ret)
                        return dev_err_probe(&client->dev, ret, "Failed to request irq\n");
        } else {
-               INIT_DELAYED_WORK(&chip->work, sbs_delayed_work);
+               ret = devm_delayed_work_autocancel(&client->dev, &chip->work,
+                                                  sbs_delayed_work);
+               if (ret)
+                       return dev_err_probe(&client->dev, ret,
+                                            "Failed to init work for polling\n");
+
                schedule_delayed_work(&chip->work,
                                      msecs_to_jiffies(SBS_CHARGER_POLL_TIME));
        }
@@ -220,15 +226,6 @@ static int sbs_probe(struct i2c_client *client,
        return 0;
 }
 
-static int sbs_remove(struct i2c_client *client)
-{
-       struct sbs_info *chip = i2c_get_clientdata(client);
-
-       cancel_delayed_work_sync(&chip->work);
-
-       return 0;
-}
-
 #ifdef CONFIG_OF
 static const struct of_device_id sbs_dt_ids[] = {
        { .compatible = "sbs,sbs-charger" },
@@ -245,7 +242,6 @@ MODULE_DEVICE_TABLE(i2c, sbs_id);
 
 static struct i2c_driver sbs_driver = {
        .probe          = sbs_probe,
-       .remove         = sbs_remove,
        .id_table       = sbs_id,
        .driver = {
                .name   = "sbs-charger",