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