Message ID | 20250209180624.701140-11-jic23@kernel.org (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | iio: improve handling of direct mode claim and release | expand |
On Sun, 2025-02-09 at 18:06 +0000, Jonathan Cameron wrote: > From: Jonathan Cameron <Jonathan.Cameron@huawei.com> > > This complex cleanup.h use case of conditional guards has proved > to be more trouble that it is worth in terms of false positive compiler > warnings and hard to read code. > > Move directly to the new claim/release_direct() that allow sparse > to check for unbalanced context. > > Cc: Cosmin Tanislav <demonsingur@gmail.com> > Reviewed-by: David Lechner <dlechner@baylibre.com> > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> > --- Reviewed-by: Nuno Sa <nuno.sa@analog.com> > drivers/iio/adc/ad4130.c | 18 +++++++++++------- > 1 file changed, 11 insertions(+), 7 deletions(-) > > diff --git a/drivers/iio/adc/ad4130.c b/drivers/iio/adc/ad4130.c > index acc241cc0a7a..061eeb9b1f8d 100644 > --- a/drivers/iio/adc/ad4130.c > +++ b/drivers/iio/adc/ad4130.c > @@ -1067,13 +1067,11 @@ static int _ad4130_read_sample(struct iio_dev > *indio_dev, unsigned int channel, > static int ad4130_read_sample(struct iio_dev *indio_dev, unsigned int > channel, > int *val) > { > - iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { > - struct ad4130_state *st = iio_priv(indio_dev); > + struct ad4130_state *st = iio_priv(indio_dev); > > - guard(mutex)(&st->lock); > - return _ad4130_read_sample(indio_dev, channel, val); > - } > - unreachable(); > + guard(mutex)(&st->lock); > + > + return _ad4130_read_sample(indio_dev, channel, val); > } > > static int ad4130_read_raw(struct iio_dev *indio_dev, > @@ -1083,10 +1081,16 @@ static int ad4130_read_raw(struct iio_dev *indio_dev, > struct ad4130_state *st = iio_priv(indio_dev); > unsigned int channel = chan->scan_index; > struct ad4130_setup_info *setup_info = &st- > >chans_info[channel].setup; > + int ret; > > switch (info) { > case IIO_CHAN_INFO_RAW: > - return ad4130_read_sample(indio_dev, channel, val); > + if (!iio_device_claim_direct(indio_dev)) > + return -EBUSY; > + > + ret = ad4130_read_sample(indio_dev, channel, val); > + iio_device_release_direct(indio_dev); > + return ret; > case IIO_CHAN_INFO_SCALE: { > guard(mutex)(&st->lock); > *val = st->scale_tbls[setup_info->ref_sel][setup_info- > >pga][0];
diff --git a/drivers/iio/adc/ad4130.c b/drivers/iio/adc/ad4130.c index acc241cc0a7a..061eeb9b1f8d 100644 --- a/drivers/iio/adc/ad4130.c +++ b/drivers/iio/adc/ad4130.c @@ -1067,13 +1067,11 @@ static int _ad4130_read_sample(struct iio_dev *indio_dev, unsigned int channel, static int ad4130_read_sample(struct iio_dev *indio_dev, unsigned int channel, int *val) { - iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { - struct ad4130_state *st = iio_priv(indio_dev); + struct ad4130_state *st = iio_priv(indio_dev); - guard(mutex)(&st->lock); - return _ad4130_read_sample(indio_dev, channel, val); - } - unreachable(); + guard(mutex)(&st->lock); + + return _ad4130_read_sample(indio_dev, channel, val); } static int ad4130_read_raw(struct iio_dev *indio_dev, @@ -1083,10 +1081,16 @@ static int ad4130_read_raw(struct iio_dev *indio_dev, struct ad4130_state *st = iio_priv(indio_dev); unsigned int channel = chan->scan_index; struct ad4130_setup_info *setup_info = &st->chans_info[channel].setup; + int ret; switch (info) { case IIO_CHAN_INFO_RAW: - return ad4130_read_sample(indio_dev, channel, val); + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; + + ret = ad4130_read_sample(indio_dev, channel, val); + iio_device_release_direct(indio_dev); + return ret; case IIO_CHAN_INFO_SCALE: { guard(mutex)(&st->lock); *val = st->scale_tbls[setup_info->ref_sel][setup_info->pga][0];