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>
This commit is contained in:
Родитель
713bbb4efb
Коммит
182b49058e
|
@ -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));
|
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,
|
static int iio_compute_scan_bytes(struct iio_dev *indio_dev,
|
||||||
const unsigned long *mask, bool timestamp)
|
const unsigned long *mask, bool timestamp)
|
||||||
{
|
{
|
||||||
const struct iio_chan_spec *ch;
|
|
||||||
unsigned bytes = 0;
|
unsigned bytes = 0;
|
||||||
int length, i;
|
int length, i;
|
||||||
|
|
||||||
/* How much space will the demuxed element take? */
|
/* How much space will the demuxed element take? */
|
||||||
for_each_set_bit(i, mask,
|
for_each_set_bit(i, mask,
|
||||||
indio_dev->masklength) {
|
indio_dev->masklength) {
|
||||||
ch = iio_find_channel_from_si(indio_dev, i);
|
length = iio_storage_bytes_for_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;
|
|
||||||
bytes = ALIGN(bytes, length);
|
bytes = ALIGN(bytes, length);
|
||||||
bytes += length;
|
bytes += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timestamp) {
|
if (timestamp) {
|
||||||
ch = iio_find_channel_from_si(indio_dev,
|
length = iio_storage_bytes_for_timestamp(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;
|
|
||||||
bytes = ALIGN(bytes, length);
|
bytes = ALIGN(bytes, length);
|
||||||
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,
|
static int iio_buffer_update_demux(struct iio_dev *indio_dev,
|
||||||
struct iio_buffer *buffer)
|
struct iio_buffer *buffer)
|
||||||
{
|
{
|
||||||
const struct iio_chan_spec *ch;
|
|
||||||
int ret, in_ind = -1, out_ind, length;
|
int ret, in_ind = -1, out_ind, length;
|
||||||
unsigned in_loc = 0, out_loc = 0;
|
unsigned in_loc = 0, out_loc = 0;
|
||||||
struct iio_demux_table *p = NULL;
|
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,
|
in_ind = find_next_bit(indio_dev->active_scan_mask,
|
||||||
indio_dev->masklength,
|
indio_dev->masklength,
|
||||||
in_ind + 1);
|
in_ind + 1);
|
||||||
ch = iio_find_channel_from_si(indio_dev, in_ind);
|
length = iio_storage_bytes_for_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;
|
|
||||||
/* Make sure we are aligned */
|
/* Make sure we are aligned */
|
||||||
in_loc = roundup(in_loc, length) + length;
|
in_loc = roundup(in_loc, length) + length;
|
||||||
}
|
}
|
||||||
ch = iio_find_channel_from_si(indio_dev, in_ind);
|
length = iio_storage_bytes_for_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;
|
|
||||||
out_loc = roundup(out_loc, length);
|
out_loc = roundup(out_loc, length);
|
||||||
in_loc = roundup(in_loc, length);
|
in_loc = roundup(in_loc, length);
|
||||||
ret = iio_buffer_add_demux(buffer, &p, in_loc, out_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 */
|
/* Relies on scan_timestamp being last */
|
||||||
if (buffer->scan_timestamp) {
|
if (buffer->scan_timestamp) {
|
||||||
ch = iio_find_channel_from_si(indio_dev,
|
length = iio_storage_bytes_for_timestamp(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;
|
|
||||||
out_loc = roundup(out_loc, length);
|
out_loc = roundup(out_loc, length);
|
||||||
in_loc = roundup(in_loc, length);
|
in_loc = roundup(in_loc, length);
|
||||||
ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length);
|
ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче