]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: chemical: sps30: Replace manual locking with RAII locking
authorMaxwell Doose <m32285159@gmail.com>
Sat, 23 May 2026 18:15:36 +0000 (13:15 -0500)
committerJonathan Cameron <jic23@kernel.org>
Sun, 31 May 2026 10:01:48 +0000 (11:01 +0100)
Replace manual mutex_lock() and mutex_unlock() calls with the much newer
guard(mutex)() macro to enable RAII patterns, modernize the driver, and
to increase readability.

Move mutex locking into sps30_do_meas() and tune it up to use guard()(),
as every caller takes the lock anyways.

Signed-off-by: Maxwell Doose <m32285159@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/chemical/sps30.c

index a934bf0298dd5837223da8a90adea72a75548c35..8e15baa314230edc89a835218a0471e8ea563afd 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (c) Tomasz Duszynski <tduszyns@gmail.com>
  */
 
+#include <linux/cleanup.h>
 #include <linux/crc8.h>
 #include <linux/delay.h>
 #include <linux/i2c.h>
@@ -69,6 +70,8 @@ static int sps30_do_meas(struct sps30_state *state, s32 *data, int size)
 {
        int i, ret;
 
+       guard(mutex)(&state->lock);
+
        if (state->state == RESET) {
                ret = state->ops->start_meas(state);
                if (ret)
@@ -111,9 +114,7 @@ static irqreturn_t sps30_trigger_handler(int irq, void *p)
                aligned_s64 ts;
        } scan;
 
-       mutex_lock(&state->lock);
        ret = sps30_do_meas(state, scan.data, ARRAY_SIZE(scan.data));
-       mutex_unlock(&state->lock);
        if (ret)
                goto err;
 
@@ -136,7 +137,6 @@ static int sps30_read_raw(struct iio_dev *indio_dev,
        case IIO_CHAN_INFO_PROCESSED:
                switch (chan->type) {
                case IIO_MASSCONCENTRATION:
-                       mutex_lock(&state->lock);
                        /* read up to the number of bytes actually needed */
                        switch (chan->channel2) {
                        case IIO_MOD_PM1:
@@ -152,7 +152,6 @@ static int sps30_read_raw(struct iio_dev *indio_dev,
                                ret = sps30_do_meas(state, data, 4);
                                break;
                        }
-                       mutex_unlock(&state->lock);
                        if (ret)
                                return ret;
 
@@ -197,9 +196,9 @@ static ssize_t start_cleaning_store(struct device *dev,
        if (kstrtoint(buf, 0, &val) || val != 1)
                return -EINVAL;
 
-       mutex_lock(&state->lock);
+       guard(mutex)(&state->lock);
+
        ret = state->ops->clean_fan(state);
-       mutex_unlock(&state->lock);
        if (ret)
                return ret;
 
@@ -215,9 +214,9 @@ static ssize_t cleaning_period_show(struct device *dev,
        __be32 val;
        int ret;
 
-       mutex_lock(&state->lock);
+       guard(mutex)(&state->lock);
+
        ret = state->ops->read_cleaning_period(state, &val);
-       mutex_unlock(&state->lock);
        if (ret)
                return ret;
 
@@ -238,12 +237,11 @@ static ssize_t cleaning_period_store(struct device *dev, struct device_attribute
            (val > SPS30_AUTO_CLEANING_PERIOD_MAX))
                return -EINVAL;
 
-       mutex_lock(&state->lock);
+       guard(mutex)(&state->lock);
+
        ret = state->ops->write_cleaning_period(state, cpu_to_be32(val));
-       if (ret) {
-               mutex_unlock(&state->lock);
+       if (ret)
                return ret;
-       }
 
        msleep(20);
 
@@ -256,8 +254,6 @@ static ssize_t cleaning_period_store(struct device *dev, struct device_attribute
                dev_warn(dev,
                         "period changed but reads will return the old value\n");
 
-       mutex_unlock(&state->lock);
-
        return len;
 }