aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/iio/buffer_impl.h
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@kernel.org>2017-01-02 14:28:34 -0500
committerJonathan Cameron <jic23@kernel.org>2017-01-10 14:54:55 -0500
commit33dd94cb972175249258329c4aaffddcc82c2005 (patch)
tree5299d25ffba474a4b8f7ccbfca1e32ae26ee26c5 /include/linux/iio/buffer_impl.h
parentc56b7d80e376a00d3a29e7854359116f68ce66c5 (diff)
iio:buffer.h - split into buffer.h and buffer_impl.h
buffer.h supplies everything needed for devices using buffers. buffer_impl.h supplies access to the internals as needed to write a buffer implementation. This was really motivated by the mess that turned up in the kernel-doc documentation pulled in by the new sphinx docs. It made it clear that our logical separations in headers were generally terrible. The buffer case was easy to sort out without greatly effecting drivers so here it is. Signed-off-by: Jonathan Cameron <jic23@kernel.org> Reviewed-by: Lars-Peter Clausen <lars@metafoo.de>
Diffstat (limited to 'include/linux/iio/buffer_impl.h')
-rw-r--r--include/linux/iio/buffer_impl.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/include/linux/iio/buffer_impl.h b/include/linux/iio/buffer_impl.h
new file mode 100644
index 000000000000..8daba198fafa
--- /dev/null
+++ b/include/linux/iio/buffer_impl.h
@@ -0,0 +1,162 @@
1#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_ */