iio: health: max30102: Use IIO cleanup helpers

Use IIO_DEV_GUARD_CURRENT_MODE() cleanup helper to simplify and drop
busy-waiting code in max30102_read_raw().

Reviewed-by: David Lechner <dlechner@baylibre.com>
Reviewed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Kurt Borja <kuurtb@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Kurt Borja 2026-01-20 01:20:46 -05:00 committed by Jonathan Cameron
parent 6a3fe0fc9e
commit 421ac0c231

View File

@ -467,44 +467,29 @@ static int max30102_read_raw(struct iio_dev *indio_dev,
int *val, int *val2, long mask)
{
struct max30102_data *data = iio_priv(indio_dev);
int ret = -EINVAL;
int ret;
switch (mask) {
case IIO_CHAN_INFO_RAW:
case IIO_CHAN_INFO_RAW: {
/*
* Temperature reading can only be acquired when not in
* shutdown; leave shutdown briefly when buffer not running
*/
any_mode_retry:
if (!iio_device_try_claim_buffer_mode(indio_dev)) {
/*
* This one is a *bit* hacky. If we cannot claim buffer
* mode, then try direct mode so that we make sure
* things cannot concurrently change. And we just keep
* trying until we get one of the modes...
*/
if (!iio_device_claim_direct(indio_dev))
goto any_mode_retry;
IIO_DEV_GUARD_CURRENT_MODE(indio_dev);
ret = max30102_get_temp(data, val, true);
iio_device_release_direct(indio_dev);
} else {
ret = max30102_get_temp(data, val, false);
iio_device_release_buffer_mode(indio_dev);
}
ret = max30102_get_temp(data, val, !iio_buffer_enabled(indio_dev));
if (ret)
return ret;
ret = IIO_VAL_INT;
break;
return IIO_VAL_INT;
}
case IIO_CHAN_INFO_SCALE:
*val = 1000; /* 62.5 */
*val2 = 16;
ret = IIO_VAL_FRACTIONAL;
break;
return IIO_VAL_FRACTIONAL;
default:
return -EINVAL;
}
return ret;
}
static const struct iio_info max30102_info = {