Commit 8284a498 authored by Kurt Borja's avatar Kurt Borja Committed by Jonathan Cameron
Browse files

iio: light: opt4060: Use IIO cleanup helpers



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

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 421ac0c2
Loading
Loading
Loading
Loading
+17 −35
Original line number Diff line number Diff line
@@ -302,41 +302,23 @@ static int opt4060_set_driver_state(struct iio_dev *indio_dev,
				    bool continuous_irq)
{
	struct opt4060_chip *chip = iio_priv(indio_dev);
	int ret = 0;
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);

	/*
		 * This path means that we managed to claim direct mode. In
		 * this case the buffer isn't enabled and it's okay to leave
		 * continuous mode for sampling and/or irq.
	 * If we manage to claim buffer mode and we are using our own trigger,
	 * IRQ and sampling must go to or remain continuous.
	 */
		ret = opt4060_set_state_common(chip, continuous_sampling,
					       continuous_irq);
		iio_device_release_direct(indio_dev);
		return ret;
	} else {
	if (iio_buffer_enabled(indio_dev) &&
	    iio_trigger_validate_own_device(indio_dev->trig, indio_dev))
		return opt4060_set_state_common(chip, true, true);

	/*
		 * This path means that we managed to claim buffer mode. In
		 * this case the buffer is enabled and irq and sampling must go
		 * to or remain continuous, but only if the trigger is from this
		 * device.
	 * This path means that we managed to claim direct mode. In this case
	 * the buffer isn't enabled and it's okay to leave continuous mode for
	 * sampling and/or irq.
	 */
		if (!iio_trigger_validate_own_device(indio_dev->trig, indio_dev))
			ret = opt4060_set_state_common(chip, true, true);
		else
			ret = opt4060_set_state_common(chip, continuous_sampling,
						       continuous_irq);
		iio_device_release_buffer_mode(indio_dev);
	}
	return ret;
	return opt4060_set_state_common(chip, continuous_sampling, continuous_irq);
}

/*