aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlison Schofield <amsfield22@gmail.com>2016-06-02 00:28:14 -0400
committerJonathan Cameron <jic23@kernel.org>2016-06-03 08:01:14 -0400
commitafa814841c812cd1a36dbbb124542a487c2df5ee (patch)
treecdb8d71bf49fb07b0404138c21a5ecd861e291b7
parent7c7e9dad7017ff5b5f0524ea6d85dcda3c62431e (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.c32
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
402static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, 396static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,