10 #include <linux/slab.h>
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/device.h>
15 #include <linux/sched.h>
16 #include <linux/poll.h>
33 struct iio_buffer
buf;
42 #define iio_to_sw_ring(r) container_of(r, struct iio_sw_ring_buffer, buf)
45 int bytes_per_datum,
int length)
47 if ((length == 0) || (bytes_per_datum == 0))
49 __iio_update_buffer(&ring->
buf, bytes_per_datum, length);
71 unsigned char *temp_ptr, *change_test_ptr;
93 temp_ptr = ring->
write_p + ring->
buf.bytes_per_datum;
95 if (temp_ptr == ring->
data + ring->
buf.length*ring->
buf.bytes_per_datum)
96 temp_ptr = ring->
data;
113 change_test_ptr = ring->
read_p;
114 temp_ptr = change_test_ptr + ring->
buf.bytes_per_datum;
116 == ring->
data + ring->
buf.length*ring->
buf.bytes_per_datum) {
117 temp_ptr = ring->
data;
122 if (change_test_ptr == ring->
read_p)
129 ring->
half_p += ring->
buf.bytes_per_datum;
130 if (ring->
half_p == ring->
data + ring->
buf.length*ring->
buf.bytes_per_datum)
133 ring->
buf.stufftoread =
true;
139 static int iio_read_first_n_sw_rb(
struct iio_buffer *
r,
140 size_t n,
char __user *
buf)
144 u8 *initial_read_p, *initial_write_p, *current_read_p, *end_read_p;
146 int ret, max_copied, bytes_to_rip, dead_offset;
153 if (n % ring->
buf.bytes_per_datum) {
156 "samples: Request bytes %zd, Current bytes per datum %d\n",
157 n, ring->
buf.bytes_per_datum);
161 buffer_size = ring->
buf.bytes_per_datum*ring->
buf.length;
164 bytes_to_rip =
min_t(
size_t, buffer_size, n);
173 initial_read_p = ring->
read_p;
176 goto error_free_data_cpy;
179 initial_write_p = ring->
write_p;
182 while ((initial_read_p != ring->
read_p)
183 || (initial_write_p != ring->
write_p)) {
184 initial_read_p = ring->
read_p;
185 initial_write_p = ring->
write_p;
187 if (initial_write_p == initial_read_p) {
190 goto error_free_data_cpy;
193 if (initial_write_p >= initial_read_p)
194 data_available = initial_write_p - initial_read_p;
196 data_available = buffer_size - (initial_read_p - initial_write_p);
198 if (data_available < bytes_to_rip)
199 bytes_to_rip = data_available;
201 if (initial_read_p + bytes_to_rip >= ring->
data + buffer_size) {
202 max_copied = ring->
data + buffer_size - initial_read_p;
203 memcpy(data, initial_read_p, max_copied);
204 memcpy(data + max_copied, ring->
data, bytes_to_rip - max_copied);
205 end_read_p = ring->
data + bytes_to_rip - max_copied;
207 memcpy(data, initial_read_p, bytes_to_rip);
208 end_read_p = initial_read_p + bytes_to_rip;
213 current_read_p = ring->
read_p;
215 if (initial_read_p <= current_read_p)
216 dead_offset = current_read_p - initial_read_p;
218 dead_offset = buffer_size - (initial_read_p - current_read_p);
225 if (bytes_to_rip - dead_offset < 0) {
227 goto error_free_data_cpy;
238 while (ring->
read_p != end_read_p)
239 ring->
read_p = end_read_p;
241 ret = bytes_to_rip - dead_offset;
245 goto error_free_data_cpy;
248 if (bytes_to_rip >= ring->
buf.length*ring->
buf.bytes_per_datum/2)
249 ring->
buf.stufftoread = 0;
258 static int iio_store_to_sw_rb(
struct iio_buffer *r,
262 return iio_store_to_sw_ring(ring, data);
265 static int iio_request_update_sw_rb(
struct iio_buffer *r)
270 r->stufftoread =
false;
273 __iio_free_sw_ring_buffer(ring);
274 ret = __iio_allocate_sw_ring_buffer(ring, ring->
buf.bytes_per_datum,
280 static int iio_get_bytes_per_datum_sw_rb(
struct iio_buffer *r)
283 return ring->
buf.bytes_per_datum;
286 static int iio_mark_update_needed_sw_rb(
struct iio_buffer *r)
293 static int iio_set_bytes_per_datum_sw_rb(
struct iio_buffer *r,
size_t bpd)
295 if (r->bytes_per_datum != bpd) {
296 r->bytes_per_datum = bpd;
297 iio_mark_update_needed_sw_rb(r);
302 static int iio_get_length_sw_rb(
struct iio_buffer *r)
307 static int iio_set_length_sw_rb(
struct iio_buffer *r,
int length)
309 if (r->length != length) {
311 iio_mark_update_needed_sw_rb(r);
316 static IIO_BUFFER_ENABLE_ATTR;
317 static IIO_BUFFER_LENGTH_ATTR;
320 static struct attribute *iio_ring_attributes[] = {
321 &dev_attr_length.attr,
322 &dev_attr_enable.attr,
327 .attrs = iio_ring_attributes,
331 static const struct iio_buffer_access_funcs ring_sw_access_funcs = {
332 .store_to = &iio_store_to_sw_rb,
333 .read_first_n = &iio_read_first_n_sw_rb,
334 .request_update = &iio_request_update_sw_rb,
335 .get_bytes_per_datum = &iio_get_bytes_per_datum_sw_rb,
336 .set_bytes_per_datum = &iio_set_bytes_per_datum_sw_rb,
337 .get_length = &iio_get_length_sw_rb,
338 .set_length = &iio_set_length_sw_rb,
343 struct iio_buffer *
buf;
352 buf->attrs = &iio_ring_attribute_group;
353 buf->access = &ring_sw_access_funcs;