staging: iio: cdc: ad7746: Factor out ad7746_read_channel()
authorJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 26 Jun 2022 12:29:27 +0000 (13:29 +0100)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Mon, 15 Aug 2022 21:30:00 +0000 (22:30 +0100)
Reduce deep indenting and simplify the locking cleanup that follows.

Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20220626122938.582107-7-jic23@kernel.org
drivers/staging/iio/cdc/ad7746.c

index 496e90f..8052ac2 100644 (file)
@@ -512,54 +512,66 @@ out:
        return ret;
 }
 
+static int ad7746_read_channel(struct iio_dev *indio_dev,
+                              struct iio_chan_spec const *chan,
+                              int *val)
+{
+       struct ad7746_chip_info *chip = iio_priv(indio_dev);
+       int ret, delay;
+       u8 data[3];
+       u8 regval;
+
+       ret = ad7746_select_channel(indio_dev, chan);
+       if (ret < 0)
+               return ret;
+       delay = ret;
+
+       regval = chip->config | AD7746_CONF_MODE_SINGLE_CONV;
+       ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG, regval);
+       if (ret < 0)
+               return ret;
+
+       msleep(delay);
+       /* Now read the actual register */
+       ret = i2c_smbus_read_i2c_block_data(chip->client,  chan->address >> 8,
+                                           sizeof(data), data);
+       if (ret < 0)
+               return ret;
+
+       *val = get_unaligned_be24(data) - 0x800000;
+
+       switch (chan->type) {
+       case IIO_TEMP:
+               /*
+                * temperature in milli degrees Celsius
+                * T = ((*val / 2048) - 4096) * 1000
+                */
+               *val = (*val  * 125) / 256;
+               break;
+       default:
+               break;
+       }
+
+       return 0;
+}
+
 static int ad7746_read_raw(struct iio_dev *indio_dev,
                           struct iio_chan_spec const *chan,
                           int *val, int *val2,
                           long mask)
 {
        struct ad7746_chip_info *chip = iio_priv(indio_dev);
-       int ret, delay, idx;
-       u8 regval, reg;
-       u8 data[3];
+       int ret, idx;
+       u8 reg;
 
        mutex_lock(&chip->lock);
 
        switch (mask) {
        case IIO_CHAN_INFO_RAW:
        case IIO_CHAN_INFO_PROCESSED:
-               ret = ad7746_select_channel(indio_dev, chan);
+               ret = ad7746_read_channel(indio_dev, chan, val);
                if (ret < 0)
                        goto out;
-               delay = ret;
-
-               regval = chip->config | AD7746_CONF_MODE_SINGLE_CONV;
-               ret = i2c_smbus_write_byte_data(chip->client, AD7746_REG_CFG,
-                                               regval);
-               if (ret < 0)
-                       goto out;
-
-               msleep(delay);
-               /* Now read the actual register */
-
-               ret = i2c_smbus_read_i2c_block_data(chip->client,
-                                                   chan->address >> 8,
-                                                   sizeof(data), data);
-               if (ret < 0)
-                       goto out;
-
-               *val = get_unaligned_be24(data) - 0x800000;
-
-               switch (chan->type) {
-               case IIO_TEMP:
-                       /*
-                        * temperature in milli degrees Celsius
-                        * T = ((*val / 2048) - 4096) * 1000
-                        */
-                       *val = (*val * 125) / 256;
-                       break;
-               default:
-                       break;
-               }
 
                ret = IIO_VAL_INT;
                break;