Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 959d2952 authored by Jonathan Cameron's avatar Jonathan Cameron Committed by Greg Kroah-Hartman
Browse files

staging:iio: make iio_sw_buffer_preenable much more general.



Also introduces active_scan_mask storage to tell the core what is
really being currently captured from the device (different from
what is desired as often has bonus channels).

Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
Acked-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Tested-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 4d5f8d3d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -280,6 +280,7 @@ struct iio_info {
 * @available_scan_masks: [DRIVER] optional array of allowed bitmasks
 * @masklength:		[INTERN] the length of the mask established from
 *			channels
 * @active_scan_mask:	[INTERN] union of all scan masks requested by buffers
 * @trig:		[INTERN] current device trigger (buffer modes)
 * @pollfunc:		[DRIVER] function run on trigger being received
 * @channels:		[DRIVER] channel specification structure table
@@ -307,6 +308,7 @@ struct iio_dev {

	unsigned long			*available_scan_masks;
	unsigned			masklength;
	unsigned long			*active_scan_mask;
	struct iio_trigger		*trig;
	struct iio_poll_func		*pollfunc;

+37 −26
Original line number Diff line number Diff line
@@ -531,32 +531,6 @@ ssize_t iio_buffer_show_enable(struct device *dev,
}
EXPORT_SYMBOL(iio_buffer_show_enable);

int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
{
	struct iio_buffer *buffer = indio_dev->buffer;
	size_t size;
	dev_dbg(&indio_dev->dev, "%s\n", __func__);
	/* Check if there are any scan elements enabled, if not fail*/
	if (!(buffer->scan_count || buffer->scan_timestamp))
		return -EINVAL;
	if (buffer->scan_timestamp)
		if (buffer->scan_count)
			/* Timestamp (aligned to s64) and data */
			size = (((buffer->scan_count * buffer->bpe)
					+ sizeof(s64) - 1)
				& ~(sizeof(s64) - 1))
				+ sizeof(s64);
		else /* Timestamp only  */
			size = sizeof(s64);
	else /* Data only */
		size = buffer->scan_count * buffer->bpe;
	buffer->access->set_bytes_per_datum(buffer, size);

	return 0;
}
EXPORT_SYMBOL(iio_sw_buffer_preenable);


/* note NULL used as error indicator as it doesn't make sense. */
static unsigned long *iio_scan_mask_match(unsigned long *av_masks,
					  unsigned int masklength,
@@ -572,6 +546,43 @@ static unsigned long *iio_scan_mask_match(unsigned long *av_masks,
	return NULL;
}

int iio_sw_buffer_preenable(struct iio_dev *indio_dev)
{
	struct iio_buffer *buffer = indio_dev->buffer;
	const struct iio_chan_spec *ch;
	unsigned bytes = 0;
	int length, i;
	dev_dbg(&indio_dev->dev, "%s\n", __func__);

	/* How much space will the demuxed element take? */
	for_each_set_bit(i, buffer->scan_mask,
			 indio_dev->masklength) {
		ch = iio_find_channel_from_si(indio_dev, i);
		length = ch->scan_type.storagebits/8;
		bytes = ALIGN(bytes, length);
		bytes += length;
	}
	if (buffer->scan_timestamp) {
		ch = iio_find_channel_from_si(indio_dev,
					      buffer->scan_index_timestamp);
		length = ch->scan_type.storagebits/8;
		bytes = ALIGN(bytes, length);
		bytes += length;
	}
	buffer->access->set_bytes_per_datum(buffer, bytes);

	/* What scan mask do we actually have ?*/
	if (indio_dev->available_scan_masks)
		indio_dev->active_scan_mask =
			iio_scan_mask_match(indio_dev->available_scan_masks,
					    indio_dev->masklength,
					    buffer->scan_mask);
	else
		indio_dev->active_scan_mask = buffer->scan_mask;
	return 0;
}
EXPORT_SYMBOL(iio_sw_buffer_preenable);

/**
 * iio_scan_mask_set() - set particular bit in the scan mask
 * @buffer: the buffer whose scan mask we are interested in