1 #include <linux/interrupt.h>
2 #include <linux/mutex.h>
3 #include <linux/kernel.h>
4 #include <linux/spi/spi.h>
5 #include <linux/slab.h>
6 #include <linux/bitops.h>
9 #include "../ring_sw.h"
10 #include "../trigger_consumer.h"
11 #include "adis16400.h"
14 * adis16400_spi_read_burst() - read all data registers
15 * @dev: device associated with child of actual device (iio_dev or iio_trig)
16 * @rx: somewhere to pass back the value read (min size is 24 bytes)
18 static int adis16400_spi_read_burst(struct device
*dev
, u8
*rx
)
20 struct spi_message msg
;
21 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
22 struct adis16400_state
*st
= iio_priv(indio_dev
);
23 u32 old_speed_hz
= st
->us
->max_speed_hz
;
26 struct spi_transfer xfers
[] = {
38 mutex_lock(&st
->buf_lock
);
39 st
->tx
[0] = ADIS16400_READ_REG(ADIS16400_GLOB_CMD
);
42 spi_message_init(&msg
);
43 spi_message_add_tail(&xfers
[0], &msg
);
44 spi_message_add_tail(&xfers
[1], &msg
);
46 st
->us
->max_speed_hz
= min(ADIS16400_SPI_BURST
, old_speed_hz
);
49 ret
= spi_sync(st
->us
, &msg
);
51 dev_err(&st
->us
->dev
, "problem when burst reading");
53 st
->us
->max_speed_hz
= old_speed_hz
;
55 mutex_unlock(&st
->buf_lock
);
59 static const u16 read_all_tx_array
[] = {
60 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_SUPPLY_OUT
)),
61 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_XGYRO_OUT
)),
62 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_YGYRO_OUT
)),
63 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_ZGYRO_OUT
)),
64 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_XACCL_OUT
)),
65 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_YACCL_OUT
)),
66 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_ZACCL_OUT
)),
67 cpu_to_be16(ADIS16400_READ_REG(ADIS16350_XTEMP_OUT
)),
68 cpu_to_be16(ADIS16400_READ_REG(ADIS16350_YTEMP_OUT
)),
69 cpu_to_be16(ADIS16400_READ_REG(ADIS16350_ZTEMP_OUT
)),
70 cpu_to_be16(ADIS16400_READ_REG(ADIS16400_AUX_ADC
)),
73 static int adis16350_spi_read_all(struct device
*dev
, u8
*rx
)
75 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
76 struct adis16400_state
*st
= iio_priv(indio_dev
);
78 struct spi_message msg
;
80 struct spi_transfer
*xfers
;
82 xfers
= kzalloc(sizeof(*xfers
)*indio_dev
->ring
->scan_count
+ 1,
87 for (i
= 0; i
< ARRAY_SIZE(read_all_tx_array
); i
++)
88 if (test_bit(i
, indio_dev
->ring
->scan_mask
)) {
89 xfers
[j
].tx_buf
= &read_all_tx_array
[i
];
90 xfers
[j
].bits_per_word
= 16;
92 xfers
[j
+ 1].rx_buf
= rx
+ j
*2;
95 xfers
[j
].bits_per_word
= 16;
98 spi_message_init(&msg
);
99 for (j
= 0; j
< indio_dev
->ring
->scan_count
+ 1; j
++)
100 spi_message_add_tail(&xfers
[j
], &msg
);
102 ret
= spi_sync(st
->us
, &msg
);
108 /* Whilst this makes a lot of calls to iio_sw_ring functions - it is to device
109 * specific to be rolled into the core.
111 static irqreturn_t
adis16400_trigger_handler(int irq
, void *p
)
113 struct iio_poll_func
*pf
= p
;
114 struct iio_dev
*indio_dev
= pf
->indio_dev
;
115 struct adis16400_state
*st
= iio_priv(indio_dev
);
116 struct iio_ring_buffer
*ring
= indio_dev
->ring
;
117 int i
= 0, j
, ret
= 0;
119 size_t datasize
= ring
->access
->get_bytes_per_datum(ring
);
120 /* Asumption that long is enough for maximum channels */
121 unsigned long mask
= *ring
->scan_mask
;
123 data
= kmalloc(datasize
, GFP_KERNEL
);
125 dev_err(&st
->us
->dev
, "memory alloc failed in ring bh");
129 if (ring
->scan_count
) {
130 if (st
->variant
->flags
& ADIS16400_NO_BURST
) {
131 ret
= adis16350_spi_read_all(&indio_dev
->dev
, st
->rx
);
134 for (; i
< ring
->scan_count
; i
++)
135 data
[i
] = *(s16
*)(st
->rx
+ i
*2);
137 ret
= adis16400_spi_read_burst(&indio_dev
->dev
, st
->rx
);
140 for (; i
< indio_dev
->ring
->scan_count
; i
++) {
143 data
[i
] = be16_to_cpup(
144 (__be16
*)&(st
->rx
[j
*2]));
148 /* Guaranteed to be aligned with 8 byte boundary */
149 if (ring
->scan_timestamp
)
150 *((s64
*)(data
+ ((i
+ 3)/4)*4)) = pf
->timestamp
;
151 ring
->access
->store_to(indio_dev
->ring
, (u8
*) data
, pf
->timestamp
);
153 iio_trigger_notify_done(indio_dev
->trig
);
163 void adis16400_unconfigure_ring(struct iio_dev
*indio_dev
)
165 iio_dealloc_pollfunc(indio_dev
->pollfunc
);
166 iio_sw_rb_free(indio_dev
->ring
);
169 static const struct iio_ring_setup_ops adis16400_ring_setup_ops
= {
170 .preenable
= &iio_sw_ring_preenable
,
171 .postenable
= &iio_triggered_buffer_postenable
,
172 .predisable
= &iio_triggered_buffer_predisable
,
175 int adis16400_configure_ring(struct iio_dev
*indio_dev
)
178 struct adis16400_state
*st
= iio_priv(indio_dev
);
179 struct iio_ring_buffer
*ring
;
181 ring
= iio_sw_rb_allocate(indio_dev
);
186 indio_dev
->ring
= ring
;
187 /* Effectively select the ring buffer implementation */
188 ring
->access
= &ring_sw_access_funcs
;
190 ring
->scan_timestamp
= true;
191 ring
->setup_ops
= &adis16400_ring_setup_ops
;
192 ring
->owner
= THIS_MODULE
;
194 indio_dev
->pollfunc
= iio_alloc_pollfunc(&iio_pollfunc_store_time
,
195 &adis16400_trigger_handler
,
201 if (indio_dev
->pollfunc
== NULL
) {
203 goto error_iio_sw_rb_free
;
206 indio_dev
->modes
|= INDIO_RING_TRIGGERED
;
208 error_iio_sw_rb_free
:
209 iio_sw_rb_free(indio_dev
->ring
);