staging:iio:adis16260: Add proper range checks to write_frequency()
authorLars-Peter Clausen <lars@metafoo.de>
Wed, 17 Jul 2013 14:44:00 +0000 (15:44 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sat, 3 Aug 2013 17:41:22 +0000 (18:41 +0100)
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>
drivers/staging/iio/gyro/adis16260_core.c

index b8a6a0457477f4667f86fb64e37c170b2ef1ed56..d4e3dd7f94d99349cd218ebb886d8e4cd2931ab7 100644 (file)
@@ -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;