Skip to content

Commit

Permalink
iio: kfifo-buffer: Add output buffer support
Browse files Browse the repository at this point in the history
Add output buffer support to the kfifo buffer implementation.

The implementation is straight forward and mostly just wraps the kfifo
API to provide the required operations.

Signed-off-by: Lars-Peter Clausen <[email protected]>
Signed-off-by: Alexandru Ardelean <[email protected]>
Signed-off-by: Mihail Chindris <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Jonathan Cameron <[email protected]>
  • Loading branch information
larsclausen authored and jic23 committed Oct 19, 2021
1 parent 9eeee3b commit 1546d67
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions drivers/iio/buffer/kfifo_buf.c
Original file line number Diff line number Diff line change
Expand Up @@ -138,10 +138,60 @@ static void iio_kfifo_buffer_release(struct iio_buffer *buffer)
kfree(kf);
}

static size_t iio_kfifo_buf_space_available(struct iio_buffer *r)
{
struct iio_kfifo *kf = iio_to_kfifo(r);
size_t avail;

mutex_lock(&kf->user_lock);
avail = kfifo_avail(&kf->kf);
mutex_unlock(&kf->user_lock);

return avail;
}

static int iio_kfifo_remove_from(struct iio_buffer *r, void *data)
{
int ret;
struct iio_kfifo *kf = iio_to_kfifo(r);

if (kfifo_size(&kf->kf) < 1)
return -EBUSY;

ret = kfifo_out(&kf->kf, data, 1);
if (ret != 1)
return -EBUSY;

wake_up_interruptible_poll(&r->pollq, EPOLLOUT | EPOLLWRNORM);

return 0;
}

static int iio_kfifo_write(struct iio_buffer *r, size_t n,
const char __user *buf)
{
struct iio_kfifo *kf = iio_to_kfifo(r);
int ret, copied;

mutex_lock(&kf->user_lock);
if (!kfifo_initialized(&kf->kf) || n < kfifo_esize(&kf->kf))
ret = -EINVAL;
else
ret = kfifo_from_user(&kf->kf, buf, n, &copied);
mutex_unlock(&kf->user_lock);
if (ret)
return ret;

return copied;
}

static const struct iio_buffer_access_funcs kfifo_access_funcs = {
.store_to = &iio_store_to_kfifo,
.read = &iio_read_kfifo,
.data_available = iio_kfifo_buf_data_available,
.remove_from = &iio_kfifo_remove_from,
.write = &iio_kfifo_write,
.space_available = &iio_kfifo_buf_space_available,
.request_update = &iio_request_update_kfifo,
.set_bytes_per_datum = &iio_set_bytes_per_datum_kfifo,
.set_length = &iio_set_length_kfifo,
Expand Down

0 comments on commit 1546d67

Please sign in to comment.