Merge branch 'for-linus' of git://git.open-osd.org/linux-open-osd
[cascardo/linux.git] / drivers / staging / iio / kfifo_buf.c
index d8867ab..e1e9c06 100644 (file)
@@ -11,9 +11,7 @@
 struct iio_kfifo {
        struct iio_buffer buffer;
        struct kfifo kf;
-       int use_count;
        int update_needed;
-       struct mutex use_lock;
 };
 
 #define iio_to_kfifo(r) container_of(r, struct iio_kfifo, buffer)
@@ -33,47 +31,20 @@ static int iio_request_update_kfifo(struct iio_buffer *r)
        int ret = 0;
        struct iio_kfifo *buf = iio_to_kfifo(r);
 
-       mutex_lock(&buf->use_lock);
        if (!buf->update_needed)
                goto error_ret;
-       if (buf->use_count) {
-               ret = -EAGAIN;
-               goto error_ret;
-       }
        kfifo_free(&buf->kf);
        ret = __iio_allocate_kfifo(buf, buf->buffer.bytes_per_datum,
                                   buf->buffer.length);
 error_ret:
-       mutex_unlock(&buf->use_lock);
        return ret;
 }
 
-static void iio_mark_kfifo_in_use(struct iio_buffer *r)
-{
-       struct iio_kfifo *buf = iio_to_kfifo(r);
-       mutex_lock(&buf->use_lock);
-       buf->use_count++;
-       mutex_unlock(&buf->use_lock);
-}
-
-static void iio_unmark_kfifo_in_use(struct iio_buffer *r)
-{
-       struct iio_kfifo *buf = iio_to_kfifo(r);
-       mutex_lock(&buf->use_lock);
-       buf->use_count--;
-       mutex_unlock(&buf->use_lock);
-}
-
 static int iio_get_length_kfifo(struct iio_buffer *r)
 {
        return r->length;
 }
 
-static inline void __iio_init_kfifo(struct iio_kfifo *kf)
-{
-       mutex_init(&kf->use_lock);
-}
-
 static IIO_BUFFER_ENABLE_ATTR;
 static IIO_BUFFER_LENGTH_ATTR;
 
@@ -98,7 +69,6 @@ struct iio_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev)
        kf->update_needed = true;
        iio_buffer_init(&kf->buffer);
        kf->buffer.attrs = &iio_kfifo_attribute_group;
-       __iio_init_kfifo(kf);
 
        return &kf->buffer;
 }
@@ -109,20 +79,19 @@ static int iio_get_bytes_per_datum_kfifo(struct iio_buffer *r)
        return r->bytes_per_datum;
 }
 
-static int iio_set_bytes_per_datum_kfifo(struct iio_buffer *r, size_t bpd)
+static int iio_mark_update_needed_kfifo(struct iio_buffer *r)
 {
-       if (r->bytes_per_datum != bpd) {
-               r->bytes_per_datum = bpd;
-               if (r->access->mark_param_change)
-                       r->access->mark_param_change(r);
-       }
+       struct iio_kfifo *kf = iio_to_kfifo(r);
+       kf->update_needed = true;
        return 0;
 }
 
-static int iio_mark_update_needed_kfifo(struct iio_buffer *r)
+static int iio_set_bytes_per_datum_kfifo(struct iio_buffer *r, size_t bpd)
 {
-       struct iio_kfifo *kf = iio_to_kfifo(r);
-       kf->update_needed = true;
+       if (r->bytes_per_datum != bpd) {
+               r->bytes_per_datum = bpd;
+               iio_mark_update_needed_kfifo(r);
+       }
        return 0;
 }
 
@@ -130,8 +99,7 @@ static int iio_set_length_kfifo(struct iio_buffer *r, int length)
 {
        if (r->length != length) {
                r->length = length;
-               if (r->access->mark_param_change)
-                       r->access->mark_param_change(r);
+               iio_mark_update_needed_kfifo(r);
        }
        return 0;
 }
@@ -160,17 +128,18 @@ static int iio_read_first_n_kfifo(struct iio_buffer *r,
        int ret, copied;
        struct iio_kfifo *kf = iio_to_kfifo(r);
 
-       ret = kfifo_to_user(&kf->kf, buf, r->bytes_per_datum*n, &copied);
+       if (n < r->bytes_per_datum)
+               return -EINVAL;
+
+       n = rounddown(n, r->bytes_per_datum);
+       ret = kfifo_to_user(&kf->kf, buf, n, &copied);
 
        return copied;
 }
 
 const struct iio_buffer_access_funcs kfifo_access_funcs = {
-       .mark_in_use = &iio_mark_kfifo_in_use,
-       .unmark_in_use = &iio_unmark_kfifo_in_use,
        .store_to = &iio_store_to_kfifo,
        .read_first_n = &iio_read_first_n_kfifo,
-       .mark_param_change = &iio_mark_update_needed_kfifo,
        .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,