]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: adc: ad7380: do not use iio_device_claim_direct_scoped anymore
authorJulien Stephan <jstephan@baylibre.com>
Wed, 8 Jan 2025 12:49:33 +0000 (13:49 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 3 Feb 2025 19:15:36 +0000 (19:15 +0000)
Conditionnal scoped handlers are turning out to be a real pain:
readability issues, compiler and linker handling issues among others so
rollback and remove the scoped version of iio_dvice_claim_direct_mode.

To impove code readability factorize code to set oversampling ratio.

Signed-off-by: Julien Stephan <jstephan@baylibre.com>
Link: https://patch.msgid.link/20250108-ad7380-add-alert-support-v4-1-1751802471ba@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ad7380.c

index 4f32cb22f140442b831dc9a4f275e88e4ab2388e..bc7d58850a3e2a84a241d81377e3dc14c43fc101 100644 (file)
@@ -675,15 +675,21 @@ static const struct regmap_config ad7380_regmap_config = {
 static int ad7380_debugfs_reg_access(struct iio_dev *indio_dev, u32 reg,
                                     u32 writeval, u32 *readval)
 {
-       iio_device_claim_direct_scoped(return  -EBUSY, indio_dev) {
-               struct ad7380_state *st = iio_priv(indio_dev);
+       struct ad7380_state *st = iio_priv(indio_dev);
+       int ret;
 
-               if (readval)
-                       return regmap_read(st->regmap, reg, readval);
-               else
-                       return regmap_write(st->regmap, reg, writeval);
-       }
-       unreachable();
+       ret = iio_device_claim_direct_mode(indio_dev);
+       if (ret)
+               return ret;
+
+       if (readval)
+               ret = regmap_read(st->regmap, reg, readval);
+       else
+               ret = regmap_write(st->regmap, reg, writeval);
+
+       iio_device_release_direct_mode(indio_dev);
+
+       return ret;
 }
 
 /*
@@ -920,6 +926,7 @@ static int ad7380_read_raw(struct iio_dev *indio_dev,
 {
        struct ad7380_state *st = iio_priv(indio_dev);
        const struct iio_scan_type *scan_type;
+       int ret;
 
        scan_type = iio_get_current_scan_type(indio_dev, chan);
 
@@ -928,11 +935,16 @@ static int ad7380_read_raw(struct iio_dev *indio_dev,
 
        switch (info) {
        case IIO_CHAN_INFO_RAW:
-               iio_device_claim_direct_scoped(return -EBUSY, indio_dev) {
-                       return ad7380_read_direct(st, chan->scan_index,
-                                                 scan_type, val);
-               }
-               unreachable();
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret)
+                       return ret;
+
+               ret = ad7380_read_direct(st, chan->scan_index,
+                                        scan_type, val);
+
+               iio_device_release_direct_mode(indio_dev);
+
+               return ret;
        case IIO_CHAN_INFO_SCALE:
                /*
                 * According to the datasheet, the LSB size is:
@@ -1008,47 +1020,59 @@ static int ad7380_osr_to_regval(int ratio)
        return -EINVAL;
 }
 
+static int ad7380_set_oversampling_ratio(struct ad7380_state *st, int val)
+{
+       int ret, osr, boost;
+
+       osr = ad7380_osr_to_regval(val);
+       if (osr < 0)
+               return osr;
+
+       /* always enable resolution boost when oversampling is enabled */
+       boost = osr > 0 ? 1 : 0;
+
+       ret = regmap_update_bits(st->regmap,
+                                AD7380_REG_ADDR_CONFIG1,
+                                AD7380_CONFIG1_OSR | AD7380_CONFIG1_RES,
+                                FIELD_PREP(AD7380_CONFIG1_OSR, osr) |
+                                FIELD_PREP(AD7380_CONFIG1_RES, boost));
+
+       if (ret)
+               return ret;
+
+       st->oversampling_ratio = val;
+       st->resolution_boost_enabled = boost;
+
+       /*
+        * Perform a soft reset. This will flush the oversampling
+        * block and FIFO but will maintain the content of the
+        * configurable registers.
+        */
+       ret = regmap_update_bits(st->regmap,
+                                AD7380_REG_ADDR_CONFIG2,
+                                AD7380_CONFIG2_RESET,
+                                FIELD_PREP(AD7380_CONFIG2_RESET,
+                                           AD7380_CONFIG2_RESET_SOFT));
+       return ret;
+}
 static int ad7380_write_raw(struct iio_dev *indio_dev,
                            struct iio_chan_spec const *chan, int val,
                            int val2, long mask)
 {
        struct ad7380_state *st = iio_priv(indio_dev);
-       int ret, osr, boost;
+       int ret;
 
        switch (mask) {
        case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
-               osr = ad7380_osr_to_regval(val);
-               if (osr < 0)
-                       return osr;
+               ret = iio_device_claim_direct_mode(indio_dev);
+               if (ret)
+                       return ret;
 
-               /* always enable resolution boost when oversampling is enabled */
-               boost = osr > 0 ? 1 : 0;
+               ret = ad7380_set_oversampling_ratio(st, val);
 
-               iio_device_claim_direct_scoped(return -EBUSY, indio_dev) {
-                       ret = regmap_update_bits(st->regmap,
-                                       AD7380_REG_ADDR_CONFIG1,
-                                       AD7380_CONFIG1_OSR | AD7380_CONFIG1_RES,
-                                       FIELD_PREP(AD7380_CONFIG1_OSR, osr) |
-                                       FIELD_PREP(AD7380_CONFIG1_RES, boost));
+               iio_device_release_direct_mode(indio_dev);
 
-                       if (ret)
-                               return ret;
-
-                       st->oversampling_ratio = val;
-                       st->resolution_boost_enabled = boost;
-
-                       /*
-                        * Perform a soft reset. This will flush the oversampling
-                        * block and FIFO but will maintain the content of the
-                        * configurable registers.
-                        */
-                       return regmap_update_bits(st->regmap,
-                                       AD7380_REG_ADDR_CONFIG2,
-                                       AD7380_CONFIG2_RESET,
-                                       FIELD_PREP(AD7380_CONFIG2_RESET,
-                                                  AD7380_CONFIG2_RESET_SOFT));
-               }
-               unreachable();
+               return ret;
        default:
                return -EINVAL;
        }