xref: /openbmc/linux/drivers/iio/accel/adxl313.h (revision a7a1c60b)
1636d4463SLucas Stankus /* SPDX-License-Identifier: GPL-2.0-only */
2636d4463SLucas Stankus /*
3636d4463SLucas Stankus  * ADXL313 3-Axis Digital Accelerometer
4636d4463SLucas Stankus  *
5636d4463SLucas Stankus  * Copyright (c) 2021 Lucas Stankus <lucas.p.stankus@gmail.com>
6636d4463SLucas Stankus  */
7636d4463SLucas Stankus 
8636d4463SLucas Stankus #ifndef _ADXL313_H_
9636d4463SLucas Stankus #define _ADXL313_H_
10636d4463SLucas Stankus 
11*a7a1c60bSGeorge Mois #include <linux/iio/iio.h>
12*a7a1c60bSGeorge Mois 
13636d4463SLucas Stankus /* ADXL313 register definitions */
14636d4463SLucas Stankus #define ADXL313_REG_DEVID0		0x00
15636d4463SLucas Stankus #define ADXL313_REG_DEVID1		0x01
16636d4463SLucas Stankus #define ADXL313_REG_PARTID		0x02
17636d4463SLucas Stankus #define ADXL313_REG_XID			0x04
18636d4463SLucas Stankus #define ADXL313_REG_SOFT_RESET		0x18
19636d4463SLucas Stankus #define ADXL313_REG_OFS_AXIS(index)	(0x1E + (index))
20636d4463SLucas Stankus #define ADXL313_REG_THRESH_ACT		0x24
21636d4463SLucas Stankus #define ADXL313_REG_ACT_INACT_CTL	0x27
22636d4463SLucas Stankus #define ADXL313_REG_BW_RATE		0x2C
23636d4463SLucas Stankus #define ADXL313_REG_POWER_CTL		0x2D
24636d4463SLucas Stankus #define ADXL313_REG_INT_MAP		0x2F
25636d4463SLucas Stankus #define ADXL313_REG_DATA_FORMAT		0x31
26636d4463SLucas Stankus #define ADXL313_REG_DATA_AXIS(index)	(0x32 + ((index) * 2))
27636d4463SLucas Stankus #define ADXL313_REG_FIFO_CTL		0x38
28636d4463SLucas Stankus #define ADXL313_REG_FIFO_STATUS		0x39
29636d4463SLucas Stankus 
30636d4463SLucas Stankus #define ADXL313_DEVID0			0xAD
31*a7a1c60bSGeorge Mois #define ADXL313_DEVID0_ADXL312_314	0xE5
32636d4463SLucas Stankus #define ADXL313_DEVID1			0x1D
33636d4463SLucas Stankus #define ADXL313_PARTID			0xCB
34636d4463SLucas Stankus #define ADXL313_SOFT_RESET		0x52
35636d4463SLucas Stankus 
36636d4463SLucas Stankus #define ADXL313_RATE_MSK		GENMASK(3, 0)
37636d4463SLucas Stankus #define ADXL313_RATE_BASE		6
38636d4463SLucas Stankus 
39636d4463SLucas Stankus #define ADXL313_POWER_CTL_MSK		GENMASK(3, 2)
40636d4463SLucas Stankus #define ADXL313_MEASUREMENT_MODE	BIT(3)
41636d4463SLucas Stankus 
42636d4463SLucas Stankus #define ADXL313_RANGE_MSK		GENMASK(1, 0)
43*a7a1c60bSGeorge Mois #define ADXL313_RANGE_MAX		3
44636d4463SLucas Stankus 
45636d4463SLucas Stankus #define ADXL313_FULL_RES		BIT(3)
46636d4463SLucas Stankus #define ADXL313_SPI_3WIRE		BIT(6)
47636d4463SLucas Stankus #define ADXL313_I2C_DISABLE		BIT(6)
48636d4463SLucas Stankus 
49*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl312_readable_regs_table;
50636d4463SLucas Stankus extern const struct regmap_access_table adxl313_readable_regs_table;
51*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl314_readable_regs_table;
52636d4463SLucas Stankus 
53*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl312_writable_regs_table;
54636d4463SLucas Stankus extern const struct regmap_access_table adxl313_writable_regs_table;
55*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl314_writable_regs_table;
56*a7a1c60bSGeorge Mois 
57*a7a1c60bSGeorge Mois enum adxl313_device_type {
58*a7a1c60bSGeorge Mois 	ADXL312,
59*a7a1c60bSGeorge Mois 	ADXL313,
60*a7a1c60bSGeorge Mois 	ADXL314,
61*a7a1c60bSGeorge Mois };
62*a7a1c60bSGeorge Mois 
63*a7a1c60bSGeorge Mois struct adxl313_data {
64*a7a1c60bSGeorge Mois 	struct regmap	*regmap;
65*a7a1c60bSGeorge Mois 	const struct adxl313_chip_info *chip_info;
66*a7a1c60bSGeorge Mois 	struct mutex	lock; /* lock to protect transf_buf */
67*a7a1c60bSGeorge Mois 	__le16		transf_buf __aligned(IIO_DMA_MINALIGN);
68*a7a1c60bSGeorge Mois };
69*a7a1c60bSGeorge Mois 
70*a7a1c60bSGeorge Mois struct adxl313_chip_info {
71*a7a1c60bSGeorge Mois 	const char			*name;
72*a7a1c60bSGeorge Mois 	enum adxl313_device_type	type;
73*a7a1c60bSGeorge Mois 	int				scale_factor;
74*a7a1c60bSGeorge Mois 	bool				variable_range;
75*a7a1c60bSGeorge Mois 	bool				soft_reset;
76*a7a1c60bSGeorge Mois 	int (*check_id)(struct device *dev, struct adxl313_data *data);
77*a7a1c60bSGeorge Mois };
78*a7a1c60bSGeorge Mois 
79*a7a1c60bSGeorge Mois extern const struct adxl313_chip_info adxl31x_chip_info[];
80636d4463SLucas Stankus 
81636d4463SLucas Stankus int adxl313_core_probe(struct device *dev,
82636d4463SLucas Stankus 		       struct regmap *regmap,
83*a7a1c60bSGeorge Mois 		       const struct adxl313_chip_info *chip_info,
84636d4463SLucas Stankus 		       int (*setup)(struct device *, struct regmap *));
85636d4463SLucas Stankus #endif /* _ADXL313_H_ */
86