Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
/*
 * drivers/input/sensors/accel/bma2xx.c
 *
 * Copyright (C) Fuzhou Rockchip Electronics Co.Ltd
 *
 * Author: Bin Yang <yangbin@rock - chips.com>
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/i2c.h>
#include <linux/input.h>
#include <linux/workqueue.h>
#include <linux/mutex.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#endif
#include <linux/sensor-dev.h>

#define BMA2X2_RANGE_SET		3  /* +/ -  2G */
#define BMA2X2_BW_SET			12 /* 125HZ  */

#define LOW_G_INTERRUPT				REL_Z
#define HIGH_G_INTERRUPT			REL_HWHEEL
#define SLOP_INTERRUPT				REL_DIAL
#define DOUBLE_TAP_INTERRUPT			REL_WHEEL
#define SINGLE_TAP_INTERRUPT			REL_MISC
#define ORIENT_INTERRUPT			ABS_PRESSURE
#define FLAT_INTERRUPT				ABS_DISTANCE
#define SLOW_NO_MOTION_INTERRUPT		REL_Y

#define HIGH_G_INTERRUPT_X_HAPPENED			1
#define HIGH_G_INTERRUPT_Y_HAPPENED			2
#define HIGH_G_INTERRUPT_Z_HAPPENED			3
#define HIGH_G_INTERRUPT_X_NEGATIVE_HAPPENED		4
#define HIGH_G_INTERRUPT_Y_NEGATIVE_HAPPENED		5
#define HIGH_G_INTERRUPT_Z_NEGATIVE_HAPPENED		6
#define SLOPE_INTERRUPT_X_HAPPENED			7
#define SLOPE_INTERRUPT_Y_HAPPENED			8
#define SLOPE_INTERRUPT_Z_HAPPENED			9
#define SLOPE_INTERRUPT_X_NEGATIVE_HAPPENED		10
#define SLOPE_INTERRUPT_Y_NEGATIVE_HAPPENED		11
#define SLOPE_INTERRUPT_Z_NEGATIVE_HAPPENED		12
#define DOUBLE_TAP_INTERRUPT_HAPPENED			13
#define SINGLE_TAP_INTERRUPT_HAPPENED			14
#define UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED		15
#define UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED		16
#define UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED	17
#define UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED	18
#define DOWNWARD_PORTRAIT_UP_INTERRUPT_HAPPENED	19
#define DOWNWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED	20
#define DOWNWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED	21
#define DOWNWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED	22
#define FLAT_INTERRUPT_TRUE_HAPPENED			23
#define FLAT_INTERRUPT_FALSE_HAPPENED			24
#define LOW_G_INTERRUPT_HAPPENED			25
#define SLOW_NO_MOTION_INTERRUPT_HAPPENED		26

#define PAD_LOWG					0
#define PAD_HIGHG					1
#define PAD_SLOP					2
#define PAD_DOUBLE_TAP					3
#define PAD_SINGLE_TAP					4
#define PAD_ORIENT					5
#define PAD_FLAT					6
#define PAD_SLOW_NO_MOTION				7

#define BMA2X2_CHIP_ID_REG                      0x00
#define BMA2X2_VERSION_REG                      0x01
#define BMA2X2_X_AXIS_LSB_REG                   0x02
#define BMA2X2_X_AXIS_MSB_REG                   0x03
#define BMA2X2_Y_AXIS_LSB_REG                   0x04
#define BMA2X2_Y_AXIS_MSB_REG                   0x05
#define BMA2X2_Z_AXIS_LSB_REG                   0x06
#define BMA2X2_Z_AXIS_MSB_REG                   0x07
#define BMA2X2_TEMPERATURE_REG                  0x08
#define BMA2X2_STATUS1_REG                      0x09
#define BMA2X2_STATUS2_REG                      0x0A
#define BMA2X2_STATUS_TAP_SLOPE_REG             0x0B
#define BMA2X2_STATUS_ORIENT_HIGH_REG           0x0C
#define BMA2X2_STATUS_FIFO_REG                  0x0E
#define BMA2X2_RANGE_SEL_REG                    0x0F
#define BMA2X2_BW_SEL_REG                       0x10
#define BMA2X2_MODE_CTRL_REG                    0x11
#define BMA2X2_LOW_NOISE_CTRL_REG               0x12
#define BMA2X2_DATA_CTRL_REG                    0x13
#define BMA2X2_RESET_REG                        0x14
#define BMA2X2_INT_ENABLE1_REG                  0x16
#define BMA2X2_INT_ENABLE2_REG                  0x17
#define BMA2X2_INT_SLO_NO_MOT_REG               0x18
#define BMA2X2_INT1_PAD_SEL_REG                 0x19
#define BMA2X2_INT_DATA_SEL_REG                 0x1A
#define BMA2X2_INT2_PAD_SEL_REG                 0x1B
#define BMA2X2_INT_SRC_REG                      0x1E
#define BMA2X2_INT_SET_REG                      0x20
#define BMA2X2_INT_CTRL_REG                     0x21
#define BMA2X2_LOW_DURN_REG                     0x22
#define BMA2X2_LOW_THRES_REG                    0x23
#define BMA2X2_LOW_HIGH_HYST_REG                0x24
#define BMA2X2_HIGH_DURN_REG                    0x25
#define BMA2X2_HIGH_THRES_REG                   0x26
#define BMA2X2_SLOPE_DURN_REG                   0x27
#define BMA2X2_SLOPE_THRES_REG                  0x28
#define BMA2X2_SLO_NO_MOT_THRES_REG             0x29
#define BMA2X2_TAP_PARAM_REG                    0x2A
#define BMA2X2_TAP_THRES_REG                    0x2B
#define BMA2X2_ORIENT_PARAM_REG                 0x2C
#define BMA2X2_THETA_BLOCK_REG                  0x2D
#define BMA2X2_THETA_FLAT_REG                   0x2E
#define BMA2X2_FLAT_HOLD_TIME_REG               0x2F
#define BMA2X2_FIFO_WML_TRIG                    0x30
#define BMA2X2_SELF_TEST_REG                    0x32
#define BMA2X2_EEPROM_CTRL_REG                  0x33
#define BMA2X2_SERIAL_CTRL_REG                  0x34
#define BMA2X2_EXTMODE_CTRL_REG                 0x35
#define BMA2X2_OFFSET_CTRL_REG                  0x36
#define BMA2X2_OFFSET_PARAMS_REG                0x37
#define BMA2X2_OFFSET_X_AXIS_REG                0x38
#define BMA2X2_OFFSET_Y_AXIS_REG                0x39
#define BMA2X2_OFFSET_Z_AXIS_REG                0x3A
#define BMA2X2_GP0_REG                          0x3B
#define BMA2X2_GP1_REG                          0x3C
#define BMA2X2_FIFO_MODE_REG                    0x3E
#define BMA2X2_FIFO_DATA_OUTPUT_REG             0x3F

#define BMA2X2_CHIP_ID__POS             0
#define BMA2X2_CHIP_ID__MSK             0xFF
#define BMA2X2_CHIP_ID__LEN             8
#define BMA2X2_CHIP_ID__REG             BMA2X2_CHIP_ID_REG

#define BMA2X2_VERSION__POS          0
#define BMA2X2_VERSION__LEN          8
#define BMA2X2_VERSION__MSK          0xFF
#define BMA2X2_VERSION__REG          BMA2X2_VERSION_REG

#define BMA2x2_SLO_NO_MOT_DUR__POS	2
#define BMA2x2_SLO_NO_MOT_DUR__LEN	6
#define BMA2x2_SLO_NO_MOT_DUR__MSK	0xFC
#define BMA2x2_SLO_NO_MOT_DUR__REG	BMA2X2_SLOPE_DURN_REG

#define BMA2X2_NEW_DATA_X__POS          0
#define BMA2X2_NEW_DATA_X__LEN          1
#define BMA2X2_NEW_DATA_X__MSK          0x01
#define BMA2X2_NEW_DATA_X__REG          BMA2X2_X_AXIS_LSB_REG

#define BMA2X2_ACC_X14_LSB__POS           2
#define BMA2X2_ACC_X14_LSB__LEN           6
#define BMA2X2_ACC_X14_LSB__MSK           0xFC
#define BMA2X2_ACC_X14_LSB__REG           BMA2X2_X_AXIS_LSB_REG

#define BMA2X2_ACC_X12_LSB__POS           4
#define BMA2X2_ACC_X12_LSB__LEN           4
#define BMA2X2_ACC_X12_LSB__MSK           0xF0
#define BMA2X2_ACC_X12_LSB__REG           BMA2X2_X_AXIS_LSB_REG

#define BMA2X2_ACC_X10_LSB__POS           6
#define BMA2X2_ACC_X10_LSB__LEN           2
#define BMA2X2_ACC_X10_LSB__MSK           0xC0
#define BMA2X2_ACC_X10_LSB__REG           BMA2X2_X_AXIS_LSB_REG

#define BMA2X2_ACC_X8_LSB__POS           0
#define BMA2X2_ACC_X8_LSB__LEN           0
#define BMA2X2_ACC_X8_LSB__MSK           0x00
#define BMA2X2_ACC_X8_LSB__REG           BMA2X2_X_AXIS_LSB_REG

#define BMA2X2_ACC_X_MSB__POS           0
#define BMA2X2_ACC_X_MSB__LEN           8
#define BMA2X2_ACC_X_MSB__MSK           0xFF
#define BMA2X2_ACC_X_MSB__REG           BMA2X2_X_AXIS_MSB_REG

#define BMA2X2_NEW_DATA_Y__POS          0
#define BMA2X2_NEW_DATA_Y__LEN          1
#define BMA2X2_NEW_DATA_Y__MSK          0x01
#define BMA2X2_NEW_DATA_Y__REG          BMA2X2_Y_AXIS_LSB_REG

#define BMA2X2_ACC_Y14_LSB__POS           2
#define BMA2X2_ACC_Y14_LSB__LEN           6
#define BMA2X2_ACC_Y14_LSB__MSK           0xFC
#define BMA2X2_ACC_Y14_LSB__REG           BMA2X2_Y_AXIS_LSB_REG

#define BMA2X2_ACC_Y12_LSB__POS           4
#define BMA2X2_ACC_Y12_LSB__LEN           4
#define BMA2X2_ACC_Y12_LSB__MSK           0xF0
#define BMA2X2_ACC_Y12_LSB__REG           BMA2X2_Y_AXIS_LSB_REG

#define BMA2X2_ACC_Y10_LSB__POS           6
#define BMA2X2_ACC_Y10_LSB__LEN           2
#define BMA2X2_ACC_Y10_LSB__MSK           0xC0
#define BMA2X2_ACC_Y10_LSB__REG           BMA2X2_Y_AXIS_LSB_REG

#define BMA2X2_ACC_Y8_LSB__POS           0
#define BMA2X2_ACC_Y8_LSB__LEN           0
#define BMA2X2_ACC_Y8_LSB__MSK           0x00
#define BMA2X2_ACC_Y8_LSB__REG           BMA2X2_Y_AXIS_LSB_REG

#define BMA2X2_ACC_Y_MSB__POS           0
#define BMA2X2_ACC_Y_MSB__LEN           8
#define BMA2X2_ACC_Y_MSB__MSK           0xFF
#define BMA2X2_ACC_Y_MSB__REG           BMA2X2_Y_AXIS_MSB_REG

#define BMA2X2_NEW_DATA_Z__POS          0
#define BMA2X2_NEW_DATA_Z__LEN          1
#define BMA2X2_NEW_DATA_Z__MSK          0x01
#define BMA2X2_NEW_DATA_Z__REG          BMA2X2_Z_AXIS_LSB_REG

#define BMA2X2_ACC_Z14_LSB__POS           2
#define BMA2X2_ACC_Z14_LSB__LEN           6
#define BMA2X2_ACC_Z14_LSB__MSK           0xFC
#define BMA2X2_ACC_Z14_LSB__REG           BMA2X2_Z_AXIS_LSB_REG

#define BMA2X2_ACC_Z12_LSB__POS           4
#define BMA2X2_ACC_Z12_LSB__LEN           4
#define BMA2X2_ACC_Z12_LSB__MSK           0xF0
#define BMA2X2_ACC_Z12_LSB__REG           BMA2X2_Z_AXIS_LSB_REG

#define BMA2X2_ACC_Z10_LSB__POS           6
#define BMA2X2_ACC_Z10_LSB__LEN           2
#define BMA2X2_ACC_Z10_LSB__MSK           0xC0
#define BMA2X2_ACC_Z10_LSB__REG           BMA2X2_Z_AXIS_LSB_REG

#define BMA2X2_ACC_Z8_LSB__POS           0
#define BMA2X2_ACC_Z8_LSB__LEN           0
#define BMA2X2_ACC_Z8_LSB__MSK           0x00
#define BMA2X2_ACC_Z8_LSB__REG           BMA2X2_Z_AXIS_LSB_REG

#define BMA2X2_ACC_Z_MSB__POS           0
#define BMA2X2_ACC_Z_MSB__LEN           8
#define BMA2X2_ACC_Z_MSB__MSK           0xFF
#define BMA2X2_ACC_Z_MSB__REG           BMA2X2_Z_AXIS_MSB_REG

#define BMA2X2_TEMPERATURE__POS         0
#define BMA2X2_TEMPERATURE__LEN         8
#define BMA2X2_TEMPERATURE__MSK         0xFF
#define BMA2X2_TEMPERATURE__REG         BMA2X2_TEMP_RD_REG

#define BMA2X2_LOWG_INT_S__POS          0
#define BMA2X2_LOWG_INT_S__LEN          1
#define BMA2X2_LOWG_INT_S__MSK          0x01
#define BMA2X2_LOWG_INT_S__REG          BMA2X2_STATUS1_REG

#define BMA2X2_HIGHG_INT_S__POS          1
#define BMA2X2_HIGHG_INT_S__LEN          1
#define BMA2X2_HIGHG_INT_S__MSK          0x02
#define BMA2X2_HIGHG_INT_S__REG          BMA2X2_STATUS1_REG

#define BMA2X2_SLOPE_INT_S__POS          2
#define BMA2X2_SLOPE_INT_S__LEN          1
#define BMA2X2_SLOPE_INT_S__MSK          0x04
#define BMA2X2_SLOPE_INT_S__REG          BMA2X2_STATUS1_REG

#define BMA2X2_SLO_NO_MOT_INT_S__POS          3
#define BMA2X2_SLO_NO_MOT_INT_S__LEN          1
#define BMA2X2_SLO_NO_MOT_INT_S__MSK          0x08
#define BMA2X2_SLO_NO_MOT_INT_S__REG          BMA2X2_STATUS1_REG

#define BMA2X2_DOUBLE_TAP_INT_S__POS     4
#define BMA2X2_DOUBLE_TAP_INT_S__LEN     1
#define BMA2X2_DOUBLE_TAP_INT_S__MSK     0x10
#define BMA2X2_DOUBLE_TAP_INT_S__REG     BMA2X2_STATUS1_REG

#define BMA2X2_SINGLE_TAP_INT_S__POS     5
#define BMA2X2_SINGLE_TAP_INT_S__LEN     1
#define BMA2X2_SINGLE_TAP_INT_S__MSK     0x20
#define BMA2X2_SINGLE_TAP_INT_S__REG     BMA2X2_STATUS1_REG

#define BMA2X2_ORIENT_INT_S__POS         6
#define BMA2X2_ORIENT_INT_S__LEN         1
#define BMA2X2_ORIENT_INT_S__MSK         0x40
#define BMA2X2_ORIENT_INT_S__REG         BMA2X2_STATUS1_REG

#define BMA2X2_FLAT_INT_S__POS           7
#define BMA2X2_FLAT_INT_S__LEN           1
#define BMA2X2_FLAT_INT_S__MSK           0x80
#define BMA2X2_FLAT_INT_S__REG           BMA2X2_STATUS1_REG

#define BMA2X2_FIFO_FULL_INT_S__POS           5
#define BMA2X2_FIFO_FULL_INT_S__LEN           1
#define BMA2X2_FIFO_FULL_INT_S__MSK           0x20
#define BMA2X2_FIFO_FULL_INT_S__REG           BMA2X2_STATUS2_REG

#define BMA2X2_FIFO_WM_INT_S__POS           6
#define BMA2X2_FIFO_WM_INT_S__LEN           1
#define BMA2X2_FIFO_WM_INT_S__MSK           0x40
#define BMA2X2_FIFO_WM_INT_S__REG           BMA2X2_STATUS2_REG

#define BMA2X2_DATA_INT_S__POS           7
#define BMA2X2_DATA_INT_S__LEN           1
#define BMA2X2_DATA_INT_S__MSK           0x80
#define BMA2X2_DATA_INT_S__REG           BMA2X2_STATUS2_REG

#define BMA2X2_SLOPE_FIRST_X__POS        0
#define BMA2X2_SLOPE_FIRST_X__LEN        1
#define BMA2X2_SLOPE_FIRST_X__MSK        0x01
#define BMA2X2_SLOPE_FIRST_X__REG        BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_SLOPE_FIRST_Y__POS        1
#define BMA2X2_SLOPE_FIRST_Y__LEN        1
#define BMA2X2_SLOPE_FIRST_Y__MSK        0x02
#define BMA2X2_SLOPE_FIRST_Y__REG        BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_SLOPE_FIRST_Z__POS        2
#define BMA2X2_SLOPE_FIRST_Z__LEN        1
#define BMA2X2_SLOPE_FIRST_Z__MSK        0x04
#define BMA2X2_SLOPE_FIRST_Z__REG        BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_SLOPE_SIGN_S__POS         3
#define BMA2X2_SLOPE_SIGN_S__LEN         1
#define BMA2X2_SLOPE_SIGN_S__MSK         0x08
#define BMA2X2_SLOPE_SIGN_S__REG         BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_TAP_FIRST_X__POS        4
#define BMA2X2_TAP_FIRST_X__LEN        1
#define BMA2X2_TAP_FIRST_X__MSK        0x10
#define BMA2X2_TAP_FIRST_X__REG        BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_TAP_FIRST_Y__POS        5
#define BMA2X2_TAP_FIRST_Y__LEN        1
#define BMA2X2_TAP_FIRST_Y__MSK        0x20
#define BMA2X2_TAP_FIRST_Y__REG        BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_TAP_FIRST_Z__POS        6
#define BMA2X2_TAP_FIRST_Z__LEN        1
#define BMA2X2_TAP_FIRST_Z__MSK        0x40
#define BMA2X2_TAP_FIRST_Z__REG        BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_TAP_SIGN_S__POS         7
#define BMA2X2_TAP_SIGN_S__LEN         1
#define BMA2X2_TAP_SIGN_S__MSK         0x80
#define BMA2X2_TAP_SIGN_S__REG         BMA2X2_STATUS_TAP_SLOPE_REG

#define BMA2X2_HIGHG_FIRST_X__POS        0
#define BMA2X2_HIGHG_FIRST_X__LEN        1
#define BMA2X2_HIGHG_FIRST_X__MSK        0x01
#define BMA2X2_HIGHG_FIRST_X__REG        BMA2X2_STATUS_ORIENT_HIGH_REG

#define BMA2X2_HIGHG_FIRST_Y__POS        1
#define BMA2X2_HIGHG_FIRST_Y__LEN        1
#define BMA2X2_HIGHG_FIRST_Y__MSK        0x02
#define BMA2X2_HIGHG_FIRST_Y__REG        BMA2X2_STATUS_ORIENT_HIGH_REG

#define BMA2X2_HIGHG_FIRST_Z__POS        2
#define BMA2X2_HIGHG_FIRST_Z__LEN        1
#define BMA2X2_HIGHG_FIRST_Z__MSK        0x04
#define BMA2X2_HIGHG_FIRST_Z__REG        BMA2X2_STATUS_ORIENT_HIGH_REG

#define BMA2X2_HIGHG_SIGN_S__POS         3
#define BMA2X2_HIGHG_SIGN_S__LEN         1
#define BMA2X2_HIGHG_SIGN_S__MSK         0x08
#define BMA2X2_HIGHG_SIGN_S__REG         BMA2X2_STATUS_ORIENT_HIGH_REG

#define BMA2X2_ORIENT_S__POS             4
#define BMA2X2_ORIENT_S__LEN             3
#define BMA2X2_ORIENT_S__MSK             0x70
#define BMA2X2_ORIENT_S__REG             BMA2X2_STATUS_ORIENT_HIGH_REG

#define BMA2X2_FLAT_S__POS               7
#define BMA2X2_FLAT_S__LEN               1
#define BMA2X2_FLAT_S__MSK               0x80
#define BMA2X2_FLAT_S__REG               BMA2X2_STATUS_ORIENT_HIGH_REG

#define BMA2X2_FIFO_FRAME_COUNTER_S__POS             0
#define BMA2X2_FIFO_FRAME_COUNTER_S__LEN             7
#define BMA2X2_FIFO_FRAME_COUNTER_S__MSK             0x7F
#define BMA2X2_FIFO_FRAME_COUNTER_S__REG             BMA2X2_STATUS_FIFO_REG

#define BMA2X2_FIFO_OVERRUN_S__POS             7
#define BMA2X2_FIFO_OVERRUN_S__LEN             1
#define BMA2X2_FIFO_OVERRUN_S__MSK             0x80
#define BMA2X2_FIFO_OVERRUN_S__REG             BMA2X2_STATUS_FIFO_REG

#define BMA2X2_RANGE_SEL__POS             0
#define BMA2X2_RANGE_SEL__LEN             4
#define BMA2X2_RANGE_SEL__MSK             0x0F
#define BMA2X2_RANGE_SEL__REG             BMA2X2_RANGE_SEL_REG

#define BMA2X2_BANDWIDTH__POS             0
#define BMA2X2_BANDWIDTH__LEN             5
#define BMA2X2_BANDWIDTH__MSK             0x1F
#define BMA2X2_BANDWIDTH__REG             BMA2X2_BW_SEL_REG

#define BMA2X2_SLEEP_DUR__POS             1
#define BMA2X2_SLEEP_DUR__LEN             4
#define BMA2X2_SLEEP_DUR__MSK             0x1E
#define BMA2X2_SLEEP_DUR__REG             BMA2X2_MODE_CTRL_REG

#define BMA2X2_MODE_CTRL__POS             5
#define BMA2X2_MODE_CTRL__LEN             3
#define BMA2X2_MODE_CTRL__MSK             0xE0
#define BMA2X2_MODE_CTRL__REG             BMA2X2_MODE_CTRL_REG

#define BMA2X2_DEEP_SUSPEND__POS          5
#define BMA2X2_DEEP_SUSPEND__LEN          1
#define BMA2X2_DEEP_SUSPEND__MSK          0x20
#define BMA2X2_DEEP_SUSPEND__REG          BMA2X2_MODE_CTRL_REG

#define BMA2X2_EN_LOW_POWER__POS          6
#define BMA2X2_EN_LOW_POWER__LEN          1
#define BMA2X2_EN_LOW_POWER__MSK          0x40
#define BMA2X2_EN_LOW_POWER__REG          BMA2X2_MODE_CTRL_REG

#define BMA2X2_EN_SUSPEND__POS            7
#define BMA2X2_EN_SUSPEND__LEN            1
#define BMA2X2_EN_SUSPEND__MSK            0x80
#define BMA2X2_EN_SUSPEND__REG            BMA2X2_MODE_CTRL_REG

#define BMA2X2_SLEEP_TIMER__POS          5
#define BMA2X2_SLEEP_TIMER__LEN          1
#define BMA2X2_SLEEP_TIMER__MSK          0x20
#define BMA2X2_SLEEP_TIMER__REG          BMA2X2_LOW_NOISE_CTRL_REG

#define BMA2X2_LOW_POWER_MODE__POS          6
#define BMA2X2_LOW_POWER_MODE__LEN          1
#define BMA2X2_LOW_POWER_MODE__MSK          0x40
#define BMA2X2_LOW_POWER_MODE__REG          BMA2X2_LOW_NOISE_CTRL_REG

#define BMA2X2_EN_LOW_NOISE__POS          7
#define BMA2X2_EN_LOW_NOISE__LEN          1
#define BMA2X2_EN_LOW_NOISE__MSK          0x80
#define BMA2X2_EN_LOW_NOISE__REG          BMA2X2_LOW_NOISE_CTRL_REG

#define BMA2X2_DIS_SHADOW_PROC__POS       6
#define BMA2X2_DIS_SHADOW_PROC__LEN       1
#define BMA2X2_DIS_SHADOW_PROC__MSK       0x40
#define BMA2X2_DIS_SHADOW_PROC__REG       BMA2X2_DATA_CTRL_REG

#define BMA2X2_EN_DATA_HIGH_BW__POS         7
#define BMA2X2_EN_DATA_HIGH_BW__LEN         1
#define BMA2X2_EN_DATA_HIGH_BW__MSK         0x80
#define BMA2X2_EN_DATA_HIGH_BW__REG         BMA2X2_DATA_CTRL_REG

#define BMA2X2_EN_SOFT_RESET__POS         0
#define BMA2X2_EN_SOFT_RESET__LEN         8
#define BMA2X2_EN_SOFT_RESET__MSK         0xFF
#define BMA2X2_EN_SOFT_RESET__REG         BMA2X2_RESET_REG

#define BMA2X2_EN_SOFT_RESET_VALUE        0xB6

#define BMA2X2_EN_SLOPE_X_INT__POS         0
#define BMA2X2_EN_SLOPE_X_INT__LEN         1
#define BMA2X2_EN_SLOPE_X_INT__MSK         0x01
#define BMA2X2_EN_SLOPE_X_INT__REG         BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_SLOPE_Y_INT__POS         1
#define BMA2X2_EN_SLOPE_Y_INT__LEN         1
#define BMA2X2_EN_SLOPE_Y_INT__MSK         0x02
#define BMA2X2_EN_SLOPE_Y_INT__REG         BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_SLOPE_Z_INT__POS         2
#define BMA2X2_EN_SLOPE_Z_INT__LEN         1
#define BMA2X2_EN_SLOPE_Z_INT__MSK         0x04
#define BMA2X2_EN_SLOPE_Z_INT__REG         BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_DOUBLE_TAP_INT__POS      4
#define BMA2X2_EN_DOUBLE_TAP_INT__LEN      1
#define BMA2X2_EN_DOUBLE_TAP_INT__MSK      0x10
#define BMA2X2_EN_DOUBLE_TAP_INT__REG      BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_SINGLE_TAP_INT__POS      5
#define BMA2X2_EN_SINGLE_TAP_INT__LEN      1
#define BMA2X2_EN_SINGLE_TAP_INT__MSK      0x20
#define BMA2X2_EN_SINGLE_TAP_INT__REG      BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_ORIENT_INT__POS          6
#define BMA2X2_EN_ORIENT_INT__LEN          1
#define BMA2X2_EN_ORIENT_INT__MSK          0x40
#define BMA2X2_EN_ORIENT_INT__REG          BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_FLAT_INT__POS            7
#define BMA2X2_EN_FLAT_INT__LEN            1
#define BMA2X2_EN_FLAT_INT__MSK            0x80
#define BMA2X2_EN_FLAT_INT__REG            BMA2X2_INT_ENABLE1_REG

#define BMA2X2_EN_HIGHG_X_INT__POS         0
#define BMA2X2_EN_HIGHG_X_INT__LEN         1
#define BMA2X2_EN_HIGHG_X_INT__MSK         0x01
#define BMA2X2_EN_HIGHG_X_INT__REG         BMA2X2_INT_ENABLE2_REG

#define BMA2X2_EN_HIGHG_Y_INT__POS         1
#define BMA2X2_EN_HIGHG_Y_INT__LEN         1
#define BMA2X2_EN_HIGHG_Y_INT__MSK         0x02
#define BMA2X2_EN_HIGHG_Y_INT__REG         BMA2X2_INT_ENABLE2_REG

#define BMA2X2_EN_HIGHG_Z_INT__POS         2
#define BMA2X2_EN_HIGHG_Z_INT__LEN         1
#define BMA2X2_EN_HIGHG_Z_INT__MSK         0x04
#define BMA2X2_EN_HIGHG_Z_INT__REG         BMA2X2_INT_ENABLE2_REG

#define BMA2X2_EN_LOWG_INT__POS            3
#define BMA2X2_EN_LOWG_INT__LEN            1
#define BMA2X2_EN_LOWG_INT__MSK            0x08
#define BMA2X2_EN_LOWG_INT__REG            BMA2X2_INT_ENABLE2_REG

#define BMA2X2_EN_NEW_DATA_INT__POS        4
#define BMA2X2_EN_NEW_DATA_INT__LEN        1
#define BMA2X2_EN_NEW_DATA_INT__MSK        0x10
#define BMA2X2_EN_NEW_DATA_INT__REG        BMA2X2_INT_ENABLE2_REG

#define BMA2X2_INT_FFULL_EN_INT__POS        5
#define BMA2X2_INT_FFULL_EN_INT__LEN        1
#define BMA2X2_INT_FFULL_EN_INT__MSK        0x20
#define BMA2X2_INT_FFULL_EN_INT__REG        BMA2X2_INT_ENABLE2_REG

#define BMA2X2_INT_FWM_EN_INT__POS        6
#define BMA2X2_INT_FWM_EN_INT__LEN        1
#define BMA2X2_INT_FWM_EN_INT__MSK        0x40
#define BMA2X2_INT_FWM_EN_INT__REG        BMA2X2_INT_ENABLE2_REG

#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__POS        0
#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__LEN        1
#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__MSK        0x01
#define BMA2X2_INT_SLO_NO_MOT_EN_X_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG

#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__POS        1
#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__LEN        1
#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__MSK        0x02
#define BMA2X2_INT_SLO_NO_MOT_EN_Y_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG

#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__POS        2
#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__LEN        1
#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__MSK        0x04
#define BMA2X2_INT_SLO_NO_MOT_EN_Z_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG

#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__POS        3
#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__LEN        1
#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__MSK        0x08
#define BMA2X2_INT_SLO_NO_MOT_EN_SEL_INT__REG        BMA2X2_INT_SLO_NO_MOT_REG

#define BMA2X2_EN_INT1_PAD_LOWG__POS        0
#define BMA2X2_EN_INT1_PAD_LOWG__LEN        1
#define BMA2X2_EN_INT1_PAD_LOWG__MSK        0x01
#define BMA2X2_EN_INT1_PAD_LOWG__REG        BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_HIGHG__POS       1
#define BMA2X2_EN_INT1_PAD_HIGHG__LEN       1
#define BMA2X2_EN_INT1_PAD_HIGHG__MSK       0x02
#define BMA2X2_EN_INT1_PAD_HIGHG__REG       BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_SLOPE__POS       2
#define BMA2X2_EN_INT1_PAD_SLOPE__LEN       1
#define BMA2X2_EN_INT1_PAD_SLOPE__MSK       0x04
#define BMA2X2_EN_INT1_PAD_SLOPE__REG       BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__POS        3
#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__LEN        1
#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__MSK        0x08
#define BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG        BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_DB_TAP__POS      4
#define BMA2X2_EN_INT1_PAD_DB_TAP__LEN      1
#define BMA2X2_EN_INT1_PAD_DB_TAP__MSK      0x10
#define BMA2X2_EN_INT1_PAD_DB_TAP__REG      BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_SNG_TAP__POS     5
#define BMA2X2_EN_INT1_PAD_SNG_TAP__LEN     1
#define BMA2X2_EN_INT1_PAD_SNG_TAP__MSK     0x20
#define BMA2X2_EN_INT1_PAD_SNG_TAP__REG     BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_ORIENT__POS      6
#define BMA2X2_EN_INT1_PAD_ORIENT__LEN      1
#define BMA2X2_EN_INT1_PAD_ORIENT__MSK      0x40
#define BMA2X2_EN_INT1_PAD_ORIENT__REG      BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_FLAT__POS        7
#define BMA2X2_EN_INT1_PAD_FLAT__LEN        1
#define BMA2X2_EN_INT1_PAD_FLAT__MSK        0x80
#define BMA2X2_EN_INT1_PAD_FLAT__REG        BMA2X2_INT1_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_LOWG__POS        0
#define BMA2X2_EN_INT2_PAD_LOWG__LEN        1
#define BMA2X2_EN_INT2_PAD_LOWG__MSK        0x01
#define BMA2X2_EN_INT2_PAD_LOWG__REG        BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_HIGHG__POS       1
#define BMA2X2_EN_INT2_PAD_HIGHG__LEN       1
#define BMA2X2_EN_INT2_PAD_HIGHG__MSK       0x02
#define BMA2X2_EN_INT2_PAD_HIGHG__REG       BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_SLOPE__POS       2
#define BMA2X2_EN_INT2_PAD_SLOPE__LEN       1
#define BMA2X2_EN_INT2_PAD_SLOPE__MSK       0x04
#define BMA2X2_EN_INT2_PAD_SLOPE__REG       BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__POS        3
#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__LEN        1
#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__MSK        0x08
#define BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG        BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_DB_TAP__POS      4
#define BMA2X2_EN_INT2_PAD_DB_TAP__LEN      1
#define BMA2X2_EN_INT2_PAD_DB_TAP__MSK      0x10
#define BMA2X2_EN_INT2_PAD_DB_TAP__REG      BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_SNG_TAP__POS     5
#define BMA2X2_EN_INT2_PAD_SNG_TAP__LEN     1
#define BMA2X2_EN_INT2_PAD_SNG_TAP__MSK     0x20
#define BMA2X2_EN_INT2_PAD_SNG_TAP__REG     BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_ORIENT__POS      6
#define BMA2X2_EN_INT2_PAD_ORIENT__LEN      1
#define BMA2X2_EN_INT2_PAD_ORIENT__MSK      0x40
#define BMA2X2_EN_INT2_PAD_ORIENT__REG      BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT2_PAD_FLAT__POS        7
#define BMA2X2_EN_INT2_PAD_FLAT__LEN        1
#define BMA2X2_EN_INT2_PAD_FLAT__MSK        0x80
#define BMA2X2_EN_INT2_PAD_FLAT__REG        BMA2X2_INT2_PAD_SEL_REG

#define BMA2X2_EN_INT1_PAD_NEWDATA__POS     0
#define BMA2X2_EN_INT1_PAD_NEWDATA__LEN     1
#define BMA2X2_EN_INT1_PAD_NEWDATA__MSK     0x01
#define BMA2X2_EN_INT1_PAD_NEWDATA__REG     BMA2X2_INT_DATA_SEL_REG

#define BMA2X2_EN_INT1_PAD_FWM__POS     1
#define BMA2X2_EN_INT1_PAD_FWM__LEN     1
#define BMA2X2_EN_INT1_PAD_FWM__MSK     0x02
#define BMA2X2_EN_INT1_PAD_FWM__REG     BMA2X2_INT_DATA_SEL_REG

#define BMA2X2_EN_INT1_PAD_FFULL__POS     2
#define BMA2X2_EN_INT1_PAD_FFULL__LEN     1
#define BMA2X2_EN_INT1_PAD_FFULL__MSK     0x04
#define BMA2X2_EN_INT1_PAD_FFULL__REG     BMA2X2_INT_DATA_SEL_REG

#define BMA2X2_EN_INT2_PAD_FFULL__POS     5
#define BMA2X2_EN_INT2_PAD_FFULL__LEN     1
#define BMA2X2_EN_INT2_PAD_FFULL__MSK     0x20
#define BMA2X2_EN_INT2_PAD_FFULL__REG     BMA2X2_INT_DATA_SEL_REG

#define BMA2X2_EN_INT2_PAD_FWM__POS     6
#define BMA2X2_EN_INT2_PAD_FWM__LEN     1
#define BMA2X2_EN_INT2_PAD_FWM__MSK     0x40
#define BMA2X2_EN_INT2_PAD_FWM__REG     BMA2X2_INT_DATA_SEL_REG

#define BMA2X2_EN_INT2_PAD_NEWDATA__POS     7
#define BMA2X2_EN_INT2_PAD_NEWDATA__LEN     1
#define BMA2X2_EN_INT2_PAD_NEWDATA__MSK     0x80
#define BMA2X2_EN_INT2_PAD_NEWDATA__REG     BMA2X2_INT_DATA_SEL_REG

#define BMA2X2_UNFILT_INT_SRC_LOWG__POS        0
#define BMA2X2_UNFILT_INT_SRC_LOWG__LEN        1
#define BMA2X2_UNFILT_INT_SRC_LOWG__MSK        0x01
#define BMA2X2_UNFILT_INT_SRC_LOWG__REG        BMA2X2_INT_SRC_REG

#define BMA2X2_UNFILT_INT_SRC_HIGHG__POS       1
#define BMA2X2_UNFILT_INT_SRC_HIGHG__LEN       1
#define BMA2X2_UNFILT_INT_SRC_HIGHG__MSK       0x02
#define BMA2X2_UNFILT_INT_SRC_HIGHG__REG       BMA2X2_INT_SRC_REG

#define BMA2X2_UNFILT_INT_SRC_SLOPE__POS       2
#define BMA2X2_UNFILT_INT_SRC_SLOPE__LEN       1
#define BMA2X2_UNFILT_INT_SRC_SLOPE__MSK       0x04
#define BMA2X2_UNFILT_INT_SRC_SLOPE__REG       BMA2X2_INT_SRC_REG

#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__POS        3
#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__LEN        1
#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__MSK        0x08
#define BMA2X2_UNFILT_INT_SRC_SLO_NO_MOT__REG        BMA2X2_INT_SRC_REG

#define BMA2X2_UNFILT_INT_SRC_TAP__POS         4
#define BMA2X2_UNFILT_INT_SRC_TAP__LEN         1
#define BMA2X2_UNFILT_INT_SRC_TAP__MSK         0x10
#define BMA2X2_UNFILT_INT_SRC_TAP__REG         BMA2X2_INT_SRC_REG

#define BMA2X2_UNFILT_INT_SRC_DATA__POS        5
#define BMA2X2_UNFILT_INT_SRC_DATA__LEN        1
#define BMA2X2_UNFILT_INT_SRC_DATA__MSK        0x20
#define BMA2X2_UNFILT_INT_SRC_DATA__REG        BMA2X2_INT_SRC_REG

#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__POS       0
#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__LEN       1
#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__MSK       0x01
#define BMA2X2_INT1_PAD_ACTIVE_LEVEL__REG       BMA2X2_INT_SET_REG

#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__POS       2
#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__LEN       1
#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__MSK       0x04
#define BMA2X2_INT2_PAD_ACTIVE_LEVEL__REG       BMA2X2_INT_SET_REG

#define BMA2X2_INT1_PAD_OUTPUT_TYPE__POS        1
#define BMA2X2_INT1_PAD_OUTPUT_TYPE__LEN        1
#define BMA2X2_INT1_PAD_OUTPUT_TYPE__MSK        0x02
#define BMA2X2_INT1_PAD_OUTPUT_TYPE__REG        BMA2X2_INT_SET_REG

#define BMA2X2_INT2_PAD_OUTPUT_TYPE__POS        3
#define BMA2X2_INT2_PAD_OUTPUT_TYPE__LEN        1
#define BMA2X2_INT2_PAD_OUTPUT_TYPE__MSK        0x08
#define BMA2X2_INT2_PAD_OUTPUT_TYPE__REG        BMA2X2_INT_SET_REG

#define BMA2X2_INT_MODE_SEL__POS                0
#define BMA2X2_INT_MODE_SEL__LEN                4
#define BMA2X2_INT_MODE_SEL__MSK                0x0F
#define BMA2X2_INT_MODE_SEL__REG                BMA2X2_INT_CTRL_REG

#define BMA2X2_RESET_INT__POS           7
#define BMA2X2_RESET_INT__LEN           1
#define BMA2X2_RESET_INT__MSK           0x80
#define BMA2X2_RESET_INT__REG           BMA2X2_INT_CTRL_REG

#define BMA2X2_LOWG_DUR__POS                    0
#define BMA2X2_LOWG_DUR__LEN                    8
#define BMA2X2_LOWG_DUR__MSK                    0xFF
#define BMA2X2_LOWG_DUR__REG                    BMA2X2_LOW_DURN_REG

#define BMA2X2_LOWG_THRES__POS                  0
#define BMA2X2_LOWG_THRES__LEN                  8
#define BMA2X2_LOWG_THRES__MSK                  0xFF
#define BMA2X2_LOWG_THRES__REG                  BMA2X2_LOW_THRES_REG

#define BMA2X2_LOWG_HYST__POS                   0
#define BMA2X2_LOWG_HYST__LEN                   2
#define BMA2X2_LOWG_HYST__MSK                   0x03
#define BMA2X2_LOWG_HYST__REG                   BMA2X2_LOW_HIGH_HYST_REG

#define BMA2X2_LOWG_INT_MODE__POS               2
#define BMA2X2_LOWG_INT_MODE__LEN               1
#define BMA2X2_LOWG_INT_MODE__MSK               0x04
#define BMA2X2_LOWG_INT_MODE__REG               BMA2X2_LOW_HIGH_HYST_REG

#define BMA2X2_HIGHG_DUR__POS                    0
#define BMA2X2_HIGHG_DUR__LEN                    8
#define BMA2X2_HIGHG_DUR__MSK                    0xFF
#define BMA2X2_HIGHG_DUR__REG                    BMA2X2_HIGH_DURN_REG

#define BMA2X2_HIGHG_THRES__POS                  0
#define BMA2X2_HIGHG_THRES__LEN                  8
#define BMA2X2_HIGHG_THRES__MSK                  0xFF
#define BMA2X2_HIGHG_THRES__REG                  BMA2X2_HIGH_THRES_REG

#define BMA2X2_HIGHG_HYST__POS                  6
#define BMA2X2_HIGHG_HYST__LEN                  2
#define BMA2X2_HIGHG_HYST__MSK                  0xC0
#define BMA2X2_HIGHG_HYST__REG                  BMA2X2_LOW_HIGH_HYST_REG

#define BMA2X2_SLOPE_DUR__POS                    0
#define BMA2X2_SLOPE_DUR__LEN                    2
#define BMA2X2_SLOPE_DUR__MSK                    0x03
#define BMA2X2_SLOPE_DUR__REG                    BMA2X2_SLOPE_DURN_REG

#define BMA2X2_SLO_NO_MOT_DUR__POS                    2
#define BMA2X2_SLO_NO_MOT_DUR__LEN                    6
#define BMA2X2_SLO_NO_MOT_DUR__MSK                    0xFC
#define BMA2X2_SLO_NO_MOT_DUR__REG                    BMA2X2_SLOPE_DURN_REG

#define BMA2X2_SLOPE_THRES__POS                  0
#define BMA2X2_SLOPE_THRES__LEN                  8
#define BMA2X2_SLOPE_THRES__MSK                  0xFF
#define BMA2X2_SLOPE_THRES__REG                  BMA2X2_SLOPE_THRES_REG

#define BMA2X2_SLO_NO_MOT_THRES__POS                  0
#define BMA2X2_SLO_NO_MOT_THRES__LEN                  8
#define BMA2X2_SLO_NO_MOT_THRES__MSK                  0xFF
#define BMA2X2_SLO_NO_MOT_THRES__REG           BMA2X2_SLO_NO_MOT_THRES_REG

#define BMA2X2_TAP_DUR__POS                    0
#define BMA2X2_TAP_DUR__LEN                    3
#define BMA2X2_TAP_DUR__MSK                    0x07
#define BMA2X2_TAP_DUR__REG                    BMA2X2_TAP_PARAM_REG

#define BMA2X2_TAP_SHOCK_DURN__POS             6
#define BMA2X2_TAP_SHOCK_DURN__LEN             1
#define BMA2X2_TAP_SHOCK_DURN__MSK             0x40
#define BMA2X2_TAP_SHOCK_DURN__REG             BMA2X2_TAP_PARAM_REG

#define BMA2X2_ADV_TAP_INT__POS                5
#define BMA2X2_ADV_TAP_INT__LEN                1
#define BMA2X2_ADV_TAP_INT__MSK                0x20
#define BMA2X2_ADV_TAP_INT__REG                BMA2X2_TAP_PARAM_REG

#define BMA2X2_TAP_QUIET_DURN__POS             7
#define BMA2X2_TAP_QUIET_DURN__LEN             1
#define BMA2X2_TAP_QUIET_DURN__MSK             0x80
#define BMA2X2_TAP_QUIET_DURN__REG             BMA2X2_TAP_PARAM_REG

#define BMA2X2_TAP_THRES__POS                  0
#define BMA2X2_TAP_THRES__LEN                  5
#define BMA2X2_TAP_THRES__MSK                  0x1F
#define BMA2X2_TAP_THRES__REG                  BMA2X2_TAP_THRES_REG

#define BMA2X2_TAP_SAMPLES__POS                6
#define BMA2X2_TAP_SAMPLES__LEN                2
#define BMA2X2_TAP_SAMPLES__MSK                0xC0
#define BMA2X2_TAP_SAMPLES__REG                BMA2X2_TAP_THRES_REG

#define BMA2X2_ORIENT_MODE__POS                  0
#define BMA2X2_ORIENT_MODE__LEN                  2
#define BMA2X2_ORIENT_MODE__MSK                  0x03
#define BMA2X2_ORIENT_MODE__REG                  BMA2X2_ORIENT_PARAM_REG

#define BMA2X2_ORIENT_BLOCK__POS                 2
#define BMA2X2_ORIENT_BLOCK__LEN                 2
#define BMA2X2_ORIENT_BLOCK__MSK                 0x0C
#define BMA2X2_ORIENT_BLOCK__REG                 BMA2X2_ORIENT_PARAM_REG

#define BMA2X2_ORIENT_HYST__POS                  4
#define BMA2X2_ORIENT_HYST__LEN                  3
#define BMA2X2_ORIENT_HYST__MSK                  0x70
#define BMA2X2_ORIENT_HYST__REG                  BMA2X2_ORIENT_PARAM_REG

#define BMA2X2_ORIENT_AXIS__POS                  7
#define BMA2X2_ORIENT_AXIS__LEN                  1
#define BMA2X2_ORIENT_AXIS__MSK                  0x80
#define BMA2X2_ORIENT_AXIS__REG                  BMA2X2_THETA_BLOCK_REG

#define BMA2X2_ORIENT_UD_EN__POS                  6
#define BMA2X2_ORIENT_UD_EN__LEN                  1
#define BMA2X2_ORIENT_UD_EN__MSK                  0x40
#define BMA2X2_ORIENT_UD_EN__REG                  BMA2X2_THETA_BLOCK_REG

#define BMA2X2_THETA_BLOCK__POS                  0
#define BMA2X2_THETA_BLOCK__LEN                  6
#define BMA2X2_THETA_BLOCK__MSK                  0x3F
#define BMA2X2_THETA_BLOCK__REG                  BMA2X2_THETA_BLOCK_REG

#define BMA2X2_THETA_FLAT__POS                  0
#define BMA2X2_THETA_FLAT__LEN                  6
#define BMA2X2_THETA_FLAT__MSK                  0x3F
#define BMA2X2_THETA_FLAT__REG                  BMA2X2_THETA_FLAT_REG

#define BMA2X2_FLAT_HOLD_TIME__POS              4
#define BMA2X2_FLAT_HOLD_TIME__LEN              2
#define BMA2X2_FLAT_HOLD_TIME__MSK              0x30
#define BMA2X2_FLAT_HOLD_TIME__REG              BMA2X2_FLAT_HOLD_TIME_REG

#define BMA2X2_FLAT_HYS__POS                   0
#define BMA2X2_FLAT_HYS__LEN                   3
#define BMA2X2_FLAT_HYS__MSK                   0x07
#define BMA2X2_FLAT_HYS__REG                   BMA2X2_FLAT_HOLD_TIME_REG

#define BMA2X2_FIFO_WML_TRIG_RETAIN__POS                   0
#define BMA2X2_FIFO_WML_TRIG_RETAIN__LEN                   6
#define BMA2X2_FIFO_WML_TRIG_RETAIN__MSK                   0x3F
#define BMA2X2_FIFO_WML_TRIG_RETAIN__REG                   BMA2X2_FIFO_WML_TRIG

#define BMA2X2_EN_SELF_TEST__POS                0
#define BMA2X2_EN_SELF_TEST__LEN                2
#define BMA2X2_EN_SELF_TEST__MSK                0x03
#define BMA2X2_EN_SELF_TEST__REG                BMA2X2_SELF_TEST_REG

#define BMA2X2_NEG_SELF_TEST__POS               2
#define BMA2X2_NEG_SELF_TEST__LEN               1
#define BMA2X2_NEG_SELF_TEST__MSK               0x04
#define BMA2X2_NEG_SELF_TEST__REG               BMA2X2_SELF_TEST_REG

#define BMA2X2_SELF_TEST_AMP__POS               4
#define BMA2X2_SELF_TEST_AMP__LEN               1
#define BMA2X2_SELF_TEST_AMP__MSK               0x10
#define BMA2X2_SELF_TEST_AMP__REG               BMA2X2_SELF_TEST_REG

#define BMA2X2_UNLOCK_EE_PROG_MODE__POS     0
#define BMA2X2_UNLOCK_EE_PROG_MODE__LEN     1
#define BMA2X2_UNLOCK_EE_PROG_MODE__MSK     0x01
#define BMA2X2_UNLOCK_EE_PROG_MODE__REG     BMA2X2_EEPROM_CTRL_REG

#define BMA2X2_START_EE_PROG_TRIG__POS      1
#define BMA2X2_START_EE_PROG_TRIG__LEN      1
#define BMA2X2_START_EE_PROG_TRIG__MSK      0x02
#define BMA2X2_START_EE_PROG_TRIG__REG      BMA2X2_EEPROM_CTRL_REG

#define BMA2X2_EE_PROG_READY__POS          2
#define BMA2X2_EE_PROG_READY__LEN          1
#define BMA2X2_EE_PROG_READY__MSK          0x04
#define BMA2X2_EE_PROG_READY__REG          BMA2X2_EEPROM_CTRL_REG

#define BMA2X2_UPDATE_IMAGE__POS                3
#define BMA2X2_UPDATE_IMAGE__LEN                1
#define BMA2X2_UPDATE_IMAGE__MSK                0x08
#define BMA2X2_UPDATE_IMAGE__REG                BMA2X2_EEPROM_CTRL_REG

#define BMA2X2_EE_REMAIN__POS                4
#define BMA2X2_EE_REMAIN__LEN                4
#define BMA2X2_EE_REMAIN__MSK                0xF0
#define BMA2X2_EE_REMAIN__REG                BMA2X2_EEPROM_CTRL_REG

#define BMA2X2_EN_SPI_MODE_3__POS              0
#define BMA2X2_EN_SPI_MODE_3__LEN              1
#define BMA2X2_EN_SPI_MODE_3__MSK              0x01
#define BMA2X2_EN_SPI_MODE_3__REG              BMA2X2_SERIAL_CTRL_REG

#define BMA2X2_I2C_WATCHDOG_PERIOD__POS        1
#define BMA2X2_I2C_WATCHDOG_PERIOD__LEN        1
#define BMA2X2_I2C_WATCHDOG_PERIOD__MSK        0x02
#define BMA2X2_I2C_WATCHDOG_PERIOD__REG        BMA2X2_SERIAL_CTRL_REG

#define BMA2X2_EN_I2C_WATCHDOG__POS            2
#define BMA2X2_EN_I2C_WATCHDOG__LEN            1
#define BMA2X2_EN_I2C_WATCHDOG__MSK            0x04
#define BMA2X2_EN_I2C_WATCHDOG__REG            BMA2X2_SERIAL_CTRL_REG

#define BMA2X2_EXT_MODE__POS              7
#define BMA2X2_EXT_MODE__LEN              1
#define BMA2X2_EXT_MODE__MSK              0x80
#define BMA2X2_EXT_MODE__REG              BMA2X2_EXTMODE_CTRL_REG

#define BMA2X2_ALLOW_UPPER__POS        6
#define BMA2X2_ALLOW_UPPER__LEN        1
#define BMA2X2_ALLOW_UPPER__MSK        0x40
#define BMA2X2_ALLOW_UPPER__REG        BMA2X2_EXTMODE_CTRL_REG

#define BMA2X2_MAP_2_LOWER__POS            5
#define BMA2X2_MAP_2_LOWER__LEN            1
#define BMA2X2_MAP_2_LOWER__MSK            0x20
#define BMA2X2_MAP_2_LOWER__REG            BMA2X2_EXTMODE_CTRL_REG

#define BMA2X2_MAGIC_NUMBER__POS            0
#define BMA2X2_MAGIC_NUMBER__LEN            5
#define BMA2X2_MAGIC_NUMBER__MSK            0x1F
#define BMA2X2_MAGIC_NUMBER__REG            BMA2X2_EXTMODE_CTRL_REG

#define BMA2X2_UNLOCK_EE_WRITE_TRIM__POS        4
#define BMA2X2_UNLOCK_EE_WRITE_TRIM__LEN        4
#define BMA2X2_UNLOCK_EE_WRITE_TRIM__MSK        0xF0
#define BMA2X2_UNLOCK_EE_WRITE_TRIM__REG        BMA2X2_CTRL_UNLOCK_REG

#define BMA2X2_EN_SLOW_COMP_X__POS              0
#define BMA2X2_EN_SLOW_COMP_X__LEN              1
#define BMA2X2_EN_SLOW_COMP_X__MSK              0x01
#define BMA2X2_EN_SLOW_COMP_X__REG              BMA2X2_OFFSET_CTRL_REG

#define BMA2X2_EN_SLOW_COMP_Y__POS              1
#define BMA2X2_EN_SLOW_COMP_Y__LEN              1
#define BMA2X2_EN_SLOW_COMP_Y__MSK              0x02
#define BMA2X2_EN_SLOW_COMP_Y__REG              BMA2X2_OFFSET_CTRL_REG

#define BMA2X2_EN_SLOW_COMP_Z__POS              2
#define BMA2X2_EN_SLOW_COMP_Z__LEN              1
#define BMA2X2_EN_SLOW_COMP_Z__MSK              0x04
#define BMA2X2_EN_SLOW_COMP_Z__REG              BMA2X2_OFFSET_CTRL_REG

#define BMA2X2_FAST_CAL_RDY_S__POS             4
#define BMA2X2_FAST_CAL_RDY_S__LEN             1
#define BMA2X2_FAST_CAL_RDY_S__MSK             0x10
#define BMA2X2_FAST_CAL_RDY_S__REG             BMA2X2_OFFSET_CTRL_REG

#define BMA2X2_CAL_TRIGGER__POS                5
#define BMA2X2_CAL_TRIGGER__LEN                2
#define BMA2X2_CAL_TRIGGER__MSK                0x60
#define BMA2X2_CAL_TRIGGER__REG                BMA2X2_OFFSET_CTRL_REG

#define BMA2X2_RESET_OFFSET_REGS__POS           7
#define BMA2X2_RESET_OFFSET_REGS__LEN           1
#define BMA2X2_RESET_OFFSET_REGS__MSK           0x80
#define BMA2X2_RESET_OFFSET_REGS__REG           BMA2X2_OFFSET_CTRL_REG

#define BMA2X2_COMP_CUTOFF__POS                 0
#define BMA2X2_COMP_CUTOFF__LEN                 1
#define BMA2X2_COMP_CUTOFF__MSK                 0x01
#define BMA2X2_COMP_CUTOFF__REG                 BMA2X2_OFFSET_PARAMS_REG

#define BMA2X2_COMP_TARGET_OFFSET_X__POS        1
#define BMA2X2_COMP_TARGET_OFFSET_X__LEN        2
#define BMA2X2_COMP_TARGET_OFFSET_X__MSK        0x06
#define BMA2X2_COMP_TARGET_OFFSET_X__REG        BMA2X2_OFFSET_PARAMS_REG

#define BMA2X2_COMP_TARGET_OFFSET_Y__POS        3
#define BMA2X2_COMP_TARGET_OFFSET_Y__LEN        2
#define BMA2X2_COMP_TARGET_OFFSET_Y__MSK        0x18
#define BMA2X2_COMP_TARGET_OFFSET_Y__REG        BMA2X2_OFFSET_PARAMS_REG

#define BMA2X2_COMP_TARGET_OFFSET_Z__POS        5
#define BMA2X2_COMP_TARGET_OFFSET_Z__LEN        2
#define BMA2X2_COMP_TARGET_OFFSET_Z__MSK        0x60
#define BMA2X2_COMP_TARGET_OFFSET_Z__REG        BMA2X2_OFFSET_PARAMS_REG

#define BMA2X2_FIFO_DATA_SELECT__POS                 0
#define BMA2X2_FIFO_DATA_SELECT__LEN                 2
#define BMA2X2_FIFO_DATA_SELECT__MSK                 0x03
#define BMA2X2_FIFO_DATA_SELECT__REG                 BMA2X2_FIFO_MODE_REG

#define BMA2X2_FIFO_TRIGGER_SOURCE__POS                 2
#define BMA2X2_FIFO_TRIGGER_SOURCE__LEN                 2
#define BMA2X2_FIFO_TRIGGER_SOURCE__MSK                 0x0C
#define BMA2X2_FIFO_TRIGGER_SOURCE__REG                 BMA2X2_FIFO_MODE_REG

#define BMA2X2_FIFO_TRIGGER_ACTION__POS                 4
#define BMA2X2_FIFO_TRIGGER_ACTION__LEN                 2
#define BMA2X2_FIFO_TRIGGER_ACTION__MSK                 0x30
#define BMA2X2_FIFO_TRIGGER_ACTION__REG                 BMA2X2_FIFO_MODE_REG

#define BMA2X2_FIFO_MODE__POS                 6
#define BMA2X2_FIFO_MODE__LEN                 2
#define BMA2X2_FIFO_MODE__MSK                 0xC0
#define BMA2X2_FIFO_MODE__REG                 BMA2X2_FIFO_MODE_REG

#define BMA2X2_RANGE_2G                 3
#define BMA2X2_RANGE_4G                 5
#define BMA2X2_RANGE_8G                 8
#define BMA2X2_RANGE_16G                12

#define BMA2X2_BW_7_81HZ        0x08
#define BMA2X2_BW_15_63HZ       0x09
#define BMA2X2_BW_31_25HZ       0x0A
#define BMA2X2_BW_62_50HZ       0x0B
#define BMA2X2_BW_125HZ         0x0C
#define BMA2X2_BW_250HZ         0x0D
#define BMA2X2_BW_500HZ         0x0E
#define BMA2X2_BW_1000HZ        0x0F

#define BMA2X2_SLEEP_DUR_0_5MS        0x05
#define BMA2X2_SLEEP_DUR_1MS          0x06
#define BMA2X2_SLEEP_DUR_2MS          0x07
#define BMA2X2_SLEEP_DUR_4MS          0x08
#define BMA2X2_SLEEP_DUR_6MS          0x09
#define BMA2X2_SLEEP_DUR_10MS         0x0A
#define BMA2X2_SLEEP_DUR_25MS         0x0B
#define BMA2X2_SLEEP_DUR_50MS         0x0C
#define BMA2X2_SLEEP_DUR_100MS        0x0D
#define BMA2X2_SLEEP_DUR_500MS        0x0E
#define BMA2X2_SLEEP_DUR_1S           0x0F

#define BMA2X2_LATCH_DUR_NON_LATCH    0x00
#define BMA2X2_LATCH_DUR_250MS        0x01
#define BMA2X2_LATCH_DUR_500MS        0x02
#define BMA2X2_LATCH_DUR_1S           0x03
#define BMA2X2_LATCH_DUR_2S           0x04
#define BMA2X2_LATCH_DUR_4S           0x05
#define BMA2X2_LATCH_DUR_8S           0x06
#define BMA2X2_LATCH_DUR_LATCH        0x07
#define BMA2X2_LATCH_DUR_NON_LATCH1   0x08
#define BMA2X2_LATCH_DUR_250US        0x09
#define BMA2X2_LATCH_DUR_500US        0x0A
#define BMA2X2_LATCH_DUR_1MS          0x0B
#define BMA2X2_LATCH_DUR_12_5MS       0x0C
#define BMA2X2_LATCH_DUR_25MS         0x0D
#define BMA2X2_LATCH_DUR_50MS         0x0E
#define BMA2X2_LATCH_DUR_LATCH1       0x0F

#define BMA2X2_MODE_NORMAL             0
#define BMA2X2_MODE_LOWPOWER1          1
#define BMA2X2_MODE_SUSPEND            2
#define BMA2X2_MODE_DEEP_SUSPEND       3
#define BMA2X2_MODE_LOWPOWER2          4
#define BMA2X2_MODE_STANDBY            5

#define BMA2X2_LOW_TH_IN_G(gthres, range)		((256 * gthres) / range)
#define BMA2X2_HIGH_TH_IN_G(gthres, range)		((256 * gthres) / range)
#define BMA2X2_LOW_HY_IN_G(ghyst, range)		((32 * ghyst) / range)
#define BMA2X2_HIGH_HY_IN_G(ghyst, range)		((32 * ghyst) / range)
#define BMA2X2_SLOPE_TH_IN_G(gthres, range)		((128 * gthres) / range)

#define BMA2X2_GET_BITSLICE(regvar, bitname)\
	 ((regvar & bitname##__MSK) >> bitname##__POS)
#define BMA2X2_SET_BITSLICE(regvar, bitname, val)\
((regvar & ~bitname##__MSK) | ((val << bitname##__POS) & bitname##__MSK))

#define BMA255_CHIP_ID 0XFA
#define BMA250_CHIP_ID 0XF9
#define BMA250E_CHIP_ID 0X03
#define BMA222E_CHIP_ID 0XF8
#define BMA280_CHIP_ID 0XFB

#define BAM2X2_ENABLE	0X80

#define BMA2XX_RANGE	32768

#define X_AXIS_COMPEN	0/*X_AXIS  not compensation */
/*Y_AXIS offset is caused by screws, there needs to be compensation 3.5*/
#define Y_AXIS_COMPEN	0
#define Z_AXIS_COMPEN	0/*Z_AXIS not compensation*/

static u8 slope_mode;
static u8 high_g_mode;
static u8 interrupt_dur;
static u8 interrupt_threshold;

static int bma2x2_parse_dt(struct i2c_client *client)
{
	struct device_node *np = client->dev.of_node;
	u32 temp_val;
	int rc;

	rc = of_property_read_u32(np, "high_g_mode", &temp_val);
	if (!rc)
		high_g_mode = (u8)temp_val;

	rc = of_property_read_u32(np, "slope_mode", &temp_val);
	if (!rc)
		slope_mode = (u8)temp_val;

	rc = of_property_read_u32(np, "interrupt_dur", &temp_val);
	if (!rc)
		interrupt_dur = (u8)temp_val;

	rc = of_property_read_u32(np, "interrupt_threshold", &temp_val);
	if (!rc)
		interrupt_threshold = (u8)temp_val;

	DBG("%s: high_g_mode = %d\n", __func__, high_g_mode);
	DBG("%s: slope_mode = %d\n", __func__, slope_mode);
	DBG("%s: interrupt_dur = %d\n", __func__, interrupt_dur);
	DBG("%s: interrupt_threshold = %d\n", __func__, interrupt_threshold);

	return 0;
}

#ifdef BMA2X2_ENABLE_INT1
static int bma2x2_set_int1_pad_sel(struct i2c_client *client, unsigned char
		int1sel)
{
	int comres = 0;
	unsigned char data = 0;
	unsigned char state;

	state = 0x01;

	switch (int1sel) {
	case 0:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_LOWG__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_LOWG,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_LOWG__REG,
					  data);
		break;
	case 1:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_HIGHG__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_HIGHG,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_HIGHG__REG,
					  data);
		break;
	case 2:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_SLOPE__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SLOPE,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_SLOPE__REG,
					  data);
		break;
	case 3:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_DB_TAP__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_DB_TAP,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_DB_TAP__REG,
					  data);
		break;
	case 4:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_SNG_TAP__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SNG_TAP,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_SNG_TAP__REG,
					  data);
		break;
	case 5:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_ORIENT__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_ORIENT,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_ORIENT__REG,
					  data);
		break;
	case 6:
		data = sensor_read_reg(client, BMA2X2_EN_INT1_PAD_FLAT__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_FLAT,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_FLAT__REG,
					  data);
		break;
	case 7:
		comres = sensor_read_reg(client,
					 BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT1_PAD_SLO_NO_MOT,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT1_PAD_SLO_NO_MOT__REG,
					  data);
		break;
	default:
		break;
	}

	return comres;
}
#endif /* BMA2X2_ENABLE_INT1 */

#ifdef BMA2X2_ENABLE_INT2
static int bma2x2_set_int2_pad_sel(struct i2c_client *client, unsigned char
		int2sel)
{
	int comres = 0;
	unsigned char data = 0;
	unsigned char state;

	state = 0x01;

	switch (int2sel) {
	case 0:
		comres = sensor_read_reg(client, BMA2X2_EN_INT2_PAD_LOWG__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_LOWG,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_LOWG__REG,
					  data);
		break;
	case 1:
		comres = sensor_read_reg(client, BMA2X2_EN_INT2_PAD_HIGHG__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_HIGHG,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_HIGHG__REG,
					  data);
		break;
	case 2:
		comres = sensor_read_reg(client, BMA2X2_EN_INT2_PAD_SLOPE__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SLOPE,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_SLOPE__REG,
					  data);
		break;
	case 3:
		comres = sensor_read_reg(client,
					 BMA2X2_EN_INT2_PAD_DB_TAP__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_DB_TAP,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_DB_TAP__REG,
					  data);
		break;
	case 4:
		comres = sensor_read_reg(client,
					 BMA2X2_EN_INT2_PAD_SNG_TAP__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SNG_TAP,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_SNG_TAP__REG,
					  data);
		break;
	case 5:
		comres = sensor_read_reg(client,
					 BMA2X2_EN_INT2_PAD_ORIENT__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_ORIENT,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_ORIENT__REG,
					  data);
		break;
	case 6:
		comres = sensor_read_reg(client,
					 BMA2X2_EN_INT2_PAD_FLAT__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_FLAT,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_FLAT__REG,
					  data);
		break;
	case 7:
		comres = sensor_read_reg(client,
					 BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_EN_INT2_PAD_SLO_NO_MOT,
					   state);
		comres = sensor_write_reg(client,
					  BMA2X2_EN_INT2_PAD_SLO_NO_MOT__REG,
					  data);
		break;
	default:
		break;
	}

	return comres;
}
#endif /* BMA2X2_ENABLE_INT2 */

#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2)
static int bma2x2_get_interruptstatus1(struct i2c_client *client, unsigned char
		*intstatus)
{
	unsigned char data;

	data = sensor_read_reg(client, BMA2X2_STATUS1_REG);
	*intstatus = data;
	return 0;
}

static int bma2x2_get_HIGH_first(struct i2c_client *client, unsigned char
						 param,
						 unsigned char *intstatus)
{
	unsigned char data;

	switch (param) {
	case 0:
		data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
		data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_X);
		*intstatus = data;
		break;
	case 1:
		data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
		data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_Y);
		*intstatus = data;
		break;
	case 2:
		data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
		data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_FIRST_Z);
		*intstatus = data;
		break;
	default:
		break;
	}

	return 0;
}

static int bma2x2_get_HIGH_sign(struct i2c_client *client, unsigned char
		*intstatus)
{
	unsigned char data;

	data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
	data = BMA2X2_GET_BITSLICE(data, BMA2X2_HIGHG_SIGN_S);
	*intstatus = data;

	return 0;
}

static int bma2x2_get_slope_first(struct i2c_client *client, unsigned char
	param, unsigned char *intstatus)
{
	unsigned char data;

	switch (param) {
	case 0:
		data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
		data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_X);
		*intstatus = data;
		break;
	case 1:
		data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
		data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_Y);
		*intstatus = data;
		break;
	case 2:
		data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
		data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_FIRST_Z);
		*intstatus = data;
		break;
	default:
		break;
	}

	return 0;
}

static int bma2x2_get_slope_sign(struct i2c_client *client, unsigned char
		*intstatus)
{
	unsigned char data;

	data = sensor_read_reg(client, BMA2X2_STATUS_TAP_SLOPE_REG);
	data = BMA2X2_GET_BITSLICE(data, BMA2X2_SLOPE_SIGN_S);
	*intstatus = data;

	return 0;
}

static int bma2x2_get_orient_status(struct i2c_client *client, unsigned char
		*intstatus)
{
	unsigned char data;

	data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
	data = BMA2X2_GET_BITSLICE(data, BMA2X2_ORIENT_S);
	*intstatus = data;

	return 0;
}

static int bma2x2_get_orient_flat_status(struct i2c_client *client, unsigned
		char *intstatus)
{
	unsigned char data;

	data = sensor_read_reg(client, BMA2X2_STATUS_ORIENT_HIGH_REG);
	data = BMA2X2_GET_BITSLICE(data, BMA2X2_FLAT_S);
	*intstatus = data;

	return 0;
}

static int bma2x2_set_int_mode(struct i2c_client *client, unsigned char mode)
{
	unsigned char data;
	int comres = 0;

	data = sensor_read_reg(client, BMA2X2_INT_MODE_SEL__REG);
	data = BMA2X2_SET_BITSLICE(data, BMA2X2_INT_MODE_SEL, mode);
	comres = sensor_write_reg(client,
				BMA2X2_INT_MODE_SEL__REG, data);

	return comres;
}
#endif /* defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2) */

static int bma2x2_set_mode(struct i2c_client *client, unsigned char mode)
{
	int comres = 0;
	unsigned char data1, data2;

	if (mode < 6) {
		data1 = sensor_read_reg(client, BMA2X2_MODE_CTRL_REG);
		data2 = sensor_read_reg(client, BMA2X2_LOW_NOISE_CTRL_REG);
		switch (mode) {
		case BMA2X2_MODE_NORMAL:
				data1	= BMA2X2_SET_BITSLICE(data1,
							      BMA2X2_MODE_CTRL,
							      0);
				data2	= BMA2X2_SET_BITSLICE
						(data2,
						BMA2X2_LOW_POWER_MODE,
						0);
				sensor_write_reg
						(client,
						BMA2X2_MODE_CTRL_REG,
						data1);
				mdelay(1);
				sensor_write_reg(client,
						  BMA2X2_LOW_NOISE_CTRL_REG,
						  data2);
				break;
		case BMA2X2_MODE_LOWPOWER1:
				data1	= BMA2X2_SET_BITSLICE
							(data1,
							BMA2X2_MODE_CTRL,
							2);
				 data2	= BMA2X2_SET_BITSLICE
							(data2,
							BMA2X2_LOW_POWER_MODE,
							0);
				 sensor_write_reg
						(client,
						BMA2X2_MODE_CTRL_REG,
						data1);
				 mdelay(1);
				 sensor_write_reg
						(client,
						BMA2X2_LOW_NOISE_CTRL_REG,
						data2);
				break;
		case BMA2X2_MODE_SUSPEND:
				 data1	= BMA2X2_SET_BITSLICE(data1,
							      BMA2X2_MODE_CTRL,
							      4);
				 data2	= BMA2X2_SET_BITSLICE
						(data2,
						BMA2X2_LOW_POWER_MODE,
						0);
				 sensor_write_reg(client,
						  BMA2X2_LOW_NOISE_CTRL_REG,
						  data2);
				 mdelay(1);
				 sensor_write_reg(client,
						  BMA2X2_MODE_CTRL_REG,
						  data1);
				break;
		case BMA2X2_MODE_DEEP_SUSPEND:
				 data1	= BMA2X2_SET_BITSLICE
						(data1,
						BMA2X2_MODE_CTRL,
						1);
				 data2	= BMA2X2_SET_BITSLICE
						(data2,
						BMA2X2_LOW_POWER_MODE,
						1);
				 sensor_write_reg
						(client,
						BMA2X2_MODE_CTRL_REG,
						data1);
				 mdelay(1);
				 sensor_write_reg(client,
						  BMA2X2_LOW_NOISE_CTRL_REG,
						  data2);
				break;
		case BMA2X2_MODE_LOWPOWER2:
				 data1	= BMA2X2_SET_BITSLICE
						(data1,
						BMA2X2_MODE_CTRL,
						2);
				 data2	= BMA2X2_SET_BITSLICE
						(data2,
						BMA2X2_LOW_POWER_MODE,
						1);
				 sensor_write_reg(client,
						  BMA2X2_MODE_CTRL_REG,
						  data1);
				 mdelay(1);
				 sensor_write_reg(client,
						  BMA2X2_LOW_NOISE_CTRL_REG,
						  data2);
				break;
		case BMA2X2_MODE_STANDBY:
				 data1	= BMA2X2_SET_BITSLICE(data1,
							      BMA2X2_MODE_CTRL,
							      4);
				 data2	= BMA2X2_SET_BITSLICE
						(data2,
						BMA2X2_LOW_POWER_MODE,
						1);
				 sensor_write_reg(client,
						  BMA2X2_LOW_NOISE_CTRL_REG,
						  data2);
				 mdelay(1);
				 sensor_write_reg(client,
						  BMA2X2_MODE_CTRL_REG,
						  data1);
		break;
		}
	} else {
		comres =  -1;
	}

	return comres;
}

static int bma2x2_set_range(struct i2c_client *client, unsigned char range)
{
	int comres = 0;
	unsigned char data1;

	if ((range == 3) || (range == 5) || (range == 8) || (range == 12)) {
		data1 = sensor_read_reg(client, BMA2X2_RANGE_SEL_REG);
		switch (range) {
		case BMA2X2_RANGE_2G:
			 data1	= BMA2X2_SET_BITSLICE(data1,
						      BMA2X2_RANGE_SEL, 3);
			break;
		case BMA2X2_RANGE_4G:
			data1	= BMA2X2_SET_BITSLICE(data1,
						      BMA2X2_RANGE_SEL, 5);
			break;
		case BMA2X2_RANGE_8G:
			data1	= BMA2X2_SET_BITSLICE(data1,
						      BMA2X2_RANGE_SEL, 8);
			break;
		case BMA2X2_RANGE_16G:
			data1	= BMA2X2_SET_BITSLICE(data1,
						      BMA2X2_RANGE_SEL, 12);
			break;
		}
		comres += sensor_write_reg(client, BMA2X2_RANGE_SEL_REG,
				 data1);
	} else {
		comres =  -1;
	}

	return comres;
}

static int bma2x2_set_bandwidth(struct i2c_client *client, unsigned char BW)
{
	int comres = 0;
	unsigned char data;
	int bandwidth = 0;

	if (BW > 7 && BW < 16) {
		switch (BW) {
		case BMA2X2_BW_7_81HZ:
			bandwidth = BMA2X2_BW_7_81HZ;

			/*  7.81 Hz	  64000 uS	 */
			break;
		case BMA2X2_BW_15_63HZ:
			 bandwidth = BMA2X2_BW_15_63HZ;

			/*  15.63 Hz	  32000 uS	 */
			break;
		case BMA2X2_BW_31_25HZ:
			bandwidth = BMA2X2_BW_31_25HZ;

			/*  31.25 Hz	  16000 uS	 */
			break;
		case BMA2X2_BW_62_50HZ:
			bandwidth = BMA2X2_BW_62_50HZ;

			/*  62.50 Hz	  8000 uS	*/
			break;
		case BMA2X2_BW_125HZ:
			bandwidth = BMA2X2_BW_125HZ;

			 /*  125 Hz	  4000 uS	*/
			break;
		case BMA2X2_BW_250HZ:
			bandwidth = BMA2X2_BW_250HZ;

			/*  250 Hz	  2000 uS	*/
			break;
		case BMA2X2_BW_500HZ:
			bandwidth = BMA2X2_BW_500HZ;

			/*  500 Hz	  1000 uS	*/
			break;
		case BMA2X2_BW_1000HZ:
			bandwidth = BMA2X2_BW_1000HZ;

			/*  1000 Hz	  500 uS   */
			break;
		}
		data = sensor_read_reg(client, BMA2X2_BANDWIDTH__REG);
		data = BMA2X2_SET_BITSLICE(data, BMA2X2_BANDWIDTH, bandwidth);
		comres += sensor_write_reg(client, BMA2X2_BANDWIDTH__REG,
				data);
	} else {
		comres =  -1;
	}

	return comres;
}

#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2)
	unsigned char *orient[] = {"upward looking portrait upright",
	 "upward looking portrait upside - down",
		 "upward looking landscape left",
		 "upward looking landscape right",
		 "downward looking portrait upright",
		 "downward looking portrait upside - down",
		 "downward looking landscape left",
		 "downward looking landscape right"};

static int sensor_report_value(struct i2c_client *client)
{
	struct sensor_private_data *sensor =
		(struct sensor_private_data *)i2c_get_clientdata(client);

	unsigned char status = 0;
	unsigned char i;
	unsigned char first_value = 0;
	unsigned char sign_value = 0;

	bma2x2_get_interruptstatus1(client, &status);

	switch (status) {
	case 0x01:
		DBG("Low G interrupt happened\n");
		input_report_rel(sensor->input_dev, LOW_G_INTERRUPT,
				  LOW_G_INTERRUPT_HAPPENED);
		break;
	case 0x02:
		for (i = 0; i < 3; i++) {
			bma2x2_get_HIGH_first(client, i,
					      &first_value);
			if (first_value == 1) {
				bma2x2_get_HIGH_sign(client,
						     &sign_value);

				if (sign_value == 1) {
					if (i == 0)
						input_report_rel
					(sensor->input_dev,
					HIGH_G_INTERRUPT,
					HIGH_G_INTERRUPT_X_NEGATIVE_HAPPENED);
					if (i == 1)
						input_report_rel
					(sensor->input_dev,
					HIGH_G_INTERRUPT,
					HIGH_G_INTERRUPT_Y_NEGATIVE_HAPPENED);
					if (i == 2)
						input_report_rel
					(sensor->input_dev,
					HIGH_G_INTERRUPT,
					HIGH_G_INTERRUPT_Z_NEGATIVE_HAPPENED);
				} else {
					if (i == 0)
						input_report_rel
						(sensor->input_dev,
						HIGH_G_INTERRUPT,
						HIGH_G_INTERRUPT_X_HAPPENED);
					if (i == 1)
						input_report_rel
						(sensor->input_dev,
						HIGH_G_INTERRUPT,
						HIGH_G_INTERRUPT_Y_HAPPENED);
					if (i == 2)
						input_report_rel
						(sensor->input_dev,
						HIGH_G_INTERRUPT,
						HIGH_G_INTERRUPT_Z_HAPPENED);
				}
			}
			DBG
			("High G interrupt happened,exis is %d,first is %d,sign is %d\n",
			i, first_value, sign_value);
		}
			break;
	case 0x04:
		for (i = 0; i < 3; i++) {
			bma2x2_get_slope_first(client, i,
					&first_value);
			if (first_value == 1) {
				bma2x2_get_slope_sign(client,
						&sign_value);

				if (sign_value == 1) {
					if (i == 0)
						input_report_rel
					(sensor->input_dev,
					SLOP_INTERRUPT,
					SLOPE_INTERRUPT_X_NEGATIVE_HAPPENED);
					else if (i == 1)
						input_report_rel
					(sensor->input_dev,
					SLOP_INTERRUPT,
					SLOPE_INTERRUPT_Y_NEGATIVE_HAPPENED);
					else if (i == 2)
						input_report_rel
					(sensor->input_dev,
					SLOP_INTERRUPT,
					SLOPE_INTERRUPT_Z_NEGATIVE_HAPPENED);
				} else {
					if (i == 0)
						input_report_rel
						(sensor->input_dev,
						SLOP_INTERRUPT,
						SLOPE_INTERRUPT_X_HAPPENED);
					else if (i == 1)
						input_report_rel
						(sensor->input_dev,
						SLOP_INTERRUPT,
						SLOPE_INTERRUPT_Y_HAPPENED);
					else if (i == 2)
						input_report_rel
						(sensor->input_dev,
						SLOP_INTERRUPT,
						SLOPE_INTERRUPT_Z_HAPPENED);
				}
			}

			DBG("Slop interrupt happened,exis is %d,first is %d,sign is %d\n",
				i, first_value, sign_value);
		}
		break;

	case 0x08:
		DBG("slow/ no motion interrupt happened\n");
		input_report_rel(sensor->input_dev, SLOW_NO_MOTION_INTERRUPT,
				SLOW_NO_MOTION_INTERRUPT_HAPPENED);
		break;

	case 0x10:
		DBG("double tap interrupt happened\n");
		input_report_rel(sensor->input_dev, DOUBLE_TAP_INTERRUPT,
				DOUBLE_TAP_INTERRUPT_HAPPENED);
		break;
	case 0x20:
		DBG("single tap interrupt happened\n");
		input_report_rel(sensor->input_dev, SINGLE_TAP_INTERRUPT,
				  SINGLE_TAP_INTERRUPT_HAPPENED);
		break;
	case 0x40:
		bma2x2_get_orient_status(client,
					  &first_value);
		DBG
		("orient interrupt happened,%s\n", orient[first_value]);
		if (first_value == 0)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			UPWARD_PORTRAIT_UP_INTERRUPT_HAPPENED);
		else if (first_value == 1)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			UPWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED);
		else if (first_value == 2)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			UPWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED);
		else if (first_value == 3)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			UPWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED);
		else if (first_value == 4)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			DOWNWARD_PORTRAIT_UP_INTERRUPT_HAPPENED);
		else if (first_value == 5)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			DOWNWARD_PORTRAIT_DOWN_INTERRUPT_HAPPENED);
		else if (first_value == 6)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			DOWNWARD_LANDSCAPE_LEFT_INTERRUPT_HAPPENED);
		else if (first_value == 7)
			input_report_abs
			(sensor->input_dev, ORIENT_INTERRUPT,
			DOWNWARD_LANDSCAPE_RIGHT_INTERRUPT_HAPPENED);
		break;
	case 0x80:
		bma2x2_get_orient_flat_status(client,
					       &sign_value);
		DBG
		("flat interrupt happened,flat status is %d\n",
		sign_value);
		if (sign_value == 1) {
			input_report_abs(sensor->input_dev, FLAT_INTERRUPT,
					 FLAT_INTERRUPT_TRUE_HAPPENED);
		} else {
			input_report_abs(sensor->input_dev, FLAT_INTERRUPT,
					 FLAT_INTERRUPT_FALSE_HAPPENED);
		}
		break;
	default:
		break;
	}
	return 0;
}
#else

static void bma2x2_remap_sensor_data(struct i2c_client *client,
				     struct sensor_axis *axis)
{
#ifdef CONFIG_BMA_USE_PLATFORM_DATA
	struct bosch_sensor_data bsd;

	if (!client->bst_pd)
		return;

	bsd.x = axis->x;
	bsd.y = axis->y;
	bsd.z = axis->z;

	bst_remap_sensor_data_dft_tab(&bsd,
				       client_data->bst_pd->place);

	axis->x = bsd.x;
	axis->y = bsd.y;
	axis->z = bsd.z;
#else
	(void)axis;
	(void)client;
#endif
}

static int gsensor_report_value
(struct i2c_client *client, struct sensor_axis *axis)
{
	struct sensor_private_data *sensor =
		(struct sensor_private_data *)i2c_get_clientdata(client);

	if (sensor->status_cur == SENSOR_ON) {
		/* Report acceleration sensor information */
		input_report_abs(sensor->input_dev, ABS_X, axis->x);
		input_report_abs(sensor->input_dev, ABS_Y, axis->y);
		input_report_abs(sensor->input_dev, ABS_Z, axis->z);
		input_sync(sensor->input_dev);
	}

	return 0;
}

static int sensor_report_value(struct i2c_client *client)
{
	int comres = 0;
	unsigned char data[6];
	short x, y, z;
	unsigned int xyz_adc_rang = 0;
	char value = 0;
	struct sensor_axis axis;
	struct sensor_private_data *sensor =
		(struct sensor_private_data *)i2c_get_clientdata(client);
	struct sensor_platform_data *pdata = sensor->pdata;

	/*sensor->ops->read_len = 6*/
	if (sensor->ops->read_len < 6) {
		DBG
		("%s:len is error,len=%d\n", __func__, sensor->ops->read_len);
		return  -1;
	}
	memset(data, 0, 6);

	*data = sensor->ops->read_reg;
#ifdef BMA2X2_SENSOR_IDENTIFICATION_ENABLE
	comres = sensor_rx_data(client, data, sensor->ops->read_len);
	x = (data[1] << 8) | data[0];
	y = (data[3] << 8) | data[2];
	z = (data[5] << 8) | data[4];
#else
	switch (sensor->devid) {
	case BMA255_CHIP_ID:
		comres = sensor_rx_data(client, data, sensor->ops->read_len);

		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X12_LSB) |
			 (BMA2X2_GET_BITSLICE(data[1],
				 BMA2X2_ACC_X_MSB) <<
					(BMA2X2_ACC_X12_LSB__LEN));
		x = x  <<  (sizeof(short) * 8 - (BMA2X2_ACC_X12_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));
		x = x >> (sizeof(short) * 8 - (BMA2X2_ACC_X12_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));

		y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y12_LSB) |
			 (BMA2X2_GET_BITSLICE(data[3],
				 BMA2X2_ACC_Y_MSB) <<
					(BMA2X2_ACC_Y12_LSB__LEN));
		y = y  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Y12_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));
		y = y >> (sizeof(short) * 8 - (BMA2X2_ACC_Y12_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));

		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z12_LSB) |
			 (BMA2X2_GET_BITSLICE(data[5],
				 BMA2X2_ACC_Z_MSB) <<
					(BMA2X2_ACC_Z12_LSB__LEN));
		z = z  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Z12_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		z = z >> (sizeof(short) * 8 - (BMA2X2_ACC_Z12_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		xyz_adc_rang = 0x800;
		break;
	case BMA250E_CHIP_ID:
	case BMA250_CHIP_ID:
		comres = sensor_rx_data(client, data, sensor->ops->read_len);

		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X10_LSB) |
			 (BMA2X2_GET_BITSLICE(data[1],
				 BMA2X2_ACC_X_MSB) <<
					(BMA2X2_ACC_X10_LSB__LEN));
		x = x  <<  (sizeof(short) * 8 - (BMA2X2_ACC_X10_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));
		x = x >> (sizeof(short) * 8 - (BMA2X2_ACC_X10_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));

		y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y10_LSB) |
			 (BMA2X2_GET_BITSLICE(data[3],
				 BMA2X2_ACC_Y_MSB) << (BMA2X2_ACC_Y10_LSB__LEN
									 ));
		y = y  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Y10_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));
		y = y >> (sizeof(short) * 8 - (BMA2X2_ACC_Y10_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));

		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z10_LSB) |
			 (BMA2X2_GET_BITSLICE(data[5],
				 BMA2X2_ACC_Z_MSB) <<
					(BMA2X2_ACC_Z10_LSB__LEN));
		z = z  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Z10_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		z = z >> (sizeof(short) * 8 - (BMA2X2_ACC_Z10_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		xyz_adc_rang = 0x200;
		/* compensation y axis*/
		x = x + (X_AXIS_COMPEN * xyz_adc_rang) / BMA2XX_RANGE;
		y = y + (Y_AXIS_COMPEN * xyz_adc_rang) / BMA2XX_RANGE;
		z = z + (Z_AXIS_COMPEN * xyz_adc_rang) / BMA2XX_RANGE;
		break;
	case BMA222E_CHIP_ID:
		comres = sensor_rx_data(client, data, sensor->ops->read_len);
		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X8_LSB) |
			 (BMA2X2_GET_BITSLICE(data[1],
				 BMA2X2_ACC_X_MSB) << (BMA2X2_ACC_X8_LSB__LEN));
		x = x  <<  (sizeof(short) * 8 - (BMA2X2_ACC_X8_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));
		x = x >> (sizeof(short) * 8 - (BMA2X2_ACC_X8_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));

		y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y8_LSB) |
			 (BMA2X2_GET_BITSLICE(data[3],
				 BMA2X2_ACC_Y_MSB) << (BMA2X2_ACC_Y8_LSB__LEN
									 ));
		y = y  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Y8_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));
		y = y >> (sizeof(short) * 8 - (BMA2X2_ACC_Y8_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));

		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z8_LSB) |
			 (BMA2X2_GET_BITSLICE(data[5],
				 BMA2X2_ACC_Z_MSB) << (BMA2X2_ACC_Z8_LSB__LEN));
		z = z  <<  (sizeof(short) * 8 - (BMA2X2_ACC_Z8_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		z = z >> (sizeof(short) * 8 - (BMA2X2_ACC_Z8_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		xyz_adc_rang = 0x80;
		break;
	case BMA280_CHIP_ID:
		comres = sensor_rx_data(client, data, sensor->ops->read_len);

		x = BMA2X2_GET_BITSLICE(data[0], BMA2X2_ACC_X14_LSB) |
			 (BMA2X2_GET_BITSLICE(data[1],
				BMA2X2_ACC_X_MSB) << (BMA2X2_ACC_X14_LSB__LEN));
		 x = x  <<  (sizeof(short) * 8  -  (BMA2X2_ACC_X14_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));
		 x = x >> (sizeof(short) * 8  -  (BMA2X2_ACC_X14_LSB__LEN +
					 BMA2X2_ACC_X_MSB__LEN));

		 y = BMA2X2_GET_BITSLICE(data[2], BMA2X2_ACC_Y14_LSB) |
			 (BMA2X2_GET_BITSLICE(data[3],
				BMA2X2_ACC_Y_MSB) << (BMA2X2_ACC_Y14_LSB__LEN));
		y = y  <<  (sizeof(short) * 8  -  (BMA2X2_ACC_Y14_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));
		y = y >> (sizeof(short) * 8  -  (BMA2X2_ACC_Y14_LSB__LEN +
					 BMA2X2_ACC_Y_MSB__LEN));

		z = BMA2X2_GET_BITSLICE(data[4], BMA2X2_ACC_Z14_LSB)  |
			 (BMA2X2_GET_BITSLICE(data[5],
			  BMA2X2_ACC_Z_MSB) << (BMA2X2_ACC_Z14_LSB__LEN));
		z = z  <<  (sizeof(short) * 8  -  (BMA2X2_ACC_Z14_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		z = z >> (sizeof(short) * 8  -  (BMA2X2_ACC_Z14_LSB__LEN +
					 BMA2X2_ACC_Z_MSB__LEN));
		xyz_adc_rang = 0x2000;
		break;
	default:
		return  -1;
	}
#endif

	axis.x = (pdata->orientation[0]) * x +
		(pdata->orientation[1]) * y +
		(pdata->orientation[2]) * z;
	axis.y = (pdata->orientation[3]) * x +
		(pdata->orientation[4]) * y +
		(pdata->orientation[5]) * z;
	axis.z = (pdata->orientation[6]) * x +
		(pdata->orientation[7]) * y +
		(pdata->orientation[8]) * z;

	axis.x = axis.x * (BMA2XX_RANGE / xyz_adc_rang);
	axis.y = axis.y * (BMA2XX_RANGE / xyz_adc_rang);
	axis.z = axis.z * (BMA2XX_RANGE / xyz_adc_rang);

	bma2x2_remap_sensor_data(client, &axis);

	gsensor_report_value(client, &axis);
	mutex_lock(&sensor->data_mutex);
	sensor->axis = axis;
	mutex_unlock(&sensor->data_mutex);

	if ((sensor->pdata->irq_enable) && (sensor->ops->int_status_reg >= 0)) {
		value = sensor_read_reg(client, sensor->ops->int_status_reg);
		DBG("%s:sensor int status :0x%x\n", __func__, value);
	}

	return comres;
}
#endif /* defined(BMA2X2_ENABLE_INT1) |  | defined(BMA2X2_ENABLE_INT2) */

/****************operate according to sensor chip:start************/
static int sensor_active(struct i2c_client *client, int enable, int rate)
{
	if (enable)
		bma2x2_set_mode(client, BMA2X2_MODE_NORMAL);
	else
		bma2x2_set_mode(client, BMA2X2_MODE_SUSPEND);

	return 0;
}

static int sensor_init(struct i2c_client *client)
{
	int ret = 0;
	int i = 0;
	unsigned char id_reg;
	unsigned char id_data = 0;
	struct sensor_private_data *sensor =
	    (struct sensor_private_data *)i2c_get_clientdata(client);

	ret = sensor->ops->active(client, 0, 0);
	if (ret) {
		DBG("%s:line=%d,error\n", __func__, __LINE__);
		return ret;
	}
	sensor->status_cur = SENSOR_OFF;
	/* read chip id */
	id_reg = sensor->ops->id_reg;
	for (i = 0; i < 3; i++) {
		ret = sensor_rx_data(client, &id_reg, 1);
		id_data = id_reg;
		if (!ret)
			break;
	}
	if (ret) {
		DBG("%s:fail to read id,ret=%d\n", __func__, ret);
		return ret;
	}
	sensor->devid = id_data;

	ret = bma2x2_set_bandwidth(client, BMA2X2_BW_SET);
	if (ret < 0)
		DBG("set bandwidth failed!\n");

	ret = bma2x2_set_range(client, BMA2X2_RANGE_SET);
	if (ret < 0)
		DBG("set g - range failed!\n");

#if defined(BMA2X2_ENABLE_INT1) || defined(BMA2X2_ENABLE_INT2)
		bma2x2_set_int_mode(client, 1);/*latch interrupt 250ms*/
#endif

#ifdef BMA2X2_ENABLE_INT1
		/* maps interrupt to INT1 pin */
		bma2x2_set_int1_pad_sel(client, PAD_LOWG);
		bma2x2_set_int1_pad_sel(client, PAD_HIGHG);
		bma2x2_set_int1_pad_sel(client, PAD_SLOP);
		bma2x2_set_int1_pad_sel(client, PAD_DOUBLE_TAP);
		bma2x2_set_int1_pad_sel(client, PAD_SINGLE_TAP);
		bma2x2_set_int1_pad_sel(client, PAD_ORIENT);
		bma2x2_set_int1_pad_sel(client, PAD_FLAT);
		bma2x2_set_int1_pad_sel(client, PAD_SLOW_NO_MOTION);
#endif

#ifdef BMA2X2_ENABLE_INT2
		/* maps interrupt to INT2 pin */
		bma2x2_set_int2_pad_sel(client, PAD_LOWG);
		bma2x2_set_int2_pad_sel(client, PAD_HIGHG);
		bma2x2_set_int2_pad_sel(client, PAD_SLOP);
		bma2x2_set_int2_pad_sel(client, PAD_DOUBLE_TAP);
		bma2x2_set_int2_pad_sel(client, PAD_SINGLE_TAP);
		bma2x2_set_int2_pad_sel(client, PAD_ORIENT);
		bma2x2_set_int2_pad_sel(client, PAD_FLAT);
		bma2x2_set_int2_pad_sel(client, PAD_SLOW_NO_MOTION);
#endif

	bma2x2_parse_dt(client);
	if (sensor->pdata->irq_enable) {
		ret = sensor_write_reg(client, BMA2X2_INT_CTRL_REG, 0x01);
		if (ret) {
			dev_err(&client->dev, "interrupt register setting failed!\n");
			return ret;
		}
		if (slope_mode) {
			ret = sensor_write_reg(client,
					       BMA2X2_INT1_PAD_SEL_REG,
					       0x04);
			if (ret) {
				dev_err(&client->dev, "interrupt map register setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_SLOPE_DURN_REG,
					       interrupt_dur);
			if (ret) {
				dev_err(&client->dev, "interrupt delay time register setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_SLOPE_THRES_REG,
					       interrupt_threshold);
			if (ret) {
				dev_err(&client->dev, "high - g interrupt threshold setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_INT_ENABLE1_REG,
					       0x07);
			if (ret) {
				dev_err(&client->dev, "interrupt engines register setting failed!\n");
				return ret;
			}
		} else if (high_g_mode) {
			ret = sensor_write_reg(client,
					       BMA2X2_INT1_PAD_SEL_REG,
					       0x02);
			if (ret) {
				dev_err(&client->dev, "interrupt map register setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_HIGH_DURN_REG,
					       interrupt_dur);
			if (ret) {
				dev_err(&client->dev, "interrupt delay time register setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_HIGH_THRES_REG,
					       interrupt_threshold);
			if (ret) {
				dev_err(&client->dev, "high - g interrupt threshold setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_INT_ENABLE2_REG,
					       0x03);
			if (ret) {
				dev_err(&client->dev, "interrupt engines register setting failed!\n");
				return ret;
			}
		} else {
			ret = sensor_write_reg(client,
					       BMA2X2_INT_DATA_SEL_REG,
					       0x01);
			if (ret) {
				dev_err(&client->dev, "interrupt map register setting failed!\n");
				return ret;
			}
			ret = sensor_write_reg(client,
					       BMA2X2_INT_ENABLE2_REG,
					       0x10);
			if (ret) {
				dev_err(&client->dev, "interrupt engines register setting failed!\n");
				return ret;
			}
		}
	}

	return ret;
}

static struct sensor_operate gsensor_bma2x2_ops = {
	.name		= "bma2xx_acc",
	/*sensor type and it should be correct*/
	.type		= SENSOR_TYPE_ACCEL,
	.id_i2c		= ACCEL_ID_BMA2XX,	/*i2c id number*/
	.read_reg	= BMA2X2_X_AXIS_LSB_REG,/*read data*/
	.read_len	= 6,			/*data length*/
	/* read device id from this register */
	.id_reg		= BMA2X2_CHIP_ID_REG,
	.id_data	= BMA250_CHIP_ID,	/* device id */
	.precision	= SENSOR_UNKNOW_DATA,	/*12 bit*/
	.ctrl_reg	= BMA2X2_MODE_CTRL_REG,	/*enable or disable*/
	/*intterupt status register*/
	.int_status_reg	= BMA2X2_STATUS2_REG,
	.range		= {-BMA2XX_RANGE, BMA2XX_RANGE},/*range*/
	.trig		= IRQF_TRIGGER_HIGH  |  IRQF_ONESHOT,
	.active		= sensor_active,
	.init		= sensor_init,
	.report		= sensor_report_value,
};

/****************operate according to sensor chip:end************/
static int gsensor_bma2x2_probe(struct i2c_client *client,
				 const struct i2c_device_id *devid)
{
	return sensor_register_device(client, NULL, devid, &gsensor_bma2x2_ops);
}

static int gsensor_bma2x2_remove(struct i2c_client *client)
{
	return sensor_unregister_device(client, NULL, &gsensor_bma2x2_ops);
}

static const struct i2c_device_id gsensor_bma2x2_id[] = {
	{"bma2xx_acc", ACCEL_ID_BMA2XX},
	{}
};

static struct i2c_driver gsensor_bma2x2_driver = {
	.probe = gsensor_bma2x2_probe,
	.remove = gsensor_bma2x2_remove,
	.shutdown = sensor_shutdown,
	.id_table = gsensor_bma2x2_id,
	.driver = {
		.name = "gsensor_bma2x2",
#ifdef CONFIG_PM
		.pm = &sensor_pm_ops,
#endif
	},
};

module_i2c_driver(gsensor_bma2x2_driver);

MODULE_AUTHOR("Bin Yang <yangbin@rock - chips.com>");
MODULE_DESCRIPTION("bma2x2 3-Axis accelerometer driver");
MODULE_LICENSE("GPL");