staging: IIO: IMU: ADIS16400: Make sure only enabled scan_elements are pushed into...
authorMichael Hennerich <michael.hennerich@analog.com>
Mon, 21 Mar 2011 15:44:38 +0000 (16:44 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 5 Apr 2011 19:37:11 +0000 (12:37 -0700)
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
CC: stable <stable@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/imu/adis16400_ring.c

index ac381ca126fcf7cc980d8746f4d801ad9e6e3868..da28cb4288af3f104a51a791d6ab031d02244bc1 100644 (file)
@@ -160,9 +160,10 @@ static void adis16400_trigger_bh_to_ring(struct work_struct *work_s)
                               work_trigger_to_ring);
        struct iio_ring_buffer *ring = st->indio_dev->ring;
 
-       int i = 0;
+       int i = 0, j;
        s16 *data;
        size_t datasize = ring->access.get_bytes_per_datum(ring);
+       unsigned long mask = ring->scan_mask;
 
        data = kmalloc(datasize , GFP_KERNEL);
        if (data == NULL) {
@@ -172,9 +173,12 @@ static void adis16400_trigger_bh_to_ring(struct work_struct *work_s)
 
        if (ring->scan_count)
                if (adis16400_spi_read_burst(&st->indio_dev->dev, st->rx) >= 0)
-                       for (; i < ring->scan_count; i++)
+                       for (; i < ring->scan_count; i++) {
+                               j = __ffs(mask);
+                               mask &= ~(1 << j);
                                data[i] = be16_to_cpup(
-                                       (__be16 *)&(st->rx[i*2]));
+                                       (__be16 *)&(st->rx[j*2]));
+                       }
 
        /* Guaranteed to be aligned with 8 byte boundary */
        if (ring->scan_timestamp)