aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorLars-Peter Clausen <lars@metafoo.de>2014-11-26 12:55:15 -0500
committerJonathan Cameron <jic23@kernel.org>2014-12-12 07:28:33 -0500
commit08e7e0adaa17205f86894157d86c4bee3c714330 (patch)
tree15d98c47f3eafdf539e8921c7cda4571eb9a67c3 /drivers/iio
parentd967cb6bd4e79c0cd7b150f1382d3d04e00408a0 (diff)
iio: buffer: Allocate standard attributes in the core
All buffers want at least the length and the enable attribute. Move the creation of those attributes to the core instead of having to do this in each individual buffer implementation. This allows us to get rid of some boiler-plate code. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/industrialio-buffer.c59
-rw-r--r--drivers/iio/kfifo_buf.c15
2 files changed, 41 insertions, 33 deletions
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c
index 8cd89eb269c5..ba89357fc096 100644
--- a/drivers/iio/industrialio-buffer.c
+++ b/drivers/iio/industrialio-buffer.c
@@ -383,9 +383,9 @@ static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev,
383 return ret; 383 return ret;
384} 384}
385 385
386ssize_t iio_buffer_read_length(struct device *dev, 386static ssize_t iio_buffer_read_length(struct device *dev,
387 struct device_attribute *attr, 387 struct device_attribute *attr,
388 char *buf) 388 char *buf)
389{ 389{
390 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 390 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
391 struct iio_buffer *buffer = indio_dev->buffer; 391 struct iio_buffer *buffer = indio_dev->buffer;
@@ -396,12 +396,10 @@ ssize_t iio_buffer_read_length(struct device *dev,
396 396
397 return 0; 397 return 0;
398} 398}
399EXPORT_SYMBOL(iio_buffer_read_length);
400 399
401ssize_t iio_buffer_write_length(struct device *dev, 400static ssize_t iio_buffer_write_length(struct device *dev,
402 struct device_attribute *attr, 401 struct device_attribute *attr,
403 const char *buf, 402 const char *buf, size_t len)
404 size_t len)
405{ 403{
406 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 404 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
407 struct iio_buffer *buffer = indio_dev->buffer; 405 struct iio_buffer *buffer = indio_dev->buffer;
@@ -428,16 +426,14 @@ ssize_t iio_buffer_write_length(struct device *dev,
428 426
429 return ret ? ret : len; 427 return ret ? ret : len;
430} 428}
431EXPORT_SYMBOL(iio_buffer_write_length);
432 429
433ssize_t iio_buffer_show_enable(struct device *dev, 430static ssize_t iio_buffer_show_enable(struct device *dev,
434 struct device_attribute *attr, 431 struct device_attribute *attr,
435 char *buf) 432 char *buf)
436{ 433{
437 struct iio_dev *indio_dev = dev_to_iio_dev(dev); 434 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
438 return sprintf(buf, "%d\n", iio_buffer_is_active(indio_dev->buffer)); 435 return sprintf(buf, "%d\n", iio_buffer_is_active(indio_dev->buffer));
439} 436}
440EXPORT_SYMBOL(iio_buffer_show_enable);
441 437
442static int iio_compute_scan_bytes(struct iio_dev *indio_dev, 438static int iio_compute_scan_bytes(struct iio_dev *indio_dev,
443 const unsigned long *mask, bool timestamp) 439 const unsigned long *mask, bool timestamp)
@@ -724,10 +720,10 @@ out_unlock:
724} 720}
725EXPORT_SYMBOL_GPL(iio_update_buffers); 721EXPORT_SYMBOL_GPL(iio_update_buffers);
726 722
727ssize_t iio_buffer_store_enable(struct device *dev, 723static ssize_t iio_buffer_store_enable(struct device *dev,
728 struct device_attribute *attr, 724 struct device_attribute *attr,
729 const char *buf, 725 const char *buf,
730 size_t len) 726 size_t len)
731{ 727{
732 int ret; 728 int ret;
733 bool requested_state; 729 bool requested_state;
@@ -759,10 +755,14 @@ done:
759 mutex_unlock(&indio_dev->mlock); 755 mutex_unlock(&indio_dev->mlock);
760 return (ret < 0) ? ret : len; 756 return (ret < 0) ? ret : len;
761} 757}
762EXPORT_SYMBOL(iio_buffer_store_enable);
763 758
764static const char * const iio_scan_elements_group_name = "scan_elements"; 759static const char * const iio_scan_elements_group_name = "scan_elements";
765 760
761static DEVICE_ATTR(length, S_IRUGO | S_IWUSR, iio_buffer_read_length,
762 iio_buffer_write_length);
763static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR,
764 iio_buffer_show_enable, iio_buffer_store_enable);
765
766int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev) 766int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
767{ 767{
768 struct iio_dev_attr *p; 768 struct iio_dev_attr *p;
@@ -774,6 +774,27 @@ int iio_buffer_alloc_sysfs_and_mask(struct iio_dev *indio_dev)
774 if (!buffer) 774 if (!buffer)
775 return 0; 775 return 0;
776 776
777 attrcount = 0;
778 if (buffer->attrs) {
779 while (buffer->attrs[attrcount] != NULL)
780 attrcount++;
781 }
782
783 buffer->buffer_group.name = "buffer";
784 buffer->buffer_group.attrs = kcalloc(attrcount + 3,
785 sizeof(*buffer->buffer_group.attrs), GFP_KERNEL);
786 if (!buffer->buffer_group.attrs)
787 return -ENOMEM;
788
789 buffer->buffer_group.attrs[0] = &dev_attr_length.attr;
790 buffer->buffer_group.attrs[1] = &dev_attr_enable.attr;
791 if (buffer->attrs)
792 memcpy(&buffer->buffer_group.attrs[2], buffer->attrs,
793 sizeof(*&buffer->buffer_group.attrs) * (attrcount - 2));
794 buffer->buffer_group.attrs[attrcount+2] = NULL;
795
796 indio_dev->groups[indio_dev->groupcounter++] = &buffer->buffer_group;
797
777 if (buffer->scan_el_attrs != NULL) { 798 if (buffer->scan_el_attrs != NULL) {
778 attr = buffer->scan_el_attrs->attrs; 799 attr = buffer->scan_el_attrs->attrs;
779 while (*attr++ != NULL) 800 while (*attr++ != NULL)
@@ -838,6 +859,7 @@ error_free_scan_mask:
838 kfree(buffer->scan_mask); 859 kfree(buffer->scan_mask);
839error_cleanup_dynamic: 860error_cleanup_dynamic:
840 iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list); 861 iio_free_chan_devattr_list(&buffer->scan_el_dev_attr_list);
862 kfree(indio_dev->buffer->buffer_group.attrs);
841 863
842 return ret; 864 return ret;
843} 865}
@@ -848,6 +870,7 @@ void iio_buffer_free_sysfs_and_mask(struct iio_dev *indio_dev)
848 return; 870 return;
849 871
850 kfree(indio_dev->buffer->scan_mask); 872 kfree(indio_dev->buffer->scan_mask);
873 kfree(indio_dev->buffer->buffer_group.attrs);
851 kfree(indio_dev->buffer->scan_el_group.attrs); 874 kfree(indio_dev->buffer->scan_el_group.attrs);
852 iio_free_chan_devattr_list(&indio_dev->buffer->scan_el_dev_attr_list); 875 iio_free_chan_devattr_list(&indio_dev->buffer->scan_el_dev_attr_list);
853} 876}
diff --git a/drivers/iio/kfifo_buf.c b/drivers/iio/kfifo_buf.c
index 1258b4e0a722..3b0a3bc4f0ad 100644
--- a/drivers/iio/kfifo_buf.c
+++ b/drivers/iio/kfifo_buf.c
@@ -52,20 +52,6 @@ static int iio_get_length_kfifo(struct iio_buffer *r)
52 return r->length; 52 return r->length;
53} 53}
54 54
55static IIO_BUFFER_ENABLE_ATTR;
56static IIO_BUFFER_LENGTH_ATTR;
57
58static struct attribute *iio_kfifo_attributes[] = {
59 &dev_attr_length.attr,
60 &dev_attr_enable.attr,
61 NULL,
62};
63
64static struct attribute_group iio_kfifo_attribute_group = {
65 .attrs = iio_kfifo_attributes,
66 .name = "buffer",
67};
68
69static int iio_mark_update_needed_kfifo(struct iio_buffer *r) 55static int iio_mark_update_needed_kfifo(struct iio_buffer *r)
70{ 56{
71 struct iio_kfifo *kf = iio_to_kfifo(r); 57 struct iio_kfifo *kf = iio_to_kfifo(r);
@@ -169,7 +155,6 @@ struct iio_buffer *iio_kfifo_allocate(struct iio_dev *indio_dev)
169 return NULL; 155 return NULL;
170 kf->update_needed = true; 156 kf->update_needed = true;
171 iio_buffer_init(&kf->buffer); 157 iio_buffer_init(&kf->buffer);
172 kf->buffer.attrs = &iio_kfifo_attribute_group;
173 kf->buffer.access = &kfifo_access_funcs; 158 kf->buffer.access = &kfifo_access_funcs;
174 kf->buffer.length = 2; 159 kf->buffer.length = 2;
175 mutex_init(&kf->user_lock); 160 mutex_init(&kf->user_lock);