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

adxl367.c (38190B)


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