aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/industrialio-buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iio/industrialio-buffer.c')
-rw-r--r--drivers/iio/industrialio-buffer.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index 6eee1b044c60..d7e908acb480 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -71,8 +71,9 @@ static bool iio_buffer_ready(struct iio_dev *indio_dev, struct iio_buffer *buf,
71 71
72 if (avail >= to_wait) { 72 if (avail >= to_wait) {
73 /* force a flush for non-blocking reads */ 73 /* force a flush for non-blocking reads */
74 if (!to_wait && !avail && to_flush) 74 if (!to_wait && avail < to_flush)
75 iio_buffer_flush_hwfifo(indio_dev, buf, to_flush); 75 iio_buffer_flush_hwfifo(indio_dev, buf,
76 to_flush - avail);
76 return true; 77 return true;
77 } 78 }
78 79
@@ -90,9 +91,16 @@ static bool iio_buffer_ready(struct iio_dev *indio_dev, struct iio_buffer *buf,
90 91
91/** 92/**
92 * iio_buffer_read_first_n_outer() - chrdev read for buffer access 93 * iio_buffer_read_first_n_outer() - chrdev read for buffer access
94 * @filp: File structure pointer for the char device
95 * @buf: Destination buffer for iio buffer read
96 * @n: First n bytes to read
97 * @f_ps: Long offset provided by the user as a seek position
93 * 98 *
94 * This function relies on all buffer implementations having an 99 * This function relies on all buffer implementations having an
95 * iio_buffer as their first element. 100 * iio_buffer as their first element.
101 *
102 * Return: negative values corresponding to error codes or ret != 0
103 * for ending the reading activity
96 **/ 104 **/
97ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, 105ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
98 size_t n, loff_t *f_ps) 106 size_t n, loff_t *f_ps)
@@ -100,8 +108,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
100 struct iio_dev *indio_dev = filp->private_data; 108 struct iio_dev *indio_dev = filp->private_data;
101 struct iio_buffer *rb = indio_dev->buffer; 109 struct iio_buffer *rb = indio_dev->buffer;
102 size_t datum_size; 110 size_t datum_size;
103 size_t to_wait = 0; 111 size_t to_wait;
104 size_t to_read;
105 int ret; 112 int ret;
106 113
107 if (!indio_dev->info) 114 if (!indio_dev->info)
@@ -119,14 +126,14 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
119 if (!datum_size) 126 if (!datum_size)
120 return 0; 127 return 0;
121 128
122 to_read = min_t(size_t, n / datum_size, rb->watermark); 129 if (filp->f_flags & O_NONBLOCK)
123 130 to_wait = 0;
124 if (!(filp->f_flags & O_NONBLOCK)) 131 else
125 to_wait = to_read; 132 to_wait = min_t(size_t, n / datum_size, rb->watermark);
126 133
127 do { 134 do {
128 ret = wait_event_interruptible(rb->pollq, 135 ret = wait_event_interruptible(rb->pollq,
129 iio_buffer_ready(indio_dev, rb, to_wait, to_read)); 136 iio_buffer_ready(indio_dev, rb, to_wait, n / datum_size));
130 if (ret) 137 if (ret)
131 return ret; 138 return ret;
132 139
@@ -143,6 +150,12 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
143 150
144/** 151/**
145 * iio_buffer_poll() - poll the buffer to find out if it has data 152 * iio_buffer_poll() - poll the buffer to find out if it has data
153 * @filp: File structure pointer for device access
154 * @wait: Poll table structure pointer for which the driver adds
155 * a wait queue
156 *
157 * Return: (POLLIN | POLLRDNORM) if data is available for reading
158 * or 0 for other cases
146 */ 159 */
147unsigned int iio_buffer_poll(struct file *filp, 160unsigned int iio_buffer_poll(struct file *filp,
148 struct poll_table_struct *wait) 161 struct poll_table_struct *wait)
@@ -151,7 +164,7 @@ unsigned int iio_buffer_poll(struct file *filp,
151 struct iio_buffer *rb = indio_dev->buffer; 164 struct iio_buffer *rb = indio_dev->buffer;
152 165
153 if (!indio_dev->info) 166 if (!indio_dev->info)
154 return -ENODEV; 167 return 0;
155 168
156 poll_wait(filp, &rb->pollq, wait); 169 poll_wait(filp, &rb->pollq, wait);
157 if (iio_buffer_ready(indio_dev, rb, rb->watermark, 0)) 170 if (iio_buffer_ready(indio_dev, rb, rb->watermark, 0))
@@ -1136,7 +1149,7 @@ int iio_scan_mask_query(struct iio_dev *indio_dev,
1136EXPORT_SYMBOL_GPL(iio_scan_mask_query); 1149EXPORT_SYMBOL_GPL(iio_scan_mask_query);
1137 1150
1138/** 1151/**
1139 * struct iio_demux_table() - table describing demux memcpy ops 1152 * struct iio_demux_table - table describing demux memcpy ops
1140 * @from: index to copy from 1153 * @from: index to copy from
1141 * @to: index to copy to 1154 * @to: index to copy to
1142 * @length: how many bytes to copy 1155 * @length: how many bytes to copy