GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / iio / accel / adxl367.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (C) 2021 Analog Devices, Inc.
4  * Author: Cosmin Tanislav <cosmin.tanislav@analog.com>
5  */
6
7 #include <linux/bitfield.h>
8 #include <linux/bitops.h>
9 #include <linux/iio/buffer.h>
10 #include <linux/iio/events.h>
11 #include <linux/iio/iio.h>
12 #include <linux/iio/kfifo_buf.h>
13 #include <linux/iio/sysfs.h>
14 #include <linux/interrupt.h>
15 #include <linux/irq.h>
16 #include <linux/mod_devicetable.h>
17 #include <linux/regmap.h>
18 #include <linux/regulator/consumer.h>
19 #include <asm/unaligned.h>
20
21 #include "adxl367.h"
22
23 #define ADXL367_REG_DEVID               0x00
24 #define ADXL367_DEVID_AD                0xAD
25
26 #define ADXL367_REG_STATUS              0x0B
27 #define ADXL367_STATUS_INACT_MASK       BIT(5)
28 #define ADXL367_STATUS_ACT_MASK         BIT(4)
29 #define ADXL367_STATUS_FIFO_FULL_MASK   BIT(2)
30
31 #define ADXL367_FIFO_ENT_H_MASK         GENMASK(1, 0)
32
33 #define ADXL367_REG_X_DATA_H            0x0E
34 #define ADXL367_REG_Y_DATA_H            0x10
35 #define ADXL367_REG_Z_DATA_H            0x12
36 #define ADXL367_REG_TEMP_DATA_H         0x14
37 #define ADXL367_REG_EX_ADC_DATA_H       0x16
38 #define ADXL367_DATA_MASK               GENMASK(15, 2)
39
40 #define ADXL367_TEMP_25C                165
41 #define ADXL367_TEMP_PER_C              54
42
43 #define ADXL367_VOLTAGE_OFFSET          8192
44 #define ADXL367_VOLTAGE_MAX_MV          1000
45 #define ADXL367_VOLTAGE_MAX_RAW         GENMASK(13, 0)
46
47 #define ADXL367_REG_RESET               0x1F
48 #define ADXL367_RESET_CODE              0x52
49
50 #define ADXL367_REG_THRESH_ACT_H        0x20
51 #define ADXL367_REG_THRESH_INACT_H      0x23
52 #define ADXL367_THRESH_MAX              GENMASK(12, 0)
53 #define ADXL367_THRESH_VAL_H_MASK       GENMASK(12, 6)
54 #define ADXL367_THRESH_H_MASK           GENMASK(6, 0)
55 #define ADXL367_THRESH_VAL_L_MASK       GENMASK(5, 0)
56 #define ADXL367_THRESH_L_MASK           GENMASK(7, 2)
57
58 #define ADXL367_REG_TIME_ACT            0x22
59 #define ADXL367_REG_TIME_INACT_H        0x25
60 #define ADXL367_TIME_ACT_MAX            GENMASK(7, 0)
61 #define ADXL367_TIME_INACT_MAX          GENMASK(15, 0)
62 #define ADXL367_TIME_INACT_VAL_H_MASK   GENMASK(15, 8)
63 #define ADXL367_TIME_INACT_H_MASK       GENMASK(7, 0)
64 #define ADXL367_TIME_INACT_VAL_L_MASK   GENMASK(7, 0)
65 #define ADXL367_TIME_INACT_L_MASK       GENMASK(7, 0)
66
67 #define ADXL367_REG_ACT_INACT_CTL       0x27
68 #define ADXL367_ACT_EN_MASK             GENMASK(1, 0)
69 #define ADXL367_ACT_LINKLOOP_MASK       GENMASK(5, 4)
70
71 #define ADXL367_REG_FIFO_CTL            0x28
72 #define ADXL367_FIFO_CTL_FORMAT_MASK    GENMASK(6, 3)
73 #define ADXL367_FIFO_CTL_MODE_MASK      GENMASK(1, 0)
74
75 #define ADXL367_REG_FIFO_SAMPLES        0x29
76 #define ADXL367_FIFO_SIZE               512
77 #define ADXL367_FIFO_MAX_WATERMARK      511
78
79 #define ADXL367_SAMPLES_VAL_H_MASK      BIT(8)
80 #define ADXL367_SAMPLES_H_MASK          BIT(2)
81 #define ADXL367_SAMPLES_VAL_L_MASK      GENMASK(7, 0)
82 #define ADXL367_SAMPLES_L_MASK          GENMASK(7, 0)
83
84 #define ADXL367_REG_INT1_MAP            0x2A
85 #define ADXL367_INT_INACT_MASK          BIT(5)
86 #define ADXL367_INT_ACT_MASK            BIT(4)
87 #define ADXL367_INT_FIFO_WATERMARK_MASK BIT(2)
88
89 #define ADXL367_REG_FILTER_CTL          0x2C
90 #define ADXL367_FILTER_CTL_RANGE_MASK   GENMASK(7, 6)
91 #define ADXL367_2G_RANGE_1G             4095
92 #define ADXL367_2G_RANGE_100MG          409
93 #define ADXL367_FILTER_CTL_ODR_MASK     GENMASK(2, 0)
94
95 #define ADXL367_REG_POWER_CTL           0x2D
96 #define ADXL367_POWER_CTL_MODE_MASK     GENMASK(1, 0)
97
98 #define ADXL367_REG_ADC_CTL             0x3C
99 #define ADXL367_REG_TEMP_CTL            0x3D
100 #define ADXL367_ADC_EN_MASK             BIT(0)
101
102 enum adxl367_range {
103         ADXL367_2G_RANGE,
104         ADXL367_4G_RANGE,
105         ADXL367_8G_RANGE,
106 };
107
108 enum adxl367_fifo_mode {
109         ADXL367_FIFO_MODE_DISABLED = 0b00,
110         ADXL367_FIFO_MODE_STREAM = 0b10,
111 };
112
113 enum adxl367_fifo_format {
114         ADXL367_FIFO_FORMAT_XYZ,
115         ADXL367_FIFO_FORMAT_X,
116         ADXL367_FIFO_FORMAT_Y,
117         ADXL367_FIFO_FORMAT_Z,
118         ADXL367_FIFO_FORMAT_XYZT,
119         ADXL367_FIFO_FORMAT_XT,
120         ADXL367_FIFO_FORMAT_YT,
121         ADXL367_FIFO_FORMAT_ZT,
122         ADXL367_FIFO_FORMAT_XYZA,
123         ADXL367_FIFO_FORMAT_XA,
124         ADXL367_FIFO_FORMAT_YA,
125         ADXL367_FIFO_FORMAT_ZA,
126 };
127
128 enum adxl367_op_mode {
129         ADXL367_OP_STANDBY = 0b00,
130         ADXL367_OP_MEASURE = 0b10,
131 };
132
133 enum adxl367_act_proc_mode {
134         ADXL367_LOOPED = 0b11,
135 };
136
137 enum adxl367_act_en_mode {
138         ADXL367_ACT_DISABLED = 0b00,
139         ADCL367_ACT_REF_ENABLED = 0b11,
140 };
141
142 enum adxl367_activity_type {
143         ADXL367_ACTIVITY,
144         ADXL367_INACTIVITY,
145 };
146
147 enum adxl367_odr {
148         ADXL367_ODR_12P5HZ,
149         ADXL367_ODR_25HZ,
150         ADXL367_ODR_50HZ,
151         ADXL367_ODR_100HZ,
152         ADXL367_ODR_200HZ,
153         ADXL367_ODR_400HZ,
154 };
155
156 struct adxl367_state {
157         const struct adxl367_ops        *ops;
158         void                            *context;
159
160         struct device                   *dev;
161         struct regmap                   *regmap;
162
163         struct regulator_bulk_data      regulators[2];
164
165         /*
166          * Synchronize access to members of driver state, and ensure atomicity
167          * of consecutive regmap operations.
168          */
169         struct mutex            lock;
170
171         enum adxl367_odr        odr;
172         enum adxl367_range      range;
173
174         unsigned int    act_threshold;
175         unsigned int    act_time_ms;
176         unsigned int    inact_threshold;
177         unsigned int    inact_time_ms;
178
179         unsigned int    fifo_set_size;
180         unsigned int    fifo_watermark;
181
182         __be16          fifo_buf[ADXL367_FIFO_SIZE] ____cacheline_aligned;
183         __be16          sample_buf;
184         u8              act_threshold_buf[2];
185         u8              inact_time_buf[2];
186         u8              status_buf[3];
187 };
188
189 static const unsigned int adxl367_threshold_h_reg_tbl[] = {
190         [ADXL367_ACTIVITY]   = ADXL367_REG_THRESH_ACT_H,
191         [ADXL367_INACTIVITY] = ADXL367_REG_THRESH_INACT_H,
192 };
193
194 static const unsigned int adxl367_act_en_shift_tbl[] = {
195         [ADXL367_ACTIVITY]   = 0,
196         [ADXL367_INACTIVITY] = 2,
197 };
198
199 static const unsigned int adxl367_act_int_mask_tbl[] = {
200         [ADXL367_ACTIVITY]   = ADXL367_INT_ACT_MASK,
201         [ADXL367_INACTIVITY] = ADXL367_INT_INACT_MASK,
202 };
203
204 static const int adxl367_samp_freq_tbl[][2] = {
205         [ADXL367_ODR_12P5HZ] = {12, 500000},
206         [ADXL367_ODR_25HZ]   = {25, 0},
207         [ADXL367_ODR_50HZ]   = {50, 0},
208         [ADXL367_ODR_100HZ]  = {100, 0},
209         [ADXL367_ODR_200HZ]  = {200, 0},
210         [ADXL367_ODR_400HZ]  = {400, 0},
211 };
212
213 /* (g * 2) * 9.80665 * 1000000 / (2^14 - 1) */
214 static const int adxl367_range_scale_tbl[][2] = {
215         [ADXL367_2G_RANGE] = {0, 2394347},
216         [ADXL367_4G_RANGE] = {0, 4788695},
217         [ADXL367_8G_RANGE] = {0, 9577391},
218 };
219
220 static const int adxl367_range_scale_factor_tbl[] = {
221         [ADXL367_2G_RANGE] = 1,
222         [ADXL367_4G_RANGE] = 2,
223         [ADXL367_8G_RANGE] = 4,
224 };
225
226 enum {
227         ADXL367_X_CHANNEL_INDEX,
228         ADXL367_Y_CHANNEL_INDEX,
229         ADXL367_Z_CHANNEL_INDEX,
230         ADXL367_TEMP_CHANNEL_INDEX,
231         ADXL367_EX_ADC_CHANNEL_INDEX
232 };
233
234 #define ADXL367_X_CHANNEL_MASK          BIT(ADXL367_X_CHANNEL_INDEX)
235 #define ADXL367_Y_CHANNEL_MASK          BIT(ADXL367_Y_CHANNEL_INDEX)
236 #define ADXL367_Z_CHANNEL_MASK          BIT(ADXL367_Z_CHANNEL_INDEX)
237 #define ADXL367_TEMP_CHANNEL_MASK       BIT(ADXL367_TEMP_CHANNEL_INDEX)
238 #define ADXL367_EX_ADC_CHANNEL_MASK     BIT(ADXL367_EX_ADC_CHANNEL_INDEX)
239
240 static const enum adxl367_fifo_format adxl367_fifo_formats[] = {
241         ADXL367_FIFO_FORMAT_X,
242         ADXL367_FIFO_FORMAT_Y,
243         ADXL367_FIFO_FORMAT_Z,
244         ADXL367_FIFO_FORMAT_XT,
245         ADXL367_FIFO_FORMAT_YT,
246         ADXL367_FIFO_FORMAT_ZT,
247         ADXL367_FIFO_FORMAT_XA,
248         ADXL367_FIFO_FORMAT_YA,
249         ADXL367_FIFO_FORMAT_ZA,
250         ADXL367_FIFO_FORMAT_XYZ,
251         ADXL367_FIFO_FORMAT_XYZT,
252         ADXL367_FIFO_FORMAT_XYZA,
253 };
254
255 static const unsigned long adxl367_channel_masks[] = {
256         ADXL367_X_CHANNEL_MASK,
257         ADXL367_Y_CHANNEL_MASK,
258         ADXL367_Z_CHANNEL_MASK,
259         ADXL367_X_CHANNEL_MASK | ADXL367_TEMP_CHANNEL_MASK,
260         ADXL367_Y_CHANNEL_MASK | ADXL367_TEMP_CHANNEL_MASK,
261         ADXL367_Z_CHANNEL_MASK | ADXL367_TEMP_CHANNEL_MASK,
262         ADXL367_X_CHANNEL_MASK | ADXL367_EX_ADC_CHANNEL_MASK,
263         ADXL367_Y_CHANNEL_MASK | ADXL367_EX_ADC_CHANNEL_MASK,
264         ADXL367_Z_CHANNEL_MASK | ADXL367_EX_ADC_CHANNEL_MASK,
265         ADXL367_X_CHANNEL_MASK | ADXL367_Y_CHANNEL_MASK | ADXL367_Z_CHANNEL_MASK,
266         ADXL367_X_CHANNEL_MASK | ADXL367_Y_CHANNEL_MASK | ADXL367_Z_CHANNEL_MASK |
267                 ADXL367_TEMP_CHANNEL_MASK,
268         ADXL367_X_CHANNEL_MASK | ADXL367_Y_CHANNEL_MASK | ADXL367_Z_CHANNEL_MASK |
269                 ADXL367_EX_ADC_CHANNEL_MASK,
270         0,
271 };
272
273 static int adxl367_set_measure_en(struct adxl367_state *st, bool en)
274 {
275         enum adxl367_op_mode op_mode = en ? ADXL367_OP_MEASURE
276                                           : ADXL367_OP_STANDBY;
277         int ret;
278
279         ret = regmap_update_bits(st->regmap, ADXL367_REG_POWER_CTL,
280                                  ADXL367_POWER_CTL_MODE_MASK,
281                                  FIELD_PREP(ADXL367_POWER_CTL_MODE_MASK,
282                                             op_mode));
283         if (ret)
284                 return ret;
285
286         /*
287          * Wait for acceleration output to settle after entering
288          * measure mode.
289          */
290         if (en)
291                 msleep(100);
292
293         return 0;
294 }
295
296 static void adxl367_scale_act_thresholds(struct adxl367_state *st,
297                                          enum adxl367_range old_range,
298                                          enum adxl367_range new_range)
299 {
300         st->act_threshold = st->act_threshold
301                             * adxl367_range_scale_factor_tbl[old_range]
302                             / adxl367_range_scale_factor_tbl[new_range];
303         st->inact_threshold = st->inact_threshold
304                               * adxl367_range_scale_factor_tbl[old_range]
305                               / adxl367_range_scale_factor_tbl[new_range];
306 }
307
308 static int _adxl367_set_act_threshold(struct adxl367_state *st,
309                                       enum adxl367_activity_type act,
310                                       unsigned int threshold)
311 {
312         u8 reg = adxl367_threshold_h_reg_tbl[act];
313         int ret;
314
315         if (threshold > ADXL367_THRESH_MAX)
316                 return -EINVAL;
317
318         st->act_threshold_buf[0] = FIELD_PREP(ADXL367_THRESH_H_MASK,
319                                               FIELD_GET(ADXL367_THRESH_VAL_H_MASK,
320                                                         threshold));
321         st->act_threshold_buf[1] = FIELD_PREP(ADXL367_THRESH_L_MASK,
322                                               FIELD_GET(ADXL367_THRESH_VAL_L_MASK,
323                                                         threshold));
324
325         ret = regmap_bulk_write(st->regmap, reg, st->act_threshold_buf,
326                                 sizeof(st->act_threshold_buf));
327         if (ret)
328                 return ret;
329
330         if (act == ADXL367_ACTIVITY)
331                 st->act_threshold = threshold;
332         else
333                 st->inact_threshold = threshold;
334
335         return 0;
336 }
337
338 static int adxl367_set_act_threshold(struct adxl367_state *st,
339                                      enum adxl367_activity_type act,
340                                      unsigned int threshold)
341 {
342         int ret;
343
344         mutex_lock(&st->lock);
345
346         ret = adxl367_set_measure_en(st, false);
347         if (ret)
348                 goto out;
349
350         ret = _adxl367_set_act_threshold(st, act, threshold);
351         if (ret)
352                 goto out;
353
354         ret = adxl367_set_measure_en(st, true);
355
356 out:
357         mutex_unlock(&st->lock);
358
359         return ret;
360 }
361
362 static int adxl367_set_act_proc_mode(struct adxl367_state *st,
363                                      enum adxl367_act_proc_mode mode)
364 {
365         return regmap_update_bits(st->regmap, ADXL367_REG_ACT_INACT_CTL,
366                                   ADXL367_ACT_LINKLOOP_MASK,
367                                   FIELD_PREP(ADXL367_ACT_LINKLOOP_MASK,
368                                              mode));
369 }
370
371 static int adxl367_set_act_interrupt_en(struct adxl367_state *st,
372                                         enum adxl367_activity_type act,
373                                         bool en)
374 {
375         unsigned int mask = adxl367_act_int_mask_tbl[act];
376
377         return regmap_update_bits(st->regmap, ADXL367_REG_INT1_MAP,
378                                   mask, en ? mask : 0);
379 }
380
381 static int adxl367_get_act_interrupt_en(struct adxl367_state *st,
382                                         enum adxl367_activity_type act,
383                                         bool *en)
384 {
385         unsigned int mask = adxl367_act_int_mask_tbl[act];
386         unsigned int val;
387         int ret;
388
389         ret = regmap_read(st->regmap, ADXL367_REG_INT1_MAP, &val);
390         if (ret)
391                 return ret;
392
393         *en = !!(val & mask);
394
395         return 0;
396 }
397
398 static int adxl367_set_act_en(struct adxl367_state *st,
399                               enum adxl367_activity_type act,
400                               enum adxl367_act_en_mode en)
401 {
402         unsigned int ctl_shift = adxl367_act_en_shift_tbl[act];
403
404         return regmap_update_bits(st->regmap, ADXL367_REG_ACT_INACT_CTL,
405                                   ADXL367_ACT_EN_MASK << ctl_shift,
406                                   en << ctl_shift);
407 }
408
409 static int adxl367_set_fifo_watermark_interrupt_en(struct adxl367_state *st,
410                                                    bool en)
411 {
412         return regmap_update_bits(st->regmap, ADXL367_REG_INT1_MAP,
413                                   ADXL367_INT_FIFO_WATERMARK_MASK,
414                                   en ? ADXL367_INT_FIFO_WATERMARK_MASK : 0);
415 }
416
417 static int adxl367_get_fifo_mode(struct adxl367_state *st,
418                                  enum adxl367_fifo_mode *fifo_mode)
419 {
420         unsigned int val;
421         int ret;
422
423         ret = regmap_read(st->regmap, ADXL367_REG_FIFO_CTL, &val);
424         if (ret)
425                 return ret;
426
427         *fifo_mode = FIELD_GET(ADXL367_FIFO_CTL_MODE_MASK, val);
428
429         return 0;
430 }
431
432 static int adxl367_set_fifo_mode(struct adxl367_state *st,
433                                  enum adxl367_fifo_mode fifo_mode)
434 {
435         return regmap_update_bits(st->regmap, ADXL367_REG_FIFO_CTL,
436                                   ADXL367_FIFO_CTL_MODE_MASK,
437                                   FIELD_PREP(ADXL367_FIFO_CTL_MODE_MASK,
438                                              fifo_mode));
439 }
440
441 static int adxl367_set_fifo_format(struct adxl367_state *st,
442                                    enum adxl367_fifo_format fifo_format)
443 {
444         return regmap_update_bits(st->regmap, ADXL367_REG_FIFO_CTL,
445                                   ADXL367_FIFO_CTL_FORMAT_MASK,
446                                   FIELD_PREP(ADXL367_FIFO_CTL_FORMAT_MASK,
447                                              fifo_format));
448 }
449
450 static int adxl367_set_fifo_samples(struct adxl367_state *st,
451                                     unsigned int fifo_watermark,
452                                     unsigned int fifo_set_size)
453 {
454         unsigned int fifo_samples = fifo_watermark * fifo_set_size;
455         unsigned int fifo_samples_h, fifo_samples_l;
456         int ret;
457
458         if (fifo_samples > ADXL367_FIFO_MAX_WATERMARK)
459                 fifo_samples = ADXL367_FIFO_MAX_WATERMARK;
460
461         if (fifo_set_size == 0)
462                 return 0;
463
464         fifo_samples /= fifo_set_size;
465
466         fifo_samples_h = FIELD_PREP(ADXL367_SAMPLES_H_MASK,
467                                     FIELD_GET(ADXL367_SAMPLES_VAL_H_MASK,
468                                               fifo_samples));
469         fifo_samples_l = FIELD_PREP(ADXL367_SAMPLES_L_MASK,
470                                     FIELD_GET(ADXL367_SAMPLES_VAL_L_MASK,
471                                               fifo_samples));
472
473         ret = regmap_update_bits(st->regmap, ADXL367_REG_FIFO_CTL,
474                                  ADXL367_SAMPLES_H_MASK, fifo_samples_h);
475         if (ret)
476                 return ret;
477
478         return regmap_update_bits(st->regmap, ADXL367_REG_FIFO_SAMPLES,
479                                   ADXL367_SAMPLES_L_MASK, fifo_samples_l);
480 }
481
482 static int adxl367_set_fifo_set_size(struct adxl367_state *st,
483                                      unsigned int fifo_set_size)
484 {
485         int ret;
486
487         ret = adxl367_set_fifo_samples(st, st->fifo_watermark, fifo_set_size);
488         if (ret)
489                 return ret;
490
491         st->fifo_set_size = fifo_set_size;
492
493         return 0;
494 }
495
496 static int adxl367_set_fifo_watermark(struct adxl367_state *st,
497                                       unsigned int fifo_watermark)
498 {
499         int ret;
500
501         ret = adxl367_set_fifo_samples(st, fifo_watermark, st->fifo_set_size);
502         if (ret)
503                 return ret;
504
505         st->fifo_watermark = fifo_watermark;
506
507         return 0;
508 }
509
510 static int adxl367_set_range(struct iio_dev *indio_dev,
511                              enum adxl367_range range)
512 {
513         struct adxl367_state *st = iio_priv(indio_dev);
514         int ret;
515
516         ret = iio_device_claim_direct_mode(indio_dev);
517         if (ret)
518                 return ret;
519
520         mutex_lock(&st->lock);
521
522         ret = adxl367_set_measure_en(st, false);
523         if (ret)
524                 goto out;
525
526         ret = regmap_update_bits(st->regmap, ADXL367_REG_FILTER_CTL,
527                                  ADXL367_FILTER_CTL_RANGE_MASK,
528                                  FIELD_PREP(ADXL367_FILTER_CTL_RANGE_MASK,
529                                             range));
530         if (ret)
531                 goto out;
532
533         adxl367_scale_act_thresholds(st, st->range, range);
534
535         /* Activity thresholds depend on range */
536         ret = _adxl367_set_act_threshold(st, ADXL367_ACTIVITY,
537                                          st->act_threshold);
538         if (ret)
539                 goto out;
540
541         ret = _adxl367_set_act_threshold(st, ADXL367_INACTIVITY,
542                                          st->inact_threshold);
543         if (ret)
544                 goto out;
545
546         ret = adxl367_set_measure_en(st, true);
547         if (ret)
548                 goto out;
549
550         st->range = range;
551
552 out:
553         mutex_unlock(&st->lock);
554
555         iio_device_release_direct_mode(indio_dev);
556
557         return ret;
558 }
559
560 static int adxl367_time_ms_to_samples(struct adxl367_state *st, unsigned int ms)
561 {
562         int freq_hz = adxl367_samp_freq_tbl[st->odr][0];
563         int freq_microhz = adxl367_samp_freq_tbl[st->odr][1];
564         /* Scale to decihertz to prevent precision loss in 12.5Hz case. */
565         int freq_dhz = freq_hz * 10 + freq_microhz / 100000;
566
567         return DIV_ROUND_CLOSEST(ms * freq_dhz, 10000);
568 }
569
570 static int _adxl367_set_act_time_ms(struct adxl367_state *st, unsigned int ms)
571 {
572         unsigned int val = adxl367_time_ms_to_samples(st, ms);
573         int ret;
574
575         if (val > ADXL367_TIME_ACT_MAX)
576                 val = ADXL367_TIME_ACT_MAX;
577
578         ret = regmap_write(st->regmap, ADXL367_REG_TIME_ACT, val);
579         if (ret)
580                 return ret;
581
582         st->act_time_ms = ms;
583
584         return 0;
585 }
586
587 static int _adxl367_set_inact_time_ms(struct adxl367_state *st, unsigned int ms)
588 {
589         unsigned int val = adxl367_time_ms_to_samples(st, ms);
590         int ret;
591
592         if (val > ADXL367_TIME_INACT_MAX)
593                 val = ADXL367_TIME_INACT_MAX;
594
595         st->inact_time_buf[0] = FIELD_PREP(ADXL367_TIME_INACT_H_MASK,
596                                            FIELD_GET(ADXL367_TIME_INACT_VAL_H_MASK,
597                                                      val));
598         st->inact_time_buf[1] = FIELD_PREP(ADXL367_TIME_INACT_L_MASK,
599                                            FIELD_GET(ADXL367_TIME_INACT_VAL_L_MASK,
600                                                      val));
601
602         ret = regmap_bulk_write(st->regmap, ADXL367_REG_TIME_INACT_H,
603                                 st->inact_time_buf, sizeof(st->inact_time_buf));
604         if (ret)
605                 return ret;
606
607         st->inact_time_ms = ms;
608
609         return 0;
610 }
611
612 static int adxl367_set_act_time_ms(struct adxl367_state *st,
613                                    enum adxl367_activity_type act,
614                                    unsigned int ms)
615 {
616         int ret;
617
618         mutex_lock(&st->lock);
619
620         ret = adxl367_set_measure_en(st, false);
621         if (ret)
622                 goto out;
623
624         if (act == ADXL367_ACTIVITY)
625                 ret = _adxl367_set_act_time_ms(st, ms);
626         else
627                 ret = _adxl367_set_inact_time_ms(st, ms);
628
629         if (ret)
630                 goto out;
631
632         ret = adxl367_set_measure_en(st, true);
633
634 out:
635         mutex_unlock(&st->lock);
636
637         return ret;
638 }
639
640 static int _adxl367_set_odr(struct adxl367_state *st, enum adxl367_odr odr)
641 {
642         int ret;
643
644         ret = regmap_update_bits(st->regmap, ADXL367_REG_FILTER_CTL,
645                                  ADXL367_FILTER_CTL_ODR_MASK,
646                                  FIELD_PREP(ADXL367_FILTER_CTL_ODR_MASK,
647                                             odr));
648         if (ret)
649                 return ret;
650
651         /* Activity timers depend on ODR */
652         ret = _adxl367_set_act_time_ms(st, st->act_time_ms);
653         if (ret)
654                 return ret;
655
656         ret = _adxl367_set_inact_time_ms(st, st->inact_time_ms);
657         if (ret)
658                 return ret;
659
660         st->odr = odr;
661
662         return 0;
663 }
664
665 static int adxl367_set_odr(struct iio_dev *indio_dev, enum adxl367_odr odr)
666 {
667         struct adxl367_state *st = iio_priv(indio_dev);
668         int ret;
669
670         ret = iio_device_claim_direct_mode(indio_dev);
671         if (ret)
672                 return ret;
673
674         mutex_lock(&st->lock);
675
676         ret = adxl367_set_measure_en(st, false);
677         if (ret)
678                 goto out;
679
680         ret = _adxl367_set_odr(st, odr);
681         if (ret)
682                 goto out;
683
684         ret = adxl367_set_measure_en(st, true);
685
686 out:
687         mutex_unlock(&st->lock);
688
689         iio_device_release_direct_mode(indio_dev);
690
691         return ret;
692 }
693
694 static int adxl367_set_temp_adc_en(struct adxl367_state *st, unsigned int reg,
695                                    bool en)
696 {
697         return regmap_update_bits(st->regmap, reg, ADXL367_ADC_EN_MASK,
698                                   en ? ADXL367_ADC_EN_MASK : 0);
699 }
700
701 static int adxl367_set_temp_adc_reg_en(struct adxl367_state *st,
702                                        unsigned int reg, bool en)
703 {
704         int ret;
705
706         switch (reg) {
707         case ADXL367_REG_TEMP_DATA_H:
708                 ret = adxl367_set_temp_adc_en(st, ADXL367_REG_TEMP_CTL, en);
709                 break;
710         case ADXL367_REG_EX_ADC_DATA_H:
711                 ret = adxl367_set_temp_adc_en(st, ADXL367_REG_ADC_CTL, en);
712                 break;
713         default:
714                 return 0;
715         }
716
717         if (ret)
718                 return ret;
719
720         if (en)
721                 msleep(100);
722
723         return 0;
724 }
725
726 static int adxl367_set_temp_adc_mask_en(struct adxl367_state *st,
727                                         const unsigned long *active_scan_mask,
728                                         bool en)
729 {
730         if (*active_scan_mask & ADXL367_TEMP_CHANNEL_MASK)
731                 return adxl367_set_temp_adc_en(st, ADXL367_REG_TEMP_CTL, en);
732         else if (*active_scan_mask & ADXL367_EX_ADC_CHANNEL_MASK)
733                 return adxl367_set_temp_adc_en(st, ADXL367_REG_ADC_CTL, en);
734
735         return 0;
736 }
737
738 static int adxl367_find_odr(struct adxl367_state *st, int val, int val2,
739                             enum adxl367_odr *odr)
740 {
741         size_t size = ARRAY_SIZE(adxl367_samp_freq_tbl);
742         int i;
743
744         for (i = 0; i < size; i++)
745                 if (val == adxl367_samp_freq_tbl[i][0] &&
746                     val2 == adxl367_samp_freq_tbl[i][1])
747                         break;
748
749         if (i == size)
750                 return -EINVAL;
751
752         *odr = i;
753
754         return 0;
755 }
756
757 static int adxl367_find_range(struct adxl367_state *st, int val, int val2,
758                               enum adxl367_range *range)
759 {
760         size_t size = ARRAY_SIZE(adxl367_range_scale_tbl);
761         int i;
762
763         for (i = 0; i < size; i++)
764                 if (val == adxl367_range_scale_tbl[i][0] &&
765                     val2 == adxl367_range_scale_tbl[i][1])
766                         break;
767
768         if (i == size)
769                 return -EINVAL;
770
771         *range = i;
772
773         return 0;
774 }
775
776 static int adxl367_read_sample(struct iio_dev *indio_dev,
777                                struct iio_chan_spec const *chan,
778                                int *val)
779 {
780         struct adxl367_state *st = iio_priv(indio_dev);
781         u16 sample;
782         int ret;
783
784         ret = iio_device_claim_direct_mode(indio_dev);
785         if (ret)
786                 return ret;
787
788         mutex_lock(&st->lock);
789
790         ret = adxl367_set_temp_adc_reg_en(st, chan->address, true);
791         if (ret)
792                 goto out;
793
794         ret = regmap_bulk_read(st->regmap, chan->address, &st->sample_buf,
795                                sizeof(st->sample_buf));
796         if (ret)
797                 goto out;
798
799         sample = FIELD_GET(ADXL367_DATA_MASK, be16_to_cpu(st->sample_buf));
800         *val = sign_extend32(sample, chan->scan_type.realbits - 1);
801
802         ret = adxl367_set_temp_adc_reg_en(st, chan->address, false);
803
804 out:
805         mutex_unlock(&st->lock);
806
807         iio_device_release_direct_mode(indio_dev);
808
809         return ret ?: IIO_VAL_INT;
810 }
811
812 static int adxl367_get_status(struct adxl367_state *st, u8 *status,
813                               u16 *fifo_entries)
814 {
815         int ret;
816
817         /* Read STATUS, FIFO_ENT_L and FIFO_ENT_H */
818         ret = regmap_bulk_read(st->regmap, ADXL367_REG_STATUS,
819                                st->status_buf, sizeof(st->status_buf));
820         if (ret)
821                 return ret;
822
823         st->status_buf[2] &= ADXL367_FIFO_ENT_H_MASK;
824
825         *status = st->status_buf[0];
826         *fifo_entries = get_unaligned_le16(&st->status_buf[1]);
827
828         return 0;
829 }
830
831 static bool adxl367_push_event(struct iio_dev *indio_dev, u8 status)
832 {
833         unsigned int ev_dir;
834
835         if (FIELD_GET(ADXL367_STATUS_ACT_MASK, status))
836                 ev_dir = IIO_EV_DIR_RISING;
837         else if (FIELD_GET(ADXL367_STATUS_INACT_MASK, status))
838                 ev_dir = IIO_EV_DIR_FALLING;
839         else
840                 return false;
841
842         iio_push_event(indio_dev,
843                        IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
844                                           IIO_EV_TYPE_THRESH, ev_dir),
845                        iio_get_time_ns(indio_dev));
846
847         return true;
848 }
849
850 static bool adxl367_push_fifo_data(struct iio_dev *indio_dev, u8 status,
851                                    u16 fifo_entries)
852 {
853         struct adxl367_state *st = iio_priv(indio_dev);
854         int ret;
855         int i;
856
857         if (!FIELD_GET(ADXL367_STATUS_FIFO_FULL_MASK, status))
858                 return false;
859
860         fifo_entries -= fifo_entries % st->fifo_set_size;
861
862         ret = st->ops->read_fifo(st->context, st->fifo_buf, fifo_entries);
863         if (ret) {
864                 dev_err(st->dev, "Failed to read FIFO: %d\n", ret);
865                 return true;
866         }
867
868         for (i = 0; i < fifo_entries; i += st->fifo_set_size)
869                 iio_push_to_buffers(indio_dev, &st->fifo_buf[i]);
870
871         return true;
872 }
873
874 static irqreturn_t adxl367_irq_handler(int irq, void *private)
875 {
876         struct iio_dev *indio_dev = private;
877         struct adxl367_state *st = iio_priv(indio_dev);
878         u16 fifo_entries;
879         bool handled;
880         u8 status;
881         int ret;
882
883         ret = adxl367_get_status(st, &status, &fifo_entries);
884         if (ret)
885                 return IRQ_NONE;
886
887         handled = adxl367_push_event(indio_dev, status);
888         handled |= adxl367_push_fifo_data(indio_dev, status, fifo_entries);
889
890         return handled ? IRQ_HANDLED : IRQ_NONE;
891 }
892
893 static int adxl367_reg_access(struct iio_dev *indio_dev,
894                               unsigned int reg,
895                               unsigned int writeval,
896                               unsigned int *readval)
897 {
898         struct adxl367_state *st = iio_priv(indio_dev);
899
900         if (readval)
901                 return regmap_read(st->regmap, reg, readval);
902         else
903                 return regmap_write(st->regmap, reg, writeval);
904 }
905
906 static int adxl367_read_raw(struct iio_dev *indio_dev,
907                             struct iio_chan_spec const *chan,
908                             int *val, int *val2, long info)
909 {
910         struct adxl367_state *st = iio_priv(indio_dev);
911
912         switch (info) {
913         case IIO_CHAN_INFO_RAW:
914                 return adxl367_read_sample(indio_dev, chan, val);
915         case IIO_CHAN_INFO_SCALE:
916                 switch (chan->type) {
917                 case IIO_ACCEL:
918                         mutex_lock(&st->lock);
919                         *val = adxl367_range_scale_tbl[st->range][0];
920                         *val2 = adxl367_range_scale_tbl[st->range][1];
921                         mutex_unlock(&st->lock);
922                         return IIO_VAL_INT_PLUS_NANO;
923                 case IIO_TEMP:
924                         *val = 1000;
925                         *val2 = ADXL367_TEMP_PER_C;
926                         return IIO_VAL_FRACTIONAL;
927                 case IIO_VOLTAGE:
928                         *val = ADXL367_VOLTAGE_MAX_MV;
929                         *val2 = ADXL367_VOLTAGE_MAX_RAW;
930                         return IIO_VAL_FRACTIONAL;
931                 default:
932                         return -EINVAL;
933                 }
934         case IIO_CHAN_INFO_OFFSET:
935                 switch (chan->type) {
936                 case IIO_TEMP:
937                         *val = 25 * ADXL367_TEMP_PER_C - ADXL367_TEMP_25C;
938                         return IIO_VAL_INT;
939                 case IIO_VOLTAGE:
940                         *val = ADXL367_VOLTAGE_OFFSET;
941                         return IIO_VAL_INT;
942                 default:
943                         return -EINVAL;
944                 }
945         case IIO_CHAN_INFO_SAMP_FREQ:
946                 mutex_lock(&st->lock);
947                 *val = adxl367_samp_freq_tbl[st->odr][0];
948                 *val2 = adxl367_samp_freq_tbl[st->odr][1];
949                 mutex_unlock(&st->lock);
950                 return IIO_VAL_INT_PLUS_MICRO;
951         default:
952                 return -EINVAL;
953         }
954 }
955
956 static int adxl367_write_raw(struct iio_dev *indio_dev,
957                              struct iio_chan_spec const *chan,
958                              int val, int val2, long info)
959 {
960         struct adxl367_state *st = iio_priv(indio_dev);
961         int ret;
962
963         switch (info) {
964         case IIO_CHAN_INFO_SAMP_FREQ: {
965                 enum adxl367_odr odr;
966
967                 ret = adxl367_find_odr(st, val, val2, &odr);
968                 if (ret)
969                         return ret;
970
971                 return adxl367_set_odr(indio_dev, odr);
972         }
973         case IIO_CHAN_INFO_SCALE: {
974                 enum adxl367_range range;
975
976                 ret = adxl367_find_range(st, val, val2, &range);
977                 if (ret)
978                         return ret;
979
980                 return adxl367_set_range(indio_dev, range);
981         }
982         default:
983                 return -EINVAL;
984         }
985 }
986
987 static int adxl367_write_raw_get_fmt(struct iio_dev *indio_dev,
988                                      struct iio_chan_spec const *chan,
989                                      long info)
990 {
991         switch (info) {
992         case IIO_CHAN_INFO_SCALE:
993                 if (chan->type != IIO_ACCEL)
994                         return -EINVAL;
995
996                 return IIO_VAL_INT_PLUS_NANO;
997         default:
998                 return IIO_VAL_INT_PLUS_MICRO;
999         }
1000 }
1001
1002 static int adxl367_read_avail(struct iio_dev *indio_dev,
1003                               struct iio_chan_spec const *chan,
1004                               const int **vals, int *type, int *length,
1005                               long info)
1006 {
1007         switch (info) {
1008         case IIO_CHAN_INFO_SCALE:
1009                 if (chan->type != IIO_ACCEL)
1010                         return -EINVAL;
1011
1012                 *vals = (int *)adxl367_range_scale_tbl;
1013                 *type = IIO_VAL_INT_PLUS_NANO;
1014                 *length = ARRAY_SIZE(adxl367_range_scale_tbl) * 2;
1015                 return IIO_AVAIL_LIST;
1016         case IIO_CHAN_INFO_SAMP_FREQ:
1017                 *vals = (int *)adxl367_samp_freq_tbl;
1018                 *type = IIO_VAL_INT_PLUS_MICRO;
1019                 *length = ARRAY_SIZE(adxl367_samp_freq_tbl) * 2;
1020                 return IIO_AVAIL_LIST;
1021         default:
1022                 return -EINVAL;
1023         }
1024 }
1025
1026 static int adxl367_read_event_value(struct iio_dev *indio_dev,
1027                                     const struct iio_chan_spec *chan,
1028                                     enum iio_event_type type,
1029                                     enum iio_event_direction dir,
1030                                     enum iio_event_info info,
1031                                     int *val, int *val2)
1032 {
1033         struct adxl367_state *st = iio_priv(indio_dev);
1034
1035         switch (info) {
1036         case IIO_EV_INFO_VALUE: {
1037                 switch (dir) {
1038                 case IIO_EV_DIR_RISING:
1039                         mutex_lock(&st->lock);
1040                         *val = st->act_threshold;
1041                         mutex_unlock(&st->lock);
1042                         return IIO_VAL_INT;
1043                 case IIO_EV_DIR_FALLING:
1044                         mutex_lock(&st->lock);
1045                         *val = st->inact_threshold;
1046                         mutex_unlock(&st->lock);
1047                         return IIO_VAL_INT;
1048                 default:
1049                         return -EINVAL;
1050                 }
1051         }
1052         case IIO_EV_INFO_PERIOD:
1053                 switch (dir) {
1054                 case IIO_EV_DIR_RISING:
1055                         mutex_lock(&st->lock);
1056                         *val = st->act_time_ms;
1057                         mutex_unlock(&st->lock);
1058                         *val2 = 1000;
1059                         return IIO_VAL_FRACTIONAL;
1060                 case IIO_EV_DIR_FALLING:
1061                         mutex_lock(&st->lock);
1062                         *val = st->inact_time_ms;
1063                         mutex_unlock(&st->lock);
1064                         *val2 = 1000;
1065                         return IIO_VAL_FRACTIONAL;
1066                 default:
1067                         return -EINVAL;
1068                 }
1069         default:
1070                 return -EINVAL;
1071         }
1072 }
1073
1074 static int adxl367_write_event_value(struct iio_dev *indio_dev,
1075                                      const struct iio_chan_spec *chan,
1076                                      enum iio_event_type type,
1077                                      enum iio_event_direction dir,
1078                                      enum iio_event_info info,
1079                                      int val, int val2)
1080 {
1081         struct adxl367_state *st = iio_priv(indio_dev);
1082
1083         switch (info) {
1084         case IIO_EV_INFO_VALUE:
1085                 if (val < 0)
1086                         return -EINVAL;
1087
1088                 switch (dir) {
1089                 case IIO_EV_DIR_RISING:
1090                         return adxl367_set_act_threshold(st, ADXL367_ACTIVITY, val);
1091                 case IIO_EV_DIR_FALLING:
1092                         return adxl367_set_act_threshold(st, ADXL367_INACTIVITY, val);
1093                 default:
1094                         return -EINVAL;
1095                 }
1096         case IIO_EV_INFO_PERIOD:
1097                 if (val < 0)
1098                         return -EINVAL;
1099
1100                 val = val * 1000 + DIV_ROUND_UP(val2, 1000);
1101                 switch (dir) {
1102                 case IIO_EV_DIR_RISING:
1103                         return adxl367_set_act_time_ms(st, ADXL367_ACTIVITY, val);
1104                 case IIO_EV_DIR_FALLING:
1105                         return adxl367_set_act_time_ms(st, ADXL367_INACTIVITY, val);
1106                 default:
1107                         return -EINVAL;
1108                 }
1109         default:
1110                 return -EINVAL;
1111         }
1112 }
1113
1114 static int adxl367_read_event_config(struct iio_dev *indio_dev,
1115                                      const struct iio_chan_spec *chan,
1116                                      enum iio_event_type type,
1117                                      enum iio_event_direction dir)
1118 {
1119         struct adxl367_state *st = iio_priv(indio_dev);
1120         bool en;
1121         int ret;
1122
1123         switch (dir) {
1124         case IIO_EV_DIR_RISING:
1125                 ret = adxl367_get_act_interrupt_en(st, ADXL367_ACTIVITY, &en);
1126                 return ret ?: en;
1127         case IIO_EV_DIR_FALLING:
1128                 ret = adxl367_get_act_interrupt_en(st, ADXL367_INACTIVITY, &en);
1129                 return ret ?: en;
1130         default:
1131                 return -EINVAL;
1132         }
1133 }
1134
1135 static int adxl367_write_event_config(struct iio_dev *indio_dev,
1136                                       const struct iio_chan_spec *chan,
1137                                       enum iio_event_type type,
1138                                       enum iio_event_direction dir,
1139                                       int state)
1140 {
1141         struct adxl367_state *st = iio_priv(indio_dev);
1142         enum adxl367_activity_type act;
1143         int ret;
1144
1145         switch (dir) {
1146         case IIO_EV_DIR_RISING:
1147                 act = ADXL367_ACTIVITY;
1148                 break;
1149         case IIO_EV_DIR_FALLING:
1150                 act = ADXL367_INACTIVITY;
1151                 break;
1152         default:
1153                 return -EINVAL;
1154         }
1155
1156         ret = iio_device_claim_direct_mode(indio_dev);
1157         if (ret)
1158                 return ret;
1159
1160         mutex_lock(&st->lock);
1161
1162         ret = adxl367_set_measure_en(st, false);
1163         if (ret)
1164                 goto out;
1165
1166         ret = adxl367_set_act_interrupt_en(st, act, state);
1167         if (ret)
1168                 goto out;
1169
1170         ret = adxl367_set_act_en(st, act, state ? ADCL367_ACT_REF_ENABLED
1171                                                 : ADXL367_ACT_DISABLED);
1172         if (ret)
1173                 goto out;
1174
1175         ret = adxl367_set_measure_en(st, true);
1176
1177 out:
1178         mutex_unlock(&st->lock);
1179
1180         iio_device_release_direct_mode(indio_dev);
1181
1182         return ret;
1183 }
1184
1185 static ssize_t adxl367_get_fifo_enabled(struct device *dev,
1186                                         struct device_attribute *attr,
1187                                         char *buf)
1188 {
1189         struct adxl367_state *st = iio_priv(dev_to_iio_dev(dev));
1190         enum adxl367_fifo_mode fifo_mode;
1191         int ret;
1192
1193         ret = adxl367_get_fifo_mode(st, &fifo_mode);
1194         if (ret)
1195                 return ret;
1196
1197         return sysfs_emit(buf, "%d\n", fifo_mode != ADXL367_FIFO_MODE_DISABLED);
1198 }
1199
1200 static ssize_t adxl367_get_fifo_watermark(struct device *dev,
1201                                           struct device_attribute *attr,
1202                                           char *buf)
1203 {
1204         struct adxl367_state *st = iio_priv(dev_to_iio_dev(dev));
1205         unsigned int fifo_watermark;
1206
1207         mutex_lock(&st->lock);
1208         fifo_watermark = st->fifo_watermark;
1209         mutex_unlock(&st->lock);
1210
1211         return sysfs_emit(buf, "%d\n", fifo_watermark);
1212 }
1213
1214 static IIO_CONST_ATTR(hwfifo_watermark_min, "1");
1215 static IIO_CONST_ATTR(hwfifo_watermark_max,
1216                       __stringify(ADXL367_FIFO_MAX_WATERMARK));
1217 static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
1218                        adxl367_get_fifo_watermark, NULL, 0);
1219 static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
1220                        adxl367_get_fifo_enabled, NULL, 0);
1221
1222 static const struct attribute *adxl367_fifo_attributes[] = {
1223         &iio_const_attr_hwfifo_watermark_min.dev_attr.attr,
1224         &iio_const_attr_hwfifo_watermark_max.dev_attr.attr,
1225         &iio_dev_attr_hwfifo_watermark.dev_attr.attr,
1226         &iio_dev_attr_hwfifo_enabled.dev_attr.attr,
1227         NULL,
1228 };
1229
1230 static int adxl367_set_watermark(struct iio_dev *indio_dev, unsigned int val)
1231 {
1232         struct adxl367_state *st  = iio_priv(indio_dev);
1233         int ret;
1234
1235         if (val > ADXL367_FIFO_MAX_WATERMARK)
1236                 return -EINVAL;
1237
1238         mutex_lock(&st->lock);
1239
1240         ret = adxl367_set_measure_en(st, false);
1241         if (ret)
1242                 goto out;
1243
1244         ret = adxl367_set_fifo_watermark(st, val);
1245         if (ret)
1246                 goto out;
1247
1248         ret = adxl367_set_measure_en(st, true);
1249
1250 out:
1251         mutex_unlock(&st->lock);
1252
1253         return ret;
1254 }
1255
1256 static bool adxl367_find_mask_fifo_format(const unsigned long *scan_mask,
1257                                           enum adxl367_fifo_format *fifo_format)
1258 {
1259         size_t size = ARRAY_SIZE(adxl367_fifo_formats);
1260         int i;
1261
1262         for (i = 0; i < size; i++)
1263                 if (*scan_mask == adxl367_channel_masks[i])
1264                         break;
1265
1266         if (i == size)
1267                 return false;
1268
1269         *fifo_format = adxl367_fifo_formats[i];
1270
1271         return true;
1272 }
1273
1274 static int adxl367_update_scan_mode(struct iio_dev *indio_dev,
1275                                     const unsigned long *active_scan_mask)
1276 {
1277         struct adxl367_state *st  = iio_priv(indio_dev);
1278         enum adxl367_fifo_format fifo_format;
1279         unsigned int fifo_set_size;
1280         int ret;
1281
1282         if (!adxl367_find_mask_fifo_format(active_scan_mask, &fifo_format))
1283                 return -EINVAL;
1284
1285         fifo_set_size = bitmap_weight(active_scan_mask, indio_dev->masklength);
1286
1287         mutex_lock(&st->lock);
1288
1289         ret = adxl367_set_measure_en(st, false);
1290         if (ret)
1291                 goto out;
1292
1293         ret = adxl367_set_fifo_format(st, fifo_format);
1294         if (ret)
1295                 goto out;
1296
1297         ret = adxl367_set_fifo_set_size(st, fifo_set_size);
1298         if (ret)
1299                 goto out;
1300
1301         ret = adxl367_set_measure_en(st, true);
1302
1303 out:
1304         mutex_unlock(&st->lock);
1305
1306         return ret;
1307 }
1308
1309 static int adxl367_buffer_postenable(struct iio_dev *indio_dev)
1310 {
1311         struct adxl367_state *st = iio_priv(indio_dev);
1312         int ret;
1313
1314         mutex_lock(&st->lock);
1315
1316         ret = adxl367_set_temp_adc_mask_en(st, indio_dev->active_scan_mask,
1317                                            true);
1318         if (ret)
1319                 goto out;
1320
1321         ret = adxl367_set_measure_en(st, false);
1322         if (ret)
1323                 goto out;
1324
1325         ret = adxl367_set_fifo_watermark_interrupt_en(st, true);
1326         if (ret)
1327                 goto out;
1328
1329         ret = adxl367_set_fifo_mode(st, ADXL367_FIFO_MODE_STREAM);
1330         if (ret)
1331                 goto out;
1332
1333         ret = adxl367_set_measure_en(st, true);
1334
1335 out:
1336         mutex_unlock(&st->lock);
1337
1338         return ret;
1339 }
1340
1341 static int adxl367_buffer_predisable(struct iio_dev *indio_dev)
1342 {
1343         struct adxl367_state *st = iio_priv(indio_dev);
1344         int ret;
1345
1346         mutex_lock(&st->lock);
1347
1348         ret = adxl367_set_measure_en(st, false);
1349         if (ret)
1350                 goto out;
1351
1352         ret = adxl367_set_fifo_mode(st, ADXL367_FIFO_MODE_DISABLED);
1353         if (ret)
1354                 goto out;
1355
1356         ret = adxl367_set_fifo_watermark_interrupt_en(st, false);
1357         if (ret)
1358                 goto out;
1359
1360         ret = adxl367_set_measure_en(st, true);
1361         if (ret)
1362                 goto out;
1363
1364         ret = adxl367_set_temp_adc_mask_en(st, indio_dev->active_scan_mask,
1365                                            false);
1366
1367 out:
1368         mutex_unlock(&st->lock);
1369
1370         return ret;
1371 }
1372
1373 static const struct iio_buffer_setup_ops adxl367_buffer_ops = {
1374         .postenable = adxl367_buffer_postenable,
1375         .predisable = adxl367_buffer_predisable,
1376 };
1377
1378 static const struct iio_info adxl367_info = {
1379         .read_raw = adxl367_read_raw,
1380         .write_raw = adxl367_write_raw,
1381         .write_raw_get_fmt = adxl367_write_raw_get_fmt,
1382         .read_avail = adxl367_read_avail,
1383         .read_event_config = adxl367_read_event_config,
1384         .write_event_config = adxl367_write_event_config,
1385         .read_event_value = adxl367_read_event_value,
1386         .write_event_value = adxl367_write_event_value,
1387         .debugfs_reg_access = adxl367_reg_access,
1388         .hwfifo_set_watermark = adxl367_set_watermark,
1389         .update_scan_mode = adxl367_update_scan_mode,
1390 };
1391
1392 static const struct iio_event_spec adxl367_events[] = {
1393         {
1394                 .type = IIO_EV_TYPE_MAG_REFERENCED,
1395                 .dir = IIO_EV_DIR_RISING,
1396                 .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) |
1397                                        BIT(IIO_EV_INFO_PERIOD) |
1398                                        BIT(IIO_EV_INFO_VALUE),
1399         },
1400         {
1401                 .type = IIO_EV_TYPE_MAG_REFERENCED,
1402                 .dir = IIO_EV_DIR_FALLING,
1403                 .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) |
1404                                        BIT(IIO_EV_INFO_PERIOD) |
1405                                        BIT(IIO_EV_INFO_VALUE),
1406         },
1407 };
1408
1409 #define ADXL367_ACCEL_CHANNEL(index, reg, axis) {                       \
1410         .type = IIO_ACCEL,                                              \
1411         .address = (reg),                                               \
1412         .modified = 1,                                                  \
1413         .channel2 = IIO_MOD_##axis,                                     \
1414         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),                   \
1415         .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),           \
1416         .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE), \
1417         .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),        \
1418         .info_mask_shared_by_all_available =                            \
1419                         BIT(IIO_CHAN_INFO_SAMP_FREQ),                   \
1420         .event_spec = adxl367_events,                                   \
1421         .num_event_specs = ARRAY_SIZE(adxl367_events),                  \
1422         .scan_index = (index),                                          \
1423         .scan_type = {                                                  \
1424                 .sign = 's',                                            \
1425                 .realbits = 14,                                         \
1426                 .storagebits = 16,                                      \
1427                 .endianness = IIO_BE,                                   \
1428         },                                                              \
1429 }
1430
1431 #define ADXL367_CHANNEL(index, reg, _type) {                            \
1432         .type = (_type),                                                \
1433         .address = (reg),                                               \
1434         .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |                  \
1435                               BIT(IIO_CHAN_INFO_OFFSET) |               \
1436                               BIT(IIO_CHAN_INFO_SCALE),                 \
1437         .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),        \
1438         .scan_index = (index),                                          \
1439         .scan_type = {                                                  \
1440                 .sign = 's',                                            \
1441                 .realbits = 14,                                         \
1442                 .storagebits = 16,                                      \
1443                 .endianness = IIO_BE,                                   \
1444         },                                                              \
1445 }
1446
1447 static const struct iio_chan_spec adxl367_channels[] = {
1448         ADXL367_ACCEL_CHANNEL(ADXL367_X_CHANNEL_INDEX, ADXL367_REG_X_DATA_H, X),
1449         ADXL367_ACCEL_CHANNEL(ADXL367_Y_CHANNEL_INDEX, ADXL367_REG_Y_DATA_H, Y),
1450         ADXL367_ACCEL_CHANNEL(ADXL367_Z_CHANNEL_INDEX, ADXL367_REG_Z_DATA_H, Z),
1451         ADXL367_CHANNEL(ADXL367_TEMP_CHANNEL_INDEX, ADXL367_REG_TEMP_DATA_H,
1452                         IIO_TEMP),
1453         ADXL367_CHANNEL(ADXL367_EX_ADC_CHANNEL_INDEX, ADXL367_REG_EX_ADC_DATA_H,
1454                         IIO_VOLTAGE),
1455 };
1456
1457 static int adxl367_verify_devid(struct adxl367_state *st)
1458 {
1459         unsigned int val;
1460         int ret;
1461
1462         ret = regmap_read_poll_timeout(st->regmap, ADXL367_REG_DEVID, val,
1463                                        val == ADXL367_DEVID_AD, 1000, 10000);
1464         if (ret)
1465                 return dev_err_probe(st->dev, -ENODEV,
1466                                      "Invalid dev id 0x%02X, expected 0x%02X\n",
1467                                      val, ADXL367_DEVID_AD);
1468
1469         return 0;
1470 }
1471
1472 static int adxl367_setup(struct adxl367_state *st)
1473 {
1474         int ret;
1475
1476         ret = _adxl367_set_act_threshold(st, ADXL367_ACTIVITY,
1477                                          ADXL367_2G_RANGE_1G);
1478         if (ret)
1479                 return ret;
1480
1481         ret = _adxl367_set_act_threshold(st, ADXL367_INACTIVITY,
1482                                          ADXL367_2G_RANGE_100MG);
1483         if (ret)
1484                 return ret;
1485
1486         ret = adxl367_set_act_proc_mode(st, ADXL367_LOOPED);
1487         if (ret)
1488                 return ret;
1489
1490         ret = _adxl367_set_odr(st, ADXL367_ODR_400HZ);
1491         if (ret)
1492                 return ret;
1493
1494         ret = _adxl367_set_act_time_ms(st, 10);
1495         if (ret)
1496                 return ret;
1497
1498         ret = _adxl367_set_inact_time_ms(st, 10000);
1499         if (ret)
1500                 return ret;
1501
1502         return adxl367_set_measure_en(st, true);
1503 }
1504
1505 static void adxl367_disable_regulators(void *data)
1506 {
1507         struct adxl367_state *st = data;
1508
1509         regulator_bulk_disable(ARRAY_SIZE(st->regulators), st->regulators);
1510 }
1511
1512 int adxl367_probe(struct device *dev, const struct adxl367_ops *ops,
1513                   void *context, struct regmap *regmap, int irq)
1514 {
1515         struct iio_dev *indio_dev;
1516         struct adxl367_state *st;
1517         int ret;
1518
1519         indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
1520         if (!indio_dev)
1521                 return -ENOMEM;
1522
1523         st = iio_priv(indio_dev);
1524         st->dev = dev;
1525         st->regmap = regmap;
1526         st->context = context;
1527         st->ops = ops;
1528
1529         mutex_init(&st->lock);
1530
1531         indio_dev->channels = adxl367_channels;
1532         indio_dev->num_channels = ARRAY_SIZE(adxl367_channels);
1533         indio_dev->available_scan_masks = adxl367_channel_masks;
1534         indio_dev->name = "adxl367";
1535         indio_dev->info = &adxl367_info;
1536         indio_dev->modes = INDIO_DIRECT_MODE;
1537
1538         st->regulators[0].supply = "vdd";
1539         st->regulators[1].supply = "vddio";
1540
1541         ret = devm_regulator_bulk_get(st->dev, ARRAY_SIZE(st->regulators),
1542                                       st->regulators);
1543         if (ret)
1544                 return dev_err_probe(st->dev, ret,
1545                                      "Failed to get regulators\n");
1546
1547         ret = regulator_bulk_enable(ARRAY_SIZE(st->regulators), st->regulators);
1548         if (ret)
1549                 return dev_err_probe(st->dev, ret,
1550                                      "Failed to enable regulators\n");
1551
1552         ret = devm_add_action_or_reset(st->dev, adxl367_disable_regulators, st);
1553         if (ret)
1554                 return dev_err_probe(st->dev, ret,
1555                                      "Failed to add regulators disable action\n");
1556
1557         ret = regmap_write(st->regmap, ADXL367_REG_RESET, ADXL367_RESET_CODE);
1558         if (ret)
1559                 return ret;
1560
1561         ret = adxl367_verify_devid(st);
1562         if (ret)
1563                 return ret;
1564
1565         ret = adxl367_setup(st);
1566         if (ret)
1567                 return ret;
1568
1569         ret = devm_iio_kfifo_buffer_setup_ext(st->dev, indio_dev,
1570                                               &adxl367_buffer_ops,
1571                                               adxl367_fifo_attributes);
1572         if (ret)
1573                 return ret;
1574
1575         ret = devm_request_threaded_irq(st->dev, irq, NULL,
1576                                         adxl367_irq_handler, IRQF_ONESHOT,
1577                                         indio_dev->name, indio_dev);
1578         if (ret)
1579                 return dev_err_probe(st->dev, ret, "Failed to request irq\n");
1580
1581         return devm_iio_device_register(dev, indio_dev);
1582 }
1583 EXPORT_SYMBOL_NS_GPL(adxl367_probe, IIO_ADXL367);
1584
1585 MODULE_AUTHOR("Cosmin Tanislav <cosmin.tanislav@analog.com>");
1586 MODULE_DESCRIPTION("Analog Devices ADXL367 3-axis accelerometer driver");
1587 MODULE_LICENSE("GPL");