power: supply: bq27xxx: Use devm to free device mutex
authorAndrew Davis <afd@ti.com>
Tue, 23 Jan 2024 15:09:12 +0000 (09:09 -0600)
committerSebastian Reichel <sebastian.reichel@collabora.com>
Fri, 26 Jan 2024 23:49:17 +0000 (00:49 +0100)
Use a device lifecycle managed action to free the device mutex.
This helps prevent mistakes like freeing out of order in cleanup
functions and forgetting to free on error paths.

Signed-off-by: Andrew Davis <afd@ti.com>
Link: https://lore.kernel.org/r/20240123150914.308510-3-afd@ti.com
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com>
drivers/power/supply/bq27xxx_battery.c

index 1c4a9d1377442ad98f4e3fcb3b1215bf3e49b20b..d3b6327b16b56dd9723bd06eea5cf47979d3b2ef 100644 (file)
@@ -2101,6 +2101,13 @@ static void bq27xxx_external_power_changed(struct power_supply *psy)
        mod_delayed_work(system_wq, &di->work, HZ / 2);
 }
 
+static void bq27xxx_battery_mutex_destroy(void *data)
+{
+       struct mutex *lock = data;
+
+       mutex_destroy(lock);
+}
+
 int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
 {
        struct power_supply_desc *psy_desc;
@@ -2108,9 +2115,14 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
                .of_node = di->dev->of_node,
                .drv_data = di,
        };
+       int ret;
 
        INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
        mutex_init(&di->lock);
+       ret = devm_add_action_or_reset(di->dev, bq27xxx_battery_mutex_destroy,
+                                      &di->lock);
+       if (ret)
+               return ret;
 
        di->regs       = bq27xxx_chip_data[di->chip].regs;
        di->unseal_key = bq27xxx_chip_data[di->chip].unseal_key;
@@ -2158,7 +2170,6 @@ void bq27xxx_battery_teardown(struct bq27xxx_device_info *di)
        cancel_delayed_work_sync(&di->work);
 
        power_supply_unregister(di->bat);
-       mutex_destroy(&di->lock);
 }
 EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown);