Lines Matching +full:iio +full:- +full:consumer

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright 2014-2015 Analog Devices Inc.
4 * Author: Lars-Peter Clausen <lars@metafoo.de>
10 #include <linux/dma-mapping.h>
15 #include <linux/iio/iio.h>
16 #include <linux/iio/sysfs.h>
17 #include <linux/iio/buffer.h>
18 #include <linux/iio/buffer_impl.h>
19 #include <linux/iio/buffer-dma.h>
20 #include <linux/iio/buffer-dmaengine.h>
23 * The IIO DMAengine buffer combines the generic IIO DMA buffer infrastructure
24 * with the DMAengine framework. The generic IIO DMA buffer infrastructure is
25 * used to manage the buffer memory and implement the IIO buffer operations
54 spin_lock_irqsave(&block->queue->list_lock, flags); in iio_dmaengine_buffer_block_done()
55 list_del(&block->head); in iio_dmaengine_buffer_block_done()
56 spin_unlock_irqrestore(&block->queue->list_lock, flags); in iio_dmaengine_buffer_block_done()
57 block->bytes_used -= result->residue; in iio_dmaengine_buffer_block_done()
65 iio_buffer_to_dmaengine_buffer(&queue->buffer); in iio_dmaengine_buffer_submit_block()
76 max_size = min(block->size, dmaengine_buffer->max_size); in iio_dmaengine_buffer_submit_block()
77 max_size = round_down(max_size, dmaengine_buffer->align); in iio_dmaengine_buffer_submit_block()
79 if (queue->buffer.direction == IIO_BUFFER_DIRECTION_IN) in iio_dmaengine_buffer_submit_block()
84 if (block->sg_table) { in iio_dmaengine_buffer_submit_block()
85 sgl = block->sg_table->sgl; in iio_dmaengine_buffer_submit_block()
86 nents = sg_nents_for_len(sgl, block->bytes_used); in iio_dmaengine_buffer_submit_block()
92 return -ENOMEM; in iio_dmaengine_buffer_submit_block()
94 len_total = block->bytes_used; in iio_dmaengine_buffer_submit_block()
99 len_total -= vecs[i].len; in iio_dmaengine_buffer_submit_block()
104 desc = dmaengine_prep_peripheral_dma_vec(dmaengine_buffer->chan, in iio_dmaengine_buffer_submit_block()
109 max_size = min(block->size, dmaengine_buffer->max_size); in iio_dmaengine_buffer_submit_block()
110 max_size = round_down(max_size, dmaengine_buffer->align); in iio_dmaengine_buffer_submit_block()
112 if (queue->buffer.direction == IIO_BUFFER_DIRECTION_IN) in iio_dmaengine_buffer_submit_block()
113 block->bytes_used = max_size; in iio_dmaengine_buffer_submit_block()
115 if (!block->bytes_used || block->bytes_used > max_size) in iio_dmaengine_buffer_submit_block()
116 return -EINVAL; in iio_dmaengine_buffer_submit_block()
118 desc = dmaengine_prep_slave_single(dmaengine_buffer->chan, in iio_dmaengine_buffer_submit_block()
119 block->phys_addr, in iio_dmaengine_buffer_submit_block()
120 block->bytes_used, in iio_dmaengine_buffer_submit_block()
125 return -ENOMEM; in iio_dmaengine_buffer_submit_block()
127 desc->callback_result = iio_dmaengine_buffer_block_done; in iio_dmaengine_buffer_submit_block()
128 desc->callback_param = block; in iio_dmaengine_buffer_submit_block()
134 spin_lock_irq(&dmaengine_buffer->queue.list_lock); in iio_dmaengine_buffer_submit_block()
135 list_add_tail(&block->head, &dmaengine_buffer->active); in iio_dmaengine_buffer_submit_block()
136 spin_unlock_irq(&dmaengine_buffer->queue.list_lock); in iio_dmaengine_buffer_submit_block()
138 dma_async_issue_pending(dmaengine_buffer->chan); in iio_dmaengine_buffer_submit_block()
146 iio_buffer_to_dmaengine_buffer(&queue->buffer); in iio_dmaengine_buffer_abort()
148 dmaengine_terminate_sync(dmaengine_buffer->chan); in iio_dmaengine_buffer_abort()
149 iio_dma_buffer_block_list_abort(queue, &dmaengine_buffer->active); in iio_dmaengine_buffer_abort()
157 iio_dma_buffer_release(&dmaengine_buffer->queue); in iio_dmaengine_buffer_release()
192 struct iio_buffer *buffer = to_iio_dev_attr(attr)->buffer; in iio_dmaengine_buffer_get_length_align()
196 return sysfs_emit(buf, "%zu\n", dmaengine_buffer->align); in iio_dmaengine_buffer_get_length_align()
208 * iio_dmaengine_buffer_alloc() - Allocate new buffer which uses DMAengine
211 * This allocates a new IIO buffer which internally uses the DMAengine framework
230 return ERR_PTR(-ENOMEM); in iio_dmaengine_buffer_alloc()
243 INIT_LIST_HEAD(&dmaengine_buffer->active); in iio_dmaengine_buffer_alloc()
244 dmaengine_buffer->chan = chan; in iio_dmaengine_buffer_alloc()
245 dmaengine_buffer->align = width; in iio_dmaengine_buffer_alloc()
246 dmaengine_buffer->max_size = dma_get_max_seg_size(chan->device->dev); in iio_dmaengine_buffer_alloc()
248 iio_dma_buffer_init(&dmaengine_buffer->queue, chan->device->dev, in iio_dmaengine_buffer_alloc()
251 dmaengine_buffer->queue.buffer.attrs = iio_dmaengine_buffer_attrs; in iio_dmaengine_buffer_alloc()
252 dmaengine_buffer->queue.buffer.access = &iio_dmaengine_buffer_ops; in iio_dmaengine_buffer_alloc()
254 return &dmaengine_buffer->queue.buffer; in iio_dmaengine_buffer_alloc()
258 * iio_dmaengine_buffer_free() - Free dmaengine buffer
268 iio_dma_buffer_exit(&dmaengine_buffer->queue); in iio_dmaengine_buffer_free()
273 * iio_dmaengine_buffer_teardown() - Releases DMA channel and frees buffer
283 struct dma_chan *chan = dmaengine_buffer->chan; in iio_dmaengine_buffer_teardown()
302 indio_dev->modes |= INDIO_BUFFER_HARDWARE; in __iio_dmaengine_buffer_setup_ext()
304 buffer->direction = dir; in __iio_dmaengine_buffer_setup_ext()
316 * iio_dmaengine_buffer_setup_ext() - Setup a DMA buffer for an IIO device
317 * @dev: DMA channel consumer device
318 * @indio_dev: IIO device to which to attach this buffer.
322 * This allocates a new IIO buffer with devm_iio_dmaengine_buffer_alloc()
323 * and attaches it to an IIO device with iio_device_attach_buffer().
325 * IIO device.
356 * devm_iio_dmaengine_buffer_setup_ext() - Setup a DMA buffer for an IIO device
357 * @dev: Device for devm ownership and DMA channel consumer device
358 * @indio_dev: IIO device to which to attach this buffer.
362 * This allocates a new IIO buffer with devm_iio_dmaengine_buffer_alloc()
363 * and attaches it to an IIO device with iio_device_attach_buffer().
365 * IIO device.
389 * devm_iio_dmaengine_buffer_setup_with_handle() - Setup a DMA buffer for an
390 * IIO device
392 * @indio_dev: IIO device to which to attach this buffer.
396 * This allocates a new IIO buffer with devm_iio_dmaengine_buffer_alloc()
397 * and attaches it to an IIO device with iio_device_attach_buffer().
399 * IIO device.
421 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
422 MODULE_DESCRIPTION("DMA buffer for the IIO framework");