Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit afa81484 authored by Alison Schofield's avatar Alison Schofield Committed by Jonathan Cameron
Browse files

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: default avatarAlison Schofield <amsfield22@gmail.com>
Cc: Daniel Baluta <daniel.baluta@gmail.com>
Acked-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 7c7e9dad
Loading
Loading
Loading
Loading
+13 −19
Original line number Diff line number Diff line
@@ -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);
		if (lval == st->chip_info->sample_freq_avail[i])
			break;
	if (i == 16)
		return -EINVAL;

	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);
			mutex_unlock(&indio_dev->mlock);
			ret = 0;
		}
	ad_sd_write_reg(&st->sd, AD7793_REG_MODE, sizeof(st->mode), st->mode);
	iio_device_release_direct_mode(indio_dev);

	return ret ? ret : len;
	return len;
}

static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO,