14 #include <linux/slab.h>
15 #include <linux/kernel.h>
18 #include <linux/sched.h>
19 #include <linux/poll.h>
24 #include "../ring_hw.h"
58 spi_message_init(&
msg);
59 spi_message_add_tail(&xfer[0], &
msg);
60 spi_message_add_tail(&xfer[1], &
msg);
84 static int sca3000_read_first_n_hw_rb(
struct iio_buffer *
r,
88 struct iio_dev *indio_dev = hw_ring->private;
91 int ret,
i, num_available, num_read = 0;
98 if (count % bytes_per_sample) {
107 num_available = st->rx[0];
112 if (count > num_available * bytes_per_sample)
117 ret = sca3000_read_data(st,
123 for (i = 0; i < num_read; i++)
133 return ret ? ret : num_read;
137 static int sca3000_ring_get_length(
struct iio_buffer *r)
143 static int sca3000_ring_get_bytes_per_datum(
struct iio_buffer *r)
148 static IIO_BUFFER_ENABLE_ATTR;
149 static IIO_BUFFER_LENGTH_ATTR;
160 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
181 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
197 st->rx[0] | this_attr->
address);
201 st->rx[0] & ~this_attr->
address);
205 return ret ? ret : len;
209 sca3000_query_ring_int,
210 sca3000_set_ring_int,
214 sca3000_query_ring_int,
215 sca3000_set_ring_int,
222 struct iio_dev *indio_dev = dev_to_iio_dev(dev);
225 return sprintf(buf,
"0.%06d\n", 4*st->
info->scale);
230 sca3000_show_buffer_scale,
240 static struct attribute *sca3000_ring_attributes[] = {
241 &dev_attr_length.attr,
242 &dev_attr_enable.attr,
243 &iio_dev_attr_50_percent.dev_attr.attr,
244 &iio_dev_attr_75_percent.dev_attr.attr,
245 &iio_dev_attr_in_accel_scale.dev_attr.attr,
250 .attrs = sca3000_ring_attributes,
254 static struct iio_buffer *sca3000_rb_allocate(
struct iio_dev *indio_dev)
256 struct iio_buffer *
buf;
257 struct iio_hw_buffer *
ring;
263 ring->private = indio_dev;
265 buf->stufftoread = 0;
266 buf->attrs = &sca3000_ring_attr;
272 static inline void sca3000_rb_free(
struct iio_buffer *r)
277 static const struct iio_buffer_access_funcs sca3000_ring_access_funcs = {
278 .read_first_n = &sca3000_read_first_n_hw_rb,
279 .get_length = &sca3000_ring_get_length,
280 .get_bytes_per_datum = &sca3000_ring_get_bytes_per_datum,
285 indio_dev->
buffer = sca3000_rb_allocate(indio_dev);
290 indio_dev->
buffer->access = &sca3000_ring_access_funcs;
297 sca3000_rb_free(indio_dev->
buffer);
301 int __sca3000_hw_ring_state_set(
struct iio_dev *indio_dev,
bool state)
331 static int sca3000_hw_ring_preenable(
struct iio_dev *indio_dev)
333 return __sca3000_hw_ring_state_set(indio_dev, 1);
336 static int sca3000_hw_ring_postdisable(
struct iio_dev *indio_dev)
338 return __sca3000_hw_ring_state_set(indio_dev, 0);
342 .preenable = &sca3000_hw_ring_preenable,
343 .postdisable = &sca3000_hw_ring_postdisable,
348 indio_dev->
setup_ops = &sca3000_ring_setup_ops;
361 ring->stufftoread =
true;