iio: light: rpr0521: Factor out handling of IIO_INFO_RAW and use guard()
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 9 Mar 2025 17:06:26 +0000 (17:06 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Tue, 22 Apr 2025 18:09:56 +0000 (19:09 +0100)
Factor out the code which is only called with the direct mode claimed.
This and the use of guard(mutex) allows direct returns simplifying
code flow.

Reviewed-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250309170633.1347476-12-jic23@kernel.org
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/light/rpr0521.c

index 2ba917c..65c60a1 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <linux/module.h>
 #include <linux/mod_devicetable.h>
+#include <linux/cleanup.h>
 #include <linux/init.h>
 #include <linux/i2c.h>
 #include <linux/regmap.h>
@@ -704,6 +705,38 @@ static int rpr0521_write_ps_offset(struct rpr0521_data *data, int offset)
        return ret;
 }
 
+static int rpr0521_read_info_raw(struct rpr0521_data *data,
+                                struct iio_chan_spec const *chan,
+                                int *val)
+{
+       u8 device_mask;
+       __le16 raw_data;
+       int ret;
+
+       device_mask = rpr0521_data_reg[chan->address].device_mask;
+
+       guard(mutex)(&data->lock);
+       ret = rpr0521_set_power_state(data, true, device_mask);
+       if (ret < 0)
+               return ret;
+
+       ret = regmap_bulk_read(data->regmap,
+                              rpr0521_data_reg[chan->address].address,
+                              &raw_data, sizeof(raw_data));
+       if (ret < 0) {
+               rpr0521_set_power_state(data, false, device_mask);
+               return ret;
+       }
+
+       ret = rpr0521_set_power_state(data, false, device_mask);
+       if (ret < 0)
+               return ret;
+
+       *val = le16_to_cpu(raw_data);
+
+       return 0;
+}
+
 static int rpr0521_read_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *chan, int *val,
                            int *val2, long mask)
@@ -711,8 +744,6 @@ static int rpr0521_read_raw(struct iio_dev *indio_dev,
        struct rpr0521_data *data = iio_priv(indio_dev);
        int ret;
        int busy;
-       u8 device_mask;
-       __le16 raw_data;
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
@@ -723,31 +754,11 @@ static int rpr0521_read_raw(struct iio_dev *indio_dev,
                if (busy)
                        return -EBUSY;
 
-               device_mask = rpr0521_data_reg[chan->address].device_mask;
-
-               mutex_lock(&data->lock);
-               ret = rpr0521_set_power_state(data, true, device_mask);
-               if (ret < 0)
-                       goto rpr0521_read_raw_out;
-
-               ret = regmap_bulk_read(data->regmap,
-                                      rpr0521_data_reg[chan->address].address,
-                                      &raw_data, sizeof(raw_data));
-               if (ret < 0) {
-                       rpr0521_set_power_state(data, false, device_mask);
-                       goto rpr0521_read_raw_out;
-               }
-
-               ret = rpr0521_set_power_state(data, false, device_mask);
-
-rpr0521_read_raw_out:
-               mutex_unlock(&data->lock);
+               ret = rpr0521_read_info_raw(data, chan, val);
                iio_device_release_direct_mode(indio_dev);
                if (ret < 0)
                        return ret;
 
-               *val = le16_to_cpu(raw_data);
-
                return IIO_VAL_INT;
 
        case IIO_CHAN_INFO_SCALE: