Commit 421ac0c2 authored by Kurt Borja's avatar Kurt Borja Committed by Jonathan Cameron
Browse files

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: default avatarDavid Lechner <dlechner@baylibre.com>
Reviewed-by: default avatarNuno Sá <nuno.sa@analog.com>
Signed-off-by: default avatarKurt Borja <kuurtb@gmail.com>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 6a3fe0fc
Loading
Loading
Loading
Loading
+10 −25
Original line number Diff line number Diff line
@@ -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 = {