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