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>
7 #include <linux/export.h>
9 #include <linux/iio/iio.h>
10 #include "../ring_sw.h"
11 #include <linux/iio/trigger_consumer.h>
12 #include "adis16400.h"
15 * adis16400_spi_read_burst() - read all data registers
16 * @indio_dev: the IIO device
17 * @rx: somewhere to pass back the value read (min size is 24 bytes)
19 static int adis16400_spi_read_burst(struct iio_dev
*indio_dev
, u8
*rx
)
21 struct spi_message msg
;
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 iio_dev
*indio_dev
, u8
*rx
)
75 struct adis16400_state
*st
= iio_priv(indio_dev
);
77 struct spi_message msg
;
79 struct spi_transfer
*xfers
;
80 int scan_count
= bitmap_weight(indio_dev
->active_scan_mask
,
81 indio_dev
->masklength
);
83 xfers
= kzalloc(sizeof(*xfers
)*(scan_count
+ 1),
88 for (i
= 0; i
< ARRAY_SIZE(read_all_tx_array
); i
++)
89 if (test_bit(i
, indio_dev
->active_scan_mask
)) {
90 xfers
[j
].tx_buf
= &read_all_tx_array
[i
];
91 xfers
[j
].bits_per_word
= 16;
93 xfers
[j
+ 1].rx_buf
= rx
+ j
*2;
96 xfers
[j
].bits_per_word
= 16;
99 spi_message_init(&msg
);
100 for (j
= 0; j
< scan_count
+ 1; j
++)
101 spi_message_add_tail(&xfers
[j
], &msg
);
103 ret
= spi_sync(st
->us
, &msg
);
109 /* Whilst this makes a lot of calls to iio_sw_ring functions - it is to device
110 * specific to be rolled into the core.
112 static irqreturn_t
adis16400_trigger_handler(int irq
, void *p
)
114 struct iio_poll_func
*pf
= p
;
115 struct iio_dev
*indio_dev
= pf
->indio_dev
;
116 struct adis16400_state
*st
= iio_priv(indio_dev
);
117 struct iio_buffer
*ring
= indio_dev
->buffer
;
118 int i
= 0, j
, ret
= 0;
121 /* Asumption that long is enough for maximum channels */
122 unsigned long mask
= *indio_dev
->active_scan_mask
;
123 int scan_count
= bitmap_weight(indio_dev
->active_scan_mask
,
124 indio_dev
->masklength
);
125 data
= kmalloc(indio_dev
->scan_bytes
, GFP_KERNEL
);
127 dev_err(&st
->us
->dev
, "memory alloc failed in ring bh");
132 if (st
->variant
->flags
& ADIS16400_NO_BURST
) {
133 ret
= adis16350_spi_read_all(indio_dev
, st
->rx
);
136 for (; i
< scan_count
; i
++)
137 data
[i
] = *(s16
*)(st
->rx
+ i
*2);
139 ret
= adis16400_spi_read_burst(indio_dev
, st
->rx
);
142 for (; i
< scan_count
; i
++) {
145 data
[i
] = be16_to_cpup(
146 (__be16
*)&(st
->rx
[j
*2]));
150 /* Guaranteed to be aligned with 8 byte boundary */
151 if (ring
->scan_timestamp
)
152 *((s64
*)(data
+ ((i
+ 3)/4)*4)) = pf
->timestamp
;
153 ring
->access
->store_to(indio_dev
->buffer
, (u8
*) data
, pf
->timestamp
);
157 iio_trigger_notify_done(indio_dev
->trig
);
162 void adis16400_unconfigure_ring(struct iio_dev
*indio_dev
)
164 iio_dealloc_pollfunc(indio_dev
->pollfunc
);
165 iio_sw_rb_free(indio_dev
->buffer
);
168 static const struct iio_buffer_setup_ops adis16400_ring_setup_ops
= {
169 .preenable
= &iio_sw_buffer_preenable
,
170 .postenable
= &iio_triggered_buffer_postenable
,
171 .predisable
= &iio_triggered_buffer_predisable
,
174 int adis16400_configure_ring(struct iio_dev
*indio_dev
)
177 struct iio_buffer
*ring
;
179 ring
= iio_sw_rb_allocate(indio_dev
);
184 indio_dev
->buffer
= ring
;
185 ring
->scan_timestamp
= true;
186 indio_dev
->setup_ops
= &adis16400_ring_setup_ops
;
188 indio_dev
->pollfunc
= iio_alloc_pollfunc(&iio_pollfunc_store_time
,
189 &adis16400_trigger_handler
,
195 if (indio_dev
->pollfunc
== NULL
) {
197 goto error_iio_sw_rb_free
;
200 indio_dev
->modes
|= INDIO_BUFFER_TRIGGERED
;
202 error_iio_sw_rb_free
:
203 iio_sw_rb_free(indio_dev
->buffer
);