input: mpu3050: Update HTC version of MPU3050 sensor
* HTC kernel version: m7-kk-3.4.10-17db3b4
Change-Id: If99645b2d370da57c359557cdd2b3b0a3be19531
diff --git a/drivers/input/misc/mpu3050/accel/bma250.c b/drivers/input/misc/mpu3050/accel/bma250.c
index 3f6a8ae..9c03eb4 100644
--- a/drivers/input/misc/mpu3050/accel/bma250.c
+++ b/drivers/input/misc/mpu3050/accel/bma250.c
@@ -23,7 +23,8 @@
#include <linux/module.h>
#endif
#include <linux/delay.h>
-
+#include <linux/device.h>
+#include <linux/err.h>
#include "mpu.h"
#include "mlos.h"
#include "mlsl.h"
@@ -51,6 +52,268 @@
if (debug_flag) \
printk(KERN_DEBUG "[GSNR][BMA250 DEBUG] " x)
+#ifdef CONFIG_CIR_ALWAYS_READY
+#define BMA250_INT_CTRL_REG 0x21
+#define BMA250_INT_MODE_SEL__POS 0
+#define BMA250_INT_MODE_SEL__LEN 4
+#define BMA250_INT_MODE_SEL__MSK 0x0F
+#define BMA250_INT_MODE_SEL__REG BMA250_INT_CTRL_REG
+
+#define BMA250_STATUS1_REG 0x09
+
+#define BMA250_LOWG_INT_S__POS 0
+#define BMA250_LOWG_INT_S__LEN 1
+#define BMA250_LOWG_INT_S__MSK 0x01
+#define BMA250_LOWG_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_HIGHG_INT_S__POS 1
+#define BMA250_HIGHG_INT_S__LEN 1
+#define BMA250_HIGHG_INT_S__MSK 0x02
+#define BMA250_HIGHG_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_SLOPE_INT_S__POS 2
+#define BMA250_SLOPE_INT_S__LEN 1
+#define BMA250_SLOPE_INT_S__MSK 0x04
+#define BMA250_SLOPE_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_DOUBLE_TAP_INT_S__POS 4
+#define BMA250_DOUBLE_TAP_INT_S__LEN 1
+#define BMA250_DOUBLE_TAP_INT_S__MSK 0x10
+#define BMA250_DOUBLE_TAP_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_SINGLE_TAP_INT_S__POS 5
+#define BMA250_SINGLE_TAP_INT_S__LEN 1
+#define BMA250_SINGLE_TAP_INT_S__MSK 0x20
+#define BMA250_SINGLE_TAP_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_ORIENT_INT_S__POS 6
+#define BMA250_ORIENT_INT_S__LEN 1
+#define BMA250_ORIENT_INT_S__MSK 0x40
+#define BMA250_ORIENT_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_FLAT_INT_S__POS 7
+#define BMA250_FLAT_INT_S__LEN 1
+#define BMA250_FLAT_INT_S__MSK 0x80
+#define BMA250_FLAT_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_DATA_INT_S__POS 7
+#define BMA250_DATA_INT_S__LEN 1
+#define BMA250_DATA_INT_S__MSK 0x80
+#define BMA250_DATA_INT_S__REG BMA250_STATUS2_REG
+
+
+#define BMA250_INT1_PAD_SEL_REG 0x19
+
+#define BMA250_EN_INT1_PAD_LOWG__POS 0
+#define BMA250_EN_INT1_PAD_LOWG__LEN 1
+#define BMA250_EN_INT1_PAD_LOWG__MSK 0x01
+#define BMA250_EN_INT1_PAD_LOWG__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_HIGHG__POS 1
+#define BMA250_EN_INT1_PAD_HIGHG__LEN 1
+#define BMA250_EN_INT1_PAD_HIGHG__MSK 0x02
+#define BMA250_EN_INT1_PAD_HIGHG__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_SLOPE__POS 2
+#define BMA250_EN_INT1_PAD_SLOPE__LEN 1
+#define BMA250_EN_INT1_PAD_SLOPE__MSK 0x04
+#define BMA250_EN_INT1_PAD_SLOPE__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_DB_TAP__POS 4
+#define BMA250_EN_INT1_PAD_DB_TAP__LEN 1
+#define BMA250_EN_INT1_PAD_DB_TAP__MSK 0x10
+#define BMA250_EN_INT1_PAD_DB_TAP__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_SNG_TAP__POS 5
+#define BMA250_EN_INT1_PAD_SNG_TAP__LEN 1
+#define BMA250_EN_INT1_PAD_SNG_TAP__MSK 0x20
+#define BMA250_EN_INT1_PAD_SNG_TAP__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_ORIENT__POS 6
+#define BMA250_EN_INT1_PAD_ORIENT__LEN 1
+#define BMA250_EN_INT1_PAD_ORIENT__MSK 0x40
+#define BMA250_EN_INT1_PAD_ORIENT__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_FLAT__POS 7
+#define BMA250_EN_INT1_PAD_FLAT__LEN 1
+#define BMA250_EN_INT1_PAD_FLAT__MSK 0x80
+#define BMA250_EN_INT1_PAD_FLAT__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_INT_ENABLE1_REG 0x16
+#define BMA250_INT_ENABLE2_REG 0x17
+
+#define BMA250_EN_SLOPE_X_INT__POS 0
+#define BMA250_EN_SLOPE_X_INT__LEN 1
+#define BMA250_EN_SLOPE_X_INT__MSK 0x01
+#define BMA250_EN_SLOPE_X_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SLOPE_Y_INT__POS 1
+#define BMA250_EN_SLOPE_Y_INT__LEN 1
+#define BMA250_EN_SLOPE_Y_INT__MSK 0x02
+#define BMA250_EN_SLOPE_Y_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SLOPE_Z_INT__POS 2
+#define BMA250_EN_SLOPE_Z_INT__LEN 1
+#define BMA250_EN_SLOPE_Z_INT__MSK 0x04
+#define BMA250_EN_SLOPE_Z_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SLOPE_XYZ_INT__POS 0
+#define BMA250_EN_SLOPE_XYZ_INT__LEN 3
+#define BMA250_EN_SLOPE_XYZ_INT__MSK 0x07
+#define BMA250_EN_SLOPE_XYZ_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_DOUBLE_TAP_INT__POS 4
+#define BMA250_EN_DOUBLE_TAP_INT__LEN 1
+#define BMA250_EN_DOUBLE_TAP_INT__MSK 0x10
+#define BMA250_EN_DOUBLE_TAP_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SINGLE_TAP_INT__POS 5
+#define BMA250_EN_SINGLE_TAP_INT__LEN 1
+#define BMA250_EN_SINGLE_TAP_INT__MSK 0x20
+#define BMA250_EN_SINGLE_TAP_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_ORIENT_INT__POS 6
+#define BMA250_EN_ORIENT_INT__LEN 1
+#define BMA250_EN_ORIENT_INT__MSK 0x40
+#define BMA250_EN_ORIENT_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_FLAT_INT__POS 7
+#define BMA250_EN_FLAT_INT__LEN 1
+#define BMA250_EN_FLAT_INT__MSK 0x80
+#define BMA250_EN_FLAT_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_HIGHG_X_INT__POS 0
+#define BMA250_EN_HIGHG_X_INT__LEN 1
+#define BMA250_EN_HIGHG_X_INT__MSK 0x01
+#define BMA250_EN_HIGHG_X_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_HIGHG_Y_INT__POS 1
+#define BMA250_EN_HIGHG_Y_INT__LEN 1
+#define BMA250_EN_HIGHG_Y_INT__MSK 0x02
+#define BMA250_EN_HIGHG_Y_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_HIGHG_Z_INT__POS 2
+#define BMA250_EN_HIGHG_Z_INT__LEN 1
+#define BMA250_EN_HIGHG_Z_INT__MSK 0x04
+#define BMA250_EN_HIGHG_Z_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_HIGHG_XYZ_INT__POS 2
+#define BMA250_EN_HIGHG_XYZ_INT__LEN 1
+#define BMA250_EN_HIGHG_XYZ_INT__MSK 0x04
+#define BMA250_EN_HIGHG_XYZ_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_LOWG_INT__POS 3
+#define BMA250_EN_LOWG_INT__LEN 1
+#define BMA250_EN_LOWG_INT__MSK 0x08
+#define BMA250_EN_LOWG_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_NEW_DATA_INT__POS 4
+#define BMA250_EN_NEW_DATA_INT__LEN 1
+#define BMA250_EN_NEW_DATA_INT__MSK 0x10
+#define BMA250_EN_NEW_DATA_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_MODE_CTRL_REG 0x11
+
+#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_ORIENT_PARAM_REG 0x2C
+
+#define BMA250_ORIENT_MODE__POS 0
+#define BMA250_ORIENT_MODE__LEN 2
+#define BMA250_ORIENT_MODE__MSK 0x03
+#define BMA250_ORIENT_MODE__REG BMA250_ORIENT_PARAM_REG
+
+#define BMA250_ORIENT_BLOCK__POS 2
+#define BMA250_ORIENT_BLOCK__LEN 2
+#define BMA250_ORIENT_BLOCK__MSK 0x0C
+#define BMA250_ORIENT_BLOCK__REG BMA250_ORIENT_PARAM_REG
+
+#define BMA250_ORIENT_HYST__POS 4
+#define BMA250_ORIENT_HYST__LEN 3
+#define BMA250_ORIENT_HYST__MSK 0x70
+#define BMA250_ORIENT_HYST__REG BMA250_ORIENT_PARAM_REG
+
+#define BMA250_SLOPE_DURN_REG 0x27
+
+#define BMA250_SLOPE_DUR__POS 0
+#define BMA250_SLOPE_DUR__LEN 2
+#define BMA250_SLOPE_DUR__MSK 0x03
+#define BMA250_SLOPE_DUR__REG BMA250_SLOPE_DURN_REG
+
+#define BMA250_SLOPE_THRES_REG 0x28
+
+#define BMA250_SLOPE_THRES__POS 0
+#define BMA250_SLOPE_THRES__LEN 8
+#define BMA250_SLOPE_THRES__MSK 0xFF
+#define BMA250_SLOPE_THRES__REG BMA250_SLOPE_THRES_REG
+
+#define BMA250_THETA_FLAT_REG 0x2E
+
+#define BMA250_THETA_FLAT__POS 0
+#define BMA250_THETA_FLAT__LEN 6
+#define BMA250_THETA_FLAT__MSK 0x3F
+#define BMA250_THETA_FLAT__REG BMA250_THETA_FLAT_REG
+
+#define BMA250_FLAT_HOLD_TIME_REG 0x2F
+
+#define BMA250_FLAT_HOLD_TIME__POS 4
+#define BMA250_FLAT_HOLD_TIME__LEN 2
+#define BMA250_FLAT_HOLD_TIME__MSK 0x30
+#define BMA250_FLAT_HOLD_TIME__REG BMA250_FLAT_HOLD_TIME_REG
+
+
+#define BMA250_BW_SEL_REG 0x10
+#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_BW_7_81HZ 0x08
+#define BMA250_BW_15_63HZ 0x09
+#define BMA250_BW_31_25HZ 0x0A
+#define BMA250_BW_62_50HZ 0x0B
+#define BMA250_BW_125HZ 0x0C
+#define BMA250_BW_250HZ 0x0D
+#define BMA250_BW_500HZ 0x0E
+#define BMA250_BW_1000HZ 0x0F
+#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))
+
+#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 BMA250_MODE_NORMAL 0
+#define BMA250_MODE_LOWPOWER 1
+#define BMA250_MODE_SUSPEND 2
+
+
+static void *g_mlsl_handle;
+static struct ext_slave_platform_data *g_pdata;
+int cir_flag = 0;
+static int power_key_pressed = 0;
+static int (*gsensor_power_LPM)(int on) = NULL;
+
+
+EXPORT_SYMBOL(cir_flag);
+#endif
struct bma250_config {
unsigned int odr;
@@ -68,6 +331,254 @@
unsigned char state;
};
+#ifdef CONFIG_CIR_ALWAYS_READY
+static int bma250_set_slope_threshold(void *mlsl_handle, struct ext_slave_platform_data *pdata,
+ unsigned char threshold)
+{
+ int comres = 0;
+ unsigned char data = 0;
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address,
+ BMA250_SLOPE_THRES__REG, 1, &data);
+
+ data = BMA250_SET_BITSLICE(data, BMA250_SLOPE_THRES, threshold);
+ comres += MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ BMA250_SLOPE_THRES__REG, data);
+
+
+ return comres;
+}
+
+static int bma250_set_slope_duration(void *mlsl_handle, struct ext_slave_platform_data *pdata, unsigned char
+ duration)
+{
+ int comres = 0;
+ unsigned char data = 0;
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address,
+ BMA250_SLOPE_DUR__REG, 1, &data);
+
+ data = BMA250_SET_BITSLICE(data, BMA250_SLOPE_DUR, duration);
+ comres += MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ BMA250_SLOPE_DUR__REG, data);
+
+
+ return comres;
+}
+static int bma250_set_mode(void *mlsl_handle, struct ext_slave_platform_data *pdata, unsigned char Mode)
+{
+ int comres = 0;
+ unsigned char data1 = 0;
+
+
+ if (Mode < 3) {
+ comres = MLSLSerialRead(mlsl_handle, pdata->address,
+ BMA250_EN_LOW_POWER__REG, 1, &data1);
+ switch (Mode) {
+ case BMA250_MODE_NORMAL:
+ data1 = BMA250_SET_BITSLICE(data1,
+ BMA250_EN_LOW_POWER, 0);
+ data1 = BMA250_SET_BITSLICE(data1,
+ BMA250_EN_SUSPEND, 0);
+ break;
+ case BMA250_MODE_LOWPOWER:
+ data1 = BMA250_SET_BITSLICE(data1,
+ BMA250_EN_LOW_POWER, 1);
+ data1 = BMA250_SET_BITSLICE(data1,
+ BMA250_EN_SUSPEND, 0);
+ break;
+ case BMA250_MODE_SUSPEND:
+ data1 = BMA250_SET_BITSLICE(data1,
+ BMA250_EN_LOW_POWER, 0);
+ data1 = BMA250_SET_BITSLICE(data1,
+ BMA250_EN_SUSPEND, 1);
+ break;
+ default:
+ break;
+ }
+
+ comres += MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ BMA250_EN_LOW_POWER__REG, data1);
+ } else{
+ comres = -1;
+ }
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address,
+ BMA250_EN_LOW_POWER__REG, 1, &data1);
+
+ printk(KERN_INFO "[BMA250] power mode = %x", data1);
+
+ return comres;
+}
+static int bma250_set_int1_pad_sel(void *mlsl_handle, struct ext_slave_platform_data *pdata, unsigned char
+ int1sel)
+{
+ int comres = 0;
+ unsigned char data = 0;
+ unsigned char state;
+ state = 0x01;
+
+
+ switch (int1sel) {
+ case 0:
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_EN_INT1_PAD_LOWG__REG, 1,
+ &data);
+ printk(KERN_INFO "[BMA250] before set LOWG data = %x", data);
+ data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_LOWG,
+ state);
+ comres = MLSLSerialWriteSingle(mlsl_handle, pdata->address, BMA250_EN_INT1_PAD_LOWG__REG, data);
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_EN_INT1_PAD_LOWG__REG, 1,
+ &data);
+ printk(KERN_INFO "[BMA250] after set LOWG data = %x", data);
+ break;
+ case 2:
+ comres = MLSLSerialRead(mlsl_handle, pdata->address,
+ BMA250_EN_INT1_PAD_SLOPE__REG, 1, &data);
+ printk(KERN_INFO "[BMA250] before set Slop data = %x", data);
+ data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_SLOPE,
+ state);
+ comres = MLSLSerialWriteSingle(mlsl_handle,pdata->address,
+ BMA250_EN_INT1_PAD_SLOPE__REG, data);
+ printk(KERN_INFO "[BMA250] after set Slop data = %x", data);
+ break;
+ case 4:
+ comres = MLSLSerialRead(mlsl_handle, pdata->address,
+ BMA250_EN_INT1_PAD_SNG_TAP__REG, 1, &data);
+ data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_SNG_TAP,
+ state);
+ comres = MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ BMA250_EN_INT1_PAD_SNG_TAP__REG, data);
+ break;
+ case 6:
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_EN_INT1_PAD_FLAT__REG, 1,
+ &data);
+ printk(KERN_INFO "[BMA250] before set FLAT data = %x", data);
+ data = BMA250_SET_BITSLICE(data, BMA250_EN_INT1_PAD_FLAT,
+ state);
+ comres = MLSLSerialWriteSingle(mlsl_handle, pdata->address, BMA250_EN_INT1_PAD_FLAT__REG, data);
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_EN_INT1_PAD_FLAT__REG, 1,
+ &data);
+ printk(KERN_INFO "[BMA250] after set FLAT data = %x", data);
+ break;
+ default:
+ break;
+ }
+
+ return comres;
+}
+static int bma250_set_Int_Mode(void *mlsl_handle, struct ext_slave_platform_data *pdata, unsigned char mode)
+{
+ int comres = 0;
+ unsigned char data = 0;
+
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_INT_MODE_SEL__REG, 1,
+ &data);
+ printk(KERN_INFO "[BMA250] before set int mode = %x", data);
+ data = BMA250_SET_BITSLICE(data, BMA250_INT_MODE_SEL,
+ mode);
+ comres = MLSLSerialWriteSingle(mlsl_handle, pdata->address, BMA250_INT_MODE_SEL__REG, data);
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_INT_MODE_SEL__REG, 1,
+ &data);
+ printk(KERN_INFO "[BMA250] after set int mode = %x", data);
+ return comres;
+}
+static int bma250_set_Int_Enable(void *mlsl_handle, struct ext_slave_platform_data *pdata, unsigned char
+ InterruptType , unsigned char value)
+{
+ int comres = 0;
+ unsigned char data1 = 0, data2 = 0;
+
+ printk(KERN_INFO "[BMA250] before set int enable 1 = %x, int enable 2 = %x\n", data1, data2);
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_INT_ENABLE1_REG, 1, &data1);
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_INT_ENABLE2_REG, 1, &data2);
+
+ value = value & 1;
+ switch (InterruptType) {
+ case 0:
+
+ data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_LOWG_INT, value);
+ break;
+ case 1:
+
+
+ data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_HIGHG_X_INT,
+ value);
+ break;
+ case 2:
+
+
+ data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_HIGHG_Y_INT,
+ value);
+ break;
+ case 3:
+
+
+ data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_HIGHG_Z_INT,
+ value);
+ break;
+ case 4:
+
+
+ data2 = BMA250_SET_BITSLICE(data2, BMA250_EN_NEW_DATA_INT,
+ value);
+ break;
+ case 5:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SLOPE_X_INT,
+ value);
+ break;
+ case 6:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SLOPE_Y_INT,
+ value);
+ break;
+ case 7:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SLOPE_Z_INT,
+ value);
+ break;
+ case 8:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_SINGLE_TAP_INT,
+ value);
+ break;
+ case 9:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_DOUBLE_TAP_INT,
+ value);
+ break;
+ case 10:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_ORIENT_INT, value);
+ break;
+ case 11:
+
+
+ data1 = BMA250_SET_BITSLICE(data1, BMA250_EN_FLAT_INT, value);
+ break;
+ default:
+ break;
+ }
+ comres = MLSLSerialWriteSingle(mlsl_handle, pdata->address, BMA250_INT_ENABLE1_REG,
+ data1);
+ comres = MLSLSerialWriteSingle(mlsl_handle, pdata->address, BMA250_INT_ENABLE2_REG,
+ data2);
+
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_INT_ENABLE1_REG, 1, &data1);
+ comres = MLSLSerialRead(mlsl_handle, pdata->address, BMA250_INT_ENABLE2_REG, 1, &data2);
+ printk(KERN_INFO "[BMA250] after set int enable 1 = %x, int enable 2 = %x\n", data1, data2);
+ return comres;
+}
+#endif
static int set_normal_mode(void *mlsl_handle,
struct ext_slave_platform_data *pdata)
{
@@ -112,6 +623,7 @@
if (apply) {
+#ifndef CONFIG_CIR_ALWAYS_READY
if (!config->power_mode) {
result = MLSLSerialWriteSingle(mlsl_handle,
@@ -121,6 +633,8 @@
MLOSSleep(1);
}
+#endif
+
result = MLSLSerialWriteSingle(mlsl_handle, pdata->address,
BOSCH_CTRL_REG, config->ctrl_reg);
ERROR_CHECK(result);
@@ -129,7 +643,11 @@
BOSCH_INT_REG, config->int_reg);
ERROR_CHECK(result);
+#ifdef CONFIG_CIR_ALWAYS_READY
+ if (!config->power_mode && !cir_flag) {
+#else
if (!config->power_mode) {
+#endif
result = MLSLSerialWriteSingle(mlsl_handle,
pdata->address, BOSCH_PWR_REG, 0x80);
ERROR_CHECK(result);
@@ -150,6 +668,7 @@
{
unsigned char odr_bits = 0;
unsigned char wup_bits = 0;
+ unsigned char read_from_chip_bw = 0;
int result = ML_SUCCESS;
@@ -195,18 +714,32 @@
MPL_LOGV("ODR: %d \n", config->odr);
if (apply) {
+#ifndef CONFIG_CIR_ALWAYS_READY
+#if 0
result = MLSLSerialWriteSingle(mlsl_handle,
pdata->address, BMA250_REG_SOFT_RESET,
0xB6);
ERROR_CHECK(result);
MLOSSleep(1);
-
- result = MLSLSerialWriteSingle(mlsl_handle,
- pdata->address, BMA250_BW_REG,
- config->bw_reg);
+#endif
+#endif
+ result = MLSLSerialRead(mlsl_handle,
+ pdata->address, BMA250_BW_REG, 1,
+ &read_from_chip_bw);
ERROR_CHECK(result);
+ if (odr_bits != read_from_chip_bw) {
+ D("%s: Really set ODR to %d\n", __func__,
+ config->odr);
+ result = MLSLSerialWriteSingle(mlsl_handle,
+ pdata->address, BMA250_BW_REG,
+ config->bw_reg);
+ ERROR_CHECK(result);
+
+ MLOSSleep(25);
+ }
+
if (!config->power_mode) {
@@ -216,8 +749,10 @@
ERROR_CHECK(result);
MLOSSleep(1);
} else {
+#if 0
result = set_normal_mode(mlsl_handle, pdata);
ERROR_CHECK(result);
+#endif
}
}
@@ -256,7 +791,7 @@
MPL_LOGV("FSR: %d \n", config->fsr);
if (apply) {
-
+#ifndef CONFIG_CIR_ALWAYS_READY
if (!config->power_mode) {
result = MLSLSerialWriteSingle(mlsl_handle,
@@ -264,6 +799,7 @@
ERROR_CHECK(result);
MLOSSleep(1);
}
+#endif
result = MLSLSerialWriteSingle(mlsl_handle, pdata->address,
BOSCH_CTRL_REG, config->ctrl_reg);
@@ -306,12 +842,18 @@
- if (!private_data->suspend.power_mode) {
+#ifdef CONFIG_CIR_ALWAYS_READY
+
+ if ((!private_data->suspend.power_mode && !cir_flag)) {
+#else
+ if ((!private_data->suspend.power_mode)) {
+#endif
+
result = MLSLSerialWriteSingle(mlsl_handle, pdata->address,
BOSCH_PWR_REG, 0x80);
+ printk(KERN_INFO "[BMA250] GSensor Low Power Mode\n");
ERROR_CHECK(result);
- }
-
+ }
return result;
}
@@ -327,16 +869,21 @@
unsigned char int_reg;
struct bma250_private_data *private_data = pdata->private_data;
+
+
+
ctrl_reg = private_data->resume.ctrl_reg;
bw_reg = private_data->resume.bw_reg;
int_reg = private_data->resume.int_reg;
private_data->state = 0;
+#ifndef CONFIG_CIR_ALWAYS_READY
result = MLSLSerialWriteSingle(mlsl_handle, pdata->address,
BMA250_REG_SOFT_RESET, 0xB6);
ERROR_CHECK(result);
MLOSSleep(1);
+#endif
result = MLSLSerialWriteSingle(mlsl_handle, pdata->address,
BOSCH_CTRL_REG, ctrl_reg);
@@ -373,14 +920,111 @@
return result;
}
+
+#ifdef CONFIG_CIR_ALWAYS_READY
+
+
+static ssize_t bma250_enable_interrupt(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ unsigned long enable;
+ int error;
+
+ error = strict_strtoul(buf, 10, &enable);
+ if (error)
+ return error;
+ printk(KERN_INFO "[BMA250] bma250_enable_interrupt, power_key_pressed = %d\n", power_key_pressed);
+ if(enable == 1 && !power_key_pressed){
+
+
+
+ if(gsensor_power_LPM){
+ I("Non Low Power Mode\n");
+ gsensor_power_LPM(0);
+
+ }
+
+ error = bma250_set_Int_Mode(g_mlsl_handle, g_pdata, 1);
+
+ error += bma250_set_slope_duration(g_mlsl_handle, g_pdata, 0x01);
+ error += bma250_set_slope_threshold(g_mlsl_handle, g_pdata, 0x07);
+
+ error += bma250_set_Int_Enable(g_mlsl_handle, g_pdata,5, 1);
+ error += bma250_set_Int_Enable(g_mlsl_handle, g_pdata,6, 1);
+ error += bma250_set_Int_Enable(g_mlsl_handle, g_pdata,7, 0);
+ error += bma250_set_int1_pad_sel(g_mlsl_handle, g_pdata, PAD_SLOP);
+ error += bma250_set_mode(g_mlsl_handle, g_pdata, BMA250_MODE_NORMAL);
+
+ cir_flag = 1;
+ if (error)
+ return error;
+ printk(KERN_INFO "[BMA250] enable = 1 \n");
+
+ } else if(enable == 0){
+
+ error += bma250_set_Int_Enable(g_mlsl_handle, g_pdata,5, 0);
+ error += bma250_set_Int_Enable(g_mlsl_handle, g_pdata,6, 0);
+ error += bma250_set_Int_Enable(g_mlsl_handle, g_pdata,7, 0);
+
+ power_key_pressed = 0;
+ cir_flag = 0;
+ if (error)
+ return error;
+ printk(KERN_INFO "[BMA250] enable = 0 , power_key_pressed = %d\n", power_key_pressed);
+
+ }
+ return count;
+}
+static ssize_t bma250_clear_powerkey_pressed(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ unsigned long powerkey_pressed;
+ int error;
+ error = strict_strtoul(buf, 10, &powerkey_pressed);
+ if (error)
+ return error;
+
+ if(powerkey_pressed == 1) {
+ power_key_pressed = 1;
+ }
+ else if(powerkey_pressed == 0) {
+ power_key_pressed = 0;
+ }
+ return count;
+}
+static ssize_t bma250_get_powerkry_pressed(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sprintf(buf, "%d\n", power_key_pressed);
+}
+static DEVICE_ATTR(enable, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,
+ NULL, bma250_enable_interrupt);
+static DEVICE_ATTR(clear_powerkey_flag, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP,
+ bma250_get_powerkry_pressed, bma250_clear_powerkey_pressed);
+#endif
static int bma250_init(void *mlsl_handle,
struct ext_slave_descr *slave,
- struct ext_slave_platform_data *pdata)
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct ext_slave_platform_data *pdata,
+ int (*power_LPM)(int on)
+ )
+#else
+ struct ext_slave_platform_data *pdata
+ )
+#endif
{
- tMLError result;
+ tMLError result = 0;
unsigned char reg = 0;
unsigned char bw_reg = 0;
-
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct class *bma250_class = NULL;
+ struct device *bma250_dev = NULL;
+ struct class *bma250_powerkey_class = NULL;
+ struct device *bma250_powerkey_dev = NULL;
+ int res;
+#endif
struct bma250_private_data *private_data;
private_data = (struct bma250_private_data *)
MLOSMalloc(sizeof(struct bma250_private_data));
@@ -391,7 +1035,57 @@
return ML_ERROR_MEMORY_EXAUSTED;
+#ifdef CONFIG_CIR_ALWAYS_READY
+ g_pdata = pdata;
+ gsensor_power_LPM = power_LPM;
+ g_mlsl_handle = mlsl_handle;
+
+ bma250_class = class_create(THIS_MODULE, "bma250");
+ if (IS_ERR(bma250_class)) {
+ res = PTR_ERR(bma250_class);
+ bma250_class = NULL;
+ E("%s, create bma250_class fail!\n", __func__);
+ goto err_create_bma250_class_failed;
+ }
+
+ bma250_powerkey_class = class_create(THIS_MODULE, "bma250_powerkey");
+ if (IS_ERR(bma250_powerkey_class)) {
+ res = PTR_ERR(bma250_powerkey_class);
+ bma250_powerkey_class = NULL;
+ E("%s, create bma250_class fail!\n", __func__);
+ goto err_create_bma250_powerkey_class_failed;
+ }
+
+ bma250_dev = device_create(bma250_class,
+ NULL, 0, "%s", "bma250");
+ if (unlikely(IS_ERR(bma250_dev))) {
+ res = PTR_ERR(bma250_dev);
+ bma250_dev = NULL;
+ E("%s, create bma250_dev fail!\n", __func__);
+ goto err_create_bma250_device;
+ }
+
+ bma250_powerkey_dev = device_create(bma250_powerkey_class,
+ NULL, 0, "%s", "bma250");
+ if (unlikely(IS_ERR(bma250_powerkey_dev))) {
+ res = PTR_ERR(bma250_powerkey_dev);
+ bma250_powerkey_dev = NULL;
+ E("%s, create bma250_dev fail!\n", __func__);
+ goto err_create_bma250_powerkey_device;
+ }
+ res = device_create_file(bma250_dev, &dev_attr_enable);
+ if (res) {
+ E("%s, create bma250_device_create_file fail!\n", __func__);
+ goto err_create_bma250_device_file;
+ }
+ res = device_create_file(bma250_powerkey_dev, &dev_attr_clear_powerkey_flag);
+ if (res) {
+ E("%s, create bma250_device_create_file fail!\n", __func__);
+ goto err_create_bma250_powerkey_device_file;
+ }
+
+#endif
pdata->private_data = private_data;
result =
@@ -443,6 +1137,28 @@
ERROR_CHECK(result);
return result;
+
+#ifdef CONFIG_CIR_ALWAYS_READY
+
+err_create_bma250_powerkey_device_file:
+ device_remove_file(bma250_dev, &dev_attr_enable);
+err_create_bma250_device_file:
+ if (bma250_powerkey_dev)
+ device_unregister(bma250_powerkey_dev);
+err_create_bma250_powerkey_device:
+ if (bma250_dev)
+ device_unregister(bma250_dev);
+err_create_bma250_device:
+ if (bma250_powerkey_class)
+ class_destroy(bma250_powerkey_class);
+err_create_bma250_powerkey_class_failed:
+ if (bma250_class)
+ class_destroy(bma250_class);
+err_create_bma250_class_failed:
+ if (private_data)
+ MLOSFree(private_data);
+ return result;
+#endif
}
static int bma250_exit(void *mlsl_handle,
diff --git a/drivers/input/misc/mpu3050/compass/ak8963.c b/drivers/input/misc/mpu3050/compass/ak8963.c
new file mode 100644
index 0000000..ca3f834
--- /dev/null
+++ b/drivers/input/misc/mpu3050/compass/ak8963.c
@@ -0,0 +1,205 @@
+/*
+ $License:
+ Copyright (C) 2010 InvenSense Corporation, All Rights Reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ 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.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ $
+ */
+
+
+
+#include <string.h>
+
+#ifdef __KERNEL__
+#include <linux/module.h>
+#endif
+
+#include "mpu.h"
+#include "mlsl.h"
+#include "mlos.h"
+
+#include <log.h>
+#undef MPL_LOG_TAG
+#define MPL_LOG_TAG "MPL-compass"
+
+
+#define AK8963_REG_ST1 (0x02)
+#define AK8963_REG_HXL (0x03)
+#define AK8963_REG_ST2 (0x09)
+
+#define AK8963_REG_CNTL (0x0A)
+
+#define AK8963_CNTL_MODE_POWER_DOWN (0x00)
+#define AK8963_CNTL_MODE_SINGLE_MEASUREMENT (0x01)
+
+int ak8963_suspend(void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata)
+{
+ int result = ML_SUCCESS;
+ result =
+ MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ AK8963_REG_CNTL,
+ AK8963_CNTL_MODE_POWER_DOWN);
+ MLOSSleep(1);
+ ERROR_CHECK(result);
+ return result;
+}
+
+int ak8963_resume(void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata)
+{
+ int result = ML_SUCCESS;
+ result =
+ MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ AK8963_REG_CNTL,
+ AK8963_CNTL_MODE_SINGLE_MEASUREMENT);
+ ERROR_CHECK(result);
+ return result;
+}
+
+int ak8963_read(void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata, unsigned char *data)
+{
+ unsigned char regs[8];
+ unsigned char *stat = ®s[0];
+ unsigned char *stat2 = ®s[7];
+ int result = ML_SUCCESS;
+ int status = ML_SUCCESS;
+
+ result =
+ MLSLSerialRead(mlsl_handle, pdata->address, AK8963_REG_ST1,
+ 8, regs);
+ ERROR_CHECK(result);
+
+ if (*stat & 0x01) {
+ memcpy(data, ®s[1], 6);
+ status = ML_SUCCESS;
+ }
+
+ if (*stat2 & 0x04)
+ status = ML_ERROR_COMPASS_DATA_ERROR;
+ if (*stat2 & 0x08)
+ status = ML_ERROR_COMPASS_DATA_OVERFLOW;
+ if (*stat & 0x02) {
+
+ status = ML_SUCCESS;
+ }
+
+ if (*stat != 0x00 || *stat2 != 0x00) {
+ result =
+ MLSLSerialWriteSingle(mlsl_handle, pdata->address,
+ AK8963_REG_CNTL,
+ AK8963_CNTL_MODE_SINGLE_MEASUREMENT);
+ ERROR_CHECK(result);
+ }
+
+ return status;
+}
+
+static int ak8963_config(void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata,
+ struct ext_slave_config *data)
+{
+ int result;
+ if (!data->data)
+ return ML_ERROR_INVALID_PARAMETER;
+
+ switch (data->key) {
+ case MPU_SLAVE_WRITE_REGISTERS:
+ result = MLSLSerialWrite(mlsl_handle, pdata->address,
+ data->len,
+ (unsigned char *)data->data);
+ ERROR_CHECK(result);
+ break;
+ case MPU_SLAVE_CONFIG_ODR_SUSPEND:
+ case MPU_SLAVE_CONFIG_ODR_RESUME:
+ case MPU_SLAVE_CONFIG_FSR_SUSPEND:
+ case MPU_SLAVE_CONFIG_FSR_RESUME:
+ case MPU_SLAVE_CONFIG_MOT_THS:
+ case MPU_SLAVE_CONFIG_NMOT_THS:
+ case MPU_SLAVE_CONFIG_MOT_DUR:
+ case MPU_SLAVE_CONFIG_NMOT_DUR:
+ case MPU_SLAVE_CONFIG_IRQ_SUSPEND:
+ case MPU_SLAVE_CONFIG_IRQ_RESUME:
+ default:
+ return ML_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ return ML_SUCCESS;
+}
+
+static int ak8963_get_config(void *mlsl_handle,
+ struct ext_slave_descr *slave,
+ struct ext_slave_platform_data *pdata,
+ struct ext_slave_config *data)
+{
+ int result;
+ if (!data->data)
+ return ML_ERROR_INVALID_PARAMETER;
+
+ switch (data->key) {
+ case MPU_SLAVE_READ_REGISTERS:
+ {
+ unsigned char *serial_data = (unsigned char *)data->data;
+ result = MLSLSerialRead(mlsl_handle, pdata->address,
+ serial_data[0],
+ data->len - 1,
+ &serial_data[1]);
+ ERROR_CHECK(result);
+ break;
+ }
+ case MPU_SLAVE_CONFIG_ODR_SUSPEND:
+ case MPU_SLAVE_CONFIG_ODR_RESUME:
+ case MPU_SLAVE_CONFIG_FSR_SUSPEND:
+ case MPU_SLAVE_CONFIG_FSR_RESUME:
+ case MPU_SLAVE_CONFIG_MOT_THS:
+ case MPU_SLAVE_CONFIG_NMOT_THS:
+ case MPU_SLAVE_CONFIG_MOT_DUR:
+ case MPU_SLAVE_CONFIG_NMOT_DUR:
+ case MPU_SLAVE_CONFIG_IRQ_SUSPEND:
+ case MPU_SLAVE_CONFIG_IRQ_RESUME:
+ default:
+ return ML_ERROR_FEATURE_NOT_IMPLEMENTED;
+ };
+
+ return ML_SUCCESS;
+}
+
+struct ext_slave_descr ak8963_descr = {
+ NULL,
+ NULL,
+ ak8963_suspend,
+ ak8963_resume,
+ ak8963_read,
+ ak8963_config,
+ ak8963_get_config,
+ "ak8963",
+ EXT_SLAVE_TYPE_COMPASS,
+ COMPASS_ID_AKM8963,
+ 0x01,
+ 9,
+ EXT_SLAVE_LITTLE_ENDIAN,
+ {9830, 4000}
+};
+
+struct ext_slave_descr *ak8963_get_slave_descr(void)
+{
+ return &ak8963_descr;
+}
+EXPORT_SYMBOL(ak8963_get_slave_descr);
+
diff --git a/drivers/input/misc/mpu3050/mldl_cfg.c b/drivers/input/misc/mpu3050/mldl_cfg.c
index 6b12dda..b21d0fa 100644
--- a/drivers/input/misc/mpu3050/mldl_cfg.c
+++ b/drivers/input/misc/mpu3050/mldl_cfg.c
@@ -947,7 +947,8 @@
void *mlsl_handle,
void *accel_handle,
void *compass_handle,
- void *pressure_handle)
+ void *pressure_handle
+ )
{
int result;
@@ -1021,14 +1022,25 @@
if (mldl_cfg->accel && mldl_cfg->accel->init) {
result = mldl_cfg->accel->init(accel_handle,
mldl_cfg->accel,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ &mldl_cfg->pdata->accel,
+ mldl_cfg->pdata->power_LPM);
+#else
&mldl_cfg->pdata->accel);
+#endif
+
ERROR_CHECK(result);
}
if (mldl_cfg->compass && mldl_cfg->compass->init) {
result = mldl_cfg->compass->init(compass_handle,
mldl_cfg->compass,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ &mldl_cfg->pdata->compass,
+ NULL);
+#else
&mldl_cfg->pdata->compass);
+#endif
if (ML_SUCCESS != result) {
MPL_LOGE("mldl_cfg->compass->init returned %d\n",
result);
@@ -1038,7 +1050,12 @@
if (mldl_cfg->pressure && mldl_cfg->pressure->init) {
result = mldl_cfg->pressure->init(pressure_handle,
mldl_cfg->pressure,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ &mldl_cfg->pdata->pressure,
+ NULL);
+#else
&mldl_cfg->pdata->pressure);
+#endif
if (ML_SUCCESS != result) {
MPL_LOGE("mldl_cfg->pressure->init returned %d\n",
result);
diff --git a/drivers/input/misc/mpu3050/mpu-dev.c b/drivers/input/misc/mpu3050/mpu-dev.c
index a641af8..1f246a8 100644
--- a/drivers/input/misc/mpu3050/mpu-dev.c
+++ b/drivers/input/misc/mpu3050/mpu-dev.c
@@ -1105,7 +1105,9 @@
return s - buf;
}
-
+#ifdef CONFIG_CIR_ALWAYS_READY
+extern int cir_flag;
+#endif
static ssize_t mpu_lpm_flag_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
@@ -1116,8 +1118,12 @@
mpu_lpm_flag = -1;
sscanf(buf, "%d", &mpu_lpm_flag);
-
+#ifdef CONFIG_CIR_ALWAYS_READY
+
+ if ((mpu_lpm_flag == 1) && mldl_cfg->pdata->power_LPM && !cir_flag)
+#else
if ((mpu_lpm_flag == 1) && mldl_cfg->pdata->power_LPM)
+#endif
mldl_cfg->pdata->power_LPM(1);
else if (mldl_cfg->pdata->power_LPM)
mldl_cfg->pdata->power_LPM(0);
@@ -1187,6 +1193,10 @@
"Installing Accel irq using %d\n",
pdata->accel.irq);
res = slaveirq_init(accel_adapter,
+
+#ifdef CONFIG_CIR_ALWAYS_READY
+ this_client,
+#endif
&pdata->accel,
"accelirq");
if (res)
@@ -1213,6 +1223,9 @@
"Installing Compass irq using %d\n",
pdata->compass.irq);
res = slaveirq_init(compass_adapter,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ NULL,
+#endif
&pdata->compass,
"compassirq");
if (res)
@@ -1240,6 +1253,9 @@
"Installing Pressure irq using %d\n",
pdata->pressure.irq);
res = slaveirq_init(pressure_adapter,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ NULL,
+#endif
&pdata->pressure,
"pressureirq");
if (res)
@@ -1341,6 +1357,8 @@
mpu_debug_flag = 0;
mpu_sensors_reset = 0;
mpu_lpm_flag = 0;
+ D("%s: MPU3050 probe success v02-Fix set ODR G-Sensor issue\n",
+ __func__);
return res;
diff --git a/drivers/input/misc/mpu3050/slaveirq.c b/drivers/input/misc/mpu3050/slaveirq.c
index d985c26..8f19d1e 100644
--- a/drivers/input/misc/mpu3050/slaveirq.c
+++ b/drivers/input/misc/mpu3050/slaveirq.c
@@ -38,22 +38,727 @@
#include <linux/io.h>
#include <linux/wait.h>
#include <linux/slab.h>
+#include <linux/input.h>
+#include <linux/wakelock.h>
#include "mpu.h"
#include "slaveirq.h"
#include "mldl_cfg.h"
#include "mpu-i2c.h"
+#define SENSOR_NAME "bma250"
+#define ABSMIN -512
+#define ABSMAX 512
+#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 BMA250_CHIP_ID 3
+#define BMA250_RANGE_SET 0
+#define BMA250_BW_SET 4
+
+#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 REL_MISC
+
+
+#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_TURE_HAPPENED 23
+#define FLAT_INTERRUPT_FALSE_HAPPENED 24
+#define LOW_G_INTERRUPT_HAPPENED 25
+
+#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 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_INT_MODE_SEL__POS 0
+#define BMA250_INT_MODE_SEL__LEN 4
+#define BMA250_INT_MODE_SEL__MSK 0x0F
+#define BMA250_INT_MODE_SEL__REG BMA250_INT_CTRL_REG
+
+#define BMA250_LOWG_INT_S__POS 0
+#define BMA250_LOWG_INT_S__LEN 1
+#define BMA250_LOWG_INT_S__MSK 0x01
+#define BMA250_LOWG_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_HIGHG_INT_S__POS 1
+#define BMA250_HIGHG_INT_S__LEN 1
+#define BMA250_HIGHG_INT_S__MSK 0x02
+#define BMA250_HIGHG_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_SLOPE_INT_S__POS 2
+#define BMA250_SLOPE_INT_S__LEN 1
+#define BMA250_SLOPE_INT_S__MSK 0x04
+#define BMA250_SLOPE_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_DOUBLE_TAP_INT_S__POS 4
+#define BMA250_DOUBLE_TAP_INT_S__LEN 1
+#define BMA250_DOUBLE_TAP_INT_S__MSK 0x10
+#define BMA250_DOUBLE_TAP_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_SINGLE_TAP_INT_S__POS 5
+#define BMA250_SINGLE_TAP_INT_S__LEN 1
+#define BMA250_SINGLE_TAP_INT_S__MSK 0x20
+#define BMA250_SINGLE_TAP_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_ORIENT_INT_S__POS 6
+#define BMA250_ORIENT_INT_S__LEN 1
+#define BMA250_ORIENT_INT_S__MSK 0x40
+#define BMA250_ORIENT_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_FLAT_INT_S__POS 7
+#define BMA250_FLAT_INT_S__LEN 1
+#define BMA250_FLAT_INT_S__MSK 0x80
+#define BMA250_FLAT_INT_S__REG BMA250_STATUS1_REG
+
+#define BMA250_DATA_INT_S__POS 7
+#define BMA250_DATA_INT_S__LEN 1
+#define BMA250_DATA_INT_S__MSK 0x80
+#define BMA250_DATA_INT_S__REG BMA250_STATUS2_REG
+
+#define BMA250_SLOPE_FIRST_X__POS 0
+#define BMA250_SLOPE_FIRST_X__LEN 1
+#define BMA250_SLOPE_FIRST_X__MSK 0x01
+#define BMA250_SLOPE_FIRST_X__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_SLOPE_FIRST_Y__POS 1
+#define BMA250_SLOPE_FIRST_Y__LEN 1
+#define BMA250_SLOPE_FIRST_Y__MSK 0x02
+#define BMA250_SLOPE_FIRST_Y__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_SLOPE_FIRST_Z__POS 2
+#define BMA250_SLOPE_FIRST_Z__LEN 1
+#define BMA250_SLOPE_FIRST_Z__MSK 0x04
+#define BMA250_SLOPE_FIRST_Z__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_SLOPE_SIGN_S__POS 3
+#define BMA250_SLOPE_SIGN_S__LEN 1
+#define BMA250_SLOPE_SIGN_S__MSK 0x08
+#define BMA250_SLOPE_SIGN_S__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_TAP_FIRST_X__POS 4
+#define BMA250_TAP_FIRST_X__LEN 1
+#define BMA250_TAP_FIRST_X__MSK 0x10
+#define BMA250_TAP_FIRST_X__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_TAP_FIRST_Y__POS 5
+#define BMA250_TAP_FIRST_Y__LEN 1
+#define BMA250_TAP_FIRST_Y__MSK 0x20
+#define BMA250_TAP_FIRST_Y__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_TAP_FIRST_Z__POS 6
+#define BMA250_TAP_FIRST_Z__LEN 1
+#define BMA250_TAP_FIRST_Z__MSK 0x40
+#define BMA250_TAP_FIRST_Z__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_TAP_FIRST_XYZ__POS 4
+#define BMA250_TAP_FIRST_XYZ__LEN 3
+#define BMA250_TAP_FIRST_XYZ__MSK 0x70
+#define BMA250_TAP_FIRST_XYZ__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_TAP_SIGN_S__POS 7
+#define BMA250_TAP_SIGN_S__LEN 1
+#define BMA250_TAP_SIGN_S__MSK 0x80
+#define BMA250_TAP_SIGN_S__REG BMA250_STATUS_TAP_SLOPE_REG
+
+#define BMA250_HIGHG_FIRST_X__POS 0
+#define BMA250_HIGHG_FIRST_X__LEN 1
+#define BMA250_HIGHG_FIRST_X__MSK 0x01
+#define BMA250_HIGHG_FIRST_X__REG BMA250_STATUS_ORIENT_HIGH_REG
+
+#define BMA250_HIGHG_FIRST_Y__POS 1
+#define BMA250_HIGHG_FIRST_Y__LEN 1
+#define BMA250_HIGHG_FIRST_Y__MSK 0x02
+#define BMA250_HIGHG_FIRST_Y__REG BMA250_STATUS_ORIENT_HIGH_REG
+
+#define BMA250_HIGHG_FIRST_Z__POS 2
+#define BMA250_HIGHG_FIRST_Z__LEN 1
+#define BMA250_HIGHG_FIRST_Z__MSK 0x04
+#define BMA250_HIGHG_FIRST_Z__REG BMA250_STATUS_ORIENT_HIGH_REG
+
+#define BMA250_HIGHG_SIGN_S__POS 3
+#define BMA250_HIGHG_SIGN_S__LEN 1
+#define BMA250_HIGHG_SIGN_S__MSK 0x08
+#define BMA250_HIGHG_SIGN_S__REG BMA250_STATUS_ORIENT_HIGH_REG
+
+#define BMA250_ORIENT_S__POS 4
+#define BMA250_ORIENT_S__LEN 3
+#define BMA250_ORIENT_S__MSK 0x70
+#define BMA250_ORIENT_S__REG BMA250_STATUS_ORIENT_HIGH_REG
+
+#define BMA250_FLAT_S__POS 7
+#define BMA250_FLAT_S__LEN 1
+#define BMA250_FLAT_S__MSK 0x80
+#define BMA250_FLAT_S__REG BMA250_STATUS_ORIENT_HIGH_REG
+
+#define BMA250_EN_SLOPE_X_INT__POS 0
+#define BMA250_EN_SLOPE_X_INT__LEN 1
+#define BMA250_EN_SLOPE_X_INT__MSK 0x01
+#define BMA250_EN_SLOPE_X_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SLOPE_Y_INT__POS 1
+#define BMA250_EN_SLOPE_Y_INT__LEN 1
+#define BMA250_EN_SLOPE_Y_INT__MSK 0x02
+#define BMA250_EN_SLOPE_Y_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SLOPE_Z_INT__POS 2
+#define BMA250_EN_SLOPE_Z_INT__LEN 1
+#define BMA250_EN_SLOPE_Z_INT__MSK 0x04
+#define BMA250_EN_SLOPE_Z_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SLOPE_XYZ_INT__POS 0
+#define BMA250_EN_SLOPE_XYZ_INT__LEN 3
+#define BMA250_EN_SLOPE_XYZ_INT__MSK 0x07
+#define BMA250_EN_SLOPE_XYZ_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_DOUBLE_TAP_INT__POS 4
+#define BMA250_EN_DOUBLE_TAP_INT__LEN 1
+#define BMA250_EN_DOUBLE_TAP_INT__MSK 0x10
+#define BMA250_EN_DOUBLE_TAP_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_SINGLE_TAP_INT__POS 5
+#define BMA250_EN_SINGLE_TAP_INT__LEN 1
+#define BMA250_EN_SINGLE_TAP_INT__MSK 0x20
+#define BMA250_EN_SINGLE_TAP_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_ORIENT_INT__POS 6
+#define BMA250_EN_ORIENT_INT__LEN 1
+#define BMA250_EN_ORIENT_INT__MSK 0x40
+#define BMA250_EN_ORIENT_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_FLAT_INT__POS 7
+#define BMA250_EN_FLAT_INT__LEN 1
+#define BMA250_EN_FLAT_INT__MSK 0x80
+#define BMA250_EN_FLAT_INT__REG BMA250_INT_ENABLE1_REG
+
+#define BMA250_EN_HIGHG_X_INT__POS 0
+#define BMA250_EN_HIGHG_X_INT__LEN 1
+#define BMA250_EN_HIGHG_X_INT__MSK 0x01
+#define BMA250_EN_HIGHG_X_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_HIGHG_Y_INT__POS 1
+#define BMA250_EN_HIGHG_Y_INT__LEN 1
+#define BMA250_EN_HIGHG_Y_INT__MSK 0x02
+#define BMA250_EN_HIGHG_Y_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_HIGHG_Z_INT__POS 2
+#define BMA250_EN_HIGHG_Z_INT__LEN 1
+#define BMA250_EN_HIGHG_Z_INT__MSK 0x04
+#define BMA250_EN_HIGHG_Z_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_HIGHG_XYZ_INT__POS 2
+#define BMA250_EN_HIGHG_XYZ_INT__LEN 1
+#define BMA250_EN_HIGHG_XYZ_INT__MSK 0x04
+#define BMA250_EN_HIGHG_XYZ_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_LOWG_INT__POS 3
+#define BMA250_EN_LOWG_INT__LEN 1
+#define BMA250_EN_LOWG_INT__MSK 0x08
+#define BMA250_EN_LOWG_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_NEW_DATA_INT__POS 4
+#define BMA250_EN_NEW_DATA_INT__LEN 1
+#define BMA250_EN_NEW_DATA_INT__MSK 0x10
+#define BMA250_EN_NEW_DATA_INT__REG BMA250_INT_ENABLE2_REG
+
+#define BMA250_EN_INT1_PAD_LOWG__POS 0
+#define BMA250_EN_INT1_PAD_LOWG__LEN 1
+#define BMA250_EN_INT1_PAD_LOWG__MSK 0x01
+#define BMA250_EN_INT1_PAD_LOWG__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_HIGHG__POS 1
+#define BMA250_EN_INT1_PAD_HIGHG__LEN 1
+#define BMA250_EN_INT1_PAD_HIGHG__MSK 0x02
+#define BMA250_EN_INT1_PAD_HIGHG__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_SLOPE__POS 2
+#define BMA250_EN_INT1_PAD_SLOPE__LEN 1
+#define BMA250_EN_INT1_PAD_SLOPE__MSK 0x04
+#define BMA250_EN_INT1_PAD_SLOPE__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_DB_TAP__POS 4
+#define BMA250_EN_INT1_PAD_DB_TAP__LEN 1
+#define BMA250_EN_INT1_PAD_DB_TAP__MSK 0x10
+#define BMA250_EN_INT1_PAD_DB_TAP__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_SNG_TAP__POS 5
+#define BMA250_EN_INT1_PAD_SNG_TAP__LEN 1
+#define BMA250_EN_INT1_PAD_SNG_TAP__MSK 0x20
+#define BMA250_EN_INT1_PAD_SNG_TAP__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_ORIENT__POS 6
+#define BMA250_EN_INT1_PAD_ORIENT__LEN 1
+#define BMA250_EN_INT1_PAD_ORIENT__MSK 0x40
+#define BMA250_EN_INT1_PAD_ORIENT__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_FLAT__POS 7
+#define BMA250_EN_INT1_PAD_FLAT__LEN 1
+#define BMA250_EN_INT1_PAD_FLAT__MSK 0x80
+#define BMA250_EN_INT1_PAD_FLAT__REG BMA250_INT1_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_LOWG__POS 0
+#define BMA250_EN_INT2_PAD_LOWG__LEN 1
+#define BMA250_EN_INT2_PAD_LOWG__MSK 0x01
+#define BMA250_EN_INT2_PAD_LOWG__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_HIGHG__POS 1
+#define BMA250_EN_INT2_PAD_HIGHG__LEN 1
+#define BMA250_EN_INT2_PAD_HIGHG__MSK 0x02
+#define BMA250_EN_INT2_PAD_HIGHG__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_SLOPE__POS 2
+#define BMA250_EN_INT2_PAD_SLOPE__LEN 1
+#define BMA250_EN_INT2_PAD_SLOPE__MSK 0x04
+#define BMA250_EN_INT2_PAD_SLOPE__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_DB_TAP__POS 4
+#define BMA250_EN_INT2_PAD_DB_TAP__LEN 1
+#define BMA250_EN_INT2_PAD_DB_TAP__MSK 0x10
+#define BMA250_EN_INT2_PAD_DB_TAP__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_SNG_TAP__POS 5
+#define BMA250_EN_INT2_PAD_SNG_TAP__LEN 1
+#define BMA250_EN_INT2_PAD_SNG_TAP__MSK 0x20
+#define BMA250_EN_INT2_PAD_SNG_TAP__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_ORIENT__POS 6
+#define BMA250_EN_INT2_PAD_ORIENT__LEN 1
+#define BMA250_EN_INT2_PAD_ORIENT__MSK 0x40
+#define BMA250_EN_INT2_PAD_ORIENT__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT2_PAD_FLAT__POS 7
+#define BMA250_EN_INT2_PAD_FLAT__LEN 1
+#define BMA250_EN_INT2_PAD_FLAT__MSK 0x80
+#define BMA250_EN_INT2_PAD_FLAT__REG BMA250_INT2_PAD_SEL_REG
+
+#define BMA250_EN_INT1_PAD_NEWDATA__POS 0
+#define BMA250_EN_INT1_PAD_NEWDATA__LEN 1
+#define BMA250_EN_INT1_PAD_NEWDATA__MSK 0x01
+#define BMA250_EN_INT1_PAD_NEWDATA__REG BMA250_INT_DATA_SEL_REG
+
+#define BMA250_EN_INT2_PAD_NEWDATA__POS 7
+#define BMA250_EN_INT2_PAD_NEWDATA__LEN 1
+#define BMA250_EN_INT2_PAD_NEWDATA__MSK 0x80
+#define BMA250_EN_INT2_PAD_NEWDATA__REG BMA250_INT_DATA_SEL_REG
+
+
+#define BMA250_UNFILT_INT_SRC_LOWG__POS 0
+#define BMA250_UNFILT_INT_SRC_LOWG__LEN 1
+#define BMA250_UNFILT_INT_SRC_LOWG__MSK 0x01
+#define BMA250_UNFILT_INT_SRC_LOWG__REG BMA250_INT_SRC_REG
+
+#define BMA250_UNFILT_INT_SRC_HIGHG__POS 1
+#define BMA250_UNFILT_INT_SRC_HIGHG__LEN 1
+#define BMA250_UNFILT_INT_SRC_HIGHG__MSK 0x02
+#define BMA250_UNFILT_INT_SRC_HIGHG__REG BMA250_INT_SRC_REG
+
+#define BMA250_UNFILT_INT_SRC_SLOPE__POS 2
+#define BMA250_UNFILT_INT_SRC_SLOPE__LEN 1
+#define BMA250_UNFILT_INT_SRC_SLOPE__MSK 0x04
+#define BMA250_UNFILT_INT_SRC_SLOPE__REG BMA250_INT_SRC_REG
+
+#define BMA250_UNFILT_INT_SRC_TAP__POS 4
+#define BMA250_UNFILT_INT_SRC_TAP__LEN 1
+#define BMA250_UNFILT_INT_SRC_TAP__MSK 0x10
+#define BMA250_UNFILT_INT_SRC_TAP__REG BMA250_INT_SRC_REG
+
+#define BMA250_UNFILT_INT_SRC_DATA__POS 5
+#define BMA250_UNFILT_INT_SRC_DATA__LEN 1
+#define BMA250_UNFILT_INT_SRC_DATA__MSK 0x20
+#define BMA250_UNFILT_INT_SRC_DATA__REG BMA250_INT_SRC_REG
+
+#define BMA250_INT1_PAD_ACTIVE_LEVEL__POS 0
+#define BMA250_INT1_PAD_ACTIVE_LEVEL__LEN 1
+#define BMA250_INT1_PAD_ACTIVE_LEVEL__MSK 0x01
+#define BMA250_INT1_PAD_ACTIVE_LEVEL__REG BMA250_INT_SET_REG
+
+#define BMA250_INT2_PAD_ACTIVE_LEVEL__POS 2
+#define BMA250_INT2_PAD_ACTIVE_LEVEL__LEN 1
+#define BMA250_INT2_PAD_ACTIVE_LEVEL__MSK 0x04
+#define BMA250_INT2_PAD_ACTIVE_LEVEL__REG BMA250_INT_SET_REG
+
+#define BMA250_INT1_PAD_OUTPUT_TYPE__POS 1
+#define BMA250_INT1_PAD_OUTPUT_TYPE__LEN 1
+#define BMA250_INT1_PAD_OUTPUT_TYPE__MSK 0x02
+#define BMA250_INT1_PAD_OUTPUT_TYPE__REG BMA250_INT_SET_REG
+
+#define BMA250_INT2_PAD_OUTPUT_TYPE__POS 3
+#define BMA250_INT2_PAD_OUTPUT_TYPE__LEN 1
+#define BMA250_INT2_PAD_OUTPUT_TYPE__MSK 0x08
+#define BMA250_INT2_PAD_OUTPUT_TYPE__REG BMA250_INT_SET_REG
+
+
+#define BMA250_INT_MODE_SEL__POS 0
+#define BMA250_INT_MODE_SEL__LEN 4
+#define BMA250_INT_MODE_SEL__MSK 0x0F
+#define BMA250_INT_MODE_SEL__REG BMA250_INT_CTRL_REG
+
+
+#define BMA250_INT_RESET_LATCHED__POS 7
+#define BMA250_INT_RESET_LATCHED__LEN 1
+#define BMA250_INT_RESET_LATCHED__MSK 0x80
+#define BMA250_INT_RESET_LATCHED__REG BMA250_INT_CTRL_REG
+
+#define BMA250_LOWG_DUR__POS 0
+#define BMA250_LOWG_DUR__LEN 8
+#define BMA250_LOWG_DUR__MSK 0xFF
+#define BMA250_LOWG_DUR__REG BMA250_LOW_DURN_REG
+
+#define BMA250_LOWG_THRES__POS 0
+#define BMA250_LOWG_THRES__LEN 8
+#define BMA250_LOWG_THRES__MSK 0xFF
+#define BMA250_LOWG_THRES__REG BMA250_LOW_THRES_REG
+
+#define BMA250_LOWG_HYST__POS 0
+#define BMA250_LOWG_HYST__LEN 2
+#define BMA250_LOWG_HYST__MSK 0x03
+#define BMA250_LOWG_HYST__REG BMA250_LOW_HIGH_HYST_REG
+
+#define BMA250_LOWG_INT_MODE__POS 2
+#define BMA250_LOWG_INT_MODE__LEN 1
+#define BMA250_LOWG_INT_MODE__MSK 0x04
+#define BMA250_LOWG_INT_MODE__REG BMA250_LOW_HIGH_HYST_REG
+
+#define BMA250_HIGHG_DUR__POS 0
+#define BMA250_HIGHG_DUR__LEN 8
+#define BMA250_HIGHG_DUR__MSK 0xFF
+#define BMA250_HIGHG_DUR__REG BMA250_HIGH_DURN_REG
+
+#define BMA250_HIGHG_THRES__POS 0
+#define BMA250_HIGHG_THRES__LEN 8
+#define BMA250_HIGHG_THRES__MSK 0xFF
+#define BMA250_HIGHG_THRES__REG BMA250_HIGH_THRES_REG
+
+#define BMA250_HIGHG_HYST__POS 6
+#define BMA250_HIGHG_HYST__LEN 2
+#define BMA250_HIGHG_HYST__MSK 0xC0
+#define BMA250_HIGHG_HYST__REG BMA250_LOW_HIGH_HYST_REG
+
+#define BMA250_SLOPE_DUR__POS 0
+#define BMA250_SLOPE_DUR__LEN 2
+#define BMA250_SLOPE_DUR__MSK 0x03
+#define BMA250_SLOPE_DUR__REG BMA250_SLOPE_DURN_REG
+
+#define BMA250_SLOPE_THRES__POS 0
+#define BMA250_SLOPE_THRES__LEN 8
+#define BMA250_SLOPE_THRES__MSK 0xFF
+#define BMA250_SLOPE_THRES__REG BMA250_SLOPE_THRES_REG
+
+#define BMA250_TAP_DUR__POS 0
+#define BMA250_TAP_DUR__LEN 3
+#define BMA250_TAP_DUR__MSK 0x07
+#define BMA250_TAP_DUR__REG BMA250_TAP_PARAM_REG
+
+#define BMA250_TAP_SHOCK_DURN__POS 6
+#define BMA250_TAP_SHOCK_DURN__LEN 1
+#define BMA250_TAP_SHOCK_DURN__MSK 0x40
+#define BMA250_TAP_SHOCK_DURN__REG BMA250_TAP_PARAM_REG
+
+#define BMA250_TAP_QUIET_DURN__POS 7
+#define BMA250_TAP_QUIET_DURN__LEN 1
+#define BMA250_TAP_QUIET_DURN__MSK 0x80
+#define BMA250_TAP_QUIET_DURN__REG BMA250_TAP_PARAM_REG
+
+#define BMA250_TAP_THRES__POS 0
+#define BMA250_TAP_THRES__LEN 5
+#define BMA250_TAP_THRES__MSK 0x1F
+#define BMA250_TAP_THRES__REG BMA250_TAP_THRES_REG
+
+#define BMA250_TAP_SAMPLES__POS 6
+#define BMA250_TAP_SAMPLES__LEN 2
+#define BMA250_TAP_SAMPLES__MSK 0xC0
+#define BMA250_TAP_SAMPLES__REG BMA250_TAP_THRES_REG
+
+#define BMA250_ORIENT_MODE__POS 0
+#define BMA250_ORIENT_MODE__LEN 2
+#define BMA250_ORIENT_MODE__MSK 0x03
+#define BMA250_ORIENT_MODE__REG BMA250_ORIENT_PARAM_REG
+
+#define BMA250_ORIENT_BLOCK__POS 2
+#define BMA250_ORIENT_BLOCK__LEN 2
+#define BMA250_ORIENT_BLOCK__MSK 0x0C
+#define BMA250_ORIENT_BLOCK__REG BMA250_ORIENT_PARAM_REG
+
+#define BMA250_ORIENT_HYST__POS 4
+#define BMA250_ORIENT_HYST__LEN 3
+#define BMA250_ORIENT_HYST__MSK 0x70
+#define BMA250_ORIENT_HYST__REG BMA250_ORIENT_PARAM_REG
+
+#define BMA250_ORIENT_AXIS__POS 7
+#define BMA250_ORIENT_AXIS__LEN 1
+#define BMA250_ORIENT_AXIS__MSK 0x80
+#define BMA250_ORIENT_AXIS__REG BMA250_THETA_BLOCK_REG
+
+#define BMA250_THETA_BLOCK__POS 0
+#define BMA250_THETA_BLOCK__LEN 6
+#define BMA250_THETA_BLOCK__MSK 0x3F
+#define BMA250_THETA_BLOCK__REG BMA250_THETA_BLOCK_REG
+
+#define BMA250_THETA_FLAT__POS 0
+#define BMA250_THETA_FLAT__LEN 6
+#define BMA250_THETA_FLAT__MSK 0x3F
+#define BMA250_THETA_FLAT__REG BMA250_THETA_FLAT_REG
+
+#define BMA250_FLAT_HOLD_TIME__POS 4
+#define BMA250_FLAT_HOLD_TIME__LEN 2
+#define BMA250_FLAT_HOLD_TIME__MSK 0x30
+#define BMA250_FLAT_HOLD_TIME__REG BMA250_FLAT_HOLD_TIME_REG
+
+#define BMA250_EN_SELF_TEST__POS 0
+#define BMA250_EN_SELF_TEST__LEN 2
+#define BMA250_EN_SELF_TEST__MSK 0x03
+#define BMA250_EN_SELF_TEST__REG BMA250_SELF_TEST_REG
+
+
+
+#define BMA250_NEG_SELF_TEST__POS 2
+#define BMA250_NEG_SELF_TEST__LEN 1
+#define BMA250_NEG_SELF_TEST__MSK 0x04
+#define BMA250_NEG_SELF_TEST__REG BMA250_SELF_TEST_REG
+
+
+#define BMA250_LOW_POWER_MODE_S__POS 0
+#define BMA250_LOW_POWER_MODE_S__LEN 1
+#define BMA250_LOW_POWER_MODE_S__MSK 0x01
+#define BMA250_LOW_POWER_MODE_S__REG BMA250_STATUS_LOW_POWER_REG
+
+#define BMA250_EN_FAST_COMP__POS 5
+#define BMA250_EN_FAST_COMP__LEN 2
+#define BMA250_EN_FAST_COMP__MSK 0x60
+#define BMA250_EN_FAST_COMP__REG BMA250_OFFSET_CTRL_REG
+
+#define BMA250_FAST_COMP_RDY_S__POS 4
+#define BMA250_FAST_COMP_RDY_S__LEN 1
+#define BMA250_FAST_COMP_RDY_S__MSK 0x10
+#define BMA250_FAST_COMP_RDY_S__REG BMA250_OFFSET_CTRL_REG
+
+#define BMA250_COMP_TARGET_OFFSET_X__POS 1
+#define BMA250_COMP_TARGET_OFFSET_X__LEN 2
+#define BMA250_COMP_TARGET_OFFSET_X__MSK 0x06
+#define BMA250_COMP_TARGET_OFFSET_X__REG BMA250_OFFSET_PARAMS_REG
+
+#define BMA250_COMP_TARGET_OFFSET_Y__POS 3
+#define BMA250_COMP_TARGET_OFFSET_Y__LEN 2
+#define BMA250_COMP_TARGET_OFFSET_Y__MSK 0x18
+#define BMA250_COMP_TARGET_OFFSET_Y__REG BMA250_OFFSET_PARAMS_REG
+
+#define BMA250_COMP_TARGET_OFFSET_Z__POS 5
+#define BMA250_COMP_TARGET_OFFSET_Z__LEN 2
+#define BMA250_COMP_TARGET_OFFSET_Z__MSK 0x60
+#define BMA250_COMP_TARGET_OFFSET_Z__REG BMA250_OFFSET_PARAMS_REG
+
+#define BMA250_UNLOCK_EE_WRITE_SETTING__POS 0
+#define BMA250_UNLOCK_EE_WRITE_SETTING__LEN 1
+#define BMA250_UNLOCK_EE_WRITE_SETTING__MSK 0x01
+#define BMA250_UNLOCK_EE_WRITE_SETTING__REG BMA250_EEPROM_CTRL_REG
+
+#define BMA250_START_EE_WRITE_SETTING__POS 1
+#define BMA250_START_EE_WRITE_SETTING__LEN 1
+#define BMA250_START_EE_WRITE_SETTING__MSK 0x02
+#define BMA250_START_EE_WRITE_SETTING__REG BMA250_EEPROM_CTRL_REG
+
+#define BMA250_EE_WRITE_SETTING_S__POS 2
+#define BMA250_EE_WRITE_SETTING_S__LEN 1
+#define BMA250_EE_WRITE_SETTING_S__MSK 0x04
+#define BMA250_EE_WRITE_SETTING_S__REG BMA250_EEPROM_CTRL_REG
+
+#define BMA250_EN_SOFT_RESET__POS 0
+#define BMA250_EN_SOFT_RESET__LEN 8
+#define BMA250_EN_SOFT_RESET__MSK 0xFF
+#define BMA250_EN_SOFT_RESET__REG BMA250_RESET_REG
+
+#define BMA250_EN_SOFT_RESET_VALUE 0xB6
+
+#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_25HZ 0x0A
+#define BMA250_BW_62_50HZ 0x0B
+#define BMA250_BW_125HZ 0x0C
+#define BMA250_BW_250HZ 0x0D
+#define BMA250_BW_500HZ 0x0E
+#define BMA250_BW_1000HZ 0x0F
+
+#define BMA250_MODE_NORMAL 0
+#define BMA250_MODE_LOWPOWER 1
+#define BMA250_MODE_SUSPEND 2
+
+
+#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))
+
+
+
+
struct slaveirq_dev_data {
struct miscdevice dev;
+#ifdef CONFIG_CIR_ALWAYS_READY
struct i2c_client *slave_client;
+#endif
struct mpuirq_data data;
wait_queue_head_t slaveirq_wait;
int irq;
int pid;
int data_ready;
int timeout;
+ struct work_struct bma_irq_work;
+ struct i2c_adapter * adapter;
+ struct input_dev *input;
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct input_dev *input_cir;
+ struct wake_lock cir_always_ready_wake_lock;
+#endif
};
static int slaveirq_open(struct inode *inode, struct file *file)
@@ -188,14 +893,65 @@
.open = slaveirq_open,
.release = slaveirq_release,
};
+#ifdef CONFIG_CIR_ALWAYS_READY
+static void bma250_irq_work_func(struct work_struct *work)
+{
+ struct slaveirq_dev_data *bma250 = container_of((struct work_struct *)work,
+ struct slaveirq_dev_data, bma_irq_work);
+
+ wake_lock_timeout(&(bma250->cir_always_ready_wake_lock), 1*HZ);
+ input_report_rel(bma250->input_cir,
+ SLOP_INTERRUPT,
+ SLOPE_INTERRUPT_X_NEGATIVE_HAPPENED);
+ input_report_rel(bma250->input_cir,
+ SLOP_INTERRUPT,
+ SLOPE_INTERRUPT_Y_NEGATIVE_HAPPENED);
+ input_report_rel(bma250->input_cir,
+ SLOP_INTERRUPT,
+ SLOPE_INTERRUPT_X_HAPPENED);
+ input_report_rel(bma250->input_cir,
+ SLOP_INTERRUPT,
+ SLOPE_INTERRUPT_Y_HAPPENED);
+ input_sync(bma250->input_cir);
+ enable_irq(bma250->irq);
+}
+static irqreturn_t bma250_irq_handler(int irq, void *handle)
+{
+
+
+ struct slaveirq_dev_data *data = handle;
+
+ if (data)
+ disable_irq_nosync(data->irq);
+
+ if (data == NULL)
+ return IRQ_HANDLED;
+ if (data->slave_client == NULL)
+ return IRQ_HANDLED;
+
+
+ schedule_work(&data->bma_irq_work);
+
+ return IRQ_HANDLED;
+
+
+}
+#endif
int slaveirq_init(struct i2c_adapter *slave_adapter,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct i2c_client *client,
+#endif
struct ext_slave_platform_data *pdata,
char *name)
{
int res;
struct slaveirq_dev_data *data;
+ struct input_dev *dev = NULL;
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct input_dev *dev_cir = NULL;
+#endif
if (!pdata->irq)
return -EINVAL;
@@ -214,10 +970,57 @@
data->data_ready = 0;
data->timeout = 0;
+#ifdef CONFIG_CIR_ALWAYS_READY
+ data->slave_client = client;
+#endif
+
+ data->adapter = slave_adapter;
init_waitqueue_head(&data->slaveirq_wait);
- res = request_irq(data->irq, slaveirq_handler, IRQF_TRIGGER_RISING,
- data->dev.name, data);
+ if(strncmp(name,"accelirq",strlen("accelirq")) == 0){
+ dev = input_allocate_device();
+ if (!dev)
+ return -ENOMEM;
+
+ dev->name = SENSOR_NAME;
+ dev->id.bustype = BUS_I2C;
+ input_set_abs_params(dev, ABS_X, ABSMIN, ABSMAX, 0, 0);
+ input_set_abs_params(dev, ABS_Y, ABSMIN, ABSMAX, 0, 0);
+ input_set_abs_params(dev, ABS_Z, ABSMIN, ABSMAX, 0, 0);
+ input_set_drvdata(dev, data);
+
+ res = input_register_device(dev);
+ if (res < 0) {
+ goto err_register_input_device;
+ }
+ data->input = dev;
+
+#ifdef CONFIG_CIR_ALWAYS_READY
+ dev_cir = input_allocate_device();
+ if (!dev_cir) {
+ goto err_allocate_input_cir_devive;
+ }
+ dev_cir->name = "CIRSensor";
+ dev_cir->id.bustype = BUS_I2C;
+ input_set_capability(dev_cir, EV_REL, SLOP_INTERRUPT);
+
+ res = input_register_device(dev_cir);
+ if (res < 0) {
+ goto err_register_cir_input_device;
+ }
+ data->input_cir = dev_cir;
+
+
+ INIT_WORK(&data->bma_irq_work, bma250_irq_work_func);
+ res = request_irq(data->irq, bma250_irq_handler, IRQF_TRIGGER_RISING,
+ "bma250", data);
+ enable_irq_wake(data->irq);
+
+ wake_lock_init(&(data->cir_always_ready_wake_lock), WAKE_LOCK_SUSPEND, "cir_always_ready");
+#endif
+ }else
+ res = request_irq(data->irq, slaveirq_handler, IRQF_TRIGGER_RISING,
+ data->dev.name, data);
if (res) {
dev_err(&slave_adapter->dev,
@@ -241,7 +1044,21 @@
out_request_irq:
kfree(pdata->irq_data);
pdata->irq_data = NULL;
+#ifdef CONFIG_CIR_ALWAYS_READY
+ if(dev_cir != NULL)
+ input_unregister_device(data->input_cir);
+err_register_cir_input_device:
+ if(dev_cir != NULL)
+ input_free_device(dev_cir);
+err_allocate_input_cir_devive:
+ if(dev != NULL)
+ input_unregister_device(data->input);
+#endif
+err_register_input_device:
+ if(dev != NULL)
+ input_free_device(dev);
+ kfree(data);
return res;
}
diff --git a/drivers/input/misc/mpu3050/slaveirq.h b/drivers/input/misc/mpu3050/slaveirq.h
index ca9c7e4..6a32bad 100644
--- a/drivers/input/misc/mpu3050/slaveirq.h
+++ b/drivers/input/misc/mpu3050/slaveirq.h
@@ -38,6 +38,9 @@
void slaveirq_exit(struct ext_slave_platform_data *pdata);
int slaveirq_init(struct i2c_adapter *slave_adapter,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct i2c_client *client,
+#endif
struct ext_slave_platform_data *pdata,
char *name);
diff --git a/include/linux/mpu.h b/include/linux/mpu.h
index 0a2ec64..4853230 100644
--- a/include/linux/mpu.h
+++ b/include/linux/mpu.h
@@ -204,7 +204,14 @@
struct ext_slave_descr {
int (*init) (void *mlsl_handle,
struct ext_slave_descr *slave,
+#ifdef CONFIG_CIR_ALWAYS_READY
+ struct ext_slave_platform_data *pdata,
+ int (*power_LPM)(int on)
+ );
+#else
struct ext_slave_platform_data *pdata);
+#endif
+
int (*exit) (void *mlsl_handle,
struct ext_slave_descr *slave,
struct ext_slave_platform_data *pdata);