1 #include <linux/export.h>
2 #include <linux/interrupt.h>
3 #include <linux/mutex.h>
4 #include <linux/kernel.h>
5 #include <linux/spi/spi.h>
6 #include <linux/slab.h>
8 #include <linux/iio/iio.h>
9 #include <linux/iio/buffer.h>
10 #include "../ring_sw.h"
11 #include <linux/iio/trigger_consumer.h>
15 #define ADIS_MAX_OUTPUTS 12
17 static int adis_read_buffer_data(struct adis *adis, struct iio_dev *indio_dev)
19 int n_outputs = indio_dev->num_channels;
20 struct spi_transfer xfers[ADIS_MAX_OUTPUTS + 1];
21 struct spi_message msg;
25 mutex_lock(&adis->txrx_lock);
27 spi_message_init(&msg);
29 memset(xfers, 0, sizeof(xfers));
30 for (i = 0; i <= n_outputs; i++) {
31 xfers[i].bits_per_word = 8;
32 xfers[i].cs_change = 1;
34 xfers[i].delay_usecs = adis->data->read_delay;
36 xfers[i].tx_buf = adis->tx + 2 * i;
37 adis->tx[2 * i] = indio_dev->channels[i].address;
38 adis->tx[2 * i + 1] = 0;
41 xfers[i].rx_buf = adis->rx + 2 * (i - 1);
42 spi_message_add_tail(&xfers[i], &msg);
45 ret = spi_sync(adis->spi, &msg);
47 dev_err(&adis->spi->dev, "Failed to read data: %d", ret);
49 mutex_unlock(&adis->txrx_lock);
54 static irqreturn_t adis_trigger_handler(int irq, void *p)
56 struct iio_poll_func *pf = p;
57 struct iio_dev *indio_dev = pf->indio_dev;
58 struct adis *adis = iio_device_get_drvdata(indio_dev);
62 data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL);
64 dev_err(&adis->spi->dev, "Failed to allocate memory.");
68 if (!bitmap_empty(indio_dev->active_scan_mask, indio_dev->masklength)
69 && adis_read_buffer_data(adis, indio_dev) >= 0)
70 for (; i < bitmap_weight(indio_dev->active_scan_mask,
71 indio_dev->masklength); i++)
72 data[i] = be16_to_cpup((__be16 *)&(adis->rx[i*2]));
74 /* Guaranteed to be aligned with 8 byte boundary */
75 if (indio_dev->scan_timestamp)
76 *((s64 *)(PTR_ALIGN(data, sizeof(s64)))) = pf->timestamp;
78 iio_push_to_buffers(indio_dev, (u8 *)data);
80 iio_trigger_notify_done(indio_dev->trig);
86 static const struct iio_buffer_setup_ops adis_buffer_setup_ops = {
87 .preenable = &iio_sw_buffer_preenable,
88 .postenable = &iio_triggered_buffer_postenable,
89 .predisable = &iio_triggered_buffer_predisable,
92 static int adis_buffer_setup(struct iio_dev *indio_dev,
93 irqreturn_t (*trigger_handler)(int, void *))
96 struct iio_buffer *buffer;
99 trigger_handler = &adis_trigger_handler;
101 buffer = iio_sw_rb_allocate(indio_dev);
107 indio_dev->buffer = buffer;
108 indio_dev->setup_ops = &adis_buffer_setup_ops;
110 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
117 if (indio_dev->pollfunc == NULL) {
119 goto error_iio_sw_rb_free;
122 indio_dev->modes |= INDIO_BUFFER_TRIGGERED;
125 error_iio_sw_rb_free:
126 iio_sw_rb_free(indio_dev->buffer);
130 static void adis_buffer_cleanup(struct iio_dev *indio_dev)
132 iio_dealloc_pollfunc(indio_dev->pollfunc);
133 iio_sw_rb_free(indio_dev->buffer);
137 * adis_setup_buffer_and_trigger() - Sets up buffer and trigger for the adis device
138 * @adis: The adis device.
139 * @indio_dev: The IIO device.
140 * @trigger_handler: Optional trigger handler, may be NULL.
142 * Returns 0 on success, a negative error code otherwise.
144 * This function sets up the buffer and trigger for a adis devices. If
145 * 'trigger_handler' is NULL the default trigger handler will be used. The
146 * default trigger handler will simply read the registers assigned to the
147 * currently active channels.
149 * adis_cleanup_buffer_and_trigger() should be called to free the resources
150 * allocated by this function.
152 int adis_setup_buffer_and_trigger(struct adis *adis, struct iio_dev *indio_dev,
153 irqreturn_t (*trigger_handler)(int, void *))
157 ret = adis_buffer_setup(indio_dev, trigger_handler);
161 ret = iio_buffer_register(indio_dev,
163 indio_dev->num_channels);
165 dev_err(&adis->spi->dev, "Failed to initialize buffer %d\n",
167 goto error_unreg_buffer_funcs;
170 if (adis->spi->irq) {
171 ret = adis_probe_trigger(adis, indio_dev);
173 goto error_uninitialize_buffer;
177 error_uninitialize_buffer:
178 iio_buffer_unregister(indio_dev);
179 error_unreg_buffer_funcs:
180 adis_buffer_cleanup(indio_dev);
183 EXPORT_SYMBOL_GPL(adis_setup_buffer_and_trigger);
186 * adis_cleanup_buffer_and_trigger() - Free buffer and trigger resources
187 * @adis: The adis device.
188 * @indio_dev: The IIO device.
190 * Frees resources allocated by adis_setup_buffer_and_trigger()
192 void adis_cleanup_buffer_and_trigger(struct adis *adis,
193 struct iio_dev *indio_dev)
196 adis_remove_trigger(adis);
197 iio_buffer_unregister(indio_dev);
198 adis_buffer_cleanup(indio_dev);
200 EXPORT_SYMBOL_GPL(adis_cleanup_buffer_and_trigger);