summaryrefslogtreecommitdiff
path: root/drivers/iio/accel/kionix-kx022a.h
blob: 7060438ad88c8282a2cbe0ace41f7118f7f856dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2022 ROHM Semiconductors
 *
 * ROHM/KIONIX KX022A accelerometer driver
 */

#ifndef _KX022A_H_
#define _KX022A_H_

#include <linux/bits.h>
#include <linux/regmap.h>

#define KX022A_REG_WHO		0x0f
#define KX022A_ID		0xc8
#define KX132ACR_LBZ_ID		0xd8

#define KX022A_REG_CNTL2	0x19
#define KX022A_MASK_SRST	BIT(7)
#define KX022A_REG_CNTL		0x18
#define KX022A_MASK_PC1		BIT(7)
#define KX022A_MASK_RES		BIT(6)
#define KX022A_MASK_DRDY	BIT(5)
#define KX022A_MASK_GSEL	GENMASK(4, 3)
#define KX022A_GSEL_SHIFT	3
#define KX022A_GSEL_2		0x0
#define KX022A_GSEL_4		BIT(3)
#define KX022A_GSEL_8		BIT(4)
#define KX022A_GSEL_16		GENMASK(4, 3)

#define KX022A_REG_INS2		0x13
#define KX022A_MASK_INS2_DRDY	BIT(4)
#define KX122_MASK_INS2_WMI	BIT(5)

#define KX022A_REG_XHP_L	0x0
#define KX022A_REG_XOUT_L	0x06
#define KX022A_REG_YOUT_L	0x08
#define KX022A_REG_ZOUT_L	0x0a
#define KX022A_REG_COTR		0x0c
#define KX022A_REG_TSCP		0x10
#define KX022A_REG_INT_REL	0x17

#define KX022A_REG_ODCNTL	0x1b

#define KX022A_REG_BTS_WUF_TH	0x31
#define KX022A_REG_MAN_WAKE	0x2c

#define KX022A_REG_BUF_CNTL1	0x3a
#define KX022A_MASK_WM_TH	GENMASK(6, 0)
#define KX022A_REG_BUF_CNTL2	0x3b
#define KX022A_MASK_BUF_EN	BIT(7)
#define KX022A_MASK_BRES16	BIT(6)
#define KX022A_REG_BUF_STATUS_1	0x3c
#define KX022A_REG_BUF_STATUS_2	0x3d
#define KX022A_REG_BUF_CLEAR	0x3e
#define KX022A_REG_BUF_READ	0x3f
#define KX022A_MASK_ODR		GENMASK(3, 0)
#define KX022A_ODR_SHIFT	3
#define KX022A_FIFO_MAX_WMI_TH	41

#define KX022A_REG_INC1		0x1c
#define KX022A_REG_INC5		0x20
#define KX022A_REG_INC6		0x21
#define KX022A_MASK_IEN		BIT(5)
#define KX022A_MASK_IPOL	BIT(4)
#define KX022A_IPOL_LOW		0
#define KX022A_IPOL_HIGH	KX022A_MASK_IPOL1
#define KX022A_MASK_ITYP	BIT(3)
#define KX022A_ITYP_PULSE	KX022A_MASK_ITYP
#define KX022A_ITYP_LEVEL	0

#define KX022A_REG_INC4		0x1f
#define KX022A_MASK_WMI		BIT(5)

#define KX022A_REG_SELF_TEST	0x60
#define KX022A_MAX_REGISTER	0x60

#define KX132_REG_WHO		0x13
#define KX132_ID		0x3d

#define KX132_FIFO_LENGTH	86

#define KX132_REG_CNTL		0x1b
#define KX132_REG_CNTL2		0x1c
#define KX132_REG_CNTL5		0x1f
#define KX132_MASK_RES		BIT(6)
#define KX132_GSEL_2		0x0
#define KX132_GSEL_4		BIT(3)
#define KX132_GSEL_8		BIT(4)
#define KX132_GSEL_16		GENMASK(4, 3)

#define KX132_REG_INS2		0x17
#define KX132_MASK_INS2_WMI	BIT(5)

#define KX132_REG_XADP_L	0x02
#define KX132_REG_XOUT_L	0x08
#define KX132_REG_YOUT_L	0x0a
#define KX132_REG_ZOUT_L	0x0c
#define KX132_REG_COTR		0x12
#define KX132_REG_TSCP		0x14
#define KX132_REG_INT_REL	0x1a

#define KX132_REG_ODCNTL	0x21

#define KX132_REG_BTS_WUF_TH	0x4a

#define KX132_REG_BUF_CNTL1	0x5e
#define KX132_REG_BUF_CNTL2	0x5f
#define KX132_REG_BUF_STATUS_1	0x60
#define KX132_REG_BUF_STATUS_2	0x61
#define KX132_MASK_BUF_SMP_LVL	GENMASK(9, 0)
#define KX132_REG_BUF_CLEAR	0x62
#define KX132_REG_BUF_READ	0x63
#define KX132_ODR_SHIFT		3
#define KX132_FIFO_MAX_WMI_TH	86

#define KX132_REG_INC1		0x22
#define KX132_REG_INC5		0x26
#define KX132_REG_INC6		0x27
#define KX132_IPOL_LOW		0
#define KX132_IPOL_HIGH		KX022A_MASK_IPOL
#define KX132_ITYP_PULSE	KX022A_MASK_ITYP

#define KX132_REG_INC4		0x25

#define KX132_REG_SELF_TEST	0x5d
#define KX132_MAX_REGISTER	0x76

struct device;

struct kx022a_data;

/**
 * struct kx022a_chip_info - Kionix accelerometer chip specific information
 *
 * @name:			name of the device
 * @regmap_config:		pointer to register map configuration
 * @channels:			pointer to iio_chan_spec array
 * @num_channels:		number of iio_chan_spec channels
 * @fifo_length:		number of 16-bit samples in a full buffer
 * @buf_smp_lvl_mask:		buffer sample level mask
 * @who:			WHO_AM_I register
 * @id:				WHO_AM_I register value
 * @cntl:			control register 1
 * @cntl2:			control register 2
 * @odcntl:			output data control register
 * @buf_cntl1:			buffer control register 1
 * @buf_cntl2:			buffer control register 2
 * @buf_clear:			buffer clear register
 * @buf_status1:		buffer status register 1
 * @buf_read:			buffer read register
 * @inc1:			interrupt control register 1
 * @inc4:			interrupt control register 4
 * @inc5:			interrupt control register 5
 * @inc6:			interrupt control register 6
 * @xout_l:			x-axis output least significant byte
 * @get_fifo_bytes_available:	function pointer to get amount of acceleration
 *				data bytes currently stored in the sensor's FIFO
 *				buffer
 */
struct kx022a_chip_info {
	const char *name;
	const struct regmap_config *regmap_config;
	const struct iio_chan_spec *channels;
	unsigned int num_channels;
	unsigned int fifo_length;
	u16 buf_smp_lvl_mask;
	u8 who;
	u8 id;
	u8 cntl;
	u8 cntl2;
	u8 odcntl;
	u8 buf_cntl1;
	u8 buf_cntl2;
	u8 buf_clear;
	u8 buf_status1;
	u8 buf_read;
	u8 inc1;
	u8 inc4;
	u8 inc5;
	u8 inc6;
	u8 xout_l;
	int (*get_fifo_bytes_available)(struct kx022a_data *);
};

int kx022a_probe_internal(struct device *dev, const struct kx022a_chip_info *chip_info);

extern const struct kx022a_chip_info kx022a_chip_info;
extern const struct kx022a_chip_info kx132_chip_info;
extern const struct kx022a_chip_info kx132acr_chip_info;

#endif