mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-09 07:51:16 -04:00
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:
committed by
Jonathan Cameron
parent
2014c95afe
commit
39bc50e00f
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user