lkml.org 
[lkml]   [2021]   [Feb]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 02/24] iio: kfifo: add devm_iio_kfifo_buffer_setup() helper
    Date
    This change adds the devm_iio_kfifo_buffer_setup() helper/short-hand,
    which groups the simple routine of allocating a kfifo buffers via
    devm_iio_kfifo_allocate() and calling iio_device_attach_buffer().

    The mode_flags parameter is required, as the IIO kfifo supports 2 modes:
    INDIO_BUFFER_SOFTWARE & INDIO_BUFFER_TRIGGERED.
    The setup_ops parameter is optional.

    This function will be a bit more useful when needing to define multiple
    buffers per IIO device.

    The naming for this function has been inspired from
    iio_triggered_buffer_setup() since that one does a kfifo alloc + a pollfunc
    alloc. So, this should have a more familiar ring to what it is.

    Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
    ---
    .../driver-api/driver-model/devres.rst | 1 +
    drivers/iio/buffer/kfifo_buf.c | 39 +++++++++++++++++++
    include/linux/iio/kfifo_buf.h | 7 ++++
    3 files changed, 47 insertions(+)

    diff --git a/Documentation/driver-api/driver-model/devres.rst b/Documentation/driver-api/driver-model/devres.rst
    index cd8b6e657b94..562f5722281e 100644
    --- a/Documentation/driver-api/driver-model/devres.rst
    +++ b/Documentation/driver-api/driver-model/devres.rst
    @@ -286,6 +286,7 @@ IIO
    devm_iio_device_alloc()
    devm_iio_device_register()
    devm_iio_kfifo_allocate()
    + devm_iio_kfifo_buffer_setup()
    devm_iio_triggered_buffer_setup()
    devm_iio_trigger_alloc()
    devm_iio_trigger_register()
    diff --git a/drivers/iio/buffer/kfifo_buf.c b/drivers/iio/buffer/kfifo_buf.c
    index 1359abed3b31..6472c9fa1937 100644
    --- a/drivers/iio/buffer/kfifo_buf.c
    +++ b/drivers/iio/buffer/kfifo_buf.c
    @@ -206,4 +206,43 @@ struct iio_buffer *devm_iio_kfifo_allocate(struct device *dev)
    }
    EXPORT_SYMBOL(devm_iio_kfifo_allocate);

    +/**
    + * devm_iio_kfifo_buffer_setup - Allocate a kfifo buffer & attach it to an IIO device
    + * @dev: Device object to which to attach the life-time of this kfifo buffer
    + * @indio_dev: The device the buffer should be attached to
    + * @mode_flags: The mode flags for this buffer (INDIO_BUFFER_SOFTWARE and/or
    + * INDIO_BUFFER_TRIGGERED).
    + * @setup_ops: The setup_ops required to configure the HW part of the buffer (optional)
    + *
    + * This function allocates a kfifo buffer via devm_iio_kfifo_allocate() and
    + * attaches it to the IIO device via iio_device_attach_buffer().
    + * This is meant to be a bit of a short-hand/helper function as there are a few
    + * drivers that seem to do this.
    + */
    +int devm_iio_kfifo_buffer_setup(struct device *dev,
    + struct iio_dev *indio_dev,
    + int mode_flags,
    + const struct iio_buffer_setup_ops *setup_ops)
    +{
    + struct iio_buffer *buffer;
    +
    + if (mode_flags)
    + mode_flags &= kfifo_access_funcs.modes;
    +
    + if (!mode_flags)
    + return -EINVAL;
    +
    + buffer = devm_iio_kfifo_allocate(dev);
    + if (!buffer)
    + return -ENOMEM;
    +
    + iio_device_attach_buffer(indio_dev, buffer);
    +
    + indio_dev->modes |= mode_flags;
    + indio_dev->setup_ops = setup_ops;
    +
    + return 0;
    +}
    +EXPORT_SYMBOL_GPL(devm_iio_kfifo_buffer_setup);
    +
    MODULE_LICENSE("GPL");
    diff --git a/include/linux/iio/kfifo_buf.h b/include/linux/iio/kfifo_buf.h
    index 1fc1efa7799d..92c411b9ac26 100644
    --- a/include/linux/iio/kfifo_buf.h
    +++ b/include/linux/iio/kfifo_buf.h
    @@ -3,6 +3,8 @@
    #define __LINUX_IIO_KFIFO_BUF_H__

    struct iio_buffer;
    +struct iio_buffer_setup_ops;
    +struct iio_dev;
    struct device;

    struct iio_buffer *iio_kfifo_allocate(void);
    @@ -10,4 +12,9 @@ void iio_kfifo_free(struct iio_buffer *r);

    struct iio_buffer *devm_iio_kfifo_allocate(struct device *dev);

    +int devm_iio_kfifo_buffer_setup(struct device *dev,
    + struct iio_dev *indio_dev,
    + int mode_flags,
    + const struct iio_buffer_setup_ops *setup_ops);
    +
    #endif
    --
    2.17.1
    \
     
     \ /
      Last update: 2021-02-15 11:42    [W:4.793 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site