iio: Add data_available callback for buffers
authorLars-Peter Clausen <lars@metafoo.de>
Mon, 25 Nov 2013 14:56:00 +0000 (14:56 +0000)
committerJonathan Cameron <jic23@kernel.org>
Tue, 3 Dec 2013 20:22:28 +0000 (20:22 +0000)
This patch adds a new data_available() callback to the iio_buffer_access_funcs
struct. The callback is used to indicate whether data is available in the buffer
for reading. It is meant to replace the stufftoread flag from the iio_buffer
struct. The reasoning for this is that the buffer implementation usually can
determine whether data is available rather easily based on its state, on the
other hand it can be rather tricky to update the stufftoread flag in a race free
way.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/iio/industrialio-buffer.c
include/linux/iio/buffer.h

index 7f9152c3c4d3dafa61f2cac1126b1cbd50306a6e..4dcc3a0f9930535f22e5c9ed8a241fd450312a49 100644 (file)
@@ -37,6 +37,14 @@ static bool iio_buffer_is_active(struct iio_buffer *buf)
        return !list_empty(&buf->buffer_list);
 }
 
+static bool iio_buffer_data_available(struct iio_buffer *buf)
+{
+       if (buf->access->data_available)
+               return buf->access->data_available(buf);
+
+       return buf->stufftoread;
+}
+
 /**
  * iio_buffer_read_first_n_outer() - chrdev read for buffer access
  *
@@ -70,7 +78,7 @@ unsigned int iio_buffer_poll(struct file *filp,
                return -ENODEV;
 
        poll_wait(filp, &rb->pollq, wait);
-       if (rb->stufftoread)
+       if (iio_buffer_data_available(rb))
                return POLLIN | POLLRDNORM;
        /* need a way of knowing if there may be enough data... */
        return 0;
index 15607b45221a9b9c03c6fdaade48afd9a4641c9e..519392763393836664a5a147c1c28c286f9cdcdd 100644 (file)
@@ -21,6 +21,8 @@ struct iio_buffer;
  * struct iio_buffer_access_funcs - access functions for buffers.
  * @store_to:          actually store stuff to the buffer
  * @read_first_n:      try to get a specified number of bytes (must exist)
+ * @data_available:    indicates whether data for reading from the buffer is
+ *                     available.
  * @request_update:    if a parameter change has been marked, update underlying
  *                     storage.
  * @get_bytes_per_datum:get current bytes per datum
@@ -43,6 +45,7 @@ struct iio_buffer_access_funcs {
        int (*read_first_n)(struct iio_buffer *buffer,
                            size_t n,
                            char __user *buf);
+       bool (*data_available)(struct iio_buffer *buffer);
 
        int (*request_update)(struct iio_buffer *buffer);