blob: 8daba198fafa28abcc3c4d6f5feacb7552f00859 [file] [log] [blame]
Jonathan Cameron33dd94c2017-01-02 19:28:34 +00001#ifndef _IIO_BUFFER_GENERIC_IMPL_H_
2#define _IIO_BUFFER_GENERIC_IMPL_H_
3#include <linux/sysfs.h>
4#include <linux/kref.h>
5
6#ifdef CONFIG_IIO_BUFFER
7
8struct iio_dev;
9struct iio_buffer;
10
11/**
12 * INDIO_BUFFER_FLAG_FIXED_WATERMARK - Watermark level of the buffer can not be
13 * configured. It has a fixed value which will be buffer specific.
14 */
15#define INDIO_BUFFER_FLAG_FIXED_WATERMARK BIT(0)
16
17/**
18 * struct iio_buffer_access_funcs - access functions for buffers.
19 * @store_to: actually store stuff to the buffer
20 * @read_first_n: try to get a specified number of bytes (must exist)
21 * @data_available: indicates how much data is available for reading from
22 * the buffer.
23 * @request_update: if a parameter change has been marked, update underlying
24 * storage.
25 * @set_bytes_per_datum:set number of bytes per datum
26 * @set_length: set number of datums in buffer
27 * @enable: called if the buffer is attached to a device and the
28 * device starts sampling. Calls are balanced with
29 * @disable.
30 * @disable: called if the buffer is attached to a device and the
31 * device stops sampling. Calles are balanced with @enable.
32 * @release: called when the last reference to the buffer is dropped,
33 * should free all resources allocated by the buffer.
34 * @modes: Supported operating modes by this buffer type
35 * @flags: A bitmask combination of INDIO_BUFFER_FLAG_*
36 *
37 * The purpose of this structure is to make the buffer element
38 * modular as event for a given driver, different usecases may require
39 * different buffer designs (space efficiency vs speed for example).
40 *
41 * It is worth noting that a given buffer implementation may only support a
42 * small proportion of these functions. The core code 'should' cope fine with
43 * any of them not existing.
44 **/
45struct iio_buffer_access_funcs {
46 int (*store_to)(struct iio_buffer *buffer, const void *data);
47 int (*read_first_n)(struct iio_buffer *buffer,
48 size_t n,
49 char __user *buf);
50 size_t (*data_available)(struct iio_buffer *buffer);
51
52 int (*request_update)(struct iio_buffer *buffer);
53
54 int (*set_bytes_per_datum)(struct iio_buffer *buffer, size_t bpd);
55 int (*set_length)(struct iio_buffer *buffer, int length);
56
57 int (*enable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
58 int (*disable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
59
60 void (*release)(struct iio_buffer *buffer);
61
62 unsigned int modes;
63 unsigned int flags;
64};
65
66/**
67 * struct iio_buffer - general buffer structure
68 *
69 * Note that the internals of this structure should only be of interest to
70 * those writing new buffer implementations.
71 */
72struct iio_buffer {
73 /** @length: Number of datums in buffer. */
74 int length;
75
76 /** @bytes_per_datum: Size of individual datum including timestamp. */
77 int bytes_per_datum;
78
79 /**
80 * @access: Buffer access functions associated with the
81 * implementation.
82 */
83 const struct iio_buffer_access_funcs *access;
84
85 /** @scan_mask: Bitmask used in masking scan mode elements. */
86 long *scan_mask;
87
88 /** @demux_list: List of operations required to demux the scan. */
89 struct list_head demux_list;
90
91 /** @pollq: Wait queue to allow for polling on the buffer. */
92 wait_queue_head_t pollq;
93
94 /** @watermark: Number of datums to wait for poll/read. */
95 unsigned int watermark;
96
97 /* private: */
98 /*
99 * @scan_el_attrs: Control of scan elements if that scan mode
100 * control method is used.
101 */
102 struct attribute_group *scan_el_attrs;
103
104 /* @scan_timestamp: Does the scan mode include a timestamp. */
105 bool scan_timestamp;
106
107 /* @scan_el_dev_attr_list: List of scan element related attributes. */
108 struct list_head scan_el_dev_attr_list;
109
110 /* @buffer_group: Attributes of the buffer group. */
111 struct attribute_group buffer_group;
112
113 /*
114 * @scan_el_group: Attribute group for those attributes not
115 * created from the iio_chan_info array.
116 */
117 struct attribute_group scan_el_group;
118
119 /* @stufftoread: Flag to indicate new data. */
120 bool stufftoread;
121
122 /* @attrs: Standard attributes of the buffer. */
123 const struct attribute **attrs;
124
125 /* @demux_bounce: Buffer for doing gather from incoming scan. */
126 void *demux_bounce;
127
128 /* @buffer_list: Entry in the devices list of current buffers. */
129 struct list_head buffer_list;
130
131 /* @ref: Reference count of the buffer. */
132 struct kref ref;
133};
134
135/**
136 * iio_update_buffers() - add or remove buffer from active list
137 * @indio_dev: device to add buffer to
138 * @insert_buffer: buffer to insert
139 * @remove_buffer: buffer_to_remove
140 *
141 * Note this will tear down the all buffering and build it up again
142 */
143int iio_update_buffers(struct iio_dev *indio_dev,
144 struct iio_buffer *insert_buffer,
145 struct iio_buffer *remove_buffer);
146
147/**
148 * iio_buffer_init() - Initialize the buffer structure
149 * @buffer: buffer to be initialized
150 **/
151void iio_buffer_init(struct iio_buffer *buffer);
152
153struct iio_buffer *iio_buffer_get(struct iio_buffer *buffer);
154void iio_buffer_put(struct iio_buffer *buffer);
155
156#else /* CONFIG_IIO_BUFFER */
157
158static inline void iio_buffer_get(struct iio_buffer *buffer) {}
159static inline void iio_buffer_put(struct iio_buffer *buffer) {}
160
161#endif /* CONFIG_IIO_BUFFER */
162#endif /* _IIO_BUFFER_GENERIC_IMPL_H_ */