xref: /OK3568_Linux_fs/kernel/drivers/input/sensors/accel/bma2xx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * drivers/input/sensors/accel/bma2xx.c
3  *
4  * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
5  *
6  * Author: Bin Yang <yangbin@rock - chips.com>
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  */
17 
18 #include <linux/module.h>
19 #include <linux/init.h>
20 #include <linux/i2c.h>
21 #include <linux/input.h>
22 #include <linux/workqueue.h>
23 #include <linux/mutex.h>
24 #include <linux/slab.h>
25 #include <linux/mutex.h>
26 #include <linux/interrupt.h>
27 #include <linux/delay.h>
28 #include <linux/fs.h>
29 #include <linux/uaccess.h>
30 #ifdef CONFIG_HAS_EARLYSUSPEND
31 #include <linux/earlysuspend.h>
32 #endif
33 #include <linux/sensor-dev.h>
34 
35 #define BMA2X2_RANGE_SET		3  /* +/ -  2G */
36 #define BMA2X2_BW_SET			12 /* 125HZ  */
37 
38 #define LOW_G_INTERRUPT				REL_Z
39 #define HIGH_G_INTERRUPT			REL_HWHEEL
40 #define SLOP_INTERRUPT				REL_DIAL
41 #define DOUBLE_TAP_INTERRUPT			REL_WHEEL
42 #define SINGLE_TAP_INTERRUPT			REL_MISC
43 #define ORIENT_INTERRUPT			ABS_PRESSURE
44 #define FLAT_INTERRUPT				ABS_DISTANCE
45 #define SLOW_NO_MOTION_INTERRUPT		REL_Y
46 
47 #define HIGH_G_INTERRUPT_X_HAPPENED			1
48 #define HIGH_G_INTERRUPT_Y_HAPPENED			2
49 #define HIGH_G_INTERRUPT_Z_HAPPENED			3
50 #define HIGH_G_INTERRUPT_X_NEGATIVE_HAPPENED		4
51 #define HIGH_G_INTERRUPT_Y_NEGATIVE_HAPPENED		5
52 #define HIGH_G_INTERRUPT_Z_NEGATIVE_HAPPENED		6
53 #define SLOPE_INTERRUPT_X_HAPPENED			7
54 #define SLOPE_INTERRUPT_Y_HAPPENED			8
55 #define SLOPE_INTERRUPT_Z_HAPPENED			9
56 #define SLOPE_INTERRUPT_X_NEGATIVE_HAPPENED		10
57 #define SLOPE_INTERRUPT_Y_NEGATIVE_HAPPENED		11
58 #define SLOPE_INTERRUPT_Z_NEGATIVE_HAPPENED		12
59 #define DOUBLE_TAP_INTERRUPT_HAPPENED			13
60 #define SINGLE_TAP_INTERRUPT_HAPPENED			14
61 #define UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED		15
62 #define UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED		16
63 #define UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED	17
64 #define UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED	18
65 #define DOWNWARD_PORTRAIT_UP_INTERRUPT_HAPPENED	19
66 #define DOWNWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED	20
67 #define DOWNWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED	21
68 #define DOWNWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED	22
69 #define FLAT_INTERRUPT_TRUE_HAPPENED			23
70 #define FLAT_INTERRUPT_FALSE_HAPPENED			24
71 #define LOW_G_INTERRUPT_HAPPENED			25
72 #define SLOW_NO_MOTION_INTERRUPT_HAPPENED		26
73 
74 #define PAD_LOWG					0
75 #define PAD_HIGHG					1
76 #define PAD_SLOP					2
77 #define PAD_DOUBLE_TAP					3
78 #define PAD_SINGLE_TAP					4
79 #define PAD_ORIENT					5
80 #define PAD_FLAT					6
81 #define PAD_SLOW_NO_MOTION				7
82 
83 #define BMA2X2_CHIP_ID_REG                      0x00
84 #define BMA2X2_VERSION_REG                      0x01
85 #define BMA2X2_X_AXIS_LSB_REG                   0x02
86 #define BMA2X2_X_AXIS_MSB_REG                   0x03
87 #define BMA2X2_Y_AXIS_LSB_REG                   0x04
88 #define BMA2X2_Y_AXIS_MSB_REG                   0x05
89 #define BMA2X2_Z_AXIS_LSB_REG                   0x06
90 #define BMA2X2_Z_AXIS_MSB_REG                   0x07
91 #define BMA2X2_TEMPERATURE_REG                  0x08
92 #define BMA2X2_STATUS1_REG                      0x09
93 #define BMA2X2_STATUS2_REG                      0x0A
94 #define BMA2X2_STATUS_TAP_SLOPE_REG             0x0B
95 #define BMA2X2_STATUS_ORIENT_HIGH_REG           0x0C
96 #define BMA2X2_STATUS_FIFO_REG                  0x0E
97 #define BMA2X2_RANGE_SEL_REG                    0x0F
98 #define BMA2X2_BW_SEL_REG                       0x10
99 #define BMA2X2_MODE_CTRL_REG                    0x11
100 #define BMA2X2_LOW_NOISE_CTRL_REG               0x12
101 #define BMA2X2_DATA_CTRL_REG                    0x13
102 #define BMA2X2_RESET_REG                        0x14
103 #define BMA2X2_INT_ENABLE1_REG                  0x16
104 #define BMA2X2_INT_ENABLE2_REG                  0x17
105 #define BMA2X2_INT_SLO_NO_MOT_REG               0x18
106 #define BMA2X2_INT1_PAD_SEL_REG                 0x19
107 #define BMA2X2_INT_DATA_SEL_REG                 0x1A
108 #define BMA2X2_INT2_PAD_SEL_REG                 0x1B
109 #define BMA2X2_INT_SRC_REG                      0x1E
110 #define BMA2X2_INT_SET_REG                      0x20
111 #define BMA2X2_INT_CTRL_REG                     0x21
112 #define BMA2X2_LOW_DURN_REG                     0x22
113 #define BMA2X2_LOW_THRES_REG                    0x23
114 #define BMA2X2_LOW_HIGH_HYST_REG                0x24
115 #define BMA2X2_HIGH_DURN_REG                    0x25
116 #define BMA2X2_HIGH_THRES_REG                   0x26
117 #define BMA2X2_SLOPE_DURN_REG                   0x27
118 #define BMA2X2_SLOPE_THRES_REG                  0x28
119 #define BMA2X2_SLO_NO_MOT_THRES_REG             0x29
120 #define BMA2X2_TAP_PARAM_REG                    0x2A
121 #define BMA2X2_TAP_THRES_REG                    0x2B
122 #define BMA2X2_ORIENT_PARAM_REG                 0x2C
123 #define BMA2X2_THETA_BLOCK_REG                  0x2D
124 #define BMA2X2_THETA_FLAT_REG                   0x2E
125 #define BMA2X2_FLAT_HOLD_TIME_REG               0x2F
126 #define BMA2X2_FIFO_WML_TRIG                    0x30
127 #define BMA2X2_SELF_TEST_REG                    0x32
128 #define BMA2X2_EEPROM_CTRL_REG                  0x33
129 #define BMA2X2_SERIAL_CTRL_REG                  0x34
130 #define BMA2X2_EXTMODE_CTRL_REG                 0x35
131 #define BMA2X2_OFFSET_CTRL_REG                  0x36
132 #define BMA2X2_OFFSET_PARAMS_REG                0x37
133 #define BMA2X2_OFFSET_X_AXIS_REG                0x38
134 #define BMA2X2_OFFSET_Y_AXIS_REG                0x39
135 #define BMA2X2_OFFSET_Z_AXIS_REG                0x3A
136 #define BMA2X2_GP0_REG                          0x3B
137 #define BMA2X2_GP1_REG                          0x3C
138 #define BMA2X2_FIFO_MODE_REG                    0x3E
139 #define BMA2X2_FIFO_DATA_OUTPUT_REG             0x3F
140 
141 #define BMA2X2_CHIP_ID__POS             0
142 #define BMA2X2_CHIP_ID__MSK             0xFF
143 #define BMA2X2_CHIP_ID__LEN             8
144 #define BMA2X2_CHIP_ID__REG             BMA2X2_CHIP_ID_REG
145 
146 #define BMA2X2_VERSION__POS          0
147 #define BMA2X2_VERSION__LEN          8
148 #define BMA2X2_VERSION__MSK          0xFF
149 #define BMA2X2_VERSION__REG          BMA2X2_VERSION_REG
150 
151 #define BMA2x2_SLO_NO_MOT_DUR__POS	2
152 #define BMA2x2_SLO_NO_MOT_DUR__LEN	6
153 #define BMA2x2_SLO_NO_MOT_DUR__MSK	0xFC
154 #define BMA2x2_SLO_NO_MOT_DUR__REG	BMA2X2_SLOPE_DURN_REG
155 
156 #define BMA2X2_NEW_DATA_X__POS          0
157 #define BMA2X2_NEW_DATA_X__LEN          1
158 #define BMA2X2_NEW_DATA_X__MSK          0x01
159 #define BMA2X2_NEW_DATA_X__REG          BMA2X2_X_AXIS_LSB_REG
160 
161 #define BMA2X2_ACC_X14_LSB__POS           2
162 #define BMA2X2_ACC_X14_LSB__LEN           6
163 #define BMA2X2_ACC_X14_LSB__MSK           0xFC
164 #define BMA2X2_ACC_X14_LSB__REG           BMA2X2_X_AXIS_LSB_REG
165 
166 #define BMA2X2_ACC_X12_LSB__POS           4
167 #define BMA2X2_ACC_X12_LSB__LEN           4
168 #define BMA2X2_ACC_X12_LSB__MSK           0xF0
169 #define BMA2X2_ACC_X12_LSB__REG           BMA2X2_X_AXIS_LSB_REG
170 
171 #define BMA2X2_ACC_X10_LSB__POS           6
172 #define BMA2X2_ACC_X10_LSB__LEN           2
173 #define BMA2X2_ACC_X10_LSB__MSK           0xC0
174 #define BMA2X2_ACC_X10_LSB__REG           BMA2X2_X_AXIS_LSB_REG
175 
176 #define BMA2X2_ACC_X8_LSB__POS           0
177 #define BMA2X2_ACC_X8_LSB__LEN           0
178 #define BMA2X2_ACC_X8_LSB__MSK           0x00
179 #define BMA2X2_ACC_X8_LSB__REG           BMA2X2_X_AXIS_LSB_REG
180 
181 #define BMA2X2_ACC_X_MSB__POS           0
182 #define BMA2X2_ACC_X_MSB__LEN           8
183 #define BMA2X2_ACC_X_MSB__MSK           0xFF
184 #define BMA2X2_ACC_X_MSB__REG           BMA2X2_X_AXIS_MSB_REG
185 
186 #define BMA2X2_NEW_DATA_Y__POS          0
187 #define BMA2X2_NEW_DATA_Y__LEN          1
188 #define BMA2X2_NEW_DATA_Y__MSK          0x01
189 #define BMA2X2_NEW_DATA_Y__REG          BMA2X2_Y_AXIS_LSB_REG
190 
191 #define BMA2X2_ACC_Y14_LSB__POS           2
192 #define BMA2X2_ACC_Y14_LSB__LEN           6
193 #define BMA2X2_ACC_Y14_LSB__MSK           0xFC
194 #define BMA2X2_ACC_Y14_LSB__REG           BMA2X2_Y_AXIS_LSB_REG
195 
196 #define BMA2X2_ACC_Y12_LSB__POS           4
197 #define BMA2X2_ACC_Y12_LSB__LEN           4
198 #define BMA2X2_ACC_Y12_LSB__MSK           0xF0
199 #define BMA2X2_ACC_Y12_LSB__REG           BMA2X2_Y_AXIS_LSB_REG
200 
201 #define BMA2X2_ACC_Y10_LSB__POS           6
202 #define BMA2X2_ACC_Y10_LSB__LEN           2
203 #define BMA2X2_ACC_Y10_LSB__MSK           0xC0
204 #define BMA2X2_ACC_Y10_LSB__REG           BMA2X2_Y_AXIS_LSB_REG
205 
206 #define BMA2X2_ACC_Y8_LSB__POS           0
207 #define BMA2X2_ACC_Y8_LSB__LEN           0
208 #define BMA2X2_ACC_Y8_LSB__MSK           0x00
209 #define BMA2X2_ACC_Y8_LSB__REG           BMA2X2_Y_AXIS_LSB_REG
210 
211 #define BMA2X2_ACC_Y_MSB__POS           0
212 #define BMA2X2_ACC_Y_MSB__LEN           8
213 #define BMA2X2_ACC_Y_MSB__MSK           0xFF
214 #define BMA2X2_ACC_Y_MSB__REG           BMA2X2_Y_AXIS_MSB_REG
215 
216 #define BMA2X2_NEW_DATA_Z__POS          0
217 #define BMA2X2_NEW_DATA_Z__LEN          1
218 #define BMA2X2_NEW_DATA_Z__MSK          0x01
219 #define BMA2X2_NEW_DATA_Z__REG          BMA2X2_Z_AXIS_LSB_REG
220 
221 #define BMA2X2_ACC_Z14_LSB__POS           2
222 #define BMA2X2_ACC_Z14_LSB__LEN           6
223 #define BMA2X2_ACC_Z14_LSB__MSK           0xFC
224 #define BMA2X2_ACC_Z14_LSB__REG           BMA2X2_Z_AXIS_LSB_REG
225 
226 #define BMA2X2_ACC_Z12_LSB__POS           4
227 #define BMA2X2_ACC_Z12_LSB__LEN           4
228 #define BMA2X2_ACC_Z12_LSB__MSK           0xF0
229 #define BMA2X2_ACC_Z12_LSB__REG           BMA2X2_Z_AXIS_LSB_REG
230 
231 #define BMA2X2_ACC_Z10_LSB__POS           6
232 #define BMA2X2_ACC_Z10_LSB__LEN           2
233 #define BMA2X2_ACC_Z10_LSB__MSK           0xC0
234 #define BMA2X2_ACC_Z10_LSB__REG           BMA2X2_Z_AXIS_LSB_REG
235 
236 #define BMA2X2_ACC_Z8_LSB__POS           0
237 #define BMA2X2_ACC_Z8_LSB__LEN           0
238 #define BMA2X2_ACC_Z8_LSB__MSK           0x00
239 #define BMA2X2_ACC_Z8_LSB__REG           BMA2X2_Z_AXIS_LSB_REG
240 
241 #define BMA2X2_ACC_Z_MSB__POS           0
242 #define BMA2X2_ACC_Z_MSB__LEN           8
243 #define BMA2X2_ACC_Z_MSB__MSK           0xFF
244 #define BMA2X2_ACC_Z_MSB__REG           BMA2X2_Z_AXIS_MSB_REG
245 
246 #define BMA2X2_TEMPERATURE__POS         0
247 #define BMA2X2_TEMPERATURE__LEN         8
248 #define BMA2X2_TEMPERATURE__MSK         0xFF
249 #define BMA2X2_TEMPERATURE__REG         BMA2X2_TEMP_RD_REG
250 
251 #define BMA2X2_LOWG_INT_S__POS          0
252 #define BMA2X2_LOWG_INT_S__LEN          1
253 #define BMA2X2_LOWG_INT_S__MSK          0x01
254 #define BMA2X2_LOWG_INT_S__REG          BMA2X2_STATUS1_REG
255 
256 #define BMA2X2_HIGHG_INT_S__POS          1
257 #define BMA2X2_HIGHG_INT_S__LEN          1
258 #define BMA2X2_HIGHG_INT_S__MSK          0x02
259 #define BMA2X2_HIGHG_INT_S__REG          BMA2X2_STATUS1_REG
260 
261 #define BMA2X2_SLOPE_INT_S__POS          2
262 #define BMA2X2_SLOPE_INT_S__LEN          1
263 #define BMA2X2_SLOPE_INT_S__MSK          0x04
264 #define BMA2X2_SLOPE_INT_S__REG          BMA2X2_STATUS1_REG
265 
266 #define BMA2X2_SLO_NO_MOT_INT_S__POS          3
267 #define BMA2X2_SLO_NO_MOT_INT_S__LEN          1
268 #define BMA2X2_SLO_NO_MOT_INT_S__MSK          0x08
269 #define BMA2X2_SLO_NO_MOT_INT_S__REG          BMA2X2_STATUS1_REG
270 
271 #define BMA2X2_DOUBLE_TAP_INT_S__POS     4
272 #define BMA2X2_DOUBLE_TAP_INT_S__LEN     1
273 #define BMA2X2_DOUBLE_TAP_INT_S__MSK     0x10
274 #define BMA2X2_DOUBLE_TAP_INT_S__REG     BMA2X2_STATUS1_REG
275 
276 #define BMA2X2_SINGLE_TAP_INT_S__POS     5
277 #define BMA2X2_SINGLE_TAP_INT_S__LEN     1
278 #define BMA2X2_SINGLE_TAP_INT_S__MSK     0x20
279 #define BMA2X2_SINGLE_TAP_INT_S__REG     BMA2X2_STATUS1_REG
280 
281 #define BMA2X2_ORIENT_INT_S__POS         6
282 #define BMA2X2_ORIENT_INT_S__LEN         1
283 #define BMA2X2_ORIENT_INT_S__MSK         0x40
284 #define BMA2X2_ORIENT_INT_S__REG         BMA2X2_STATUS1_REG
285 
286 #define BMA2X2_FLAT_INT_S__POS           7
287 #define BMA2X2_FLAT_INT_S__LEN           1
288 #define BMA2X2_FLAT_INT_S__MSK           0x80
289 #define BMA2X2_FLAT_INT_S__REG           BMA2X2_STATUS1_REG
290 
291 #define BMA2X2_FIFO_FULL_INT_S__POS           5
292 #define BMA2X2_FIFO_FULL_INT_S__LEN           1
293 #define BMA2X2_FIFO_FULL_INT_S__MSK           0x20
294 #define BMA2X2_FIFO_FULL_INT_S__REG           BMA2X2_STATUS2_REG
295 
296 #define BMA2X2_FIFO_WM_INT_S__POS           6
297 #define BMA2X2_FIFO_WM_INT_S__LEN           1
298 #define BMA2X2_FIFO_WM_INT_S__MSK           0x40
299 #define BMA2X2_FIFO_WM_INT_S__REG           BMA2X2_STATUS2_REG
300 
301 #define BMA2X2_DATA_INT_S__POS           7
302 #define BMA2X2_DATA_INT_S__LEN           1
303 #define BMA2X2_DATA_INT_S__MSK           0x80
304 #define BMA2X2_DATA_INT_S__REG           BMA2X2_STATUS2_REG
305 
306 #define BMA2X2_SLOPE_FIRST_X__POS        0
307 #define BMA2X2_SLOPE_FIRST_X__LEN        1
308 #define BMA2X2_SLOPE_FIRST_X__MSK        0x01
309 #define BMA2X2_SLOPE_FIRST_X__REG        BMA2X2_STATUS_TAP_SLOPE_REG
310 
311 #define BMA2X2_SLOPE_FIRST_Y__POS        1
312 #define BMA2X2_SLOPE_FIRST_Y__LEN        1
313 #define BMA2X2_SLOPE_FIRST_Y__MSK        0x02
314 #define BMA2X2_SLOPE_FIRST_Y__REG        BMA2X2_STATUS_TAP_SLOPE_REG
315 
316 #define BMA2X2_SLOPE_FIRST_Z__POS        2
317 #define BMA2X2_SLOPE_FIRST_Z__LEN        1
318 #define BMA2X2_SLOPE_FIRST_Z__MSK        0x04
319 #define BMA2X2_SLOPE_FIRST_Z__REG        BMA2X2_STATUS_TAP_SLOPE_REG
320 
321 #define BMA2X2_SLOPE_SIGN_S__POS         3
322 #define BMA2X2_SLOPE_SIGN_S__LEN         1
323 #define BMA2X2_SLOPE_SIGN_S__MSK         0x08
324 #define BMA2X2_SLOPE_SIGN_S__REG         BMA2X2_STATUS_TAP_SLOPE_REG
325 
326 #define BMA2X2_TAP_FIRST_X__POS        4
327 #define BMA2X2_TAP_FIRST_X__LEN        1
328 #define BMA2X2_TAP_FIRST_X__MSK        0x10
329 #define BMA2X2_TAP_FIRST_X__REG        BMA2X2_STATUS_TAP_SLOPE_REG
330 
331 #define BMA2X2_TAP_FIRST_Y__POS        5
332 #define BMA2X2_TAP_FIRST_Y__LEN        1
333 #define BMA2X2_TAP_FIRST_Y__MSK        0x20
334 #define BMA2X2_TAP_FIRST_Y__REG        BMA2X2_STATUS_TAP_SLOPE_REG
335 
336 #define BMA2X2_TAP_FIRST_Z__POS        6
337 #define BMA2X2_TAP_FIRST_Z__LEN        1
338 #define BMA2X2_TAP_FIRST_Z__MSK        0x40
339 #define BMA2X2_TAP_FIRST_Z__REG        BMA2X2_STATUS_TAP_SLOPE_REG
340 
341 #define BMA2X2_TAP_SIGN_S__POS         7
342 #define BMA2X2_TAP_SIGN_S__LEN         1
343 #define BMA2X2_TAP_SIGN_S__MSK         0x80
344 #define BMA2X2_TAP_SIGN_S__REG         BMA2X2_STATUS_TAP_SLOPE_REG
345 
346 #define BMA2X2_HIGHG_FIRST_X__POS        0
347 #define BMA2X2_HIGHG_FIRST_X__LEN        1
348 #define BMA2X2_HIGHG_FIRST_X__MSK        0x01
349 #define BMA2X2_HIGHG_FIRST_X__REG        BMA2X2_STATUS_ORIENT_HIGH_REG
350 
351 #define BMA2X2_HIGHG_FIRST_Y__POS        1
352 #define BMA2X2_HIGHG_FIRST_Y__LEN        1
353 #define BMA2X2_HIGHG_FIRST_Y__MSK        0x02
354 #define BMA2X2_HIGHG_FIRST_Y__REG        BMA2X2_STATUS_ORIENT_HIGH_REG
355 
356 #define BMA2X2_HIGHG_FIRST_Z__POS        2
357 #define BMA2X2_HIGHG_FIRST_Z__LEN        1
358 #define BMA2X2_HIGHG_FIRST_Z__MSK        0x04
359 #define BMA2X2_HIGHG_FIRST_Z__REG        BMA2X2_STATUS_ORIENT_HIGH_REG
360 
361 #define BMA2X2_HIGHG_SIGN_S__POS         3
362 #define BMA2X2_HIGHG_SIGN_S__LEN         1
363 #define BMA2X2_HIGHG_SIGN_S__MSK         0x08
364 #define BMA2X2_HIGHG_SIGN_S__REG         BMA2X2_STATUS_ORIENT_HIGH_REG
365 
366 #define BMA2X2_ORIENT_S__POS             4
367 #define BMA2X2_ORIENT_S__LEN             3
368 #define BMA2X2_ORIENT_S__MSK             0x70
369 #define BMA2X2_ORIENT_S__REG             BMA2X2_STATUS_ORIENT_HIGH_REG
370 
371 #define BMA2X2_FLAT_S__POS               7
372 #define BMA2X2_FLAT_S__LEN               1
373 #define BMA2X2_FLAT_S__MSK               0x80
374 #define BMA2X2_FLAT_S__REG               BMA2X2_STATUS_ORIENT_HIGH_REG
375 
376 #define BMA2X2_FIFO_FRAME_COUNTER_S__POS             0
377 #define BMA2X2_FIFO_FRAME_COUNTER_S__LEN             7
378 #define BMA2X2_FIFO_FRAME_COUNTER_S__MSK             0x7F
379 #define BMA2X2_FIFO_FRAME_COUNTER_S__REG             BMA2X2_STATUS_FIFO_REG
380 
381 #define BMA2X2_FIFO_OVERRUN_S__POS             7
382 #define BMA2X2_FIFO_OVERRUN_S__LEN             1
383 #define BMA2X2_FIFO_OVERRUN_S__MSK             0x80
384 #define BMA2X2_FIFO_OVERRUN_S__REG             BMA2X2_STATUS_FIFO_REG
385 
386 #define BMA2X2_RANGE_SEL__POS             0
387 #define BMA2X2_RANGE_SEL__LEN             4
388 #define BMA2X2_RANGE_SEL__MSK             0x0F
389 #define BMA2X2_RANGE_SEL__REG             BMA2X2_RANGE_SEL_REG
390 
391 #define BMA2X2_BANDWIDTH__POS             0
392 #define BMA2X2_BANDWIDTH__LEN             5
393 #define BMA2X2_BANDWIDTH__MSK             0x1F
394 #define BMA2X2_BANDWIDTH__REG             BMA2X2_BW_SEL_REG
395 
396 #define BMA2X2_SLEEP_DUR__POS             1
397 #define BMA2X2_SLEEP_DUR__LEN             4
398 #define BMA2X2_SLEEP_DUR__MSK             0x1E
399 #define BMA2X2_SLEEP_DUR__REG             BMA2X2_MODE_CTRL_REG
400 
401 #define BMA2X2_MODE_CTRL__POS             5
402 #define BMA2X2_MODE_CTRL__LEN             3
403 #define BMA2X2_MODE_CTRL__MSK             0xE0
404 #define BMA2X2_MODE_CTRL__REG             BMA2X2_MODE_CTRL_REG
405 
406 #define BMA2X2_DEEP_SUSPEND__POS          5
407 #define BMA2X2_DEEP_SUSPEND__LEN          1
408 #define BMA2X2_DEEP_SUSPEND__MSK          0x20
409 #define BMA2X2_DEEP_SUSPEND__REG          BMA2X2_MODE_CTRL_REG
410 
411 #define BMA2X2_EN_LOW_POWER__POS          6
412 #define BMA2X2_EN_LOW_POWER__LEN          1
413 #define BMA2X2_EN_LOW_POWER__MSK          0x40
414 #define BMA2X2_EN_LOW_POWER__REG          BMA2X2_MODE_CTRL_REG
415 
416 #define BMA2X2_EN_SUSPEND__POS            7
417 #define BMA2X2_EN_SUSPEND__LEN            1
418 #define BMA2X2_EN_SUSPEND__MSK            0x80
419 #define BMA2X2_EN_SUSPEND__REG            BMA2X2_MODE_CTRL_REG
420 
421 #define BMA2X2_SLEEP_TIMER__POS          5
422 #define BMA2X2_SLEEP_TIMER__LEN          1
423 #define BMA2X2_SLEEP_TIMER__MSK          0x20
424 #define BMA2X2_SLEEP_TIMER__REG          BMA2X2_LOW_NOISE_CTRL_REG
425 
426 #define BMA2X2_LOW_POWER_MODE__POS          6
427 #define BMA2X2_LOW_POWER_MODE__LEN          1
428 #define BMA2X2_LOW_POWER_MODE__MSK          0x40
429 #define BMA2X2_LOW_POWER_MODE__REG          BMA2X2_LOW_NOISE_CTRL_REG
430 
431 #define BMA2X2_EN_LOW_NOISE__POS          7
432 #define BMA2X2_EN_LOW_NOISE__LEN          1
433 #define BMA2X2_EN_LOW_NOISE__MSK          0x80
434 #define BMA2X2_EN_LOW_NOISE__REG          BMA2X2_LOW_NOISE_CTRL_REG
435 
436 #define BMA2X2_DIS_SHADOW_PROC__POS       6
437 #define BMA2X2_DIS_SHADOW_PROC__LEN       1
438 #define BMA2X2_DIS_SHADOW_PROC__MSK       0x40
439 #define BMA2X2_DIS_SHADOW_PROC__REG       BMA2X2_DATA_CTRL_REG
440 
441 #define BMA2X2_EN_DATA_HIGH_BW__POS         7
442 #define BMA2X2_EN_DATA_HIGH_BW__LEN         1
443 #define BMA2X2_EN_DATA_HIGH_BW__MSK         0x80
444 #define BMA2X2_EN_DATA_HIGH_BW__REG         BMA2X2_DATA_CTRL_REG
445 
446 #define BMA2X2_EN_SOFT_RESET__POS         0
447 #define BMA2X2_EN_SOFT_RESET__LEN         8
448 #define BMA2X2_EN_SOFT_RESET__MSK         0xFF
449 #define BMA2X2_EN_SOFT_RESET__REG         BMA2X2_RESET_REG
450 
451 #define BMA2X2_EN_SOFT_RESET_VALUE        0xB6
452 
453 #define BMA2X2_EN_SLOPE_X_INT__POS         0
454 #define BMA2X2_EN_SLOPE_X_INT__LEN         1
455 #define BMA2X2_EN_SLOPE_X_INT__MSK         0x01
456 #define BMA2X2_EN_SLOPE_X_INT__REG         BMA2X2_INT_ENABLE1_REG
457 
458 #define BMA2X2_EN_SLOPE_Y_INT__POS         1
459 #define BMA2X2_EN_SLOPE_Y_INT__LEN         1
460 #define BMA2X2_EN_SLOPE_Y_INT__MSK         0x02
461 #define BMA2X2_EN_SLOPE_Y_INT__REG         BMA2X2_INT_ENABLE1_REG
462 
463 #define BMA2X2_EN_SLOPE_Z_INT__POS         2
464 #define BMA2X2_EN_SLOPE_Z_INT__LEN         1
465 #define BMA2X2_EN_SLOPE_Z_INT__MSK         0x04
466 #define BMA2X2_EN_SLOPE_Z_INT__REG         BMA2X2_INT_ENABLE1_REG
467 
468 #define BMA2X2_EN_DOUBLE_TAP_INT__POS      4
469 #define BMA2X2_EN_DOUBLE_TAP_INT__LEN      1
470 #define BMA2X2_EN_DOUBLE_TAP_INT__MSK      0x10
471 #define BMA2X2_EN_DOUBLE_TAP_INT__REG      BMA2X2_INT_ENABLE1_REG
472 
473 #define BMA2X2_EN_SINGLE_TAP_INT__POS      5
474 #define BMA2X2_EN_SINGLE_TAP_INT__LEN      1
475 #define BMA2X2_EN_SINGLE_TAP_INT__MSK      0x20
476 #define BMA2X2_EN_SINGLE_TAP_INT__REG      BMA2X2_INT_ENABLE1_REG
477 
478 #define BMA2X2_EN_ORIENT_INT__POS          6
479 #define BMA2X2_EN_ORIENT_INT__LEN          1
480 #define BMA2X2_EN_ORIENT_INT__MSK          0x40
481 #define BMA2X2_EN_ORIENT_INT__REG          BMA2X2_INT_ENABLE1_REG
482 
483 #define BMA2X2_EN_FLAT_INT__POS            7
484 #define BMA2X2_EN_FLAT_INT__LEN            1
485 #define BMA2X2_EN_FLAT_INT__MSK            0x80
486 #define BMA2X2_EN_FLAT_INT__REG            BMA2X2_INT_ENABLE1_REG
487 
488 #define BMA2X2_EN_HIGHG_X_INT__POS         0
489 #define BMA2X2_EN_HIGHG_X_INT__LEN         1
490 #define BMA2X2_EN_HIGHG_X_INT__MSK         0x01
491 #define BMA2X2_EN_HIGHG_X_INT__REG         BMA2X2_INT_ENABLE2_REG
492 
493 #define BMA2X2_EN_HIGHG_Y_INT__POS         1
494 #define BMA2X2_EN_HIGHG_Y_INT__LEN         1
495 #define BMA2X2_EN_HIGHG_Y_INT__MSK         0x02
496 #define BMA2X2_EN_HIGHG_Y_INT__REG         BMA2X2_INT_ENABLE2_REG
497 
498 #define BMA2X2_EN_HIGHG_Z_INT__POS         2
499 #define BMA2X2_EN_HIGHG_Z_INT__LEN         1
500 #define BMA2X2_EN_HIGHG_Z_INT__MSK         0x04
501 #define BMA2X2_EN_HIGHG_Z_INT__REG         BMA2X2_INT_ENABLE2_REG
502 
503 #define BMA2X2_EN_LOWG_INT__POS            3
504 #define BMA2X2_EN_LOWG_INT__LEN            1
505 #define BMA2X2_EN_LOWG_INT__MSK            0x08
506 #define BMA2X2_EN_LOWG_INT__REG            BMA2X2_INT_ENABLE2_REG
507 
508 #define BMA2X2_EN_NEW_DATA_INT__POS        4
509 #define BMA2X2_EN_NEW_DATA_INT__LEN        1
510 #define BMA2X2_EN_NEW_DATA_INT__MSK        0x10
511 #define BMA2X2_EN_NEW_DATA_INT__REG        BMA2X2_INT_ENABLE2_REG
512 
513 #define BMA2X2_INT_FFULL_EN_INT__POS        5
514 #define BMA2X2_INT_FFULL_EN_INT__LEN        1
515 #define BMA2X2_INT_FFULL_EN_INT__MSK        0x20
516 #define BMA2X2_INT_FFULL_EN_INT__REG        BMA2X2_INT_ENABLE2_REG
517 
518 #define BMA2X2_INT_FWM_EN_INT__POS        6
519 #define BMA2X2_INT_FWM_EN_INT__LEN        1
520 #define BMA2X2_INT_FWM_EN_INT__MSK        0x40
521 #define BMA2X2_INT_FWM_EN_INT__REG        BMA2X2_INT_ENABLE2_REG
522 
523 #define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__POS        0
524 #define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__LEN        1
525 #define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__MSK        0x01
526 #define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG
527 
528 #define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__POS        1
529 #define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__LEN        1
530 #define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__MSK        0x02
531 #define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG
532 
533 #define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__POS        2
534 #define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__LEN        1
535 #define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__MSK        0x04
536 #define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG
537 
538 #define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__POS        3
539 #define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__LEN        1
540 #define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__MSK        0x08
541 #define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG
542 
543 #define BMA2X2_EN_INT1_PAD_LOWG__POS        0
544 #define BMA2X2_EN_INT1_PAD_LOWG__LEN        1
545 #define BMA2X2_EN_INT1_PAD_LOWG__MSK        0x01
546 #define BMA2X2_EN_INT1_PAD_LOWG__REG        BMA2X2_INT1_PAD_SEL_REG
547 
548 #define BMA2X2_EN_INT1_PAD_HIGHG__POS       1
549 #define BMA2X2_EN_INT1_PAD_HIGHG__LEN       1
550 #define BMA2X2_EN_INT1_PAD_HIGHG__MSK       0x02
551 #define BMA2X2_EN_INT1_PAD_HIGHG__REG       BMA2X2_INT1_PAD_SEL_REG
552 
553 #define BMA2X2_EN_INT1_PAD_SLOPE__POS       2
554 #define BMA2X2_EN_INT1_PAD_SLOPE__LEN       1
555 #define BMA2X2_EN_INT1_PAD_SLOPE__MSK       0x04
556 #define BMA2X2_EN_INT1_PAD_SLOPE__REG       BMA2X2_INT1_PAD_SEL_REG
557 
558 #define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__POS        3
559 #define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__LEN        1
560 #define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__MSK        0x08
561 #define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG        BMA2X2_INT1_PAD_SEL_REG
562 
563 #define BMA2X2_EN_INT1_PAD_DB_TAP__POS      4
564 #define BMA2X2_EN_INT1_PAD_DB_TAP__LEN      1
565 #define BMA2X2_EN_INT1_PAD_DB_TAP__MSK      0x10
566 #define BMA2X2_EN_INT1_PAD_DB_TAP__REG      BMA2X2_INT1_PAD_SEL_REG
567 
568 #define BMA2X2_EN_INT1_PAD_SNG_TAP__POS     5
569 #define BMA2X2_EN_INT1_PAD_SNG_TAP__LEN     1
570 #define BMA2X2_EN_INT1_PAD_SNG_TAP__MSK     0x20
571 #define BMA2X2_EN_INT1_PAD_SNG_TAP__REG     BMA2X2_INT1_PAD_SEL_REG
572 
573 #define BMA2X2_EN_INT1_PAD_ORIENT__POS      6
574 #define BMA2X2_EN_INT1_PAD_ORIENT__LEN      1
575 #define BMA2X2_EN_INT1_PAD_ORIENT__MSK      0x40
576 #define BMA2X2_EN_INT1_PAD_ORIENT__REG      BMA2X2_INT1_PAD_SEL_REG
577 
578 #define BMA2X2_EN_INT1_PAD_FLAT__POS        7
579 #define BMA2X2_EN_INT1_PAD_FLAT__LEN        1
580 #define BMA2X2_EN_INT1_PAD_FLAT__MSK        0x80
581 #define BMA2X2_EN_INT1_PAD_FLAT__REG        BMA2X2_INT1_PAD_SEL_REG
582 
583 #define BMA2X2_EN_INT2_PAD_LOWG__POS        0
584 #define BMA2X2_EN_INT2_PAD_LOWG__LEN        1
585 #define BMA2X2_EN_INT2_PAD_LOWG__MSK        0x01
586 #define BMA2X2_EN_INT2_PAD_LOWG__REG        BMA2X2_INT2_PAD_SEL_REG
587 
588 #define BMA2X2_EN_INT2_PAD_HIGHG__POS       1
589 #define BMA2X2_EN_INT2_PAD_HIGHG__LEN       1
590 #define BMA2X2_EN_INT2_PAD_HIGHG__MSK       0x02
591 #define BMA2X2_EN_INT2_PAD_HIGHG__REG       BMA2X2_INT2_PAD_SEL_REG
592 
593 #define BMA2X2_EN_INT2_PAD_SLOPE__POS       2
594 #define BMA2X2_EN_INT2_PAD_SLOPE__LEN       1
595 #define BMA2X2_EN_INT2_PAD_SLOPE__MSK       0x04
596 #define BMA2X2_EN_INT2_PAD_SLOPE__REG       BMA2X2_INT2_PAD_SEL_REG
597 
598 #define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__POS        3
599 #define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__LEN        1
600 #define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__MSK        0x08
601 #define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG        BMA2X2_INT2_PAD_SEL_REG
602 
603 #define BMA2X2_EN_INT2_PAD_DB_TAP__POS      4
604 #define BMA2X2_EN_INT2_PAD_DB_TAP__LEN      1
605 #define BMA2X2_EN_INT2_PAD_DB_TAP__MSK      0x10
606 #define BMA2X2_EN_INT2_PAD_DB_TAP__REG      BMA2X2_INT2_PAD_SEL_REG
607 
608 #define BMA2X2_EN_INT2_PAD_SNG_TAP__POS     5
609 #define BMA2X2_EN_INT2_PAD_SNG_TAP__LEN     1
610 #define BMA2X2_EN_INT2_PAD_SNG_TAP__MSK     0x20
611 #define BMA2X2_EN_INT2_PAD_SNG_TAP__REG     BMA2X2_INT2_PAD_SEL_REG
612 
613 #define BMA2X2_EN_INT2_PAD_ORIENT__POS      6
614 #define BMA2X2_EN_INT2_PAD_ORIENT__LEN      1
615 #define BMA2X2_EN_INT2_PAD_ORIENT__MSK      0x40
616 #define BMA2X2_EN_INT2_PAD_ORIENT__REG      BMA2X2_INT2_PAD_SEL_REG
617 
618 #define BMA2X2_EN_INT2_PAD_FLAT__POS        7
619 #define BMA2X2_EN_INT2_PAD_FLAT__LEN        1
620 #define BMA2X2_EN_INT2_PAD_FLAT__MSK        0x80
621 #define BMA2X2_EN_INT2_PAD_FLAT__REG        BMA2X2_INT2_PAD_SEL_REG
622 
623 #define BMA2X2_EN_INT1_PAD_NEWDATA__POS     0
624 #define BMA2X2_EN_INT1_PAD_NEWDATA__LEN     1
625 #define BMA2X2_EN_INT1_PAD_NEWDATA__MSK     0x01
626 #define BMA2X2_EN_INT1_PAD_NEWDATA__REG     BMA2X2_INT_DATA_SEL_REG
627 
628 #define BMA2X2_EN_INT1_PAD_FWM__POS     1
629 #define BMA2X2_EN_INT1_PAD_FWM__LEN     1
630 #define BMA2X2_EN_INT1_PAD_FWM__MSK     0x02
631 #define BMA2X2_EN_INT1_PAD_FWM__REG     BMA2X2_INT_DATA_SEL_REG
632 
633 #define BMA2X2_EN_INT1_PAD_FFULL__POS     2
634 #define BMA2X2_EN_INT1_PAD_FFULL__LEN     1
635 #define BMA2X2_EN_INT1_PAD_FFULL__MSK     0x04
636 #define BMA2X2_EN_INT1_PAD_FFULL__REG     BMA2X2_INT_DATA_SEL_REG
637 
638 #define BMA2X2_EN_INT2_PAD_FFULL__POS     5
639 #define BMA2X2_EN_INT2_PAD_FFULL__LEN     1
640 #define BMA2X2_EN_INT2_PAD_FFULL__MSK     0x20
641 #define BMA2X2_EN_INT2_PAD_FFULL__REG     BMA2X2_INT_DATA_SEL_REG
642 
643 #define BMA2X2_EN_INT2_PAD_FWM__POS     6
644 #define BMA2X2_EN_INT2_PAD_FWM__LEN     1
645 #define BMA2X2_EN_INT2_PAD_FWM__MSK     0x40
646 #define BMA2X2_EN_INT2_PAD_FWM__REG     BMA2X2_INT_DATA_SEL_REG
647 
648 #define BMA2X2_EN_INT2_PAD_NEWDATA__POS     7
649 #define BMA2X2_EN_INT2_PAD_NEWDATA__LEN     1
650 #define BMA2X2_EN_INT2_PAD_NEWDATA__MSK     0x80
651 #define BMA2X2_EN_INT2_PAD_NEWDATA__REG     BMA2X2_INT_DATA_SEL_REG
652 
653 #define BMA2X2_UNFILT_INT_SRC_LOWG__POS        0
654 #define BMA2X2_UNFILT_INT_SRC_LOWG__LEN        1
655 #define BMA2X2_UNFILT_INT_SRC_LOWG__MSK        0x01
656 #define BMA2X2_UNFILT_INT_SRC_LOWG__REG        BMA2X2_INT_SRC_REG
657 
658 #define BMA2X2_UNFILT_INT_SRC_HIGHG__POS       1
659 #define BMA2X2_UNFILT_INT_SRC_HIGHG__LEN       1
660 #define BMA2X2_UNFILT_INT_SRC_HIGHG__MSK       0x02
661 #define BMA2X2_UNFILT_INT_SRC_HIGHG__REG       BMA2X2_INT_SRC_REG
662 
663 #define BMA2X2_UNFILT_INT_SRC_SLOPE__POS       2
664 #define BMA2X2_UNFILT_INT_SRC_SLOPE__LEN       1
665 #define BMA2X2_UNFILT_INT_SRC_SLOPE__MSK       0x04
666 #define BMA2X2_UNFILT_INT_SRC_SLOPE__REG       BMA2X2_INT_SRC_REG
667 
668 #define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__POS        3
669 #define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__LEN        1
670 #define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__MSK        0x08
671 #define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__REG        BMA2X2_INT_SRC_REG
672 
673 #define BMA2X2_UNFILT_INT_SRC_TAP__POS         4
674 #define BMA2X2_UNFILT_INT_SRC_TAP__LEN         1
675 #define BMA2X2_UNFILT_INT_SRC_TAP__MSK         0x10
676 #define BMA2X2_UNFILT_INT_SRC_TAP__REG         BMA2X2_INT_SRC_REG
677 
678 #define BMA2X2_UNFILT_INT_SRC_DATA__POS        5
679 #define BMA2X2_UNFILT_INT_SRC_DATA__LEN        1
680 #define BMA2X2_UNFILT_INT_SRC_DATA__MSK        0x20
681 #define BMA2X2_UNFILT_INT_SRC_DATA__REG        BMA2X2_INT_SRC_REG
682 
683 #define BMA2X2_INT1_PAD_ACTIVE_LEVEL__POS       0
684 #define BMA2X2_INT1_PAD_ACTIVE_LEVEL__LEN       1
685 #define BMA2X2_INT1_PAD_ACTIVE_LEVEL__MSK       0x01
686 #define BMA2X2_INT1_PAD_ACTIVE_LEVEL__REG       BMA2X2_INT_SET_REG
687 
688 #define BMA2X2_INT2_PAD_ACTIVE_LEVEL__POS       2
689 #define BMA2X2_INT2_PAD_ACTIVE_LEVEL__LEN       1
690 #define BMA2X2_INT2_PAD_ACTIVE_LEVEL__MSK       0x04
691 #define BMA2X2_INT2_PAD_ACTIVE_LEVEL__REG       BMA2X2_INT_SET_REG
692 
693 #define BMA2X2_INT1_PAD_OUTPUT_TYPE__POS        1
694 #define BMA2X2_INT1_PAD_OUTPUT_TYPE__LEN        1
695 #define BMA2X2_INT1_PAD_OUTPUT_TYPE__MSK        0x02
696 #define BMA2X2_INT1_PAD_OUTPUT_TYPE__REG        BMA2X2_INT_SET_REG
697 
698 #define BMA2X2_INT2_PAD_OUTPUT_TYPE__POS        3
699 #define BMA2X2_INT2_PAD_OUTPUT_TYPE__LEN        1
700 #define BMA2X2_INT2_PAD_OUTPUT_TYPE__MSK        0x08
701 #define BMA2X2_INT2_PAD_OUTPUT_TYPE__REG        BMA2X2_INT_SET_REG
702 
703 #define BMA2X2_INT_MODE_SEL__POS                0
704 #define BMA2X2_INT_MODE_SEL__LEN                4
705 #define BMA2X2_INT_MODE_SEL__MSK                0x0F
706 #define BMA2X2_INT_MODE_SEL__REG                BMA2X2_INT_CTRL_REG
707 
708 #define BMA2X2_RESET_INT__POS           7
709 #define BMA2X2_RESET_INT__LEN           1
710 #define BMA2X2_RESET_INT__MSK           0x80
711 #define BMA2X2_RESET_INT__REG           BMA2X2_INT_CTRL_REG
712 
713 #define BMA2X2_LOWG_DUR__POS                    0
714 #define BMA2X2_LOWG_DUR__LEN                    8
715 #define BMA2X2_LOWG_DUR__MSK                    0xFF
716 #define BMA2X2_LOWG_DUR__REG                    BMA2X2_LOW_DURN_REG
717 
718 #define BMA2X2_LOWG_THRES__POS                  0
719 #define BMA2X2_LOWG_THRES__LEN                  8
720 #define BMA2X2_LOWG_THRES__MSK                  0xFF
721 #define BMA2X2_LOWG_THRES__REG                  BMA2X2_LOW_THRES_REG
722 
723 #define BMA2X2_LOWG_HYST__POS                   0
724 #define BMA2X2_LOWG_HYST__LEN                   2
725 #define BMA2X2_LOWG_HYST__MSK                   0x03
726 #define BMA2X2_LOWG_HYST__REG                   BMA2X2_LOW_HIGH_HYST_REG
727 
728 #define BMA2X2_LOWG_INT_MODE__POS               2
729 #define BMA2X2_LOWG_INT_MODE__LEN               1
730 #define BMA2X2_LOWG_INT_MODE__MSK               0x04
731 #define BMA2X2_LOWG_INT_MODE__REG               BMA2X2_LOW_HIGH_HYST_REG
732 
733 #define BMA2X2_HIGHG_DUR__POS                    0
734 #define BMA2X2_HIGHG_DUR__LEN                    8
735 #define BMA2X2_HIGHG_DUR__MSK                    0xFF
736 #define BMA2X2_HIGHG_DUR__REG                    BMA2X2_HIGH_DURN_REG
737 
738 #define BMA2X2_HIGHG_THRES__POS                  0
739 #define BMA2X2_HIGHG_THRES__LEN                  8
740 #define BMA2X2_HIGHG_THRES__MSK                  0xFF
741 #define BMA2X2_HIGHG_THRES__REG                  BMA2X2_HIGH_THRES_REG
742 
743 #define BMA2X2_HIGHG_HYST__POS                  6
744 #define BMA2X2_HIGHG_HYST__LEN                  2
745 #define BMA2X2_HIGHG_HYST__MSK                  0xC0
746 #define BMA2X2_HIGHG_HYST__REG                  BMA2X2_LOW_HIGH_HYST_REG
747 
748 #define BMA2X2_SLOPE_DUR__POS                    0
749 #define BMA2X2_SLOPE_DUR__LEN                    2
750 #define BMA2X2_SLOPE_DUR__MSK                    0x03
751 #define BMA2X2_SLOPE_DUR__REG                    BMA2X2_SLOPE_DURN_REG
752 
753 #define BMA2X2_SLO_NO_MOT_DUR__POS                    2
754 #define BMA2X2_SLO_NO_MOT_DUR__LEN                    6
755 #define BMA2X2_SLO_NO_MOT_DUR__MSK                    0xFC
756 #define BMA2X2_SLO_NO_MOT_DUR__REG                    BMA2X2_SLOPE_DURN_REG
757 
758 #define BMA2X2_SLOPE_THRES__POS                  0
759 #define BMA2X2_SLOPE_THRES__LEN                  8
760 #define BMA2X2_SLOPE_THRES__MSK                  0xFF
761 #define BMA2X2_SLOPE_THRES__REG                  BMA2X2_SLOPE_THRES_REG
762 
763 #define BMA2X2_SLO_NO_MOT_THRES__POS                  0
764 #define BMA2X2_SLO_NO_MOT_THRES__LEN                  8
765 #define BMA2X2_SLO_NO_MOT_THRES__MSK                  0xFF
766 #define BMA2X2_SLO_NO_MOT_THRES__REG           BMA2X2_SLO_NO_MOT_THRES_REG
767 
768 #define BMA2X2_TAP_DUR__POS                    0
769 #define BMA2X2_TAP_DUR__LEN                    3
770 #define BMA2X2_TAP_DUR__MSK                    0x07
771 #define BMA2X2_TAP_DUR__REG                    BMA2X2_TAP_PARAM_REG
772 
773 #define BMA2X2_TAP_SHOCK_DURN__POS             6
774 #define BMA2X2_TAP_SHOCK_DURN__LEN             1
775 #define BMA2X2_TAP_SHOCK_DURN__MSK             0x40
776 #define BMA2X2_TAP_SHOCK_DURN__REG             BMA2X2_TAP_PARAM_REG
777 
778 #define BMA2X2_ADV_TAP_INT__POS                5
779 #define BMA2X2_ADV_TAP_INT__LEN                1
780 #define BMA2X2_ADV_TAP_INT__MSK                0x20
781 #define BMA2X2_ADV_TAP_INT__REG                BMA2X2_TAP_PARAM_REG
782 
783 #define BMA2X2_TAP_QUIET_DURN__POS             7
784 #define BMA2X2_TAP_QUIET_DURN__LEN             1
785 #define BMA2X2_TAP_QUIET_DURN__MSK             0x80
786 #define BMA2X2_TAP_QUIET_DURN__REG             BMA2X2_TAP_PARAM_REG
787 
788 #define BMA2X2_TAP_THRES__POS                  0
789 #define BMA2X2_TAP_THRES__LEN                  5
790 #define BMA2X2_TAP_THRES__MSK                  0x1F
791 #define BMA2X2_TAP_THRES__REG                  BMA2X2_TAP_THRES_REG
792 
793 #define BMA2X2_TAP_SAMPLES__POS                6
794 #define BMA2X2_TAP_SAMPLES__LEN                2
795 #define BMA2X2_TAP_SAMPLES__MSK                0xC0
796 #define BMA2X2_TAP_SAMPLES__REG                BMA2X2_TAP_THRES_REG
797 
798 #define BMA2X2_ORIENT_MODE__POS                  0
799 #define BMA2X2_ORIENT_MODE__LEN                  2
800 #define BMA2X2_ORIENT_MODE__MSK                  0x03
801 #define BMA2X2_ORIENT_MODE__REG                  BMA2X2_ORIENT_PARAM_REG
802 
803 #define BMA2X2_ORIENT_BLOCK__POS                 2
804 #define BMA2X2_ORIENT_BLOCK__LEN                 2
805 #define BMA2X2_ORIENT_BLOCK__MSK                 0x0C
806 #define BMA2X2_ORIENT_BLOCK__REG                 BMA2X2_ORIENT_PARAM_REG
807 
808 #define BMA2X2_ORIENT_HYST__POS                  4
809 #define BMA2X2_ORIENT_HYST__LEN                  3
810 #define BMA2X2_ORIENT_HYST__MSK                  0x70
811 #define BMA2X2_ORIENT_HYST__REG                  BMA2X2_ORIENT_PARAM_REG
812 
813 #define BMA2X2_ORIENT_AXIS__POS                  7
814 #define BMA2X2_ORIENT_AXIS__LEN                  1
815 #define BMA2X2_ORIENT_AXIS__MSK                  0x80
816 #define BMA2X2_ORIENT_AXIS__REG                  BMA2X2_THETA_BLOCK_REG
817 
818 #define BMA2X2_ORIENT_UD_EN__POS                  6
819 #define BMA2X2_ORIENT_UD_EN__LEN                  1
820 #define BMA2X2_ORIENT_UD_EN__MSK                  0x40
821 #define BMA2X2_ORIENT_UD_EN__REG                  BMA2X2_THETA_BLOCK_REG
822 
823 #define BMA2X2_THETA_BLOCK__POS                  0
824 #define BMA2X2_THETA_BLOCK__LEN                  6
825 #define BMA2X2_THETA_BLOCK__MSK                  0x3F
826 #define BMA2X2_THETA_BLOCK__REG                  BMA2X2_THETA_BLOCK_REG
827 
828 #define BMA2X2_THETA_FLAT__POS                  0
829 #define BMA2X2_THETA_FLAT__LEN                  6
830 #define BMA2X2_THETA_FLAT__MSK                  0x3F
831 #define BMA2X2_THETA_FLAT__REG                  BMA2X2_THETA_FLAT_REG
832 
833 #define BMA2X2_FLAT_HOLD_TIME__POS              4
834 #define BMA2X2_FLAT_HOLD_TIME__LEN              2
835 #define BMA2X2_FLAT_HOLD_TIME__MSK              0x30
836 #define BMA2X2_FLAT_HOLD_TIME__REG              BMA2X2_FLAT_HOLD_TIME_REG
837 
838 #define BMA2X2_FLAT_HYS__POS                   0
839 #define BMA2X2_FLAT_HYS__LEN                   3
840 #define BMA2X2_FLAT_HYS__MSK                   0x07
841 #define BMA2X2_FLAT_HYS__REG                   BMA2X2_FLAT_HOLD_TIME_REG
842 
843 #define BMA2X2_FIFO_WML_TRIG_RETAIN__POS                   0
844 #define BMA2X2_FIFO_WML_TRIG_RETAIN__LEN                   6
845 #define BMA2X2_FIFO_WML_TRIG_RETAIN__MSK                   0x3F
846 #define BMA2X2_FIFO_WML_TRIG_RETAIN__REG                   BMA2X2_FIFO_WML_TRIG
847 
848 #define BMA2X2_EN_SELF_TEST__POS                0
849 #define BMA2X2_EN_SELF_TEST__LEN                2
850 #define BMA2X2_EN_SELF_TEST__MSK                0x03
851 #define BMA2X2_EN_SELF_TEST__REG                BMA2X2_SELF_TEST_REG
852 
853 #define BMA2X2_NEG_SELF_TEST__POS               2
854 #define BMA2X2_NEG_SELF_TEST__LEN               1
855 #define BMA2X2_NEG_SELF_TEST__MSK               0x04
856 #define BMA2X2_NEG_SELF_TEST__REG               BMA2X2_SELF_TEST_REG
857 
858 #define BMA2X2_SELF_TEST_AMP__POS               4
859 #define BMA2X2_SELF_TEST_AMP__LEN               1
860 #define BMA2X2_SELF_TEST_AMP__MSK               0x10
861 #define BMA2X2_SELF_TEST_AMP__REG               BMA2X2_SELF_TEST_REG
862 
863 #define BMA2X2_UNLOCK_EE_PROG_MODE__POS     0
864 #define BMA2X2_UNLOCK_EE_PROG_MODE__LEN     1
865 #define BMA2X2_UNLOCK_EE_PROG_MODE__MSK     0x01
866 #define BMA2X2_UNLOCK_EE_PROG_MODE__REG     BMA2X2_EEPROM_CTRL_REG
867 
868 #define BMA2X2_START_EE_PROG_TRIG__POS      1
869 #define BMA2X2_START_EE_PROG_TRIG__LEN      1
870 #define BMA2X2_START_EE_PROG_TRIG__MSK      0x02
871 #define BMA2X2_START_EE_PROG_TRIG__REG      BMA2X2_EEPROM_CTRL_REG
872 
873 #define BMA2X2_EE_PROG_READY__POS          2
874 #define BMA2X2_EE_PROG_READY__LEN          1
875 #define BMA2X2_EE_PROG_READY__MSK          0x04
876 #define BMA2X2_EE_PROG_READY__REG          BMA2X2_EEPROM_CTRL_REG
877 
878 #define BMA2X2_UPDATE_IMAGE__POS                3
879 #define BMA2X2_UPDATE_IMAGE__LEN                1
880 #define BMA2X2_UPDATE_IMAGE__MSK                0x08
881 #define BMA2X2_UPDATE_IMAGE__REG                BMA2X2_EEPROM_CTRL_REG
882 
883 #define BMA2X2_EE_REMAIN__POS                4
884 #define BMA2X2_EE_REMAIN__LEN                4
885 #define BMA2X2_EE_REMAIN__MSK                0xF0
886 #define BMA2X2_EE_REMAIN__REG                BMA2X2_EEPROM_CTRL_REG
887 
888 #define BMA2X2_EN_SPI_MODE_3__POS              0
889 #define BMA2X2_EN_SPI_MODE_3__LEN              1
890 #define BMA2X2_EN_SPI_MODE_3__MSK              0x01
891 #define BMA2X2_EN_SPI_MODE_3__REG              BMA2X2_SERIAL_CTRL_REG
892 
893 #define BMA2X2_I2C_WATCHDOG_PERIOD__POS        1
894 #define BMA2X2_I2C_WATCHDOG_PERIOD__LEN        1
895 #define BMA2X2_I2C_WATCHDOG_PERIOD__MSK        0x02
896 #define BMA2X2_I2C_WATCHDOG_PERIOD__REG        BMA2X2_SERIAL_CTRL_REG
897 
898 #define BMA2X2_EN_I2C_WATCHDOG__POS            2
899 #define BMA2X2_EN_I2C_WATCHDOG__LEN            1
900 #define BMA2X2_EN_I2C_WATCHDOG__MSK            0x04
901 #define BMA2X2_EN_I2C_WATCHDOG__REG            BMA2X2_SERIAL_CTRL_REG
902 
903 #define BMA2X2_EXT_MODE__POS              7
904 #define BMA2X2_EXT_MODE__LEN              1
905 #define BMA2X2_EXT_MODE__MSK              0x80
906 #define BMA2X2_EXT_MODE__REG              BMA2X2_EXTMODE_CTRL_REG
907 
908 #define BMA2X2_ALLOW_UPPER__POS        6
909 #define BMA2X2_ALLOW_UPPER__LEN        1
910 #define BMA2X2_ALLOW_UPPER__MSK        0x40
911 #define BMA2X2_ALLOW_UPPER__REG        BMA2X2_EXTMODE_CTRL_REG
912 
913 #define BMA2X2_MAP_2_LOWER__POS            5
914 #define BMA2X2_MAP_2_LOWER__LEN            1
915 #define BMA2X2_MAP_2_LOWER__MSK            0x20
916 #define BMA2X2_MAP_2_LOWER__REG            BMA2X2_EXTMODE_CTRL_REG
917 
918 #define BMA2X2_MAGIC_NUMBER__POS            0
919 #define BMA2X2_MAGIC_NUMBER__LEN            5
920 #define BMA2X2_MAGIC_NUMBER__MSK            0x1F
921 #define BMA2X2_MAGIC_NUMBER__REG            BMA2X2_EXTMODE_CTRL_REG
922 
923 #define BMA2X2_UNLOCK_EE_WRITE_TRIM__POS        4
924 #define BMA2X2_UNLOCK_EE_WRITE_TRIM__LEN        4
925 #define BMA2X2_UNLOCK_EE_WRITE_TRIM__MSK        0xF0
926 #define BMA2X2_UNLOCK_EE_WRITE_TRIM__REG        BMA2X2_CTRL_UNLOCK_REG
927 
928 #define BMA2X2_EN_SLOW_COMP_X__POS              0
929 #define BMA2X2_EN_SLOW_COMP_X__LEN              1
930 #define BMA2X2_EN_SLOW_COMP_X__MSK              0x01
931 #define BMA2X2_EN_SLOW_COMP_X__REG              BMA2X2_OFFSET_CTRL_REG
932 
933 #define BMA2X2_EN_SLOW_COMP_Y__POS              1
934 #define BMA2X2_EN_SLOW_COMP_Y__LEN              1
935 #define BMA2X2_EN_SLOW_COMP_Y__MSK              0x02
936 #define BMA2X2_EN_SLOW_COMP_Y__REG              BMA2X2_OFFSET_CTRL_REG
937 
938 #define BMA2X2_EN_SLOW_COMP_Z__POS              2
939 #define BMA2X2_EN_SLOW_COMP_Z__LEN              1
940 #define BMA2X2_EN_SLOW_COMP_Z__MSK              0x04
941 #define BMA2X2_EN_SLOW_COMP_Z__REG              BMA2X2_OFFSET_CTRL_REG
942 
943 #define BMA2X2_FAST_CAL_RDY_S__POS             4
944 #define BMA2X2_FAST_CAL_RDY_S__LEN             1
945 #define BMA2X2_FAST_CAL_RDY_S__MSK             0x10
946 #define BMA2X2_FAST_CAL_RDY_S__REG             BMA2X2_OFFSET_CTRL_REG
947 
948 #define BMA2X2_CAL_TRIGGER__POS                5
949 #define BMA2X2_CAL_TRIGGER__LEN                2
950 #define BMA2X2_CAL_TRIGGER__MSK                0x60
951 #define BMA2X2_CAL_TRIGGER__REG                BMA2X2_OFFSET_CTRL_REG
952 
953 #define BMA2X2_RESET_OFFSET_REGS__POS           7
954 #define BMA2X2_RESET_OFFSET_REGS__LEN           1
955 #define BMA2X2_RESET_OFFSET_REGS__MSK           0x80
956 #define BMA2X2_RESET_OFFSET_REGS__REG           BMA2X2_OFFSET_CTRL_REG
957 
958 #define BMA2X2_COMP_CUTOFF__POS                 0
959 #define BMA2X2_COMP_CUTOFF__LEN                 1
960 #define BMA2X2_COMP_CUTOFF__MSK                 0x01
961 #define BMA2X2_COMP_CUTOFF__REG                 BMA2X2_OFFSET_PARAMS_REG
962 
963 #define BMA2X2_COMP_TARGET_OFFSET_X__POS        1
964 #define BMA2X2_COMP_TARGET_OFFSET_X__LEN        2
965 #define BMA2X2_COMP_TARGET_OFFSET_X__MSK        0x06
966 #define BMA2X2_COMP_TARGET_OFFSET_X__REG        BMA2X2_OFFSET_PARAMS_REG
967 
968 #define BMA2X2_COMP_TARGET_OFFSET_Y__POS        3
969 #define BMA2X2_COMP_TARGET_OFFSET_Y__LEN        2
970 #define BMA2X2_COMP_TARGET_OFFSET_Y__MSK        0x18
971 #define BMA2X2_COMP_TARGET_OFFSET_Y__REG        BMA2X2_OFFSET_PARAMS_REG
972 
973 #define BMA2X2_COMP_TARGET_OFFSET_Z__POS        5
974 #define BMA2X2_COMP_TARGET_OFFSET_Z__LEN        2
975 #define BMA2X2_COMP_TARGET_OFFSET_Z__MSK        0x60
976 #define BMA2X2_COMP_TARGET_OFFSET_Z__REG        BMA2X2_OFFSET_PARAMS_REG
977 
978 #define BMA2X2_FIFO_DATA_SELECT__POS                 0
979 #define BMA2X2_FIFO_DATA_SELECT__LEN                 2
980 #define BMA2X2_FIFO_DATA_SELECT__MSK                 0x03
981 #define BMA2X2_FIFO_DATA_SELECT__REG                 BMA2X2_FIFO_MODE_REG
982 
983 #define BMA2X2_FIFO_TRIGGER_SOURCE__POS                 2
984 #define BMA2X2_FIFO_TRIGGER_SOURCE__LEN                 2
985 #define BMA2X2_FIFO_TRIGGER_SOURCE__MSK                 0x0C
986 #define BMA2X2_FIFO_TRIGGER_SOURCE__REG                 BMA2X2_FIFO_MODE_REG
987 
988 #define BMA2X2_FIFO_TRIGGER_ACTION__POS                 4
989 #define BMA2X2_FIFO_TRIGGER_ACTION__LEN                 2
990 #define BMA2X2_FIFO_TRIGGER_ACTION__MSK                 0x30
991 #define BMA2X2_FIFO_TRIGGER_ACTION__REG                 BMA2X2_FIFO_MODE_REG
992 
993 #define BMA2X2_FIFO_MODE__POS                 6
994 #define BMA2X2_FIFO_MODE__LEN                 2
995 #define BMA2X2_FIFO_MODE__MSK                 0xC0
996 #define BMA2X2_FIFO_MODE__REG                 BMA2X2_FIFO_MODE_REG
997 
998 #define BMA2X2_RANGE_2G                 3
999 #define BMA2X2_RANGE_4G                 5
1000 #define BMA2X2_RANGE_8G                 8
1001 #define BMA2X2_RANGE_16G                12
1002 
1003 #define BMA2X2_BW_7_81HZ        0x08
1004 #define BMA2X2_BW_15_63HZ       0x09
1005 #define BMA2X2_BW_31_25HZ       0x0A
1006 #define BMA2X2_BW_62_50HZ       0x0B
1007 #define BMA2X2_BW_125HZ         0x0C
1008 #define BMA2X2_BW_250HZ         0x0D
1009 #define BMA2X2_BW_500HZ         0x0E
1010 #define BMA2X2_BW_1000HZ        0x0F
1011 
1012 #define BMA2X2_SLEEP_DUR_0_5MS        0x05
1013 #define BMA2X2_SLEEP_DUR_1MS          0x06
1014 #define BMA2X2_SLEEP_DUR_2MS          0x07
1015 #define BMA2X2_SLEEP_DUR_4MS          0x08
1016 #define BMA2X2_SLEEP_DUR_6MS          0x09
1017 #define BMA2X2_SLEEP_DUR_10MS         0x0A
1018 #define BMA2X2_SLEEP_DUR_25MS         0x0B
1019 #define BMA2X2_SLEEP_DUR_50MS         0x0C
1020 #define BMA2X2_SLEEP_DUR_100MS        0x0D
1021 #define BMA2X2_SLEEP_DUR_500MS        0x0E
1022 #define BMA2X2_SLEEP_DUR_1S           0x0F
1023 
1024 #define BMA2X2_LATCH_DUR_NON_LATCH    0x00
1025 #define BMA2X2_LATCH_DUR_250MS        0x01
1026 #define BMA2X2_LATCH_DUR_500MS        0x02
1027 #define BMA2X2_LATCH_DUR_1S           0x03
1028 #define BMA2X2_LATCH_DUR_2S           0x04
1029 #define BMA2X2_LATCH_DUR_4S           0x05
1030 #define BMA2X2_LATCH_DUR_8S           0x06
1031 #define BMA2X2_LATCH_DUR_LATCH        0x07
1032 #define BMA2X2_LATCH_DUR_NON_LATCH1   0x08
1033 #define BMA2X2_LATCH_DUR_250US        0x09
1034 #define BMA2X2_LATCH_DUR_500US        0x0A
1035 #define BMA2X2_LATCH_DUR_1MS          0x0B
1036 #define BMA2X2_LATCH_DUR_12_5MS       0x0C
1037 #define BMA2X2_LATCH_DUR_25MS         0x0D
1038 #define BMA2X2_LATCH_DUR_50MS         0x0E
1039 #define BMA2X2_LATCH_DUR_LATCH1       0x0F
1040 
1041 #define BMA2X2_MODE_NORMAL             0
1042 #define BMA2X2_MODE_LOWPOWER1          1
1043 #define BMA2X2_MODE_SUSPEND            2
1044 #define BMA2X2_MODE_DEEP_SUSPEND       3
1045 #define BMA2X2_MODE_LOWPOWER2          4
1046 #define BMA2X2_MODE_STANDBY            5
1047 
1048 #define BMA2X2_LOW_TH_IN_G(gthres, range)		((256 * gthres) / range)
1049 #define BMA2X2_HIGH_TH_IN_G(gthres, range)		((256 * gthres) / range)
1050 #define BMA2X2_LOW_HY_IN_G(ghyst, range)		((32 * ghyst) / range)
1051 #define BMA2X2_HIGH_HY_IN_G(ghyst, range)		((32 * ghyst) / range)
1052 #define BMA2X2_SLOPE_TH_IN_G(gthres, range)		((128 * gthres) / range)
1053 
1054 #define BMA2X2_GET_BITSLICE(regvar, bitname)\
1055 	 ((regvar & bitname##__MSK) >> bitname##__POS)
1056 #define BMA2X2_SET_BITSLICE(regvar, bitname, val)\
1057 ((regvar & ~bitname##__MSK) | ((val << bitname##__POS) & bitname##__MSK))
1058 
1059 #define BMA255_CHIP_ID 0XFA
1060 #define BMA250_CHIP_ID 0XF9
1061 #define BMA250E_CHIP_ID 0X03
1062 #define BMA222E_CHIP_ID 0XF8
1063 #define BMA280_CHIP_ID 0XFB
1064 
1065 #define BAM2X2_ENABLE	0X80
1066 
1067 #define BMA2XX_RANGE	32768
1068 
1069 #define X_AXIS_COMPEN	0/*X_AXIS  not compensation */
1070 /*Y_AXIS offset is caused by screws, there needs to be compensation 3.5*/
1071 #define Y_AXIS_COMPEN	0
1072 #define Z_AXIS_COMPEN	0/*Z_AXIS not compensation*/
1073 
1074 static u8 slope_mode;
1075 static u8 high_g_mode;
1076 static u8 interrupt_dur;
1077 static u8 interrupt_threshold;
1078 
bma2x2_parse_dt(struct i2c_client * client)1079 static int bma2x2_parse_dt(struct i2c_client *client)
1080 {
1081 	struct device_node *np = client->dev.of_node;
1082 	u32 temp_val;
1083 	int rc;
1084 
1085 	rc = of_property_read_u32(np, "high_g_mode", &temp_val);
1086 	if (!rc)
1087 		high_g_mode = (u8)temp_val;
1088 
1089 	rc = of_property_read_u32(np, "slope_mode", &temp_val);
1090 	if (!rc)
1091 		slope_mode = (u8)temp_val;
1092 
1093 	rc = of_property_read_u32(np, "interrupt_dur", &temp_val);
1094 	if (!rc)
1095 		interrupt_dur = (u8)temp_val;
1096 
1097 	rc = of_property_read_u32(np, "interrupt_threshold", &temp_val);
1098 	if (!rc)
1099 		interrupt_threshold = (u8)temp_val;
1100 
1101 	DBG("%s: high_g_mode = %d\n", __func__, high_g_mode);
1102 	DBG("%s: slope_mode = %d\n", __func__, slope_mode);
1103 	DBG("%s: interrupt_dur = %d\n", __func__, interrupt_dur);
1104 	DBG("%s: interrupt_threshold = %d\n", __func__, interrupt_threshold);
1105 
1106 	return 0;
1107 }
1108 
1109 #ifdef BMA2X2_ENABLE_INT1
bma2x2_set_int1_pad_sel(struct i2c_client * client,unsigned char int1sel)1110 static int bma2x2_set_int1_pad_sel(struct i2c_client *client, unsigned char
1111 		int1sel)
1112 {
1113 	int comres = 0;
1114 	unsigned char data = 0;
1115 	unsigned char state;
1116 
1117 	state = 0x01;
1118 
1119 	switch (int1sel) {
1120 	case 0:
1121 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_LOWG__REG);
1122 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_LOWG,
1123 					   state);
1124 		comres = sensor_write_reg(client,
1125 					  BMA2X2_EN_INT1_PAD_LOWG__REG,
1126 					  data);
1127 		break;
1128 	case 1:
1129 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_HIGHG__REG);
1130 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_HIGHG,
1131 					   state);
1132 		comres = sensor_write_reg(client,
1133 					  BMA2X2_EN_INT1_PAD_HIGHG__REG,
1134 					  data);
1135 		break;
1136 	case 2:
1137 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_SLOPE__REG);
1138 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SLOPE,
1139 					   state);
1140 		comres = sensor_write_reg(client,
1141 					  BMA2X2_EN_INT1_PAD_SLOPE__REG,
1142 					  data);
1143 		break;
1144 	case 3:
1145 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_DB_TAP__REG);
1146 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_DB_TAP,
1147 					   state);
1148 		comres = sensor_write_reg(client,
1149 					  BMA2X2_EN_INT1_PAD_DB_TAP__REG,
1150 					  data);
1151 		break;
1152 	case 4:
1153 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_SNG_TAP__REG);
1154 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SNG_TAP,
1155 					   state);
1156 		comres = sensor_write_reg(client,
1157 					  BMA2X2_EN_INT1_PAD_SNG_TAP__REG,
1158 					  data);
1159 		break;
1160 	case 5:
1161 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_ORIENT__REG);
1162 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_ORIENT,
1163 					   state);
1164 		comres = sensor_write_reg(client,
1165 					  BMA2X2_EN_INT1_PAD_ORIENT__REG,
1166 					  data);
1167 		break;
1168 	case 6:
1169 		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_FLAT__REG);
1170 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_FLAT,
1171 					   state);
1172 		comres = sensor_write_reg(client,
1173 					  BMA2X2_EN_INT1_PAD_FLAT__REG,
1174 					  data);
1175 		break;
1176 	case 7:
1177 		comres = sensor_read_reg(client,
1178 					 BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG);
1179 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SLO_NO_MOT,
1180 					   state);
1181 		comres = sensor_write_reg(client,
1182 					  BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG,
1183 					  data);
1184 		break;
1185 	default:
1186 		break;
1187 	}
1188 
1189 	return comres;
1190 }
1191 #endif /* BMA2X2_ENABLE_INT1 */
1192 
1193 #ifdef BMA2X2_ENABLE_INT2
bma2x2_set_int2_pad_sel(struct i2c_client * client,unsigned char int2sel)1194 static int bma2x2_set_int2_pad_sel(struct i2c_client *client, unsigned char
1195 		int2sel)
1196 {
1197 	int comres = 0;
1198 	unsigned char data = 0;
1199 	unsigned char state;
1200 
1201 	state = 0x01;
1202 
1203 	switch (int2sel) {
1204 	case 0:
1205 		comres = sensor_read_reg(client, BMA2X2_EN_INT2_PAD_LOWG__REG);
1206 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_LOWG,
1207 					   state);
1208 		comres = sensor_write_reg(client,
1209 					  BMA2X2_EN_INT2_PAD_LOWG__REG,
1210 					  data);
1211 		break;
1212 	case 1:
1213 		comres = sensor_read_reg(client, BMA2X2_EN_INT2_PAD_HIGHG__REG);
1214 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_HIGHG,
1215 					   state);
1216 		comres = sensor_write_reg(client,
1217 					  BMA2X2_EN_INT2_PAD_HIGHG__REG,
1218 					  data);
1219 		break;
1220 	case 2:
1221 		comres = sensor_read_reg(client, BMA2X2_EN_INT2_PAD_SLOPE__REG);
1222 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SLOPE,
1223 					   state);
1224 		comres = sensor_write_reg(client,
1225 					  BMA2X2_EN_INT2_PAD_SLOPE__REG,
1226 					  data);
1227 		break;
1228 	case 3:
1229 		comres = sensor_read_reg(client,
1230 					 BMA2X2_EN_INT2_PAD_DB_TAP__REG);
1231 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_DB_TAP,
1232 					   state);
1233 		comres = sensor_write_reg(client,
1234 					  BMA2X2_EN_INT2_PAD_DB_TAP__REG,
1235 					  data);
1236 		break;
1237 	case 4:
1238 		comres = sensor_read_reg(client,
1239 					 BMA2X2_EN_INT2_PAD_SNG_TAP__REG);
1240 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SNG_TAP,
1241 					   state);
1242 		comres = sensor_write_reg(client,
1243 					  BMA2X2_EN_INT2_PAD_SNG_TAP__REG,
1244 					  data);
1245 		break;
1246 	case 5:
1247 		comres = sensor_read_reg(client,
1248 					 BMA2X2_EN_INT2_PAD_ORIENT__REG);
1249 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_ORIENT,
1250 					   state);
1251 		comres = sensor_write_reg(client,
1252 					  BMA2X2_EN_INT2_PAD_ORIENT__REG,
1253 					  data);
1254 		break;
1255 	case 6:
1256 		comres = sensor_read_reg(client,
1257 					 BMA2X2_EN_INT2_PAD_FLAT__REG);
1258 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_FLAT,
1259 					   state);
1260 		comres = sensor_write_reg(client,
1261 					  BMA2X2_EN_INT2_PAD_FLAT__REG,
1262 					  data);
1263 		break;
1264 	case 7:
1265 		comres = sensor_read_reg(client,
1266 					 BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG);
1267 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SLO_NO_MOT,
1268 					   state);
1269 		comres = sensor_write_reg(client,
1270 					  BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG,
1271 					  data);
1272 		break;
1273 	default:
1274 		break;
1275 	}
1276 
1277 	return comres;
1278 }
1279 #endif /* BMA2X2_ENABLE_INT2 */
1280 
1281 #if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2)
bma2x2_get_interruptstatus1(struct i2c_client * client,unsigned char * intstatus)1282 static int bma2x2_get_interruptstatus1(struct i2c_client *client, unsigned char
1283 		*intstatus)
1284 {
1285 	unsigned char data;
1286 
1287 	data = sensor_read_reg(client, BMA2X2_STATUS1_REG);
1288 	*intstatus = data;
1289 	return 0;
1290 }
1291 
bma2x2_get_HIGH_first(struct i2c_client * client,unsigned char param,unsigned char * intstatus)1292 static int bma2x2_get_HIGH_first(struct i2c_client *client, unsigned char
1293 						 param,
1294 						 unsigned char *intstatus)
1295 {
1296 	unsigned char data;
1297 
1298 	switch (param) {
1299 	case 0:
1300 		data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
1301 		data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_X);
1302 		*intstatus = data;
1303 		break;
1304 	case 1:
1305 		data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
1306 		data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_Y);
1307 		*intstatus = data;
1308 		break;
1309 	case 2:
1310 		data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
1311 		data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_Z);
1312 		*intstatus = data;
1313 		break;
1314 	default:
1315 		break;
1316 	}
1317 
1318 	return 0;
1319 }
1320 
bma2x2_get_HIGH_sign(struct i2c_client * client,unsigned char * intstatus)1321 static int bma2x2_get_HIGH_sign(struct i2c_client *client, unsigned char
1322 		*intstatus)
1323 {
1324 	unsigned char data;
1325 
1326 	data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
1327 	data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_SIGN_S);
1328 	*intstatus = data;
1329 
1330 	return 0;
1331 }
1332 
bma2x2_get_slope_first(struct i2c_client * client,unsigned char param,unsigned char * intstatus)1333 static int bma2x2_get_slope_first(struct i2c_client *client, unsigned char
1334 	param, unsigned char *intstatus)
1335 {
1336 	unsigned char data;
1337 
1338 	switch (param) {
1339 	case 0:
1340 		data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
1341 		data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_X);
1342 		*intstatus = data;
1343 		break;
1344 	case 1:
1345 		data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
1346 		data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_Y);
1347 		*intstatus = data;
1348 		break;
1349 	case 2:
1350 		data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
1351 		data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_Z);
1352 		*intstatus = data;
1353 		break;
1354 	default:
1355 		break;
1356 	}
1357 
1358 	return 0;
1359 }
1360 
bma2x2_get_slope_sign(struct i2c_client * client,unsigned char * intstatus)1361 static int bma2x2_get_slope_sign(struct i2c_client *client, unsigned char
1362 		*intstatus)
1363 {
1364 	unsigned char data;
1365 
1366 	data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
1367 	data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_SIGN_S);
1368 	*intstatus = data;
1369 
1370 	return 0;
1371 }
1372 
bma2x2_get_orient_status(struct i2c_client * client,unsigned char * intstatus)1373 static int bma2x2_get_orient_status(struct i2c_client *client, unsigned char
1374 		*intstatus)
1375 {
1376 	unsigned char data;
1377 
1378 	data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
1379 	data = BMA2X2_GET_BITSLICE(data, BMA2X2_ORIENT_S);
1380 	*intstatus = data;
1381 
1382 	return 0;
1383 }
1384 
bma2x2_get_orient_flat_status(struct i2c_client * client,unsigned char * intstatus)1385 static int bma2x2_get_orient_flat_status(struct i2c_client *client, unsigned
1386 		char *intstatus)
1387 {
1388 	unsigned char data;
1389 
1390 	data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
1391 	data = BMA2X2_GET_BITSLICE(data, BMA2X2_FLAT_S);
1392 	*intstatus = data;
1393 
1394 	return 0;
1395 }
1396 
bma2x2_set_int_mode(struct i2c_client * client,unsigned char mode)1397 static int bma2x2_set_int_mode(struct i2c_client *client, unsigned char mode)
1398 {
1399 	unsigned char data;
1400 	int comres = 0;
1401 
1402 	data = sensor_read_reg(client, BMA2X2_INT_MODE_SEL__REG);
1403 	data = BMA2X2_SET_BITSLICE(data, BMA2X2_INT_MODE_SEL, mode);
1404 	comres = sensor_write_reg(client,
1405 				BMA2X2_INT_MODE_SEL__REG, data);
1406 
1407 	return comres;
1408 }
1409 #endif /* defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2) */
1410 
bma2x2_set_mode(struct i2c_client * client,unsigned char mode)1411 static int bma2x2_set_mode(struct i2c_client *client, unsigned char mode)
1412 {
1413 	int comres = 0;
1414 	unsigned char data1, data2;
1415 
1416 	if (mode < 6) {
1417 		data1 = sensor_read_reg(client, BMA2X2_MODE_CTRL_REG);
1418 		data2 = sensor_read_reg(client, BMA2X2_LOW_NOISE_CTRL_REG);
1419 		switch (mode) {
1420 		case BMA2X2_MODE_NORMAL:
1421 				data1	= BMA2X2_SET_BITSLICE(data1,
1422 							      BMA2X2_MODE_CTRL,
1423 							      0);
1424 				data2	= BMA2X2_SET_BITSLICE
1425 						(data2,
1426 						BMA2X2_LOW_POWER_MODE,
1427 						0);
1428 				sensor_write_reg
1429 						(client,
1430 						BMA2X2_MODE_CTRL_REG,
1431 						data1);
1432 				mdelay(1);
1433 				sensor_write_reg(client,
1434 						  BMA2X2_LOW_NOISE_CTRL_REG,
1435 						  data2);
1436 				break;
1437 		case BMA2X2_MODE_LOWPOWER1:
1438 				data1	= BMA2X2_SET_BITSLICE
1439 							(data1,
1440 							BMA2X2_MODE_CTRL,
1441 							2);
1442 				 data2	= BMA2X2_SET_BITSLICE
1443 							(data2,
1444 							BMA2X2_LOW_POWER_MODE,
1445 							0);
1446 				 sensor_write_reg
1447 						(client,
1448 						BMA2X2_MODE_CTRL_REG,
1449 						data1);
1450 				 mdelay(1);
1451 				 sensor_write_reg
1452 						(client,
1453 						BMA2X2_LOW_NOISE_CTRL_REG,
1454 						data2);
1455 				break;
1456 		case BMA2X2_MODE_SUSPEND:
1457 				 data1	= BMA2X2_SET_BITSLICE(data1,
1458 							      BMA2X2_MODE_CTRL,
1459 							      4);
1460 				 data2	= BMA2X2_SET_BITSLICE
1461 						(data2,
1462 						BMA2X2_LOW_POWER_MODE,
1463 						0);
1464 				 sensor_write_reg(client,
1465 						  BMA2X2_LOW_NOISE_CTRL_REG,
1466 						  data2);
1467 				 mdelay(1);
1468 				 sensor_write_reg(client,
1469 						  BMA2X2_MODE_CTRL_REG,
1470 						  data1);
1471 				break;
1472 		case BMA2X2_MODE_DEEP_SUSPEND:
1473 				 data1	= BMA2X2_SET_BITSLICE
1474 						(data1,
1475 						BMA2X2_MODE_CTRL,
1476 						1);
1477 				 data2	= BMA2X2_SET_BITSLICE
1478 						(data2,
1479 						BMA2X2_LOW_POWER_MODE,
1480 						1);
1481 				 sensor_write_reg
1482 						(client,
1483 						BMA2X2_MODE_CTRL_REG,
1484 						data1);
1485 				 mdelay(1);
1486 				 sensor_write_reg(client,
1487 						  BMA2X2_LOW_NOISE_CTRL_REG,
1488 						  data2);
1489 				break;
1490 		case BMA2X2_MODE_LOWPOWER2:
1491 				 data1	= BMA2X2_SET_BITSLICE
1492 						(data1,
1493 						BMA2X2_MODE_CTRL,
1494 						2);
1495 				 data2	= BMA2X2_SET_BITSLICE
1496 						(data2,
1497 						BMA2X2_LOW_POWER_MODE,
1498 						1);
1499 				 sensor_write_reg(client,
1500 						  BMA2X2_MODE_CTRL_REG,
1501 						  data1);
1502 				 mdelay(1);
1503 				 sensor_write_reg(client,
1504 						  BMA2X2_LOW_NOISE_CTRL_REG,
1505 						  data2);
1506 				break;
1507 		case BMA2X2_MODE_STANDBY:
1508 				 data1	= BMA2X2_SET_BITSLICE(data1,
1509 							      BMA2X2_MODE_CTRL,
1510 							      4);
1511 				 data2	= BMA2X2_SET_BITSLICE
1512 						(data2,
1513 						BMA2X2_LOW_POWER_MODE,
1514 						1);
1515 				 sensor_write_reg(client,
1516 						  BMA2X2_LOW_NOISE_CTRL_REG,
1517 						  data2);
1518 				 mdelay(1);
1519 				 sensor_write_reg(client,
1520 						  BMA2X2_MODE_CTRL_REG,
1521 						  data1);
1522 		break;
1523 		}
1524 	} else {
1525 		comres =  -1;
1526 	}
1527 
1528 	return comres;
1529 }
1530 
bma2x2_set_range(struct i2c_client * client,unsigned char range)1531 static int bma2x2_set_range(struct i2c_client *client, unsigned char range)
1532 {
1533 	int comres = 0;
1534 	unsigned char data1;
1535 
1536 	if ((range == 3) || (range == 5) || (range == 8) || (range == 12)) {
1537 		data1 = sensor_read_reg(client, BMA2X2_RANGE_SEL_REG);
1538 		switch (range) {
1539 		case BMA2X2_RANGE_2G:
1540 			 data1	= BMA2X2_SET_BITSLICE(data1,
1541 						      BMA2X2_RANGE_SEL, 3);
1542 			break;
1543 		case BMA2X2_RANGE_4G:
1544 			data1	= BMA2X2_SET_BITSLICE(data1,
1545 						      BMA2X2_RANGE_SEL, 5);
1546 			break;
1547 		case BMA2X2_RANGE_8G:
1548 			data1	= BMA2X2_SET_BITSLICE(data1,
1549 						      BMA2X2_RANGE_SEL, 8);
1550 			break;
1551 		case BMA2X2_RANGE_16G:
1552 			data1	= BMA2X2_SET_BITSLICE(data1,
1553 						      BMA2X2_RANGE_SEL, 12);
1554 			break;
1555 		}
1556 		comres += sensor_write_reg(client, BMA2X2_RANGE_SEL_REG,
1557 				 data1);
1558 	} else {
1559 		comres =  -1;
1560 	}
1561 
1562 	return comres;
1563 }
1564 
bma2x2_set_bandwidth(struct i2c_client * client,unsigned char BW)1565 static int bma2x2_set_bandwidth(struct i2c_client *client, unsigned char BW)
1566 {
1567 	int comres = 0;
1568 	unsigned char data;
1569 	int bandwidth = 0;
1570 
1571 	if (BW > 7 && BW < 16) {
1572 		switch (BW) {
1573 		case BMA2X2_BW_7_81HZ:
1574 			bandwidth = BMA2X2_BW_7_81HZ;
1575 
1576 			/*  7.81 Hz	  64000 uS	 */
1577 			break;
1578 		case BMA2X2_BW_15_63HZ:
1579 			 bandwidth = BMA2X2_BW_15_63HZ;
1580 
1581 			/*  15.63 Hz	  32000 uS	 */
1582 			break;
1583 		case BMA2X2_BW_31_25HZ:
1584 			bandwidth = BMA2X2_BW_31_25HZ;
1585 
1586 			/*  31.25 Hz	  16000 uS	 */
1587 			break;
1588 		case BMA2X2_BW_62_50HZ:
1589 			bandwidth = BMA2X2_BW_62_50HZ;
1590 
1591 			/*  62.50 Hz	  8000 uS	*/
1592 			break;
1593 		case BMA2X2_BW_125HZ:
1594 			bandwidth = BMA2X2_BW_125HZ;
1595 
1596 			 /*  125 Hz	  4000 uS	*/
1597 			break;
1598 		case BMA2X2_BW_250HZ:
1599 			bandwidth = BMA2X2_BW_250HZ;
1600 
1601 			/*  250 Hz	  2000 uS	*/
1602 			break;
1603 		case BMA2X2_BW_500HZ:
1604 			bandwidth = BMA2X2_BW_500HZ;
1605 
1606 			/*  500 Hz	  1000 uS	*/
1607 			break;
1608 		case BMA2X2_BW_1000HZ:
1609 			bandwidth = BMA2X2_BW_1000HZ;
1610 
1611 			/*  1000 Hz	  500 uS   */
1612 			break;
1613 		}
1614 		data = sensor_read_reg(client, BMA2X2_BANDWIDTH__REG);
1615 		data = BMA2X2_SET_BITSLICE(data, BMA2X2_BANDWIDTH, bandwidth);
1616 		comres += sensor_write_reg(client, BMA2X2_BANDWIDTH__REG,
1617 				data);
1618 	} else {
1619 		comres =  -1;
1620 	}
1621 
1622 	return comres;
1623 }
1624 
1625 #if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2)
1626 	unsigned char *orient[] = {"upward looking portrait upright",
1627 	 "upward looking portrait upside - down",
1628 		 "upward looking landscape left",
1629 		 "upward looking landscape right",
1630 		 "downward looking portrait upright",
1631 		 "downward looking portrait upside - down",
1632 		 "downward looking landscape left",
1633 		 "downward looking landscape right"};
1634 
sensor_report_value(struct i2c_client * client)1635 static int sensor_report_value(struct i2c_client *client)
1636 {
1637 	struct sensor_private_data *sensor =
1638 		(struct sensor_private_data *)i2c_get_clientdata(client);
1639 
1640 	unsigned char status = 0;
1641 	unsigned char i;
1642 	unsigned char first_value = 0;
1643 	unsigned char sign_value = 0;
1644 
1645 	bma2x2_get_interruptstatus1(client, &status);
1646 
1647 	switch (status) {
1648 	case 0x01:
1649 		DBG("Low G interrupt happened\n");
1650 		input_report_rel(sensor->input_dev, LOW_G_INTERRUPT,
1651 				  LOW_G_INTERRUPT_HAPPENED);
1652 		break;
1653 	case 0x02:
1654 		for (i = 0; i < 3; i++) {
1655 			bma2x2_get_HIGH_first(client, i,
1656 					      &first_value);
1657 			if (first_value == 1) {
1658 				bma2x2_get_HIGH_sign(client,
1659 						     &sign_value);
1660 
1661 				if (sign_value == 1) {
1662 					if (i == 0)
1663 						input_report_rel
1664 					(sensor->input_dev,
1665 					HIGH_G_INTERRUPT,
1666 					HIGH_G_INTERRUPT_X_NEGATIVE_HAPPENED);
1667 					if (i == 1)
1668 						input_report_rel
1669 					(sensor->input_dev,
1670 					HIGH_G_INTERRUPT,
1671 					HIGH_G_INTERRUPT_Y_NEGATIVE_HAPPENED);
1672 					if (i == 2)
1673 						input_report_rel
1674 					(sensor->input_dev,
1675 					HIGH_G_INTERRUPT,
1676 					HIGH_G_INTERRUPT_Z_NEGATIVE_HAPPENED);
1677 				} else {
1678 					if (i == 0)
1679 						input_report_rel
1680 						(sensor->input_dev,
1681 						HIGH_G_INTERRUPT,
1682 						HIGH_G_INTERRUPT_X_HAPPENED);
1683 					if (i == 1)
1684 						input_report_rel
1685 						(sensor->input_dev,
1686 						HIGH_G_INTERRUPT,
1687 						HIGH_G_INTERRUPT_Y_HAPPENED);
1688 					if (i == 2)
1689 						input_report_rel
1690 						(sensor->input_dev,
1691 						HIGH_G_INTERRUPT,
1692 						HIGH_G_INTERRUPT_Z_HAPPENED);
1693 				}
1694 			}
1695 			DBG
1696 			("High G interrupt happened,exis is %d,first is %d,sign is %d\n",
1697 			i, first_value, sign_value);
1698 		}
1699 			break;
1700 	case 0x04:
1701 		for (i = 0; i < 3; i++) {
1702 			bma2x2_get_slope_first(client, i,
1703 					&first_value);
1704 			if (first_value == 1) {
1705 				bma2x2_get_slope_sign(client,
1706 						&sign_value);
1707 
1708 				if (sign_value == 1) {
1709 					if (i == 0)
1710 						input_report_rel
1711 					(sensor->input_dev,
1712 					SLOP_INTERRUPT,
1713 					SLOPE_INTERRUPT_X_NEGATIVE_HAPPENED);
1714 					else if (i == 1)
1715 						input_report_rel
1716 					(sensor->input_dev,
1717 					SLOP_INTERRUPT,
1718 					SLOPE_INTERRUPT_Y_NEGATIVE_HAPPENED);
1719 					else if (i == 2)
1720 						input_report_rel
1721 					(sensor->input_dev,
1722 					SLOP_INTERRUPT,
1723 					SLOPE_INTERRUPT_Z_NEGATIVE_HAPPENED);
1724 				} else {
1725 					if (i == 0)
1726 						input_report_rel
1727 						(sensor->input_dev,
1728 						SLOP_INTERRUPT,
1729 						SLOPE_INTERRUPT_X_HAPPENED);
1730 					else if (i == 1)
1731 						input_report_rel
1732 						(sensor->input_dev,
1733 						SLOP_INTERRUPT,
1734 						SLOPE_INTERRUPT_Y_HAPPENED);
1735 					else if (i == 2)
1736 						input_report_rel
1737 						(sensor->input_dev,
1738 						SLOP_INTERRUPT,
1739 						SLOPE_INTERRUPT_Z_HAPPENED);
1740 				}
1741 			}
1742 
1743 			DBG("Slop interrupt happened,exis is %d,first is %d,sign is %d\n",
1744 				i, first_value, sign_value);
1745 		}
1746 		break;
1747 
1748 	case 0x08:
1749 		DBG("slow/ no motion interrupt happened\n");
1750 		input_report_rel(sensor->input_dev, SLOW_NO_MOTION_INTERRUPT,
1751 				SLOW_NO_MOTION_INTERRUPT_HAPPENED);
1752 		break;
1753 
1754 	case 0x10:
1755 		DBG("double tap interrupt happened\n");
1756 		input_report_rel(sensor->input_dev, DOUBLE_TAP_INTERRUPT,
1757 				DOUBLE_TAP_INTERRUPT_HAPPENED);
1758 		break;
1759 	case 0x20:
1760 		DBG("single tap interrupt happened\n");
1761 		input_report_rel(sensor->input_dev, SINGLE_TAP_INTERRUPT,
1762 				  SINGLE_TAP_INTERRUPT_HAPPENED);
1763 		break;
1764 	case 0x40:
1765 		bma2x2_get_orient_status(client,
1766 					  &first_value);
1767 		DBG
1768 		("orient interrupt happened,%s\n", orient[first_value]);
1769 		if (first_value == 0)
1770 			input_report_abs
1771 			(sensor->input_dev, ORIENT_INTERRUPT,
1772 			UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED);
1773 		else if (first_value == 1)
1774 			input_report_abs
1775 			(sensor->input_dev, ORIENT_INTERRUPT,
1776 			UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED);
1777 		else if (first_value == 2)
1778 			input_report_abs
1779 			(sensor->input_dev, ORIENT_INTERRUPT,
1780 			UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED);
1781 		else if (first_value == 3)
1782 			input_report_abs
1783 			(sensor->input_dev, ORIENT_INTERRUPT,
1784 			UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED);
1785 		else if (first_value == 4)
1786 			input_report_abs
1787 			(sensor->input_dev, ORIENT_INTERRUPT,
1788 			DOWNWARD_PORTRAIT_UP_INTERRUPT_HAPPENED);
1789 		else if (first_value == 5)
1790 			input_report_abs
1791 			(sensor->input_dev, ORIENT_INTERRUPT,
1792 			DOWNWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED);
1793 		else if (first_value == 6)
1794 			input_report_abs
1795 			(sensor->input_dev, ORIENT_INTERRUPT,
1796 			DOWNWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED);
1797 		else if (first_value == 7)
1798 			input_report_abs
1799 			(sensor->input_dev, ORIENT_INTERRUPT,
1800 			DOWNWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED);
1801 		break;
1802 	case 0x80:
1803 		bma2x2_get_orient_flat_status(client,
1804 					       &sign_value);
1805 		DBG
1806 		("flat interrupt happened,flat status is %d\n",
1807 		sign_value);
1808 		if (sign_value == 1) {
1809 			input_report_abs(sensor->input_dev, FLAT_INTERRUPT,
1810 					 FLAT_INTERRUPT_TRUE_HAPPENED);
1811 		} else {
1812 			input_report_abs(sensor->input_dev, FLAT_INTERRUPT,
1813 					 FLAT_INTERRUPT_FALSE_HAPPENED);
1814 		}
1815 		break;
1816 	default:
1817 		break;
1818 	}
1819 	return 0;
1820 }
1821 #else
1822 
bma2x2_remap_sensor_data(struct i2c_client * client,struct sensor_axis * axis)1823 static void bma2x2_remap_sensor_data(struct i2c_client *client,
1824 				     struct sensor_axis *axis)
1825 {
1826 #ifdef CONFIG_BMA_USE_PLATFORM_DATA
1827 	struct bosch_sensor_data bsd;
1828 
1829 	if (!client->bst_pd)
1830 		return;
1831 
1832 	bsd.x = axis->x;
1833 	bsd.y = axis->y;
1834 	bsd.z = axis->z;
1835 
1836 	bst_remap_sensor_data_dft_tab(&bsd,
1837 				       client_data->bst_pd->place);
1838 
1839 	axis->x = bsd.x;
1840 	axis->y = bsd.y;
1841 	axis->z = bsd.z;
1842 #else
1843 	(void)axis;
1844 	(void)client;
1845 #endif
1846 }
1847 
gsensor_report_value(struct i2c_client * client,struct sensor_axis * axis)1848 static int gsensor_report_value
1849 (struct i2c_client *client, struct sensor_axis *axis)
1850 {
1851 	struct sensor_private_data *sensor =
1852 		(struct sensor_private_data *)i2c_get_clientdata(client);
1853 
1854 	if (sensor->status_cur == SENSOR_ON) {
1855 		/* Report acceleration sensor information */
1856 		input_report_abs(sensor->input_dev, ABS_X, axis->x);
1857 		input_report_abs(sensor->input_dev, ABS_Y, axis->y);
1858 		input_report_abs(sensor->input_dev, ABS_Z, axis->z);
1859 		input_sync(sensor->input_dev);
1860 	}
1861 
1862 	return 0;
1863 }
1864 
sensor_report_value(struct i2c_client * client)1865 static int sensor_report_value(struct i2c_client *client)
1866 {
1867 	int comres = 0;
1868 	unsigned char data[6];
1869 	short x, y, z;
1870 	unsigned int xyz_adc_rang = 0;
1871 	char value = 0;
1872 	struct sensor_axis axis;
1873 	struct sensor_private_data *sensor =
1874 		(struct sensor_private_data *)i2c_get_clientdata(client);
1875 	struct sensor_platform_data *pdata = sensor->pdata;
1876 
1877 	/*sensor->ops->read_len = 6*/
1878 	if (sensor->ops->read_len < 6) {
1879 		DBG
1880 		("%s:len is error,len=%d\n", __func__, sensor->ops->read_len);
1881 		return  -1;
1882 	}
1883 	memset(data, 0, 6);
1884 
1885 	*data = sensor->ops->read_reg;
1886 #ifdef BMA2X2_SENSOR_IDENTIFICATION_ENABLE
1887 	comres = sensor_rx_data(client, data, sensor->ops->read_len);
1888 	x = (data[1] << 8) | data[0];
1889 	y = (data[3] << 8) | data[2];
1890 	z = (data[5] << 8) | data[4];
1891 #else
1892 	switch (sensor->devid) {
1893 	case BMA255_CHIP_ID:
1894 		comres = sensor_rx_data(client, data, sensor->ops->read_len);
1895 
1896 		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X12_LSB) |
1897 			 (BMA2X2_GET_BITSLICE(data[1],
1898 				 BMA2X2_ACC_X_MSB) <<
1899 					(BMA2X2_ACC_X12_LSB__LEN));
1900 		x = x  <<  (sizeof(short) * 8 - (BMA2X2_ACC_X12_LSB__LEN +
1901 					 BMA2X2_ACC_X_MSB__LEN));
1902 		x = x >> (sizeof(short) * 8 - (BMA2X2_ACC_X12_LSB__LEN +
1903 					 BMA2X2_ACC_X_MSB__LEN));
1904 
1905 		y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y12_LSB) |
1906 			 (BMA2X2_GET_BITSLICE(data[3],
1907 				 BMA2X2_ACC_Y_MSB) <<
1908 					(BMA2X2_ACC_Y12_LSB__LEN));
1909 		y = y  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Y12_LSB__LEN +
1910 					 BMA2X2_ACC_Y_MSB__LEN));
1911 		y = y >> (sizeof(short) * 8 - (BMA2X2_ACC_Y12_LSB__LEN +
1912 					 BMA2X2_ACC_Y_MSB__LEN));
1913 
1914 		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z12_LSB) |
1915 			 (BMA2X2_GET_BITSLICE(data[5],
1916 				 BMA2X2_ACC_Z_MSB) <<
1917 					(BMA2X2_ACC_Z12_LSB__LEN));
1918 		z = z  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Z12_LSB__LEN +
1919 					 BMA2X2_ACC_Z_MSB__LEN));
1920 		z = z >> (sizeof(short) * 8 - (BMA2X2_ACC_Z12_LSB__LEN +
1921 					 BMA2X2_ACC_Z_MSB__LEN));
1922 		xyz_adc_rang = 0x800;
1923 		break;
1924 	case BMA250E_CHIP_ID:
1925 	case BMA250_CHIP_ID:
1926 		comres = sensor_rx_data(client, data, sensor->ops->read_len);
1927 
1928 		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X10_LSB) |
1929 			 (BMA2X2_GET_BITSLICE(data[1],
1930 				 BMA2X2_ACC_X_MSB) <<
1931 					(BMA2X2_ACC_X10_LSB__LEN));
1932 		x = x  <<  (sizeof(short) * 8 - (BMA2X2_ACC_X10_LSB__LEN +
1933 					 BMA2X2_ACC_X_MSB__LEN));
1934 		x = x >> (sizeof(short) * 8 - (BMA2X2_ACC_X10_LSB__LEN +
1935 					 BMA2X2_ACC_X_MSB__LEN));
1936 
1937 		y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y10_LSB) |
1938 			 (BMA2X2_GET_BITSLICE(data[3],
1939 				 BMA2X2_ACC_Y_MSB) << (BMA2X2_ACC_Y10_LSB__LEN
1940 									 ));
1941 		y = y  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Y10_LSB__LEN +
1942 					 BMA2X2_ACC_Y_MSB__LEN));
1943 		y = y >> (sizeof(short) * 8 - (BMA2X2_ACC_Y10_LSB__LEN +
1944 					 BMA2X2_ACC_Y_MSB__LEN));
1945 
1946 		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z10_LSB) |
1947 			 (BMA2X2_GET_BITSLICE(data[5],
1948 				 BMA2X2_ACC_Z_MSB) <<
1949 					(BMA2X2_ACC_Z10_LSB__LEN));
1950 		z = z  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Z10_LSB__LEN +
1951 					 BMA2X2_ACC_Z_MSB__LEN));
1952 		z = z >> (sizeof(short) * 8 - (BMA2X2_ACC_Z10_LSB__LEN +
1953 					 BMA2X2_ACC_Z_MSB__LEN));
1954 		xyz_adc_rang = 0x200;
1955 		/* compensation y axis*/
1956 		x = x + (X_AXIS_COMPEN * xyz_adc_rang) / BMA2XX_RANGE;
1957 		y = y + (Y_AXIS_COMPEN * xyz_adc_rang) / BMA2XX_RANGE;
1958 		z = z + (Z_AXIS_COMPEN * xyz_adc_rang) / BMA2XX_RANGE;
1959 		break;
1960 	case BMA222E_CHIP_ID:
1961 		comres = sensor_rx_data(client, data, sensor->ops->read_len);
1962 		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X8_LSB) |
1963 			 (BMA2X2_GET_BITSLICE(data[1],
1964 				 BMA2X2_ACC_X_MSB) << (BMA2X2_ACC_X8_LSB__LEN));
1965 		x = x  <<  (sizeof(short) * 8 - (BMA2X2_ACC_X8_LSB__LEN +
1966 					 BMA2X2_ACC_X_MSB__LEN));
1967 		x = x >> (sizeof(short) * 8 - (BMA2X2_ACC_X8_LSB__LEN +
1968 					 BMA2X2_ACC_X_MSB__LEN));
1969 
1970 		y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y8_LSB) |
1971 			 (BMA2X2_GET_BITSLICE(data[3],
1972 				 BMA2X2_ACC_Y_MSB) << (BMA2X2_ACC_Y8_LSB__LEN
1973 									 ));
1974 		y = y  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Y8_LSB__LEN +
1975 					 BMA2X2_ACC_Y_MSB__LEN));
1976 		y = y >> (sizeof(short) * 8 - (BMA2X2_ACC_Y8_LSB__LEN +
1977 					 BMA2X2_ACC_Y_MSB__LEN));
1978 
1979 		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z8_LSB) |
1980 			 (BMA2X2_GET_BITSLICE(data[5],
1981 				 BMA2X2_ACC_Z_MSB) << (BMA2X2_ACC_Z8_LSB__LEN));
1982 		z = z  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Z8_LSB__LEN +
1983 					 BMA2X2_ACC_Z_MSB__LEN));
1984 		z = z >> (sizeof(short) * 8 - (BMA2X2_ACC_Z8_LSB__LEN +
1985 					 BMA2X2_ACC_Z_MSB__LEN));
1986 		xyz_adc_rang = 0x80;
1987 		break;
1988 	case BMA280_CHIP_ID:
1989 		comres = sensor_rx_data(client, data, sensor->ops->read_len);
1990 
1991 		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X14_LSB) |
1992 			 (BMA2X2_GET_BITSLICE(data[1],
1993 				BMA2X2_ACC_X_MSB) << (BMA2X2_ACC_X14_LSB__LEN));
1994 		 x = x  <<  (sizeof(short) * 8  -  (BMA2X2_ACC_X14_LSB__LEN +
1995 					 BMA2X2_ACC_X_MSB__LEN));
1996 		 x = x >> (sizeof(short) * 8  -  (BMA2X2_ACC_X14_LSB__LEN +
1997 					 BMA2X2_ACC_X_MSB__LEN));
1998 
1999 		 y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y14_LSB) |
2000 			 (BMA2X2_GET_BITSLICE(data[3],
2001 				BMA2X2_ACC_Y_MSB) << (BMA2X2_ACC_Y14_LSB__LEN));
2002 		y = y  <<  (sizeof(short) * 8  -  (BMA2X2_ACC_Y14_LSB__LEN +
2003 					 BMA2X2_ACC_Y_MSB__LEN));
2004 		y = y >> (sizeof(short) * 8  -  (BMA2X2_ACC_Y14_LSB__LEN +
2005 					 BMA2X2_ACC_Y_MSB__LEN));
2006 
2007 		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z14_LSB)  |
2008 			 (BMA2X2_GET_BITSLICE(data[5],
2009 			  BMA2X2_ACC_Z_MSB) << (BMA2X2_ACC_Z14_LSB__LEN));
2010 		z = z  <<  (sizeof(short) * 8  -  (BMA2X2_ACC_Z14_LSB__LEN +
2011 					 BMA2X2_ACC_Z_MSB__LEN));
2012 		z = z >> (sizeof(short) * 8  -  (BMA2X2_ACC_Z14_LSB__LEN +
2013 					 BMA2X2_ACC_Z_MSB__LEN));
2014 		xyz_adc_rang = 0x2000;
2015 		break;
2016 	default:
2017 		return  -1;
2018 	}
2019 #endif
2020 
2021 	axis.x = (pdata->orientation[0]) * x +
2022 		(pdata->orientation[1]) * y +
2023 		(pdata->orientation[2]) * z;
2024 	axis.y = (pdata->orientation[3]) * x +
2025 		(pdata->orientation[4]) * y +
2026 		(pdata->orientation[5]) * z;
2027 	axis.z = (pdata->orientation[6]) * x +
2028 		(pdata->orientation[7]) * y +
2029 		(pdata->orientation[8]) * z;
2030 
2031 	axis.x = axis.x * (BMA2XX_RANGE / xyz_adc_rang);
2032 	axis.y = axis.y * (BMA2XX_RANGE / xyz_adc_rang);
2033 	axis.z = axis.z * (BMA2XX_RANGE / xyz_adc_rang);
2034 
2035 	bma2x2_remap_sensor_data(client, &axis);
2036 
2037 	gsensor_report_value(client, &axis);
2038 	mutex_lock(&sensor->data_mutex);
2039 	sensor->axis = axis;
2040 	mutex_unlock(&sensor->data_mutex);
2041 
2042 	if ((sensor->pdata->irq_enable) && (sensor->ops->int_status_reg >= 0)) {
2043 		value = sensor_read_reg(client, sensor->ops->int_status_reg);
2044 		DBG("%s:sensor int status :0x%x\n", __func__, value);
2045 	}
2046 
2047 	return comres;
2048 }
2049 #endif /* defined(BMA2X2_ENABLE_INT1) |  | defined(BMA2X2_ENABLE_INT2) */
2050 
2051 /****************operate according to sensor chip:start************/
sensor_active(struct i2c_client * client,int enable,int rate)2052 static int sensor_active(struct i2c_client *client, int enable, int rate)
2053 {
2054 	if (enable)
2055 		bma2x2_set_mode(client, BMA2X2_MODE_NORMAL);
2056 	else
2057 		bma2x2_set_mode(client, BMA2X2_MODE_SUSPEND);
2058 
2059 	return 0;
2060 }
2061 
sensor_init(struct i2c_client * client)2062 static int sensor_init(struct i2c_client *client)
2063 {
2064 	int ret = 0;
2065 	int i = 0;
2066 	unsigned char id_reg;
2067 	unsigned char id_data = 0;
2068 	struct sensor_private_data *sensor =
2069 	    (struct sensor_private_data *)i2c_get_clientdata(client);
2070 
2071 	ret = sensor->ops->active(client, 0, 0);
2072 	if (ret) {
2073 		DBG("%s:line=%d,error\n", __func__, __LINE__);
2074 		return ret;
2075 	}
2076 	sensor->status_cur = SENSOR_OFF;
2077 	/* read chip id */
2078 	id_reg = sensor->ops->id_reg;
2079 	for (i = 0; i < 3; i++) {
2080 		ret = sensor_rx_data(client, &id_reg, 1);
2081 		id_data = id_reg;
2082 		if (!ret)
2083 			break;
2084 	}
2085 	if (ret) {
2086 		DBG("%s:fail to read id,ret=%d\n", __func__, ret);
2087 		return ret;
2088 	}
2089 	sensor->devid = id_data;
2090 
2091 	ret = bma2x2_set_bandwidth(client, BMA2X2_BW_SET);
2092 	if (ret < 0)
2093 		DBG("set bandwidth failed!\n");
2094 
2095 	ret = bma2x2_set_range(client, BMA2X2_RANGE_SET);
2096 	if (ret < 0)
2097 		DBG("set g - range failed!\n");
2098 
2099 #if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2)
2100 		bma2x2_set_int_mode(client, 1);/*latch interrupt 250ms*/
2101 #endif
2102 
2103 #ifdef BMA2X2_ENABLE_INT1
2104 		/* maps interrupt to INT1 pin */
2105 		bma2x2_set_int1_pad_sel(client, PAD_LOWG);
2106 		bma2x2_set_int1_pad_sel(client, PAD_HIGHG);
2107 		bma2x2_set_int1_pad_sel(client, PAD_SLOP);
2108 		bma2x2_set_int1_pad_sel(client, PAD_DOUBLE_TAP);
2109 		bma2x2_set_int1_pad_sel(client, PAD_SINGLE_TAP);
2110 		bma2x2_set_int1_pad_sel(client, PAD_ORIENT);
2111 		bma2x2_set_int1_pad_sel(client, PAD_FLAT);
2112 		bma2x2_set_int1_pad_sel(client, PAD_SLOW_NO_MOTION);
2113 #endif
2114 
2115 #ifdef BMA2X2_ENABLE_INT2
2116 		/* maps interrupt to INT2 pin */
2117 		bma2x2_set_int2_pad_sel(client, PAD_LOWG);
2118 		bma2x2_set_int2_pad_sel(client, PAD_HIGHG);
2119 		bma2x2_set_int2_pad_sel(client, PAD_SLOP);
2120 		bma2x2_set_int2_pad_sel(client, PAD_DOUBLE_TAP);
2121 		bma2x2_set_int2_pad_sel(client, PAD_SINGLE_TAP);
2122 		bma2x2_set_int2_pad_sel(client, PAD_ORIENT);
2123 		bma2x2_set_int2_pad_sel(client, PAD_FLAT);
2124 		bma2x2_set_int2_pad_sel(client, PAD_SLOW_NO_MOTION);
2125 #endif
2126 
2127 	bma2x2_parse_dt(client);
2128 	if (sensor->pdata->irq_enable) {
2129 		ret = sensor_write_reg(client, BMA2X2_INT_CTRL_REG, 0x01);
2130 		if (ret) {
2131 			dev_err(&client->dev, "interrupt register setting failed!\n");
2132 			return ret;
2133 		}
2134 		if (slope_mode) {
2135 			ret = sensor_write_reg(client,
2136 					       BMA2X2_INT1_PAD_SEL_REG,
2137 					       0x04);
2138 			if (ret) {
2139 				dev_err(&client->dev, "interrupt map register setting failed!\n");
2140 				return ret;
2141 			}
2142 			ret = sensor_write_reg(client,
2143 					       BMA2X2_SLOPE_DURN_REG,
2144 					       interrupt_dur);
2145 			if (ret) {
2146 				dev_err(&client->dev, "interrupt delay time register setting failed!\n");
2147 				return ret;
2148 			}
2149 			ret = sensor_write_reg(client,
2150 					       BMA2X2_SLOPE_THRES_REG,
2151 					       interrupt_threshold);
2152 			if (ret) {
2153 				dev_err(&client->dev, "high - g interrupt threshold setting failed!\n");
2154 				return ret;
2155 			}
2156 			ret = sensor_write_reg(client,
2157 					       BMA2X2_INT_ENABLE1_REG,
2158 					       0x07);
2159 			if (ret) {
2160 				dev_err(&client->dev, "interrupt engines register setting failed!\n");
2161 				return ret;
2162 			}
2163 		} else if (high_g_mode) {
2164 			ret = sensor_write_reg(client,
2165 					       BMA2X2_INT1_PAD_SEL_REG,
2166 					       0x02);
2167 			if (ret) {
2168 				dev_err(&client->dev, "interrupt map register setting failed!\n");
2169 				return ret;
2170 			}
2171 			ret = sensor_write_reg(client,
2172 					       BMA2X2_HIGH_DURN_REG,
2173 					       interrupt_dur);
2174 			if (ret) {
2175 				dev_err(&client->dev, "interrupt delay time register setting failed!\n");
2176 				return ret;
2177 			}
2178 			ret = sensor_write_reg(client,
2179 					       BMA2X2_HIGH_THRES_REG,
2180 					       interrupt_threshold);
2181 			if (ret) {
2182 				dev_err(&client->dev, "high - g interrupt threshold setting failed!\n");
2183 				return ret;
2184 			}
2185 			ret = sensor_write_reg(client,
2186 					       BMA2X2_INT_ENABLE2_REG,
2187 					       0x03);
2188 			if (ret) {
2189 				dev_err(&client->dev, "interrupt engines register setting failed!\n");
2190 				return ret;
2191 			}
2192 		} else {
2193 			ret = sensor_write_reg(client,
2194 					       BMA2X2_INT_DATA_SEL_REG,
2195 					       0x01);
2196 			if (ret) {
2197 				dev_err(&client->dev, "interrupt map register setting failed!\n");
2198 				return ret;
2199 			}
2200 			ret = sensor_write_reg(client,
2201 					       BMA2X2_INT_ENABLE2_REG,
2202 					       0x10);
2203 			if (ret) {
2204 				dev_err(&client->dev, "interrupt engines register setting failed!\n");
2205 				return ret;
2206 			}
2207 		}
2208 	}
2209 
2210 	return ret;
2211 }
2212 
2213 static struct sensor_operate gsensor_bma2x2_ops = {
2214 	.name		= "bma2xx_acc",
2215 	/*sensor type and it should be correct*/
2216 	.type		= SENSOR_TYPE_ACCEL,
2217 	.id_i2c		= ACCEL_ID_BMA2XX,	/*i2c id number*/
2218 	.read_reg	= BMA2X2_X_AXIS_LSB_REG,/*read data*/
2219 	.read_len	= 6,			/*data length*/
2220 	/* read device id from this register */
2221 	.id_reg		= BMA2X2_CHIP_ID_REG,
2222 	.id_data	= BMA250_CHIP_ID,	/* device id */
2223 	.precision	= SENSOR_UNKNOW_DATA,	/*12 bit*/
2224 	.ctrl_reg	= BMA2X2_MODE_CTRL_REG,	/*enable or disable*/
2225 	/*intterupt status register*/
2226 	.int_status_reg	= BMA2X2_STATUS2_REG,
2227 	.range		= {-BMA2XX_RANGE, BMA2XX_RANGE},/*range*/
2228 	.trig		= IRQF_TRIGGER_HIGH  |  IRQF_ONESHOT,
2229 	.active		= sensor_active,
2230 	.init		= sensor_init,
2231 	.report		= sensor_report_value,
2232 };
2233 
2234 /****************operate according to sensor chip:end************/
gsensor_bma2x2_probe(struct i2c_client * client,const struct i2c_device_id * devid)2235 static int gsensor_bma2x2_probe(struct i2c_client *client,
2236 				 const struct i2c_device_id *devid)
2237 {
2238 	return sensor_register_device(client, NULL, devid, &gsensor_bma2x2_ops);
2239 }
2240 
gsensor_bma2x2_remove(struct i2c_client * client)2241 static int gsensor_bma2x2_remove(struct i2c_client *client)
2242 {
2243 	return sensor_unregister_device(client, NULL, &gsensor_bma2x2_ops);
2244 }
2245 
2246 static const struct i2c_device_id gsensor_bma2x2_id[] = {
2247 	{"bma2xx_acc", ACCEL_ID_BMA2XX},
2248 	{}
2249 };
2250 
2251 static struct i2c_driver gsensor_bma2x2_driver = {
2252 	.probe = gsensor_bma2x2_probe,
2253 	.remove = gsensor_bma2x2_remove,
2254 	.shutdown = sensor_shutdown,
2255 	.id_table = gsensor_bma2x2_id,
2256 	.driver = {
2257 		.name = "gsensor_bma2x2",
2258 #ifdef CONFIG_PM
2259 		.pm = &sensor_pm_ops,
2260 #endif
2261 	},
2262 };
2263 
2264 module_i2c_driver(gsensor_bma2x2_driver);
2265 
2266 MODULE_AUTHOR("Bin Yang <yangbin@rock - chips.com>");
2267 MODULE_DESCRIPTION("bma2x2 3-Axis accelerometer driver");
2268 MODULE_LICENSE("GPL");
2269