Commit e36db6a0 authored by Alexandru Ardelean's avatar Alexandru Ardelean Committed by Jonathan Cameron
Browse files

iio: kfifo: add devm_iio_kfifo_buffer_setup() helper



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: default avatarAlexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20210215104043.91251-3-alexandru.ardelean@analog.com


Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 0bf49ffb
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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()
+39 −0
Original line number Diff line number Diff line
@@ -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");
+7 −0
Original line number Diff line number Diff line
@@ -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