input: bma250: Add HTC variant of BMA250 I2C accelerometer

HTC kernel version: villeu-jb-crc-3.4.10-ae8b65e

Change-Id: I4b7ad69386bb99ad72f165669648728c068ac4ab
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig
index f6c647c..99075b0 100644
--- a/drivers/input/misc/Kconfig
+++ b/drivers/input/misc/Kconfig
@@ -675,3 +675,9 @@
          module will be called bmp18x-i2c.
 
 endif
+
+config SENSORS_BMA250
+	tristate "BMA250 accelerometer sensor support"
+	depends on I2C
+	help
+	  BMA250 G-sensor driver for HTC
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile
index 97d9782..8cb5d50 100644
--- a/drivers/input/misc/Makefile
+++ b/drivers/input/misc/Makefile
@@ -63,3 +63,4 @@
 obj-$(CONFIG_STM_LIS3DH)		+= lis3dh_acc.o
 obj-$(CONFIG_BMP18X)			+= bmp18x-core.o
 obj-$(CONFIG_BMP18X_I2C)		+= bmp18x-i2c.o
+obj-$(CONFIG_SENSORS_BMA250)		+= bma250.o
diff --git a/drivers/input/misc/bma250.c b/drivers/input/misc/bma250.c
new file mode 100644
index 0000000..902618b
--- /dev/null
+++ b/drivers/input/misc/bma250.c
@@ -0,0 +1,676 @@
+/* drivers/i2c/chips/bma250.c - bma250 G-sensor driver
+ *
+ * Copyright (C) 2008-2009 HTC Corporation.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ */
+
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/miscdevice.h>
+#include <linux/uaccess.h>
+#include <linux/input.h>
+#include <linux/bma250.h>
+#include <linux/gpio.h>
+#include <linux/delay.h>
+#include<linux/earlysuspend.h>
+#include <linux/export.h>
+#include <linux/module.h>
+
+
+#define D(x...) pr_info("[GSNR][BMA250] " x)
+#define E(x...) printk(KERN_ERR "[GSNR][BMA250 ERROR] " x)
+#define DIF(x...) {\
+		if (debug_flag)\
+			printk(KERN_DEBUG "[GSNR][BMA250 DEBUG] " x); }
+
+#define DEFAULT_RANGE	BMA_RANGE_2G
+#define DEFAULT_BW	BMA_BW_31_25HZ
+
+#define RETRY_TIMES	10
+
+static struct i2c_client *this_client;
+
+struct bma250_data {
+	struct input_dev *input_dev;
+	struct work_struct work;
+	struct early_suspend early_suspend;
+};
+
+static struct bma250_platform_data *pdata;
+static atomic_t PhoneOn_flag = ATOMIC_INIT(0);
+#define DEVICE_ACCESSORY_ATTR(_name, _mode, _show, _store) \
+struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)
+
+static int debug_flag;
+static char update_user_calibrate_data;
+
+static int BMA_I2C_RxData(char *rxData, int length)
+{
+	int retry;
+	struct i2c_msg msgs[] = {
+		{
+		 .addr = this_client->addr,
+		 .flags = 0,
+		 .len = 1,
+		 .buf = rxData,
+		},
+		{
+		 .addr = this_client->addr,
+		 .flags = I2C_M_RD,
+		 .len = length,
+		 .buf = rxData,
+		 },
+	};
+
+	for (retry = 0; retry <= RETRY_TIMES; retry++) {
+		if (i2c_transfer(this_client->adapter, msgs, 2) > 0)
+			break;
+		else
+			mdelay(10);
+	}
+
+	if (retry > RETRY_TIMES) {
+		E("%s: retry over %d\n", __func__, RETRY_TIMES);
+		return -EIO;
+	} else
+		return 0;
+}
+
+static int BMA_I2C_TxData(char *txData, int length)
+{
+	int retry;
+	struct i2c_msg msg[] = {
+		{
+		 .addr = this_client->addr,
+		 .flags = 0,
+		 .len = length,
+		 .buf = txData,
+		 },
+	};
+
+	for (retry = 0; retry <= RETRY_TIMES; retry++) {
+		if (i2c_transfer(this_client->adapter, msg, 1) > 0)
+			break;
+		else
+			mdelay(10);
+	}
+
+	if (retry > RETRY_TIMES) {
+		E("%s: retry over %d\n", __func__, RETRY_TIMES);
+		return -EIO;
+	} else
+		return 0;
+}
+
+static int BMA_Init(void)
+{
+	char buffer[4] = "";
+	int ret;
+	unsigned char range = 0, bw = 0;
+
+	memset(buffer, 0, 4);
+
+	buffer[0] = bma250_RANGE_SEL_REG;
+	ret = BMA_I2C_RxData(buffer, 2);
+	if (ret < 0)
+		return -1;
+	D("%s: bma250_RANGE_SEL_REG++: range = 0x%02x, bw = 0x%02x\n",
+		__func__, buffer[0], buffer[1]);
+	range = (buffer[0] & 0xF0) | DEFAULT_RANGE;
+	bw = (buffer[1] & 0xE0) | DEFAULT_BW;
+
+	
+
+	buffer[1] = bw;
+	buffer[0] = bma250_BW_SEL_REG;
+	ret = BMA_I2C_TxData(buffer, 2);
+	if (ret < 0) {
+		E("%s: Write bma250_BW_SEL_REG fail\n", __func__);
+		return -1;
+	}
+
+	buffer[1] = range;
+	buffer[0] = bma250_RANGE_SEL_REG;
+	ret = BMA_I2C_TxData(buffer, 2);
+	if (ret < 0) {
+		E("%s: Write bma250_BW_SEL_REG fail\n", __func__);
+		return -1;
+	}
+
+	
+	buffer[0] = bma250_RANGE_SEL_REG;
+	ret = BMA_I2C_RxData(buffer, 2);
+	if (ret < 0)
+		return -1;
+
+	D("%s: bma250_RANGE_SEL_REG:use single write--: range = 0x%02x, bw = 0x%02x\n",
+		__func__, buffer[0], buffer[1]);
+
+	return 0;
+
+}
+
+static int BMA_TransRBuff(short *rbuf)
+{
+	char buffer[6];
+	int ret;
+
+	memset(buffer, 0, 6);
+
+	buffer[0] = bma250_X_AXIS_LSB_REG;
+	ret = BMA_I2C_RxData(buffer, 6);
+	if (ret < 0)
+		return ret;
+
+
+	rbuf[0] = (short)(buffer[1] << 8 | buffer[0]);
+	rbuf[0] >>= 6;
+	rbuf[1] = (short)(buffer[3] << 8 | buffer[2]);
+	rbuf[1] >>= 6;
+	rbuf[2] = (short)(buffer[5] << 8 | buffer[4]);
+	rbuf[2] >>= 6;
+
+	DIF("%s: (x, y, z) = (%d, %d, %d)\n",
+		__func__, rbuf[0], rbuf[1], rbuf[2]);
+
+	return 1;
+}
+
+static int BMA_set_mode(unsigned char mode)
+{
+	char buffer[2] = "";
+	int ret = 0;
+	unsigned char data1 = 0;
+
+	printk(KERN_INFO "[GSNR] Gsensor %s\n", mode ? "disable" : "enable");
+
+	memset(buffer, 0, 2);
+
+	D("%s: mode = 0x%02x\n", __func__, mode);
+	if (mode < 2) {
+		buffer[0] = bma250_MODE_CTRL_REG;
+		ret = BMA_I2C_RxData(buffer, 1);
+		if (ret < 0)
+			return -1;
+		
+
+		switch (mode) {
+		case bma250_MODE_NORMAL:
+			data1 = buffer[0] & 0x7F;
+			break;
+		case bma250_MODE_SUSPEND:
+			data1 = buffer[0] | 0x80;
+			break;
+		default:
+			break;
+		}
+
+		
+		buffer[0] = bma250_MODE_CTRL_REG;
+		buffer[1] = data1;
+		ret = BMA_I2C_TxData(buffer, 2);
+	} else
+		ret = E_OUT_OF_RANGE;
+
+	if (mode == bma250_MODE_NORMAL)
+		usleep(2000);
+	
+
+	return ret;
+}
+
+static int BMA_GET_INT(void)
+{
+	int ret;
+	ret = gpio_get_value(pdata->intr);
+	return ret;
+}
+
+static int bma_open(struct inode *inode, struct file *file)
+{
+	return nonseekable_open(inode, file);
+}
+
+static int bma_release(struct inode *inode, struct file *file)
+{
+	return 0;
+}
+
+static long bma_ioctl(struct file *file, unsigned int cmd,
+	   unsigned long arg)
+{
+
+	void __user *argp = (void __user *)arg;
+
+	char rwbuf[8] = "";
+	int ret = -1;
+	short buf[8], temp;
+	int kbuf = 0;
+
+	DIF("%s: cmd = 0x%x\n", __func__, cmd);
+
+	switch (cmd) {
+	case BMA_IOCTL_READ:
+	case BMA_IOCTL_WRITE:
+	case BMA_IOCTL_SET_MODE:
+	case BMA_IOCTL_SET_CALI_MODE:
+	case BMA_IOCTL_SET_UPDATE_USER_CALI_DATA:
+		if (copy_from_user(&rwbuf, argp, sizeof(rwbuf)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_READ_ACCELERATION:
+		if (copy_from_user(&buf, argp, sizeof(buf)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_WRITE_CALI_VALUE:
+		if (copy_from_user(&kbuf, argp, sizeof(kbuf)))
+			return -EFAULT;
+		break;
+	default:
+		break;
+	}
+
+	switch (cmd) {
+	case BMA_IOCTL_INIT:
+		ret = BMA_Init();
+		if (ret < 0)
+			return ret;
+		break;
+	case BMA_IOCTL_READ:
+		if (rwbuf[0] < 1)
+			return -EINVAL;
+		break;
+	case BMA_IOCTL_WRITE:
+		if (rwbuf[0] < 2)
+			return -EINVAL;
+		break;
+	case BMA_IOCTL_WRITE_CALI_VALUE:
+		pdata->gs_kvalue = kbuf;
+		printk(KERN_INFO "%s: Write calibration value: 0x%X\n",
+			__func__, pdata->gs_kvalue);
+		break;
+	case BMA_IOCTL_READ_ACCELERATION:
+		ret = BMA_TransRBuff(&buf[0]);
+		if (ret < 0)
+			return ret;
+		break;
+	case BMA_IOCTL_READ_CALI_VALUE:
+		if ((pdata->gs_kvalue & (0x67 << 24)) != (0x67 << 24)) {
+			rwbuf[0] = 0;
+			rwbuf[1] = 0;
+			rwbuf[2] = 0;
+		} else {
+			rwbuf[0] = (pdata->gs_kvalue >> 16) & 0xFF;
+			rwbuf[1] = (pdata->gs_kvalue >>  8) & 0xFF;
+			rwbuf[2] =  pdata->gs_kvalue        & 0xFF;
+		}
+		DIF("%s: CALI(x, y, z) = (%d, %d, %d)\n",
+			__func__, rwbuf[0], rwbuf[1], rwbuf[2]);
+		break;
+	case BMA_IOCTL_SET_MODE:
+		BMA_set_mode(rwbuf[0]);
+		break;
+	case BMA_IOCTL_GET_INT:
+		temp = BMA_GET_INT();
+		break;
+	case BMA_IOCTL_GET_CHIP_LAYOUT:
+		if (pdata)
+			temp = pdata->chip_layout;
+		break;
+	case BMA_IOCTL_GET_CALI_MODE:
+		if (pdata)
+			temp = pdata->calibration_mode;
+		break;
+	case BMA_IOCTL_SET_CALI_MODE:
+		if (pdata)
+			pdata->calibration_mode = rwbuf[0];
+		break;
+	case BMA_IOCTL_GET_UPDATE_USER_CALI_DATA:
+		temp = update_user_calibrate_data;
+		break;
+	case BMA_IOCTL_SET_UPDATE_USER_CALI_DATA:
+		update_user_calibrate_data = rwbuf[0];
+		break;
+
+	default:
+		return -ENOTTY;
+	}
+
+	switch (cmd) {
+	case BMA_IOCTL_READ:
+		break;
+	case BMA_IOCTL_READ_ACCELERATION:
+		if (copy_to_user(argp, &buf, sizeof(buf)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_READ_CALI_VALUE:
+		if (copy_to_user(argp, &rwbuf, sizeof(rwbuf)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_GET_INT:
+		if (copy_to_user(argp, &temp, sizeof(temp)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_GET_CHIP_LAYOUT:
+		if (copy_to_user(argp, &temp, sizeof(temp)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_GET_CALI_MODE:
+		if (copy_to_user(argp, &temp, sizeof(temp)))
+			return -EFAULT;
+		break;
+	case BMA_IOCTL_GET_UPDATE_USER_CALI_DATA:
+		if (copy_to_user(argp, &temp, sizeof(temp)))
+			return -EFAULT;
+		break;
+	default:
+		break;
+	}
+
+	return 0;
+}
+
+#ifdef EARLY_SUSPEND_BMA
+
+static void bma250_early_suspend(struct early_suspend *handler)
+{
+	if (!atomic_read(&PhoneOn_flag))
+		BMA_set_mode(bma250_MODE_SUSPEND);
+	else
+		printk(KERN_DEBUG "bma250_early_suspend: PhoneOn_flag is set\n");
+}
+
+static void bma250_late_resume(struct early_suspend *handler)
+{
+	BMA_set_mode(bma250_MODE_NORMAL);
+}
+
+#else 
+
+static int bma250_suspend(struct i2c_client *client, pm_message_t mesg)
+{
+	BMA_set_mode(bma250_MODE_SUSPEND);
+
+	return 0;
+}
+
+static int bma250_resume(struct i2c_client *client)
+{
+	BMA_set_mode(bma250_MODE_NORMAL);
+	return 0;
+}
+#endif 
+
+static ssize_t bma250_show(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	char *s = buf;
+	s += sprintf(s, "%d\n", atomic_read(&PhoneOn_flag));
+	return s - buf;
+}
+
+static ssize_t bma250_store(struct device *dev,
+				   struct device_attribute *attr,
+				   const char *buf, size_t count)
+{
+	if (count == (strlen("enable") + 1) &&
+	   strncmp(buf, "enable", strlen("enable")) == 0) {
+		atomic_set(&PhoneOn_flag, 1);
+		printk(KERN_DEBUG "bma250_store: PhoneOn_flag=%d\n",
+			atomic_read(&PhoneOn_flag));
+		return count;
+	}
+	if (count == (strlen("disable") + 1) &&
+	   strncmp(buf, "disable", strlen("disable")) == 0) {
+		atomic_set(&PhoneOn_flag, 0);
+		printk(KERN_DEBUG "bma250_store: PhoneOn_flag=%d\n",
+			atomic_read(&PhoneOn_flag));
+		return count;
+	}
+	E("bma250_store: invalid argument\n");
+	return -EINVAL;
+
+}
+
+static DEVICE_ACCESSORY_ATTR(PhoneOnOffFlag, 0664, \
+	bma250_show, bma250_store);
+
+static ssize_t debug_flag_show(struct device *dev,
+				  struct device_attribute *attr, char *buf)
+{
+	char *s = buf;
+	char buffer, range = -1, bandwidth = -1, mode = -1;
+	int ret;
+
+	buffer = bma250_BW_SEL_REG;
+	ret = BMA_I2C_RxData(&buffer, 1);
+	if (ret < 0)
+		return -1;
+	bandwidth = (buffer & 0x1F);
+
+	buffer = bma250_RANGE_SEL_REG;
+	ret = BMA_I2C_RxData(&buffer, 1);
+	if (ret < 0)
+		return -1;
+	range = (buffer & 0xF);
+
+	buffer = bma250_MODE_CTRL_REG;
+	ret = BMA_I2C_RxData(&buffer, 1);
+	if (ret < 0)
+		return -1;
+	mode = ((buffer & 0x80) >> 7);
+
+	s += sprintf(s, "debug_flag = %d, range = 0x%x, bandwidth = 0x%x, "
+		"mode = 0x%x\n", debug_flag, range, bandwidth, mode);
+
+	return s - buf;
+}
+static ssize_t debug_flag_store(struct device *dev,
+				   struct device_attribute *attr,
+				   const char *buf, size_t count)
+{
+	debug_flag = -1;
+	sscanf(buf, "%d", &debug_flag);
+
+	return count;
+
+}
+
+static DEVICE_ACCESSORY_ATTR(debug_en, 0664, \
+	debug_flag_show, debug_flag_store);
+
+int bma250_registerAttr(void)
+{
+	int ret;
+	struct class *htc_accelerometer_class;
+	struct device *accelerometer_dev;
+
+	htc_accelerometer_class = class_create(THIS_MODULE,
+					"htc_accelerometer");
+	if (IS_ERR(htc_accelerometer_class)) {
+		ret = PTR_ERR(htc_accelerometer_class);
+		htc_accelerometer_class = NULL;
+		goto err_create_class;
+	}
+
+	accelerometer_dev = device_create(htc_accelerometer_class,
+				NULL, 0, "%s", "accelerometer");
+	if (unlikely(IS_ERR(accelerometer_dev))) {
+		ret = PTR_ERR(accelerometer_dev);
+		accelerometer_dev = NULL;
+		goto err_create_accelerometer_device;
+	}
+
+	
+	ret = device_create_file(accelerometer_dev, &dev_attr_PhoneOnOffFlag);
+	if (ret)
+		goto err_create_accelerometer_device_file;
+
+	
+	ret = device_create_file(accelerometer_dev, &dev_attr_debug_en);
+	if (ret)
+		goto err_create_accelerometer_debug_en_device_file;
+
+	return 0;
+
+err_create_accelerometer_debug_en_device_file:
+	device_remove_file(accelerometer_dev, &dev_attr_PhoneOnOffFlag);
+err_create_accelerometer_device_file:
+	device_unregister(accelerometer_dev);
+err_create_accelerometer_device:
+	class_destroy(htc_accelerometer_class);
+err_create_class:
+
+	return ret;
+}
+
+static const struct file_operations bma_fops = {
+	.owner = THIS_MODULE,
+	.open = bma_open,
+	.release = bma_release,
+	
+#if HAVE_COMPAT_IOCTL
+	.compat_ioctl = bma_ioctl,
+#endif
+#if HAVE_UNLOCKED_IOCTL
+	.unlocked_ioctl = bma_ioctl,
+#endif
+};
+
+static struct miscdevice bma_device = {
+	.minor = MISC_DYNAMIC_MINOR,
+	.name = "bma150",
+	.fops = &bma_fops,
+};
+
+int bma250_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+	struct bma250_data *bma;
+	char buffer[2];
+	int err = 0;
+
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+		err = -ENODEV;
+		goto exit_check_functionality_failed;
+	}
+
+	bma = kzalloc(sizeof(struct bma250_data), GFP_KERNEL);
+	if (!bma) {
+		err = -ENOMEM;
+		goto exit_alloc_data_failed;
+	}
+
+	i2c_set_clientdata(client, bma);
+
+	pdata = client->dev.platform_data;
+	if (pdata == NULL) {
+		E("bma250_init_client: platform data is NULL\n");
+		goto exit_platform_data_null;
+	}
+
+	pdata->gs_kvalue = gs_kvalue;
+	printk(KERN_INFO "BMA250 G-sensor I2C driver: gs_kvalue = 0x%X\n",
+		pdata->gs_kvalue);
+
+	this_client = client;
+
+	buffer[0] = bma250_CHIP_ID_REG;
+	err = BMA_I2C_RxData(buffer, 1);
+	if (err < 0)
+		goto exit_wrong_ID;
+	D("%s: CHIP ID = 0x%02x\n", __func__, buffer[0]);
+	if ((buffer[0] != 0x3) && (buffer[0] != 0xF9)) {
+		E("Wrong chip ID of BMA250 or BMA250E!!\n");
+		goto exit_wrong_ID;
+	}
+
+	err = BMA_Init();
+	if (err < 0) {
+		E("bma250_probe: bma_init failed\n");
+		goto exit_init_failed;
+	}
+
+	err = misc_register(&bma_device);
+	if (err) {
+		E("bma250_probe: device register failed\n");
+		goto exit_misc_device_register_failed;
+	}
+
+#ifdef EARLY_SUSPEND_BMA
+	bma->early_suspend.suspend = bma250_early_suspend;
+	bma->early_suspend.resume = bma250_late_resume;
+	register_early_suspend(&bma->early_suspend);
+#endif
+
+	err = bma250_registerAttr();
+	if (err) {
+		E("%s: set spi_bma150_registerAttr fail!\n", __func__);
+		goto err_registerAttr;
+	}
+	D("%s: I2C retry 10 times version. OK\n", __func__);
+	debug_flag = 0;
+
+	return 0;
+
+err_registerAttr:
+exit_misc_device_register_failed:
+exit_init_failed:
+exit_wrong_ID:
+exit_platform_data_null:
+	kfree(bma);
+exit_alloc_data_failed:
+exit_check_functionality_failed:
+	return err;
+}
+
+static int bma250_remove(struct i2c_client *client)
+{
+	struct bma250_data *bma = i2c_get_clientdata(client);
+	kfree(bma);
+	return 0;
+}
+
+static const struct i2c_device_id bma250_id[] = {
+	{ BMA250_I2C_NAME, 0 },
+	{ }
+};
+
+static struct i2c_driver bma250_driver = {
+	.probe = bma250_probe,
+	.remove = bma250_remove,
+	.id_table	= bma250_id,
+
+#ifndef EARLY_SUSPEND_BMA
+	.suspend = bma250_suspend,
+	.resume = bma250_resume,
+#endif
+	.driver = {
+		   .name = BMA250_I2C_NAME,
+		   },
+};
+
+static int __init bma250_init(void)
+{
+	printk(KERN_INFO "BMA250 G-sensor driver: init\n");
+	return i2c_add_driver(&bma250_driver);
+}
+
+static void __exit bma250_exit(void)
+{
+	i2c_del_driver(&bma250_driver);
+}
+
+module_init(bma250_init);
+module_exit(bma250_exit);
+
+MODULE_DESCRIPTION("BMA250 G-sensor driver");
+MODULE_LICENSE("GPL");
+
diff --git a/include/linux/bma250.h b/include/linux/bma250.h
new file mode 100644
index 0000000..35d4c99
--- /dev/null
+++ b/include/linux/bma250.h
@@ -0,0 +1,752 @@
+#ifndef BMA250_H
+#define BMA250_H
+
+#include <linux/ioctl.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			2
+
+#define LOW_G_INTERRUPT				REL_Z
+#define HIGH_G_INTERRUPT 			REL_HWHEEL
+#define SLOP_INTERRUPT 				REL_DIAL
+#define DOUBLE_TAP_INTERRUPT 			REL_WHEEL
+#define SINGLE_TAP_INTERRUPT 			REL_MISC
+#define ORIENT_INTERRUPT 			ABS_PRESSURE
+#define FLAT_INTERRUPT 				ABS_DISTANCE
+
+
+#define 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_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))
+
+#define BMA250_I2C_NAME "bma250"
+
+#define BMAIO			0xA1
+
+#define bma250_CHIP_ID_REG	0x00
+#define bma250_X_AXIS_LSB_REG	0x2
+#define bma250_RANGE_SEL_REG	0x0F
+#define bma250_BW_SEL_REG	0x10
+#define bma250_MODE_CTRL_REG	0x11
+
+#define BMA_IOCTL_INIT			_IO(BMAIO, 0x31)
+#define BMA_IOCTL_WRITE			_IOW(BMAIO, 0x32, char[5])
+#define BMA_IOCTL_READ			_IOWR(BMAIO, 0x33, char[5])
+#define BMA_IOCTL_READ_ACCELERATION	_IOWR(BMAIO, 0x34, short[7])
+#define BMA_IOCTL_SET_MODE		_IOW(BMAIO, 0x35, short)
+#define BMA_IOCTL_GET_INT		_IOR(BMAIO, 0x36, short)
+#define BMA_IOCTL_GET_CHIP_LAYOUT	_IOR(BMAIO, 0x37, short)
+#define BMA_IOCTL_GET_CALI_MODE		_IOR(BMAIO, 0x38, short)
+#define BMA_IOCTL_SET_CALI_MODE		_IOW(BMAIO, 0x39, short)
+#define BMA_IOCTL_READ_CALI_VALUE       _IOR(BMAIO, 0x3a, char[3])
+#define BMA_IOCTL_WRITE_CALI_VALUE      _IOW(BMAIO, 0x3b, int)
+#define BMA_IOCTL_GET_UPDATE_USER_CALI_DATA    _IOR(BMAIO, 0x3c, short)
+#define BMA_IOCTL_SET_UPDATE_USER_CALI_DATA    _IOW(BMAIO, 0x3d, short)
+
+#define BMA_RANGE_2G		0x3
+#define BMA_RANGE_4G		0x5
+#define BMA_RANGE_8G		0x8
+#define BMA_RANGE_16G		0xC
+
+#define BMA_BW_7_81HZ		0x8
+#define BMA_BW_15_63HZ		0x9
+#define BMA_BW_31_25HZ		0xA
+#define BMA_BW_62_5HZ		0xB
+#define BMA_BW_125HZ		0xC
+#define BMA_BW_250HZ		0xD
+#define BMA_BW_500HZ		0xE
+#define BMA_BW_1000HZ		0xF
+
+#define E_OUT_OF_RANGE          (char)(-2)
+
+#define bma250_MODE_NORMAL      0
+#define bma250_MODE_SUSPEND     1
+
+extern unsigned int gs_kvalue;
+
+struct bma250_platform_data {
+	int intr;
+	int chip_layout;
+	int calibration_mode;
+	int gs_kvalue;
+	unsigned int (*G_Sensor_Compass_POR)(void);
+
+        
+        u8 axis_map_x;
+        u8 axis_map_y;
+        u8 axis_map_z;
+
+        u8 negate_x;
+        u8 negate_y;
+        u8 negate_z;
+
+	int (*power_LPM)(int on);
+};
+
+#endif