linux/drivers/iio/buffer/industrialio-buffer-dma.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright 2013-2015 Analog Devices Inc.
   4 *  Author: Lars-Peter Clausen <lars@metafoo.de>
   5 */
   6
   7#include <linux/slab.h>
   8#include <linux/kernel.h>
   9#include <linux/module.h>
  10#include <linux/device.h>
  11#include <linux/workqueue.h>
  12#include <linux/mutex.h>
  13#include <linux/sched.h>
  14#include <linux/poll.h>
  15#include <linux/iio/buffer.h>
  16#include <linux/iio/buffer_impl.h>
  17#include <linux/iio/buffer-dma.h>
  18#include <linux/dma-mapping.h>
  19#include <linux/sizes.h>
  20
  21/*
  22 * For DMA buffers the storage is sub-divided into so called blocks. Each block
  23 * has its own memory buffer. The size of the block is the granularity at which
  24 * memory is exchanged between the hardware and the application. Increasing the
  25 * basic unit of data exchange from one sample to one block decreases the
  26 * management overhead that is associated with each sample. E.g. if we say the
  27 * management overhead for one exchange is x and the unit of exchange is one
  28 * sample the overhead will be x for each sample. Whereas when using a block
  29 * which contains n samples the overhead per sample is reduced to x/n. This
  30 * allows to achieve much higher samplerates than what can be sustained with
  31 * the one sample approach.
  32 *
  33 * Blocks are exchanged between the DMA controller and the application via the
  34 * means of two queues. The incoming queue and the outgoing queue. Blocks on the
  35 * incoming queue are waiting for the DMA controller to pick them up and fill
  36 * them with data. Block on the outgoing queue have been filled with data and
  37 * are waiting for the application to dequeue them and read the data.
  38 *
  39 * A block can be in one of the following states:
  40 *  * Owned by the application. In this state the application can read data from
  41 *    the block.
  42 *  * On the incoming list: Blocks on the incoming list are queued up to be
  43 *    processed by the DMA controller.
  44 *  * Owned by the DMA controller: The DMA controller is processing the block
  45 *    and filling it with data.
  46 *  * On the outgoing list: Blocks on the outgoing list have been successfully
  47 *    processed by the DMA controller and contain data. They can be dequeued by
  48 *    the application.
  49 *  * Dead: A block that is dead has been marked as to be freed. It might still
  50 *    be owned by either the application or the DMA controller at the moment.
  51 *    But once they are done processing it instead of going to either the
  52 *    incoming or outgoing queue the block will be freed.
  53 *
  54 * In addition to this blocks are reference counted and the memory associated
  55 * with both the block structure as well as the storage memory for the block
  56 * will be freed when the last reference to the block is dropped. This means a
  57 * block must not be accessed without holding a reference.
  58 *
  59 * The iio_dma_buffer implementation provides a generic infrastructure for
  60 * managing the blocks.
  61 *
  62 * A driver for a specific piece of hardware that has DMA capabilities need to
  63 * implement the submit() callback from the iio_dma_buffer_ops structure. This
  64 * callback is supposed to initiate the DMA transfer copying data from the
  65 * converter to the memory region of the block. Once the DMA transfer has been
  66 * completed the driver must call iio_dma_buffer_block_done() for the completed
  67 * block.
  68 *
  69 * Prior to this it must set the bytes_used field of the block contains
  70 * the actual number of bytes in the buffer. Typically this will be equal to the
  71 * size of the block, but if the DMA hardware has certain alignment requirements
  72 * for the transfer length it might choose to use less than the full size. In
  73 * either case it is expected that bytes_used is a multiple of the bytes per
  74 * datum, i.e. the block must not contain partial samples.
  75 *
  76 * The driver must call iio_dma_buffer_block_done() for each block it has
  77 * received through its submit_block() callback, even if it does not actually
  78 * perform a DMA transfer for the block, e.g. because the buffer was disabled
  79 * before the block transfer was started. In this case it should set bytes_used
  80 * to 0.
  81 *
  82 * In addition it is recommended that a driver implements the abort() callback.
  83 * It will be called when the buffer is disabled and can be used to cancel
  84 * pending and stop active transfers.
  85 *
  86 * The specific driver implementation should use the default callback
  87 * implementations provided by this module for the iio_buffer_access_funcs
  88 * struct. It may overload some callbacks with custom variants if the hardware
  89 * has special requirements that are not handled by the generic functions. If a
  90 * driver chooses to overload a callback it has to ensure that the generic
  91 * callback is called from within the custom callback.
  92 */
  93
  94static void iio_buffer_block_release(struct kref *kref)
  95{
  96        struct iio_dma_buffer_block *block = container_of(kref,
  97                struct iio_dma_buffer_block, kref);
  98
  99        WARN_ON(block->state != IIO_BLOCK_STATE_DEAD);
 100
 101        dma_free_coherent(block->queue->dev, PAGE_ALIGN(block->size),
 102                                        block->vaddr, block->phys_addr);
 103
 104        iio_buffer_put(&block->queue->buffer);
 105        kfree(block);
 106}
 107
 108static void iio_buffer_block_get(struct iio_dma_buffer_block *block)
 109{
 110        kref_get(&block->kref);
 111}
 112
 113static void iio_buffer_block_put(struct iio_dma_buffer_block *block)
 114{
 115        kref_put(&block->kref, iio_buffer_block_release);
 116}
 117
 118/*
 119 * dma_free_coherent can sleep, hence we need to take some special care to be
 120 * able to drop a reference from an atomic context.
 121 */
 122static LIST_HEAD(iio_dma_buffer_dead_blocks);
 123static DEFINE_SPINLOCK(iio_dma_buffer_dead_blocks_lock);
 124
 125static void iio_dma_buffer_cleanup_worker(struct work_struct *work)
 126{
 127        struct iio_dma_buffer_block *block, *_block;
 128        LIST_HEAD(block_list);
 129
 130        spin_lock_irq(&iio_dma_buffer_dead_blocks_lock);
 131        list_splice_tail_init(&iio_dma_buffer_dead_blocks, &block_list);
 132        spin_unlock_irq(&iio_dma_buffer_dead_blocks_lock);
 133
 134        list_for_each_entry_safe(block, _block, &block_list, head)
 135                iio_buffer_block_release(&block->kref);
 136}
 137static DECLARE_WORK(iio_dma_buffer_cleanup_work, iio_dma_buffer_cleanup_worker);
 138
 139static void iio_buffer_block_release_atomic(struct kref *kref)
 140{
 141        struct iio_dma_buffer_block *block;
 142        unsigned long flags;
 143
 144        block = container_of(kref, struct iio_dma_buffer_block, kref);
 145
 146        spin_lock_irqsave(&iio_dma_buffer_dead_blocks_lock, flags);
 147        list_add_tail(&block->head, &iio_dma_buffer_dead_blocks);
 148        spin_unlock_irqrestore(&iio_dma_buffer_dead_blocks_lock, flags);
 149
 150        schedule_work(&iio_dma_buffer_cleanup_work);
 151}
 152
 153/*
 154 * Version of iio_buffer_block_put() that can be called from atomic context
 155 */
 156static void iio_buffer_block_put_atomic(struct iio_dma_buffer_block *block)
 157{
 158        kref_put(&block->kref, iio_buffer_block_release_atomic);
 159}
 160
 161static struct iio_dma_buffer_queue *iio_buffer_to_queue(struct iio_buffer *buf)
 162{
 163        return container_of(buf, struct iio_dma_buffer_queue, buffer);
 164}
 165
 166static struct iio_dma_buffer_block *iio_dma_buffer_alloc_block(
 167        struct iio_dma_buffer_queue *queue, size_t size)
 168{
 169        struct iio_dma_buffer_block *block;
 170
 171        block = kzalloc(sizeof(*block), GFP_KERNEL);
 172        if (!block)
 173                return NULL;
 174
 175        block->vaddr = dma_alloc_coherent(queue->dev, PAGE_ALIGN(size),
 176                &block->phys_addr, GFP_KERNEL);
 177        if (!block->vaddr) {
 178                kfree(block);
 179                return NULL;
 180        }
 181
 182        block->size = size;
 183        block->state = IIO_BLOCK_STATE_DEQUEUED;
 184        block->queue = queue;
 185        INIT_LIST_HEAD(&block->head);
 186        kref_init(&block->kref);
 187
 188        iio_buffer_get(&queue->buffer);
 189
 190        return block;
 191}
 192
 193static void _iio_dma_buffer_block_done(struct iio_dma_buffer_block *block)
 194{
 195        struct iio_dma_buffer_queue *queue = block->queue;
 196
 197        /*
 198         * The buffer has already been freed by the application, just drop the
 199         * reference.
 200         */
 201        if (block->state != IIO_BLOCK_STATE_DEAD) {
 202                block->state = IIO_BLOCK_STATE_DONE;
 203                list_add_tail(&block->head, &queue->outgoing);
 204        }
 205}
 206
 207/**
 208 * iio_dma_buffer_block_done() - Indicate that a block has been completed
 209 * @block: The completed block
 210 *
 211 * Should be called when the DMA controller has finished handling the block to
 212 * pass back ownership of the block to the queue.
 213 */
 214void iio_dma_buffer_block_done(struct iio_dma_buffer_block *block)
 215{
 216        struct iio_dma_buffer_queue *queue = block->queue;
 217        unsigned long flags;
 218
 219        spin_lock_irqsave(&queue->list_lock, flags);
 220        _iio_dma_buffer_block_done(block);
 221        spin_unlock_irqrestore(&queue->list_lock, flags);
 222
 223        iio_buffer_block_put_atomic(block);
 224        wake_up_interruptible_poll(&queue->buffer.pollq, EPOLLIN | EPOLLRDNORM);
 225}
 226EXPORT_SYMBOL_GPL(iio_dma_buffer_block_done);
 227
 228/**
 229 * iio_dma_buffer_block_list_abort() - Indicate that a list block has been
 230 *   aborted
 231 * @queue: Queue for which to complete blocks.
 232 * @list: List of aborted blocks. All blocks in this list must be from @queue.
 233 *
 234 * Typically called from the abort() callback after the DMA controller has been
 235 * stopped. This will set bytes_used to 0 for each block in the list and then
 236 * hand the blocks back to the queue.
 237 */
 238void iio_dma_buffer_block_list_abort(struct iio_dma_buffer_queue *queue,
 239        struct list_head *list)
 240{
 241        struct iio_dma_buffer_block *block, *_block;
 242        unsigned long flags;
 243
 244        spin_lock_irqsave(&queue->list_lock, flags);
 245        list_for_each_entry_safe(block, _block, list, head) {
 246                list_del(&block->head);
 247                block->bytes_used = 0;
 248                _iio_dma_buffer_block_done(block);
 249                iio_buffer_block_put_atomic(block);
 250        }
 251        spin_unlock_irqrestore(&queue->list_lock, flags);
 252
 253        wake_up_interruptible_poll(&queue->buffer.pollq, EPOLLIN | EPOLLRDNORM);
 254}
 255EXPORT_SYMBOL_GPL(iio_dma_buffer_block_list_abort);
 256
 257static bool iio_dma_block_reusable(struct iio_dma_buffer_block *block)
 258{
 259        /*
 260         * If the core owns the block it can be re-used. This should be the
 261         * default case when enabling the buffer, unless the DMA controller does
 262         * not support abort and has not given back the block yet.
 263         */
 264        switch (block->state) {
 265        case IIO_BLOCK_STATE_DEQUEUED:
 266        case IIO_BLOCK_STATE_QUEUED:
 267        case IIO_BLOCK_STATE_DONE:
 268                return true;
 269        default:
 270                return false;
 271        }
 272}
 273
 274/**
 275 * iio_dma_buffer_request_update() - DMA buffer request_update callback
 276 * @buffer: The buffer which to request an update
 277 *
 278 * Should be used as the iio_dma_buffer_request_update() callback for
 279 * iio_buffer_access_ops struct for DMA buffers.
 280 */
 281int iio_dma_buffer_request_update(struct iio_buffer *buffer)
 282{
 283        struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer);
 284        struct iio_dma_buffer_block *block;
 285        bool try_reuse = false;
 286        size_t size;
 287        int ret = 0;
 288        int i;
 289
 290        /*
 291         * Split the buffer into two even parts. This is used as a double
 292         * buffering scheme with usually one block at a time being used by the
 293         * DMA and the other one by the application.
 294         */
 295        size = DIV_ROUND_UP(queue->buffer.bytes_per_datum *
 296                queue->buffer.length, 2);
 297
 298        mutex_lock(&queue->lock);
 299
 300        /* Allocations are page aligned */
 301        if (PAGE_ALIGN(queue->fileio.block_size) == PAGE_ALIGN(size))
 302                try_reuse = true;
 303
 304        queue->fileio.block_size = size;
 305        queue->fileio.active_block = NULL;
 306
 307        spin_lock_irq(&queue->list_lock);
 308        for (i = 0; i < ARRAY_SIZE(queue->fileio.blocks); i++) {
 309                block = queue->fileio.blocks[i];
 310
 311                /* If we can't re-use it free it */
 312                if (block && (!iio_dma_block_reusable(block) || !try_reuse))
 313                        block->state = IIO_BLOCK_STATE_DEAD;
 314        }
 315
 316        /*
 317         * At this point all blocks are either owned by the core or marked as
 318         * dead. This means we can reset the lists without having to fear
 319         * corrution.
 320         */
 321        INIT_LIST_HEAD(&queue->outgoing);
 322        spin_unlock_irq(&queue->list_lock);
 323
 324        INIT_LIST_HEAD(&queue->incoming);
 325
 326        for (i = 0; i < ARRAY_SIZE(queue->fileio.blocks); i++) {
 327                if (queue->fileio.blocks[i]) {
 328                        block = queue->fileio.blocks[i];
 329                        if (block->state == IIO_BLOCK_STATE_DEAD) {
 330                                /* Could not reuse it */
 331                                iio_buffer_block_put(block);
 332                                block = NULL;
 333                        } else {
 334                                block->size = size;
 335                        }
 336                } else {
 337                        block = NULL;
 338                }
 339
 340                if (!block) {
 341                        block = iio_dma_buffer_alloc_block(queue, size);
 342                        if (!block) {
 343                                ret = -ENOMEM;
 344                                goto out_unlock;
 345                        }
 346                        queue->fileio.blocks[i] = block;
 347                }
 348
 349                block->state = IIO_BLOCK_STATE_QUEUED;
 350                list_add_tail(&block->head, &queue->incoming);
 351        }
 352
 353out_unlock:
 354        mutex_unlock(&queue->lock);
 355
 356        return ret;
 357}
 358EXPORT_SYMBOL_GPL(iio_dma_buffer_request_update);
 359
 360static void iio_dma_buffer_submit_block(struct iio_dma_buffer_queue *queue,
 361        struct iio_dma_buffer_block *block)
 362{
 363        int ret;
 364
 365        /*
 366         * If the hardware has already been removed we put the block into
 367         * limbo. It will neither be on the incoming nor outgoing list, nor will
 368         * it ever complete. It will just wait to be freed eventually.
 369         */
 370        if (!queue->ops)
 371                return;
 372
 373        block->state = IIO_BLOCK_STATE_ACTIVE;
 374        iio_buffer_block_get(block);
 375        ret = queue->ops->submit(queue, block);
 376        if (ret) {
 377                /*
 378                 * This is a bit of a problem and there is not much we can do
 379                 * other then wait for the buffer to be disabled and re-enabled
 380                 * and try again. But it should not really happen unless we run
 381                 * out of memory or something similar.
 382                 *
 383                 * TODO: Implement support in the IIO core to allow buffers to
 384                 * notify consumers that something went wrong and the buffer
 385                 * should be disabled.
 386                 */
 387                iio_buffer_block_put(block);
 388        }
 389}
 390
 391/**
 392 * iio_dma_buffer_enable() - Enable DMA buffer
 393 * @buffer: IIO buffer to enable
 394 * @indio_dev: IIO device the buffer is attached to
 395 *
 396 * Needs to be called when the device that the buffer is attached to starts
 397 * sampling. Typically should be the iio_buffer_access_ops enable callback.
 398 *
 399 * This will allocate the DMA buffers and start the DMA transfers.
 400 */
 401int iio_dma_buffer_enable(struct iio_buffer *buffer,
 402        struct iio_dev *indio_dev)
 403{
 404        struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer);
 405        struct iio_dma_buffer_block *block, *_block;
 406
 407        mutex_lock(&queue->lock);
 408        queue->active = true;
 409        list_for_each_entry_safe(block, _block, &queue->incoming, head) {
 410                list_del(&block->head);
 411                iio_dma_buffer_submit_block(queue, block);
 412        }
 413        mutex_unlock(&queue->lock);
 414
 415        return 0;
 416}
 417EXPORT_SYMBOL_GPL(iio_dma_buffer_enable);
 418
 419/**
 420 * iio_dma_buffer_disable() - Disable DMA buffer
 421 * @buffer: IIO DMA buffer to disable
 422 * @indio_dev: IIO device the buffer is attached to
 423 *
 424 * Needs to be called when the device that the buffer is attached to stops
 425 * sampling. Typically should be the iio_buffer_access_ops disable callback.
 426 */
 427int iio_dma_buffer_disable(struct iio_buffer *buffer,
 428        struct iio_dev *indio_dev)
 429{
 430        struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer);
 431
 432        mutex_lock(&queue->lock);
 433        queue->active = false;
 434
 435        if (queue->ops && queue->ops->abort)
 436                queue->ops->abort(queue);
 437        mutex_unlock(&queue->lock);
 438
 439        return 0;
 440}
 441EXPORT_SYMBOL_GPL(iio_dma_buffer_disable);
 442
 443static void iio_dma_buffer_enqueue(struct iio_dma_buffer_queue *queue,
 444        struct iio_dma_buffer_block *block)
 445{
 446        if (block->state == IIO_BLOCK_STATE_DEAD) {
 447                iio_buffer_block_put(block);
 448        } else if (queue->active) {
 449                iio_dma_buffer_submit_block(queue, block);
 450        } else {
 451                block->state = IIO_BLOCK_STATE_QUEUED;
 452                list_add_tail(&block->head, &queue->incoming);
 453        }
 454}
 455
 456static struct iio_dma_buffer_block *iio_dma_buffer_dequeue(
 457        struct iio_dma_buffer_queue *queue)
 458{
 459        struct iio_dma_buffer_block *block;
 460
 461        spin_lock_irq(&queue->list_lock);
 462        block = list_first_entry_or_null(&queue->outgoing, struct
 463                iio_dma_buffer_block, head);
 464        if (block != NULL) {
 465                list_del(&block->head);
 466                block->state = IIO_BLOCK_STATE_DEQUEUED;
 467        }
 468        spin_unlock_irq(&queue->list_lock);
 469
 470        return block;
 471}
 472
 473/**
 474 * iio_dma_buffer_read() - DMA buffer read callback
 475 * @buffer: Buffer to read form
 476 * @n: Number of bytes to read
 477 * @user_buffer: Userspace buffer to copy the data to
 478 *
 479 * Should be used as the read_first_n callback for iio_buffer_access_ops
 480 * struct for DMA buffers.
 481 */
 482int iio_dma_buffer_read(struct iio_buffer *buffer, size_t n,
 483        char __user *user_buffer)
 484{
 485        struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buffer);
 486        struct iio_dma_buffer_block *block;
 487        int ret;
 488
 489        if (n < buffer->bytes_per_datum)
 490                return -EINVAL;
 491
 492        mutex_lock(&queue->lock);
 493
 494        if (!queue->fileio.active_block) {
 495                block = iio_dma_buffer_dequeue(queue);
 496                if (block == NULL) {
 497                        ret = 0;
 498                        goto out_unlock;
 499                }
 500                queue->fileio.pos = 0;
 501                queue->fileio.active_block = block;
 502        } else {
 503                block = queue->fileio.active_block;
 504        }
 505
 506        n = rounddown(n, buffer->bytes_per_datum);
 507        if (n > block->bytes_used - queue->fileio.pos)
 508                n = block->bytes_used - queue->fileio.pos;
 509
 510        if (copy_to_user(user_buffer, block->vaddr + queue->fileio.pos, n)) {
 511                ret = -EFAULT;
 512                goto out_unlock;
 513        }
 514
 515        queue->fileio.pos += n;
 516
 517        if (queue->fileio.pos == block->bytes_used) {
 518                queue->fileio.active_block = NULL;
 519                iio_dma_buffer_enqueue(queue, block);
 520        }
 521
 522        ret = n;
 523
 524out_unlock:
 525        mutex_unlock(&queue->lock);
 526
 527        return ret;
 528}
 529EXPORT_SYMBOL_GPL(iio_dma_buffer_read);
 530
 531/**
 532 * iio_dma_buffer_data_available() - DMA buffer data_available callback
 533 * @buf: Buffer to check for data availability
 534 *
 535 * Should be used as the data_available callback for iio_buffer_access_ops
 536 * struct for DMA buffers.
 537 */
 538size_t iio_dma_buffer_data_available(struct iio_buffer *buf)
 539{
 540        struct iio_dma_buffer_queue *queue = iio_buffer_to_queue(buf);
 541        struct iio_dma_buffer_block *block;
 542        size_t data_available = 0;
 543
 544        /*
 545         * For counting the available bytes we'll use the size of the block not
 546         * the number of actual bytes available in the block. Otherwise it is
 547         * possible that we end up with a value that is lower than the watermark
 548         * but won't increase since all blocks are in use.
 549         */
 550
 551        mutex_lock(&queue->lock);
 552        if (queue->fileio.active_block)
 553                data_available += queue->fileio.active_block->size;
 554
 555        spin_lock_irq(&queue->list_lock);
 556        list_for_each_entry(block, &queue->outgoing, head)
 557                data_available += block->size;
 558        spin_unlock_irq(&queue->list_lock);
 559        mutex_unlock(&queue->lock);
 560
 561        return data_available;
 562}
 563EXPORT_SYMBOL_GPL(iio_dma_buffer_data_available);
 564
 565/**
 566 * iio_dma_buffer_set_bytes_per_datum() - DMA buffer set_bytes_per_datum callback
 567 * @buffer: Buffer to set the bytes-per-datum for
 568 * @bpd: The new bytes-per-datum value
 569 *
 570 * Should be used as the set_bytes_per_datum callback for iio_buffer_access_ops
 571 * struct for DMA buffers.
 572 */
 573int iio_dma_buffer_set_bytes_per_datum(struct iio_buffer *buffer, size_t bpd)
 574{
 575        buffer->bytes_per_datum = bpd;
 576
 577        return 0;
 578}
 579EXPORT_SYMBOL_GPL(iio_dma_buffer_set_bytes_per_datum);
 580
 581/**
 582 * iio_dma_buffer_set_length - DMA buffer set_length callback
 583 * @buffer: Buffer to set the length for
 584 * @length: The new buffer length
 585 *
 586 * Should be used as the set_length callback for iio_buffer_access_ops
 587 * struct for DMA buffers.
 588 */
 589int iio_dma_buffer_set_length(struct iio_buffer *buffer, unsigned int length)
 590{
 591        /* Avoid an invalid state */
 592        if (length < 2)
 593                length = 2;
 594        buffer->length = length;
 595        buffer->watermark = length / 2;
 596
 597        return 0;
 598}
 599EXPORT_SYMBOL_GPL(iio_dma_buffer_set_length);
 600
 601/**
 602 * iio_dma_buffer_init() - Initialize DMA buffer queue
 603 * @queue: Buffer to initialize
 604 * @dev: DMA device
 605 * @ops: DMA buffer queue callback operations
 606 *
 607 * The DMA device will be used by the queue to do DMA memory allocations. So it
 608 * should refer to the device that will perform the DMA to ensure that
 609 * allocations are done from a memory region that can be accessed by the device.
 610 */
 611int iio_dma_buffer_init(struct iio_dma_buffer_queue *queue,
 612        struct device *dev, const struct iio_dma_buffer_ops *ops)
 613{
 614        iio_buffer_init(&queue->buffer);
 615        queue->buffer.length = PAGE_SIZE;
 616        queue->buffer.watermark = queue->buffer.length / 2;
 617        queue->dev = dev;
 618        queue->ops = ops;
 619
 620        INIT_LIST_HEAD(&queue->incoming);
 621        INIT_LIST_HEAD(&queue->outgoing);
 622
 623        mutex_init(&queue->lock);
 624        spin_lock_init(&queue->list_lock);
 625
 626        return 0;
 627}
 628EXPORT_SYMBOL_GPL(iio_dma_buffer_init);
 629
 630/**
 631 * iio_dma_buffer_exit() - Cleanup DMA buffer queue
 632 * @queue: Buffer to cleanup
 633 *
 634 * After this function has completed it is safe to free any resources that are
 635 * associated with the buffer and are accessed inside the callback operations.
 636 */
 637void iio_dma_buffer_exit(struct iio_dma_buffer_queue *queue)
 638{
 639        unsigned int i;
 640
 641        mutex_lock(&queue->lock);
 642
 643        spin_lock_irq(&queue->list_lock);
 644        for (i = 0; i < ARRAY_SIZE(queue->fileio.blocks); i++) {
 645                if (!queue->fileio.blocks[i])
 646                        continue;
 647                queue->fileio.blocks[i]->state = IIO_BLOCK_STATE_DEAD;
 648        }
 649        INIT_LIST_HEAD(&queue->outgoing);
 650        spin_unlock_irq(&queue->list_lock);
 651
 652        INIT_LIST_HEAD(&queue->incoming);
 653
 654        for (i = 0; i < ARRAY_SIZE(queue->fileio.blocks); i++) {
 655                if (!queue->fileio.blocks[i])
 656                        continue;
 657                iio_buffer_block_put(queue->fileio.blocks[i]);
 658                queue->fileio.blocks[i] = NULL;
 659        }
 660        queue->fileio.active_block = NULL;
 661        queue->ops = NULL;
 662
 663        mutex_unlock(&queue->lock);
 664}
 665EXPORT_SYMBOL_GPL(iio_dma_buffer_exit);
 666
 667/**
 668 * iio_dma_buffer_release() - Release final buffer resources
 669 * @queue: Buffer to release
 670 *
 671 * Frees resources that can't yet be freed in iio_dma_buffer_exit(). Should be
 672 * called in the buffers release callback implementation right before freeing
 673 * the memory associated with the buffer.
 674 */
 675void iio_dma_buffer_release(struct iio_dma_buffer_queue *queue)
 676{
 677        mutex_destroy(&queue->lock);
 678}
 679EXPORT_SYMBOL_GPL(iio_dma_buffer_release);
 680
 681MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
 682MODULE_DESCRIPTION("DMA buffer for the IIO framework");
 683MODULE_LICENSE("GPL v2");
 684