Message ID | 20250217141630.897334-26-jic23@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | IIO: ADCs: Sparse friendly claim of direct mode | expand |
On Mon, 2025-02-17 at 14:16 +0000, Jonathan Cameron wrote: > From: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > Introduce __max11410_write_samp_freq() helper and use guard() to avoid > need for manual unlock of the mutex. This allows direct returns and > simplifies the resulting error handling. > > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- Reviewed-by: Nuno Sá <nuno.sa@analog.com> > drivers/iio/adc/max11410.c | 51 ++++++++++++++++++++------------------ > 1 file changed, 27 insertions(+), 24 deletions(-) > > diff --git a/drivers/iio/adc/max11410.c b/drivers/iio/adc/max11410.c > index 76abafd47404..6e06c62715a8 100644 > --- a/drivers/iio/adc/max11410.c > +++ b/drivers/iio/adc/max11410.c > @@ -507,12 +507,37 @@ static int max11410_read_raw(struct iio_dev *indio_dev, > return -EINVAL; > } > > +static int __max11410_write_samp_freq(struct max11410_state *st, > + int val, int val2) > +{ > + int ret, i, reg_val, filter; > + > + guard(mutex)(&st->lock); > + > + ret = regmap_read(st->regmap, MAX11410_REG_FILTER, ®_val); > + if (ret) > + return ret; > + > + filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val); > + > + for (i = 0; i < max11410_sampling_len[filter]; ++i) { > + if (val == max11410_sampling_rates[filter][i][0] && > + val2 == max11410_sampling_rates[filter][i][1]) > + break; > + } > + if (i == max11410_sampling_len[filter]) > + return -EINVAL; > + > + return regmap_write_bits(st->regmap, MAX11410_REG_FILTER, > + MAX11410_FILTER_RATE_MASK, i); > +} > + > static int max11410_write_raw(struct iio_dev *indio_dev, > struct iio_chan_spec const *chan, > int val, int val2, long mask) > { > struct max11410_state *st = iio_priv(indio_dev); > - int i, ret, reg_val, filter, gain; > + int ret, gain; > u32 *scale_avail; > > switch (mask) { > @@ -544,29 +569,7 @@ static int max11410_write_raw(struct iio_dev *indio_dev, > if (ret) > return ret; > > - mutex_lock(&st->lock); > - > - ret = regmap_read(st->regmap, MAX11410_REG_FILTER, ®_val); > - if (ret) > - goto out; > - > - filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val); > - > - for (i = 0; i < max11410_sampling_len[filter]; ++i) { > - if (val == max11410_sampling_rates[filter][i][0] && > - val2 == max11410_sampling_rates[filter][i][1]) > - break; > - } > - if (i == max11410_sampling_len[filter]) { > - ret = -EINVAL; > - goto out; > - } > - > - ret = regmap_write_bits(st->regmap, MAX11410_REG_FILTER, > - MAX11410_FILTER_RATE_MASK, i); > - > -out: > - mutex_unlock(&st->lock); > + ret = __max11410_write_samp_freq(st, val, val2); > iio_device_release_direct_mode(indio_dev); > > return ret;
diff --git a/drivers/iio/adc/max11410.c b/drivers/iio/adc/max11410.c index 76abafd47404..6e06c62715a8 100644 --- a/drivers/iio/adc/max11410.c +++ b/drivers/iio/adc/max11410.c @@ -507,12 +507,37 @@ static int max11410_read_raw(struct iio_dev *indio_dev, return -EINVAL; } +static int __max11410_write_samp_freq(struct max11410_state *st, + int val, int val2) +{ + int ret, i, reg_val, filter; + + guard(mutex)(&st->lock); + + ret = regmap_read(st->regmap, MAX11410_REG_FILTER, ®_val); + if (ret) + return ret; + + filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val); + + for (i = 0; i < max11410_sampling_len[filter]; ++i) { + if (val == max11410_sampling_rates[filter][i][0] && + val2 == max11410_sampling_rates[filter][i][1]) + break; + } + if (i == max11410_sampling_len[filter]) + return -EINVAL; + + return regmap_write_bits(st->regmap, MAX11410_REG_FILTER, + MAX11410_FILTER_RATE_MASK, i); +} + static int max11410_write_raw(struct iio_dev *indio_dev, struct iio_chan_spec const *chan, int val, int val2, long mask) { struct max11410_state *st = iio_priv(indio_dev); - int i, ret, reg_val, filter, gain; + int ret, gain; u32 *scale_avail; switch (mask) { @@ -544,29 +569,7 @@ static int max11410_write_raw(struct iio_dev *indio_dev, if (ret) return ret; - mutex_lock(&st->lock); - - ret = regmap_read(st->regmap, MAX11410_REG_FILTER, ®_val); - if (ret) - goto out; - - filter = FIELD_GET(MAX11410_FILTER_LINEF_MASK, reg_val); - - for (i = 0; i < max11410_sampling_len[filter]; ++i) { - if (val == max11410_sampling_rates[filter][i][0] && - val2 == max11410_sampling_rates[filter][i][1]) - break; - } - if (i == max11410_sampling_len[filter]) { - ret = -EINVAL; - goto out; - } - - ret = regmap_write_bits(st->regmap, MAX11410_REG_FILTER, - MAX11410_FILTER_RATE_MASK, i); - -out: - mutex_unlock(&st->lock); + ret = __max11410_write_samp_freq(st, val, val2); iio_device_release_direct_mode(indio_dev); return ret;