/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _IIO_BUFFER_GENERIC_IMPL_H_ #define _IIO_BUFFER_GENERIC_IMPL_H_ #include <linux/sysfs.h> #include <linux/kref.h> #ifdef CONFIG_IIO_BUFFER #include <uapi/linux/iio/buffer.h> #include <linux/iio/buffer.h> struct dma_buf_attachment; struct dma_fence; struct iio_dev; struct iio_dma_buffer_block; struct iio_buffer; struct sg_table; /** * INDIO_BUFFER_FLAG_FIXED_WATERMARK - Watermark level of the buffer can not be * configured. It has a fixed value which will be buffer specific. */ #define INDIO_BUFFER_FLAG_FIXED_WATERMARK … /** * struct iio_buffer_access_funcs - access functions for buffers. * @store_to: actually store stuff to the buffer * @read: try to get a specified number of bytes (must exist) * @data_available: indicates how much data is available for reading from * the buffer. * @remove_from: remove scan from buffer. Drivers should calls this to * remove a scan from a buffer. * @write: try to write a number of bytes * @space_available: returns the amount of bytes available in a buffer * @request_update: if a parameter change has been marked, update underlying * storage. * @set_bytes_per_datum:set number of bytes per datum * @set_length: set number of datums in buffer * @enable: called if the buffer is attached to a device and the * device starts sampling. Calls are balanced with * @disable. * @disable: called if the buffer is attached to a device and the * device stops sampling. Calles are balanced with @enable. * @release: called when the last reference to the buffer is dropped, * should free all resources allocated by the buffer. * @attach_dmabuf: called from userspace via ioctl to attach one external * DMABUF. * @detach_dmabuf: called from userspace via ioctl to detach one previously * attached DMABUF. * @enqueue_dmabuf: called from userspace via ioctl to queue this DMABUF * object to this buffer. Requires a valid DMABUF fd, that * was previouly attached to this buffer. * @lock_queue: called when the core needs to lock the buffer queue; * it is used when enqueueing DMABUF objects. * @unlock_queue: used to unlock a previously locked buffer queue * @modes: Supported operating modes by this buffer type * @flags: A bitmask combination of INDIO_BUFFER_FLAG_* * * The purpose of this structure is to make the buffer element * modular as event for a given driver, different usecases may require * different buffer designs (space efficiency vs speed for example). * * It is worth noting that a given buffer implementation may only support a * small proportion of these functions. The core code 'should' cope fine with * any of them not existing. **/ struct iio_buffer_access_funcs { … }; /** * struct iio_buffer - general buffer structure * * Note that the internals of this structure should only be of interest to * those writing new buffer implementations. */ struct iio_buffer { … }; /** * iio_update_buffers() - add or remove buffer from active list * @indio_dev: device to add buffer to * @insert_buffer: buffer to insert * @remove_buffer: buffer_to_remove * * Note this will tear down the all buffering and build it up again */ int iio_update_buffers(struct iio_dev *indio_dev, struct iio_buffer *insert_buffer, struct iio_buffer *remove_buffer); /** * iio_buffer_init() - Initialize the buffer structure * @buffer: buffer to be initialized **/ void iio_buffer_init(struct iio_buffer *buffer); struct iio_buffer *iio_buffer_get(struct iio_buffer *buffer); void iio_buffer_put(struct iio_buffer *buffer); void iio_buffer_signal_dmabuf_done(struct dma_fence *fence, int ret); #else /* CONFIG_IIO_BUFFER */ static inline void iio_buffer_get(struct iio_buffer *buffer) {} static inline void iio_buffer_put(struct iio_buffer *buffer) {} #endif /* CONFIG_IIO_BUFFER */ #endif /* _IIO_BUFFER_GENERIC_IMPL_H_ */