|
@@ -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);
|