Message ID | 20250209180624.701140-21-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. Includes moving a mutex lock > into a function rather than around it to simplify the error handling. > > Cc: Nuno Sa <nuno.sa@analog.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/addac/ad74413r.c | 14 +++++++++----- > 1 file changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/iio/addac/ad74413r.c b/drivers/iio/addac/ad74413r.c > index daea2bde7acf..f14d12b03da6 100644 > --- a/drivers/iio/addac/ad74413r.c > +++ b/drivers/iio/addac/ad74413r.c > @@ -826,6 +826,8 @@ static int _ad74413r_get_single_adc_result(struct > ad74413r_state *st, > unsigned int uval; > int ret; > > + guard(mutex)(&st->lock); > + > reinit_completion(&st->adc_data_completion); > > ret = ad74413r_set_adc_channel_enable(st, channel, true); > @@ -865,12 +867,14 @@ static int ad74413r_get_single_adc_result(struct iio_dev > *indio_dev, > unsigned int channel, int *val) > { > struct ad74413r_state *st = iio_priv(indio_dev); > + int ret; > > - iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { > - guard(mutex)(&st->lock); > - return _ad74413r_get_single_adc_result(st, channel, val); > - } > - unreachable(); > + if (!iio_device_claim_direct(indio_dev)) > + return -EBUSY; > + > + ret = _ad74413r_get_single_adc_result(st, channel, val); > + iio_device_release_direct(indio_dev); > + return ret; > } > > static void ad74413r_adc_to_resistance_result(int adc_result, int *val)
diff --git a/drivers/iio/addac/ad74413r.c b/drivers/iio/addac/ad74413r.c index daea2bde7acf..f14d12b03da6 100644 --- a/drivers/iio/addac/ad74413r.c +++ b/drivers/iio/addac/ad74413r.c @@ -826,6 +826,8 @@ static int _ad74413r_get_single_adc_result(struct ad74413r_state *st, unsigned int uval; int ret; + guard(mutex)(&st->lock); + reinit_completion(&st->adc_data_completion); ret = ad74413r_set_adc_channel_enable(st, channel, true); @@ -865,12 +867,14 @@ static int ad74413r_get_single_adc_result(struct iio_dev *indio_dev, unsigned int channel, int *val) { struct ad74413r_state *st = iio_priv(indio_dev); + int ret; - iio_device_claim_direct_scoped(return -EBUSY, indio_dev) { - guard(mutex)(&st->lock); - return _ad74413r_get_single_adc_result(st, channel, val); - } - unreachable(); + if (!iio_device_claim_direct(indio_dev)) + return -EBUSY; + + ret = _ad74413r_get_single_adc_result(st, channel, val); + iio_device_release_direct(indio_dev); + return ret; } static void ad74413r_adc_to_resistance_result(int adc_result, int *val)