|
@@ -42,7 +42,6 @@ static int iio_request_update_kfifo(struct iio_buffer *r)
|
|
|
} else {
|
|
|
kfifo_reset_out(&buf->kf);
|
|
|
}
|
|
|
- r->stufftoread = false;
|
|
|
mutex_unlock(&buf->user_lock);
|
|
|
|
|
|
return ret;
|
|
@@ -108,7 +107,7 @@ static int iio_store_to_kfifo(struct iio_buffer *r,
|
|
|
ret = kfifo_in(&kf->kf, data, 1);
|
|
|
if (ret != 1)
|
|
|
return -EBUSY;
|
|
|
- r->stufftoread = true;
|
|
|
+
|
|
|
wake_up_interruptible_poll(&r->pollq, POLLIN | POLLRDNORM);
|
|
|
|
|
|
return 0;
|
|
@@ -127,13 +126,6 @@ static int iio_read_first_n_kfifo(struct iio_buffer *r,
|
|
|
ret = -EINVAL;
|
|
|
else
|
|
|
ret = kfifo_to_user(&kf->kf, buf, n, &copied);
|
|
|
-
|
|
|
- if (kfifo_is_empty(&kf->kf))
|
|
|
- r->stufftoread = false;
|
|
|
- /* verify it is still empty to avoid race */
|
|
|
- if (!kfifo_is_empty(&kf->kf))
|
|
|
- r->stufftoread = true;
|
|
|
-
|
|
|
mutex_unlock(&kf->user_lock);
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
@@ -141,6 +133,18 @@ static int iio_read_first_n_kfifo(struct iio_buffer *r,
|
|
|
return copied;
|
|
|
}
|
|
|
|
|
|
+static bool iio_kfifo_buf_data_available(struct iio_buffer *r)
|
|
|
+{
|
|
|
+ struct iio_kfifo *kf = iio_to_kfifo(r);
|
|
|
+ bool empty;
|
|
|
+
|
|
|
+ mutex_lock(&kf->user_lock);
|
|
|
+ empty = kfifo_is_empty(&kf->kf);
|
|
|
+ mutex_unlock(&kf->user_lock);
|
|
|
+
|
|
|
+ return !empty;
|
|
|
+}
|
|
|
+
|
|
|
static void iio_kfifo_buffer_release(struct iio_buffer *buffer)
|
|
|
{
|
|
|
struct iio_kfifo *kf = iio_to_kfifo(buffer);
|
|
@@ -153,6 +157,7 @@ static void iio_kfifo_buffer_release(struct iio_buffer *buffer)
|
|
|
static const struct iio_buffer_access_funcs kfifo_access_funcs = {
|
|
|
.store_to = &iio_store_to_kfifo,
|
|
|
.read_first_n = &iio_read_first_n_kfifo,
|
|
|
+ .data_available = iio_kfifo_buf_data_available,
|
|
|
.request_update = &iio_request_update_kfifo,
|
|
|
.get_bytes_per_datum = &iio_get_bytes_per_datum_kfifo,
|
|
|
.set_bytes_per_datum = &iio_set_bytes_per_datum_kfifo,
|