staging:iio:accel:adis16204 support the rss channel via chan spec.
authorJonathan Cameron <jic23@kernel.org>
Sat, 5 May 2012 09:47:12 +0000 (10:47 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sat, 30 Jun 2012 09:15:25 +0000 (10:15 +0100)
Reduces code and makes this channel available within the kernel.
Note that it is not added to the buffer, thus maintaining the
previous functionality of this driver.

Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Michael Hennerich <michael.hennerich@analog.com>
drivers/staging/iio/accel/adis16204_core.c

index 685fa925d9df0f574bbe1a8ac7099b41e544495c..5f2e5f11c5437bb514aed98a2953c85fca6cfc88 100644 (file)
@@ -169,32 +169,6 @@ error_ret:
        return ret;
 }
 
-static ssize_t adis16204_read_14bit_signed(struct device *dev,
-               struct device_attribute *attr,
-               char *buf)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       s16 val = 0;
-       ssize_t ret;
-
-       mutex_lock(&indio_dev->mlock);
-
-       ret = adis16204_spi_read_reg_16(indio_dev,
-                                       this_attr->address, (u16 *)&val);
-       if (!ret) {
-               if (val & ADIS16204_ERROR_ACTIVE)
-                       adis16204_check_status(indio_dev);
-
-               val = ((s16)(val << 2) >> 2);
-               ret = sprintf(buf, "%d\n", val);
-       }
-
-       mutex_unlock(&indio_dev->mlock);
-
-       return ret;
-}
-
 static int adis16204_reset(struct iio_dev *indio_dev)
 {
        int ret;
@@ -282,16 +256,6 @@ err_ret:
 }
 
 /* Unique to this driver currently */
-#define IIO_DEV_ATTR_ACCEL_XY(_show, _addr)                    \
-       IIO_DEVICE_ATTR(in_accel_xy, S_IRUGO, _show, NULL, _addr)
-#define IIO_DEV_ATTR_ACCEL_XYPEAK(_show, _addr)                \
-       IIO_DEVICE_ATTR(in_accel_xypeak, S_IRUGO, _show, NULL, _addr)
-
-static IIO_DEV_ATTR_ACCEL_XY(adis16204_read_14bit_signed,
-               ADIS16204_XY_RSS_OUT);
-static IIO_DEV_ATTR_ACCEL_XYPEAK(adis16204_read_14bit_signed,
-               ADIS16204_XY_PEAK_OUT);
-static IIO_CONST_ATTR(in_accel_xy_scale, "0.017125");
 
 enum adis16204_channel {
        in_supply,
@@ -299,9 +263,10 @@ enum adis16204_channel {
        temp,
        accel_x,
        accel_y,
+       accel_xy,
 };
 
-static u8 adis16204_addresses[5][3] = {
+static u8 adis16204_addresses[6][3] = {
        [in_supply] = { ADIS16204_SUPPLY_OUT },
        [in_aux] = { ADIS16204_AUX_ADC },
        [temp] = { ADIS16204_TEMP_OUT },
@@ -309,6 +274,8 @@ static u8 adis16204_addresses[5][3] = {
                      ADIS16204_X_PEAK_OUT },
        [accel_y] = { ADIS16204_XACCL_OUT, ADIS16204_YACCL_NULL,
                      ADIS16204_Y_PEAK_OUT },
+       [accel_xy] = { ADIS16204_XY_RSS_OUT, 0,
+                      ADIS16204_XY_PEAK_OUT },
 };
 
 static int adis16204_read_raw(struct iio_dev *indio_dev,
@@ -362,10 +329,16 @@ static int adis16204_read_raw(struct iio_dev *indio_dev,
                        return IIO_VAL_INT_PLUS_MICRO;
                case IIO_ACCEL:
                        *val = 0;
-                       if (chan->channel2 == IIO_MOD_X)
+                       switch (chan->channel2) {
+                       case IIO_MOD_X:
+                       case IIO_MOD_ROOT_SUM_SQUARED_X_Y:
                                *val2 = 17125;
-                       else
+                               break;
+                       case IIO_MOD_Y:
+                       case IIO_MOD_Z:
                                *val2 = 8407;
+                               break;
+                       }
                        return IIO_VAL_INT_PLUS_MICRO;
                default:
                        return -EINVAL;
@@ -498,21 +471,23 @@ static struct iio_chan_spec adis16204_channels[] = {
                },
        },
        IIO_CHAN_SOFT_TIMESTAMP(5),
-};
-
-static struct attribute *adis16204_attributes[] = {
-       &iio_dev_attr_in_accel_xy.dev_attr.attr,
-       &iio_dev_attr_in_accel_xypeak.dev_attr.attr,
-       &iio_const_attr_in_accel_xy_scale.dev_attr.attr,
-       NULL
-};
-
-static const struct attribute_group adis16204_attribute_group = {
-       .attrs = adis16204_attributes,
+       {
+               .type = IIO_ACCEL,
+               .modified = 1,
+               .channel2 = IIO_MOD_ROOT_SUM_SQUARED_X_Y,
+               .info_mask = IIO_CHAN_INFO_RAW_SEPARATE_BIT |
+               IIO_CHAN_INFO_SCALE_SEPARATE_BIT |
+               IIO_CHAN_INFO_PEAK_SEPARATE_BIT,
+               .address = accel_xy,
+               .scan_type = {
+                       .sign = 'u',
+                       .realbits = 14,
+                       .storagebits = 16,
+               },
+       }
 };
 
 static const struct iio_info adis16204_info = {
-       .attrs = &adis16204_attribute_group,
        .read_raw = &adis16204_read_raw,
        .write_raw = &adis16204_write_raw,
        .driver_module = THIS_MODULE,
@@ -549,7 +524,7 @@ static int __devinit adis16204_probe(struct spi_device *spi)
 
        ret = iio_buffer_register(indio_dev,
                                  adis16204_channels,
-                                 ARRAY_SIZE(adis16204_channels));
+                                 6);
        if (ret) {
                printk(KERN_ERR "failed to initialize the ring\n");
                goto error_unreg_ring_funcs;