aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/iio/industrialio-buffer.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index 4dcc3a0f9930..c67d83bdc8f0 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -56,13 +56,34 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
56{ 56{
57 struct iio_dev *indio_dev = filp->private_data; 57 struct iio_dev *indio_dev = filp->private_data;
58 struct iio_buffer *rb = indio_dev->buffer; 58 struct iio_buffer *rb = indio_dev->buffer;
59 int ret;
59 60
60 if (!indio_dev->info) 61 if (!indio_dev->info)
61 return -ENODEV; 62 return -ENODEV;
62 63
63 if (!rb || !rb->access->read_first_n) 64 if (!rb || !rb->access->read_first_n)
64 return -EINVAL; 65 return -EINVAL;
65 return rb->access->read_first_n(rb, n, buf); 66
67 do {
68 if (!iio_buffer_data_available(rb)) {
69 if (filp->f_flags & O_NONBLOCK)
70 return -EAGAIN;
71
72 ret = wait_event_interruptible(rb->pollq,
73 iio_buffer_data_available(rb) ||
74 indio_dev->info == NULL);
75 if (ret)
76 return ret;
77 if (indio_dev->info == NULL)
78 return -ENODEV;
79 }
80
81 ret = rb->access->read_first_n(rb, n, buf);
82 if (ret == 0 && (filp->f_flags & O_NONBLOCK))
83 ret = -EAGAIN;
84 } while (ret == 0);
85
86 return ret;
66} 87}
67 88
68/** 89/**