Linux 6.7-rc7
[linux-modified.git] / drivers / iio / accel / adxl313.h
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
49 extern const struct regmap_access_table adxl312_readable_regs_table;
50 extern const struct regmap_access_table adxl313_readable_regs_table;
51 extern const struct regmap_access_table adxl314_readable_regs_table;
52
53 extern const struct regmap_access_table adxl312_writable_regs_table;
54 extern const struct regmap_access_table adxl313_writable_regs_table;
55 extern const struct regmap_access_table adxl314_writable_regs_table;
56
57 enum adxl313_device_type {
58         ADXL312,
59         ADXL313,
60         ADXL314,
61 };
62
63 struct 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
70 struct 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
79 extern const struct adxl313_chip_info adxl31x_chip_info[];
80
81 int 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_ */