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

Commit c6f67a1f authored by Octavian Purdila's avatar Octavian Purdila Committed by Jonathan Cameron
Browse files

iio: allow userspace to flush the hwfifo with non-blocking reads



This patch changes the semantics of non-blocking reads so that a
hardware fifo flush is triggered if the available data in the device
buffer is less then the requested size.

This allows userspace to accurately generate hardware fifo flushes, by
doing a non-blocking read with a size greater then the sum of the
device buffer and hardware fifo size.

Signed-off-by: default avatarOctavian Purdila <octavian.purdila@intel.com>
Reviewed-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent e20008ed
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -71,8 +71,9 @@ static bool iio_buffer_ready(struct iio_dev *indio_dev, struct iio_buffer *buf,

	if (avail >= to_wait) {
		/* force a flush for non-blocking reads */
		if (!to_wait && !avail && to_flush)
			iio_buffer_flush_hwfifo(indio_dev, buf, to_flush);
		if (!to_wait && avail < to_flush)
			iio_buffer_flush_hwfifo(indio_dev, buf,
						to_flush - avail);
		return true;
	}

@@ -100,8 +101,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
	struct iio_dev *indio_dev = filp->private_data;
	struct iio_buffer *rb = indio_dev->buffer;
	size_t datum_size;
	size_t to_wait = 0;
	size_t to_read;
	size_t to_wait;
	int ret;

	if (!indio_dev->info)
@@ -119,14 +119,14 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
	if (!datum_size)
		return 0;

	to_read = min_t(size_t, n / datum_size, rb->watermark);

	if (!(filp->f_flags & O_NONBLOCK))
		to_wait = to_read;
	if (filp->f_flags & O_NONBLOCK)
		to_wait = 0;
	else
		to_wait = min_t(size_t, n / datum_size, rb->watermark);

	do {
		ret = wait_event_interruptible(rb->pollq,
			iio_buffer_ready(indio_dev, rb, to_wait, to_read));
		      iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size));
		if (ret)
			return ret;