]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: tcs3472: use devm for resource management
authorAldo Conte <aldocontelk@gmail.com>
Fri, 22 May 2026 12:34:16 +0000 (14:34 +0200)
committerJonathan Cameron <jic23@kernel.org>
Sun, 31 May 2026 10:01:48 +0000 (11:01 +0100)
Convert the driver to use device-managed resource allocation:
- Add tcs3472_powerdown_action() and register it with
  devm_add_action_or_reset() to ensure the device is powered down on
  cleanup.
- Replace iio_triggered_buffer_setup() with
  devm_iio_triggered_buffer_setup().
- Replace request_threaded_irq() with devm_request_threaded_irq().
- Replace iio_device_register() with devm_iio_device_register().
- Replace mutex_init() with devm_mutex_init().
- Remove tcs3472_remove() as all cleanup is now handled by devm.

Use a local 'dev = &client->dev' in tcs3472_probe() to keep the devm
calls compact.

Signed-off-by: Aldo Conte <aldocontelk@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/light/tcs3472.c

index 36d3c106e70d260b5f71f7c725383160bc1a1cdd..b0e8d56615671e25e340f53b143edfcc476fec23 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/delay.h>
 #include <linux/i2c.h>
 #include <linux/module.h>
+#include <linux/mutex.h>
 #include <linux/pm.h>
 
 #include <linux/iio/buffer.h>
@@ -445,20 +446,28 @@ static int tcs3472_powerdown(struct tcs3472_data *data)
        return 0;
 }
 
+static void tcs3472_powerdown_action(void *data)
+{
+       tcs3472_powerdown(data);
+}
+
 static int tcs3472_probe(struct i2c_client *client)
 {
+       struct device *dev = &client->dev;
        struct tcs3472_data *data;
        struct iio_dev *indio_dev;
        int ret;
 
-       indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+       indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
        if (!indio_dev)
                return -ENOMEM;
 
        data = iio_priv(indio_dev);
        i2c_set_clientdata(client, indio_dev);
        data->client = client;
-       mutex_init(&data->lock);
+       ret = devm_mutex_init(dev, &data->lock);
+       if (ret)
+               return ret;
 
        indio_dev->info = &tcs3472_info;
        indio_dev->name = TCS3472_DRV_NAME;
@@ -515,46 +524,27 @@ static int tcs3472_probe(struct i2c_client *client)
        if (ret < 0)
                return ret;
 
-       ret = iio_triggered_buffer_setup(indio_dev, NULL,
-               tcs3472_trigger_handler, NULL);
+       ret = devm_add_action_or_reset(dev, tcs3472_powerdown_action, data);
+       if (ret)
+               return ret;
+
+       ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,
+                                             tcs3472_trigger_handler, NULL);
        if (ret < 0)
-               goto error_powerdown;
+               return ret;
 
        if (client->irq) {
-               ret = request_threaded_irq(client->irq, NULL,
-                                          tcs3472_event_handler,
-                                          IRQF_TRIGGER_FALLING | IRQF_SHARED |
-                                          IRQF_ONESHOT,
-                                          client->name, indio_dev);
+               ret = devm_request_threaded_irq(dev, client->irq, NULL,
+                                               tcs3472_event_handler,
+                                               IRQF_TRIGGER_FALLING |
+                                               IRQF_SHARED |
+                                               IRQF_ONESHOT,
+                                               client->name, indio_dev);
                if (ret)
-                       goto buffer_cleanup;
+                       return ret;
        }
 
-       ret = iio_device_register(indio_dev);
-       if (ret < 0)
-               goto free_irq;
-
-       return 0;
-
-free_irq:
-       if (client->irq)
-               free_irq(client->irq, indio_dev);
-buffer_cleanup:
-       iio_triggered_buffer_cleanup(indio_dev);
-error_powerdown:
-       tcs3472_powerdown(data);
-       return ret;
-}
-
-static void tcs3472_remove(struct i2c_client *client)
-{
-       struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-       iio_device_unregister(indio_dev);
-       if (client->irq)
-               free_irq(client->irq, indio_dev);
-       iio_triggered_buffer_cleanup(indio_dev);
-       tcs3472_powerdown(iio_priv(indio_dev));
+       return devm_iio_device_register(dev, indio_dev);
 }
 
 static int tcs3472_suspend(struct device *dev)
@@ -598,7 +588,6 @@ static struct i2c_driver tcs3472_driver = {
                .pm     = pm_sleep_ptr(&tcs3472_pm_ops),
        },
        .probe          = tcs3472_probe,
-       .remove         = tcs3472_remove,
        .id_table       = tcs3472_id,
 };
 module_i2c_driver(tcs3472_driver);