]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iio: light: ltr390: Add device powerdown functionality via devm api
authorAkshay Jindal <akshayaj.lkd@gmail.com>
Thu, 14 Aug 2025 03:45:43 +0000 (09:15 +0530)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 16 Aug 2025 12:56:54 +0000 (13:56 +0100)
Use devm_add_action_or_reset() to do cleanup when the device is removed.

Signed-off-by: Akshay Jindal <akshayaj.lkd@gmail.com>
Link: https://patch.msgid.link/20250814034544.93331-1-akshayaj.lkd@gmail.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/ltr390.c

index 7733830dca6706087c55d8099f41d585f19bcd09..2e1cf62e82012004fb70a1c3cd068e07c2421935 100644 (file)
@@ -680,6 +680,22 @@ static irqreturn_t ltr390_interrupt_handler(int irq, void *private)
        return IRQ_HANDLED;
 }
 
+static void ltr390_powerdown(void *priv)
+{
+       struct ltr390_data *data = priv;
+
+       guard(mutex)(&data->lock);
+
+       /* Ensure that power off and interrupts are disabled */
+       if (regmap_clear_bits(data->regmap, LTR390_INT_CFG,
+                               LTR390_LS_INT_EN) < 0)
+               dev_err(&data->client->dev, "failed to disable interrupts\n");
+
+       if (regmap_clear_bits(data->regmap, LTR390_MAIN_CTRL,
+                       LTR390_SENSOR_ENABLE) < 0)
+               dev_err(&data->client->dev, "failed to disable sensor\n");
+}
+
 static int ltr390_probe(struct i2c_client *client)
 {
        struct ltr390_data *data;
@@ -693,7 +709,6 @@ static int ltr390_probe(struct i2c_client *client)
                return -ENOMEM;
 
        data = iio_priv(indio_dev);
-
        data->regmap = devm_regmap_init_i2c(client, &ltr390_regmap_config);
        if (IS_ERR(data->regmap))
                return dev_err_probe(dev, PTR_ERR(data->regmap),
@@ -733,6 +748,10 @@ static int ltr390_probe(struct i2c_client *client)
        if (ret)
                return dev_err_probe(dev, ret, "failed to enable the sensor\n");
 
+       ret = devm_add_action_or_reset(dev, ltr390_powerdown, data);
+       if (ret)
+               return dev_err_probe(dev, ret, "failed to add action or reset\n");
+
        if (client->irq) {
                ret = devm_request_threaded_irq(dev, client->irq,
                                                NULL, ltr390_interrupt_handler,