diff options
author | Alison Schofield <amsfield22@gmail.com> | 2016-06-02 00:28:14 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2016-06-03 08:01:14 -0400 |
commit | afa814841c812cd1a36dbbb124542a487c2df5ee (patch) | |
tree | cdb8d71bf49fb07b0404138c21a5ecd861e291b7 | |
parent | 7c7e9dad7017ff5b5f0524ea6d85dcda3c62431e (diff) |
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.
Signed-off-by: Alison Schofield <amsfield22@gmail.com>
Cc: Daniel Baluta <daniel.baluta@gmail.com>
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r-- | drivers/iio/adc/ad7793.c | 32 |
1 files changed, 13 insertions, 19 deletions
diff --git a/drivers/iio/adc/ad7793.c b/drivers/iio/adc/ad7793.c index 7b07bb651671..a43722fbf03a 100644 --- a/drivers/iio/adc/ad7793.c +++ b/drivers/iio/adc/ad7793.c | |||
@@ -369,13 +369,6 @@ static ssize_t ad7793_write_frequency(struct device *dev, | |||
369 | long lval; | 369 | long lval; |
370 | int i, ret; | 370 | int i, ret; |
371 | 371 | ||
372 | mutex_lock(&indio_dev->mlock); | ||
373 | if (iio_buffer_enabled(indio_dev)) { | ||
374 | mutex_unlock(&indio_dev->mlock); | ||
375 | return -EBUSY; | ||
376 | } | ||
377 | mutex_unlock(&indio_dev->mlock); | ||
378 | |||
379 | ret = kstrtol(buf, 10, &lval); | 372 | ret = kstrtol(buf, 10, &lval); |
380 | if (ret) | 373 | if (ret) |
381 | return ret; | 374 | return ret; |
@@ -383,20 +376,21 @@ static ssize_t ad7793_write_frequency(struct device *dev, | |||
383 | if (lval == 0) | 376 | if (lval == 0) |
384 | return -EINVAL; | 377 | return -EINVAL; |
385 | 378 | ||
386 | ret = -EINVAL; | ||
387 | |||
388 | for (i = 0; i < 16; i++) | 379 | for (i = 0; i < 16; i++) |
389 | if (lval == st->chip_info->sample_freq_avail[i]) { | 380 | if (lval == st->chip_info->sample_freq_avail[i]) |
390 | mutex_lock(&indio_dev->mlock); | 381 | break; |
391 | st->mode &= ~AD7793_MODE_RATE(-1); | 382 | if (i == 16) |
392 | st->mode |= AD7793_MODE_RATE(i); | 383 | return -EINVAL; |
393 | ad_sd_write_reg(&st->sd, AD7793_REG_MODE, | ||
394 | sizeof(st->mode), st->mode); | ||
395 | mutex_unlock(&indio_dev->mlock); | ||
396 | ret = 0; | ||
397 | } | ||
398 | 384 | ||
399 | return ret ? ret : len; | 385 | ret = iio_device_claim_direct_mode(indio_dev); |
386 | if (ret) | ||
387 | return ret; | ||
388 | st->mode &= ~AD7793_MODE_RATE(-1); | ||
389 | st->mode |= AD7793_MODE_RATE(i); | ||
390 | ad_sd_write_reg(&st->sd, AD7793_REG_MODE, sizeof(st->mode), st->mode); | ||
391 | iio_device_release_direct_mode(indio_dev); | ||
392 | |||
393 | return len; | ||
400 | } | 394 | } |
401 | 395 | ||
402 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, | 396 | static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, |