]> git.openfabrics.org - ~shefty/rdma-dev.git/commitdiff
staging:iio: add caching of the number of bytes in a scan.
authorJonathan Cameron <jic23@kernel.org>
Sat, 21 Apr 2012 09:09:35 +0000 (10:09 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 24 Apr 2012 18:23:37 +0000 (11:23 -0700)
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
12 files changed:
drivers/staging/iio/accel/adis16201_ring.c
drivers/staging/iio/accel/adis16203_ring.c
drivers/staging/iio/accel/adis16204_ring.c
drivers/staging/iio/accel/adis16209_ring.c
drivers/staging/iio/accel/adis16240_ring.c
drivers/staging/iio/accel/lis3l02dq_ring.c
drivers/staging/iio/adc/ad7606_ring.c
drivers/staging/iio/gyro/adis16260_ring.c
drivers/staging/iio/iio.h
drivers/staging/iio/iio_simple_dummy_buffer.c
drivers/staging/iio/imu/adis16400_ring.c
drivers/staging/iio/industrialio-buffer.c

index 97f9e6b159d9fa66222890817b9021ed64d77552..1370e32dead6b7780162202273e7b10efc5ce7ce 100644 (file)
@@ -66,9 +66,8 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
 
        int i = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
 
-       data = kmalloc(datasize, GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 6a8963db4f60a77fdfb0439a2b2eb416bcf96f87..86f4efb7faba0c230ecce3310bcbaef71965c91e 100644 (file)
@@ -66,9 +66,8 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p)
 
        int i = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
 
-       data = kmalloc(datasize, GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 5c8ab733886454d1eb3f075a00b98f621356f6f6..34ef11f053fb19faaa3ba8cda4679c37acccf67f 100644 (file)
@@ -63,9 +63,8 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p)
        struct iio_buffer *ring = indio_dev->buffer;
        int i = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
 
-       data = kmalloc(datasize, GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 57254b6b38b73ee46fc51dbab2f6d663fbb0f03e..1424d4896ea6e52cc70538dce8e4e52b3274c19b 100644 (file)
@@ -61,12 +61,10 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p)
        struct iio_dev *indio_dev = pf->indio_dev;
        struct adis16209_state *st = iio_priv(indio_dev);
        struct iio_buffer *ring = indio_dev->buffer;
-
        int i = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
 
-       data = kmalloc(datasize , GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 43ba84e993ade65cf23bca52f04cd24781a5af94..9ff0634e0963fe9abb6517386a6db844d5e82e27 100644 (file)
@@ -61,9 +61,8 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p)
 
        int i = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
 
-       data = kmalloc(datasize, GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 0fc3973f32ae586a4db0b102ed409cc858220ee6..3bdc1021ddd54e571e1ba39854c0954cfc6e4905 100644 (file)
@@ -137,9 +137,9 @@ static irqreturn_t lis3l02dq_trigger_handler(int irq, void *p)
        struct iio_dev *indio_dev = pf->indio_dev;
        struct iio_buffer *buffer = indio_dev->buffer;
        int len = 0;
-       size_t datasize = buffer->access->get_bytes_per_datum(buffer);
-       char *data = kmalloc(datasize, GFP_KERNEL);
+       char *data;
 
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(indio_dev->dev.parent,
                        "memory alloc failed in buffer bh");
index 1ef9fbcaf2deff77582b3e2343412b7b1b817c54..6cbf24258724421e619a7df6f8312a706c5c2d30 100644 (file)
@@ -51,8 +51,7 @@ static void ad7606_poll_bh_to_ring(struct work_struct *work_s)
        __u8 *buf;
        int ret;
 
-       buf = kzalloc(ring->access->get_bytes_per_datum(ring),
-                     GFP_KERNEL);
+       buf = kzalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (buf == NULL)
                return;
 
index 711f15122a08884dce317b454a35ef0eb78aeccf..18fc73c66596d5ba9dc94dbf546b9c2486c81988 100644 (file)
@@ -66,9 +66,8 @@ static irqreturn_t adis16260_trigger_handler(int irq, void *p)
        struct iio_buffer *ring = indio_dev->buffer;
        int i = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
 
-       data = kmalloc(datasize , GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 6832c98b3a8b46b636101227a846fb8c995d9073..7a10aed1ec9d1f51143c7f2553be093b07db8831 100644 (file)
@@ -299,6 +299,7 @@ struct iio_buffer_setup_ops {
  *                     and owner
  * @event_interface:   [INTERN] event chrdevs associated with interrupt lines
  * @buffer:            [DRIVER] any buffer present
+ * @scan_bytes:                [INTERN] num bytes captured to be fed to buffer demux
  * @mlock:             [INTERN] lock used to prevent simultaneous device state
  *                     changes
  * @available_scan_masks: [DRIVER] optional array of allowed bitmasks
@@ -335,6 +336,7 @@ struct iio_dev {
        struct iio_event_interface      *event_interface;
 
        struct iio_buffer               *buffer;
+       int                             scan_bytes;
        struct mutex                    mlock;
 
        const unsigned long             *available_scan_masks;
index bb4daf744362aaaede746176f5972497c1e5cfe3..61a26229630e862c383c2c563bea2fe917321471 100644 (file)
@@ -48,12 +48,9 @@ static irqreturn_t iio_simple_dummy_trigger_h(int irq, void *p)
        struct iio_dev *indio_dev = pf->indio_dev;
        struct iio_buffer *buffer = indio_dev->buffer;
        int len = 0;
-       /*
-        * The datasize is obtained from the buffer. It was stored when
-        * the preenable setup function was called.
-        */
-       size_t datasize = buffer->access->get_bytes_per_datum(buffer);
-       u16 *data = kmalloc(datasize, GFP_KERNEL);
+       u16 *data;
+
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL)
                return -ENOMEM;
 
index 8daa038b23e66171870034987b6fe13038437bbc..d964004fe11bd973f78d7af08e4b4176be751c95 100644 (file)
@@ -119,12 +119,12 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p)
        struct iio_buffer *ring = indio_dev->buffer;
        int i = 0, j, ret = 0;
        s16 *data;
-       size_t datasize = ring->access->get_bytes_per_datum(ring);
+
        /* Asumption that long is enough for maximum channels */
        unsigned long mask = *indio_dev->active_scan_mask;
        int scan_count = bitmap_weight(indio_dev->active_scan_mask,
                                       indio_dev->masklength);
-       data = kmalloc(datasize , GFP_KERNEL);
+       data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
        if (data == NULL) {
                dev_err(&st->us->dev, "memory alloc failed in ring bh");
                return -ENOMEM;
index 03591619c74ffbc9d73fd964b4d8e472565d60cf..f6cb0abbc643b9e6a79893ed44d9d77650016493 100644 (file)
@@ -536,13 +536,13 @@ static int iio_compute_scan_bytes(struct iio_dev *indio_dev, const long *mask,
 int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
 {
        struct iio_buffer *buffer = indio_dev->buffer;
-       unsigned bytes;
        dev_dbg(&indio_dev->dev, "%s\n", __func__);
 
        /* How much space will the demuxed element take? */
-       bytes = iio_compute_scan_bytes(indio_dev, buffer->scan_mask,
+       indio_dev->scan_bytes =
+               iio_compute_scan_bytes(indio_dev, buffer->scan_mask,
                                       buffer->scan_timestamp);
-       buffer->access->set_bytes_per_datum(buffer, bytes);
+       buffer->access->set_bytes_per_datum(buffer, indio_dev->scan_bytes);
 
        /* What scan mask do we actually have ?*/
        if (indio_dev->available_scan_masks)