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 = &regs[0];
+	unsigned char *stat2 = &regs[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, &regs[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);