iio: gyro: itg3200 switch sampling frequency attr to core support.
authorJonathan Cameron <jic23@kernel.org>
Sun, 22 Jun 2014 19:59:00 +0000 (20:59 +0100)
committerJonathan Cameron <jic23@kernel.org>
Mon, 7 Jul 2014 08:41:32 +0000 (09:41 +0100)
By using the info_mask_shared_by_all element of the channel spec, access
to the sampling frequency becomes available to in kernel users of the
driver.  It also shortens and simplifies the code a little.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Reviewed-by: Hartmut Knaack <knaack.h@gmx.de>
Cc: Manuel Stahl <manuel.stahl@iis.fraunhofer.de>
Cc: Thorsten Nowak <thorsten.nowak@iis.fraunhofer.de>
Cc: Christian Strobel <christian.strobel@iis.fraunhofer.de>
drivers/iio/gyro/itg3200_core.c

index 8295e318399f9874ccde4f4429a001141a4004be..6a8020d4814038b67cbad3b3c51d20d1987bbd77 100644 (file)
@@ -90,6 +90,7 @@ static int itg3200_read_raw(struct iio_dev *indio_dev,
 {
        int ret = 0;
        u8 reg;
+       u8 regval;
 
        switch (info) {
        case IIO_CHAN_INFO_RAW:
@@ -107,65 +108,60 @@ static int itg3200_read_raw(struct iio_dev *indio_dev,
                /* Only the temperature channel has an offset */
                *val = 23000;
                return IIO_VAL_INT;
-       default:
-               return -EINVAL;
-       }
-}
-
-static ssize_t itg3200_read_frequency(struct device *dev,
-               struct device_attribute *attr, char *buf)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       int ret, sps;
-       u8 val;
-
-       ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &val);
-       if (ret)
-               return ret;
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &regval);
+               if (ret)
+                       return ret;
 
-       sps = (val & ITG3200_DLPF_CFG_MASK) ? 1000 : 8000;
+               *val = (regval & ITG3200_DLPF_CFG_MASK) ? 1000 : 8000;
 
-       ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_SAMPLE_RATE_DIV, &val);
-       if (ret)
-               return ret;
+               ret = itg3200_read_reg_8(indio_dev,
+                                        ITG3200_REG_SAMPLE_RATE_DIV,
+                                        &regval);
+               if (ret)
+                       return ret;
 
-       sps /= val + 1;
+               *val /= regval + 1;
+               return IIO_VAL_INT;
 
-       return sprintf(buf, "%d\n", sps);
+       default:
+               return -EINVAL;
+       }
 }
 
-static ssize_t itg3200_write_frequency(struct device *dev,
-               struct device_attribute *attr,
-               const char *buf,
-               size_t len)
+static int itg3200_write_raw(struct iio_dev *indio_dev,
+                            struct iio_chan_spec const *chan,
+                            int val,
+                            int val2,
+                            long mask)
 {
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       unsigned val;
        int ret;
        u8 t;
 
-       ret = kstrtouint(buf, 10, &val);
-       if (ret)
-               return ret;
+       switch (mask) {
+       case IIO_CHAN_INFO_SAMP_FREQ:
+               if (val == 0 || val2 != 0)
+                       return -EINVAL;
 
-       mutex_lock(&indio_dev->mlock);
+               mutex_lock(&indio_dev->mlock);
 
-       ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t);
-       if (ret)
-               goto err_ret;
+               ret = itg3200_read_reg_8(indio_dev, ITG3200_REG_DLPF, &t);
+               if (ret) {
+                       mutex_unlock(&indio_dev->mlock);
+                       return ret;
+               }
+               t = ((t & ITG3200_DLPF_CFG_MASK) ? 1000u : 8000u) / val - 1;
 
-       if (val == 0) {
-               ret = -EINVAL;
-               goto err_ret;
-       }
-       t = ((t & ITG3200_DLPF_CFG_MASK) ? 1000u : 8000u) / val - 1;
+               ret = itg3200_write_reg_8(indio_dev,
+                                         ITG3200_REG_SAMPLE_RATE_DIV,
+                                         t);
 
-       ret = itg3200_write_reg_8(indio_dev, ITG3200_REG_SAMPLE_RATE_DIV, t);
-
-err_ret:
-       mutex_unlock(&indio_dev->mlock);
+               mutex_unlock(&indio_dev->mlock);
+       return ret;
 
-       return ret ? ret : len;
+       default:
+               return -EINVAL;
+       }
 }
 
 /*
@@ -255,6 +251,7 @@ err_ret:
        .channel2 = IIO_MOD_ ## _mod, \
        .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
        .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
+       .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
        .address = ITG3200_REG_GYRO_ ## _mod ## OUT_H, \
        .scan_index = ITG3200_SCAN_GYRO_ ## _mod, \
        .scan_type = ITG3200_ST, \
@@ -267,6 +264,7 @@ static const struct iio_chan_spec itg3200_channels[] = {
                .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
                .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
                BIT(IIO_CHAN_INFO_SCALE),
+               .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
                .address = ITG3200_REG_TEMP_OUT_H,
                .scan_index = ITG3200_SCAN_TEMP,
                .scan_type = ITG3200_ST,
@@ -277,22 +275,9 @@ static const struct iio_chan_spec itg3200_channels[] = {
        IIO_CHAN_SOFT_TIMESTAMP(ITG3200_SCAN_ELEMENTS),
 };
 
-/* IIO device attributes */
-static IIO_DEV_ATTR_SAMP_FREQ(S_IWUSR | S_IRUGO, itg3200_read_frequency,
-               itg3200_write_frequency);
-
-static struct attribute *itg3200_attributes[] = {
-       &iio_dev_attr_sampling_frequency.dev_attr.attr,
-       NULL
-};
-
-static const struct attribute_group itg3200_attribute_group = {
-       .attrs = itg3200_attributes,
-};
-
 static const struct iio_info itg3200_info = {
-       .attrs = &itg3200_attribute_group,
        .read_raw = &itg3200_read_raw,
+       .write_raw = &itg3200_write_raw,
        .driver_module = THIS_MODULE,
 };