Skip to content

Commit

Permalink
staging:iio:ad7298: Do not perform endianness conversion in buffered …
Browse files Browse the repository at this point in the history
…mode

For buffered mode we do not want to perform endianness conversion in the kernel,
but rather offload it to user space, since it is not always required to do a
conversion at all. It also greatly simplifies the kernel code since no
post-processing has to be done and may allow future optimizations like streaming
data directly to a storage device or over the network via DMA.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
  • Loading branch information
Lars-Peter Clausen authored and Jonathan Cameron committed Nov 19, 2012
1 parent ec04cb0 commit ca65463
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 9 deletions.
2 changes: 1 addition & 1 deletion drivers/staging/iio/adc/ad7298.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ struct ad7298_state {
* DMA (thus cache coherency maintenance) requires the
* transfer buffers to live in their own cache lines.
*/
unsigned short rx_buf[8] ____cacheline_aligned;
unsigned short rx_buf[12] ____cacheline_aligned;
unsigned short tx_buf[2];
};

Expand Down
1 change: 1 addition & 0 deletions drivers/staging/iio/adc/ad7298_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
.sign = 'u', \
.realbits = 12, \
.storagebits = 16, \
.endianness = IIO_BE, \
}, \
}

Expand Down
11 changes: 3 additions & 8 deletions drivers/staging/iio/adc/ad7298_ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,24 +76,19 @@ static irqreturn_t ad7298_trigger_handler(int irq, void *p)
struct iio_dev *indio_dev = pf->indio_dev;
struct ad7298_state *st = iio_priv(indio_dev);
s64 time_ns = 0;
__u16 buf[16];
int b_sent, i;
int b_sent;

b_sent = spi_sync(st->spi, &st->ring_msg);
if (b_sent)
goto done;

if (indio_dev->scan_timestamp) {
time_ns = iio_get_time_ns();
memcpy((u8 *)buf + indio_dev->scan_bytes - sizeof(s64),
memcpy((u8 *)st->rx_buf + indio_dev->scan_bytes - sizeof(s64),
&time_ns, sizeof(time_ns));
}

for (i = 0; i < bitmap_weight(indio_dev->active_scan_mask,
indio_dev->masklength); i++)
buf[i] = be16_to_cpu(st->rx_buf[i]);

iio_push_to_buffers(indio_dev, (u8 *)buf);
iio_push_to_buffers(indio_dev, (u8 *)st->rx_buf);

done:
iio_trigger_notify_done(indio_dev->trig);
Expand Down

0 comments on commit ca65463

Please sign in to comment.