/* Date: 2011/4/8 11:00:00
* Revision: 2.5
*/
/*
* This software program is licensed subject to the GNU General Public License
* (GPL).Version 2,June 1991, available at http://www.fsf.org/copyleft/gpl.html
* (C) Copyright 2011 Bosch Sensortec GmbH
* All Rights Reserved
*/
/* file BMA250.c
brief This file contains all function implementations for the BMA250 in linux
*/
#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/init-input.h>
//#include <mach/system.h>
#include <mach/hardware.h>
#ifdef CONFIG_HAS_EARLYSUSPEND
#include <linux/earlysuspend.h>
#endif
#if defined(CONFIG_HAS_EARLYSUSPEND) || defined(CONFIG_PM)
#include <linux/pm.h>
#endif
enum {
DEBUG_INIT = 1U << 0,
DEBUG_CONTROL_INFO = 1U << 1,
DEBUG_DATA_INFO = 1U << 2,
DEBUG_SUSPEND = 1U << 3,
};
static u32 debug_mask = 0;
#define dprintk(level_mask, fmt, arg...) if (unlikely(debug_mask & level_mask)) \
printk(KERN_DEBUG fmt , ## arg)
//#define dprintk(level_mask, fmt, arg...) printk(fmt, ## arg)
module_param_named(debug_mask, debug_mask, int, 0644);
#define SENSOR_NAME "bma250"
#define GRAVITY_EARTH 9806550
#define ABSMIN_2G (-GRAVITY_EARTH * 2)
#define ABSMAX_2G (GRAVITY_EARTH * 2)
#define SLOPE_THRESHOLD_VALUE 32
#define SLOPE_DURATION_VALUE 1
#define INTERRUPT_LATCH_MODE 13
#define INTERRUPT_ENABLE 1
#define INTERRUPT_DISABLE 0
#define MAP_SLOPE_INTERRUPT 2
#define SLOPE_X_INDEX 5
#define SLOPE_Y_INDEX 6
#define SLOPE_Z_INDEX 7
#define BMA250_MAX_DELAY 200
#define BMA150_CHIP_ID 2
#define BMA250_CHIP_ID 3
#define BMA250E_CHIP_ID 0xF9
#define BMA250_RANGE_SET 0
#define BMA250_BW_SET 4
/*
*
* register definitions
*
*/
#define BMA250_CHIP_ID_REG 0x00
#define BMA250_VERSION_REG 0x01
#define BMA250_X_AXIS_LSB_REG 0x02
#define BMA250_X_AXIS_MSB_REG 0x03
#define BMA250_Y_AXIS_LSB_REG 0x04
#define BMA250_Y_AXIS_MSB_REG 0x05
#define BMA250_Z_AXIS_LSB_REG 0x06
#define BMA250_Z_AXIS_MSB_REG 0x07
#define BMA250_TEMP_RD_REG 0x08
#define BMA250_STATUS1_REG 0x09
#define BMA250_STATUS2_REG 0x0A
#define BMA250_STATUS_TAP_SLOPE_REG 0x0B
#define BMA250_STATUS_ORIENT_HIGH_REG 0x0C
#define BMA250_RANGE_SEL_REG 0x0F
#define BMA250_BW_SEL_REG 0x10
#define BMA250_MODE_CTRL_REG 0x11
#define BMA250_LOW_NOISE_CTRL_REG 0x12
#define BMA250_DATA_CTRL_REG 0x13
#define BMA250_RESET_REG 0x14
#define BMA250_INT_ENABLE1_REG 0x16
#define BMA250_INT_ENABLE2_REG 0x17
#define BMA250_INT1_PAD_SEL_REG 0x19
#define BMA250_INT_DATA_SEL_REG 0x1A
#define BMA250_INT2_PAD_SEL_REG 0x1B
#define BMA250_INT_SRC_REG 0x1E
#define BMA250_INT_SET_REG 0x20
#define BMA250_INT_CTRL_REG 0x21
#define BMA250_LOW_DURN_REG 0x22
#define BMA250_LOW_THRES_REG 0x23
#define BMA250_LOW_HIGH_HYST_REG 0x24
#define BMA250_HIGH_DURN_REG 0x25
#define BMA250_HIGH_THRES_REG 0x26
#define BMA250_SLOPE_DURN_REG 0x27
#define BMA250_SLOPE_THRES_REG 0x28
#define BMA250_TAP_PARAM_REG 0x2A
#define BMA250_TAP_THRES_REG 0x2B
#define BMA250_ORIENT_PARAM_REG 0x2C
#define BMA250_THETA_BLOCK_REG 0x2D
#define BMA250_THETA_FLAT_REG 0x2E
#define BMA250_FLAT_HOLD_TIME_REG 0x2F
#define BMA250_STATUS_LOW_POWER_REG 0x31
#define BMA250_SELF_TEST_REG 0x32
#define BMA250_EEPROM_CTRL_REG 0x33
#define BMA250_SERIAL_CTRL_REG 0x34
#define BMA250_CTRL_UNLOCK_REG 0x35
#define BMA250_OFFSET_CTRL_REG 0x36
#define BMA250_OFFSET_PARAMS_REG 0x37
#define BMA250_OFFSET_FILT_X_REG 0x38
#define BMA250_OFFSET_FILT_Y_REG 0x39
#define BMA250_OFFSET_FILT_Z_REG 0x3A
#define BMA250_OFFSET_UNFILT_X_REG 0x3B
#define BMA250_OFFSET_UNFILT_Y_REG 0x3C
#define BMA250_OFFSET_UNFILT_Z_REG 0x3D
#define BMA250_SPARE_0_REG 0x3E
#define BMA250_SPARE_1_REG 0x3F
#define BMA250_ACC_X_LSB__POS 6
#define BMA250_ACC_X_LSB__LEN 2
#define BMA250_ACC_X_LSB__MSK 0xC0
#define BMA250_ACC_X_LSB__REG BMA250_X_AXIS_LSB_REG
#define BMA250_ACC_X_MSB__POS 0
#define BMA250_ACC_X_MSB__LEN 8
#define BMA250_ACC_X_MSB__MSK 0xFF
#define BMA250_ACC_X_MSB__REG BMA250_X_AXIS_MSB_REG
#define BMA250_ACC_Y_LSB__POS 6
#define BMA250_ACC_Y_LSB__LEN 2
#define BMA250_ACC_Y_LSB__MSK 0xC0
#define BMA250_ACC_Y_LSB__REG BMA250_Y_AXIS_LSB_REG
#define BMA250_ACC_Y_MSB__POS 0
#define BMA250_ACC_Y_MSB__LEN 8
#define BMA250_ACC_Y_MSB__MSK 0xFF
#define BMA250_ACC_Y_MSB__REG BMA250_Y_AXIS_MSB_REG
#define BMA250_ACC_Z_LSB__POS 6
#define BMA250_ACC_Z_LSB__LEN 2
#define BMA250_ACC_Z_LSB__MSK 0xC0
#define BMA250_ACC_Z_LSB__REG BMA250_Z_AXIS_LSB_REG
#define BMA250_ACC_Z_MSB__POS 0
#define BMA250_ACC_Z_MSB__LEN 8
#define BMA250_ACC_Z_MSB__MSK 0xFF
#define BMA250_ACC_Z_MSB__REG BMA250_Z_AXIS_MSB_REG
#define BMA250_RANGE_SEL__POS 0
#define BMA250_RANGE_SEL__LEN 4
#define BMA250_RANGE_SEL__MSK 0x0F
#define BMA250_RANGE_SEL__REG BMA250_RANGE_SEL_REG
#define BMA250_BANDWIDTH__POS 0
#define BMA250_BANDWIDTH__LEN 5
#define BMA250_BANDWIDTH__MSK 0x1F
#define BMA250_BANDWIDTH__REG BMA250_BW_SEL_REG
#define BMA250_EN_LOW_POWER__POS 6
#define BMA250_EN_LOW_POWER__LEN 1
#define BMA250_EN_LOW_POWER__MSK 0x40
#define BMA250_EN_LOW_POWER__REG BMA250_MODE_CTRL_REG
#define BMA250_EN_SUSPEND__POS 7
#define BMA250_EN_SUSPEND__LEN 1
#define BMA250_EN_SUSPEND__MSK 0x80
#define BMA250_EN_SUSPEND__REG BMA250_MODE_CTRL_REG
#define BMA250_GET_BITSLICE(regvar, bitname)\
((regvar & bitname##__MSK) >> bitname##__POS)
#define BMA250_SET_BITSLICE(regvar, bitname, val)\
((regvar & ~bitname##__MSK) | ((val<<bitname##__POS)&bitname##__MSK))
/* range and bandwidth */
#define BMA250_RANGE_2G 0
#define BMA250_RANGE_4G 1
#define BMA250_RANGE_8G 2
#define BMA250_RANGE_16G 3
#define BMA250_BW_7_81HZ 0x08
#define BMA250_BW_15_63HZ 0x09
#define BMA250_BW_31_25