1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * ADXL313 3-Axis Digital Accelerometer
4 *
5 * Copyright (c) 2021 Lucas Stankus <lucas.p.stankus@gmail.com>
6 */
7
8#ifndef _ADXL313_H_
9#define _ADXL313_H_
10
11#include <linux/iio/iio.h>
12
13/* ADXL313 register definitions */
14#define ADXL313_REG_DEVID0 0x00
15#define ADXL313_REG_DEVID1 0x01
16#define ADXL313_REG_PARTID 0x02
17#define ADXL313_REG_XID 0x04
18#define ADXL313_REG_SOFT_RESET 0x18
19#define ADXL313_REG_OFS_AXIS(index) (0x1E + (index))
20#define ADXL313_REG_THRESH_ACT 0x24
21#define ADXL313_REG_ACT_INACT_CTL 0x27
22#define ADXL313_REG_BW_RATE 0x2C
23#define ADXL313_REG_POWER_CTL 0x2D
24#define ADXL313_REG_INT_MAP 0x2F
25#define ADXL313_REG_DATA_FORMAT 0x31
26#define ADXL313_REG_DATA_AXIS(index) (0x32 + ((index) * 2))
27#define ADXL313_REG_FIFO_CTL 0x38
28#define ADXL313_REG_FIFO_STATUS 0x39
29
30#define ADXL313_DEVID0 0xAD
31#define ADXL313_DEVID0_ADXL312_314 0xE5
32#define ADXL313_DEVID1 0x1D
33#define ADXL313_PARTID 0xCB
34#define ADXL313_SOFT_RESET 0x52
35
36#define ADXL313_RATE_MSK GENMASK(3, 0)
37#define ADXL313_RATE_BASE 6
38
39#define ADXL313_POWER_CTL_MSK GENMASK(3, 2)
40#define ADXL313_MEASUREMENT_MODE BIT(3)
41
42#define ADXL313_RANGE_MSK GENMASK(1, 0)
43#define ADXL313_RANGE_MAX 3
44
45#define ADXL313_FULL_RES BIT(3)
46#define ADXL313_SPI_3WIRE BIT(6)
47#define ADXL313_I2C_DISABLE BIT(6)
48
49extern const struct regmap_access_table adxl312_readable_regs_table;
50extern const struct regmap_access_table adxl313_readable_regs_table;
51extern const struct regmap_access_table adxl314_readable_regs_table;
52
53extern const struct regmap_access_table adxl312_writable_regs_table;
54extern const struct regmap_access_table adxl313_writable_regs_table;
55extern const struct regmap_access_table adxl314_writable_regs_table;
56
57enum adxl313_device_type {
58 ADXL312,
59 ADXL313,
60 ADXL314,
61};
62
63struct adxl313_data {
64 struct regmap *regmap;
65 const struct adxl313_chip_info *chip_info;
66 struct mutex lock; /* lock to protect transf_buf */
67 __le16 transf_buf __aligned(IIO_DMA_MINALIGN);
68};
69
70struct adxl313_chip_info {
71 const char *name;
72 enum adxl313_device_type type;
73 int scale_factor;
74 bool variable_range;
75 bool soft_reset;
76 int (*check_id)(struct device *dev, struct adxl313_data *data);
77};
78
79extern const struct adxl313_chip_info adxl31x_chip_info[];
80
81int adxl313_core_probe(struct device *dev,
82 struct regmap *regmap,
83 const struct adxl313_chip_info *chip_info,
84 int (*setup)(struct device *, struct regmap *));
85#endif /* _ADXL313_H_ */
86

source code of linux/drivers/iio/accel/adxl313.h