diff options
Diffstat (limited to 'drivers/staging/iio/kfifo_buf.c')
-rw-r--r-- | drivers/staging/iio/kfifo_buf.c | 78 |
1 files changed, 33 insertions, 45 deletions
diff --git a/drivers/staging/iio/kfifo_buf.c b/drivers/staging/iio/kfifo_buf.c index 6002368fdcf..e8c234bb18f 100644 --- a/drivers/staging/iio/kfifo_buf.c +++ b/drivers/staging/iio/kfifo_buf.c @@ -8,7 +8,15 @@ #include "kfifo_buf.h" -#define iio_to_kfifo(r) container_of(r, struct iio_kfifo, ring) +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) static inline int __iio_allocate_kfifo(struct iio_kfifo *buf, int bytes_per_datum, int length) @@ -16,11 +24,11 @@ static inline int __iio_allocate_kfifo(struct iio_kfifo *buf, if ((length == 0) || (bytes_per_datum == 0)) return -EINVAL; - __iio_update_ring_buffer(&buf->ring, bytes_per_datum, length); + __iio_update_buffer(&buf->buffer, bytes_per_datum, length); return kfifo_alloc(&buf->kf, bytes_per_datum*length, GFP_KERNEL); } -static int iio_request_update_kfifo(struct iio_ring_buffer *r) +static int iio_request_update_kfifo(struct iio_buffer *r) { int ret = 0; struct iio_kfifo *buf = iio_to_kfifo(r); @@ -33,14 +41,14 @@ static int iio_request_update_kfifo(struct iio_ring_buffer *r) goto error_ret; } kfifo_free(&buf->kf); - ret = __iio_allocate_kfifo(buf, buf->ring.bytes_per_datum, - buf->ring.length); + 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_ring_buffer *r) +static void iio_mark_kfifo_in_use(struct iio_buffer *r) { struct iio_kfifo *buf = iio_to_kfifo(r); mutex_lock(&buf->use_lock); @@ -48,7 +56,7 @@ static void iio_mark_kfifo_in_use(struct iio_ring_buffer *r) mutex_unlock(&buf->use_lock); } -static void iio_unmark_kfifo_in_use(struct iio_ring_buffer *r) +static void iio_unmark_kfifo_in_use(struct iio_buffer *r) { struct iio_kfifo *buf = iio_to_kfifo(r); mutex_lock(&buf->use_lock); @@ -56,7 +64,7 @@ static void iio_unmark_kfifo_in_use(struct iio_ring_buffer *r) mutex_unlock(&buf->use_lock); } -static int iio_get_length_kfifo(struct iio_ring_buffer *r) +static int iio_get_length_kfifo(struct iio_buffer *r) { return r->length; } @@ -66,9 +74,9 @@ static inline void __iio_init_kfifo(struct iio_kfifo *kf) mutex_init(&kf->use_lock); } -static IIO_RING_ENABLE_ATTR; -static IIO_RING_BYTES_PER_DATUM_ATTR; -static IIO_RING_LENGTH_ATTR; +static IIO_BUFFER_ENABLE_ATTR; +static IIO_BUFFER_BYTES_PER_DATUM_ATTR; +static IIO_BUFFER_LENGTH_ATTR; static struct attribute *iio_kfifo_attributes[] = { &dev_attr_length.attr, @@ -79,27 +87,10 @@ static struct attribute *iio_kfifo_attributes[] = { static struct attribute_group iio_kfifo_attribute_group = { .attrs = iio_kfifo_attributes, + .name = "buffer", }; -static const struct attribute_group *iio_kfifo_attribute_groups[] = { - &iio_kfifo_attribute_group, - NULL -}; - -static void iio_kfifo_release(struct device *dev) -{ - struct iio_ring_buffer *r = to_iio_ring_buffer(dev); - struct iio_kfifo *kf = iio_to_kfifo(r); - kfifo_free(&kf->kf); - kfree(kf); -} - -static struct device_type iio_kfifo_type = { - .release = iio_kfifo_release, - .groups = iio_kfifo_attribute_groups, -}; - -struct iio_ring_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev) +struct iio_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev) { struct iio_kfifo *kf; @@ -107,22 +98,20 @@ struct iio_ring_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev) if (!kf) return NULL; kf->update_needed = true; - iio_ring_buffer_init(&kf->ring, indio_dev); + iio_buffer_init(&kf->buffer, indio_dev); + kf->buffer.attrs = &iio_kfifo_attribute_group; __iio_init_kfifo(kf); - kf->ring.dev.type = &iio_kfifo_type; - kf->ring.dev.parent = &indio_dev->dev; - dev_set_drvdata(&kf->ring.dev, (void *)&(kf->ring)); - return &kf->ring; + return &kf->buffer; } EXPORT_SYMBOL(iio_kfifo_allocate); -static int iio_get_bytes_per_datum_kfifo(struct iio_ring_buffer *r) +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_ring_buffer *r, size_t bpd) +static int iio_set_bytes_per_datum_kfifo(struct iio_buffer *r, size_t bpd) { if (r->bytes_per_datum != bpd) { r->bytes_per_datum = bpd; @@ -132,14 +121,14 @@ static int iio_set_bytes_per_datum_kfifo(struct iio_ring_buffer *r, size_t bpd) return 0; } -static int iio_mark_update_needed_kfifo(struct iio_ring_buffer *r) +static int iio_mark_update_needed_kfifo(struct iio_buffer *r) { struct iio_kfifo *kf = iio_to_kfifo(r); kf->update_needed = true; return 0; } -static int iio_set_length_kfifo(struct iio_ring_buffer *r, int length) +static int iio_set_length_kfifo(struct iio_buffer *r, int length) { if (r->length != length) { r->length = length; @@ -149,14 +138,13 @@ static int iio_set_length_kfifo(struct iio_ring_buffer *r, int length) return 0; } -void iio_kfifo_free(struct iio_ring_buffer *r) +void iio_kfifo_free(struct iio_buffer *r) { - if (r) - iio_put_ring_buffer(r); + kfree(iio_to_kfifo(r)); } EXPORT_SYMBOL(iio_kfifo_free); -static int iio_store_to_kfifo(struct iio_ring_buffer *r, +static int iio_store_to_kfifo(struct iio_buffer *r, u8 *data, s64 timestamp) { @@ -175,7 +163,7 @@ static int iio_store_to_kfifo(struct iio_ring_buffer *r, return 0; } -static int iio_read_first_n_kfifo(struct iio_ring_buffer *r, +static int iio_read_first_n_kfifo(struct iio_buffer *r, size_t n, char __user *buf) { int ret, copied; @@ -186,7 +174,7 @@ static int iio_read_first_n_kfifo(struct iio_ring_buffer *r, return copied; } -const struct iio_ring_access_funcs kfifo_access_funcs = { +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, |