cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

adxl372.c (33919B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * ADXL372 3-Axis Digital Accelerometer core driver
      4 *
      5 * Copyright 2018 Analog Devices Inc.
      6 */
      7
      8#include <linux/bitfield.h>
      9#include <linux/bitops.h>
     10#include <linux/interrupt.h>
     11#include <linux/irq.h>
     12#include <linux/module.h>
     13#include <linux/regmap.h>
     14#include <linux/spi/spi.h>
     15
     16#include <linux/iio/iio.h>
     17#include <linux/iio/sysfs.h>
     18#include <linux/iio/buffer.h>
     19#include <linux/iio/events.h>
     20#include <linux/iio/trigger.h>
     21#include <linux/iio/trigger_consumer.h>
     22#include <linux/iio/triggered_buffer.h>
     23
     24#include "adxl372.h"
     25
     26/* ADXL372 registers definition */
     27#define ADXL372_DEVID			0x00
     28#define ADXL372_DEVID_MST		0x01
     29#define ADXL372_PARTID			0x02
     30#define ADXL372_STATUS_1		0x04
     31#define ADXL372_STATUS_2		0x05
     32#define ADXL372_FIFO_ENTRIES_2		0x06
     33#define ADXL372_FIFO_ENTRIES_1		0x07
     34#define ADXL372_X_DATA_H		0x08
     35#define ADXL372_X_DATA_L		0x09
     36#define ADXL372_Y_DATA_H		0x0A
     37#define ADXL372_Y_DATA_L		0x0B
     38#define ADXL372_Z_DATA_H		0x0C
     39#define ADXL372_Z_DATA_L		0x0D
     40#define ADXL372_X_MAXPEAK_H		0x15
     41#define ADXL372_X_MAXPEAK_L		0x16
     42#define ADXL372_Y_MAXPEAK_H		0x17
     43#define ADXL372_Y_MAXPEAK_L		0x18
     44#define ADXL372_Z_MAXPEAK_H		0x19
     45#define ADXL372_Z_MAXPEAK_L		0x1A
     46#define ADXL372_OFFSET_X		0x20
     47#define ADXL372_OFFSET_Y		0x21
     48#define ADXL372_OFFSET_Z		0x22
     49#define ADXL372_X_THRESH_ACT_H		0x23
     50#define ADXL372_X_THRESH_ACT_L		0x24
     51#define ADXL372_Y_THRESH_ACT_H		0x25
     52#define ADXL372_Y_THRESH_ACT_L		0x26
     53#define ADXL372_Z_THRESH_ACT_H		0x27
     54#define ADXL372_Z_THRESH_ACT_L		0x28
     55#define ADXL372_TIME_ACT		0x29
     56#define ADXL372_X_THRESH_INACT_H	0x2A
     57#define ADXL372_X_THRESH_INACT_L	0x2B
     58#define ADXL372_Y_THRESH_INACT_H	0x2C
     59#define ADXL372_Y_THRESH_INACT_L	0x2D
     60#define ADXL372_Z_THRESH_INACT_H	0x2E
     61#define ADXL372_Z_THRESH_INACT_L	0x2F
     62#define ADXL372_TIME_INACT_H		0x30
     63#define ADXL372_TIME_INACT_L		0x31
     64#define ADXL372_X_THRESH_ACT2_H		0x32
     65#define ADXL372_X_THRESH_ACT2_L		0x33
     66#define ADXL372_Y_THRESH_ACT2_H		0x34
     67#define ADXL372_Y_THRESH_ACT2_L		0x35
     68#define ADXL372_Z_THRESH_ACT2_H		0x36
     69#define ADXL372_Z_THRESH_ACT2_L		0x37
     70#define ADXL372_HPF			0x38
     71#define ADXL372_FIFO_SAMPLES		0x39
     72#define ADXL372_FIFO_CTL		0x3A
     73#define ADXL372_INT1_MAP		0x3B
     74#define ADXL372_INT2_MAP		0x3C
     75#define ADXL372_TIMING			0x3D
     76#define ADXL372_MEASURE			0x3E
     77#define ADXL372_POWER_CTL		0x3F
     78#define ADXL372_SELF_TEST		0x40
     79#define ADXL372_RESET			0x41
     80#define ADXL372_FIFO_DATA		0x42
     81
     82#define ADXL372_DEVID_VAL		0xAD
     83#define ADXL372_PARTID_VAL		0xFA
     84#define ADXL372_RESET_CODE		0x52
     85
     86/* ADXL372_POWER_CTL */
     87#define ADXL372_POWER_CTL_MODE_MSK		GENMASK_ULL(1, 0)
     88#define ADXL372_POWER_CTL_MODE(x)		(((x) & 0x3) << 0)
     89
     90/* ADXL372_MEASURE */
     91#define ADXL372_MEASURE_LINKLOOP_MSK		GENMASK_ULL(5, 4)
     92#define ADXL372_MEASURE_LINKLOOP_MODE(x)	(((x) & 0x3) << 4)
     93#define ADXL372_MEASURE_BANDWIDTH_MSK		GENMASK_ULL(2, 0)
     94#define ADXL372_MEASURE_BANDWIDTH_MODE(x)	(((x) & 0x7) << 0)
     95
     96/* ADXL372_TIMING */
     97#define ADXL372_TIMING_ODR_MSK			GENMASK_ULL(7, 5)
     98#define ADXL372_TIMING_ODR_MODE(x)		(((x) & 0x7) << 5)
     99
    100/* ADXL372_FIFO_CTL */
    101#define ADXL372_FIFO_CTL_FORMAT_MSK		GENMASK(5, 3)
    102#define ADXL372_FIFO_CTL_FORMAT_MODE(x)		(((x) & 0x7) << 3)
    103#define ADXL372_FIFO_CTL_MODE_MSK		GENMASK(2, 1)
    104#define ADXL372_FIFO_CTL_MODE_MODE(x)		(((x) & 0x3) << 1)
    105#define ADXL372_FIFO_CTL_SAMPLES_MSK		BIT(1)
    106#define ADXL372_FIFO_CTL_SAMPLES_MODE(x)	(((x) > 0xFF) ? 1 : 0)
    107
    108/* ADXL372_STATUS_1 */
    109#define ADXL372_STATUS_1_DATA_RDY(x)		(((x) >> 0) & 0x1)
    110#define ADXL372_STATUS_1_FIFO_RDY(x)		(((x) >> 1) & 0x1)
    111#define ADXL372_STATUS_1_FIFO_FULL(x)		(((x) >> 2) & 0x1)
    112#define ADXL372_STATUS_1_FIFO_OVR(x)		(((x) >> 3) & 0x1)
    113#define ADXL372_STATUS_1_USR_NVM_BUSY(x)	(((x) >> 5) & 0x1)
    114#define ADXL372_STATUS_1_AWAKE(x)		(((x) >> 6) & 0x1)
    115#define ADXL372_STATUS_1_ERR_USR_REGS(x)	(((x) >> 7) & 0x1)
    116
    117/* ADXL372_STATUS_2 */
    118#define ADXL372_STATUS_2_INACT(x)		(((x) >> 4) & 0x1)
    119#define ADXL372_STATUS_2_ACT(x)			(((x) >> 5) & 0x1)
    120#define ADXL372_STATUS_2_AC2(x)			(((x) >> 6) & 0x1)
    121
    122/* ADXL372_INT1_MAP */
    123#define ADXL372_INT1_MAP_DATA_RDY_MSK		BIT(0)
    124#define ADXL372_INT1_MAP_DATA_RDY_MODE(x)	(((x) & 0x1) << 0)
    125#define ADXL372_INT1_MAP_FIFO_RDY_MSK		BIT(1)
    126#define ADXL372_INT1_MAP_FIFO_RDY_MODE(x)	(((x) & 0x1) << 1)
    127#define ADXL372_INT1_MAP_FIFO_FULL_MSK		BIT(2)
    128#define ADXL372_INT1_MAP_FIFO_FULL_MODE(x)	(((x) & 0x1) << 2)
    129#define ADXL372_INT1_MAP_FIFO_OVR_MSK		BIT(3)
    130#define ADXL372_INT1_MAP_FIFO_OVR_MODE(x)	(((x) & 0x1) << 3)
    131#define ADXL372_INT1_MAP_INACT_MSK		BIT(4)
    132#define ADXL372_INT1_MAP_INACT_MODE(x)		(((x) & 0x1) << 4)
    133#define ADXL372_INT1_MAP_ACT_MSK		BIT(5)
    134#define ADXL372_INT1_MAP_ACT_MODE(x)		(((x) & 0x1) << 5)
    135#define ADXL372_INT1_MAP_AWAKE_MSK		BIT(6)
    136#define ADXL372_INT1_MAP_AWAKE_MODE(x)		(((x) & 0x1) << 6)
    137#define ADXL372_INT1_MAP_LOW_MSK		BIT(7)
    138#define ADXL372_INT1_MAP_LOW_MODE(x)		(((x) & 0x1) << 7)
    139
    140/* ADX372_THRESH */
    141#define ADXL372_THRESH_VAL_H_MSK	GENMASK(10, 3)
    142#define ADXL372_THRESH_VAL_H_SEL(x)	FIELD_GET(ADXL372_THRESH_VAL_H_MSK, x)
    143#define ADXL372_THRESH_VAL_L_MSK	GENMASK(2, 0)
    144#define ADXL372_THRESH_VAL_L_SEL(x)	FIELD_GET(ADXL372_THRESH_VAL_L_MSK, x)
    145
    146/* The ADXL372 includes a deep, 512 sample FIFO buffer */
    147#define ADXL372_FIFO_SIZE			512
    148#define ADXL372_X_AXIS_EN(x)			((x) & BIT(0))
    149#define ADXL372_Y_AXIS_EN(x)			((x) & BIT(1))
    150#define ADXL372_Z_AXIS_EN(x)			((x) & BIT(2))
    151
    152/*
    153 * At +/- 200g with 12-bit resolution, scale is computed as:
    154 * (200 + 200) * 9.81 / (2^12 - 1) = 0.958241
    155 */
    156#define ADXL372_USCALE	958241
    157
    158enum adxl372_op_mode {
    159	ADXL372_STANDBY,
    160	ADXL372_WAKE_UP,
    161	ADXL372_INSTANT_ON,
    162	ADXL372_FULL_BW_MEASUREMENT,
    163};
    164
    165enum adxl372_act_proc_mode {
    166	ADXL372_DEFAULT,
    167	ADXL372_LINKED,
    168	ADXL372_LOOPED,
    169};
    170
    171enum adxl372_th_activity {
    172	ADXL372_ACTIVITY,
    173	ADXL372_ACTIVITY2,
    174	ADXL372_INACTIVITY,
    175};
    176
    177enum adxl372_odr {
    178	ADXL372_ODR_400HZ,
    179	ADXL372_ODR_800HZ,
    180	ADXL372_ODR_1600HZ,
    181	ADXL372_ODR_3200HZ,
    182	ADXL372_ODR_6400HZ,
    183};
    184
    185enum adxl372_bandwidth {
    186	ADXL372_BW_200HZ,
    187	ADXL372_BW_400HZ,
    188	ADXL372_BW_800HZ,
    189	ADXL372_BW_1600HZ,
    190	ADXL372_BW_3200HZ,
    191};
    192
    193static const unsigned int adxl372_th_reg_high_addr[3] = {
    194	[ADXL372_ACTIVITY] = ADXL372_X_THRESH_ACT_H,
    195	[ADXL372_ACTIVITY2] = ADXL372_X_THRESH_ACT2_H,
    196	[ADXL372_INACTIVITY] = ADXL372_X_THRESH_INACT_H,
    197};
    198
    199enum adxl372_fifo_format {
    200	ADXL372_XYZ_FIFO,
    201	ADXL372_X_FIFO,
    202	ADXL372_Y_FIFO,
    203	ADXL372_XY_FIFO,
    204	ADXL372_Z_FIFO,
    205	ADXL372_XZ_FIFO,
    206	ADXL372_YZ_FIFO,
    207	ADXL372_XYZ_PEAK_FIFO,
    208};
    209
    210enum adxl372_fifo_mode {
    211	ADXL372_FIFO_BYPASSED,
    212	ADXL372_FIFO_STREAMED,
    213	ADXL372_FIFO_TRIGGERED,
    214	ADXL372_FIFO_OLD_SAVED
    215};
    216
    217static const int adxl372_samp_freq_tbl[5] = {
    218	400, 800, 1600, 3200, 6400,
    219};
    220
    221static const int adxl372_bw_freq_tbl[5] = {
    222	200, 400, 800, 1600, 3200,
    223};
    224
    225struct adxl372_axis_lookup {
    226	unsigned int bits;
    227	enum adxl372_fifo_format fifo_format;
    228};
    229
    230static const struct adxl372_axis_lookup adxl372_axis_lookup_table[] = {
    231	{ BIT(0), ADXL372_X_FIFO },
    232	{ BIT(1), ADXL372_Y_FIFO },
    233	{ BIT(2), ADXL372_Z_FIFO },
    234	{ BIT(0) | BIT(1), ADXL372_XY_FIFO },
    235	{ BIT(0) | BIT(2), ADXL372_XZ_FIFO },
    236	{ BIT(1) | BIT(2), ADXL372_YZ_FIFO },
    237	{ BIT(0) | BIT(1) | BIT(2), ADXL372_XYZ_FIFO },
    238};
    239
    240static const struct iio_event_spec adxl372_events[] = {
    241	{
    242		.type = IIO_EV_TYPE_THRESH,
    243		.dir = IIO_EV_DIR_RISING,
    244		.mask_separate = BIT(IIO_EV_INFO_VALUE),
    245		.mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD) | BIT(IIO_EV_INFO_ENABLE),
    246	}, {
    247		.type = IIO_EV_TYPE_THRESH,
    248		.dir = IIO_EV_DIR_FALLING,
    249		.mask_separate = BIT(IIO_EV_INFO_VALUE),
    250		.mask_shared_by_all = BIT(IIO_EV_INFO_PERIOD) | BIT(IIO_EV_INFO_ENABLE),
    251	},
    252};
    253
    254#define ADXL372_ACCEL_CHANNEL(index, reg, axis) {			\
    255	.type = IIO_ACCEL,						\
    256	.address = reg,							\
    257	.modified = 1,							\
    258	.channel2 = IIO_MOD_##axis,					\
    259	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
    260	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |		\
    261				    BIT(IIO_CHAN_INFO_SAMP_FREQ) |	\
    262		BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY),	\
    263	.scan_index = index,						\
    264	.scan_type = {							\
    265		.sign = 's',						\
    266		.realbits = 12,						\
    267		.storagebits = 16,					\
    268		.shift = 4,						\
    269		.endianness = IIO_BE,					\
    270	},								\
    271	.event_spec = adxl372_events,					\
    272	.num_event_specs = ARRAY_SIZE(adxl372_events)			\
    273}
    274
    275static const struct iio_chan_spec adxl372_channels[] = {
    276	ADXL372_ACCEL_CHANNEL(0, ADXL372_X_DATA_H, X),
    277	ADXL372_ACCEL_CHANNEL(1, ADXL372_Y_DATA_H, Y),
    278	ADXL372_ACCEL_CHANNEL(2, ADXL372_Z_DATA_H, Z),
    279};
    280
    281struct adxl372_state {
    282	int				irq;
    283	struct device			*dev;
    284	struct regmap			*regmap;
    285	struct iio_trigger		*dready_trig;
    286	struct iio_trigger		*peak_datardy_trig;
    287	enum adxl372_fifo_mode		fifo_mode;
    288	enum adxl372_fifo_format	fifo_format;
    289	unsigned int			fifo_axis_mask;
    290	enum adxl372_op_mode		op_mode;
    291	enum adxl372_act_proc_mode	act_proc_mode;
    292	enum adxl372_odr		odr;
    293	enum adxl372_bandwidth		bw;
    294	u32				act_time_ms;
    295	u32				inact_time_ms;
    296	u8				fifo_set_size;
    297	unsigned long			int1_bitmask;
    298	unsigned long			int2_bitmask;
    299	u16				watermark;
    300	__be16				fifo_buf[ADXL372_FIFO_SIZE];
    301	bool				peak_fifo_mode_en;
    302	struct mutex			threshold_m; /* lock for threshold */
    303};
    304
    305static const unsigned long adxl372_channel_masks[] = {
    306	BIT(0), BIT(1), BIT(2),
    307	BIT(0) | BIT(1),
    308	BIT(0) | BIT(2),
    309	BIT(1) | BIT(2),
    310	BIT(0) | BIT(1) | BIT(2),
    311	0
    312};
    313
    314static ssize_t adxl372_read_threshold_value(struct iio_dev *indio_dev, unsigned int addr,
    315					    u16 *threshold)
    316{
    317	struct adxl372_state *st = iio_priv(indio_dev);
    318	__be16 raw_regval;
    319	u16 regval;
    320	int ret;
    321
    322	ret = regmap_bulk_read(st->regmap, addr, &raw_regval, sizeof(raw_regval));
    323	if (ret < 0)
    324		return ret;
    325
    326	regval = be16_to_cpu(raw_regval);
    327	regval >>= 5;
    328
    329	*threshold = regval;
    330
    331	return 0;
    332}
    333
    334static ssize_t adxl372_write_threshold_value(struct iio_dev *indio_dev, unsigned int addr,
    335					     u16 threshold)
    336{
    337	struct adxl372_state *st = iio_priv(indio_dev);
    338	int ret;
    339
    340	mutex_lock(&st->threshold_m);
    341	ret = regmap_write(st->regmap, addr, ADXL372_THRESH_VAL_H_SEL(threshold));
    342	if (ret < 0)
    343		goto unlock;
    344
    345	ret = regmap_update_bits(st->regmap, addr + 1, GENMASK(7, 5),
    346				 ADXL372_THRESH_VAL_L_SEL(threshold) << 5);
    347
    348unlock:
    349	mutex_unlock(&st->threshold_m);
    350
    351	return ret;
    352}
    353
    354static int adxl372_read_axis(struct adxl372_state *st, u8 addr)
    355{
    356	__be16 regval;
    357	int ret;
    358
    359	ret = regmap_bulk_read(st->regmap, addr, &regval, sizeof(regval));
    360	if (ret < 0)
    361		return ret;
    362
    363	return be16_to_cpu(regval);
    364}
    365
    366static int adxl372_set_op_mode(struct adxl372_state *st,
    367			       enum adxl372_op_mode op_mode)
    368{
    369	int ret;
    370
    371	ret = regmap_update_bits(st->regmap, ADXL372_POWER_CTL,
    372				 ADXL372_POWER_CTL_MODE_MSK,
    373				 ADXL372_POWER_CTL_MODE(op_mode));
    374	if (ret < 0)
    375		return ret;
    376
    377	st->op_mode = op_mode;
    378
    379	return ret;
    380}
    381
    382static int adxl372_set_odr(struct adxl372_state *st,
    383			   enum adxl372_odr odr)
    384{
    385	int ret;
    386
    387	ret = regmap_update_bits(st->regmap, ADXL372_TIMING,
    388				 ADXL372_TIMING_ODR_MSK,
    389				 ADXL372_TIMING_ODR_MODE(odr));
    390	if (ret < 0)
    391		return ret;
    392
    393	st->odr = odr;
    394
    395	return ret;
    396}
    397
    398static int adxl372_find_closest_match(const int *array,
    399				      unsigned int size, int val)
    400{
    401	int i;
    402
    403	for (i = 0; i < size; i++) {
    404		if (val <= array[i])
    405			return i;
    406	}
    407
    408	return size - 1;
    409}
    410
    411static int adxl372_set_bandwidth(struct adxl372_state *st,
    412				 enum adxl372_bandwidth bw)
    413{
    414	int ret;
    415
    416	ret = regmap_update_bits(st->regmap, ADXL372_MEASURE,
    417				 ADXL372_MEASURE_BANDWIDTH_MSK,
    418				 ADXL372_MEASURE_BANDWIDTH_MODE(bw));
    419	if (ret < 0)
    420		return ret;
    421
    422	st->bw = bw;
    423
    424	return ret;
    425}
    426
    427static int adxl372_set_act_proc_mode(struct adxl372_state *st,
    428				     enum adxl372_act_proc_mode mode)
    429{
    430	int ret;
    431
    432	ret = regmap_update_bits(st->regmap,
    433				 ADXL372_MEASURE,
    434				 ADXL372_MEASURE_LINKLOOP_MSK,
    435				 ADXL372_MEASURE_LINKLOOP_MODE(mode));
    436	if (ret < 0)
    437		return ret;
    438
    439	st->act_proc_mode = mode;
    440
    441	return ret;
    442}
    443
    444static int adxl372_set_activity_threshold(struct adxl372_state *st,
    445					  enum adxl372_th_activity act,
    446					  bool ref_en, bool enable,
    447					  unsigned int threshold)
    448{
    449	unsigned char buf[6];
    450	unsigned char th_reg_high_val, th_reg_low_val, th_reg_high_addr;
    451
    452	/* scale factor is 100 mg/code */
    453	th_reg_high_val = (threshold / 100) >> 3;
    454	th_reg_low_val = ((threshold / 100) << 5) | (ref_en << 1) | enable;
    455	th_reg_high_addr = adxl372_th_reg_high_addr[act];
    456
    457	buf[0] = th_reg_high_val;
    458	buf[1] = th_reg_low_val;
    459	buf[2] = th_reg_high_val;
    460	buf[3] = th_reg_low_val;
    461	buf[4] = th_reg_high_val;
    462	buf[5] = th_reg_low_val;
    463
    464	return regmap_bulk_write(st->regmap, th_reg_high_addr,
    465				 buf, ARRAY_SIZE(buf));
    466}
    467
    468static int adxl372_set_activity_time_ms(struct adxl372_state *st,
    469					unsigned int act_time_ms)
    470{
    471	unsigned int reg_val, scale_factor;
    472	int ret;
    473
    474	/*
    475	 * 3.3 ms per code is the scale factor of the TIME_ACT register for
    476	 * ODR = 6400 Hz. It is 6.6 ms per code for ODR = 3200 Hz and below.
    477	 */
    478	if (st->odr == ADXL372_ODR_6400HZ)
    479		scale_factor = 3300;
    480	else
    481		scale_factor = 6600;
    482
    483	reg_val = DIV_ROUND_CLOSEST(act_time_ms * 1000, scale_factor);
    484
    485	/* TIME_ACT register is 8 bits wide */
    486	if (reg_val > 0xFF)
    487		reg_val = 0xFF;
    488
    489	ret = regmap_write(st->regmap, ADXL372_TIME_ACT, reg_val);
    490	if (ret < 0)
    491		return ret;
    492
    493	st->act_time_ms = act_time_ms;
    494
    495	return ret;
    496}
    497
    498static int adxl372_set_inactivity_time_ms(struct adxl372_state *st,
    499					  unsigned int inact_time_ms)
    500{
    501	unsigned int reg_val_h, reg_val_l, res, scale_factor;
    502	int ret;
    503
    504	/*
    505	 * 13 ms per code is the scale factor of the TIME_INACT register for
    506	 * ODR = 6400 Hz. It is 26 ms per code for ODR = 3200 Hz and below.
    507	 */
    508	if (st->odr == ADXL372_ODR_6400HZ)
    509		scale_factor = 13;
    510	else
    511		scale_factor = 26;
    512
    513	res = DIV_ROUND_CLOSEST(inact_time_ms, scale_factor);
    514	reg_val_h = (res >> 8) & 0xFF;
    515	reg_val_l = res & 0xFF;
    516
    517	ret = regmap_write(st->regmap, ADXL372_TIME_INACT_H, reg_val_h);
    518	if (ret < 0)
    519		return ret;
    520
    521	ret = regmap_write(st->regmap, ADXL372_TIME_INACT_L, reg_val_l);
    522	if (ret < 0)
    523		return ret;
    524
    525	st->inact_time_ms = inact_time_ms;
    526
    527	return ret;
    528}
    529
    530static int adxl372_set_interrupts(struct adxl372_state *st,
    531				  unsigned long int1_bitmask,
    532				  unsigned long int2_bitmask)
    533{
    534	int ret;
    535
    536	ret = regmap_write(st->regmap, ADXL372_INT1_MAP, int1_bitmask);
    537	if (ret < 0)
    538		return ret;
    539
    540	return regmap_write(st->regmap, ADXL372_INT2_MAP, int2_bitmask);
    541}
    542
    543static int adxl372_configure_fifo(struct adxl372_state *st)
    544{
    545	unsigned int fifo_samples, fifo_ctl;
    546	int ret;
    547
    548	/* FIFO must be configured while in standby mode */
    549	ret = adxl372_set_op_mode(st, ADXL372_STANDBY);
    550	if (ret < 0)
    551		return ret;
    552
    553	/*
    554	 * watermark stores the number of sets; we need to write the FIFO
    555	 * registers with the number of samples
    556	 */
    557	fifo_samples = (st->watermark * st->fifo_set_size);
    558	fifo_ctl = ADXL372_FIFO_CTL_FORMAT_MODE(st->fifo_format) |
    559		   ADXL372_FIFO_CTL_MODE_MODE(st->fifo_mode) |
    560		   ADXL372_FIFO_CTL_SAMPLES_MODE(fifo_samples);
    561
    562	ret = regmap_write(st->regmap,
    563			   ADXL372_FIFO_SAMPLES, fifo_samples & 0xFF);
    564	if (ret < 0)
    565		return ret;
    566
    567	ret = regmap_write(st->regmap, ADXL372_FIFO_CTL, fifo_ctl);
    568	if (ret < 0)
    569		return ret;
    570
    571	return adxl372_set_op_mode(st, ADXL372_FULL_BW_MEASUREMENT);
    572}
    573
    574static int adxl372_get_status(struct adxl372_state *st,
    575			      u8 *status1, u8 *status2,
    576			      u16 *fifo_entries)
    577{
    578	__be32 buf;
    579	u32 val;
    580	int ret;
    581
    582	/* STATUS1, STATUS2, FIFO_ENTRIES2 and FIFO_ENTRIES are adjacent regs */
    583	ret = regmap_bulk_read(st->regmap, ADXL372_STATUS_1,
    584			       &buf, sizeof(buf));
    585	if (ret < 0)
    586		return ret;
    587
    588	val = be32_to_cpu(buf);
    589
    590	*status1 = (val >> 24) & 0x0F;
    591	*status2 = (val >> 16) & 0x0F;
    592	/*
    593	 * FIFO_ENTRIES contains the least significant byte, and FIFO_ENTRIES2
    594	 * contains the two most significant bits
    595	 */
    596	*fifo_entries = val & 0x3FF;
    597
    598	return ret;
    599}
    600
    601static void adxl372_arrange_axis_data(struct adxl372_state *st, __be16 *sample)
    602{
    603	__be16	axis_sample[3];
    604	int i = 0;
    605
    606	memset(axis_sample, 0, 3 * sizeof(__be16));
    607	if (ADXL372_X_AXIS_EN(st->fifo_axis_mask))
    608		axis_sample[i++] = sample[0];
    609	if (ADXL372_Y_AXIS_EN(st->fifo_axis_mask))
    610		axis_sample[i++] = sample[1];
    611	if (ADXL372_Z_AXIS_EN(st->fifo_axis_mask))
    612		axis_sample[i++] = sample[2];
    613
    614	memcpy(sample, axis_sample, 3 * sizeof(__be16));
    615}
    616
    617static void adxl372_push_event(struct iio_dev *indio_dev, s64 timestamp, u8 status2)
    618{
    619	unsigned int ev_dir = IIO_EV_DIR_NONE;
    620
    621	if (ADXL372_STATUS_2_ACT(status2))
    622		ev_dir = IIO_EV_DIR_RISING;
    623
    624	if (ADXL372_STATUS_2_INACT(status2))
    625		ev_dir = IIO_EV_DIR_FALLING;
    626
    627	if (ev_dir != IIO_EV_DIR_NONE)
    628		iio_push_event(indio_dev,
    629			       IIO_MOD_EVENT_CODE(IIO_ACCEL, 0, IIO_MOD_X_OR_Y_OR_Z,
    630						  IIO_EV_TYPE_THRESH, ev_dir),
    631			       timestamp);
    632}
    633
    634static irqreturn_t adxl372_trigger_handler(int irq, void  *p)
    635{
    636	struct iio_poll_func *pf = p;
    637	struct iio_dev *indio_dev = pf->indio_dev;
    638	struct adxl372_state *st = iio_priv(indio_dev);
    639	u8 status1, status2;
    640	u16 fifo_entries;
    641	int i, ret;
    642
    643	ret = adxl372_get_status(st, &status1, &status2, &fifo_entries);
    644	if (ret < 0)
    645		goto err;
    646
    647	adxl372_push_event(indio_dev, iio_get_time_ns(indio_dev), status2);
    648
    649	if (st->fifo_mode != ADXL372_FIFO_BYPASSED &&
    650	    ADXL372_STATUS_1_FIFO_FULL(status1)) {
    651		/*
    652		 * When reading data from multiple axes from the FIFO,
    653		 * to ensure that data is not overwritten and stored out
    654		 * of order at least one sample set must be left in the
    655		 * FIFO after every read.
    656		 */
    657		fifo_entries -= st->fifo_set_size;
    658
    659		/* Read data from the FIFO */
    660		ret = regmap_noinc_read(st->regmap, ADXL372_FIFO_DATA,
    661					st->fifo_buf,
    662					fifo_entries * sizeof(u16));
    663		if (ret < 0)
    664			goto err;
    665
    666		/* Each sample is 2 bytes */
    667		for (i = 0; i < fifo_entries; i += st->fifo_set_size) {
    668			/* filter peak detection data */
    669			if (st->peak_fifo_mode_en)
    670				adxl372_arrange_axis_data(st, &st->fifo_buf[i]);
    671			iio_push_to_buffers(indio_dev, &st->fifo_buf[i]);
    672		}
    673	}
    674err:
    675	iio_trigger_notify_done(indio_dev->trig);
    676	return IRQ_HANDLED;
    677}
    678
    679static int adxl372_setup(struct adxl372_state *st)
    680{
    681	unsigned int regval;
    682	int ret;
    683
    684	ret = regmap_read(st->regmap, ADXL372_DEVID, &regval);
    685	if (ret < 0)
    686		return ret;
    687
    688	if (regval != ADXL372_DEVID_VAL) {
    689		dev_err(st->dev, "Invalid chip id %x\n", regval);
    690		return -ENODEV;
    691	}
    692
    693	/*
    694	 * Perform a software reset to make sure the device is in a consistent
    695	 * state after start up.
    696	 */
    697	ret = regmap_write(st->regmap, ADXL372_RESET, ADXL372_RESET_CODE);
    698	if (ret < 0)
    699		return ret;
    700
    701	ret = adxl372_set_op_mode(st, ADXL372_STANDBY);
    702	if (ret < 0)
    703		return ret;
    704
    705	/* Set threshold for activity detection to 1g */
    706	ret = adxl372_set_activity_threshold(st, ADXL372_ACTIVITY,
    707					     true, true, 1000);
    708	if (ret < 0)
    709		return ret;
    710
    711	/* Set threshold for inactivity detection to 100mg */
    712	ret = adxl372_set_activity_threshold(st, ADXL372_INACTIVITY,
    713					     true, true, 100);
    714	if (ret < 0)
    715		return ret;
    716
    717	/* Set activity processing in Looped mode */
    718	ret = adxl372_set_act_proc_mode(st, ADXL372_LOOPED);
    719	if (ret < 0)
    720		return ret;
    721
    722	ret = adxl372_set_odr(st, ADXL372_ODR_6400HZ);
    723	if (ret < 0)
    724		return ret;
    725
    726	ret = adxl372_set_bandwidth(st, ADXL372_BW_3200HZ);
    727	if (ret < 0)
    728		return ret;
    729
    730	/* Set activity timer to 1ms */
    731	ret = adxl372_set_activity_time_ms(st, 1);
    732	if (ret < 0)
    733		return ret;
    734
    735	/* Set inactivity timer to 10s */
    736	ret = adxl372_set_inactivity_time_ms(st, 10000);
    737	if (ret < 0)
    738		return ret;
    739
    740	/* Set the mode of operation to full bandwidth measurement mode */
    741	return adxl372_set_op_mode(st, ADXL372_FULL_BW_MEASUREMENT);
    742}
    743
    744static int adxl372_reg_access(struct iio_dev *indio_dev,
    745			      unsigned int reg,
    746			      unsigned int writeval,
    747			      unsigned int *readval)
    748{
    749	struct adxl372_state *st = iio_priv(indio_dev);
    750
    751	if (readval)
    752		return regmap_read(st->regmap, reg, readval);
    753	else
    754		return regmap_write(st->regmap, reg, writeval);
    755}
    756
    757static int adxl372_read_raw(struct iio_dev *indio_dev,
    758			    struct iio_chan_spec const *chan,
    759			    int *val, int *val2, long info)
    760{
    761	struct adxl372_state *st = iio_priv(indio_dev);
    762	int ret;
    763
    764	switch (info) {
    765	case IIO_CHAN_INFO_RAW:
    766		ret = iio_device_claim_direct_mode(indio_dev);
    767		if (ret)
    768			return ret;
    769
    770		ret = adxl372_read_axis(st, chan->address);
    771		iio_device_release_direct_mode(indio_dev);
    772		if (ret < 0)
    773			return ret;
    774
    775		*val = sign_extend32(ret >> chan->scan_type.shift,
    776				     chan->scan_type.realbits - 1);
    777		return IIO_VAL_INT;
    778	case IIO_CHAN_INFO_SCALE:
    779		*val = 0;
    780		*val2 = ADXL372_USCALE;
    781		return IIO_VAL_INT_PLUS_MICRO;
    782	case IIO_CHAN_INFO_SAMP_FREQ:
    783		*val = adxl372_samp_freq_tbl[st->odr];
    784		return IIO_VAL_INT;
    785	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
    786		*val = adxl372_bw_freq_tbl[st->bw];
    787		return IIO_VAL_INT;
    788	}
    789
    790	return -EINVAL;
    791}
    792
    793static int adxl372_write_raw(struct iio_dev *indio_dev,
    794			     struct iio_chan_spec const *chan,
    795			     int val, int val2, long info)
    796{
    797	struct adxl372_state *st = iio_priv(indio_dev);
    798	int odr_index, bw_index, ret;
    799
    800	switch (info) {
    801	case IIO_CHAN_INFO_SAMP_FREQ:
    802		odr_index = adxl372_find_closest_match(adxl372_samp_freq_tbl,
    803					ARRAY_SIZE(adxl372_samp_freq_tbl),
    804					val);
    805		ret = adxl372_set_odr(st, odr_index);
    806		if (ret < 0)
    807			return ret;
    808		/*
    809		 * The timer period depends on the ODR selected.
    810		 * At 3200 Hz and below, it is 6.6 ms; at 6400 Hz, it is 3.3 ms
    811		 */
    812		ret = adxl372_set_activity_time_ms(st, st->act_time_ms);
    813		if (ret < 0)
    814			return ret;
    815		/*
    816		 * The timer period depends on the ODR selected.
    817		 * At 3200 Hz and below, it is 26 ms; at 6400 Hz, it is 13 ms
    818		 */
    819		ret = adxl372_set_inactivity_time_ms(st, st->inact_time_ms);
    820		if (ret < 0)
    821			return ret;
    822		/*
    823		 * The maximum bandwidth is constrained to at most half of
    824		 * the ODR to ensure that the Nyquist criteria is not violated
    825		 */
    826		if (st->bw > odr_index)
    827			ret = adxl372_set_bandwidth(st, odr_index);
    828
    829		return ret;
    830	case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
    831		bw_index = adxl372_find_closest_match(adxl372_bw_freq_tbl,
    832					ARRAY_SIZE(adxl372_bw_freq_tbl),
    833					val);
    834		return adxl372_set_bandwidth(st, bw_index);
    835	default:
    836		return -EINVAL;
    837	}
    838}
    839
    840static int adxl372_read_event_value(struct iio_dev *indio_dev, const struct iio_chan_spec *chan,
    841				    enum iio_event_type type, enum iio_event_direction dir,
    842				    enum iio_event_info info, int *val, int *val2)
    843{
    844	struct adxl372_state *st = iio_priv(indio_dev);
    845	unsigned int addr;
    846	u16 raw_value;
    847	int ret;
    848
    849	switch (info) {
    850	case IIO_EV_INFO_VALUE:
    851		switch (dir) {
    852		case IIO_EV_DIR_RISING:
    853			addr = ADXL372_X_THRESH_ACT_H + 2 * chan->scan_index;
    854			ret = adxl372_read_threshold_value(indio_dev, addr, &raw_value);
    855			if (ret < 0)
    856				return ret;
    857			*val = raw_value * ADXL372_USCALE;
    858			*val2 = 1000000;
    859			return IIO_VAL_FRACTIONAL;
    860		case IIO_EV_DIR_FALLING:
    861			addr = ADXL372_X_THRESH_INACT_H + 2 * chan->scan_index;
    862			ret =  adxl372_read_threshold_value(indio_dev, addr, &raw_value);
    863			if (ret < 0)
    864				return ret;
    865			*val = raw_value * ADXL372_USCALE;
    866			*val2 = 1000000;
    867			return IIO_VAL_FRACTIONAL;
    868		default:
    869			return -EINVAL;
    870		}
    871	case IIO_EV_INFO_PERIOD:
    872		switch (dir) {
    873		case IIO_EV_DIR_RISING:
    874			*val = st->act_time_ms;
    875			*val2 = 1000;
    876			return IIO_VAL_FRACTIONAL;
    877		case IIO_EV_DIR_FALLING:
    878			*val = st->inact_time_ms;
    879			*val2 = 1000;
    880			return IIO_VAL_FRACTIONAL;
    881		default:
    882			return -EINVAL;
    883		}
    884	default:
    885		return -EINVAL;
    886	}
    887}
    888
    889static int adxl372_write_event_value(struct iio_dev *indio_dev, const struct iio_chan_spec *chan,
    890				     enum iio_event_type type, enum iio_event_direction dir,
    891				     enum iio_event_info info, int val, int val2)
    892{
    893	struct adxl372_state *st = iio_priv(indio_dev);
    894	unsigned int val_ms;
    895	unsigned int addr;
    896	u16 raw_val;
    897
    898	switch (info) {
    899	case IIO_EV_INFO_VALUE:
    900		raw_val = DIV_ROUND_UP(val * 1000000, ADXL372_USCALE);
    901		switch (dir) {
    902		case IIO_EV_DIR_RISING:
    903			addr = ADXL372_X_THRESH_ACT_H + 2 * chan->scan_index;
    904			return adxl372_write_threshold_value(indio_dev, addr, raw_val);
    905		case IIO_EV_DIR_FALLING:
    906			addr = ADXL372_X_THRESH_INACT_H + 2 * chan->scan_index;
    907			return adxl372_write_threshold_value(indio_dev, addr, raw_val);
    908		default:
    909			return -EINVAL;
    910		}
    911	case IIO_EV_INFO_PERIOD:
    912		val_ms = val * 1000 + DIV_ROUND_UP(val2, 1000);
    913		switch (dir) {
    914		case IIO_EV_DIR_RISING:
    915			return adxl372_set_activity_time_ms(st, val_ms);
    916		case IIO_EV_DIR_FALLING:
    917			return adxl372_set_inactivity_time_ms(st, val_ms);
    918		default:
    919			return -EINVAL;
    920		}
    921	default:
    922		return -EINVAL;
    923	}
    924}
    925
    926static int adxl372_read_event_config(struct iio_dev *indio_dev, const struct iio_chan_spec *chan,
    927				     enum iio_event_type type, enum iio_event_direction dir)
    928{
    929	struct adxl372_state *st = iio_priv(indio_dev);
    930
    931	switch (dir) {
    932	case IIO_EV_DIR_RISING:
    933		return FIELD_GET(ADXL372_INT1_MAP_ACT_MSK, st->int1_bitmask);
    934	case IIO_EV_DIR_FALLING:
    935		return FIELD_GET(ADXL372_INT1_MAP_INACT_MSK, st->int1_bitmask);
    936	default:
    937		return -EINVAL;
    938	}
    939}
    940
    941static int adxl372_write_event_config(struct iio_dev *indio_dev, const struct iio_chan_spec *chan,
    942				      enum iio_event_type type, enum iio_event_direction dir,
    943				      int state)
    944{
    945	struct adxl372_state *st = iio_priv(indio_dev);
    946
    947	switch (dir) {
    948	case IIO_EV_DIR_RISING:
    949		set_mask_bits(&st->int1_bitmask, ADXL372_INT1_MAP_ACT_MSK,
    950			      ADXL372_INT1_MAP_ACT_MODE(state));
    951		break;
    952	case IIO_EV_DIR_FALLING:
    953		set_mask_bits(&st->int1_bitmask, ADXL372_INT1_MAP_INACT_MSK,
    954			      ADXL372_INT1_MAP_INACT_MODE(state));
    955		break;
    956	default:
    957		return -EINVAL;
    958	}
    959
    960	return adxl372_set_interrupts(st, st->int1_bitmask, 0);
    961}
    962
    963static ssize_t adxl372_show_filter_freq_avail(struct device *dev,
    964					      struct device_attribute *attr,
    965					      char *buf)
    966{
    967	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
    968	struct adxl372_state *st = iio_priv(indio_dev);
    969	int i;
    970	size_t len = 0;
    971
    972	for (i = 0; i <= st->odr; i++)
    973		len += scnprintf(buf + len, PAGE_SIZE - len,
    974				 "%d ", adxl372_bw_freq_tbl[i]);
    975
    976	buf[len - 1] = '\n';
    977
    978	return len;
    979}
    980
    981static ssize_t adxl372_get_fifo_enabled(struct device *dev,
    982					  struct device_attribute *attr,
    983					  char *buf)
    984{
    985	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
    986	struct adxl372_state *st = iio_priv(indio_dev);
    987
    988	return sprintf(buf, "%d\n", st->fifo_mode);
    989}
    990
    991static ssize_t adxl372_get_fifo_watermark(struct device *dev,
    992					  struct device_attribute *attr,
    993					  char *buf)
    994{
    995	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
    996	struct adxl372_state *st = iio_priv(indio_dev);
    997
    998	return sprintf(buf, "%d\n", st->watermark);
    999}
   1000
   1001static IIO_CONST_ATTR(hwfifo_watermark_min, "1");
   1002static IIO_CONST_ATTR(hwfifo_watermark_max,
   1003		      __stringify(ADXL372_FIFO_SIZE));
   1004static IIO_DEVICE_ATTR(hwfifo_watermark, 0444,
   1005		       adxl372_get_fifo_watermark, NULL, 0);
   1006static IIO_DEVICE_ATTR(hwfifo_enabled, 0444,
   1007		       adxl372_get_fifo_enabled, NULL, 0);
   1008
   1009static const struct attribute *adxl372_fifo_attributes[] = {
   1010	&iio_const_attr_hwfifo_watermark_min.dev_attr.attr,
   1011	&iio_const_attr_hwfifo_watermark_max.dev_attr.attr,
   1012	&iio_dev_attr_hwfifo_watermark.dev_attr.attr,
   1013	&iio_dev_attr_hwfifo_enabled.dev_attr.attr,
   1014	NULL,
   1015};
   1016
   1017static int adxl372_set_watermark(struct iio_dev *indio_dev, unsigned int val)
   1018{
   1019	struct adxl372_state *st  = iio_priv(indio_dev);
   1020
   1021	if (val > ADXL372_FIFO_SIZE)
   1022		val = ADXL372_FIFO_SIZE;
   1023
   1024	st->watermark = val;
   1025
   1026	return 0;
   1027}
   1028
   1029static int adxl372_buffer_postenable(struct iio_dev *indio_dev)
   1030{
   1031	struct adxl372_state *st = iio_priv(indio_dev);
   1032	unsigned int mask;
   1033	int i, ret;
   1034
   1035	st->int1_bitmask |= ADXL372_INT1_MAP_FIFO_FULL_MSK;
   1036	ret = adxl372_set_interrupts(st, st->int1_bitmask, 0);
   1037	if (ret < 0)
   1038		return ret;
   1039
   1040	mask = *indio_dev->active_scan_mask;
   1041
   1042	for (i = 0; i < ARRAY_SIZE(adxl372_axis_lookup_table); i++) {
   1043		if (mask == adxl372_axis_lookup_table[i].bits)
   1044			break;
   1045	}
   1046
   1047	if (i == ARRAY_SIZE(adxl372_axis_lookup_table))
   1048		return -EINVAL;
   1049
   1050	st->fifo_format = adxl372_axis_lookup_table[i].fifo_format;
   1051	st->fifo_axis_mask = adxl372_axis_lookup_table[i].bits;
   1052	st->fifo_set_size = bitmap_weight(indio_dev->active_scan_mask,
   1053					  indio_dev->masklength);
   1054
   1055	/* Configure the FIFO to store sets of impact event peak. */
   1056	if (st->peak_fifo_mode_en) {
   1057		st->fifo_set_size = 3;
   1058		st->fifo_format = ADXL372_XYZ_PEAK_FIFO;
   1059	}
   1060
   1061	/*
   1062	 * The 512 FIFO samples can be allotted in several ways, such as:
   1063	 * 170 sample sets of concurrent 3-axis data
   1064	 * 256 sample sets of concurrent 2-axis data (user selectable)
   1065	 * 512 sample sets of single-axis data
   1066	 * 170 sets of impact event peak (x, y, z)
   1067	 */
   1068	if ((st->watermark * st->fifo_set_size) > ADXL372_FIFO_SIZE)
   1069		st->watermark = (ADXL372_FIFO_SIZE  / st->fifo_set_size);
   1070
   1071	st->fifo_mode = ADXL372_FIFO_STREAMED;
   1072
   1073	ret = adxl372_configure_fifo(st);
   1074	if (ret < 0) {
   1075		st->fifo_mode = ADXL372_FIFO_BYPASSED;
   1076		st->int1_bitmask &= ~ADXL372_INT1_MAP_FIFO_FULL_MSK;
   1077		adxl372_set_interrupts(st, st->int1_bitmask, 0);
   1078		return ret;
   1079	}
   1080
   1081	return 0;
   1082}
   1083
   1084static int adxl372_buffer_predisable(struct iio_dev *indio_dev)
   1085{
   1086	struct adxl372_state *st = iio_priv(indio_dev);
   1087
   1088	st->int1_bitmask &= ~ADXL372_INT1_MAP_FIFO_FULL_MSK;
   1089	adxl372_set_interrupts(st, st->int1_bitmask, 0);
   1090	st->fifo_mode = ADXL372_FIFO_BYPASSED;
   1091	adxl372_configure_fifo(st);
   1092
   1093	return 0;
   1094}
   1095
   1096static const struct iio_buffer_setup_ops adxl372_buffer_ops = {
   1097	.postenable = adxl372_buffer_postenable,
   1098	.predisable = adxl372_buffer_predisable,
   1099};
   1100
   1101static int adxl372_dready_trig_set_state(struct iio_trigger *trig,
   1102					 bool state)
   1103{
   1104	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
   1105	struct adxl372_state *st = iio_priv(indio_dev);
   1106
   1107	if (state)
   1108		st->int1_bitmask |= ADXL372_INT1_MAP_FIFO_FULL_MSK;
   1109
   1110	return adxl372_set_interrupts(st, st->int1_bitmask, 0);
   1111}
   1112
   1113static int adxl372_validate_trigger(struct iio_dev *indio_dev,
   1114				    struct iio_trigger *trig)
   1115{
   1116	struct adxl372_state *st = iio_priv(indio_dev);
   1117
   1118	if (st->dready_trig != trig && st->peak_datardy_trig != trig)
   1119		return -EINVAL;
   1120
   1121	return 0;
   1122}
   1123
   1124static const struct iio_trigger_ops adxl372_trigger_ops = {
   1125	.validate_device = &iio_trigger_validate_own_device,
   1126	.set_trigger_state = adxl372_dready_trig_set_state,
   1127};
   1128
   1129static int adxl372_peak_dready_trig_set_state(struct iio_trigger *trig,
   1130					      bool state)
   1131{
   1132	struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
   1133	struct adxl372_state *st = iio_priv(indio_dev);
   1134
   1135	if (state)
   1136		st->int1_bitmask |= ADXL372_INT1_MAP_FIFO_FULL_MSK;
   1137
   1138	st->peak_fifo_mode_en = state;
   1139
   1140	return adxl372_set_interrupts(st, st->int1_bitmask, 0);
   1141}
   1142
   1143static const struct iio_trigger_ops adxl372_peak_data_trigger_ops = {
   1144	.validate_device = &iio_trigger_validate_own_device,
   1145	.set_trigger_state = adxl372_peak_dready_trig_set_state,
   1146};
   1147
   1148static IIO_CONST_ATTR_SAMP_FREQ_AVAIL("400 800 1600 3200 6400");
   1149static IIO_DEVICE_ATTR(in_accel_filter_low_pass_3db_frequency_available,
   1150		       0444, adxl372_show_filter_freq_avail, NULL, 0);
   1151
   1152static struct attribute *adxl372_attributes[] = {
   1153	&iio_const_attr_sampling_frequency_available.dev_attr.attr,
   1154	&iio_dev_attr_in_accel_filter_low_pass_3db_frequency_available.dev_attr.attr,
   1155	NULL,
   1156};
   1157
   1158static const struct attribute_group adxl372_attrs_group = {
   1159	.attrs = adxl372_attributes,
   1160};
   1161
   1162static const struct iio_info adxl372_info = {
   1163	.validate_trigger = &adxl372_validate_trigger,
   1164	.attrs = &adxl372_attrs_group,
   1165	.read_raw = adxl372_read_raw,
   1166	.write_raw = adxl372_write_raw,
   1167	.read_event_config = adxl372_read_event_config,
   1168	.write_event_config = adxl372_write_event_config,
   1169	.read_event_value = adxl372_read_event_value,
   1170	.write_event_value = adxl372_write_event_value,
   1171	.debugfs_reg_access = &adxl372_reg_access,
   1172	.hwfifo_set_watermark = adxl372_set_watermark,
   1173};
   1174
   1175bool adxl372_readable_noinc_reg(struct device *dev, unsigned int reg)
   1176{
   1177	return (reg == ADXL372_FIFO_DATA);
   1178}
   1179EXPORT_SYMBOL_NS_GPL(adxl372_readable_noinc_reg, IIO_ADXL372);
   1180
   1181int adxl372_probe(struct device *dev, struct regmap *regmap,
   1182		  int irq, const char *name)
   1183{
   1184	struct iio_dev *indio_dev;
   1185	struct adxl372_state *st;
   1186	int ret;
   1187
   1188	indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
   1189	if (!indio_dev)
   1190		return -ENOMEM;
   1191
   1192	st = iio_priv(indio_dev);
   1193	dev_set_drvdata(dev, indio_dev);
   1194
   1195	st->dev = dev;
   1196	st->regmap = regmap;
   1197	st->irq = irq;
   1198
   1199	mutex_init(&st->threshold_m);
   1200
   1201	indio_dev->channels = adxl372_channels;
   1202	indio_dev->num_channels = ARRAY_SIZE(adxl372_channels);
   1203	indio_dev->available_scan_masks = adxl372_channel_masks;
   1204	indio_dev->name = name;
   1205	indio_dev->info = &adxl372_info;
   1206	indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_SOFTWARE;
   1207
   1208	ret = adxl372_setup(st);
   1209	if (ret < 0) {
   1210		dev_err(dev, "ADXL372 setup failed\n");
   1211		return ret;
   1212	}
   1213
   1214	ret = devm_iio_triggered_buffer_setup_ext(dev,
   1215						  indio_dev, NULL,
   1216						  adxl372_trigger_handler,
   1217						  IIO_BUFFER_DIRECTION_IN,
   1218						  &adxl372_buffer_ops,
   1219						  adxl372_fifo_attributes);
   1220	if (ret < 0)
   1221		return ret;
   1222
   1223	if (st->irq) {
   1224		st->dready_trig = devm_iio_trigger_alloc(dev,
   1225							 "%s-dev%d",
   1226							 indio_dev->name,
   1227							 iio_device_id(indio_dev));
   1228		if (st->dready_trig == NULL)
   1229			return -ENOMEM;
   1230
   1231		st->peak_datardy_trig = devm_iio_trigger_alloc(dev,
   1232							       "%s-dev%d-peak",
   1233							       indio_dev->name,
   1234							       iio_device_id(indio_dev));
   1235		if (!st->peak_datardy_trig)
   1236			return -ENOMEM;
   1237
   1238		st->dready_trig->ops = &adxl372_trigger_ops;
   1239		st->peak_datardy_trig->ops = &adxl372_peak_data_trigger_ops;
   1240		iio_trigger_set_drvdata(st->dready_trig, indio_dev);
   1241		iio_trigger_set_drvdata(st->peak_datardy_trig, indio_dev);
   1242		ret = devm_iio_trigger_register(dev, st->dready_trig);
   1243		if (ret < 0)
   1244			return ret;
   1245
   1246		ret = devm_iio_trigger_register(dev, st->peak_datardy_trig);
   1247		if (ret < 0)
   1248			return ret;
   1249
   1250		indio_dev->trig = iio_trigger_get(st->dready_trig);
   1251
   1252		ret = devm_request_threaded_irq(dev, st->irq,
   1253					iio_trigger_generic_data_rdy_poll,
   1254					NULL,
   1255					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
   1256					indio_dev->name, st->dready_trig);
   1257		if (ret < 0)
   1258			return ret;
   1259	}
   1260
   1261	return devm_iio_device_register(dev, indio_dev);
   1262}
   1263EXPORT_SYMBOL_NS_GPL(adxl372_probe, IIO_ADXL372);
   1264
   1265MODULE_AUTHOR("Stefan Popa <stefan.popa@analog.com>");
   1266MODULE_DESCRIPTION("Analog Devices ADXL372 3-axis accelerometer driver");
   1267MODULE_LICENSE("GPL");