summaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2016-02-02 16:27:24 +0100
committerJonathan Cameron <jic23@kernel.org>2016-02-06 18:21:35 +0000
commit182b49058e036573ccea37619d90fcaddc983536 (patch)
treedda1009aac923b9fc6760644980b16ab9d5bf421 /drivers/iio
parent713bbb4efb9dcda2e96c8338db1f21c68f2d822a (diff)
downloadlinux-182b49058e036573ccea37619d90fcaddc983536.tar.bz2
iio: Add helper function for calculating scan index storage size
We have the same code for computing the scan index storage size in bytes all over the place. Factor this out into helper functions. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Acked-by: Daniel Baluta <daniel.baluta@intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/industrialio-buffer.c59
1 files changed, 25 insertions, 34 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index 139ae916225f..b976332d45d3 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -512,33 +512,41 @@ static ssize_t iio_buffer_show_enable(struct device *dev,
return sprintf(buf, "%d\n", iio_buffer_is_active(indio_dev->buffer));
}
+static unsigned int iio_storage_bytes_for_si(struct iio_dev *indio_dev,
+ unsigned int scan_index)
+{
+ const struct iio_chan_spec *ch;
+ unsigned int bytes;
+
+ ch = iio_find_channel_from_si(indio_dev, scan_index);
+ bytes = ch->scan_type.storagebits / 8;
+ if (ch->scan_type.repeat > 1)
+ bytes *= ch->scan_type.repeat;
+ return bytes;
+}
+
+static unsigned int iio_storage_bytes_for_timestamp(struct iio_dev *indio_dev)
+{
+ return iio_storage_bytes_for_si(indio_dev,
+ indio_dev->scan_index_timestamp);
+}
+
static int iio_compute_scan_bytes(struct iio_dev *indio_dev,
const unsigned long *mask, bool timestamp)
{
- const struct iio_chan_spec *ch;
unsigned bytes = 0;
int length, i;
/* How much space will the demuxed element take? */
for_each_set_bit(i, mask,
indio_dev->masklength) {
- ch = iio_find_channel_from_si(indio_dev, i);
- if (ch->scan_type.repeat > 1)
- length = ch->scan_type.storagebits / 8 *
- ch->scan_type.repeat;
- else
- length = ch->scan_type.storagebits / 8;
+ length = iio_storage_bytes_for_si(indio_dev, i);
bytes = ALIGN(bytes, length);
bytes += length;
}
+
if (timestamp) {
- ch = iio_find_channel_from_si(indio_dev,
- indio_dev->scan_index_timestamp);
- if (ch->scan_type.repeat > 1)
- length = ch->scan_type.storagebits / 8 *
- ch->scan_type.repeat;
- else
- length = ch->scan_type.storagebits / 8;
+ length = iio_storage_bytes_for_timestamp(indio_dev);
bytes = ALIGN(bytes, length);
bytes += length;
}
@@ -1288,7 +1296,6 @@ static int iio_buffer_add_demux(struct iio_buffer *buffer,
static int iio_buffer_update_demux(struct iio_dev *indio_dev,
struct iio_buffer *buffer)
{
- const struct iio_chan_spec *ch;
int ret, in_ind = -1, out_ind, length;
unsigned in_loc = 0, out_loc = 0;
struct iio_demux_table *p = NULL;
@@ -1315,21 +1322,11 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev,
in_ind = find_next_bit(indio_dev->active_scan_mask,
indio_dev->masklength,
in_ind + 1);
- ch = iio_find_channel_from_si(indio_dev, in_ind);
- if (ch->scan_type.repeat > 1)
- length = ch->scan_type.storagebits / 8 *
- ch->scan_type.repeat;
- else
- length = ch->scan_type.storagebits / 8;
+ length = iio_storage_bytes_for_si(indio_dev, in_ind);
/* Make sure we are aligned */
in_loc = roundup(in_loc, length) + length;
}
- ch = iio_find_channel_from_si(indio_dev, in_ind);
- if (ch->scan_type.repeat > 1)
- length = ch->scan_type.storagebits / 8 *
- ch->scan_type.repeat;
- else
- length = ch->scan_type.storagebits / 8;
+ length = iio_storage_bytes_for_si(indio_dev, in_ind);
out_loc = roundup(out_loc, length);
in_loc = roundup(in_loc, length);
ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length);
@@ -1340,13 +1337,7 @@ static int iio_buffer_update_demux(struct iio_dev *indio_dev,
}
/* Relies on scan_timestamp being last */
if (buffer->scan_timestamp) {
- ch = iio_find_channel_from_si(indio_dev,
- indio_dev->scan_index_timestamp);
- if (ch->scan_type.repeat > 1)
- length = ch->scan_type.storagebits / 8 *
- ch->scan_type.repeat;
- else
- length = ch->scan_type.storagebits / 8;
+ length = iio_storage_bytes_for_timestamp(indio_dev);
out_loc = roundup(out_loc, length);
in_loc = roundup(in_loc, length);
ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length);