xref: /OK3568_Linux_fs/kernel/drivers/iio/imu/st_lsm6dsr/st_lsm6dsr.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * STMicroelectronics st_lsm6dsr sensor driver
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2020 STMicroelectronics Inc.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Lorenzo Bianconi <lorenzo.bianconi@st.com>
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef ST_LSM6DSR_H
11*4882a593Smuzhiyun #define ST_LSM6DSR_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/device.h>
14*4882a593Smuzhiyun #include <linux/iio/iio.h>
15*4882a593Smuzhiyun #include <linux/delay.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define ST_LSM6DSR_MAX_ODR			833
18*4882a593Smuzhiyun #define ST_LSM6DSR_ODR_LIST_SIZE		8
19*4882a593Smuzhiyun #define ST_LSM6DSR_ODR_EXPAND(odr, uodr)	((odr * 1000000) + uodr)
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define ST_LSM6DSR_DEV_NAME			"lsm6dsr"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FUNC_CFG_ACCESS_ADDR	0x01
24*4882a593Smuzhiyun #define ST_LSM6DSR_REG_SHUB_REG_MASK		BIT(6)
25*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FUNC_CFG_MASK		BIT(7)
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_CTRL1_ADDR		0x07
28*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_CTRL2_ADDR		0x08
29*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_WTM_MASK		GENMASK(8, 0)
30*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_WTM8_MASK		BIT(0)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_CTRL3_ADDR		0x09
33*4882a593Smuzhiyun #define ST_LSM6DSR_REG_BDR_XL_MASK		GENMASK(3, 0)
34*4882a593Smuzhiyun #define ST_LSM6DSR_REG_BDR_GY_MASK		GENMASK(7, 4)
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_CTRL4_ADDR		0x0a
37*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_MODE_MASK		GENMASK(2, 0)
38*4882a593Smuzhiyun #define ST_LSM6DSR_REG_ODR_T_BATCH_MASK		GENMASK(5, 4)
39*4882a593Smuzhiyun #define ST_LSM6DSR_REG_DEC_TS_MASK		GENMASK(7, 6)
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun #define ST_LSM6DSR_REG_INT1_CTRL_ADDR		0x0d
42*4882a593Smuzhiyun #define ST_LSM6DSR_REG_INT2_CTRL_ADDR		0x0e
43*4882a593Smuzhiyun #define ST_LSM6DSR_REG_INT_FIFO_TH_MASK		BIT(3)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define ST_LSM6DSR_REG_WHOAMI_ADDR		0x0f
46*4882a593Smuzhiyun #define ST_LSM6DSR_WHOAMI_VAL			0x6b
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define ST_LSM6DSR_CTRL1_XL_ADDR		0x10
49*4882a593Smuzhiyun #define ST_LSM6DSR_CTRL2_G_ADDR			0x11
50*4882a593Smuzhiyun #define ST_LSM6DSR_REG_CTRL3_C_ADDR		0x12
51*4882a593Smuzhiyun #define ST_LSM6DSR_REG_SW_RESET_MASK		BIT(0)
52*4882a593Smuzhiyun #define ST_LSM6DSR_REG_PP_OD_MASK		BIT(4)
53*4882a593Smuzhiyun #define ST_LSM6DSR_REG_H_LACTIVE_MASK		BIT(5)
54*4882a593Smuzhiyun #define ST_LSM6DSR_REG_BDU_MASK			BIT(6)
55*4882a593Smuzhiyun #define ST_LSM6DSR_REG_BOOT_MASK		BIT(7)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun #define ST_LSM6DSR_REG_CTRL4_C_ADDR		0x13
58*4882a593Smuzhiyun #define ST_LSM6DSR_REG_DRDY_MASK		BIT(3)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun #define ST_LSM6DSR_REG_CTRL5_C_ADDR		0x14
61*4882a593Smuzhiyun #define ST_LSM6DSR_REG_ROUNDING_MASK		GENMASK(6, 5)
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun #define ST_LSM6DSR_REG_CTRL9_XL_ADDR		0x18
64*4882a593Smuzhiyun #define ST_LSM6DSR_REG_I3C_DISABLE_MASK		BIT(1)
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define ST_LSM6DSR_REG_CTRL10_C_ADDR		0x19
67*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TIMESTAMP_EN_MASK	BIT(5)
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUT_TEMP_L_ADDR		0x20
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUTX_L_G_ADDR		0x22
72*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUTY_L_G_ADDR		0x24
73*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUTZ_L_G_ADDR		0x26
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUTX_L_A_ADDR		0x28
76*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUTY_L_A_ADDR		0x2a
77*4882a593Smuzhiyun #define ST_LSM6DSR_REG_OUTZ_L_A_ADDR		0x2c
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_STATUS1_ADDR	0x3a
80*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_STATUS_DIFF		GENMASK(9, 0)
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TIMESTAMP0_ADDR		0x40
83*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TIMESTAMP2_ADDR		0x42
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TAP_CFG0_ADDR		0x56
86*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TAP_X_EN_MASK		BIT(3)
87*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TAP_Y_EN_MASK		BIT(2)
88*4882a593Smuzhiyun #define ST_LSM6DSR_REG_TAP_Z_EN_MASK		BIT(1)
89*4882a593Smuzhiyun #define ST_LSM6DSR_REG_LIR_MASK			BIT(0)
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define ST_LSM6DSR_REG_MD1_CFG_ADDR		0x5e
92*4882a593Smuzhiyun #define ST_LSM6DSR_REG_MD2_CFG_ADDR		0x5f
93*4882a593Smuzhiyun #define ST_LSM6DSR_REG_INT2_TIMESTAMP_MASK	BIT(0)
94*4882a593Smuzhiyun #define ST_LSM6DSR_REG_INT_EMB_FUNC_MASK	BIT(1)
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define ST_LSM6DSR_INTERNAL_FREQ_FINE		0x63
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define ST_LSM6DSR_REG_FIFO_DATA_OUT_TAG_ADDR	0x78
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun /* embedded registers */
101*4882a593Smuzhiyun #define ST_LSM6DSR_REG_EMB_FUNC_INT1_ADDR	0x0a
102*4882a593Smuzhiyun #define ST_LSM6DSR_REG_EMB_FUNC_INT2_ADDR	0x0e
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /* Timestamp Tick 25us/LSB */
105*4882a593Smuzhiyun #define ST_LSM6DSR_TS_DELTA_NS			25000ULL
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun #define ST_LSM6DSR_TEMP_GAIN			256
108*4882a593Smuzhiyun #define ST_LSM6DSR_TEMP_FS_GAIN			(1000000 / ST_LSM6DSR_TEMP_GAIN)
109*4882a593Smuzhiyun #define ST_LSM6DSR_TEMP_OFFSET			6400
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun #define ST_LSM6DSR_SAMPLE_SIZE			6
112*4882a593Smuzhiyun #define ST_LSM6DSR_TS_SAMPLE_SIZE		4
113*4882a593Smuzhiyun #define ST_LSM6DSR_TAG_SIZE			1
114*4882a593Smuzhiyun #define ST_LSM6DSR_FIFO_SAMPLE_SIZE		(ST_LSM6DSR_SAMPLE_SIZE + \
115*4882a593Smuzhiyun 						 ST_LSM6DSR_TAG_SIZE)
116*4882a593Smuzhiyun #define ST_LSM6DSR_MAX_FIFO_DEPTH		416
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define ST_LSM6DSR_DATA_CHANNEL(chan_type, addr, mod, ch2, scan_idx,	\
119*4882a593Smuzhiyun 				rb, sb, sg)				\
120*4882a593Smuzhiyun {									\
121*4882a593Smuzhiyun 	.type = chan_type,						\
122*4882a593Smuzhiyun 	.address = addr,						\
123*4882a593Smuzhiyun 	.modified = mod,						\
124*4882a593Smuzhiyun 	.channel2 = ch2,						\
125*4882a593Smuzhiyun 	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |			\
126*4882a593Smuzhiyun 			      BIT(IIO_CHAN_INFO_SCALE),			\
127*4882a593Smuzhiyun 	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),	\
128*4882a593Smuzhiyun 	.scan_index = scan_idx,						\
129*4882a593Smuzhiyun 	.scan_type = {							\
130*4882a593Smuzhiyun 		.sign = sg,						\
131*4882a593Smuzhiyun 		.realbits = rb,						\
132*4882a593Smuzhiyun 		.storagebits = sb,					\
133*4882a593Smuzhiyun 		.endianness = IIO_LE,					\
134*4882a593Smuzhiyun 	},								\
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun static const struct iio_event_spec st_lsm6dsr_flush_event = {
138*4882a593Smuzhiyun #ifdef CONFIG_NO_GKI
139*4882a593Smuzhiyun 	.type = IIO_EV_TYPE_FIFO_FLUSH,
140*4882a593Smuzhiyun 	.dir = IIO_EV_DIR_EITHER,
141*4882a593Smuzhiyun #endif
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun static const struct iio_event_spec st_lsm6dsr_thr_event = {
145*4882a593Smuzhiyun 	.type = IIO_EV_TYPE_THRESH,
146*4882a593Smuzhiyun 	.dir = IIO_EV_DIR_RISING,
147*4882a593Smuzhiyun 	.mask_separate = BIT(IIO_EV_INFO_ENABLE),
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun #define ST_LSM6DSR_EVENT_CHANNEL(ctype, etype)		\
151*4882a593Smuzhiyun {							\
152*4882a593Smuzhiyun 	.type = ctype,					\
153*4882a593Smuzhiyun 	.modified = 0,					\
154*4882a593Smuzhiyun 	.scan_index = -1,				\
155*4882a593Smuzhiyun 	.indexed = -1,					\
156*4882a593Smuzhiyun 	.event_spec = &st_lsm6dsr_##etype##_event,	\
157*4882a593Smuzhiyun 	.num_event_specs = 1,				\
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun #define ST_LSM6DSR_RX_MAX_LENGTH		64
161*4882a593Smuzhiyun #define ST_LSM6DSR_TX_MAX_LENGTH		16
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun /**
164*4882a593Smuzhiyun  * @struct st_lsm6dsr_transfer_buffer
165*4882a593Smuzhiyun  * @brief Buffer support for data transfer
166*4882a593Smuzhiyun  *
167*4882a593Smuzhiyun  * rx_buf: Data receive buffer.
168*4882a593Smuzhiyun  * tx_buf: Data transmit buffer.
169*4882a593Smuzhiyun  */
170*4882a593Smuzhiyun struct st_lsm6dsr_transfer_buffer {
171*4882a593Smuzhiyun 	u8 rx_buf[ST_LSM6DSR_RX_MAX_LENGTH];
172*4882a593Smuzhiyun 	u8 tx_buf[ST_LSM6DSR_TX_MAX_LENGTH] ____cacheline_aligned;
173*4882a593Smuzhiyun };
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun /**
176*4882a593Smuzhiyun  * @struct st_lsm6dsr_transfer_function
177*4882a593Smuzhiyun  * @brief Bus Transfer Function
178*4882a593Smuzhiyun  *
179*4882a593Smuzhiyun  * read: Bus read function to get register value from sensor.
180*4882a593Smuzhiyun  * write: Bus write function to set register value to sensor.
181*4882a593Smuzhiyun  */
182*4882a593Smuzhiyun struct st_lsm6dsr_transfer_function {
183*4882a593Smuzhiyun 	int (*read)(struct device *dev, u8 addr, int len, u8 *data);
184*4882a593Smuzhiyun 	int (*write)(struct device *dev, u8 addr, int len, const u8 *data);
185*4882a593Smuzhiyun };
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun /**
188*4882a593Smuzhiyun  * @struct st_lsm6dsr_reg
189*4882a593Smuzhiyun  * @brief Generic sensor register description
190*4882a593Smuzhiyun  *
191*4882a593Smuzhiyun  * addr: Register arress value.
192*4882a593Smuzhiyun  * mask: Register bitmask.
193*4882a593Smuzhiyun  */
194*4882a593Smuzhiyun struct st_lsm6dsr_reg {
195*4882a593Smuzhiyun 	u8 addr;
196*4882a593Smuzhiyun 	u8 mask;
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun enum st_lsm6dsr_suspend_resume_register {
200*4882a593Smuzhiyun 	ST_LSM6DSR_CTRL1_XL_REG = 0,
201*4882a593Smuzhiyun 	ST_LSM6DSR_CTRL2_G_REG,
202*4882a593Smuzhiyun 	ST_LSM6DSR_REG_CTRL3_C_REG,
203*4882a593Smuzhiyun 	ST_LSM6DSR_REG_CTRL4_C_REG,
204*4882a593Smuzhiyun 	ST_LSM6DSR_REG_CTRL5_C_REG,
205*4882a593Smuzhiyun 	ST_LSM6DSR_REG_CTRL10_C_REG,
206*4882a593Smuzhiyun 	ST_LSM6DSR_REG_TAP_CFG0_REG,
207*4882a593Smuzhiyun 	ST_LSM6DSR_REG_INT1_CTRL_REG,
208*4882a593Smuzhiyun 	ST_LSM6DSR_REG_INT2_CTRL_REG,
209*4882a593Smuzhiyun 	ST_LSM6DSR_REG_FIFO_CTRL1_REG,
210*4882a593Smuzhiyun 	ST_LSM6DSR_REG_FIFO_CTRL2_REG,
211*4882a593Smuzhiyun 	ST_LSM6DSR_REG_FIFO_CTRL3_REG,
212*4882a593Smuzhiyun 	ST_LSM6DSR_REG_FIFO_CTRL4_REG,
213*4882a593Smuzhiyun 	ST_LSM6DSR_SUSPEND_RESUME_REGS,
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun struct st_lsm6dsr_suspend_resume_entry {
217*4882a593Smuzhiyun 	u8 addr;
218*4882a593Smuzhiyun 	u8 val;
219*4882a593Smuzhiyun 	u8 mask;
220*4882a593Smuzhiyun };
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun /**
223*4882a593Smuzhiyun  * @struct st_lsm6dsr_odr
224*4882a593Smuzhiyun  * @brief ODR sensor table entry
225*4882a593Smuzhiyun  *
226*4882a593Smuzhiyun  * In the ODR table the possible ODR supported by sensor can be defined in the
227*4882a593Smuzhiyun  * following format:
228*4882a593Smuzhiyun  *    .odr_avl[0] = {   0, 0,       0x00 },
229*4882a593Smuzhiyun  *    .odr_avl[1] = {  12, 500000,  0x01 }, ..... it means 12.5 Hz
230*4882a593Smuzhiyun  *    .odr_avl[2] = {  26, 0,       0x02 }, ..... it means 26.0 Hz
231*4882a593Smuzhiyun  *
232*4882a593Smuzhiyun  * hz: Most significant part of ODR value (in Hz).
233*4882a593Smuzhiyun  * uhz: Least significant part of ODR value (in micro Hz).
234*4882a593Smuzhiyun  * val: Register value tu set ODR.
235*4882a593Smuzhiyun  */
236*4882a593Smuzhiyun struct st_lsm6dsr_odr {
237*4882a593Smuzhiyun 	int hz;
238*4882a593Smuzhiyun 	int uhz;
239*4882a593Smuzhiyun 	u8 val;
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun /**
243*4882a593Smuzhiyun  * @struct st_lsm6dsr_odr_table_entry
244*4882a593Smuzhiyun  * @brief ODR sensor table
245*4882a593Smuzhiyun  *
246*4882a593Smuzhiyun  * odr_size: ODR table size.
247*4882a593Smuzhiyun  * reg: Sensor register description for ODR (address and mask).
248*4882a593Smuzhiyun  * odr_avl: All supported ODR values.
249*4882a593Smuzhiyun  */
250*4882a593Smuzhiyun struct st_lsm6dsr_odr_table_entry {
251*4882a593Smuzhiyun 	u8 odr_size;
252*4882a593Smuzhiyun 	struct st_lsm6dsr_reg reg;
253*4882a593Smuzhiyun 	struct st_lsm6dsr_odr odr_avl[ST_LSM6DSR_ODR_LIST_SIZE];
254*4882a593Smuzhiyun };
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /**
257*4882a593Smuzhiyun  * @struct st_lsm6dsr_fs
258*4882a593Smuzhiyun  * @brief Full scale entry
259*4882a593Smuzhiyun  *
260*4882a593Smuzhiyun  * reg: Sensor register description for FS (address and mask).
261*4882a593Smuzhiyun  * gain: The gain to obtain data value from raw data (LSB).
262*4882a593Smuzhiyun  * val: Register value.
263*4882a593Smuzhiyun  */
264*4882a593Smuzhiyun struct st_lsm6dsr_fs {
265*4882a593Smuzhiyun 	struct st_lsm6dsr_reg reg;
266*4882a593Smuzhiyun 	u32 gain;
267*4882a593Smuzhiyun 	u8 val;
268*4882a593Smuzhiyun };
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun /**
271*4882a593Smuzhiyun  * @struct st_lsm6dsr_fs_table_entry
272*4882a593Smuzhiyun  * @brief Full scale table
273*4882a593Smuzhiyun  *
274*4882a593Smuzhiyun  * size: Full scale number of entry.
275*4882a593Smuzhiyun  * fs_avl: Full scale entry.
276*4882a593Smuzhiyun  */
277*4882a593Smuzhiyun #define ST_LSM6DSR_FS_LIST_SIZE			5
278*4882a593Smuzhiyun #define ST_LSM6DSR_FS_ACC_LIST_SIZE		4
279*4882a593Smuzhiyun #define ST_LSM6DSR_FS_GYRO_LIST_SIZE		5
280*4882a593Smuzhiyun #define ST_LSM6DSR_FS_TEMP_LIST_SIZE		1
281*4882a593Smuzhiyun struct st_lsm6dsr_fs_table_entry {
282*4882a593Smuzhiyun 	u8 size;
283*4882a593Smuzhiyun 	struct st_lsm6dsr_fs fs_avl[ST_LSM6DSR_FS_LIST_SIZE];
284*4882a593Smuzhiyun };
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun #define ST_LSM6DSR_ACC_FS_2G_GAIN	IIO_G_TO_M_S_2(61)//
287*4882a593Smuzhiyun #define ST_LSM6DSR_ACC_FS_4G_GAIN	IIO_G_TO_M_S_2(61)//(122)
288*4882a593Smuzhiyun #define ST_LSM6DSR_ACC_FS_8G_GAIN	IIO_G_TO_M_S_2(61)//(244)
289*4882a593Smuzhiyun #define ST_LSM6DSR_ACC_FS_16G_GAIN	IIO_G_TO_M_S_2(61)//(488)
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun #define ST_LSM6DSR_GYRO_FS_250_GAIN	IIO_DEGREE_TO_RAD(8750)//
292*4882a593Smuzhiyun #define ST_LSM6DSR_GYRO_FS_500_GAIN	IIO_DEGREE_TO_RAD(8750)//(17500)
293*4882a593Smuzhiyun #define ST_LSM6DSR_GYRO_FS_1000_GAIN	IIO_DEGREE_TO_RAD(8750)//(35000)
294*4882a593Smuzhiyun #define ST_LSM6DSR_GYRO_FS_2000_GAIN	IIO_DEGREE_TO_RAD(8750)//(70000)
295*4882a593Smuzhiyun #define ST_LSM6DSR_GYRO_FS_4000_GAIN	IIO_DEGREE_TO_RAD(8750)//(140000)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun struct st_lsm6dsr_ext_dev_info {
298*4882a593Smuzhiyun 	const struct st_lsm6dsr_ext_dev_settings *ext_dev_settings;
299*4882a593Smuzhiyun 	u8 ext_dev_i2c_addr;
300*4882a593Smuzhiyun };
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun /**
303*4882a593Smuzhiyun  * @enum st_lsm6dsr_sensor_id
304*4882a593Smuzhiyun  * @brief Sensor Identifier
305*4882a593Smuzhiyun  */
306*4882a593Smuzhiyun enum st_lsm6dsr_sensor_id {
307*4882a593Smuzhiyun 	ST_LSM6DSR_ID_GYRO,
308*4882a593Smuzhiyun 	ST_LSM6DSR_ID_ACC,
309*4882a593Smuzhiyun 	ST_LSM6DSR_ID_TEMP,
310*4882a593Smuzhiyun 	ST_LSM6DSR_ID_EXT0,
311*4882a593Smuzhiyun 	ST_LSM6DSR_ID_EXT1,
312*4882a593Smuzhiyun 	ST_LSM6DSR_ID_STEP_COUNTER,
313*4882a593Smuzhiyun 	ST_LSM6DSR_ID_STEP_DETECTOR,
314*4882a593Smuzhiyun 	ST_LSM6DSR_ID_SIGN_MOTION,
315*4882a593Smuzhiyun 	ST_LSM6DSR_ID_GLANCE,
316*4882a593Smuzhiyun 	ST_LSM6DSR_ID_MOTION,
317*4882a593Smuzhiyun 	ST_LSM6DSR_ID_NO_MOTION,
318*4882a593Smuzhiyun 	ST_LSM6DSR_ID_WAKEUP,
319*4882a593Smuzhiyun 	ST_LSM6DSR_ID_PICKUP,
320*4882a593Smuzhiyun 	ST_LSM6DSR_ID_ORIENTATION,
321*4882a593Smuzhiyun 	ST_LSM6DSR_ID_WRIST_TILT,
322*4882a593Smuzhiyun 	ST_LSM6DSR_ID_TILT,
323*4882a593Smuzhiyun 	ST_LSM6DSR_ID_MAX,
324*4882a593Smuzhiyun };
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun /**
327*4882a593Smuzhiyun  * @enum st_lsm6dsr_sensor_id
328*4882a593Smuzhiyun  * @brief Sensor Table Identifier
329*4882a593Smuzhiyun  */
330*4882a593Smuzhiyun static const enum st_lsm6dsr_sensor_id st_lsm6dsr_main_sensor_list[] = {
331*4882a593Smuzhiyun 	 [0] = ST_LSM6DSR_ID_GYRO,
332*4882a593Smuzhiyun 	 [1] = ST_LSM6DSR_ID_ACC,
333*4882a593Smuzhiyun 	 [2] = ST_LSM6DSR_ID_TEMP,
334*4882a593Smuzhiyun 	 [3] = ST_LSM6DSR_ID_STEP_COUNTER,
335*4882a593Smuzhiyun 	 [4] = ST_LSM6DSR_ID_STEP_DETECTOR,
336*4882a593Smuzhiyun 	 [5] = ST_LSM6DSR_ID_SIGN_MOTION,
337*4882a593Smuzhiyun 	 [6] = ST_LSM6DSR_ID_GLANCE,
338*4882a593Smuzhiyun 	 [7] = ST_LSM6DSR_ID_MOTION,
339*4882a593Smuzhiyun 	 [8] = ST_LSM6DSR_ID_NO_MOTION,
340*4882a593Smuzhiyun 	 [9] = ST_LSM6DSR_ID_WAKEUP,
341*4882a593Smuzhiyun 	[10] = ST_LSM6DSR_ID_PICKUP,
342*4882a593Smuzhiyun 	[11] = ST_LSM6DSR_ID_ORIENTATION,
343*4882a593Smuzhiyun 	[12] = ST_LSM6DSR_ID_WRIST_TILT,
344*4882a593Smuzhiyun 	[13] = ST_LSM6DSR_ID_TILT,
345*4882a593Smuzhiyun };
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun /**
348*4882a593Smuzhiyun  * @enum st_lsm6dsr_fifo_mode
349*4882a593Smuzhiyun  * @brief FIFO Modes
350*4882a593Smuzhiyun  */
351*4882a593Smuzhiyun enum st_lsm6dsr_fifo_mode {
352*4882a593Smuzhiyun 	ST_LSM6DSR_FIFO_BYPASS = 0x0,
353*4882a593Smuzhiyun 	ST_LSM6DSR_FIFO_CONT = 0x6,
354*4882a593Smuzhiyun };
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun /**
357*4882a593Smuzhiyun  * @enum st_lsm6dsr_fifo_mode - FIFO Buffer Status
358*4882a593Smuzhiyun  */
359*4882a593Smuzhiyun enum st_lsm6dsr_fifo_status {
360*4882a593Smuzhiyun 	ST_LSM6DSR_HW_FLUSH,
361*4882a593Smuzhiyun 	ST_LSM6DSR_HW_OPERATIONAL,
362*4882a593Smuzhiyun };
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun /**
365*4882a593Smuzhiyun  * @struct st_lsm6dsr_sensor
366*4882a593Smuzhiyun  * @brief ST IMU sensor instance
367*4882a593Smuzhiyun  *
368*4882a593Smuzhiyun  * id: Sensor identifier
369*4882a593Smuzhiyun  * hw: Pointer to instance of struct st_lsm6dsr_hw
370*4882a593Smuzhiyun  * ext_dev_info: Sensor hub i2c slave settings.
371*4882a593Smuzhiyun  * trig: Sensor iio trigger.
372*4882a593Smuzhiyun  * gain: Configured sensor sensitivity
373*4882a593Smuzhiyun  * odr: Output data rate of the sensor [Hz]
374*4882a593Smuzhiyun  * uodr: Output data rate of the sensor [uHz]
375*4882a593Smuzhiyun  * offset: Sensor data offset
376*4882a593Smuzhiyun  * decimator: Sensor decimator
377*4882a593Smuzhiyun  * dec_counter: Sensor decimator counter
378*4882a593Smuzhiyun  * old_data: Saved sensor data
379*4882a593Smuzhiyun  * max_watermark: Max supported watermark level
380*4882a593Smuzhiyun  * watermark: Sensor watermark level
381*4882a593Smuzhiyun  * batch_reg: Sensor reg/mask for FIFO batching register
382*4882a593Smuzhiyun  * last_fifo_timestamp: Store last sample timestamp in FIFO, used by flush
383*4882a593Smuzhiyun  */
384*4882a593Smuzhiyun struct st_lsm6dsr_sensor {
385*4882a593Smuzhiyun 	enum st_lsm6dsr_sensor_id id;
386*4882a593Smuzhiyun 	struct st_lsm6dsr_hw *hw;
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun 	struct st_lsm6dsr_ext_dev_info ext_dev_info;
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun 	struct iio_trigger *trig;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	u32 gain;
393*4882a593Smuzhiyun 	int odr;
394*4882a593Smuzhiyun 	int uodr;
395*4882a593Smuzhiyun 
396*4882a593Smuzhiyun 	u32 offset;
397*4882a593Smuzhiyun 	u8 decimator;
398*4882a593Smuzhiyun 	u8 dec_counter;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	u16 max_watermark;
401*4882a593Smuzhiyun 	u16 watermark;
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	struct st_lsm6dsr_reg batch_reg;
404*4882a593Smuzhiyun 	s64 last_fifo_timestamp;
405*4882a593Smuzhiyun };
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun /**
408*4882a593Smuzhiyun  * @struct st_lsm6dsr_hw
409*4882a593Smuzhiyun  * @brief ST IMU MEMS hw instance
410*4882a593Smuzhiyun  *
411*4882a593Smuzhiyun  * dev: Pointer to instance of struct device (I2C or SPI).
412*4882a593Smuzhiyun  * irq: Device interrupt line (I2C or SPI).
413*4882a593Smuzhiyun  * lock: Mutex to protect read and write operations.
414*4882a593Smuzhiyun  * fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
415*4882a593Smuzhiyun  * page_lock: Mutex to prevent concurrent memory page configuration.
416*4882a593Smuzhiyun  * fifo_mode: FIFO operating mode supported by the device.
417*4882a593Smuzhiyun  * state: hw operational state.
418*4882a593Smuzhiyun  * enable_mask: Enabled sensor bitmask.
419*4882a593Smuzhiyun  * fsm_enable_mask: FSM Enabled sensor bitmask.
420*4882a593Smuzhiyun  * embfunc_pg0_irq_reg: Embedded function irq configuration register (page 0).
421*4882a593Smuzhiyun  * embfunc_irq_reg: Embedded function irq configuration register (other).
422*4882a593Smuzhiyun  * ext_data_len: Number of i2c slave devices connected to I2C master.
423*4882a593Smuzhiyun  * odr: Timestamp sample ODR [Hz]
424*4882a593Smuzhiyun  * uodr: Timestamp sample ODR [uHz]
425*4882a593Smuzhiyun  * ts_offset: Hw timestamp offset.
426*4882a593Smuzhiyun  * hw_ts: Latest hw timestamp from the sensor.
427*4882a593Smuzhiyun  * hw_ts_high: Manage timestamp rollover
428*4882a593Smuzhiyun  * tsample:
429*4882a593Smuzhiyun  * hw_ts_old:
430*4882a593Smuzhiyun  * delta_ts: Delta time between two consecutive interrupts.
431*4882a593Smuzhiyun  * delta_hw_ts:
432*4882a593Smuzhiyun  * ts: Latest timestamp from irq handler.
433*4882a593Smuzhiyun  * iio_devs: Pointers to acc/gyro iio_dev instances.
434*4882a593Smuzhiyun  * tf: Transfer function structure used by I/O operations.
435*4882a593Smuzhiyun  * tb: Transfer buffers used by SPI I/O operations.
436*4882a593Smuzhiyun  */
437*4882a593Smuzhiyun struct st_lsm6dsr_hw {
438*4882a593Smuzhiyun 	struct device *dev;
439*4882a593Smuzhiyun 	int irq;
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun 	struct mutex lock;
442*4882a593Smuzhiyun 	struct mutex fifo_lock;
443*4882a593Smuzhiyun 	struct mutex page_lock;
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun 	enum st_lsm6dsr_fifo_mode fifo_mode;
446*4882a593Smuzhiyun 	unsigned long state;
447*4882a593Smuzhiyun 	u32 enable_mask;
448*4882a593Smuzhiyun 	u32 requested_mask;
449*4882a593Smuzhiyun 	u32 suspend_mask;
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun 	u16 fsm_enable_mask;
452*4882a593Smuzhiyun 	u8 embfunc_irq_reg;
453*4882a593Smuzhiyun 	u8 embfunc_pg0_irq_reg;
454*4882a593Smuzhiyun 
455*4882a593Smuzhiyun 	u8 ext_data_len;
456*4882a593Smuzhiyun 
457*4882a593Smuzhiyun 	int odr;
458*4882a593Smuzhiyun 	int uodr;
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	s64 ts_offset;
461*4882a593Smuzhiyun 	u64 ts_delta_ns;
462*4882a593Smuzhiyun 	s64 hw_ts;
463*4882a593Smuzhiyun 	u32 val_ts_old;
464*4882a593Smuzhiyun 	u32 hw_ts_high;
465*4882a593Smuzhiyun 	s64 tsample;
466*4882a593Smuzhiyun 	s64 delta_ts;
467*4882a593Smuzhiyun 	s64 ts;
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun 	struct iio_dev *iio_devs[ST_LSM6DSR_ID_MAX];
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	const struct st_lsm6dsr_transfer_function *tf;
472*4882a593Smuzhiyun 	struct st_lsm6dsr_transfer_buffer tb;
473*4882a593Smuzhiyun };
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun /**
476*4882a593Smuzhiyun  * @struct dev_pm_ops
477*4882a593Smuzhiyun  * @brief Power management callback function structure
478*4882a593Smuzhiyun  */
479*4882a593Smuzhiyun extern const struct dev_pm_ops st_lsm6dsr_pm_ops;
480*4882a593Smuzhiyun 
st_lsm6dsr_read_atomic(struct st_lsm6dsr_hw * hw,u8 addr,int len,u8 * data)481*4882a593Smuzhiyun static inline int st_lsm6dsr_read_atomic(struct st_lsm6dsr_hw *hw, u8 addr,
482*4882a593Smuzhiyun 					 int len, u8 *data)
483*4882a593Smuzhiyun {
484*4882a593Smuzhiyun 	int err;
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun 	mutex_lock(&hw->page_lock);
487*4882a593Smuzhiyun 	err = hw->tf->read(hw->dev, addr, len, data);
488*4882a593Smuzhiyun 	mutex_unlock(&hw->page_lock);
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun 	return err;
491*4882a593Smuzhiyun }
492*4882a593Smuzhiyun 
st_lsm6dsr_write_atomic(struct st_lsm6dsr_hw * hw,u8 addr,int len,u8 * data)493*4882a593Smuzhiyun static inline int st_lsm6dsr_write_atomic(struct st_lsm6dsr_hw *hw, u8 addr,
494*4882a593Smuzhiyun 					  int len, u8 *data)
495*4882a593Smuzhiyun {
496*4882a593Smuzhiyun 	int err;
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun 	mutex_lock(&hw->page_lock);
499*4882a593Smuzhiyun 	err = hw->tf->write(hw->dev, addr, len, data);
500*4882a593Smuzhiyun 	mutex_unlock(&hw->page_lock);
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun 	return err;
503*4882a593Smuzhiyun }
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun int __st_lsm6dsr_write_with_mask(struct st_lsm6dsr_hw *hw, u8 addr, u8 mask,
506*4882a593Smuzhiyun 				 u8 val);
st_lsm6dsr_write_with_mask(struct st_lsm6dsr_hw * hw,u8 addr,u8 mask,u8 val)507*4882a593Smuzhiyun static inline int st_lsm6dsr_write_with_mask(struct st_lsm6dsr_hw *hw, u8 addr,
508*4882a593Smuzhiyun 					     u8 mask, u8 val)
509*4882a593Smuzhiyun {
510*4882a593Smuzhiyun 	int err;
511*4882a593Smuzhiyun 
512*4882a593Smuzhiyun 	mutex_lock(&hw->page_lock);
513*4882a593Smuzhiyun 	err = __st_lsm6dsr_write_with_mask(hw, addr, mask, val);
514*4882a593Smuzhiyun 	mutex_unlock(&hw->page_lock);
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun 	return err;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun 
st_lsm6dsr_set_page_access(struct st_lsm6dsr_hw * hw,u8 mask,u8 data)519*4882a593Smuzhiyun static inline int st_lsm6dsr_set_page_access(struct st_lsm6dsr_hw *hw,
520*4882a593Smuzhiyun 					     u8 mask, u8 data)
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun 	int err;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	err = __st_lsm6dsr_write_with_mask(hw,
525*4882a593Smuzhiyun 					   ST_LSM6DSR_REG_FUNC_CFG_ACCESS_ADDR,
526*4882a593Smuzhiyun 					   mask, data);
527*4882a593Smuzhiyun 	usleep_range(100, 150);
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	return err;
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun 
st_lsm6dsr_is_fifo_enabled(struct st_lsm6dsr_hw * hw)532*4882a593Smuzhiyun static inline bool st_lsm6dsr_is_fifo_enabled(struct st_lsm6dsr_hw *hw)
533*4882a593Smuzhiyun {
534*4882a593Smuzhiyun 	return hw->enable_mask & (BIT(ST_LSM6DSR_ID_STEP_COUNTER) |
535*4882a593Smuzhiyun 				  BIT(ST_LSM6DSR_ID_GYRO)	  |
536*4882a593Smuzhiyun 				  BIT(ST_LSM6DSR_ID_ACC)	  |
537*4882a593Smuzhiyun 				  BIT(ST_LSM6DSR_ID_EXT0)	  |
538*4882a593Smuzhiyun 				  BIT(ST_LSM6DSR_ID_EXT1));
539*4882a593Smuzhiyun }
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun int st_lsm6dsr_probe(struct device *dev, int irq,
542*4882a593Smuzhiyun 		     const struct st_lsm6dsr_transfer_function *tf_ops);
543*4882a593Smuzhiyun int st_lsm6dsr_remove(struct device *dev);
544*4882a593Smuzhiyun int st_lsm6dsr_shub_set_enable(struct st_lsm6dsr_sensor *sensor, bool enable);
545*4882a593Smuzhiyun int st_lsm6dsr_shub_probe(struct st_lsm6dsr_hw *hw);
546*4882a593Smuzhiyun int st_lsm6dsr_sensor_set_enable(struct st_lsm6dsr_sensor *sensor,
547*4882a593Smuzhiyun 				 bool enable);
548*4882a593Smuzhiyun int st_lsm6dsr_irq_setup(struct st_lsm6dsr_hw *hw);
549*4882a593Smuzhiyun int st_lsm6dsr_buffers_setup(struct st_lsm6dsr_hw *hw);
550*4882a593Smuzhiyun int st_lsm6dsr_deallocate_buffers(struct st_lsm6dsr_hw *hw);
551*4882a593Smuzhiyun int st_lsm6dsr_get_odr_val(enum st_lsm6dsr_sensor_id id, int odr, int uodr,
552*4882a593Smuzhiyun 			   int *podr, int *puodr, u8 *val);
553*4882a593Smuzhiyun int st_lsm6dsr_update_watermark(struct st_lsm6dsr_sensor *sensor,
554*4882a593Smuzhiyun 				u16 watermark);
555*4882a593Smuzhiyun ssize_t st_lsm6dsr_flush_fifo(struct device *dev,
556*4882a593Smuzhiyun 			      struct device_attribute *attr,
557*4882a593Smuzhiyun 			      const char *buf, size_t size);
558*4882a593Smuzhiyun ssize_t st_lsm6dsr_get_max_watermark(struct device *dev,
559*4882a593Smuzhiyun 				     struct device_attribute *attr,
560*4882a593Smuzhiyun 				     char *buf);
561*4882a593Smuzhiyun ssize_t st_lsm6dsr_get_watermark(struct device *dev,
562*4882a593Smuzhiyun 				 struct device_attribute *attr,
563*4882a593Smuzhiyun 				 char *buf);
564*4882a593Smuzhiyun ssize_t st_lsm6dsr_set_watermark(struct device *dev,
565*4882a593Smuzhiyun 				 struct device_attribute *attr,
566*4882a593Smuzhiyun 				 const char *buf, size_t size);
567*4882a593Smuzhiyun int st_lsm6dsr_set_page_access(struct st_lsm6dsr_hw *hw, u8 mask, u8 data);
568*4882a593Smuzhiyun int st_lsm6dsr_suspend_fifo(struct st_lsm6dsr_hw *hw);
569*4882a593Smuzhiyun int st_lsm6dsr_set_fifo_mode(struct st_lsm6dsr_hw *hw,
570*4882a593Smuzhiyun 			     enum st_lsm6dsr_fifo_mode fifo_mode);
571*4882a593Smuzhiyun int __st_lsm6dsr_set_sensor_batching_odr(struct st_lsm6dsr_sensor *sensor,
572*4882a593Smuzhiyun 					 bool enable);
573*4882a593Smuzhiyun int st_lsm6dsr_fsm_init(struct st_lsm6dsr_hw *hw);
574*4882a593Smuzhiyun int st_lsm6dsr_fsm_get_orientation(struct st_lsm6dsr_hw *hw, u8 *data);
575*4882a593Smuzhiyun int st_lsm6dsr_embfunc_sensor_set_enable(struct st_lsm6dsr_sensor *sensor,
576*4882a593Smuzhiyun 					 bool enable);
577*4882a593Smuzhiyun int st_lsm6dsr_step_counter_set_enable(struct st_lsm6dsr_sensor *sensor,
578*4882a593Smuzhiyun 				       bool enable);
579*4882a593Smuzhiyun int st_lsm6dsr_reset_step_counter(struct iio_dev *iio_dev);
580*4882a593Smuzhiyun int st_lsm6dsr_update_batching(struct iio_dev *iio_dev, bool enable);
581*4882a593Smuzhiyun int st_lsm6dsr_reset_hwts(struct st_lsm6dsr_hw *hw);
582*4882a593Smuzhiyun #endif /* ST_LSM6DSR_H */
583