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: Julien Stephan <jstephan@baylibre.com>
Link: https://patch.msgid.link/20250108-ad7380-add-alert-support-v4-1-1751802471ba@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
This commit is contained in:
Julien Stephan
2025-01-08 13:49:33 +01:00
committed by Jonathan Cameron
parent 2014c95afe
commit 39bc50e00f

View File

@@ -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);
struct ad7380_state *st = iio_priv(indio_dev);
int ret;
if (readval)
return regmap_read(st->regmap, reg, readval);
else
return regmap_write(st->regmap, reg, writeval);
}
unreachable();
ret = iio_device_claim_direct_mode(indio_dev);
if (ret)
return ret;
if (readval)
ret = regmap_read(st->regmap, reg, readval);
else
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,
scan_type, val);
}
unreachable();
ret = iio_device_claim_direct_mode(indio_dev);
if (ret)
return ret;
ret = ad7380_read_direct(st, chan->scan_index,
scan_type, val);
iio_device_release_direct_mode(indio_dev);
return ret;
case IIO_CHAN_INFO_SCALE:
/*
* According to the datasheet, the LSB size is:
@@ -1008,47 +1020,59 @@ static int ad7380_osr_to_regval(int ratio)
return -EINVAL;
}
static int ad7380_set_oversampling_ratio(struct ad7380_state *st, int val)
{
int ret, osr, boost;
osr = ad7380_osr_to_regval(val);
if (osr < 0)
return osr;
/* always enable resolution boost when oversampling is enabled */
boost = osr > 0 ? 1 : 0;
ret = regmap_update_bits(st->regmap,
AD7380_REG_ADDR_CONFIG1,
AD7380_CONFIG1_OSR | AD7380_CONFIG1_RES,
FIELD_PREP(AD7380_CONFIG1_OSR, osr) |
FIELD_PREP(AD7380_CONFIG1_RES, boost));
if (ret)
return ret;
st->oversampling_ratio = val;
st->resolution_boost_enabled = boost;
/*
* Perform a soft reset. This will flush the oversampling
* block and FIFO but will maintain the content of the
* configurable registers.
*/
ret = regmap_update_bits(st->regmap,
AD7380_REG_ADDR_CONFIG2,
AD7380_CONFIG2_RESET,
FIELD_PREP(AD7380_CONFIG2_RESET,
AD7380_CONFIG2_RESET_SOFT));
return ret;
}
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, osr, boost;
int ret;
switch (mask) {
case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
osr = ad7380_osr_to_regval(val);
if (osr < 0)
return osr;
ret = iio_device_claim_direct_mode(indio_dev);
if (ret)
return ret;
/* always enable resolution boost when oversampling is enabled */
boost = osr > 0 ? 1 : 0;
ret = ad7380_set_oversampling_ratio(st, val);
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,
FIELD_PREP(AD7380_CONFIG1_OSR, osr) |
FIELD_PREP(AD7380_CONFIG1_RES, boost));
iio_device_release_direct_mode(indio_dev);
if (ret)
return ret;
st->oversampling_ratio = val;
st->resolution_boost_enabled = boost;
/*
* Perform a soft reset. This will flush the oversampling
* block and FIFO but will maintain the content of the
* configurable registers.
*/
return regmap_update_bits(st->regmap,
AD7380_REG_ADDR_CONFIG2,
AD7380_CONFIG2_RESET,
FIELD_PREP(AD7380_CONFIG2_RESET,
AD7380_CONFIG2_RESET_SOFT));
}
unreachable();
return ret;
default:
return -EINVAL;
}