staging:iio:adis16260: Add proper range checks to write_frequency()
A negative sampling frequency is obviously invalid, so use kstrtouint() instead of strict_strtoul. Also when setting a sampling frequency smaller than the minimum supported frequency set the frequency to the minimum supported frequency instead of just cutting off the upper bits of the raw register value. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
2a34013509
commit
e4ddf314e2
@ -142,29 +142,26 @@ static ssize_t adis16260_write_frequency(struct device *dev,
|
||||
{
|
||||
struct iio_dev *indio_dev = dev_to_iio_dev(dev);
|
||||
struct adis *adis = iio_priv(indio_dev);
|
||||
long val;
|
||||
unsigned int val;
|
||||
int ret;
|
||||
u8 t;
|
||||
|
||||
ret = strict_strtol(buf, 10, &val);
|
||||
ret = kstrtouint(buf, 10, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
if (val == 0)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
if (spi_get_device_id(adis->spi)->driver_data) {
|
||||
t = (256 / val);
|
||||
if (t > 0)
|
||||
t--;
|
||||
t &= ADIS16260_SMPL_PRD_DIV_MASK;
|
||||
} else {
|
||||
t = (2048 / val);
|
||||
if (t > 0)
|
||||
t--;
|
||||
t &= ADIS16260_SMPL_PRD_DIV_MASK;
|
||||
}
|
||||
if ((t & ADIS16260_SMPL_PRD_DIV_MASK) >= 0x0A)
|
||||
if (spi_get_device_id(adis->spi)->driver_data)
|
||||
t = 256 / val;
|
||||
else
|
||||
t = 2048 / val;
|
||||
|
||||
if (t > ADIS16260_SMPL_PRD_DIV_MASK)
|
||||
t = ADIS16260_SMPL_PRD_DIV_MASK;
|
||||
else if (t > 0)
|
||||
t--;
|
||||
|
||||
if (t >= 0x0A)
|
||||
adis->spi->max_speed_hz = ADIS16260_SPI_SLOW;
|
||||
else
|
||||
adis->spi->max_speed_hz = ADIS16260_SPI_FAST;
|
||||
|
Loading…
Reference in New Issue
Block a user