diff options
Diffstat (limited to 'drivers/iio/industrialio-buffer.c')
-rw-r--r-- | drivers/iio/industrialio-buffer.c | 35 |
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 | **/ |
97 | ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | 105 | ssize_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 | */ |
147 | unsigned int iio_buffer_poll(struct file *filp, | 160 | unsigned 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, | |||
1136 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); | 1149 | EXPORT_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 |