Lines Matching full:buffer

6  * Handling of buffer allocation / resizing.
28 #include <linux/iio/buffer.h>
65 /* drain the buffer if it was disabled */ in iio_buffer_ready()
94 * iio_buffer_read() - chrdev read for buffer access
96 * @buf: Destination buffer for iio buffer read
100 * This function relies on all buffer implementations having an
110 struct iio_buffer *rb = ib->buffer; in iio_buffer_read()
130 * buffer, so signal end of file now. in iio_buffer_read()
179 struct iio_buffer *rb = ib->buffer; in iio_buffer_write()
227 * iio_buffer_poll() - poll the buffer to find out if it has data
239 struct iio_buffer *rb = ib->buffer; in iio_buffer_poll()
265 struct iio_buffer *rb = ib->buffer; in iio_buffer_read_wrapper()
267 /* check if buffer was opened through new API */ in iio_buffer_read_wrapper()
278 struct iio_buffer *rb = ib->buffer; in iio_buffer_write_wrapper()
280 /* check if buffer was opened through new API */ in iio_buffer_write_wrapper()
291 struct iio_buffer *rb = ib->buffer; in iio_buffer_poll_wrapper()
293 /* check if buffer was opened through new API */ in iio_buffer_poll_wrapper()
301 * iio_buffer_wakeup_poll - Wakes up the buffer waitqueue
310 struct iio_buffer *buffer; in iio_buffer_wakeup_poll() local
314 buffer = iio_dev_opaque->attached_buffers[i]; in iio_buffer_wakeup_poll()
315 wake_up(&buffer->pollq); in iio_buffer_wakeup_poll()
319 int iio_pop_from_buffer(struct iio_buffer *buffer, void *data) in iio_pop_from_buffer() argument
321 if (!buffer || !buffer->access || !buffer->access->remove_from) in iio_pop_from_buffer()
324 return buffer->access->remove_from(buffer, data); in iio_pop_from_buffer()
328 void iio_buffer_init(struct iio_buffer *buffer) in iio_buffer_init() argument
330 INIT_LIST_HEAD(&buffer->demux_list); in iio_buffer_init()
331 INIT_LIST_HEAD(&buffer->buffer_list); in iio_buffer_init()
332 init_waitqueue_head(&buffer->pollq); in iio_buffer_init()
333 kref_init(&buffer->ref); in iio_buffer_init()
334 if (!buffer->watermark) in iio_buffer_init()
335 buffer->watermark = 1; in iio_buffer_init()
342 struct iio_buffer *buffer; in iio_device_detach_buffers() local
346 buffer = iio_dev_opaque->attached_buffers[i]; in iio_device_detach_buffers()
347 iio_buffer_put(buffer); in iio_device_detach_buffers()
396 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in iio_scan_el_show() local
400 buffer->scan_mask); in iio_scan_el_show()
438 * @buffer: the buffer whose scan mask we are interested in
446 struct iio_buffer *buffer, int bit) in iio_scan_mask_set() argument
452 WARN(1, "Trying to set scanmask prior to registering buffer\n"); in iio_scan_mask_set()
459 bitmap_copy(trialmask, buffer->scan_mask, indio_dev->masklength); in iio_scan_mask_set()
472 bitmap_copy(buffer->scan_mask, trialmask, indio_dev->masklength); in iio_scan_mask_set()
483 static int iio_scan_mask_clear(struct iio_buffer *buffer, int bit) in iio_scan_mask_clear() argument
485 clear_bit(bit, buffer->scan_mask); in iio_scan_mask_clear()
490 struct iio_buffer *buffer, int bit) in iio_scan_mask_query() argument
495 if (!buffer->scan_mask) in iio_scan_mask_query()
499 return !!test_bit(bit, buffer->scan_mask); in iio_scan_mask_query()
511 struct iio_buffer *buffer = this_attr->buffer; in iio_scan_el_store() local
517 if (iio_buffer_is_active(buffer)) { in iio_scan_el_store()
521 ret = iio_scan_mask_query(indio_dev, buffer, this_attr->address); in iio_scan_el_store()
525 ret = iio_scan_mask_clear(buffer, this_attr->address); in iio_scan_el_store()
529 ret = iio_scan_mask_set(indio_dev, buffer, this_attr->address); in iio_scan_el_store()
545 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in iio_scan_el_ts_show() local
547 return sysfs_emit(buf, "%d\n", buffer->scan_timestamp); in iio_scan_el_ts_show()
557 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in iio_scan_el_ts_store() local
565 if (iio_buffer_is_active(buffer)) { in iio_scan_el_ts_store()
569 buffer->scan_timestamp = state; in iio_scan_el_ts_store()
577 struct iio_buffer *buffer, in iio_buffer_add_channel_sysfs() argument
589 buffer, in iio_buffer_add_channel_sysfs()
590 &buffer->buffer_attr_list); in iio_buffer_add_channel_sysfs()
601 buffer, in iio_buffer_add_channel_sysfs()
602 &buffer->buffer_attr_list); in iio_buffer_add_channel_sysfs()
614 buffer, in iio_buffer_add_channel_sysfs()
615 &buffer->buffer_attr_list); in iio_buffer_add_channel_sysfs()
624 buffer, in iio_buffer_add_channel_sysfs()
625 &buffer->buffer_attr_list); in iio_buffer_add_channel_sysfs()
636 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in length_show() local
638 return sysfs_emit(buf, "%d\n", buffer->length); in length_show()
645 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in length_store() local
653 if (val == buffer->length) in length_store()
657 if (iio_buffer_is_active(buffer)) { in length_store()
660 buffer->access->set_length(buffer, val); in length_store()
665 if (buffer->length && buffer->length < buffer->watermark) in length_store()
666 buffer->watermark = buffer->length; in length_store()
676 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in enable_show() local
678 return sysfs_emit(buf, "%d\n", iio_buffer_is_active(buffer)); in enable_show()
729 struct iio_buffer *buffer) in iio_buffer_activate() argument
733 iio_buffer_get(buffer); in iio_buffer_activate()
734 list_add(&buffer->buffer_list, &iio_dev_opaque->buffer_list); in iio_buffer_activate()
737 static void iio_buffer_deactivate(struct iio_buffer *buffer) in iio_buffer_deactivate() argument
739 list_del_init(&buffer->buffer_list); in iio_buffer_deactivate()
740 wake_up_interruptible(&buffer->pollq); in iio_buffer_deactivate()
741 iio_buffer_put(buffer); in iio_buffer_deactivate()
747 struct iio_buffer *buffer, *_buffer; in iio_buffer_deactivate_all() local
749 list_for_each_entry_safe(buffer, _buffer, in iio_buffer_deactivate_all()
751 iio_buffer_deactivate(buffer); in iio_buffer_deactivate_all()
754 static int iio_buffer_enable(struct iio_buffer *buffer, in iio_buffer_enable() argument
757 if (!buffer->access->enable) in iio_buffer_enable()
759 return buffer->access->enable(buffer, indio_dev); in iio_buffer_enable()
762 static int iio_buffer_disable(struct iio_buffer *buffer, in iio_buffer_disable() argument
765 if (!buffer->access->disable) in iio_buffer_disable()
767 return buffer->access->disable(buffer, indio_dev); in iio_buffer_disable()
771 struct iio_buffer *buffer) in iio_buffer_update_bytes_per_datum() argument
775 if (!buffer->access->set_bytes_per_datum) in iio_buffer_update_bytes_per_datum()
778 bytes = iio_compute_scan_bytes(indio_dev, buffer->scan_mask, in iio_buffer_update_bytes_per_datum()
779 buffer->scan_timestamp); in iio_buffer_update_bytes_per_datum()
781 buffer->access->set_bytes_per_datum(buffer, bytes); in iio_buffer_update_bytes_per_datum()
785 struct iio_buffer *buffer) in iio_buffer_request_update() argument
789 iio_buffer_update_bytes_per_datum(indio_dev, buffer); in iio_buffer_request_update()
790 if (buffer->access->request_update) { in iio_buffer_request_update()
791 ret = buffer->access->request_update(buffer); in iio_buffer_request_update()
794 "Buffer not started: buffer parameter update failed (%d)\n", in iio_buffer_request_update()
827 struct iio_buffer *buffer; in iio_verify_update() local
842 * If there is just one buffer and we are removing it there is nothing in iio_verify_update()
851 list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) { in iio_verify_update()
852 if (buffer == remove_buffer) in iio_verify_update()
854 modes &= buffer->access->modes; in iio_verify_update()
855 config->watermark = min(config->watermark, buffer->watermark); in iio_verify_update()
869 * Keep things simple for now and only allow a single buffer to in iio_verify_update()
879 /* Can only occur on first buffer */ in iio_verify_update()
881 dev_dbg(&indio_dev->dev, "Buffer not started: no trigger\n"); in iio_verify_update()
892 list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) { in iio_verify_update()
893 if (buffer == remove_buffer) in iio_verify_update()
895 bitmap_or(compound_mask, compound_mask, buffer->scan_mask, in iio_verify_update()
897 scan_timestamp |= buffer->scan_timestamp; in iio_verify_update()
940 static void iio_buffer_demux_free(struct iio_buffer *buffer) in iio_buffer_demux_free() argument
944 list_for_each_entry_safe(p, q, &buffer->demux_list, l) { in iio_buffer_demux_free()
950 static int iio_buffer_add_demux(struct iio_buffer *buffer, in iio_buffer_add_demux() argument
965 list_add_tail(&(*p)->l, &buffer->demux_list); in iio_buffer_add_demux()
972 struct iio_buffer *buffer) in iio_buffer_update_demux() argument
979 iio_buffer_demux_free(buffer); in iio_buffer_update_demux()
980 kfree(buffer->demux_bounce); in iio_buffer_update_demux()
981 buffer->demux_bounce = NULL; in iio_buffer_update_demux()
985 buffer->scan_mask, in iio_buffer_update_demux()
991 buffer->scan_mask, in iio_buffer_update_demux()
1007 ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length); in iio_buffer_update_demux()
1014 if (buffer->scan_timestamp) { in iio_buffer_update_demux()
1018 ret = iio_buffer_add_demux(buffer, &p, in_loc, out_loc, length); in iio_buffer_update_demux()
1023 buffer->demux_bounce = kzalloc(out_loc, GFP_KERNEL); in iio_buffer_update_demux()
1024 if (buffer->demux_bounce == NULL) { in iio_buffer_update_demux()
1031 iio_buffer_demux_free(buffer); in iio_buffer_update_demux()
1039 struct iio_buffer *buffer; in iio_update_demux() local
1042 list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) { in iio_update_demux()
1043 ret = iio_buffer_update_demux(indio_dev, buffer); in iio_update_demux()
1050 list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) in iio_update_demux()
1051 iio_buffer_demux_free(buffer); in iio_update_demux()
1060 struct iio_buffer *buffer, *tmp = NULL; in iio_enable_buffers() local
1075 "Buffer not started: buffer preenable failed (%d)\n", ret); in iio_enable_buffers()
1086 "Buffer not started: update scan mode failed (%d)\n", in iio_enable_buffers()
1096 list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) { in iio_enable_buffers()
1097 ret = iio_buffer_enable(buffer, indio_dev); in iio_enable_buffers()
1099 tmp = buffer; in iio_enable_buffers()
1115 "Buffer not started: postenable failed (%d)\n", ret); in iio_enable_buffers()
1128 buffer = list_prepare_entry(tmp, &iio_dev_opaque->buffer_list, buffer_list); in iio_enable_buffers()
1129 list_for_each_entry_continue_reverse(buffer, &iio_dev_opaque->buffer_list, in iio_enable_buffers()
1131 iio_buffer_disable(buffer, indio_dev); in iio_enable_buffers()
1145 struct iio_buffer *buffer; in iio_disable_buffers() local
1171 list_for_each_entry(buffer, &iio_dev_opaque->buffer_list, buffer_list) { in iio_disable_buffers()
1172 ret2 = iio_buffer_disable(buffer, indio_dev); in iio_disable_buffers()
1299 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in enable_store() local
1309 inlist = iio_buffer_is_active(buffer); in enable_store()
1315 ret = __iio_update_buffers(indio_dev, buffer, NULL); in enable_store()
1317 ret = __iio_update_buffers(indio_dev, NULL, buffer); in enable_store()
1327 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in watermark_show() local
1329 return sysfs_emit(buf, "%u\n", buffer->watermark); in watermark_show()
1337 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in watermark_store() local
1349 if (val > buffer->length) { in watermark_store()
1354 if (iio_buffer_is_active(buffer)) { in watermark_store()
1359 buffer->watermark = val; in watermark_store()
1369 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in data_available_show() local
1371 return sysfs_emit(buf, "%zu\n", iio_buffer_data_available(buffer)); in data_available_show()
1378 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in direction_show() local
1380 switch (buffer->direction) { in direction_show()
1414 static struct attribute *iio_buffer_wrap_attr(struct iio_buffer *buffer, in iio_buffer_wrap_attr() argument
1424 iio_attr->buffer = buffer; in iio_buffer_wrap_attr()
1434 list_add(&iio_attr->l, &buffer->buffer_attr_list); in iio_buffer_wrap_attr()
1457 group->name = "buffer"; in iio_buffer_register_legacy_sysfs_groups()
1502 struct iio_buffer *buffer = ib->buffer; in iio_buffer_chrdev_release() local
1504 wake_up(&buffer->pollq); in iio_buffer_chrdev_release()
1507 clear_bit(IIO_BUSY_BIT_POS, &buffer->flags); in iio_buffer_chrdev_release()
1527 struct iio_buffer *buffer; in iio_device_buffer_getfd() local
1538 buffer = iio_dev_opaque->attached_buffers[idx]; in iio_device_buffer_getfd()
1540 if (test_and_set_bit(IIO_BUSY_BIT_POS, &buffer->flags)) { in iio_device_buffer_getfd()
1552 ib->buffer = buffer; in iio_device_buffer_getfd()
1554 fd = anon_inode_getfd("iio:buffer", &iio_buffer_chrdev_fileops, in iio_device_buffer_getfd()
1580 clear_bit(IIO_BUSY_BIT_POS, &buffer->flags); in iio_device_buffer_getfd()
1597 static int __iio_buffer_alloc_sysfs_and_mask(struct iio_buffer *buffer, in __iio_buffer_alloc_sysfs_and_mask() argument
1608 if (buffer->attrs) { in __iio_buffer_alloc_sysfs_and_mask()
1609 while (buffer->attrs[buffer_attrcount] != NULL) in __iio_buffer_alloc_sysfs_and_mask()
1614 INIT_LIST_HEAD(&buffer->buffer_attr_list); in __iio_buffer_alloc_sysfs_and_mask()
1635 ret = iio_buffer_add_channel_sysfs(indio_dev, buffer, in __iio_buffer_alloc_sysfs_and_mask()
1644 if (indio_dev->masklength && buffer->scan_mask == NULL) { in __iio_buffer_alloc_sysfs_and_mask()
1645 buffer->scan_mask = bitmap_zalloc(indio_dev->masklength, in __iio_buffer_alloc_sysfs_and_mask()
1647 if (buffer->scan_mask == NULL) { in __iio_buffer_alloc_sysfs_and_mask()
1662 if (!buffer->access->set_length) in __iio_buffer_alloc_sysfs_and_mask()
1665 if (buffer->access->flags & INDIO_BUFFER_FLAG_FIXED_WATERMARK) in __iio_buffer_alloc_sysfs_and_mask()
1668 if (buffer->attrs) in __iio_buffer_alloc_sysfs_and_mask()
1669 memcpy(&attr[ARRAY_SIZE(iio_buffer_attrs)], buffer->attrs, in __iio_buffer_alloc_sysfs_and_mask()
1673 buffer->buffer_group.attrs = attr; in __iio_buffer_alloc_sysfs_and_mask()
1678 wrapped = iio_buffer_wrap_attr(buffer, attr[i]); in __iio_buffer_alloc_sysfs_and_mask()
1687 list_for_each_entry(p, &buffer->buffer_attr_list, l) in __iio_buffer_alloc_sysfs_and_mask()
1690 buffer->buffer_group.name = kasprintf(GFP_KERNEL, "buffer%d", index); in __iio_buffer_alloc_sysfs_and_mask()
1691 if (!buffer->buffer_group.name) { in __iio_buffer_alloc_sysfs_and_mask()
1696 ret = iio_device_register_sysfs_group(indio_dev, &buffer->buffer_group); in __iio_buffer_alloc_sysfs_and_mask()
1700 /* we only need to register the legacy groups for the first buffer */ in __iio_buffer_alloc_sysfs_and_mask()
1713 kfree(buffer->buffer_group.name); in __iio_buffer_alloc_sysfs_and_mask()
1715 kfree(buffer->buffer_group.attrs); in __iio_buffer_alloc_sysfs_and_mask()
1717 bitmap_free(buffer->scan_mask); in __iio_buffer_alloc_sysfs_and_mask()
1719 iio_free_chan_devattr_list(&buffer->buffer_attr_list); in __iio_buffer_alloc_sysfs_and_mask()
1724 static void __iio_buffer_free_sysfs_and_mask(struct iio_buffer *buffer, in __iio_buffer_free_sysfs_and_mask() argument
1730 bitmap_free(buffer->scan_mask); in __iio_buffer_free_sysfs_and_mask()
1731 kfree(buffer->buffer_group.name); in __iio_buffer_free_sysfs_and_mask()
1732 kfree(buffer->buffer_group.attrs); in __iio_buffer_free_sysfs_and_mask()
1733 iio_free_chan_devattr_list(&buffer->buffer_attr_list); in __iio_buffer_free_sysfs_and_mask()
1740 struct iio_buffer *buffer; in iio_buffers_alloc_sysfs_and_mask() local
1757 buffer = iio_dev_opaque->attached_buffers[idx]; in iio_buffers_alloc_sysfs_and_mask()
1758 ret = __iio_buffer_alloc_sysfs_and_mask(buffer, indio_dev, idx); in iio_buffers_alloc_sysfs_and_mask()
1778 buffer = iio_dev_opaque->attached_buffers[idx]; in iio_buffers_alloc_sysfs_and_mask()
1779 __iio_buffer_free_sysfs_and_mask(buffer, indio_dev, idx); in iio_buffers_alloc_sysfs_and_mask()
1787 struct iio_buffer *buffer; in iio_buffers_free_sysfs_and_mask() local
1797 buffer = iio_dev_opaque->attached_buffers[i]; in iio_buffers_free_sysfs_and_mask()
1798 __iio_buffer_free_sysfs_and_mask(buffer, indio_dev, i); in iio_buffers_free_sysfs_and_mask()
1818 static const void *iio_demux(struct iio_buffer *buffer, in iio_demux() argument
1823 if (list_empty(&buffer->demux_list)) in iio_demux()
1825 list_for_each_entry(t, &buffer->demux_list, l) in iio_demux()
1826 memcpy(buffer->demux_bounce + t->to, in iio_demux()
1829 return buffer->demux_bounce; in iio_demux()
1832 static int iio_push_to_buffer(struct iio_buffer *buffer, const void *data) in iio_push_to_buffer() argument
1834 const void *dataout = iio_demux(buffer, data); in iio_push_to_buffer()
1837 ret = buffer->access->store_to(buffer, dataout); in iio_push_to_buffer()
1845 wake_up_interruptible_poll(&buffer->pollq, EPOLLIN | EPOLLRDNORM); in iio_push_to_buffer()
1850 * iio_push_to_buffers() - push to a registered buffer.
1871 * iio_push_to_buffers_with_ts_unaligned() - push to registered buffer,
1892 * of either the data provided or the length of the destination buffer. in iio_push_to_buffers_with_ts_unaligned()
1917 * iio_buffer_release() - Free a buffer's resources
1920 * This function is called when the last reference to the buffer has been
1921 * dropped. It will typically free all resources allocated by the buffer. Do not
1923 * buffer.
1927 struct iio_buffer *buffer = container_of(ref, struct iio_buffer, ref); in iio_buffer_release() local
1929 buffer->access->release(buffer); in iio_buffer_release()
1933 * iio_buffer_get() - Grab a reference to the buffer
1934 * @buffer: The buffer to grab a reference for, may be NULL
1936 * Returns the pointer to the buffer that was passed into the function.
1938 struct iio_buffer *iio_buffer_get(struct iio_buffer *buffer) in iio_buffer_get() argument
1940 if (buffer) in iio_buffer_get()
1941 kref_get(&buffer->ref); in iio_buffer_get()
1943 return buffer; in iio_buffer_get()
1948 * iio_buffer_put() - Release the reference to the buffer
1949 * @buffer: The buffer to release the reference for, may be NULL
1951 void iio_buffer_put(struct iio_buffer *buffer) in iio_buffer_put() argument
1953 if (buffer) in iio_buffer_put()
1954 kref_put(&buffer->ref, iio_buffer_release); in iio_buffer_put()
1959 * iio_device_attach_buffer - Attach a buffer to a IIO device
1960 * @indio_dev: The device the buffer should be attached to
1961 * @buffer: The buffer to attach to the device
1965 * This function attaches a buffer to a IIO device. The buffer stays attached to
1967 * buffer will also be assigned to 'indio_dev->buffer'.
1972 struct iio_buffer *buffer) in iio_device_attach_buffer() argument
1985 buffer = iio_buffer_get(buffer); in iio_device_attach_buffer()
1987 /* first buffer is legacy; attach it to the IIO device directly */ in iio_device_attach_buffer()
1988 if (!indio_dev->buffer) in iio_device_attach_buffer()
1989 indio_dev->buffer = buffer; in iio_device_attach_buffer()
1991 iio_dev_opaque->attached_buffers[cnt - 1] = buffer; in iio_device_attach_buffer()