Commit 39bc50e0 authored by Julien Stephan's avatar Julien Stephan Committed by Jonathan Cameron
Browse files

iio: adc: ad7380: do not use iio_device_claim_direct_scoped anymore



Conditionnal scoped handlers are turning out to be a real pain:
readability issues, compiler and linker handling issues among others so
rollback and remove the scoped version of iio_dvice_claim_direct_mode.

To impove code readability factorize code to set oversampling ratio.

Signed-off-by: default avatarJulien Stephan <jstephan@baylibre.com>
Link: https://patch.msgid.link/20250108-ad7380-add-alert-support-v4-1-1751802471ba@baylibre.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 2014c95a
Loading
Loading
Loading
Loading
+67 −43
Original line number Diff line number Diff line
@@ -675,15 +675,21 @@ static const struct regmap_config ad7380_regmap_config = {
static int ad7380_debugfs_reg_access(struct iio_dev *indio_dev, u32 reg,
				     u32 writeval, u32 *readval)
{
	iio_device_claim_direct_scoped(return  -EBUSY, indio_dev) {
	struct ad7380_state *st = iio_priv(indio_dev);
	int ret;

	ret = iio_device_claim_direct_mode(indio_dev);
	if (ret)
		return ret;

	if (readval)
			return regmap_read(st->regmap, reg, readval);
		ret = regmap_read(st->regmap, reg, readval);
	else
			return regmap_write(st->regmap, reg, writeval);
	}
	unreachable();
		ret = regmap_write(st->regmap, reg, writeval);

	iio_device_release_direct_mode(indio_dev);

	return ret;
}

/*
@@ -920,6 +926,7 @@ static int ad7380_read_raw(struct iio_dev *indio_dev,
{
	struct ad7380_state *st = iio_priv(indio_dev);
	const struct iio_scan_type *scan_type;
	int ret;

	scan_type = iio_get_current_scan_type(indio_dev, chan);

@@ -928,11 +935,16 @@ static int ad7380_read_raw(struct iio_dev *indio_dev,

	switch (info) {
	case IIO_CHAN_INFO_RAW:
		iio_device_claim_direct_scoped(return -EBUSY, indio_dev) {
			return ad7380_read_direct(st, chan->scan_index,
		ret = iio_device_claim_direct_mode(indio_dev);
		if (ret)
			return ret;

		ret = ad7380_read_direct(st, chan->scan_index,
					 scan_type, val);
		}
		unreachable();

		iio_device_release_direct_mode(indio_dev);

		return ret;
	case IIO_CHAN_INFO_SCALE:
		/*
		 * According to the datasheet, the LSB size is:
@@ -1008,15 +1020,10 @@ static int ad7380_osr_to_regval(int ratio)
	return -EINVAL;
}

static int ad7380_write_raw(struct iio_dev *indio_dev,
			    struct iio_chan_spec const *chan, int val,
			    int val2, long mask)
static int ad7380_set_oversampling_ratio(struct ad7380_state *st, int val)
{
	struct ad7380_state *st = iio_priv(indio_dev);
	int ret, osr, boost;

	switch (mask) {
	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
	osr = ad7380_osr_to_regval(val);
	if (osr < 0)
		return osr;
@@ -1024,7 +1031,6 @@ static int ad7380_write_raw(struct iio_dev *indio_dev,
	/* always enable resolution boost when oversampling is enabled */
	boost = osr > 0 ? 1 : 0;

		iio_device_claim_direct_scoped(return -EBUSY, indio_dev) {
	ret = regmap_update_bits(st->regmap,
				 AD7380_REG_ADDR_CONFIG1,
				 AD7380_CONFIG1_OSR | AD7380_CONFIG1_RES,
@@ -1042,13 +1048,31 @@ static int ad7380_write_raw(struct iio_dev *indio_dev,
	 * block and FIFO but will maintain the content of the
	 * configurable registers.
	 */
			return regmap_update_bits(st->regmap,
	ret = regmap_update_bits(st->regmap,
				 AD7380_REG_ADDR_CONFIG2,
				 AD7380_CONFIG2_RESET,
				 FIELD_PREP(AD7380_CONFIG2_RESET,
					    AD7380_CONFIG2_RESET_SOFT));
	return ret;
}
		unreachable();
static int ad7380_write_raw(struct iio_dev *indio_dev,
			    struct iio_chan_spec const *chan, int val,
			    int val2, long mask)
{
	struct ad7380_state *st = iio_priv(indio_dev);
	int ret;

	switch (mask) {
	case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
		ret = iio_device_claim_direct_mode(indio_dev);
		if (ret)
			return ret;

		ret = ad7380_set_oversampling_ratio(st, val);

		iio_device_release_direct_mode(indio_dev);

		return ret;
	default:
		return -EINVAL;
	}