xref: /linux/drivers/iio/accel/adxl380.c (revision 7ec462100ef9142344ddbf86f2c3008b97acddbe)
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * ADXL380 3-Axis Digital Accelerometer core driver
4  *
5  * Copyright 2024 Analog Devices Inc.
6  */
7 
8 #include <linux/bitfield.h>
9 #include <linux/interrupt.h>
10 #include <linux/irq.h>
11 #include <linux/module.h>
12 #include <linux/property.h>
13 #include <linux/regmap.h>
14 #include <linux/units.h>
15 
16 #include <linux/unaligned.h>
17 
18 #include <linux/iio/buffer.h>
19 #include <linux/iio/events.h>
20 #include <linux/iio/iio.h>
21 #include <linux/iio/kfifo_buf.h>
22 #include <linux/iio/sysfs.h>
23 
24 #include <linux/regulator/consumer.h>
25 
26 #include "adxl380.h"
27 
28 #define ADXL380_ID_VAL				380
29 #define ADXL382_ID_VAL				382
30 
31 #define ADXL380_DEVID_AD_REG			0x00
32 #define ADLX380_PART_ID_REG			0x02
33 
34 #define ADXL380_X_DATA_H_REG			0x15
35 #define ADXL380_Y_DATA_H_REG			0x17
36 #define ADXL380_Z_DATA_H_REG			0x19
37 #define ADXL380_T_DATA_H_REG			0x1B
38 
39 #define ADXL380_MISC_0_REG			0x20
40 #define ADXL380_XL382_MSK			BIT(7)
41 
42 #define ADXL380_MISC_1_REG			0x21
43 
44 #define ADXL380_X_DSM_OFFSET_REG		0x4D
45 
46 #define ADXL380_ACT_INACT_CTL_REG		0x37
47 #define ADXL380_INACT_EN_MSK			BIT(2)
48 #define ADXL380_ACT_EN_MSK			BIT(0)
49 
50 #define ADXL380_SNSR_AXIS_EN_REG		0x38
51 #define ADXL380_ACT_INACT_AXIS_EN_MSK		GENMASK(2, 0)
52 
53 #define ADXL380_THRESH_ACT_H_REG		0x39
54 #define ADXL380_TIME_ACT_H_REG			0x3B
55 #define ADXL380_THRESH_INACT_H_REG		0x3E
56 #define ADXL380_TIME_INACT_H_REG		0x40
57 #define ADXL380_THRESH_MAX			GENMASK(12, 0)
58 #define ADXL380_TIME_MAX			GENMASK(24, 0)
59 
60 #define ADXL380_FIFO_CONFIG_0_REG		0x30
61 #define ADXL380_FIFO_SAMPLES_8_MSK		BIT(0)
62 #define ADXL380_FIFO_MODE_MSK			GENMASK(5, 4)
63 
64 #define ADXL380_FIFO_DISABLED			0
65 #define ADXL380_FIFO_NORMAL			1
66 #define ADXL380_FIFO_STREAMED			2
67 #define ADXL380_FIFO_TRIGGERED			3
68 
69 #define ADXL380_FIFO_CONFIG_1_REG		0x31
70 #define ADXL380_FIFO_STATUS_0_REG		0x1E
71 
72 #define ADXL380_TAP_THRESH_REG			0x43
73 #define ADXL380_TAP_DUR_REG			0x44
74 #define ADXL380_TAP_LATENT_REG			0x45
75 #define ADXL380_TAP_WINDOW_REG			0x46
76 #define ADXL380_TAP_TIME_MAX			GENMASK(7, 0)
77 
78 #define ADXL380_TAP_CFG_REG			0x47
79 #define ADXL380_TAP_AXIS_MSK			GENMASK(1, 0)
80 
81 #define ADXL380_TRIG_CFG_REG			0x49
82 #define ADXL380_TRIG_CFG_DEC_2X_MSK		BIT(7)
83 #define ADXL380_TRIG_CFG_SINC_RATE_MSK		BIT(6)
84 
85 #define ADXL380_FILTER_REG			0x50
86 #define ADXL380_FILTER_EQ_FILT_MSK		BIT(6)
87 #define ADXL380_FILTER_LPF_MODE_MSK		GENMASK(5, 4)
88 #define ADXL380_FILTER_HPF_PATH_MSK		BIT(3)
89 #define ADXL380_FILTER_HPF_CORNER_MSK		GENMASK(2, 0)
90 
91 #define ADXL380_OP_MODE_REG			0x26
92 #define ADXL380_OP_MODE_RANGE_MSK		GENMASK(7, 6)
93 #define ADXL380_OP_MODE_MSK			GENMASK(3, 0)
94 #define ADXL380_OP_MODE_STANDBY			0
95 #define ADXL380_OP_MODE_HEART_SOUND		1
96 #define ADXL380_OP_MODE_ULP			2
97 #define ADXL380_OP_MODE_VLP			3
98 #define ADXL380_OP_MODE_LP			4
99 #define ADXL380_OP_MODE_LP_ULP			6
100 #define ADXL380_OP_MODE_LP_VLP			7
101 #define ADXL380_OP_MODE_RBW			8
102 #define ADXL380_OP_MODE_RBW_ULP			10
103 #define ADXL380_OP_MODE_RBW_VLP			11
104 #define ADXL380_OP_MODE_HP			12
105 #define ADXL380_OP_MODE_HP_ULP			14
106 #define ADXL380_OP_MODE_HP_VLP			15
107 
108 #define ADXL380_OP_MODE_4G_RANGE		0
109 #define ADXL382_OP_MODE_15G_RANGE		0
110 #define ADXL380_OP_MODE_8G_RANGE		1
111 #define ADXL382_OP_MODE_30G_RANGE		1
112 #define ADXL380_OP_MODE_16G_RANGE		2
113 #define ADXL382_OP_MODE_60G_RANGE		2
114 
115 #define ADXL380_DIG_EN_REG			0x27
116 #define ADXL380_CHAN_EN_MSK(chan)		BIT(4 + (chan))
117 #define ADXL380_FIFO_EN_MSK			BIT(3)
118 
119 #define ADXL380_INT0_MAP0_REG			0x2B
120 #define ADXL380_INT1_MAP0_REG			0x2D
121 #define ADXL380_INT_MAP0_INACT_INT0_MSK		BIT(6)
122 #define ADXL380_INT_MAP0_ACT_INT0_MSK		BIT(5)
123 #define ADXL380_INT_MAP0_FIFO_WM_INT0_MSK	BIT(3)
124 
125 #define ADXL380_INT0_MAP1_REG			0x2C
126 #define ADXL380_INT1_MAP1_REG			0x2E
127 #define ADXL380_INT_MAP1_DOUBLE_TAP_INT0_MSK	BIT(1)
128 #define ADXL380_INT_MAP1_SINGLE_TAP_INT0_MSK	BIT(0)
129 
130 #define ADXL380_INT0_REG			0x5D
131 #define ADXL380_INT0_POL_MSK			BIT(7)
132 
133 #define ADXL380_RESET_REG			0x2A
134 #define ADXL380_FIFO_DATA			0x1D
135 
136 #define ADXL380_DEVID_AD_VAL			0xAD
137 #define ADXL380_RESET_CODE			0x52
138 
139 #define ADXL380_STATUS_0_REG			0x11
140 #define ADXL380_STATUS_0_FIFO_FULL_MSK		BIT(1)
141 #define ADXL380_STATUS_0_FIFO_WM_MSK		BIT(3)
142 
143 #define ADXL380_STATUS_1_INACT_MSK		BIT(6)
144 #define ADXL380_STATUS_1_ACT_MSK		BIT(5)
145 #define ADXL380_STATUS_1_DOUBLE_TAP_MSK		BIT(1)
146 #define ADXL380_STATUS_1_SINGLE_TAP_MSK		BIT(0)
147 
148 #define ADXL380_FIFO_SAMPLES			315UL
149 
150 enum adxl380_channels {
151 	ADXL380_ACCEL_X,
152 	ADXL380_ACCEL_Y,
153 	ADXL380_ACCEL_Z,
154 	ADXL380_TEMP,
155 	ADXL380_CH_NUM
156 };
157 
158 enum adxl380_axis {
159 	ADXL380_X_AXIS,
160 	ADXL380_Y_AXIS,
161 	ADXL380_Z_AXIS,
162 };
163 
164 enum adxl380_activity_type {
165 	ADXL380_ACTIVITY,
166 	ADXL380_INACTIVITY,
167 };
168 
169 enum adxl380_tap_type {
170 	ADXL380_SINGLE_TAP,
171 	ADXL380_DOUBLE_TAP,
172 };
173 
174 enum adxl380_tap_time_type {
175 	ADXL380_TAP_TIME_LATENT,
176 	ADXL380_TAP_TIME_WINDOW,
177 };
178 
179 static const int adxl380_range_scale_factor_tbl[] = { 1, 2, 4 };
180 
181 const struct adxl380_chip_info adxl380_chip_info = {
182 	.name = "adxl380",
183 	.chip_id = ADXL380_ID_VAL,
184 	.scale_tbl = {
185 		[ADXL380_OP_MODE_4G_RANGE] = { 0, 1307226 },
186 		[ADXL380_OP_MODE_8G_RANGE] = { 0, 2615434 },
187 		[ADXL380_OP_MODE_16G_RANGE] = { 0, 5229886 },
188 	},
189 	.samp_freq_tbl = { 8000, 16000, 32000 },
190 	/*
191 	 * The datasheet defines an intercept of 470 LSB at 25 degC
192 	 * and a sensitivity of 10.2 LSB/C.
193 	 */
194 	.temp_offset =  25 * 102 / 10 - 470,
195 
196 };
197 EXPORT_SYMBOL_NS_GPL(adxl380_chip_info, IIO_ADXL380);
198 
199 const struct adxl380_chip_info adxl382_chip_info = {
200 	.name = "adxl382",
201 	.chip_id = ADXL382_ID_VAL,
202 	.scale_tbl = {
203 		[ADXL382_OP_MODE_15G_RANGE] = { 0, 4903325 },
204 		[ADXL382_OP_MODE_30G_RANGE] = { 0, 9806650 },
205 		[ADXL382_OP_MODE_60G_RANGE] = { 0, 19613300 },
206 	},
207 	.samp_freq_tbl = { 16000, 32000, 64000 },
208 	/*
209 	 * The datasheet defines an intercept of 570 LSB at 25 degC
210 	 * and a sensitivity of 10.2 LSB/C.
211 	 */
212 	.temp_offset =  25 * 102 / 10 - 570,
213 };
214 EXPORT_SYMBOL_NS_GPL(adxl382_chip_info, IIO_ADXL380);
215 
216 static const unsigned int adxl380_th_reg_high_addr[2] = {
217 	[ADXL380_ACTIVITY] = ADXL380_THRESH_ACT_H_REG,
218 	[ADXL380_INACTIVITY] = ADXL380_THRESH_INACT_H_REG,
219 };
220 
221 static const unsigned int adxl380_time_reg_high_addr[2] = {
222 	[ADXL380_ACTIVITY] = ADXL380_TIME_ACT_H_REG,
223 	[ADXL380_INACTIVITY] = ADXL380_TIME_INACT_H_REG,
224 };
225 
226 static const unsigned int adxl380_tap_time_reg[2] = {
227 	[ADXL380_TAP_TIME_LATENT] = ADXL380_TAP_LATENT_REG,
228 	[ADXL380_TAP_TIME_WINDOW] = ADXL380_TAP_WINDOW_REG,
229 };
230 
231 struct adxl380_state {
232 	struct regmap *regmap;
233 	struct device *dev;
234 	const struct adxl380_chip_info *chip_info;
235 	/*
236 	 * Synchronize access to members of driver state, and ensure atomicity
237 	 * of consecutive regmap operations.
238 	 */
239 	struct mutex lock;
240 	enum adxl380_axis tap_axis_en;
241 	u8 range;
242 	u8 odr;
243 	u8 fifo_set_size;
244 	u8 transf_buf[3];
245 	u16 watermark;
246 	u32 act_time_ms;
247 	u32 act_threshold;
248 	u32 inact_time_ms;
249 	u32 inact_threshold;
250 	u32 tap_latent_us;
251 	u32 tap_window_us;
252 	u32 tap_duration_us;
253 	u32 tap_threshold;
254 	int irq;
255 	int int_map[2];
256 	int lpf_tbl[4];
257 	int hpf_tbl[7][2];
258 
259 	__be16 fifo_buf[ADXL380_FIFO_SAMPLES] __aligned(IIO_DMA_MINALIGN);
260 };
261 
adxl380_readable_noinc_reg(struct device * dev,unsigned int reg)262 bool adxl380_readable_noinc_reg(struct device *dev, unsigned int reg)
263 {
264 	return reg == ADXL380_FIFO_DATA;
265 }
266 EXPORT_SYMBOL_NS_GPL(adxl380_readable_noinc_reg, IIO_ADXL380);
267 
adxl380_set_measure_en(struct adxl380_state * st,bool en)268 static int adxl380_set_measure_en(struct adxl380_state *st, bool en)
269 {
270 	int ret;
271 	unsigned int act_inact_ctl;
272 	u8 op_mode = ADXL380_OP_MODE_STANDBY;
273 
274 	if (en) {
275 		ret = regmap_read(st->regmap, ADXL380_ACT_INACT_CTL_REG, &act_inact_ctl);
276 		if (ret)
277 			return ret;
278 
279 		/* Activity/ Inactivity detection available only in VLP/ULP mode */
280 		if (FIELD_GET(ADXL380_ACT_EN_MSK, act_inact_ctl) ||
281 		    FIELD_GET(ADXL380_INACT_EN_MSK, act_inact_ctl))
282 			op_mode = ADXL380_OP_MODE_VLP;
283 		else
284 			op_mode = ADXL380_OP_MODE_HP;
285 	}
286 
287 	return regmap_update_bits(st->regmap, ADXL380_OP_MODE_REG,
288 				 ADXL380_OP_MODE_MSK,
289 				 FIELD_PREP(ADXL380_OP_MODE_MSK, op_mode));
290 }
291 
adxl380_scale_act_inact_thresholds(struct adxl380_state * st,u8 old_range,u8 new_range)292 static void adxl380_scale_act_inact_thresholds(struct adxl380_state *st,
293 					       u8 old_range,
294 					       u8 new_range)
295 {
296 	st->act_threshold = mult_frac(st->act_threshold,
297 				      adxl380_range_scale_factor_tbl[old_range],
298 				      adxl380_range_scale_factor_tbl[new_range]);
299 	st->inact_threshold = mult_frac(st->inact_threshold,
300 					adxl380_range_scale_factor_tbl[old_range],
301 					adxl380_range_scale_factor_tbl[new_range]);
302 }
303 
adxl380_write_act_inact_threshold(struct adxl380_state * st,enum adxl380_activity_type act,unsigned int th)304 static int adxl380_write_act_inact_threshold(struct adxl380_state *st,
305 					     enum adxl380_activity_type act,
306 					     unsigned int th)
307 {
308 	int ret;
309 	u8 reg = adxl380_th_reg_high_addr[act];
310 
311 	if (th > ADXL380_THRESH_MAX)
312 		return -EINVAL;
313 
314 	ret = regmap_write(st->regmap, reg + 1, th & GENMASK(7, 0));
315 	if (ret)
316 		return ret;
317 
318 	ret = regmap_update_bits(st->regmap, reg, GENMASK(2, 0), th >> 8);
319 	if (ret)
320 		return ret;
321 
322 	if (act == ADXL380_ACTIVITY)
323 		st->act_threshold = th;
324 	else
325 		st->inact_threshold = th;
326 
327 	return 0;
328 }
329 
adxl380_set_act_inact_threshold(struct iio_dev * indio_dev,enum adxl380_activity_type act,u16 th)330 static int adxl380_set_act_inact_threshold(struct iio_dev *indio_dev,
331 					   enum adxl380_activity_type act,
332 					   u16 th)
333 {
334 	struct adxl380_state *st = iio_priv(indio_dev);
335 	int ret;
336 
337 	guard(mutex)(&st->lock);
338 
339 	ret = adxl380_set_measure_en(st, false);
340 	if (ret)
341 		return ret;
342 
343 	ret = adxl380_write_act_inact_threshold(st, act, th);
344 	if (ret)
345 		return ret;
346 
347 	return adxl380_set_measure_en(st, true);
348 }
349 
adxl380_set_tap_threshold_value(struct iio_dev * indio_dev,u8 th)350 static int adxl380_set_tap_threshold_value(struct iio_dev *indio_dev, u8 th)
351 {
352 	int ret;
353 	struct adxl380_state *st = iio_priv(indio_dev);
354 
355 	guard(mutex)(&st->lock);
356 
357 	ret = adxl380_set_measure_en(st, false);
358 	if (ret)
359 		return ret;
360 
361 	ret = regmap_write(st->regmap, ADXL380_TAP_THRESH_REG, th);
362 	if (ret)
363 		return ret;
364 
365 	st->tap_threshold = th;
366 
367 	return adxl380_set_measure_en(st, true);
368 }
369 
_adxl380_write_tap_time_us(struct adxl380_state * st,enum adxl380_tap_time_type tap_time_type,u32 us)370 static int _adxl380_write_tap_time_us(struct adxl380_state *st,
371 				      enum adxl380_tap_time_type tap_time_type,
372 				      u32 us)
373 {
374 	u8 reg = adxl380_tap_time_reg[tap_time_type];
375 	unsigned int reg_val;
376 	int ret;
377 
378 	/* scale factor for tap window is 1250us / LSB */
379 	reg_val = DIV_ROUND_CLOSEST(us, 1250);
380 	if (reg_val > ADXL380_TAP_TIME_MAX)
381 		reg_val = ADXL380_TAP_TIME_MAX;
382 
383 	ret = regmap_write(st->regmap, reg, reg_val);
384 	if (ret)
385 		return ret;
386 
387 	if (tap_time_type == ADXL380_TAP_TIME_WINDOW)
388 		st->tap_window_us = us;
389 	else
390 		st->tap_latent_us = us;
391 
392 	return 0;
393 }
394 
adxl380_write_tap_time_us(struct adxl380_state * st,enum adxl380_tap_time_type tap_time_type,u32 us)395 static int adxl380_write_tap_time_us(struct adxl380_state *st,
396 				     enum adxl380_tap_time_type tap_time_type, u32 us)
397 {
398 	int ret;
399 
400 	guard(mutex)(&st->lock);
401 
402 	ret = adxl380_set_measure_en(st, false);
403 	if (ret)
404 		return ret;
405 
406 	ret = _adxl380_write_tap_time_us(st, tap_time_type, us);
407 	if (ret)
408 		return ret;
409 
410 	return adxl380_set_measure_en(st, true);
411 }
412 
adxl380_write_tap_dur_us(struct iio_dev * indio_dev,u32 us)413 static int adxl380_write_tap_dur_us(struct iio_dev *indio_dev, u32 us)
414 {
415 	int ret;
416 	unsigned int reg_val;
417 	struct adxl380_state *st = iio_priv(indio_dev);
418 
419 	/* 625us per code is the scale factor of TAP_DUR register */
420 	reg_val = DIV_ROUND_CLOSEST(us, 625);
421 
422 	ret = adxl380_set_measure_en(st, false);
423 	if (ret)
424 		return ret;
425 
426 	ret = regmap_write(st->regmap, ADXL380_TAP_DUR_REG, reg_val);
427 	if (ret)
428 		return ret;
429 
430 	return adxl380_set_measure_en(st, true);
431 }
432 
adxl380_read_chn(struct adxl380_state * st,u8 addr)433 static int adxl380_read_chn(struct adxl380_state *st, u8 addr)
434 {
435 	int ret;
436 
437 	guard(mutex)(&st->lock);
438 
439 	ret = regmap_bulk_read(st->regmap, addr, &st->transf_buf, 2);
440 	if (ret)
441 		return ret;
442 
443 	return get_unaligned_be16(st->transf_buf);
444 }
445 
adxl380_get_odr(struct adxl380_state * st,int * odr)446 static int adxl380_get_odr(struct adxl380_state *st, int *odr)
447 {
448 	int ret;
449 	unsigned int trig_cfg, odr_idx;
450 
451 	ret = regmap_read(st->regmap, ADXL380_TRIG_CFG_REG, &trig_cfg);
452 	if (ret)
453 		return ret;
454 
455 	odr_idx = (FIELD_GET(ADXL380_TRIG_CFG_SINC_RATE_MSK, trig_cfg) << 1) |
456 		  (FIELD_GET(ADXL380_TRIG_CFG_DEC_2X_MSK, trig_cfg) & 1);
457 
458 	*odr = st->chip_info->samp_freq_tbl[odr_idx];
459 
460 	return 0;
461 }
462 
463 static const int adxl380_lpf_div[] = {
464 	1, 4, 8, 16,
465 };
466 
adxl380_fill_lpf_tbl(struct adxl380_state * st)467 static int adxl380_fill_lpf_tbl(struct adxl380_state *st)
468 {
469 	int ret, i;
470 	int odr;
471 
472 	ret = adxl380_get_odr(st, &odr);
473 	if (ret)
474 		return ret;
475 
476 	for (i = 0; i < ARRAY_SIZE(st->lpf_tbl); i++)
477 		st->lpf_tbl[i] = DIV_ROUND_CLOSEST(odr, adxl380_lpf_div[i]);
478 
479 	return 0;
480 }
481 
482 static const int adxl380_hpf_mul[] = {
483 	0, 247000, 62084, 15545, 3862, 954, 238,
484 };
485 
adxl380_fill_hpf_tbl(struct adxl380_state * st)486 static int adxl380_fill_hpf_tbl(struct adxl380_state *st)
487 {
488 	int i, ret, odr_hz;
489 	u32 multiplier;
490 	u64 div, rem, odr;
491 
492 	ret =  adxl380_get_odr(st, &odr_hz);
493 	if (ret)
494 		return ret;
495 
496 	for (i = 0; i < ARRAY_SIZE(adxl380_hpf_mul); i++) {
497 		odr = mul_u64_u32_shr(odr_hz, MEGA, 0);
498 		multiplier = adxl380_hpf_mul[i];
499 		div = div64_u64_rem(mul_u64_u32_shr(odr, multiplier, 0),
500 				    TERA * 100, &rem);
501 
502 		st->hpf_tbl[i][0] = div;
503 		st->hpf_tbl[i][1] = div_u64(rem, MEGA * 100);
504 	}
505 
506 	return 0;
507 }
508 
adxl380_set_odr(struct adxl380_state * st,u8 odr)509 static int adxl380_set_odr(struct adxl380_state *st, u8 odr)
510 {
511 	int ret;
512 
513 	guard(mutex)(&st->lock);
514 
515 	ret = adxl380_set_measure_en(st, false);
516 	if (ret)
517 		return ret;
518 
519 	ret = regmap_update_bits(st->regmap, ADXL380_TRIG_CFG_REG,
520 				 ADXL380_TRIG_CFG_DEC_2X_MSK,
521 				 FIELD_PREP(ADXL380_TRIG_CFG_DEC_2X_MSK, odr & 1));
522 	if (ret)
523 		return ret;
524 
525 	ret = regmap_update_bits(st->regmap, ADXL380_TRIG_CFG_REG,
526 				 ADXL380_TRIG_CFG_SINC_RATE_MSK,
527 				 FIELD_PREP(ADXL380_TRIG_CFG_SINC_RATE_MSK, odr >> 1));
528 	if (ret)
529 		return ret;
530 
531 	ret = adxl380_set_measure_en(st, true);
532 	if (ret)
533 		return ret;
534 
535 	ret = adxl380_fill_lpf_tbl(st);
536 	if (ret)
537 		return ret;
538 
539 	return adxl380_fill_hpf_tbl(st);
540 }
541 
adxl380_find_match_1d_tbl(const int * array,unsigned int size,int val)542 static int adxl380_find_match_1d_tbl(const int *array, unsigned int size,
543 				     int val)
544 {
545 	int i;
546 
547 	for (i = 0; i < size; i++) {
548 		if (val == array[i])
549 			return i;
550 	}
551 
552 	return size - 1;
553 }
554 
adxl380_find_match_2d_tbl(const int (* freq_tbl)[2],int n,int val,int val2)555 static int adxl380_find_match_2d_tbl(const int (*freq_tbl)[2], int n, int val, int val2)
556 {
557 	int i;
558 
559 	for (i = 0; i < n; i++) {
560 		if (freq_tbl[i][0] == val && freq_tbl[i][1] == val2)
561 			return i;
562 	}
563 
564 	return -EINVAL;
565 }
566 
adxl380_get_lpf(struct adxl380_state * st,int * lpf)567 static int adxl380_get_lpf(struct adxl380_state *st, int *lpf)
568 {
569 	int ret;
570 	unsigned int trig_cfg, lpf_idx;
571 
572 	guard(mutex)(&st->lock);
573 
574 	ret = regmap_read(st->regmap, ADXL380_FILTER_REG, &trig_cfg);
575 	if (ret)
576 		return ret;
577 
578 	lpf_idx = FIELD_GET(ADXL380_FILTER_LPF_MODE_MSK, trig_cfg);
579 
580 	*lpf = st->lpf_tbl[lpf_idx];
581 
582 	return 0;
583 }
584 
adxl380_set_lpf(struct adxl380_state * st,u8 lpf)585 static int adxl380_set_lpf(struct adxl380_state *st, u8 lpf)
586 {
587 	int ret;
588 	u8 eq_bypass = 0;
589 
590 	guard(mutex)(&st->lock);
591 
592 	ret = adxl380_set_measure_en(st, false);
593 	if (ret)
594 		return ret;
595 
596 	if (lpf)
597 		eq_bypass = 1;
598 
599 	ret = regmap_update_bits(st->regmap, ADXL380_FILTER_REG,
600 				 ADXL380_FILTER_EQ_FILT_MSK,
601 				 FIELD_PREP(ADXL380_FILTER_EQ_FILT_MSK, eq_bypass));
602 	if (ret)
603 		return ret;
604 
605 	ret = regmap_update_bits(st->regmap, ADXL380_FILTER_REG,
606 				 ADXL380_FILTER_LPF_MODE_MSK,
607 				 FIELD_PREP(ADXL380_FILTER_LPF_MODE_MSK, lpf));
608 	if (ret)
609 		return ret;
610 
611 	return adxl380_set_measure_en(st, true);
612 }
613 
adxl380_get_hpf(struct adxl380_state * st,int * hpf_int,int * hpf_frac)614 static int adxl380_get_hpf(struct adxl380_state *st, int *hpf_int, int *hpf_frac)
615 {
616 	int ret;
617 	unsigned int trig_cfg, hpf_idx;
618 
619 	guard(mutex)(&st->lock);
620 
621 	ret = regmap_read(st->regmap, ADXL380_FILTER_REG, &trig_cfg);
622 	if (ret)
623 		return ret;
624 
625 	hpf_idx = FIELD_GET(ADXL380_FILTER_HPF_CORNER_MSK, trig_cfg);
626 
627 	*hpf_int = st->hpf_tbl[hpf_idx][0];
628 	*hpf_frac = st->hpf_tbl[hpf_idx][1];
629 
630 	return 0;
631 }
632 
adxl380_set_hpf(struct adxl380_state * st,u8 hpf)633 static int adxl380_set_hpf(struct adxl380_state *st, u8 hpf)
634 {
635 	int ret;
636 	u8 hpf_path = 0;
637 
638 	guard(mutex)(&st->lock);
639 
640 	ret = adxl380_set_measure_en(st, false);
641 	if (ret)
642 		return ret;
643 
644 	if (hpf)
645 		hpf_path = 1;
646 
647 	ret = regmap_update_bits(st->regmap, ADXL380_FILTER_REG,
648 				 ADXL380_FILTER_HPF_PATH_MSK,
649 				 FIELD_PREP(ADXL380_FILTER_HPF_PATH_MSK, hpf_path));
650 	if (ret)
651 		return ret;
652 
653 	ret = regmap_update_bits(st->regmap, ADXL380_FILTER_REG,
654 				 ADXL380_FILTER_HPF_CORNER_MSK,
655 				 FIELD_PREP(ADXL380_FILTER_HPF_CORNER_MSK, hpf));
656 	if (ret)
657 		return ret;
658 
659 	return adxl380_set_measure_en(st, true);
660 }
661 
_adxl380_set_act_inact_time_ms(struct adxl380_state * st,enum adxl380_activity_type act,u32 ms)662 static int _adxl380_set_act_inact_time_ms(struct adxl380_state *st,
663 					  enum adxl380_activity_type act,
664 					  u32 ms)
665 {
666 	u8 reg = adxl380_time_reg_high_addr[act];
667 	unsigned int reg_val;
668 	int ret;
669 
670 	/* 500us per code is the scale factor of TIME_ACT / TIME_INACT registers */
671 	reg_val = min(DIV_ROUND_CLOSEST(ms * 1000, 500), ADXL380_TIME_MAX);
672 
673 	put_unaligned_be24(reg_val, &st->transf_buf[0]);
674 
675 	ret = regmap_bulk_write(st->regmap, reg, st->transf_buf, sizeof(st->transf_buf));
676 	if (ret)
677 		return ret;
678 
679 	if (act == ADXL380_ACTIVITY)
680 		st->act_time_ms = ms;
681 	else
682 		st->inact_time_ms = ms;
683 
684 	return 0;
685 }
686 
adxl380_set_act_inact_time_ms(struct adxl380_state * st,enum adxl380_activity_type act,u32 ms)687 static int adxl380_set_act_inact_time_ms(struct adxl380_state *st,
688 					 enum adxl380_activity_type act,
689 					 u32 ms)
690 {
691 	int ret;
692 
693 	guard(mutex)(&st->lock);
694 
695 	ret = adxl380_set_measure_en(st, false);
696 	if (ret)
697 		return ret;
698 
699 	ret = _adxl380_set_act_inact_time_ms(st, act, ms);
700 	if (ret)
701 		return ret;
702 
703 	return adxl380_set_measure_en(st, true);
704 }
705 
adxl380_set_range(struct adxl380_state * st,u8 range)706 static int adxl380_set_range(struct adxl380_state *st, u8 range)
707 {
708 	int ret;
709 
710 	guard(mutex)(&st->lock);
711 
712 	ret = adxl380_set_measure_en(st, false);
713 	if (ret)
714 		return ret;
715 
716 	ret = regmap_update_bits(st->regmap, ADXL380_OP_MODE_REG,
717 				 ADXL380_OP_MODE_RANGE_MSK,
718 				 FIELD_PREP(ADXL380_OP_MODE_RANGE_MSK, range));
719 
720 	if (ret)
721 		return ret;
722 
723 	adxl380_scale_act_inact_thresholds(st, st->range, range);
724 
725 	/* Activity thresholds depend on range */
726 	ret = adxl380_write_act_inact_threshold(st, ADXL380_ACTIVITY,
727 						st->act_threshold);
728 	if (ret)
729 		return ret;
730 
731 	ret = adxl380_write_act_inact_threshold(st, ADXL380_INACTIVITY,
732 						st->inact_threshold);
733 	if (ret)
734 		return ret;
735 
736 	st->range = range;
737 
738 	return adxl380_set_measure_en(st, true);
739 }
740 
adxl380_write_act_inact_en(struct adxl380_state * st,enum adxl380_activity_type type,bool en)741 static int adxl380_write_act_inact_en(struct adxl380_state *st,
742 				      enum adxl380_activity_type type,
743 				      bool en)
744 {
745 	if (type == ADXL380_ACTIVITY)
746 		return regmap_update_bits(st->regmap, ADXL380_ACT_INACT_CTL_REG,
747 					  ADXL380_ACT_EN_MSK,
748 					  FIELD_PREP(ADXL380_ACT_EN_MSK, en));
749 
750 	return regmap_update_bits(st->regmap, ADXL380_ACT_INACT_CTL_REG,
751 				  ADXL380_INACT_EN_MSK,
752 				  FIELD_PREP(ADXL380_INACT_EN_MSK, en));
753 }
754 
adxl380_read_act_inact_int(struct adxl380_state * st,enum adxl380_activity_type type,bool * en)755 static int adxl380_read_act_inact_int(struct adxl380_state *st,
756 				      enum adxl380_activity_type type,
757 				      bool *en)
758 {
759 	int ret;
760 	unsigned int reg_val;
761 
762 	guard(mutex)(&st->lock);
763 
764 	ret = regmap_read(st->regmap, st->int_map[0], &reg_val);
765 	if (ret)
766 		return ret;
767 
768 	if (type == ADXL380_ACTIVITY)
769 		*en = FIELD_GET(ADXL380_INT_MAP0_ACT_INT0_MSK, reg_val);
770 	else
771 		*en = FIELD_GET(ADXL380_INT_MAP0_INACT_INT0_MSK, reg_val);
772 
773 	return 0;
774 }
775 
adxl380_write_act_inact_int(struct adxl380_state * st,enum adxl380_activity_type act,bool en)776 static int adxl380_write_act_inact_int(struct adxl380_state *st,
777 				       enum adxl380_activity_type act,
778 				       bool en)
779 {
780 	if (act == ADXL380_ACTIVITY)
781 		return regmap_update_bits(st->regmap, st->int_map[0],
782 					  ADXL380_INT_MAP0_ACT_INT0_MSK,
783 					  FIELD_PREP(ADXL380_INT_MAP0_ACT_INT0_MSK, en));
784 
785 	return regmap_update_bits(st->regmap, st->int_map[0],
786 				  ADXL380_INT_MAP0_INACT_INT0_MSK,
787 				  FIELD_PREP(ADXL380_INT_MAP0_INACT_INT0_MSK, en));
788 }
789 
adxl380_act_inact_config(struct adxl380_state * st,enum adxl380_activity_type type,bool en)790 static int adxl380_act_inact_config(struct adxl380_state *st,
791 				    enum adxl380_activity_type type,
792 				    bool en)
793 {
794 	int ret;
795 
796 	guard(mutex)(&st->lock);
797 
798 	ret = adxl380_set_measure_en(st, false);
799 	if (ret)
800 		return ret;
801 
802 	ret = adxl380_write_act_inact_en(st, type, en);
803 	if (ret)
804 		return ret;
805 
806 	ret = adxl380_write_act_inact_int(st, type, en);
807 	if (ret)
808 		return ret;
809 
810 	return adxl380_set_measure_en(st, true);
811 }
812 
adxl380_write_tap_axis(struct adxl380_state * st,enum adxl380_axis axis)813 static int adxl380_write_tap_axis(struct adxl380_state *st,
814 				  enum adxl380_axis axis)
815 {
816 	int ret;
817 
818 	ret = regmap_update_bits(st->regmap, ADXL380_TAP_CFG_REG,
819 				 ADXL380_TAP_AXIS_MSK,
820 				 FIELD_PREP(ADXL380_TAP_AXIS_MSK, axis));
821 
822 	if (ret)
823 		return ret;
824 
825 	st->tap_axis_en = axis;
826 
827 	return 0;
828 }
829 
adxl380_read_tap_int(struct adxl380_state * st,enum adxl380_tap_type type,bool * en)830 static int adxl380_read_tap_int(struct adxl380_state *st, enum adxl380_tap_type type, bool *en)
831 {
832 	int ret;
833 	unsigned int reg_val;
834 
835 	ret = regmap_read(st->regmap, st->int_map[1], &reg_val);
836 	if (ret)
837 		return ret;
838 
839 	if (type == ADXL380_SINGLE_TAP)
840 		*en = FIELD_GET(ADXL380_INT_MAP1_SINGLE_TAP_INT0_MSK, reg_val);
841 	else
842 		*en = FIELD_GET(ADXL380_INT_MAP1_DOUBLE_TAP_INT0_MSK, reg_val);
843 
844 	return 0;
845 }
846 
adxl380_write_tap_int(struct adxl380_state * st,enum adxl380_tap_type type,bool en)847 static int adxl380_write_tap_int(struct adxl380_state *st, enum adxl380_tap_type type, bool en)
848 {
849 	if (type == ADXL380_SINGLE_TAP)
850 		return regmap_update_bits(st->regmap, st->int_map[1],
851 					  ADXL380_INT_MAP1_SINGLE_TAP_INT0_MSK,
852 					  FIELD_PREP(ADXL380_INT_MAP1_SINGLE_TAP_INT0_MSK, en));
853 
854 	return regmap_update_bits(st->regmap, st->int_map[1],
855 				  ADXL380_INT_MAP1_DOUBLE_TAP_INT0_MSK,
856 				  FIELD_PREP(ADXL380_INT_MAP1_DOUBLE_TAP_INT0_MSK, en));
857 }
858 
adxl380_tap_config(struct adxl380_state * st,enum adxl380_axis axis,enum adxl380_tap_type type,bool en)859 static int adxl380_tap_config(struct adxl380_state *st,
860 			      enum adxl380_axis axis,
861 			      enum adxl380_tap_type type,
862 			      bool en)
863 {
864 	int ret;
865 
866 	guard(mutex)(&st->lock);
867 
868 	ret = adxl380_set_measure_en(st, false);
869 	if (ret)
870 		return ret;
871 
872 	ret = adxl380_write_tap_axis(st, axis);
873 	if (ret)
874 		return ret;
875 
876 	ret = adxl380_write_tap_int(st, type, en);
877 	if (ret)
878 		return ret;
879 
880 	return adxl380_set_measure_en(st, true);
881 }
882 
adxl380_set_fifo_samples(struct adxl380_state * st)883 static int adxl380_set_fifo_samples(struct adxl380_state *st)
884 {
885 	int ret;
886 	u16 fifo_samples = st->watermark * st->fifo_set_size;
887 
888 	ret = regmap_update_bits(st->regmap, ADXL380_FIFO_CONFIG_0_REG,
889 				 ADXL380_FIFO_SAMPLES_8_MSK,
890 				 FIELD_PREP(ADXL380_FIFO_SAMPLES_8_MSK,
891 					    (fifo_samples & BIT(8))));
892 	if (ret)
893 		return ret;
894 
895 	return regmap_write(st->regmap, ADXL380_FIFO_CONFIG_1_REG,
896 			    fifo_samples & 0xFF);
897 }
898 
adxl380_get_status(struct adxl380_state * st,u8 * status0,u8 * status1)899 static int adxl380_get_status(struct adxl380_state *st, u8 *status0, u8 *status1)
900 {
901 	int ret;
902 
903 	/* STATUS0, STATUS1 are adjacent regs */
904 	ret = regmap_bulk_read(st->regmap, ADXL380_STATUS_0_REG,
905 			       &st->transf_buf, 2);
906 	if (ret)
907 		return ret;
908 
909 	*status0 = st->transf_buf[0];
910 	*status1 = st->transf_buf[1];
911 
912 	return 0;
913 }
914 
adxl380_get_fifo_entries(struct adxl380_state * st,u16 * fifo_entries)915 static int adxl380_get_fifo_entries(struct adxl380_state *st, u16 *fifo_entries)
916 {
917 	int ret;
918 
919 	ret = regmap_bulk_read(st->regmap, ADXL380_FIFO_STATUS_0_REG,
920 			       &st->transf_buf, 2);
921 	if (ret)
922 		return ret;
923 
924 	*fifo_entries = st->transf_buf[0] | ((BIT(0) & st->transf_buf[1]) << 8);
925 
926 	return 0;
927 }
928 
adxl380_push_event(struct iio_dev * indio_dev,s64 timestamp,u8 status1)929 static void adxl380_push_event(struct iio_dev *indio_dev, s64 timestamp,
930 			       u8 status1)
931 {
932 	if (FIELD_GET(ADXL380_STATUS_1_ACT_MSK, status1))
933 		iio_push_event(indio_dev,
934 			       IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
935 						  IIO_EV_TYPE_THRESH, IIO_EV_DIR_RISING),
936 			       timestamp);
937 
938 	if (FIELD_GET(ADXL380_STATUS_1_INACT_MSK, status1))
939 		iio_push_event(indio_dev,
940 			       IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
941 						  IIO_EV_TYPE_THRESH, IIO_EV_DIR_FALLING),
942 			       timestamp);
943 	if (FIELD_GET(ADXL380_STATUS_1_SINGLE_TAP_MSK, status1))
944 		iio_push_event(indio_dev,
945 			       IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
946 						  IIO_EV_TYPE_GESTURE, IIO_EV_DIR_SINGLETAP),
947 			       timestamp);
948 
949 	if (FIELD_GET(ADXL380_STATUS_1_DOUBLE_TAP_MSK, status1))
950 		iio_push_event(indio_dev,
951 			       IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
952 						  IIO_EV_TYPE_GESTURE, IIO_EV_DIR_DOUBLETAP),
953 			       timestamp);
954 }
955 
adxl380_irq_handler(int irq,void * p)956 static irqreturn_t adxl380_irq_handler(int irq, void  *p)
957 {
958 	struct iio_dev *indio_dev = p;
959 	struct adxl380_state *st = iio_priv(indio_dev);
960 	u8 status0, status1;
961 	u16 fifo_entries;
962 	int i;
963 	int ret;
964 
965 	guard(mutex)(&st->lock);
966 
967 	ret = adxl380_get_status(st, &status0, &status1);
968 	if (ret)
969 		return IRQ_HANDLED;
970 
971 	adxl380_push_event(indio_dev, iio_get_time_ns(indio_dev), status1);
972 
973 	if (!FIELD_GET(ADXL380_STATUS_0_FIFO_WM_MSK, status0))
974 		return IRQ_HANDLED;
975 
976 	ret = adxl380_get_fifo_entries(st, &fifo_entries);
977 	if (ret)
978 		return IRQ_HANDLED;
979 
980 	for (i = 0; i < fifo_entries; i += st->fifo_set_size) {
981 		ret = regmap_noinc_read(st->regmap, ADXL380_FIFO_DATA,
982 					&st->fifo_buf[i],
983 					2 * st->fifo_set_size);
984 		if (ret)
985 			return IRQ_HANDLED;
986 		iio_push_to_buffers(indio_dev, &st->fifo_buf[i]);
987 	}
988 
989 	return IRQ_HANDLED;
990 }
991 
adxl380_write_calibbias_value(struct adxl380_state * st,unsigned long chan_addr,s8 calibbias)992 static int adxl380_write_calibbias_value(struct adxl380_state *st,
993 					 unsigned long chan_addr,
994 					 s8 calibbias)
995 {
996 	int ret;
997 
998 	guard(mutex)(&st->lock);
999 
1000 	ret = adxl380_set_measure_en(st, false);
1001 	if (ret)
1002 		return ret;
1003 
1004 	ret = regmap_write(st->regmap, ADXL380_X_DSM_OFFSET_REG + chan_addr, calibbias);
1005 	if (ret)
1006 		return ret;
1007 
1008 	return adxl380_set_measure_en(st, true);
1009 }
1010 
adxl380_read_calibbias_value(struct adxl380_state * st,unsigned long chan_addr,int * calibbias)1011 static int adxl380_read_calibbias_value(struct adxl380_state *st,
1012 					unsigned long chan_addr,
1013 					int *calibbias)
1014 {
1015 	int ret;
1016 	unsigned int reg_val;
1017 
1018 	guard(mutex)(&st->lock);
1019 
1020 	ret = regmap_read(st->regmap, ADXL380_X_DSM_OFFSET_REG + chan_addr, &reg_val);
1021 	if (ret)
1022 		return ret;
1023 
1024 	*calibbias = sign_extend32(reg_val, 7);
1025 
1026 	return 0;
1027 }
1028 
hwfifo_watermark_min_show(struct device * dev,struct device_attribute * attr,char * buf)1029 static ssize_t hwfifo_watermark_min_show(struct device *dev,
1030 					 struct device_attribute *attr,
1031 					 char *buf)
1032 {
1033 	return sysfs_emit(buf, "1\n");
1034 }
1035 
hwfifo_watermark_max_show(struct device * dev,struct device_attribute * attr,char * buf)1036 static ssize_t hwfifo_watermark_max_show(struct device *dev,
1037 					 struct device_attribute *attr,
1038 					 char *buf)
1039 {
1040 	return sysfs_emit(buf, "%lu\n", ADXL380_FIFO_SAMPLES);
1041 }
1042 
adxl380_get_fifo_watermark(struct device * dev,struct device_attribute * attr,char * buf)1043 static ssize_t adxl380_get_fifo_watermark(struct device *dev,
1044 					  struct device_attribute *attr,
1045 					  char *buf)
1046 {
1047 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
1048 	struct adxl380_state *st = iio_priv(indio_dev);
1049 
1050 	return sysfs_emit(buf, "%d\n", st->watermark);
1051 }
1052 
adxl380_get_fifo_enabled(struct device * dev,struct device_attribute * attr,char * buf)1053 static ssize_t adxl380_get_fifo_enabled(struct device *dev,
1054 					struct device_attribute *attr,
1055 					char *buf)
1056 {
1057 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
1058 	struct adxl380_state *st = iio_priv(indio_dev);
1059 	int ret;
1060 	unsigned int reg_val;
1061 
1062 	ret = regmap_read(st->regmap, ADXL380_DIG_EN_REG, &reg_val);
1063 	if (ret)
1064 		return ret;
1065 
1066 	return sysfs_emit(buf, "%lu\n",
1067 			  FIELD_GET(ADXL380_FIFO_EN_MSK, reg_val));
1068 }
1069 
1070 static IIO_DEVICE_ATTR_RO(hwfifo_watermark_min, 0);
1071 static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
1072 static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
1073 		       adxl380_get_fifo_watermark, NULL, 0);
1074 static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
1075 		       adxl380_get_fifo_enabled, NULL, 0);
1076 
1077 static const struct iio_dev_attr *adxl380_fifo_attributes[] = {
1078 	&iio_dev_attr_hwfifo_watermark_min,
1079 	&iio_dev_attr_hwfifo_watermark_max,
1080 	&iio_dev_attr_hwfifo_watermark,
1081 	&iio_dev_attr_hwfifo_enabled,
1082 	NULL
1083 };
1084 
adxl380_buffer_postenable(struct iio_dev * indio_dev)1085 static int adxl380_buffer_postenable(struct iio_dev *indio_dev)
1086 {
1087 	struct adxl380_state *st = iio_priv(indio_dev);
1088 	int i;
1089 	int ret;
1090 
1091 	guard(mutex)(&st->lock);
1092 
1093 	ret = adxl380_set_measure_en(st, false);
1094 	if (ret)
1095 		return ret;
1096 
1097 	ret = regmap_update_bits(st->regmap,
1098 				 st->int_map[0],
1099 				 ADXL380_INT_MAP0_FIFO_WM_INT0_MSK,
1100 				 FIELD_PREP(ADXL380_INT_MAP0_FIFO_WM_INT0_MSK, 1));
1101 	if (ret)
1102 		return ret;
1103 
1104 	for_each_clear_bit(i, indio_dev->active_scan_mask, ADXL380_CH_NUM) {
1105 		ret = regmap_update_bits(st->regmap, ADXL380_DIG_EN_REG,
1106 					 ADXL380_CHAN_EN_MSK(i),
1107 					 0 << (4 + i));
1108 		if (ret)
1109 			return ret;
1110 	}
1111 
1112 	st->fifo_set_size = bitmap_weight(indio_dev->active_scan_mask,
1113 					  iio_get_masklength(indio_dev));
1114 
1115 	if ((st->watermark * st->fifo_set_size) > ADXL380_FIFO_SAMPLES)
1116 		st->watermark = (ADXL380_FIFO_SAMPLES  / st->fifo_set_size);
1117 
1118 	ret = adxl380_set_fifo_samples(st);
1119 	if (ret)
1120 		return ret;
1121 
1122 	ret = regmap_update_bits(st->regmap, ADXL380_DIG_EN_REG, ADXL380_FIFO_EN_MSK,
1123 				 FIELD_PREP(ADXL380_FIFO_EN_MSK, 1));
1124 	if (ret)
1125 		return ret;
1126 
1127 	return adxl380_set_measure_en(st, true);
1128 }
1129 
adxl380_buffer_predisable(struct iio_dev * indio_dev)1130 static int adxl380_buffer_predisable(struct iio_dev *indio_dev)
1131 {
1132 	struct adxl380_state *st = iio_priv(indio_dev);
1133 	int ret, i;
1134 
1135 	guard(mutex)(&st->lock);
1136 
1137 	ret = adxl380_set_measure_en(st, false);
1138 	if (ret)
1139 		return ret;
1140 
1141 	ret = regmap_update_bits(st->regmap,
1142 				 st->int_map[0],
1143 				 ADXL380_INT_MAP0_FIFO_WM_INT0_MSK,
1144 				 FIELD_PREP(ADXL380_INT_MAP0_FIFO_WM_INT0_MSK, 0));
1145 	if (ret)
1146 		return ret;
1147 
1148 	for (i = 0; i < indio_dev->num_channels; i++) {
1149 		ret = regmap_update_bits(st->regmap, ADXL380_DIG_EN_REG,
1150 					 ADXL380_CHAN_EN_MSK(i),
1151 					 1 << (4 + i));
1152 		if (ret)
1153 			return ret;
1154 	}
1155 
1156 	ret = regmap_update_bits(st->regmap, ADXL380_DIG_EN_REG, ADXL380_FIFO_EN_MSK,
1157 				 FIELD_PREP(ADXL380_FIFO_EN_MSK, 0));
1158 	if (ret)
1159 		return ret;
1160 
1161 	return adxl380_set_measure_en(st, true);
1162 }
1163 
1164 static const struct iio_buffer_setup_ops adxl380_buffer_ops = {
1165 	.postenable = adxl380_buffer_postenable,
1166 	.predisable = adxl380_buffer_predisable,
1167 };
1168 
adxl380_read_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int * val,int * val2,long info)1169 static int adxl380_read_raw(struct iio_dev *indio_dev,
1170 			    struct iio_chan_spec const *chan,
1171 			    int *val, int *val2, long info)
1172 {
1173 	struct adxl380_state *st = iio_priv(indio_dev);
1174 	int ret;
1175 
1176 	switch (info) {
1177 	case IIO_CHAN_INFO_RAW:
1178 		ret = iio_device_claim_direct_mode(indio_dev);
1179 		if (ret)
1180 			return ret;
1181 
1182 		ret = adxl380_read_chn(st, chan->address);
1183 		iio_device_release_direct_mode(indio_dev);
1184 		if (ret)
1185 			return ret;
1186 
1187 		*val = sign_extend32(ret >> chan->scan_type.shift,
1188 				     chan->scan_type.realbits - 1);
1189 		return IIO_VAL_INT;
1190 	case IIO_CHAN_INFO_SCALE:
1191 		switch (chan->type) {
1192 		case IIO_ACCEL:
1193 			scoped_guard(mutex, &st->lock) {
1194 				*val = st->chip_info->scale_tbl[st->range][0];
1195 				*val2 = st->chip_info->scale_tbl[st->range][1];
1196 			}
1197 			return IIO_VAL_INT_PLUS_NANO;
1198 		case IIO_TEMP:
1199 			/* 10.2 LSB / Degree Celsius */
1200 			*val = 10000;
1201 			*val2 = 102;
1202 			return IIO_VAL_FRACTIONAL;
1203 		default:
1204 			return -EINVAL;
1205 		}
1206 	case IIO_CHAN_INFO_OFFSET:
1207 		switch (chan->type) {
1208 		case IIO_TEMP:
1209 			*val = st->chip_info->temp_offset;
1210 			return IIO_VAL_INT;
1211 		default:
1212 			return -EINVAL;
1213 		}
1214 	case IIO_CHAN_INFO_CALIBBIAS:
1215 		switch (chan->type) {
1216 		case IIO_ACCEL:
1217 			ret = adxl380_read_calibbias_value(st, chan->scan_index, val);
1218 			if (ret)
1219 				return ret;
1220 			return IIO_VAL_INT;
1221 		default:
1222 			return -EINVAL;
1223 		}
1224 	case IIO_CHAN_INFO_SAMP_FREQ:
1225 		ret = adxl380_get_odr(st, val);
1226 		if (ret)
1227 			return ret;
1228 		return IIO_VAL_INT;
1229 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
1230 		ret =  adxl380_get_lpf(st, val);
1231 		if (ret)
1232 			return ret;
1233 		return IIO_VAL_INT;
1234 	case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
1235 		ret =  adxl380_get_hpf(st, val, val2);
1236 		if (ret)
1237 			return ret;
1238 		return IIO_VAL_INT_PLUS_MICRO;
1239 	}
1240 
1241 	return -EINVAL;
1242 }
1243 
adxl380_read_avail(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,const int ** vals,int * type,int * length,long mask)1244 static int adxl380_read_avail(struct iio_dev *indio_dev,
1245 			      struct iio_chan_spec const *chan,
1246 			      const int **vals, int *type, int *length,
1247 			      long mask)
1248 {
1249 	struct adxl380_state *st = iio_priv(indio_dev);
1250 
1251 	if (chan->type != IIO_ACCEL)
1252 		return -EINVAL;
1253 
1254 	switch (mask) {
1255 	case IIO_CHAN_INFO_SCALE:
1256 		*vals = (const int *)st->chip_info->scale_tbl;
1257 		*type = IIO_VAL_INT_PLUS_NANO;
1258 		*length = ARRAY_SIZE(st->chip_info->scale_tbl) * 2;
1259 		return IIO_AVAIL_LIST;
1260 	case IIO_CHAN_INFO_SAMP_FREQ:
1261 		*vals = (const int *)st->chip_info->samp_freq_tbl;
1262 		*type = IIO_VAL_INT;
1263 		*length = ARRAY_SIZE(st->chip_info->samp_freq_tbl);
1264 		return IIO_AVAIL_LIST;
1265 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
1266 		*vals = (const int *)st->lpf_tbl;
1267 		*type = IIO_VAL_INT;
1268 		*length = ARRAY_SIZE(st->lpf_tbl);
1269 		return IIO_AVAIL_LIST;
1270 	case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
1271 		*vals = (const int *)st->hpf_tbl;
1272 		*type = IIO_VAL_INT_PLUS_MICRO;
1273 		/* Values are stored in a 2D matrix */
1274 		*length = ARRAY_SIZE(st->hpf_tbl) * 2;
1275 		return IIO_AVAIL_LIST;
1276 	default:
1277 		return -EINVAL;
1278 	}
1279 }
1280 
adxl380_write_raw(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,int val,int val2,long info)1281 static int adxl380_write_raw(struct iio_dev *indio_dev,
1282 			     struct iio_chan_spec const *chan,
1283 			     int val, int val2, long info)
1284 {
1285 	struct adxl380_state *st = iio_priv(indio_dev);
1286 	int odr_index, lpf_index, hpf_index, range_index;
1287 
1288 	switch (info) {
1289 	case IIO_CHAN_INFO_SAMP_FREQ:
1290 		odr_index = adxl380_find_match_1d_tbl(st->chip_info->samp_freq_tbl,
1291 						      ARRAY_SIZE(st->chip_info->samp_freq_tbl),
1292 						      val);
1293 		return adxl380_set_odr(st, odr_index);
1294 	case IIO_CHAN_INFO_CALIBBIAS:
1295 		return adxl380_write_calibbias_value(st, chan->scan_index, val);
1296 	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
1297 		lpf_index = adxl380_find_match_1d_tbl(st->lpf_tbl,
1298 						      ARRAY_SIZE(st->lpf_tbl),
1299 						      val);
1300 		return adxl380_set_lpf(st, lpf_index);
1301 	case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
1302 		hpf_index = adxl380_find_match_2d_tbl(st->hpf_tbl,
1303 						      ARRAY_SIZE(st->hpf_tbl),
1304 						      val, val2);
1305 		if (hpf_index < 0)
1306 			return hpf_index;
1307 		return adxl380_set_hpf(st, hpf_index);
1308 	case IIO_CHAN_INFO_SCALE:
1309 		range_index = adxl380_find_match_2d_tbl(st->chip_info->scale_tbl,
1310 							ARRAY_SIZE(st->chip_info->scale_tbl),
1311 							val, val2);
1312 		if (range_index < 0)
1313 			return range_index;
1314 		return adxl380_set_range(st, range_index);
1315 	default:
1316 		return -EINVAL;
1317 	}
1318 }
1319 
adxl380_write_raw_get_fmt(struct iio_dev * indio_dev,struct iio_chan_spec const * chan,long info)1320 static int adxl380_write_raw_get_fmt(struct iio_dev *indio_dev,
1321 				     struct iio_chan_spec const *chan,
1322 				     long info)
1323 {
1324 	switch (info) {
1325 	case IIO_CHAN_INFO_SCALE:
1326 		if (chan->type != IIO_ACCEL)
1327 			return -EINVAL;
1328 
1329 		return IIO_VAL_INT_PLUS_NANO;
1330 	default:
1331 		return IIO_VAL_INT_PLUS_MICRO;
1332 	}
1333 }
1334 
adxl380_read_event_config(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir)1335 static int adxl380_read_event_config(struct iio_dev *indio_dev,
1336 				     const struct iio_chan_spec *chan,
1337 				     enum iio_event_type type,
1338 				     enum iio_event_direction dir)
1339 {
1340 	struct adxl380_state *st = iio_priv(indio_dev);
1341 	int ret;
1342 	bool int_en;
1343 	bool tap_axis_en = false;
1344 
1345 	switch (chan->channel2) {
1346 	case IIO_MOD_X:
1347 		tap_axis_en = st->tap_axis_en == ADXL380_X_AXIS;
1348 		break;
1349 	case IIO_MOD_Y:
1350 		tap_axis_en = st->tap_axis_en == ADXL380_Y_AXIS;
1351 		break;
1352 	case IIO_MOD_Z:
1353 		tap_axis_en = st->tap_axis_en == ADXL380_Z_AXIS;
1354 		break;
1355 	default:
1356 		return -EINVAL;
1357 	}
1358 
1359 	switch (dir) {
1360 	case IIO_EV_DIR_RISING:
1361 		ret = adxl380_read_act_inact_int(st, ADXL380_ACTIVITY, &int_en);
1362 		if (ret)
1363 			return ret;
1364 		return int_en;
1365 	case IIO_EV_DIR_FALLING:
1366 		ret = adxl380_read_act_inact_int(st, ADXL380_INACTIVITY, &int_en);
1367 		if (ret)
1368 			return ret;
1369 		return int_en;
1370 	case IIO_EV_DIR_SINGLETAP:
1371 		ret = adxl380_read_tap_int(st, ADXL380_SINGLE_TAP, &int_en);
1372 		if (ret)
1373 			return ret;
1374 		return int_en && tap_axis_en;
1375 	case IIO_EV_DIR_DOUBLETAP:
1376 		ret = adxl380_read_tap_int(st, ADXL380_DOUBLE_TAP, &int_en);
1377 		if (ret)
1378 			return ret;
1379 		return int_en && tap_axis_en;
1380 	default:
1381 		return -EINVAL;
1382 	}
1383 }
1384 
adxl380_write_event_config(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir,int state)1385 static int adxl380_write_event_config(struct iio_dev *indio_dev,
1386 				      const struct iio_chan_spec *chan,
1387 				      enum iio_event_type type,
1388 				      enum iio_event_direction dir,
1389 				      int state)
1390 {
1391 	struct adxl380_state *st = iio_priv(indio_dev);
1392 	enum adxl380_axis axis;
1393 
1394 	switch (chan->channel2) {
1395 	case IIO_MOD_X:
1396 		axis = ADXL380_X_AXIS;
1397 		break;
1398 	case IIO_MOD_Y:
1399 		axis = ADXL380_Y_AXIS;
1400 		break;
1401 	case IIO_MOD_Z:
1402 		axis = ADXL380_Z_AXIS;
1403 		break;
1404 	default:
1405 		return -EINVAL;
1406 	}
1407 
1408 	switch (dir) {
1409 	case IIO_EV_DIR_RISING:
1410 		return adxl380_act_inact_config(st, ADXL380_ACTIVITY, state);
1411 	case IIO_EV_DIR_FALLING:
1412 		return adxl380_act_inact_config(st, ADXL380_INACTIVITY, state);
1413 	case IIO_EV_DIR_SINGLETAP:
1414 		return adxl380_tap_config(st, axis, ADXL380_SINGLE_TAP, state);
1415 	case IIO_EV_DIR_DOUBLETAP:
1416 		return adxl380_tap_config(st, axis, ADXL380_DOUBLE_TAP, state);
1417 	default:
1418 		return -EINVAL;
1419 	}
1420 }
1421 
adxl380_read_event_value(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir,enum iio_event_info info,int * val,int * val2)1422 static int adxl380_read_event_value(struct iio_dev *indio_dev,
1423 				    const struct iio_chan_spec *chan,
1424 				    enum iio_event_type type,
1425 				    enum iio_event_direction dir,
1426 				    enum iio_event_info info,
1427 				    int *val, int *val2)
1428 {
1429 	struct adxl380_state *st = iio_priv(indio_dev);
1430 
1431 	guard(mutex)(&st->lock);
1432 
1433 	switch (type) {
1434 	case IIO_EV_TYPE_THRESH:
1435 		switch (info) {
1436 		case IIO_EV_INFO_VALUE: {
1437 			switch (dir) {
1438 			case IIO_EV_DIR_RISING:
1439 				*val = st->act_threshold;
1440 				return IIO_VAL_INT;
1441 			case IIO_EV_DIR_FALLING:
1442 				*val = st->inact_threshold;
1443 				return IIO_VAL_INT;
1444 			default:
1445 				return -EINVAL;
1446 			}
1447 		}
1448 		case IIO_EV_INFO_PERIOD:
1449 			switch (dir) {
1450 			case IIO_EV_DIR_RISING:
1451 				*val = st->act_time_ms;
1452 				*val2 = 1000;
1453 				return IIO_VAL_FRACTIONAL;
1454 			case IIO_EV_DIR_FALLING:
1455 				*val = st->inact_time_ms;
1456 				*val2 = 1000;
1457 				return IIO_VAL_FRACTIONAL;
1458 			default:
1459 				return -EINVAL;
1460 			}
1461 		default:
1462 			return -EINVAL;
1463 		}
1464 	case IIO_EV_TYPE_GESTURE:
1465 		switch (info) {
1466 		case IIO_EV_INFO_VALUE:
1467 			*val = st->tap_threshold;
1468 			return IIO_VAL_INT;
1469 		case IIO_EV_INFO_RESET_TIMEOUT:
1470 			*val = st->tap_window_us;
1471 			*val2 = 1000000;
1472 			return IIO_VAL_FRACTIONAL;
1473 		case IIO_EV_INFO_TAP2_MIN_DELAY:
1474 			*val = st->tap_latent_us;
1475 			*val2 = 1000000;
1476 			return IIO_VAL_FRACTIONAL;
1477 		default:
1478 			return -EINVAL;
1479 		}
1480 	default:
1481 		return -EINVAL;
1482 	}
1483 }
1484 
adxl380_write_event_value(struct iio_dev * indio_dev,const struct iio_chan_spec * chan,enum iio_event_type type,enum iio_event_direction dir,enum iio_event_info info,int val,int val2)1485 static int adxl380_write_event_value(struct iio_dev *indio_dev,
1486 				     const struct iio_chan_spec *chan,
1487 				     enum iio_event_type type, enum iio_event_direction dir,
1488 				     enum iio_event_info info, int val, int val2)
1489 {
1490 	struct adxl380_state *st = iio_priv(indio_dev);
1491 	u32 val_ms, val_us;
1492 
1493 	if (chan->type != IIO_ACCEL)
1494 		return -EINVAL;
1495 
1496 	switch (type) {
1497 	case IIO_EV_TYPE_THRESH:
1498 		switch (info) {
1499 		case IIO_EV_INFO_VALUE:
1500 			switch (dir) {
1501 			case IIO_EV_DIR_RISING:
1502 				return adxl380_set_act_inact_threshold(indio_dev,
1503 								       ADXL380_ACTIVITY, val);
1504 			case IIO_EV_DIR_FALLING:
1505 				return adxl380_set_act_inact_threshold(indio_dev,
1506 								       ADXL380_INACTIVITY, val);
1507 			default:
1508 				return -EINVAL;
1509 			}
1510 		case IIO_EV_INFO_PERIOD:
1511 			val_ms = val * 1000 + DIV_ROUND_UP(val2, 1000);
1512 			switch (dir) {
1513 			case IIO_EV_DIR_RISING:
1514 				return adxl380_set_act_inact_time_ms(st,
1515 								     ADXL380_ACTIVITY, val_ms);
1516 			case IIO_EV_DIR_FALLING:
1517 				return adxl380_set_act_inact_time_ms(st,
1518 								     ADXL380_INACTIVITY, val_ms);
1519 			default:
1520 				return -EINVAL;
1521 			}
1522 
1523 		default:
1524 			return -EINVAL;
1525 		}
1526 	case IIO_EV_TYPE_GESTURE:
1527 		switch (info) {
1528 		case IIO_EV_INFO_VALUE:
1529 			return adxl380_set_tap_threshold_value(indio_dev, val);
1530 		case IIO_EV_INFO_RESET_TIMEOUT:
1531 			val_us = val * 1000000 + val2;
1532 			return adxl380_write_tap_time_us(st,
1533 							 ADXL380_TAP_TIME_WINDOW,
1534 							 val_us);
1535 		case IIO_EV_INFO_TAP2_MIN_DELAY:
1536 			val_us = val * 1000000 + val2;
1537 			return adxl380_write_tap_time_us(st,
1538 							 ADXL380_TAP_TIME_LATENT,
1539 							 val_us);
1540 		default:
1541 			return -EINVAL;
1542 		}
1543 	default:
1544 		return -EINVAL;
1545 	}
1546 }
1547 
in_accel_gesture_tap_maxtomin_time_show(struct device * dev,struct device_attribute * attr,char * buf)1548 static ssize_t in_accel_gesture_tap_maxtomin_time_show(struct device *dev,
1549 						       struct device_attribute *attr,
1550 						       char *buf)
1551 {
1552 	int vals[2];
1553 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
1554 	struct adxl380_state *st = iio_priv(indio_dev);
1555 
1556 	guard(mutex)(&st->lock);
1557 
1558 	vals[0] = st->tap_duration_us;
1559 	vals[1] = MICRO;
1560 
1561 	return iio_format_value(buf, IIO_VAL_FRACTIONAL, 2, vals);
1562 }
1563 
in_accel_gesture_tap_maxtomin_time_store(struct device * dev,struct device_attribute * attr,const char * buf,size_t len)1564 static ssize_t in_accel_gesture_tap_maxtomin_time_store(struct device *dev,
1565 							struct device_attribute *attr,
1566 							const char *buf, size_t len)
1567 {
1568 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
1569 	struct adxl380_state *st = iio_priv(indio_dev);
1570 	int ret, val_int, val_fract_us;
1571 
1572 	guard(mutex)(&st->lock);
1573 
1574 	ret = iio_str_to_fixpoint(buf, 100000, &val_int, &val_fract_us);
1575 	if (ret)
1576 		return ret;
1577 
1578 	/* maximum value is 255 * 625 us = 0.159375 seconds */
1579 	if (val_int || val_fract_us > 159375 || val_fract_us < 0)
1580 		return -EINVAL;
1581 
1582 	ret = adxl380_write_tap_dur_us(indio_dev, val_fract_us);
1583 	if (ret)
1584 		return ret;
1585 
1586 	return len;
1587 }
1588 
1589 static IIO_DEVICE_ATTR_RW(in_accel_gesture_tap_maxtomin_time, 0);
1590 
1591 static struct attribute *adxl380_event_attributes[] = {
1592 	&iio_dev_attr_in_accel_gesture_tap_maxtomin_time.dev_attr.attr,
1593 	NULL
1594 };
1595 
1596 static const struct attribute_group adxl380_event_attribute_group = {
1597 	.attrs = adxl380_event_attributes,
1598 };
1599 
adxl380_reg_access(struct iio_dev * indio_dev,unsigned int reg,unsigned int writeval,unsigned int * readval)1600 static int adxl380_reg_access(struct iio_dev *indio_dev,
1601 			      unsigned int reg,
1602 			      unsigned int writeval,
1603 			      unsigned int *readval)
1604 {
1605 	struct adxl380_state *st = iio_priv(indio_dev);
1606 
1607 	if (readval)
1608 		return regmap_read(st->regmap, reg, readval);
1609 
1610 	return regmap_write(st->regmap, reg, writeval);
1611 }
1612 
adxl380_set_watermark(struct iio_dev * indio_dev,unsigned int val)1613 static int adxl380_set_watermark(struct iio_dev *indio_dev, unsigned int val)
1614 {
1615 	struct adxl380_state *st  = iio_priv(indio_dev);
1616 
1617 	st->watermark = min(val, ADXL380_FIFO_SAMPLES);
1618 
1619 	return 0;
1620 }
1621 
1622 static const struct iio_info adxl380_info = {
1623 	.read_raw = adxl380_read_raw,
1624 	.read_avail = &adxl380_read_avail,
1625 	.write_raw = adxl380_write_raw,
1626 	.write_raw_get_fmt = adxl380_write_raw_get_fmt,
1627 	.read_event_config = adxl380_read_event_config,
1628 	.write_event_config = adxl380_write_event_config,
1629 	.read_event_value = adxl380_read_event_value,
1630 	.write_event_value = adxl380_write_event_value,
1631 	.event_attrs = &adxl380_event_attribute_group,
1632 	.debugfs_reg_access = &adxl380_reg_access,
1633 	.hwfifo_set_watermark = adxl380_set_watermark,
1634 };
1635 
1636 static const struct iio_event_spec adxl380_events[] = {
1637 	{
1638 		.type = IIO_EV_TYPE_THRESH,
1639 		.dir = IIO_EV_DIR_RISING,
1640 		.mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) |
1641 				       BIT(IIO_EV_INFO_VALUE) |
1642 				       BIT(IIO_EV_INFO_PERIOD),
1643 	},
1644 	{
1645 		.type = IIO_EV_TYPE_THRESH,
1646 		.dir = IIO_EV_DIR_FALLING,
1647 		.mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE) |
1648 				       BIT(IIO_EV_INFO_VALUE) |
1649 				       BIT(IIO_EV_INFO_PERIOD),
1650 	},
1651 	{
1652 		.type = IIO_EV_TYPE_GESTURE,
1653 		.dir = IIO_EV_DIR_SINGLETAP,
1654 		.mask_separate = BIT(IIO_EV_INFO_ENABLE),
1655 		.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
1656 				       BIT(IIO_EV_INFO_RESET_TIMEOUT),
1657 	},
1658 	{
1659 		.type = IIO_EV_TYPE_GESTURE,
1660 		.dir = IIO_EV_DIR_DOUBLETAP,
1661 		.mask_separate = BIT(IIO_EV_INFO_ENABLE),
1662 		.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
1663 				       BIT(IIO_EV_INFO_RESET_TIMEOUT) |
1664 				       BIT(IIO_EV_INFO_TAP2_MIN_DELAY),
1665 	},
1666 };
1667 
1668 #define ADXL380_ACCEL_CHANNEL(index, reg, axis) {			\
1669 	.type = IIO_ACCEL,						\
1670 	.address = reg,							\
1671 	.modified = 1,							\
1672 	.channel2 = IIO_MOD_##axis,					\
1673 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
1674 			      BIT(IIO_CHAN_INFO_CALIBBIAS),		\
1675 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),	\
1676 	.info_mask_shared_by_all_available =				\
1677 		BIT(IIO_CHAN_INFO_SAMP_FREQ),				\
1678 	.info_mask_shared_by_type =					\
1679 		BIT(IIO_CHAN_INFO_SCALE) |				\
1680 		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) |	\
1681 		BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY),	\
1682 	.info_mask_shared_by_type_available =				\
1683 		BIT(IIO_CHAN_INFO_SCALE) |				\
1684 		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY) |	\
1685 		BIT(IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY),	\
1686 	.scan_index = index,						\
1687 	.scan_type = {							\
1688 		.sign = 's',						\
1689 		.realbits = 16,						\
1690 		.storagebits = 16,					\
1691 		.endianness = IIO_BE,					\
1692 	},								\
1693 	.event_spec = adxl380_events,					\
1694 	.num_event_specs = ARRAY_SIZE(adxl380_events)			\
1695 }
1696 
1697 static const struct iio_chan_spec adxl380_channels[] = {
1698 	ADXL380_ACCEL_CHANNEL(0, ADXL380_X_DATA_H_REG, X),
1699 	ADXL380_ACCEL_CHANNEL(1, ADXL380_Y_DATA_H_REG, Y),
1700 	ADXL380_ACCEL_CHANNEL(2, ADXL380_Z_DATA_H_REG, Z),
1701 	{
1702 		.type = IIO_TEMP,
1703 		.address = ADXL380_T_DATA_H_REG,
1704 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
1705 				      BIT(IIO_CHAN_INFO_SCALE) |
1706 				      BIT(IIO_CHAN_INFO_OFFSET),
1707 		.scan_index = 3,
1708 		.scan_type = {
1709 			.sign = 's',
1710 			.realbits = 12,
1711 			.storagebits = 16,
1712 			.shift = 4,
1713 			.endianness = IIO_BE,
1714 		},
1715 	},
1716 };
1717 
adxl380_config_irq(struct iio_dev * indio_dev)1718 static int adxl380_config_irq(struct iio_dev *indio_dev)
1719 {
1720 	struct adxl380_state *st = iio_priv(indio_dev);
1721 	unsigned long irq_flag;
1722 	struct irq_data *desc;
1723 	u32 irq_type;
1724 	u8 polarity;
1725 	int ret;
1726 
1727 	st->irq = fwnode_irq_get_byname(dev_fwnode(st->dev), "INT0");
1728 	if (st->irq > 0) {
1729 		st->int_map[0] = ADXL380_INT0_MAP0_REG;
1730 		st->int_map[1] = ADXL380_INT0_MAP1_REG;
1731 	} else {
1732 		st->irq = fwnode_irq_get_byname(dev_fwnode(st->dev), "INT1");
1733 		if (st->irq > 0)
1734 			return dev_err_probe(st->dev, -ENODEV,
1735 					     "no interrupt name specified");
1736 		st->int_map[0] = ADXL380_INT1_MAP0_REG;
1737 		st->int_map[1] = ADXL380_INT1_MAP1_REG;
1738 	}
1739 
1740 	desc = irq_get_irq_data(st->irq);
1741 	if (!desc)
1742 		return dev_err_probe(st->dev, -EINVAL, "Could not find IRQ %d\n", st->irq);
1743 
1744 	irq_type = irqd_get_trigger_type(desc);
1745 	if (irq_type == IRQ_TYPE_LEVEL_HIGH) {
1746 		polarity = 0;
1747 		irq_flag = IRQF_TRIGGER_HIGH | IRQF_ONESHOT;
1748 	} else if (irq_type == IRQ_TYPE_LEVEL_LOW) {
1749 		polarity = 1;
1750 		irq_flag = IRQF_TRIGGER_LOW | IRQF_ONESHOT;
1751 	} else {
1752 		return dev_err_probe(st->dev, -EINVAL,
1753 				     "Invalid interrupt 0x%x. Only level interrupts supported\n",
1754 				     irq_type);
1755 	}
1756 
1757 	ret = regmap_update_bits(st->regmap, ADXL380_INT0_REG,
1758 				 ADXL380_INT0_POL_MSK,
1759 				 FIELD_PREP(ADXL380_INT0_POL_MSK, polarity));
1760 	if (ret)
1761 		return ret;
1762 
1763 	return devm_request_threaded_irq(st->dev, st->irq, NULL,
1764 					 adxl380_irq_handler, irq_flag,
1765 					 indio_dev->name, indio_dev);
1766 }
1767 
adxl380_setup(struct iio_dev * indio_dev)1768 static int adxl380_setup(struct iio_dev *indio_dev)
1769 {
1770 	unsigned int reg_val;
1771 	u16 part_id, chip_id;
1772 	int ret, i;
1773 	struct adxl380_state *st = iio_priv(indio_dev);
1774 
1775 	ret = regmap_read(st->regmap, ADXL380_DEVID_AD_REG, &reg_val);
1776 	if (ret)
1777 		return ret;
1778 
1779 	if (reg_val != ADXL380_DEVID_AD_VAL)
1780 		dev_warn(st->dev, "Unknown chip id %x\n", reg_val);
1781 
1782 	ret = regmap_bulk_read(st->regmap, ADLX380_PART_ID_REG,
1783 			       &st->transf_buf, 2);
1784 	if (ret)
1785 		return ret;
1786 
1787 	part_id = get_unaligned_be16(st->transf_buf);
1788 	part_id >>= 4;
1789 
1790 	if (part_id != ADXL380_ID_VAL)
1791 		dev_warn(st->dev, "Unknown part id %x\n", part_id);
1792 
1793 	ret = regmap_read(st->regmap, ADXL380_MISC_0_REG, &reg_val);
1794 	if (ret)
1795 		return ret;
1796 
1797 	/* Bit to differentiate between ADXL380/382. */
1798 	if (reg_val & ADXL380_XL382_MSK)
1799 		chip_id = ADXL382_ID_VAL;
1800 	else
1801 		chip_id = ADXL380_ID_VAL;
1802 
1803 	if (chip_id != st->chip_info->chip_id)
1804 		dev_warn(st->dev, "Unknown chip id %x\n", chip_id);
1805 
1806 	ret = regmap_write(st->regmap, ADXL380_RESET_REG, ADXL380_RESET_CODE);
1807 	if (ret)
1808 		return ret;
1809 
1810 	/*
1811 	 * A latency of approximately 0.5 ms is required after soft reset.
1812 	 * Stated in the register REG_RESET description.
1813 	 */
1814 	fsleep(500);
1815 
1816 	for (i = 0; i < indio_dev->num_channels; i++) {
1817 		ret = regmap_update_bits(st->regmap, ADXL380_DIG_EN_REG,
1818 					 ADXL380_CHAN_EN_MSK(i),
1819 					 1 << (4 + i));
1820 		if (ret)
1821 			return ret;
1822 	}
1823 
1824 	ret = regmap_update_bits(st->regmap, ADXL380_FIFO_CONFIG_0_REG,
1825 				 ADXL380_FIFO_MODE_MSK,
1826 				 FIELD_PREP(ADXL380_FIFO_MODE_MSK, ADXL380_FIFO_STREAMED));
1827 	if (ret)
1828 		return ret;
1829 
1830 	/* Select all 3 axis for act/inact detection. */
1831 	ret = regmap_update_bits(st->regmap, ADXL380_SNSR_AXIS_EN_REG,
1832 				 ADXL380_ACT_INACT_AXIS_EN_MSK,
1833 				 FIELD_PREP(ADXL380_ACT_INACT_AXIS_EN_MSK,
1834 					    ADXL380_ACT_INACT_AXIS_EN_MSK));
1835 	if (ret)
1836 		return ret;
1837 
1838 	ret = adxl380_config_irq(indio_dev);
1839 	if (ret)
1840 		return ret;
1841 
1842 	ret = adxl380_fill_lpf_tbl(st);
1843 	if (ret)
1844 		return ret;
1845 
1846 	ret = adxl380_fill_hpf_tbl(st);
1847 	if (ret)
1848 		return ret;
1849 
1850 	return adxl380_set_measure_en(st, true);
1851 }
1852 
adxl380_probe(struct device * dev,struct regmap * regmap,const struct adxl380_chip_info * chip_info)1853 int adxl380_probe(struct device *dev, struct regmap *regmap,
1854 		  const struct adxl380_chip_info *chip_info)
1855 {
1856 	struct iio_dev *indio_dev;
1857 	struct adxl380_state *st;
1858 	int ret;
1859 
1860 	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
1861 	if (!indio_dev)
1862 		return -ENOMEM;
1863 
1864 	st = iio_priv(indio_dev);
1865 
1866 	st->dev = dev;
1867 	st->regmap = regmap;
1868 	st->chip_info = chip_info;
1869 
1870 	mutex_init(&st->lock);
1871 
1872 	indio_dev->channels = adxl380_channels;
1873 	indio_dev->num_channels = ARRAY_SIZE(adxl380_channels);
1874 	indio_dev->name = chip_info->name;
1875 	indio_dev->info = &adxl380_info;
1876 	indio_dev->modes = INDIO_DIRECT_MODE;
1877 
1878 	ret = devm_regulator_get_enable(dev, "vddio");
1879 	if (ret)
1880 		return dev_err_probe(st->dev, ret,
1881 				     "Failed to get vddio regulator\n");
1882 
1883 	ret = devm_regulator_get_enable(st->dev, "vsupply");
1884 	if (ret)
1885 		return dev_err_probe(st->dev, ret,
1886 				     "Failed to get vsupply regulator\n");
1887 
1888 	ret = adxl380_setup(indio_dev);
1889 	if (ret)
1890 		return ret;
1891 
1892 	ret = devm_iio_kfifo_buffer_setup_ext(st->dev, indio_dev,
1893 					      &adxl380_buffer_ops,
1894 					      adxl380_fifo_attributes);
1895 	if (ret)
1896 		return ret;
1897 
1898 	return devm_iio_device_register(dev, indio_dev);
1899 }
1900 EXPORT_SYMBOL_NS_GPL(adxl380_probe, IIO_ADXL380);
1901 
1902 MODULE_AUTHOR("Ramona Gradinariu <ramona.gradinariu@analog.com>");
1903 MODULE_AUTHOR("Antoniu Miclaus <antoniu.miclaus@analog.com>");
1904 MODULE_DESCRIPTION("Analog Devices ADXL380 3-axis accelerometer driver");
1905 MODULE_LICENSE("GPL");
1906