iio: adc: ad7793: claim direct mode when writing frequency
Subsystems (2)
PATCH v2 3/7 iio: adc: ad7793: claim direct mode when writing frequency
Driver was checking for direct mode and trying to lock it, but left a gap where mode could change before the desired operation. Use iio_device_claim_direct_mode() to guarantee device stays in direct mode.
Refactor function to clarify look-up followed by lock sequence.
---
Changes in v2
Refactored function per reviewers comments
Updated changelog
drivers/iio/adc/ad7793.c | 32 +++++++++++++------------------- 1 file changed, 13 insertions(+), 19 deletions(-)
drivers/iio/adc/ad7793.c +13 -19
@@ -369,13 +369,6 @@ static ssize_t ad7793_write_frequency(struct device *dev,long lval;int i, ret; -mutex_lock (&indio_dev->mlock); -if (iio_buffer_enabled (indio_dev)) { -mutex_unlock (&indio_dev->mlock); -return -EBUSY ; - } -mutex_unlock (&indio_dev->mlock); - ret =kstrtol (buf,10 , &lval);if (ret)return ret;
@@ -383,20 +376,21 @@ static ssize_t ad7793_write_frequency(struct device *dev,if (lval ==0 )return -EINVAL ; - ret = -EINVAL ; -for (i =0 ; i <16 ; i++) -if (lval == st->chip_info->sample_freq_avail[i]) { -mutex_lock (&indio_dev->mlock); - st->mode &= ~AD7793_MODE_RATE (-1 ); - st->mode |=AD7793_MODE_RATE (i); -ad_sd_write_reg (&st->sd,AD7793_REG_MODE , -sizeof (st->mode), st->mode); -mutex_unlock (&indio_dev->mlock); - ret =0 ; - } +if (lval == st->chip_info->sample_freq_avail[i]) +break ; +if (i ==16 ) +return -EINVAL ; -return ret ? ret : len; + ret =iio_device_claim_direct_mode (indio_dev); +if (ret) +return ret; + st->mode &= ~AD7793_MODE_RATE (-1 ); + st->mode |=AD7793_MODE_RATE (i); +ad_sd_write_reg (&st->sd,AD7793_REG_MODE ,sizeof (st->mode), st->mode); +iio_device_release_direct_mode (indio_dev); + +return len; } static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,
Signature · 1 line
2.1.4
Quoted 9 lines · Alison Schofield
Driver was checking for direct mode and trying to lock it, but left a gap where mode could change before the desired operation. Use
iio_device_claim_direct_mode()to guarantee device stays in direct mode.Refactor function to clarify look-up followed by lock sequence.
Signed-off-by Alison Schofield <[email protected]>Cc Daniel Baluta <[email protected]>
Looks good, thanks.
Quoted 6 lines · Lars-Peter Clausen
Quoted 5 lines · Alison Schofield
Driver was checking for direct mode and trying to lock it, but left a gap where mode could change before the desired operation. Use
iio_device_claim_direct_mode()to guarantee device stays in direct mode.
Quoted 8 lines
Quoted 4 lines
Refactor function to clarify look-up followed by lock sequence.
Signed-off-by Alison Schofield <[email protected]>Cc Daniel Baluta <[email protected]>Looks good, thanks.
Applied to the togreg branch of iio.git - initially pushed out as testing for the autobuilders to play with it.
Thanks,
Jonathan
Quoted 5 lines
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html