Merge tag 'arc-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[linux-2.6-microblaze.git] / drivers / iio / dac / ad5592r-base.c
index 1fd75c0..0405e92 100644 (file)
@@ -374,36 +374,36 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
 {
        struct ad5592r_state *st = iio_priv(iio_dev);
        u16 read_val;
-       int ret;
+       int ret, mult;
 
        switch (m) {
        case IIO_CHAN_INFO_RAW:
-               mutex_lock(&st->lock);
-
                if (!chan->output) {
+                       mutex_lock(&st->lock);
                        ret = st->ops->read_adc(st, chan->channel, &read_val);
+                       mutex_unlock(&st->lock);
                        if (ret)
-                               goto unlock;
+                               return ret;
 
                        if ((read_val >> 12 & 0x7) != (chan->channel & 0x7)) {
                                dev_err(st->dev, "Error while reading channel %u\n",
                                                chan->channel);
-                               ret = -EIO;
-                               goto unlock;
+                               return -EIO;
                        }
 
                        read_val &= GENMASK(11, 0);
 
                } else {
+                       mutex_lock(&st->lock);
                        read_val = st->cached_dac[chan->channel];
+                       mutex_unlock(&st->lock);
                }
 
                dev_dbg(st->dev, "Channel %u read: 0x%04hX\n",
                                chan->channel, read_val);
 
                *val = (int) read_val;
-               ret = IIO_VAL_INT;
-               break;
+               return IIO_VAL_INT;
        case IIO_CHAN_INFO_SCALE:
                *val = ad5592r_get_vref(st);
 
@@ -412,24 +412,24 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
                        *val = div_s64_rem(tmp, 1000000000LL, val2);
 
                        return IIO_VAL_INT_PLUS_MICRO;
-               } else {
-                       int mult;
+               }
 
-                       mutex_lock(&st->lock);
+               mutex_lock(&st->lock);
 
-                       if (chan->output)
-                               mult = !!(st->cached_gp_ctrl &
-                                       AD5592R_REG_CTRL_DAC_RANGE);
-                       else
-                               mult = !!(st->cached_gp_ctrl &
-                                       AD5592R_REG_CTRL_ADC_RANGE);
+               if (chan->output)
+                       mult = !!(st->cached_gp_ctrl &
+                               AD5592R_REG_CTRL_DAC_RANGE);
+               else
+                       mult = !!(st->cached_gp_ctrl &
+                               AD5592R_REG_CTRL_ADC_RANGE);
 
-                       *val *= ++mult;
+               mutex_unlock(&st->lock);
 
-                       *val2 = chan->scan_type.realbits;
-                       ret = IIO_VAL_FRACTIONAL_LOG2;
-               }
-               break;
+               *val *= ++mult;
+
+               *val2 = chan->scan_type.realbits;
+
+               return IIO_VAL_FRACTIONAL_LOG2;
        case IIO_CHAN_INFO_OFFSET:
                ret = ad5592r_get_vref(st);
 
@@ -439,15 +439,13 @@ static int ad5592r_read_raw(struct iio_dev *iio_dev,
                        *val = (-34365 * 25) / ret;
                else
                        *val = (-75365 * 25) / ret;
-               ret =  IIO_VAL_INT;
-               break;
+
+               mutex_unlock(&st->lock);
+
+               return IIO_VAL_INT;
        default:
                return -EINVAL;
        }
-
-unlock:
-       mutex_unlock(&st->lock);
-       return ret;
 }
 
 static int ad5592r_write_raw_get_fmt(struct iio_dev *indio_dev,
@@ -486,7 +484,7 @@ static const struct iio_chan_spec_ext_info ad5592r_ext_info[] = {
        {
         .name = "scale_available",
         .read = ad5592r_show_scale_available,
-        .shared = true,
+        .shared = IIO_SHARED_BY_TYPE,
         },
        {},
 };