input: sensors: fromdos and remove trailing whitespace
[firefly-linux-kernel-4.4.55.git] / drivers / input / sensors / sensor-dev.c
index 0527631730972a9485403269bb1ff1b4b7d6170f..8e9aa6af3c049507f7f5d9561459e66ac778a92c 100755 (executable)
-/* drivers/input/sensors/sensor-dev.c - handle all gsensor in this file\r
- *\r
- * Copyright (C) 2012-2015 ROCKCHIP.\r
- * Author: luowei <lw@rock-chips.com>\r
- *\r
- * This software is licensed under the terms of the GNU General Public\r
- * License version 2, as published by the Free Software Foundation, and\r
- * may be copied, distributed, and modified under those terms.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
- * GNU General Public License for more details.\r
- *\r
- */\r
-\r
-#include <linux/interrupt.h>\r
-#include <linux/i2c.h>\r
-#include <linux/slab.h>\r
-#include <linux/irq.h>\r
-#include <linux/miscdevice.h>\r
-#include <linux/gpio.h>\r
-#include <asm/uaccess.h>\r
-#include <asm/atomic.h>\r
-#include <linux/delay.h>\r
-#include <linux/input.h>\r
-#include <linux/workqueue.h>\r
-#include <linux/freezer.h>\r
-#include <linux/proc_fs.h>\r
-#include <linux/gpio.h>\r
-#include <linux/of_gpio.h>\r
-#include <linux/of.h>\r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-#include <linux/earlysuspend.h>\r
-#endif\r
-#include <linux/l3g4200d.h>\r
-#include <linux/sensor-dev.h>\r
-#include <linux/module.h>\r
+/* drivers/input/sensors/sensor-dev.c - handle all gsensor in this file
+ *
+ * Copyright (C) 2012-2015 ROCKCHIP.
+ * Author: luowei <lw@rock-chips.com>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/interrupt.h>
+#include <linux/i2c.h>
+#include <linux/slab.h>
+#include <linux/irq.h>
+#include <linux/miscdevice.h>
+#include <linux/gpio.h>
+#include <asm/uaccess.h>
+#include <asm/atomic.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/workqueue.h>
+#include <linux/freezer.h>
+#include <linux/proc_fs.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/of.h>
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+#include <linux/l3g4200d.h>
+#include <linux/sensor-dev.h>
+#include <linux/module.h>
 #ifdef CONFIG_COMPAT
 #include <linux/compat.h>
 #endif
-\r
-\r
-/*\r
-sensor-dev.c v1.1 add pressure and temperature support 2013-2-27\r
-sensor-dev.c v1.2 add akm8963 support 2013-3-10\r
-sensor-dev.c v1.3 add sensor debug support 2013-3-15\r
-sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01\r
-*/\r
-\r
-#define SENSOR_VERSION_AND_TIME  "sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01"\r
-\r
-\r
-struct sensor_private_data *g_sensor[SENSOR_NUM_TYPES];\r
-static struct sensor_operate *sensor_ops[SENSOR_NUM_ID]; \r
-static struct class *g_sensor_class[SENSOR_NUM_TYPES];\r
-\r
-static ssize_t sensor_proc_write(struct file *file, const char __user *buffer,\r
-                          size_t count, loff_t *data)\r
-{\r
-       char c;\r
-       int rc;\r
-       int i = 0, num = 0;\r
-       \r
-       rc = get_user(c, buffer);\r
-       if (rc)\r
-       {\r
-               for(i=SENSOR_TYPE_NULL+1; i<SENSOR_NUM_TYPES; i++)\r
-               atomic_set(&g_sensor[i]->flags.debug_flag, SENSOR_TYPE_NULL);\r
-               return rc; \r
-       }\r
-\r
-       \r
-       num = c - '0';\r
-\r
-       printk("%s command list:close:%d,angle:%d accel:%d, compass:%d, gyro:%d, light:%d, psensor:%d, temp:%d, pressure:%d,total:%d,num=%d\n",__func__,\r
-               \r
-               SENSOR_TYPE_NULL, SENSOR_TYPE_ANGLE, SENSOR_TYPE_ACCEL,SENSOR_TYPE_COMPASS,SENSOR_TYPE_GYROSCOPE,SENSOR_TYPE_LIGHT,SENSOR_TYPE_PROXIMITY,\r
-\r
-               SENSOR_TYPE_TEMPERATURE,SENSOR_TYPE_PRESSURE,SENSOR_NUM_TYPES,num);\r
-\r
-       if((num > SENSOR_NUM_TYPES) || (num < SENSOR_TYPE_NULL))\r
-       {\r
-               printk("%s:error! only support %d to %d\n",__func__, SENSOR_TYPE_NULL,SENSOR_NUM_TYPES);\r
-               return -1;\r
-       }\r
-\r
-       for(i=SENSOR_TYPE_NULL+1; i<SENSOR_NUM_TYPES; i++)\r
-       {\r
-               if(g_sensor[i])\r
-               atomic_set(&g_sensor[i]->flags.debug_flag, num);\r
-       }\r
-       \r
-       return count; \r
-}\r
-\r
-static const struct file_operations sensor_proc_fops = {\r
-       .owner          = THIS_MODULE, \r
-       .write          = sensor_proc_write,\r
-};\r
-\r
-\r
-\r
-static int sensor_get_id(struct i2c_client *client, int *value)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);  \r
-       int result = 0;\r
-       char temp = sensor->ops->id_reg;\r
-       int i = 0;\r
-\r
-       if(sensor->ops->id_reg >= 0)\r
-       {\r
-               for(i=0; i<3; i++)\r
-               {\r
-                       result = sensor_rx_data(client, &temp, 1);\r
-                       *value = temp;\r
-                       if(!result)\r
-                       break;\r
-               }\r
-\r
-               if(result)\r
-                       return result;\r
-\r
-               if(*value != sensor->ops->id_data)\r
-               {\r
-                       printk("%s:id=0x%x is not 0x%x\n",__func__,*value, sensor->ops->id_data);\r
-                       result = -1;\r
-               }\r
-                       \r
-               DBG("%s:devid=0x%x\n",__func__,*value);\r
-       }\r
-       \r
-       return result;\r
-}\r
-\r
-static int sensor_initial(struct i2c_client *client)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);  \r
-       int result = 0;\r
-\r
-       //register setting according to chip datasheet  \r
-       result = sensor->ops->init(client);\r
-       if(result < 0)\r
-       {\r
-               printk("%s:fail to init sensor\n",__func__);\r
-               return result;\r
-       }\r
-\r
-\r
-       DBG("%s:ctrl_data=0x%x\n",__func__,sensor->ops->ctrl_data);\r
-       \r
-       return result;\r
-\r
-}\r
-\r
-static int sensor_chip_init(struct i2c_client *client)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);  \r
-       struct sensor_operate *ops = sensor_ops[(int)sensor->i2c_id->driver_data];\r
-       int result = 0;\r
-       \r
-       if(ops)\r
-       {\r
-               sensor->ops = ops;\r
-       }\r
-       else\r
-       {\r
-               printk("%s:ops is null,sensor name is %s\n",__func__,sensor->i2c_id->name);\r
-               result = -1;\r
-               goto error;\r
-       }\r
-\r
-       if((sensor->type != ops->type) || ((int)sensor->i2c_id->driver_data != ops->id_i2c))\r
-       {\r
-               printk("%s:type or id is different:type=%d,%d,id=%d,%d\n",__func__,sensor->type, ops->type, (int)sensor->i2c_id->driver_data, ops->id_i2c);\r
-               result = -1;\r
-               goto error;\r
-       }\r
-       \r
-       if(!ops->init || !ops->active || !ops->report)\r
-       {\r
-               printk("%s:error:some function is needed\n",__func__);          \r
-               result = -1;\r
-               goto error;\r
-       }\r
-\r
-       result = sensor_get_id(sensor->client, &sensor->devid);//get id\r
-       if(result < 0)\r
-       {       \r
-               printk("%s:fail to read %s devid:0x%x\n",__func__, sensor->i2c_id->name, sensor->devid);        \r
-               goto error;\r
-       }\r
-       \r
-       printk("%s:%s:devid=0x%x,ops=0x%p\n",__func__, sensor->i2c_id->name, sensor->devid,sensor->ops);\r
-\r
-       result = sensor_initial(sensor->client);        //init sensor\r
-       if(result < 0)\r
-       {       \r
-               printk("%s:fail to init sensor\n",__func__);            \r
-               goto error;\r
-       }\r
-\r
-       return 0;\r
-\r
-error:\r
-       \r
-       return result;\r
-}\r
-\r
-static int sensor_reset_rate(struct i2c_client *client, int rate)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);  \r
-       int result = 0; \r
-       \r
-       result = sensor->ops->active(client,SENSOR_OFF,rate);\r
-       sensor->ops->init(client);\r
-       result = sensor->ops->active(client,SENSOR_ON,rate);\r
-\r
-       return result;\r
-}\r
-\r
-static int sensor_get_data(struct i2c_client *client)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);  \r
-       int result = 0;\r
-       \r
-       result = sensor->ops->report(client);\r
-       if(result)\r
-               goto error;\r
-\r
-       /* set data_ready */\r
-       atomic_set(&sensor->data_ready, 1);\r
-       /*wake up data_ready  work queue*/\r
-       wake_up(&sensor->data_ready_wq);\r
-       \r
-error:         \r
-       return result;\r
-}\r
-\r
-#if 0\r
-int sensor_get_cached_data(struct i2c_client* client, char *buffer, int length, struct sensor_axis *axis)\r
-{\r
-    struct sensor_private_data* sensor = (struct sensor_private_data *)i2c_get_clientdata(client);     \r
-    wait_event_interruptible_timeout(sensor->data_ready_wq, \r
-                                     atomic_read(&(sensor->data_ready) ),\r
-                                     msecs_to_jiffies(1000) );\r
-    if ( 0 == atomic_read(&(sensor->data_ready) ) ) {\r
-        printk("waiting 'data_ready_wq' timed out.");\r
-        goto error;\r
-    }\r
-\r
-       \r
-       mutex_lock(&sensor->data_mutex);\r
-\r
-       switch(sensor->type)\r
-       {\r
-               case SENSOR_TYPE_ACCEL:\r
-               *axis = sensor->axis;\r
-               break;\r
-\r
-               case SENSOR_TYPE_COMPASS:\r
-               memcpy(buffer, sensor->sensor_data, length);\r
-               break;\r
-       }\r
-       \r
-       mutex_unlock(&sensor->data_mutex);\r
-       \r
-    return 0;\r
-       \r
-error:\r
-       return -1;\r
-}\r
-#endif\r
-\r
-static void  sensor_delaywork_func(struct work_struct *work)\r
-{\r
-       struct delayed_work *delaywork = container_of(work, struct delayed_work, work);\r
-       struct sensor_private_data *sensor = container_of(delaywork, struct sensor_private_data, delaywork);\r
-       struct i2c_client *client = sensor->client;\r
-\r
-       mutex_lock(&sensor->sensor_mutex);      \r
-       if (sensor_get_data(client) < 0) \r
-               DBG(KERN_ERR "%s: Get data failed\n",__func__);\r
-       \r
-       if(!sensor->pdata->irq_enable)//restart work while polling\r
-       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-       //else\r
-       //{\r
-               //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))\r
-               //enable_irq(sensor->client->irq);\r
-       //}\r
-       mutex_unlock(&sensor->sensor_mutex);\r
-       \r
-       DBG("%s:%s\n",__func__,sensor->i2c_id->name);\r
-}\r
-\r
-/*\r
- * This is a threaded IRQ handler so can access I2C/SPI.  Since all\r
- * interrupts are clear on read the IRQ line will be reasserted and\r
- * the physical IRQ will be handled again if another interrupt is\r
- * asserted while we run - in the normal course of events this is a\r
- * rare occurrence so we save I2C/SPI reads.  We're also assuming that\r
- * it's rare to get lots of interrupts firing simultaneously so try to\r
- * minimise I/O.\r
- */\r
-static irqreturn_t sensor_interrupt(int irq, void *dev_id)\r
-{\r
-       struct sensor_private_data *sensor = (struct sensor_private_data *)dev_id;\r
-\r
-       //use threaded IRQ\r
-       if (sensor_get_data(sensor->client) < 0) \r
-               DBG(KERN_ERR "%s: Get data failed\n",__func__);\r
-       msleep(sensor->pdata->poll_delay_ms);\r
-\r
-       \r
-       //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))\r
-       //disable_irq_nosync(irq);\r
-       //schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-       DBG("%s:irq=%d\n",__func__,irq);\r
-       return IRQ_HANDLED;\r
-}\r
-\r
-\r
-static int sensor_irq_init(struct i2c_client *client)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);  \r
-       int result = 0;\r
-       int irq;\r
-       if((sensor->pdata->irq_enable)&&(sensor->pdata->irq_flags!= SENSOR_UNKNOW_DATA))\r
-       {\r
-               //INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
-               if(sensor->pdata->poll_delay_ms < 0)\r
-                       sensor->pdata->poll_delay_ms = 30;\r
-               result = gpio_request(client->irq, sensor->i2c_id->name);\r
-               if (result)\r
-               {\r
-                       printk("%s:fail to request gpio :%d\n",__func__,client->irq);\r
-               }\r
-               \r
-               //gpio_pull_updown(client->irq, PullEnable);\r
-               irq = gpio_to_irq(client->irq);\r
-               //result = request_irq(irq, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);\r
-               //result = request_threaded_irq(irq, NULL, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);\r
-               result = devm_request_threaded_irq(&client->dev, irq, NULL, sensor_interrupt, sensor->pdata->irq_flags | IRQF_ONESHOT, sensor->ops->name, sensor);\r
-               if (result) {\r
-                       printk(KERN_ERR "%s:fail to request irq = %d, ret = 0x%x\n",__func__, irq, result);            \r
-                       goto error;            \r
-               }\r
-               client->irq = irq;\r
-               if((sensor->pdata->type == SENSOR_TYPE_GYROSCOPE) || (sensor->pdata->type == SENSOR_TYPE_ACCEL) || (sensor->pdata->type == SENSOR_TYPE_ANGLE))\r
-               disable_irq_nosync(client->irq);//disable irq\r
-               if(((sensor->pdata->type == SENSOR_TYPE_LIGHT) || (sensor->pdata->type == SENSOR_TYPE_PROXIMITY))&& (!(sensor->ops->trig & IRQF_SHARED)))       \r
-               disable_irq_nosync(client->irq);//disable irq   \r
-               if(((sensor->pdata->type == SENSOR_TYPE_TEMPERATURE) || (sensor->pdata->type == SENSOR_TYPE_PRESSURE))&& (!(sensor->ops->trig & IRQF_SHARED)))          \r
-               disable_irq_nosync(client->irq);//disable irq\r
-               DBG("%s:use irq=%d\n",__func__,irq);\r
-       }\r
-       else if(!sensor->pdata->irq_enable)\r
-       {               \r
-               INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\r
-               if(sensor->pdata->poll_delay_ms < 0)\r
-                       sensor->pdata->poll_delay_ms = 30;\r
-               \r
-               DBG("%s:use polling,delay=%d ms\n",__func__,sensor->pdata->poll_delay_ms);\r
-       }\r
-\r
-error: \r
-       return result;\r
-}\r
-\r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-static void sensor_suspend(struct early_suspend *h)\r
-{\r
-       struct sensor_private_data *sensor = \r
-                       container_of(h, struct sensor_private_data, early_suspend);\r
-       \r
-       if(sensor->ops->suspend)\r
-               sensor->ops->suspend(sensor->client);\r
-\r
-}\r
-\r
-static void sensor_resume(struct early_suspend *h)\r
-{\r
-       struct sensor_private_data *sensor = \r
-                       container_of(h, struct sensor_private_data, early_suspend);\r
-\r
-       if(sensor->ops->resume)\r
-               sensor->ops->resume(sensor->client);\r
-}\r
-#endif\r
+
+
+/*
+sensor-dev.c v1.1 add pressure and temperature support 2013-2-27
+sensor-dev.c v1.2 add akm8963 support 2013-3-10
+sensor-dev.c v1.3 add sensor debug support 2013-3-15
+sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01
+*/
+
+#define SENSOR_VERSION_AND_TIME  "sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01"
+
+
+struct sensor_private_data *g_sensor[SENSOR_NUM_TYPES];
+static struct sensor_operate *sensor_ops[SENSOR_NUM_ID];
+static struct class *g_sensor_class[SENSOR_NUM_TYPES];
+
+static ssize_t sensor_proc_write(struct file *file, const char __user *buffer,
+                          size_t count, loff_t *data)
+{
+       char c;
+       int rc;
+       int i = 0, num = 0;
+
+       rc = get_user(c, buffer);
+       if (rc)
+       {
+               for(i=SENSOR_TYPE_NULL+1; i<SENSOR_NUM_TYPES; i++)
+               atomic_set(&g_sensor[i]->flags.debug_flag, SENSOR_TYPE_NULL);
+               return rc;
+       }
+
+
+       num = c - '0';
+
+       printk("%s command list:close:%d,angle:%d accel:%d, compass:%d, gyro:%d, light:%d, psensor:%d, temp:%d, pressure:%d,total:%d,num=%d\n",__func__,
+
+               SENSOR_TYPE_NULL, SENSOR_TYPE_ANGLE, SENSOR_TYPE_ACCEL,SENSOR_TYPE_COMPASS,SENSOR_TYPE_GYROSCOPE,SENSOR_TYPE_LIGHT,SENSOR_TYPE_PROXIMITY,
+
+               SENSOR_TYPE_TEMPERATURE,SENSOR_TYPE_PRESSURE,SENSOR_NUM_TYPES,num);
+
+       if((num > SENSOR_NUM_TYPES) || (num < SENSOR_TYPE_NULL))
+       {
+               printk("%s:error! only support %d to %d\n",__func__, SENSOR_TYPE_NULL,SENSOR_NUM_TYPES);
+               return -1;
+       }
+
+       for(i=SENSOR_TYPE_NULL+1; i<SENSOR_NUM_TYPES; i++)
+       {
+               if(g_sensor[i])
+               atomic_set(&g_sensor[i]->flags.debug_flag, num);
+       }
+
+       return count;
+}
+
+static const struct file_operations sensor_proc_fops = {
+       .owner          = THIS_MODULE,
+       .write          = sensor_proc_write,
+};
+
+
+
+static int sensor_get_id(struct i2c_client *client, int *value)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       int result = 0;
+       char temp = sensor->ops->id_reg;
+       int i = 0;
+
+       if(sensor->ops->id_reg >= 0)
+       {
+               for(i=0; i<3; i++)
+               {
+                       result = sensor_rx_data(client, &temp, 1);
+                       *value = temp;
+                       if(!result)
+                       break;
+               }
+
+               if(result)
+                       return result;
+
+               if(*value != sensor->ops->id_data)
+               {
+                       printk("%s:id=0x%x is not 0x%x\n",__func__,*value, sensor->ops->id_data);
+                       result = -1;
+               }
+
+               DBG("%s:devid=0x%x\n",__func__,*value);
+       }
+
+       return result;
+}
+
+static int sensor_initial(struct i2c_client *client)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       int result = 0;
+
+       //register setting according to chip datasheet
+       result = sensor->ops->init(client);
+       if(result < 0)
+       {
+               printk("%s:fail to init sensor\n",__func__);
+               return result;
+       }
+
+
+       DBG("%s:ctrl_data=0x%x\n",__func__,sensor->ops->ctrl_data);
+
+       return result;
+
+}
+
+static int sensor_chip_init(struct i2c_client *client)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       struct sensor_operate *ops = sensor_ops[(int)sensor->i2c_id->driver_data];
+       int result = 0;
+
+       if(ops)
+       {
+               sensor->ops = ops;
+       }
+       else
+       {
+               printk("%s:ops is null,sensor name is %s\n",__func__,sensor->i2c_id->name);
+               result = -1;
+               goto error;
+       }
+
+       if((sensor->type != ops->type) || ((int)sensor->i2c_id->driver_data != ops->id_i2c))
+       {
+               printk("%s:type or id is different:type=%d,%d,id=%d,%d\n",__func__,sensor->type, ops->type, (int)sensor->i2c_id->driver_data, ops->id_i2c);
+               result = -1;
+               goto error;
+       }
+
+       if(!ops->init || !ops->active || !ops->report)
+       {
+               printk("%s:error:some function is needed\n",__func__);
+               result = -1;
+               goto error;
+       }
+
+       result = sensor_get_id(sensor->client, &sensor->devid);//get id
+       if(result < 0)
+       {
+               printk("%s:fail to read %s devid:0x%x\n",__func__, sensor->i2c_id->name, sensor->devid);
+               goto error;
+       }
+
+       printk("%s:%s:devid=0x%x,ops=0x%p\n",__func__, sensor->i2c_id->name, sensor->devid,sensor->ops);
+
+       result = sensor_initial(sensor->client);        //init sensor
+       if(result < 0)
+       {
+               printk("%s:fail to init sensor\n",__func__);
+               goto error;
+       }
+
+       return 0;
+
+error:
+
+       return result;
+}
+
+static int sensor_reset_rate(struct i2c_client *client, int rate)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       int result = 0;
+
+       result = sensor->ops->active(client,SENSOR_OFF,rate);
+       sensor->ops->init(client);
+       result = sensor->ops->active(client,SENSOR_ON,rate);
+
+       return result;
+}
+
+static int sensor_get_data(struct i2c_client *client)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       int result = 0;
+
+       result = sensor->ops->report(client);
+       if(result)
+               goto error;
+
+       /* set data_ready */
+       atomic_set(&sensor->data_ready, 1);
+       /*wake up data_ready  work queue*/
+       wake_up(&sensor->data_ready_wq);
+
+error:
+       return result;
+}
+
+#if 0
+int sensor_get_cached_data(struct i2c_client* client, char *buffer, int length, struct sensor_axis *axis)
+{
+    struct sensor_private_data* sensor = (struct sensor_private_data *)i2c_get_clientdata(client);
+    wait_event_interruptible_timeout(sensor->data_ready_wq,
+                                     atomic_read(&(sensor->data_ready) ),
+                                     msecs_to_jiffies(1000) );
+    if ( 0 == atomic_read(&(sensor->data_ready) ) ) {
+        printk("waiting 'data_ready_wq' timed out.");
+        goto error;
+    }
+
+
+       mutex_lock(&sensor->data_mutex);
+
+       switch(sensor->type)
+       {
+               case SENSOR_TYPE_ACCEL:
+               *axis = sensor->axis;
+               break;
+
+               case SENSOR_TYPE_COMPASS:
+               memcpy(buffer, sensor->sensor_data, length);
+               break;
+       }
+
+       mutex_unlock(&sensor->data_mutex);
+
+    return 0;
+
+error:
+       return -1;
+}
+#endif
+
+static void  sensor_delaywork_func(struct work_struct *work)
+{
+       struct delayed_work *delaywork = container_of(work, struct delayed_work, work);
+       struct sensor_private_data *sensor = container_of(delaywork, struct sensor_private_data, delaywork);
+       struct i2c_client *client = sensor->client;
+
+       mutex_lock(&sensor->sensor_mutex);
+       if (sensor_get_data(client) < 0)
+               DBG(KERN_ERR "%s: Get data failed\n",__func__);
+
+       if(!sensor->pdata->irq_enable)//restart work while polling
+       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+       //else
+       //{
+               //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))
+               //enable_irq(sensor->client->irq);
+       //}
+       mutex_unlock(&sensor->sensor_mutex);
+
+       DBG("%s:%s\n",__func__,sensor->i2c_id->name);
+}
+
+/*
+ * This is a threaded IRQ handler so can access I2C/SPI.  Since all
+ * interrupts are clear on read the IRQ line will be reasserted and
+ * the physical IRQ will be handled again if another interrupt is
+ * asserted while we run - in the normal course of events this is a
+ * rare occurrence so we save I2C/SPI reads.  We're also assuming that
+ * it's rare to get lots of interrupts firing simultaneously so try to
+ * minimise I/O.
+ */
+static irqreturn_t sensor_interrupt(int irq, void *dev_id)
+{
+       struct sensor_private_data *sensor = (struct sensor_private_data *)dev_id;
+
+       //use threaded IRQ
+       if (sensor_get_data(sensor->client) < 0)
+               DBG(KERN_ERR "%s: Get data failed\n",__func__);
+       msleep(sensor->pdata->poll_delay_ms);
+
+
+       //if((sensor->ops->trig == IRQF_TRIGGER_LOW) || (sensor->ops->trig == IRQF_TRIGGER_HIGH))
+       //disable_irq_nosync(irq);
+       //schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+       DBG("%s:irq=%d\n",__func__,irq);
+       return IRQ_HANDLED;
+}
+
+
+static int sensor_irq_init(struct i2c_client *client)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       int result = 0;
+       int irq;
+       if((sensor->pdata->irq_enable)&&(sensor->pdata->irq_flags!= SENSOR_UNKNOW_DATA))
+       {
+               //INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);
+               if(sensor->pdata->poll_delay_ms < 0)
+                       sensor->pdata->poll_delay_ms = 30;
+               result = gpio_request(client->irq, sensor->i2c_id->name);
+               if (result)
+               {
+                       printk("%s:fail to request gpio :%d\n",__func__,client->irq);
+               }
+
+               //gpio_pull_updown(client->irq, PullEnable);
+               irq = gpio_to_irq(client->irq);
+               //result = request_irq(irq, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);
+               //result = request_threaded_irq(irq, NULL, sensor_interrupt, sensor->ops->trig, sensor->ops->name, sensor);
+               result = devm_request_threaded_irq(&client->dev, irq, NULL, sensor_interrupt, sensor->pdata->irq_flags | IRQF_ONESHOT, sensor->ops->name, sensor);
+               if (result) {
+                       printk(KERN_ERR "%s:fail to request irq = %d, ret = 0x%x\n",__func__, irq, result);
+                       goto error;
+               }
+               client->irq = irq;
+               if((sensor->pdata->type == SENSOR_TYPE_GYROSCOPE) || (sensor->pdata->type == SENSOR_TYPE_ACCEL) || (sensor->pdata->type == SENSOR_TYPE_ANGLE))
+               disable_irq_nosync(client->irq);//disable irq
+               if(((sensor->pdata->type == SENSOR_TYPE_LIGHT) || (sensor->pdata->type == SENSOR_TYPE_PROXIMITY))&& (!(sensor->ops->trig & IRQF_SHARED)))
+               disable_irq_nosync(client->irq);//disable irq
+               if(((sensor->pdata->type == SENSOR_TYPE_TEMPERATURE) || (sensor->pdata->type == SENSOR_TYPE_PRESSURE))&& (!(sensor->ops->trig & IRQF_SHARED)))
+               disable_irq_nosync(client->irq);//disable irq
+               DBG("%s:use irq=%d\n",__func__,irq);
+       }
+       else if(!sensor->pdata->irq_enable)
+       {
+               INIT_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);
+               if(sensor->pdata->poll_delay_ms < 0)
+                       sensor->pdata->poll_delay_ms = 30;
+
+               DBG("%s:use polling,delay=%d ms\n",__func__,sensor->pdata->poll_delay_ms);
+       }
+
+error:
+       return result;
+}
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+static void sensor_suspend(struct early_suspend *h)
+{
+       struct sensor_private_data *sensor =
+                       container_of(h, struct sensor_private_data, early_suspend);
+
+       if(sensor->ops->suspend)
+               sensor->ops->suspend(sensor->client);
+
+}
+
+static void sensor_resume(struct early_suspend *h)
+{
+       struct sensor_private_data *sensor =
+                       container_of(h, struct sensor_private_data, early_suspend);
+
+       if(sensor->ops->resume)
+               sensor->ops->resume(sensor->client);
+}
+#endif
 
 #ifdef CONFIG_PM
 static int sensor_of_suspend(struct device *dev)
@@ -427,1943 +427,1943 @@ static const struct dev_pm_ops sensor_pm_ops = {
 #define SENSOR_PM_OPS NULL
 #endif
 
-static int angle_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];     \r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-static int angle_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ANGLE];     \r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-/* ioctl - I/O control */\r
-static long angle_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ANGLE];\r
-       struct i2c_client *client = sensor->client;\r
-       void __user *argp = (void __user *)arg;\r
-       struct sensor_axis axis = {0};\r
-       char rate;\r
-       int result = 0;\r
-\r
-       switch (cmd) {\r
-       case GSENSOR_IOCTL_APP_SET_RATE:\r
-               if (copy_from_user(&rate, argp, sizeof(rate)))\r
-               {\r
-                       result = -EFAULT;\r
-                       goto error;\r
-               }\r
-               break;\r
-       default:\r
-               break;\r
-       }\r
-\r
-       switch (cmd) {\r
-       case GSENSOR_IOCTL_START:       \r
-               DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);\r
-               mutex_lock(&sensor->operation_mutex);   \r
-               if(++sensor->start_count == 1)\r
-               {\r
-                       if(sensor->status_cur == SENSOR_OFF)\r
-                       {\r
-                               atomic_set(&(sensor->data_ready), 0);\r
-                               if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);\r
-                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                                       goto error;           \r
-                               }                       \r
-                               if(sensor->pdata->irq_enable)\r
-                               {\r
-                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                       enable_irq(client->irq);        //enable irq\r
-                               }       \r
-                               else\r
-                               {\r
-                                       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                               }\r
-                               sensor->status_cur = SENSOR_ON;\r
-                       }       \r
-               }\r
-               mutex_unlock(&sensor->operation_mutex);\r
-               DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);\r
-               break;\r
-\r
-       case GSENSOR_IOCTL_CLOSE:                               \r
-               DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);\r
-               mutex_lock(&sensor->operation_mutex);           \r
-               if(--sensor->start_count == 0)\r
-               {\r
-                       if(sensor->status_cur == SENSOR_ON)\r
-                       {\r
-                               atomic_set(&(sensor->data_ready), 0);\r
-                               if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);              \r
-                                       goto error;\r
-                               }\r
-                               \r
-                               if(sensor->pdata->irq_enable)\r
-                               {                               \r
-                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                       disable_irq_nosync(client->irq);//disable irq\r
-                               }\r
-                               else\r
-                               cancel_delayed_work_sync(&sensor->delaywork);           \r
-                               sensor->status_cur = SENSOR_OFF;\r
-                       }\r
-                       \r
-                       DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);\r
-               }\r
-               \r
-               mutex_unlock(&sensor->operation_mutex); \r
-               break;\r
-\r
-       case GSENSOR_IOCTL_APP_SET_RATE:                \r
-               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);         \r
-               mutex_lock(&sensor->operation_mutex);   \r
-               result = sensor_reset_rate(client, rate);\r
-               if (result < 0){\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       goto error;\r
-               }\r
-\r
-               sensor->status_cur = SENSOR_ON;\r
-               mutex_unlock(&sensor->operation_mutex); \r
-               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);\r
-               break;\r
-               \r
-       case GSENSOR_IOCTL_GETDATA:\r
-               mutex_lock(&sensor->data_mutex);\r
-               memcpy(&axis, &sensor->axis, sizeof(sensor->axis));     //get data from buffer\r
-               mutex_unlock(&sensor->data_mutex);              \r
-               break;\r
-       default:\r
-               result = -ENOTTY;\r
-       goto error;\r
-       }\r
-\r
-       switch (cmd) {\r
-       case GSENSOR_IOCTL_GETDATA:\r
-               if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {\r
-                   printk("failed to copy sense data to user space.");\r
-                               result = -EFAULT;                       \r
-                               goto error;\r
-               }               \r
-               DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);\r
-               break;\r
-       default:\r
-               break;\r
-       }\r
-       \r
-error:\r
-       return result;\r
-}\r
-\r
-\r
-static int gsensor_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];     \r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-static int gsensor_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];     \r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-/* ioctl - I/O control */\r
-static long gsensor_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];\r
-       struct i2c_client *client = sensor->client;\r
-       void __user *argp = (void __user *)arg;\r
-       struct sensor_axis axis = {0};\r
-       char rate;\r
-       int result = 0;\r
-\r
-       switch (cmd) {\r
-       case GSENSOR_IOCTL_APP_SET_RATE:\r
-               if (copy_from_user(&rate, argp, sizeof(rate)))\r
-               {\r
-                       result = -EFAULT;\r
-                       goto error;\r
-               }\r
-               break;\r
-       default:\r
-               break;\r
-       }\r
-\r
-       switch (cmd) {\r
-       case GSENSOR_IOCTL_START:       \r
-               DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);\r
-               mutex_lock(&sensor->operation_mutex);   \r
-               if(++sensor->start_count == 1)\r
-               {\r
-                       if(sensor->status_cur == SENSOR_OFF)\r
-                       {\r
-                               atomic_set(&(sensor->data_ready), 0);\r
-                               if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);\r
-                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                                       goto error;           \r
-                               }                       \r
-                               if(sensor->pdata->irq_enable)\r
-                               {\r
-                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                       enable_irq(client->irq);        //enable irq\r
-                               }       \r
-                               else\r
-                               {\r
-                                       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                               }\r
-                               sensor->status_cur = SENSOR_ON;\r
-                       }       \r
-               }\r
-               mutex_unlock(&sensor->operation_mutex);\r
-               DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);\r
-               break;\r
-\r
-       case GSENSOR_IOCTL_CLOSE:                               \r
-               DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);\r
-               mutex_lock(&sensor->operation_mutex);           \r
-               if(--sensor->start_count == 0)\r
-               {\r
-                       if(sensor->status_cur == SENSOR_ON)\r
-                       {\r
-                               atomic_set(&(sensor->data_ready), 0);\r
-                               if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);              \r
-                                       goto error;\r
-                               }\r
-                               \r
-                               if(sensor->pdata->irq_enable)\r
-                               {                               \r
-                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                       disable_irq_nosync(client->irq);//disable irq\r
-                               }\r
-                               else\r
-                               cancel_delayed_work_sync(&sensor->delaywork);           \r
-                               sensor->status_cur = SENSOR_OFF;\r
-                       }\r
-                       \r
-                       DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);\r
-               }\r
-               \r
-               mutex_unlock(&sensor->operation_mutex); \r
-               break;\r
-\r
-       case GSENSOR_IOCTL_APP_SET_RATE:                \r
-               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);         \r
-               mutex_lock(&sensor->operation_mutex);   \r
-               result = sensor_reset_rate(client, rate);\r
-               if (result < 0){\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       goto error;\r
-               }\r
-\r
-               sensor->status_cur = SENSOR_ON;\r
-               mutex_unlock(&sensor->operation_mutex); \r
-               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);\r
-               break;\r
-               \r
-       case GSENSOR_IOCTL_GETDATA:\r
-               mutex_lock(&sensor->data_mutex);\r
-               memcpy(&axis, &sensor->axis, sizeof(sensor->axis));     //get data from buffer\r
-               mutex_unlock(&sensor->data_mutex);              \r
-               break;\r
-       default:\r
-               result = -ENOTTY;\r
-       goto error;\r
-       }\r
-\r
-       switch (cmd) {\r
-       case GSENSOR_IOCTL_GETDATA:\r
-               if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {\r
-                   printk("failed to copy sense data to user space.");\r
-                               result = -EFAULT;                       \r
-                               goto error;\r
-               }               \r
-               DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);\r
-               break;\r
-       default:\r
-               break;\r
-       }\r
-       \r
-error:\r
-       return result;\r
-}\r
-\r
-static ssize_t gsensor_set_orientation_online(struct class *class,\r
-               struct class_attribute *attr, const char *buf, size_t count)\r
-{\r
-       int i=0;\r
-       char orientation[20];\r
-       char *tmp;\r
-       \r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];\r
-       struct sensor_platform_data *pdata = sensor->pdata;\r
-\r
-       \r
-       char *p = strstr(buf,"gsensor_class");\r
-       int start = strcspn(p,"{");\r
-       int end = strcspn(p,"}");\r
-       \r
-       strncpy(orientation,p+start,end-start+1);\r
-       tmp = orientation;\r
-       \r
-\r
-       while(strncmp(tmp,"}",1)!=0)\r
-        {\r
-               if((strncmp(tmp,",",1)==0)||(strncmp(tmp,"{",1)==0))\r
-               {\r
-                       \r
-                        tmp++;         \r
-                        continue;\r
-               }       \r
-               else if(strncmp(tmp,"-",1)==0)\r
-               {\r
-                       pdata->orientation[i++]=-1;\r
-                       DBG("i=%d,data=%d\n",i,pdata->orientation[i]);\r
-                        tmp++;\r
-               }               \r
-               else\r
-               {\r
-                       pdata->orientation[i++]=tmp[0]-48;              \r
-                       DBG("----i=%d,data=%d\n",i,pdata->orientation[i]);      \r
-               }       \r
-               tmp++;\r
-       \r
-                                               \r
-        }\r
-\r
-       for(i=0;i<9;i++)\r
-               DBG("i=%d gsensor_info=%d\n",i,pdata->orientation[i]);\r
-       return 0;\r
-\r
-}\r
-\r
-static CLASS_ATTR(orientation, 0660, NULL, gsensor_set_orientation_online);\r
-\r
-static int  gsensor_class_init(void)\r
-{\r
-       int ret ;\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];       \r
-       g_sensor_class[SENSOR_TYPE_ACCEL] = class_create(THIS_MODULE, "gsensor_class");\r
-       ret =  class_create_file(g_sensor_class[SENSOR_TYPE_ACCEL], &class_attr_orientation);\r
-       if (ret)\r
-       {\r
-               printk("%s:Fail to creat class\n",__func__);\r
-               return ret;\r
-       }\r
-       printk("%s:%s\n",__func__,sensor->i2c_id->name);\r
-       return 0;\r
-}\r
-\r
-\r
-\r
-static int compass_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];\r
-       //struct i2c_client *client = sensor->client;   \r
-\r
-       int result = 0;\r
-       int flag = 0;\r
-       flag = atomic_read(&sensor->flags.open_flag);\r
-       if(!flag)\r
-       {       \r
-               atomic_set(&sensor->flags.open_flag, 1);\r
-               wake_up(&sensor->flags.open_wq);\r
-       }\r
-\r
-       DBG("%s\n", __func__);\r
-       return result;\r
-}\r
-\r
-\r
-\r
-static int compass_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];\r
-       //struct i2c_client *client = sensor->client;\r
-       //void __user *argp = (void __user *)arg;\r
-       int result = 0;\r
-       int flag = 0;\r
-       flag = atomic_read(&sensor->flags.open_flag);\r
-       if(flag)\r
-       {\r
-               atomic_set(&sensor->flags.open_flag, 0);\r
-               wake_up(&sensor->flags.open_wq);        \r
-       }\r
-       \r
-       DBG("%s\n", __func__);\r
-       return result;\r
-}\r
-\r
-#ifdef CONFIG_COMPAT
-/* ioctl - I/O control */
-static long compass_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+static int angle_dev_open(struct inode *inode, struct file *file)
 {
-       void __user *arg64 = compat_ptr(arg);
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
+       //struct i2c_client *client = sensor->client;
+
        int result = 0;
 
-       if (!file->f_op || !file->f_op->unlocked_ioctl) {
-               pr_err("file->f_op or file->f_op->unlocked_ioctl is null\n");
-               return -ENOTTY;
-       }
+
+       return result;
+}
+
+
+static int angle_dev_release(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ANGLE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+/* ioctl - I/O control */
+static long angle_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ANGLE];
+       struct i2c_client *client = sensor->client;
+       void __user *argp = (void __user *)arg;
+       struct sensor_axis axis = {0};
+       char rate;
+       int result = 0;
 
        switch (cmd) {
-       case COMPAT_ECS_IOCTL_APP_SET_MFLAG:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_MFLAG, (unsigned long)arg64);
-               break;
-       case COMPAT_ECS_IOCTL_APP_GET_MFLAG:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_MFLAG, (unsigned long)arg64);
-               break;
-       case COMPAT_ECS_IOCTL_APP_SET_AFLAG:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_AFLAG, (unsigned long)arg64);
-               break;
-       case COMPAT_ECS_IOCTL_APP_GET_AFLAG:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_AFLAG, (unsigned long)arg64);
+       case GSENSOR_IOCTL_APP_SET_RATE:
+               if (copy_from_user(&rate, argp, sizeof(rate)))
+               {
+                       result = -EFAULT;
+                       goto error;
+               }
                break;
-       case COMPAT_ECS_IOCTL_APP_SET_MVFLAG:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_MVFLAG, (unsigned long)arg64);
+       default:
                break;
-       case COMPAT_ECS_IOCTL_APP_GET_MVFLAG:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_MVFLAG, (unsigned long)arg64);
+       }
+
+       switch (cmd) {
+       case GSENSOR_IOCTL_START:
+               DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);
+               mutex_lock(&sensor->operation_mutex);
+               if(++sensor->start_count == 1)
+               {
+                       if(sensor->status_cur == SENSOR_OFF)
+                       {
+                               atomic_set(&(sensor->data_ready), 0);
+                               if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                                       goto error;
+                               }
+                               if(sensor->pdata->irq_enable)
+                               {
+                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                       enable_irq(client->irq);        //enable irq
+                               }
+                               else
+                               {
+                                       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                               }
+                               sensor->status_cur = SENSOR_ON;
+                       }
+               }
+               mutex_unlock(&sensor->operation_mutex);
+               DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);
+               break;
+
+       case GSENSOR_IOCTL_CLOSE:
+               DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);
+               mutex_lock(&sensor->operation_mutex);
+               if(--sensor->start_count == 0)
+               {
+                       if(sensor->status_cur == SENSOR_ON)
+                       {
+                               atomic_set(&(sensor->data_ready), 0);
+                               if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       goto error;
+                               }
+
+                               if(sensor->pdata->irq_enable)
+                               {
+                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                       disable_irq_nosync(client->irq);//disable irq
+                               }
+                               else
+                               cancel_delayed_work_sync(&sensor->delaywork);
+                               sensor->status_cur = SENSOR_OFF;
+                       }
+
+                       DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);
+               }
+
+               mutex_unlock(&sensor->operation_mutex);
+               break;
+
+       case GSENSOR_IOCTL_APP_SET_RATE:
+               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);
+               mutex_lock(&sensor->operation_mutex);
+               result = sensor_reset_rate(client, rate);
+               if (result < 0){
+                       mutex_unlock(&sensor->operation_mutex);
+                       goto error;
+               }
+
+               sensor->status_cur = SENSOR_ON;
+               mutex_unlock(&sensor->operation_mutex);
+               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);
                break;
-       case COMPAT_ECS_IOCTL_APP_SET_DELAY:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_DELAY, (unsigned long)arg64);
+
+       case GSENSOR_IOCTL_GETDATA:
+               mutex_lock(&sensor->data_mutex);
+               memcpy(&axis, &sensor->axis, sizeof(sensor->axis));     //get data from buffer
+               mutex_unlock(&sensor->data_mutex);
                break;
-       case COMPAT_ECS_IOCTL_APP_GET_DELAY:
-               if (file->f_op->unlocked_ioctl)
-                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_DELAY, (unsigned long)arg64);
+       default:
+               result = -ENOTTY;
+       goto error;
+       }
+
+       switch (cmd) {
+       case GSENSOR_IOCTL_GETDATA:
+               if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {
+                   printk("failed to copy sense data to user space.");
+                               result = -EFAULT;
+                               goto error;
+               }
+               DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);
                break;
        default:
                break;
        }
 
+error:
        return result;
 }
-#endif
 
-\r
-/* ioctl - I/O control */\r
-static long compass_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];\r
-       //struct i2c_client *client = sensor->client;\r
-       void __user *argp = (void __user *)arg;\r
-       int result = 0;\r
-       short flag;\r
-       \r
-       switch (cmd) {\r
-               case ECS_IOCTL_APP_SET_MFLAG:\r
-               case ECS_IOCTL_APP_SET_AFLAG:\r
-               case ECS_IOCTL_APP_SET_MVFLAG:\r
-                       if (copy_from_user(&flag, argp, sizeof(flag))) {\r
-                               return -EFAULT;\r
-                       }\r
-                       if (flag < 0 || flag > 1) {\r
-                               return -EINVAL;\r
-                       }\r
-                       break;\r
-               case ECS_IOCTL_APP_SET_DELAY:\r
-                       if (copy_from_user(&flag, argp, sizeof(flag))) {\r
-                               return -EFAULT;\r
-                       }\r
-                       break;\r
-               default:\r
-                       break;\r
-       }\r
-       \r
-       switch (cmd) {\r
-               case ECS_IOCTL_APP_SET_MFLAG:   \r
-                       atomic_set(&sensor->flags.m_flag, flag);                        \r
-                       DBG("%s:ECS_IOCTL_APP_SET_MFLAG,flag=%d\n", __func__,flag);\r
-                       break;\r
-               case ECS_IOCTL_APP_GET_MFLAG:           \r
-                       flag = atomic_read(&sensor->flags.m_flag);\r
-                       DBG("%s:ECS_IOCTL_APP_GET_MFLAG,flag=%d\n", __func__,flag);\r
-                       break;\r
-               case ECS_IOCTL_APP_SET_AFLAG:   \r
-                       atomic_set(&sensor->flags.a_flag, flag);                \r
-                       DBG("%s:ECS_IOCTL_APP_SET_AFLAG,flag=%d\n", __func__,flag);\r
-                       break;\r
-               case ECS_IOCTL_APP_GET_AFLAG:\r
-                       flag = atomic_read(&sensor->flags.a_flag);              \r
-                       DBG("%s:ECS_IOCTL_APP_GET_AFLAG,flag=%d\n", __func__,flag);\r
-                       break;\r
-               case ECS_IOCTL_APP_SET_MVFLAG:  \r
-                       atomic_set(&sensor->flags.mv_flag, flag);               \r
-                       DBG("%s:ECS_IOCTL_APP_SET_MVFLAG,flag=%d\n", __func__,flag);\r
-                       break;\r
-               case ECS_IOCTL_APP_GET_MVFLAG:          \r
-                       flag = atomic_read(&sensor->flags.mv_flag);             \r
-                       DBG("%s:ECS_IOCTL_APP_GET_MVFLAG,flag=%d\n", __func__,flag);\r
-                       break;\r
-               case ECS_IOCTL_APP_SET_DELAY:\r
-                       sensor->flags.delay = flag;\r
-                       break;\r
-               case ECS_IOCTL_APP_GET_DELAY:\r
-                       flag = sensor->flags.delay;\r
-                       break;\r
-               default:\r
-                       return -ENOTTY;\r
-       }\r
-       \r
-       switch (cmd) {\r
-               case ECS_IOCTL_APP_GET_MFLAG:\r
-               case ECS_IOCTL_APP_GET_AFLAG:\r
-               case ECS_IOCTL_APP_GET_MVFLAG:\r
-               case ECS_IOCTL_APP_GET_DELAY:\r
-                       if (copy_to_user(argp, &flag, sizeof(flag))) {\r
-                               return -EFAULT;\r
-                       }\r
-                       break;\r
-               default:\r
-                       break;\r
-       }\r
-\r
-       return result;\r
-}\r
-\r
-static int gyro_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];\r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-static int gyro_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];\r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-/* ioctl - I/O control */\r
-static long gyro_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];   \r
-       struct i2c_client *client = sensor->client;     \r
-       void __user *argp = (void __user *)arg;\r
-       int result = 0;\r
-       char rate;\r
-       switch (cmd) {\r
-       case L3G4200D_IOCTL_GET_ENABLE: \r
-               result = !sensor->status_cur;\r
-               if (copy_to_user(argp, &result, sizeof(result)))\r
-               {\r
-                       printk("%s:failed to copy status to user space.\n",__FUNCTION__);\r
-                       return -EFAULT;\r
-               }\r
-               \r
-               DBG("%s :L3G4200D_IOCTL_GET_ENABLE,status=%d\n",__FUNCTION__,result);   \r
-               break;\r
-       case L3G4200D_IOCTL_SET_ENABLE:                 \r
-               DBG("%s :L3G4200D_IOCTL_SET_ENABLE,flag=%d\n",__FUNCTION__,*(unsigned int *)argp);\r
-               mutex_lock(&sensor->operation_mutex);   \r
-               if(*(unsigned int *)argp)\r
-               {\r
-                       if(sensor->status_cur == SENSOR_OFF)\r
-                       {\r
-                               if ( (result = sensor->ops->active(client, 1, ODR100_BW12_5) ) < 0 ) {\r
-                               mutex_unlock(&sensor->operation_mutex);\r
-                               printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                               goto error;           \r
-                               }                       \r
-                               if(sensor->pdata->irq_enable)\r
-                               {\r
-                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                       enable_irq(client->irq);        //enable irq\r
-                               }       \r
-                               else\r
-                               {\r
-                                       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                               }\r
-                               sensor->status_cur = SENSOR_ON;\r
-                       }       \r
-               }\r
-               else\r
-               {\r
-                       if(sensor->status_cur == SENSOR_ON)\r
-                       {\r
-                               if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {\r
-                               mutex_unlock(&sensor->operation_mutex);              \r
-                               goto error;\r
-                               }\r
-                               \r
-                               if(sensor->pdata->irq_enable)\r
-                               {                               \r
-                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                       disable_irq_nosync(client->irq);//disable irq\r
-                               }\r
-                               else\r
-                               cancel_delayed_work_sync(&sensor->delaywork);           \r
-                               sensor->status_cur = SENSOR_OFF;\r
-                       }\r
-               }\r
-       \r
-               result = sensor->status_cur;\r
-               if (copy_to_user(argp, &result, sizeof(result)))\r
-               {\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       printk("%s:failed to copy sense data to user space.\n",__FUNCTION__);\r
-                       return -EFAULT;\r
-               }\r
-\r
-               mutex_unlock(&sensor->operation_mutex);\r
-               DBG("%s:L3G4200D_IOCTL_SET_ENABLE OK\n", __func__);\r
-               break;\r
-       case L3G4200D_IOCTL_SET_DELAY:                                  \r
-               if (copy_from_user(&rate, argp, sizeof(rate)))\r
-               return -EFAULT;\r
-               mutex_lock(&sensor->operation_mutex);\r
-               if(sensor->status_cur == SENSOR_OFF)\r
-               {\r
-                       if ( (result = sensor->ops->active(client, 1, rate) ) < 0 ) {\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                       goto error;           \r
-                       }\r
-                       \r
-                       if(sensor->pdata->irq_enable)\r
-                       {\r
-                               DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                               enable_irq(client->irq);        //enable irq\r
-                       }       \r
-                       else\r
-                       {\r
-                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                       }\r
-                       sensor->status_cur = SENSOR_ON;\r
-               }       \r
-               \r
-               mutex_unlock(&sensor->operation_mutex);\r
-               DBG("%s :L3G4200D_IOCTL_SET_DELAY,rate=%d\n",__FUNCTION__,rate);\r
-               break;\r
-\r
-       default:\r
-               printk("%s:error,cmd=0x%x\n",__func__,cmd);\r
-               return -ENOTTY;\r
-       }\r
-       \r
-       DBG("%s:line=%d,cmd=0x%x\n",__func__,__LINE__,cmd);\r
-\r
-error:\r
-       return result;\r
-}\r
-\r
-static int light_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];\r
-       //struct i2c_client *client = sensor->client;   \r
-       int result = 0; \r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-\r
-\r
-static int light_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];\r
-       //struct i2c_client *client = sensor->client;   \r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-#ifdef CONFIG_COMPAT
-static long light_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+
+static int gsensor_dev_open(struct inode *inode, struct file *file)
 {
-       long ret = 0;
-       void __user *arg64 = compat_ptr(arg);
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
+       //struct i2c_client *client = sensor->client;
 
-       if (!file->f_op || !file->f_op->unlocked_ioctl) {
-               pr_err("[DEBUG] file->f_op or file->f_op->unlocked_ioctl is null\n");
-               return -ENOTTY;
-       }
+       int result = 0;
 
-       switch (cmd) {
-       case COMPAT_LIGHTSENSOR_IOCTL_GET_ENABLED:
-               if (file->f_op->unlocked_ioctl)
-                       ret = file->f_op->unlocked_ioctl(file, LIGHTSENSOR_IOCTL_GET_ENABLED, (unsigned long)arg64);
-               break;
-       case COMPAT_LIGHTSENSOR_IOCTL_ENABLE:
-               if (file->f_op->unlocked_ioctl)
-                       ret = file->f_op->unlocked_ioctl(file, LIGHTSENSOR_IOCTL_ENABLE, (unsigned long)arg64);
-               break;
-       default:
-               break;
-       }
 
-       return ret;
+       return result;
 }
-#endif
-\r
-/* ioctl - I/O control */\r
-static long light_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];\r
-       struct i2c_client *client = sensor->client;\r
-       unsigned int *argp = (unsigned int *)arg;       \r
-       int result = 0;\r
-\r
-       switch(cmd)\r
-       {\r
-               case LIGHTSENSOR_IOCTL_GET_ENABLED:\r
-                       *argp = sensor->status_cur;\r
-                       break;\r
-               case LIGHTSENSOR_IOCTL_ENABLE:          \r
-                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);\r
-                       mutex_lock(&sensor->operation_mutex);    \r
-                       if(*(unsigned int *)argp)\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_OFF)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);\r
-                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                                       goto error;           \r
-                                       }       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {\r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                                       enable_irq(client->irq);        //enable irq\r
-                                               }\r
-                                       }       \r
-                                       else\r
-                                       {\r
-                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                                       }\r
-                                       \r
-                                       sensor->status_cur = SENSOR_ON;\r
-                               }       \r
-                       }\r
-                       else\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_ON)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);              \r
-                                       goto error;\r
-                                       }\r
-                                       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {                               \r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                                       disable_irq_nosync(client->irq);//disable irq\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       cancel_delayed_work_sync(&sensor->delaywork);   \r
-                                       \r
-                                       sensor->status_cur = SENSOR_OFF;\r
-                               }\r
-                       }\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);\r
-                       break;\r
-               \r
-               default:\r
-                       break;\r
-       }\r
-       \r
-error:\r
-       return result;\r
-}\r
-\r
-\r
-static int proximity_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];\r
-       //struct i2c_client *client = sensor->client;   \r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-static int proximity_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];\r
-       //struct i2c_client *client = sensor->client;   \r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-#ifdef CONFIG_COMPAT
-static long proximity_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+
+
+static int gsensor_dev_release(struct inode *inode, struct file *file)
 {
-       long ret = 0;
-       void __user *arg64 = compat_ptr(arg);
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
+       //struct i2c_client *client = sensor->client;
 
-       if (!file->f_op || !file->f_op->unlocked_ioctl) {
-               pr_err("file->f_op or file->f_op->unlocked_ioctl is null\n");
-               return -ENOTTY;
-       }
+       int result = 0;
+
+
+       return result;
+}
+
+/* ioctl - I/O control */
+static long gsensor_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
+       struct i2c_client *client = sensor->client;
+       void __user *argp = (void __user *)arg;
+       struct sensor_axis axis = {0};
+       char rate;
+       int result = 0;
 
        switch (cmd) {
-       case COMPAT_PSENSOR_IOCTL_GET_ENABLED:
-               if (file->f_op->unlocked_ioctl)
-                       ret = file->f_op->unlocked_ioctl(file, PSENSOR_IOCTL_GET_ENABLED, (unsigned long)arg64);
-               break;
-       case COMPAT_PSENSOR_IOCTL_ENABLE:
-               if (file->f_op->unlocked_ioctl)
-                       ret = file->f_op->unlocked_ioctl(file, PSENSOR_IOCTL_ENABLE, (unsigned long)arg64);
+       case GSENSOR_IOCTL_APP_SET_RATE:
+               if (copy_from_user(&rate, argp, sizeof(rate)))
+               {
+                       result = -EFAULT;
+                       goto error;
+               }
                break;
        default:
                break;
        }
 
-       return ret;
-}
-#endif
-\r
-/* ioctl - I/O control */\r
-static long proximity_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];\r
-       struct i2c_client *client = sensor->client;     \r
-       unsigned int *argp = (unsigned int *)arg;       \r
-       int result = 0;\r
-       switch(cmd)\r
-       {\r
-               case PSENSOR_IOCTL_GET_ENABLED:\r
-                       *argp = sensor->status_cur;\r
-                       break;\r
-               case PSENSOR_IOCTL_ENABLE:              \r
-                       DBG("%s:PSENSOR_IOCTL_ENABLE start\n", __func__);\r
-                       mutex_lock(&sensor->operation_mutex);    \r
-                       if(*(unsigned int *)argp)\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_OFF)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);\r
-                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                                       goto error;           \r
-                                       }\r
-                                       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {\r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                                       enable_irq(client->irq);        //enable irq\r
-                                               }\r
-                                       }       \r
-                                       else\r
-                                       {\r
-                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                                       }\r
-                                       \r
-                                       sensor->status_cur = SENSOR_ON;\r
-                               }       \r
-                       }\r
-                       else\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_ON)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);              \r
-                                       goto error;\r
-                                       }\r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {                               \r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                                       disable_irq_nosync(client->irq);//disable irq\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       cancel_delayed_work_sync(&sensor->delaywork);           \r
-                                       sensor->status_cur = SENSOR_OFF;\r
-                               }\r
-                       }\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       DBG("%s:PSENSOR_IOCTL_ENABLE OK\n", __func__);\r
-                       break;\r
-               \r
-               default:\r
-                       break;\r
-       }\r
-       \r
-error:\r
-       return result;\r
-}\r
-\r
-static int temperature_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];\r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-static int temperature_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];\r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-/* ioctl - I/O control */\r
-static long temperature_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];\r
-       struct i2c_client *client = sensor->client;\r
-       unsigned int *argp = (unsigned int *)arg;       \r
-       int result = 0;\r
-\r
-       switch(cmd)\r
-       {\r
-               case TEMPERATURE_IOCTL_GET_ENABLED:\r
-                       *argp = sensor->status_cur;\r
-                       break;\r
-               case TEMPERATURE_IOCTL_ENABLE:          \r
-                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);\r
-                       mutex_lock(&sensor->operation_mutex);    \r
-                       if(*(unsigned int *)argp)\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_OFF)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);\r
-                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                                       goto error;           \r
-                                       }       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {\r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                                       enable_irq(client->irq);        //enable irq\r
-                                               }\r
-                                       }       \r
-                                       else\r
-                                       {\r
-                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                                       }\r
-                                       \r
-                                       sensor->status_cur = SENSOR_ON;\r
-                               }       \r
-                       }\r
-                       else\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_ON)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);              \r
-                                       goto error;\r
-                                       }\r
-                                       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {                               \r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                                       disable_irq_nosync(client->irq);//disable irq\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       cancel_delayed_work_sync(&sensor->delaywork);   \r
-                                       \r
-                                       sensor->status_cur = SENSOR_OFF;\r
-                               }\r
-                       }\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);\r
-                       break;\r
-               \r
-               default:\r
-                       break;\r
-       }\r
-       \r
-error:\r
-       return result;\r
-}\r
-\r
-\r
-static int pressure_dev_open(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];\r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-static int pressure_dev_release(struct inode *inode, struct file *file)\r
-{\r
-       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];\r
-       //struct i2c_client *client = sensor->client;\r
-\r
-       int result = 0;\r
-\r
-\r
-       return result;\r
-}\r
-\r
-\r
-/* ioctl - I/O control */\r
-static long pressure_dev_ioctl(struct file *file,\r
-                         unsigned int cmd, unsigned long arg)\r
-{\r
-       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];\r
-       struct i2c_client *client = sensor->client;\r
-       unsigned int *argp = (unsigned int *)arg;       \r
-       int result = 0;\r
-\r
-       switch(cmd)\r
-       {\r
-               case PRESSURE_IOCTL_GET_ENABLED:\r
-                       *argp = sensor->status_cur;\r
-                       break;\r
-               case PRESSURE_IOCTL_ENABLE:             \r
-                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);\r
-                       mutex_lock(&sensor->operation_mutex);    \r
-                       if(*(unsigned int *)argp)\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_OFF)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);\r
-                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);         \r
-                                       goto error;           \r
-                                       }       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {\r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);\r
-                                                       enable_irq(client->irq);        //enable irq\r
-                                               }\r
-                                       }       \r
-                                       else\r
-                                       {\r
-                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));\r
-                                       }\r
-                                       \r
-                                       sensor->status_cur = SENSOR_ON;\r
-                               }       \r
-                       }\r
-                       else\r
-                       {\r
-                               if(sensor->status_cur == SENSOR_ON)\r
-                               {\r
-                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {\r
-                                       mutex_unlock(&sensor->operation_mutex);              \r
-                                       goto error;\r
-                                       }\r
-                                       \r
-                                       if(sensor->pdata->irq_enable)\r
-                                       {                               \r
-                                               if(!(sensor->ops->trig & IRQF_SHARED))\r
-                                               {\r
-                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);\r
-                                                       disable_irq_nosync(client->irq);//disable irq\r
-                                               }\r
-                                       }\r
-                                       else\r
-                                       cancel_delayed_work_sync(&sensor->delaywork);   \r
-                                       \r
-                                       sensor->status_cur = SENSOR_OFF;\r
-                               }\r
-                       }\r
-                       mutex_unlock(&sensor->operation_mutex);\r
-                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);\r
-                       break;\r
-               \r
-               default:\r
-                       break;\r
-       }\r
-       \r
-error:\r
-       return result;\r
-}\r
-\r
-\r
-\r
-\r
-static int sensor_misc_device_register(struct sensor_private_data *sensor, int type)\r
-{\r
-       int result = 0;\r
-       \r
-       switch(type)\r
-       {\r
-               case SENSOR_TYPE_ANGLE:\r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = angle_dev_ioctl;\r
-                               sensor->fops.open = angle_dev_open;\r
-                               sensor->fops.release = angle_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "angle";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }\r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                               \r
-                       break;\r
-                       \r
-               case SENSOR_TYPE_ACCEL:\r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = gsensor_dev_ioctl;\r
-                #ifdef CONFIG_COMPAT\r
-                               sensor->fops.compat_ioctl = gsensor_dev_ioctl;\r
-                               #endif\r
-                               sensor->fops.open = gsensor_dev_open;\r
-                               sensor->fops.release = gsensor_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "mma8452_daemon";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }\r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                               \r
-                       break;\r
-\r
-               case SENSOR_TYPE_COMPASS:                       \r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = compass_dev_ioctl;\r
-#ifdef CONFIG_COMPAT
+       switch (cmd) {
+       case GSENSOR_IOCTL_START:
+               DBG("%s:GSENSOR_IOCTL_START start,status=%d\n", __func__,sensor->status_cur);
+               mutex_lock(&sensor->operation_mutex);
+               if(++sensor->start_count == 1)
+               {
+                       if(sensor->status_cur == SENSOR_OFF)
+                       {
+                               atomic_set(&(sensor->data_ready), 0);
+                               if ( (result = sensor->ops->active(client, 1, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                                       goto error;
+                               }
+                               if(sensor->pdata->irq_enable)
+                               {
+                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                       enable_irq(client->irq);        //enable irq
+                               }
+                               else
+                               {
+                                       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                               }
+                               sensor->status_cur = SENSOR_ON;
+                       }
+               }
+               mutex_unlock(&sensor->operation_mutex);
+               DBG("%s:GSENSOR_IOCTL_START OK\n", __func__);
+               break;
+
+       case GSENSOR_IOCTL_CLOSE:
+               DBG("%s:GSENSOR_IOCTL_CLOSE start,status=%d\n", __func__,sensor->status_cur);
+               mutex_lock(&sensor->operation_mutex);
+               if(--sensor->start_count == 0)
+               {
+                       if(sensor->status_cur == SENSOR_ON)
+                       {
+                               atomic_set(&(sensor->data_ready), 0);
+                               if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       goto error;
+                               }
+
+                               if(sensor->pdata->irq_enable)
+                               {
+                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                       disable_irq_nosync(client->irq);//disable irq
+                               }
+                               else
+                               cancel_delayed_work_sync(&sensor->delaywork);
+                               sensor->status_cur = SENSOR_OFF;
+                       }
+
+                       DBG("%s:GSENSOR_IOCTL_CLOSE OK\n", __func__);
+               }
+
+               mutex_unlock(&sensor->operation_mutex);
+               break;
+
+       case GSENSOR_IOCTL_APP_SET_RATE:
+               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE start\n", __func__);
+               mutex_lock(&sensor->operation_mutex);
+               result = sensor_reset_rate(client, rate);
+               if (result < 0){
+                       mutex_unlock(&sensor->operation_mutex);
+                       goto error;
+               }
+
+               sensor->status_cur = SENSOR_ON;
+               mutex_unlock(&sensor->operation_mutex);
+               DBG("%s:GSENSOR_IOCTL_APP_SET_RATE OK\n", __func__);
+               break;
+
+       case GSENSOR_IOCTL_GETDATA:
+               mutex_lock(&sensor->data_mutex);
+               memcpy(&axis, &sensor->axis, sizeof(sensor->axis));     //get data from buffer
+               mutex_unlock(&sensor->data_mutex);
+               break;
+       default:
+               result = -ENOTTY;
+       goto error;
+       }
+
+       switch (cmd) {
+       case GSENSOR_IOCTL_GETDATA:
+               if ( copy_to_user(argp, &axis, sizeof(axis) ) ) {
+                   printk("failed to copy sense data to user space.");
+                               result = -EFAULT;
+                               goto error;
+               }
+               DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);
+               break;
+       default:
+               break;
+       }
+
+error:
+       return result;
+}
+
+static ssize_t gsensor_set_orientation_online(struct class *class,
+               struct class_attribute *attr, const char *buf, size_t count)
+{
+       int i=0;
+       char orientation[20];
+       char *tmp;
+
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
+       struct sensor_platform_data *pdata = sensor->pdata;
+
+
+       char *p = strstr(buf,"gsensor_class");
+       int start = strcspn(p,"{");
+       int end = strcspn(p,"}");
+
+       strncpy(orientation,p+start,end-start+1);
+       tmp = orientation;
+
+
+       while(strncmp(tmp,"}",1)!=0)
+        {
+               if((strncmp(tmp,",",1)==0)||(strncmp(tmp,"{",1)==0))
+               {
+
+                        tmp++;
+                        continue;
+               }
+               else if(strncmp(tmp,"-",1)==0)
+               {
+                       pdata->orientation[i++]=-1;
+                       DBG("i=%d,data=%d\n",i,pdata->orientation[i]);
+                        tmp++;
+               }
+               else
+               {
+                       pdata->orientation[i++]=tmp[0]-48;
+                       DBG("----i=%d,data=%d\n",i,pdata->orientation[i]);
+               }
+               tmp++;
+
+
+        }
+
+       for(i=0;i<9;i++)
+               DBG("i=%d gsensor_info=%d\n",i,pdata->orientation[i]);
+       return 0;
+
+}
+
+static CLASS_ATTR(orientation, 0660, NULL, gsensor_set_orientation_online);
+
+static int  gsensor_class_init(void)
+{
+       int ret ;
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_ACCEL];
+       g_sensor_class[SENSOR_TYPE_ACCEL] = class_create(THIS_MODULE, "gsensor_class");
+       ret =  class_create_file(g_sensor_class[SENSOR_TYPE_ACCEL], &class_attr_orientation);
+       if (ret)
+       {
+               printk("%s:Fail to creat class\n",__func__);
+               return ret;
+       }
+       printk("%s:%s\n",__func__,sensor->i2c_id->name);
+       return 0;
+}
+
+
+
+static int compass_dev_open(struct inode *inode, struct file *file)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+       int flag = 0;
+       flag = atomic_read(&sensor->flags.open_flag);
+       if(!flag)
+       {
+               atomic_set(&sensor->flags.open_flag, 1);
+               wake_up(&sensor->flags.open_wq);
+       }
+
+       DBG("%s\n", __func__);
+       return result;
+}
+
+
+
+static int compass_dev_release(struct inode *inode, struct file *file)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];
+       //struct i2c_client *client = sensor->client;
+       //void __user *argp = (void __user *)arg;
+       int result = 0;
+       int flag = 0;
+       flag = atomic_read(&sensor->flags.open_flag);
+       if(flag)
+       {
+               atomic_set(&sensor->flags.open_flag, 0);
+               wake_up(&sensor->flags.open_wq);
+       }
+
+       DBG("%s\n", __func__);
+       return result;
+}
+
+#ifdef CONFIG_COMPAT
+/* ioctl - I/O control */
+static long compass_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       void __user *arg64 = compat_ptr(arg);
+       int result = 0;
+
+       if (!file->f_op || !file->f_op->unlocked_ioctl) {
+               pr_err("file->f_op or file->f_op->unlocked_ioctl is null\n");
+               return -ENOTTY;
+       }
+
+       switch (cmd) {
+       case COMPAT_ECS_IOCTL_APP_SET_MFLAG:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_MFLAG, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_GET_MFLAG:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_MFLAG, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_SET_AFLAG:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_AFLAG, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_GET_AFLAG:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_AFLAG, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_SET_MVFLAG:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_MVFLAG, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_GET_MVFLAG:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_MVFLAG, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_SET_DELAY:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_SET_DELAY, (unsigned long)arg64);
+               break;
+       case COMPAT_ECS_IOCTL_APP_GET_DELAY:
+               if (file->f_op->unlocked_ioctl)
+                       result = file->f_op->unlocked_ioctl(file, ECS_IOCTL_APP_GET_DELAY, (unsigned long)arg64);
+               break;
+       default:
+               break;
+       }
+
+       return result;
+}
+#endif
+
+
+/* ioctl - I/O control */
+static long compass_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_COMPASS];
+       //struct i2c_client *client = sensor->client;
+       void __user *argp = (void __user *)arg;
+       int result = 0;
+       short flag;
+
+       switch (cmd) {
+               case ECS_IOCTL_APP_SET_MFLAG:
+               case ECS_IOCTL_APP_SET_AFLAG:
+               case ECS_IOCTL_APP_SET_MVFLAG:
+                       if (copy_from_user(&flag, argp, sizeof(flag))) {
+                               return -EFAULT;
+                       }
+                       if (flag < 0 || flag > 1) {
+                               return -EINVAL;
+                       }
+                       break;
+               case ECS_IOCTL_APP_SET_DELAY:
+                       if (copy_from_user(&flag, argp, sizeof(flag))) {
+                               return -EFAULT;
+                       }
+                       break;
+               default:
+                       break;
+       }
+
+       switch (cmd) {
+               case ECS_IOCTL_APP_SET_MFLAG:
+                       atomic_set(&sensor->flags.m_flag, flag);
+                       DBG("%s:ECS_IOCTL_APP_SET_MFLAG,flag=%d\n", __func__,flag);
+                       break;
+               case ECS_IOCTL_APP_GET_MFLAG:
+                       flag = atomic_read(&sensor->flags.m_flag);
+                       DBG("%s:ECS_IOCTL_APP_GET_MFLAG,flag=%d\n", __func__,flag);
+                       break;
+               case ECS_IOCTL_APP_SET_AFLAG:
+                       atomic_set(&sensor->flags.a_flag, flag);
+                       DBG("%s:ECS_IOCTL_APP_SET_AFLAG,flag=%d\n", __func__,flag);
+                       break;
+               case ECS_IOCTL_APP_GET_AFLAG:
+                       flag = atomic_read(&sensor->flags.a_flag);
+                       DBG("%s:ECS_IOCTL_APP_GET_AFLAG,flag=%d\n", __func__,flag);
+                       break;
+               case ECS_IOCTL_APP_SET_MVFLAG:
+                       atomic_set(&sensor->flags.mv_flag, flag);
+                       DBG("%s:ECS_IOCTL_APP_SET_MVFLAG,flag=%d\n", __func__,flag);
+                       break;
+               case ECS_IOCTL_APP_GET_MVFLAG:
+                       flag = atomic_read(&sensor->flags.mv_flag);
+                       DBG("%s:ECS_IOCTL_APP_GET_MVFLAG,flag=%d\n", __func__,flag);
+                       break;
+               case ECS_IOCTL_APP_SET_DELAY:
+                       sensor->flags.delay = flag;
+                       break;
+               case ECS_IOCTL_APP_GET_DELAY:
+                       flag = sensor->flags.delay;
+                       break;
+               default:
+                       return -ENOTTY;
+       }
+
+       switch (cmd) {
+               case ECS_IOCTL_APP_GET_MFLAG:
+               case ECS_IOCTL_APP_GET_AFLAG:
+               case ECS_IOCTL_APP_GET_MVFLAG:
+               case ECS_IOCTL_APP_GET_DELAY:
+                       if (copy_to_user(argp, &flag, sizeof(flag))) {
+                               return -EFAULT;
+                       }
+                       break;
+               default:
+                       break;
+       }
+
+       return result;
+}
+
+static int gyro_dev_open(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+
+static int gyro_dev_release(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+
+/* ioctl - I/O control */
+static long gyro_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_GYROSCOPE];
+       struct i2c_client *client = sensor->client;
+       void __user *argp = (void __user *)arg;
+       int result = 0;
+       char rate;
+       switch (cmd) {
+       case L3G4200D_IOCTL_GET_ENABLE:
+               result = !sensor->status_cur;
+               if (copy_to_user(argp, &result, sizeof(result)))
+               {
+                       printk("%s:failed to copy status to user space.\n",__FUNCTION__);
+                       return -EFAULT;
+               }
+
+               DBG("%s :L3G4200D_IOCTL_GET_ENABLE,status=%d\n",__FUNCTION__,result);
+               break;
+       case L3G4200D_IOCTL_SET_ENABLE:
+               DBG("%s :L3G4200D_IOCTL_SET_ENABLE,flag=%d\n",__FUNCTION__,*(unsigned int *)argp);
+               mutex_lock(&sensor->operation_mutex);
+               if(*(unsigned int *)argp)
+               {
+                       if(sensor->status_cur == SENSOR_OFF)
+                       {
+                               if ( (result = sensor->ops->active(client, 1, ODR100_BW12_5) ) < 0 ) {
+                               mutex_unlock(&sensor->operation_mutex);
+                               printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                               goto error;
+                               }
+                               if(sensor->pdata->irq_enable)
+                               {
+                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                       enable_irq(client->irq);        //enable irq
+                               }
+                               else
+                               {
+                                       schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                               }
+                               sensor->status_cur = SENSOR_ON;
+                       }
+               }
+               else
+               {
+                       if(sensor->status_cur == SENSOR_ON)
+                       {
+                               if ( (result = sensor->ops->active(client, 0, 0) ) < 0 ) {
+                               mutex_unlock(&sensor->operation_mutex);
+                               goto error;
+                               }
+
+                               if(sensor->pdata->irq_enable)
+                               {
+                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                       disable_irq_nosync(client->irq);//disable irq
+                               }
+                               else
+                               cancel_delayed_work_sync(&sensor->delaywork);
+                               sensor->status_cur = SENSOR_OFF;
+                       }
+               }
+
+               result = sensor->status_cur;
+               if (copy_to_user(argp, &result, sizeof(result)))
+               {
+                       mutex_unlock(&sensor->operation_mutex);
+                       printk("%s:failed to copy sense data to user space.\n",__FUNCTION__);
+                       return -EFAULT;
+               }
+
+               mutex_unlock(&sensor->operation_mutex);
+               DBG("%s:L3G4200D_IOCTL_SET_ENABLE OK\n", __func__);
+               break;
+       case L3G4200D_IOCTL_SET_DELAY:
+               if (copy_from_user(&rate, argp, sizeof(rate)))
+               return -EFAULT;
+               mutex_lock(&sensor->operation_mutex);
+               if(sensor->status_cur == SENSOR_OFF)
+               {
+                       if ( (result = sensor->ops->active(client, 1, rate) ) < 0 ) {
+                       mutex_unlock(&sensor->operation_mutex);
+                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                       goto error;
+                       }
+
+                       if(sensor->pdata->irq_enable)
+                       {
+                               DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                               enable_irq(client->irq);        //enable irq
+                       }
+                       else
+                       {
+                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                       }
+                       sensor->status_cur = SENSOR_ON;
+               }
+
+               mutex_unlock(&sensor->operation_mutex);
+               DBG("%s :L3G4200D_IOCTL_SET_DELAY,rate=%d\n",__FUNCTION__,rate);
+               break;
+
+       default:
+               printk("%s:error,cmd=0x%x\n",__func__,cmd);
+               return -ENOTTY;
+       }
+
+       DBG("%s:line=%d,cmd=0x%x\n",__func__,__LINE__,cmd);
+
+error:
+       return result;
+}
+
+static int light_dev_open(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];
+       //struct i2c_client *client = sensor->client;
+       int result = 0;
+
+
+       return result;
+}
+
+
+
+
+static int light_dev_release(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];
+       //struct i2c_client *client = sensor->client;
+       int result = 0;
+
+
+       return result;
+}
+
+#ifdef CONFIG_COMPAT
+static long light_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       long ret = 0;
+       void __user *arg64 = compat_ptr(arg);
+
+       if (!file->f_op || !file->f_op->unlocked_ioctl) {
+               pr_err("[DEBUG] file->f_op or file->f_op->unlocked_ioctl is null\n");
+               return -ENOTTY;
+       }
+
+       switch (cmd) {
+       case COMPAT_LIGHTSENSOR_IOCTL_GET_ENABLED:
+               if (file->f_op->unlocked_ioctl)
+                       ret = file->f_op->unlocked_ioctl(file, LIGHTSENSOR_IOCTL_GET_ENABLED, (unsigned long)arg64);
+               break;
+       case COMPAT_LIGHTSENSOR_IOCTL_ENABLE:
+               if (file->f_op->unlocked_ioctl)
+                       ret = file->f_op->unlocked_ioctl(file, LIGHTSENSOR_IOCTL_ENABLE, (unsigned long)arg64);
+               break;
+       default:
+               break;
+       }
+
+       return ret;
+}
+#endif
+
+/* ioctl - I/O control */
+static long light_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_LIGHT];
+       struct i2c_client *client = sensor->client;
+       unsigned int *argp = (unsigned int *)arg;
+       int result = 0;
+
+       switch(cmd)
+       {
+               case LIGHTSENSOR_IOCTL_GET_ENABLED:
+                       *argp = sensor->status_cur;
+                       break;
+               case LIGHTSENSOR_IOCTL_ENABLE:
+                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);
+                       mutex_lock(&sensor->operation_mutex);
+                       if(*(unsigned int *)argp)
+                       {
+                               if(sensor->status_cur == SENSOR_OFF)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                                       goto error;
+                                       }
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                                       enable_irq(client->irq);        //enable irq
+                                               }
+                                       }
+                                       else
+                                       {
+                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                                       }
+
+                                       sensor->status_cur = SENSOR_ON;
+                               }
+                       }
+                       else
+                       {
+                               if(sensor->status_cur == SENSOR_ON)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       goto error;
+                                       }
+
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                                       disable_irq_nosync(client->irq);//disable irq
+                                               }
+                                       }
+                                       else
+                                       cancel_delayed_work_sync(&sensor->delaywork);
+
+                                       sensor->status_cur = SENSOR_OFF;
+                               }
+                       }
+                       mutex_unlock(&sensor->operation_mutex);
+                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);
+                       break;
+
+               default:
+                       break;
+       }
+
+error:
+       return result;
+}
+
+
+static int proximity_dev_open(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];
+       //struct i2c_client *client = sensor->client;
+       int result = 0;
+
+
+       return result;
+}
+
+
+static int proximity_dev_release(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];
+       //struct i2c_client *client = sensor->client;
+       int result = 0;
+
+
+       return result;
+}
+
+#ifdef CONFIG_COMPAT
+static long proximity_dev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+{
+       long ret = 0;
+       void __user *arg64 = compat_ptr(arg);
+
+       if (!file->f_op || !file->f_op->unlocked_ioctl) {
+               pr_err("file->f_op or file->f_op->unlocked_ioctl is null\n");
+               return -ENOTTY;
+       }
+
+       switch (cmd) {
+       case COMPAT_PSENSOR_IOCTL_GET_ENABLED:
+               if (file->f_op->unlocked_ioctl)
+                       ret = file->f_op->unlocked_ioctl(file, PSENSOR_IOCTL_GET_ENABLED, (unsigned long)arg64);
+               break;
+       case COMPAT_PSENSOR_IOCTL_ENABLE:
+               if (file->f_op->unlocked_ioctl)
+                       ret = file->f_op->unlocked_ioctl(file, PSENSOR_IOCTL_ENABLE, (unsigned long)arg64);
+               break;
+       default:
+               break;
+       }
+
+       return ret;
+}
+#endif
+
+/* ioctl - I/O control */
+static long proximity_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PROXIMITY];
+       struct i2c_client *client = sensor->client;
+       unsigned int *argp = (unsigned int *)arg;
+       int result = 0;
+       switch(cmd)
+       {
+               case PSENSOR_IOCTL_GET_ENABLED:
+                       *argp = sensor->status_cur;
+                       break;
+               case PSENSOR_IOCTL_ENABLE:
+                       DBG("%s:PSENSOR_IOCTL_ENABLE start\n", __func__);
+                       mutex_lock(&sensor->operation_mutex);
+                       if(*(unsigned int *)argp)
+                       {
+                               if(sensor->status_cur == SENSOR_OFF)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                                       goto error;
+                                       }
+
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                                       enable_irq(client->irq);        //enable irq
+                                               }
+                                       }
+                                       else
+                                       {
+                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                                       }
+
+                                       sensor->status_cur = SENSOR_ON;
+                               }
+                       }
+                       else
+                       {
+                               if(sensor->status_cur == SENSOR_ON)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       goto error;
+                                       }
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                                       disable_irq_nosync(client->irq);//disable irq
+                                               }
+                                       }
+                                       else
+                                       cancel_delayed_work_sync(&sensor->delaywork);
+                                       sensor->status_cur = SENSOR_OFF;
+                               }
+                       }
+                       mutex_unlock(&sensor->operation_mutex);
+                       DBG("%s:PSENSOR_IOCTL_ENABLE OK\n", __func__);
+                       break;
+
+               default:
+                       break;
+       }
+
+error:
+       return result;
+}
+
+static int temperature_dev_open(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+
+static int temperature_dev_release(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+
+/* ioctl - I/O control */
+static long temperature_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_TEMPERATURE];
+       struct i2c_client *client = sensor->client;
+       unsigned int *argp = (unsigned int *)arg;
+       int result = 0;
+
+       switch(cmd)
+       {
+               case TEMPERATURE_IOCTL_GET_ENABLED:
+                       *argp = sensor->status_cur;
+                       break;
+               case TEMPERATURE_IOCTL_ENABLE:
+                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);
+                       mutex_lock(&sensor->operation_mutex);
+                       if(*(unsigned int *)argp)
+                       {
+                               if(sensor->status_cur == SENSOR_OFF)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                                       goto error;
+                                       }
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                                       enable_irq(client->irq);        //enable irq
+                                               }
+                                       }
+                                       else
+                                       {
+                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                                       }
+
+                                       sensor->status_cur = SENSOR_ON;
+                               }
+                       }
+                       else
+                       {
+                               if(sensor->status_cur == SENSOR_ON)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       goto error;
+                                       }
+
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                                       disable_irq_nosync(client->irq);//disable irq
+                                               }
+                                       }
+                                       else
+                                       cancel_delayed_work_sync(&sensor->delaywork);
+
+                                       sensor->status_cur = SENSOR_OFF;
+                               }
+                       }
+                       mutex_unlock(&sensor->operation_mutex);
+                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);
+                       break;
+
+               default:
+                       break;
+       }
+
+error:
+       return result;
+}
+
+
+static int pressure_dev_open(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+
+static int pressure_dev_release(struct inode *inode, struct file *file)
+{
+       //struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];
+       //struct i2c_client *client = sensor->client;
+
+       int result = 0;
+
+
+       return result;
+}
+
+
+/* ioctl - I/O control */
+static long pressure_dev_ioctl(struct file *file,
+                         unsigned int cmd, unsigned long arg)
+{
+       struct sensor_private_data *sensor = g_sensor[SENSOR_TYPE_PRESSURE];
+       struct i2c_client *client = sensor->client;
+       unsigned int *argp = (unsigned int *)arg;
+       int result = 0;
+
+       switch(cmd)
+       {
+               case PRESSURE_IOCTL_GET_ENABLED:
+                       *argp = sensor->status_cur;
+                       break;
+               case PRESSURE_IOCTL_ENABLE:
+                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);
+                       mutex_lock(&sensor->operation_mutex);
+                       if(*(unsigned int *)argp)
+                       {
+                               if(sensor->status_cur == SENSOR_OFF)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_ON, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       printk("%s:fail to active sensor,ret=%d\n",__func__,result);
+                                       goto error;
+                                       }
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:enable irq,irq=%d\n",__func__,client->irq);
+                                                       enable_irq(client->irq);        //enable irq
+                                               }
+                                       }
+                                       else
+                                       {
+                                               schedule_delayed_work(&sensor->delaywork, msecs_to_jiffies(sensor->pdata->poll_delay_ms));
+                                       }
+
+                                       sensor->status_cur = SENSOR_ON;
+                               }
+                       }
+                       else
+                       {
+                               if(sensor->status_cur == SENSOR_ON)
+                               {
+                                       if ( (result = sensor->ops->active(client, SENSOR_OFF, 0) ) < 0 ) {
+                                       mutex_unlock(&sensor->operation_mutex);
+                                       goto error;
+                                       }
+
+                                       if(sensor->pdata->irq_enable)
+                                       {
+                                               if(!(sensor->ops->trig & IRQF_SHARED))
+                                               {
+                                                       DBG("%s:disable irq,irq=%d\n",__func__,client->irq);
+                                                       disable_irq_nosync(client->irq);//disable irq
+                                               }
+                                       }
+                                       else
+                                       cancel_delayed_work_sync(&sensor->delaywork);
+
+                                       sensor->status_cur = SENSOR_OFF;
+                               }
+                       }
+                       mutex_unlock(&sensor->operation_mutex);
+                       DBG("%s:LIGHTSENSOR_IOCTL_ENABLE OK\n", __func__);
+                       break;
+
+               default:
+                       break;
+       }
+
+error:
+       return result;
+}
+
+
+
+
+static int sensor_misc_device_register(struct sensor_private_data *sensor, int type)
+{
+       int result = 0;
+
+       switch(type)
+       {
+               case SENSOR_TYPE_ANGLE:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = angle_dev_ioctl;
+                               sensor->fops.open = angle_dev_open;
+                               sensor->fops.release = angle_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "angle";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+
+                       break;
+
+               case SENSOR_TYPE_ACCEL:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = gsensor_dev_ioctl;
+                #ifdef CONFIG_COMPAT
+                               sensor->fops.compat_ioctl = gsensor_dev_ioctl;
+                               #endif
+                               sensor->fops.open = gsensor_dev_open;
+                               sensor->fops.release = gsensor_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "mma8452_daemon";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+
+                       break;
+
+               case SENSOR_TYPE_COMPASS:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = compass_dev_ioctl;
+#ifdef CONFIG_COMPAT
                                sensor->fops.compat_ioctl = compass_dev_compat_ioctl;
 #endif
-                               sensor->fops.open = compass_dev_open;\r
-                               sensor->fops.release = compass_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "compass";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }\r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-\r
-                       break;\r
-\r
-               case SENSOR_TYPE_GYROSCOPE:                     \r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = gyro_dev_ioctl;\r
-                               sensor->fops.open = gyro_dev_open;\r
-                               sensor->fops.release = gyro_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "gyrosensor";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }\r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                       \r
-                       break;\r
-\r
-               case SENSOR_TYPE_LIGHT:\r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = light_dev_ioctl;\r
+                               sensor->fops.open = compass_dev_open;
+                               sensor->fops.release = compass_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "compass";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+
+                       break;
+
+               case SENSOR_TYPE_GYROSCOPE:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = gyro_dev_ioctl;
+                               sensor->fops.open = gyro_dev_open;
+                               sensor->fops.release = gyro_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "gyrosensor";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+
+                       break;
+
+               case SENSOR_TYPE_LIGHT:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = light_dev_ioctl;
 #ifdef CONFIG_COMPAT
                                sensor->fops.compat_ioctl = light_dev_compat_ioctl;
 #endif
-                               sensor->fops.open = light_dev_open;\r
-                               sensor->fops.release = light_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "lightsensor";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }       \r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                       break;\r
-               \r
-               case SENSOR_TYPE_PROXIMITY:\r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = proximity_dev_ioctl;\r
+                               sensor->fops.open = light_dev_open;
+                               sensor->fops.release = light_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "lightsensor";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+                       break;
+
+               case SENSOR_TYPE_PROXIMITY:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = proximity_dev_ioctl;
 #ifdef CONFIG_COMPAT
                                sensor->fops.compat_ioctl = proximity_dev_compat_ioctl;
 #endif
-                               sensor->fops.open = proximity_dev_open;\r
-                               sensor->fops.release = proximity_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "psensor";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }       \r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                       break;\r
-\r
-               case SENSOR_TYPE_TEMPERATURE:\r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = temperature_dev_ioctl;\r
-                               sensor->fops.open = temperature_dev_open;\r
-                               sensor->fops.release = temperature_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "temperature";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }       \r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                               \r
-                       break;\r
-\r
-               case SENSOR_TYPE_PRESSURE:\r
-                       if(!sensor->ops->misc_dev)\r
-                       {\r
-                               sensor->fops.owner = THIS_MODULE;\r
-                               sensor->fops.unlocked_ioctl = pressure_dev_ioctl;\r
-                               sensor->fops.open = pressure_dev_open;\r
-                               sensor->fops.release = pressure_dev_release;\r
-\r
-                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;\r
-                               sensor->miscdev.name = "pressure";\r
-                               sensor->miscdev.fops = &sensor->fops;\r
-                       }       \r
-                       else\r
-                       {\r
-                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));\r
-\r
-                       }\r
-                               \r
-                       break;\r
-\r
-               default:\r
-                       printk("%s:unknow sensor type=%d\n",__func__,type);\r
-                       result = -1;\r
-                       goto error;\r
-       }\r
-                       \r
-       sensor->miscdev.parent = &sensor->client->dev;\r
-       result = misc_register(&sensor->miscdev);\r
-       if (result < 0) {\r
-               dev_err(&sensor->client->dev,\r
-                       "fail to register misc device %s\n", sensor->miscdev.name);\r
-               goto error;\r
-       }\r
-       \r
-       printk("%s:miscdevice: %s\n",__func__,sensor->miscdev.name);\r
-\r
-error: \r
-       \r
-       return result;\r
-\r
-}\r
-\r
-int sensor_register_slave(int type,struct i2c_client *client,\r
-                       struct sensor_platform_data *slave_pdata,\r
-                       struct sensor_operate *(*get_sensor_ops)(void))\r
-{\r
-       int result = 0;\r
-       struct sensor_operate *ops = get_sensor_ops();\r
-       if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))\r
-       {       \r
-               printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);\r
-               return -1;      \r
-       }\r
-       sensor_ops[ops->id_i2c] = ops;\r
-       printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);\r
-       return result;\r
-}\r
-\r
-\r
-int sensor_unregister_slave(int type,struct i2c_client *client,\r
-                       struct sensor_platform_data *slave_pdata,\r
-                       struct sensor_operate *(*get_sensor_ops)(void))\r
-{\r
-       int result = 0;\r
-       struct sensor_operate *ops = get_sensor_ops();\r
-       if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))\r
-       {       \r
-               printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);\r
-               return -1;      \r
-       }\r
-       printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);\r
-       sensor_ops[ops->id_i2c] = NULL; \r
-       return result;\r
-}\r
-\r
-\r
-int sensor_probe(struct i2c_client *client, const struct i2c_device_id *devid)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);\r
-       struct sensor_platform_data *pdata;\r
-       struct device_node *np = client->dev.of_node;\r
-       enum of_gpio_flags rst_flags, pwr_flags;\r
-       unsigned long irq_flags;\r
-       int result = 0;\r
-       int type = 0;\r
-       \r
-       dev_info(&client->adapter->dev, "%s: %s,%p\n", __func__, devid->name, client);\r
-\r
-       if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {\r
-               result = -ENODEV;\r
-               goto out_no_free;\r
-       }\r
-       if (!np) {\r
-               dev_err(&client->dev, "no device tree\n");\r
-               return -EINVAL;\r
-       }\r
-    pdata = devm_kzalloc(&client->dev,sizeof(*pdata), GFP_KERNEL);\r
-       if (!pdata) {\r
-               result = -ENOMEM;\r
-               goto out_no_free;\r
-       }\r
-       sensor = devm_kzalloc(&client->dev,sizeof(*sensor), GFP_KERNEL);\r
-       if (!sensor) {\r
-               result = -ENOMEM;\r
-               goto out_no_free;\r
-       }\r
-       \r
-       of_property_read_u32(np,"type",&(pdata->type));\r
-\r
-       pdata->irq_pin = of_get_named_gpio_flags(np, "irq-gpio", 0,(enum of_gpio_flags *)&irq_flags);\r
-       pdata->reset_pin = of_get_named_gpio_flags(np, "reset-gpio",0,&rst_flags);\r
-       pdata->power_pin = of_get_named_gpio_flags(np, "power-gpio",0,&pwr_flags);\r
-       \r
-       of_property_read_u32(np,"irq_enable",&(pdata->irq_enable));\r
-       of_property_read_u32(np,"poll_delay_ms",&(pdata->poll_delay_ms));\r
-\r
-       of_property_read_u32(np,"x_min",&(pdata->x_min));\r
-       of_property_read_u32(np,"y_min",&(pdata->y_min));\r
-       of_property_read_u32(np,"z_min",&(pdata->z_min));\r
-       of_property_read_u32(np,"factory",&(pdata->factory));\r
-       of_property_read_u32(np,"layout",&(pdata->layout));\r
-\r
-       of_property_read_u8(np,"address",&(pdata->address));\r
-       of_get_property(np, "project_name", pdata->project_name);\r
+                               sensor->fops.open = proximity_dev_open;
+                               sensor->fops.release = proximity_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "psensor";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+                       break;
+
+               case SENSOR_TYPE_TEMPERATURE:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = temperature_dev_ioctl;
+                               sensor->fops.open = temperature_dev_open;
+                               sensor->fops.release = temperature_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "temperature";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+
+                       break;
+
+               case SENSOR_TYPE_PRESSURE:
+                       if(!sensor->ops->misc_dev)
+                       {
+                               sensor->fops.owner = THIS_MODULE;
+                               sensor->fops.unlocked_ioctl = pressure_dev_ioctl;
+                               sensor->fops.open = pressure_dev_open;
+                               sensor->fops.release = pressure_dev_release;
+
+                               sensor->miscdev.minor = MISC_DYNAMIC_MINOR;
+                               sensor->miscdev.name = "pressure";
+                               sensor->miscdev.fops = &sensor->fops;
+                       }
+                       else
+                       {
+                               memcpy(&sensor->miscdev, sensor->ops->misc_dev, sizeof(*sensor->ops->misc_dev));
+
+                       }
+
+                       break;
+
+               default:
+                       printk("%s:unknow sensor type=%d\n",__func__,type);
+                       result = -1;
+                       goto error;
+       }
+
+       sensor->miscdev.parent = &sensor->client->dev;
+       result = misc_register(&sensor->miscdev);
+       if (result < 0) {
+               dev_err(&sensor->client->dev,
+                       "fail to register misc device %s\n", sensor->miscdev.name);
+               goto error;
+       }
+
+       printk("%s:miscdevice: %s\n",__func__,sensor->miscdev.name);
+
+error:
+
+       return result;
+
+}
+
+int sensor_register_slave(int type,struct i2c_client *client,
+                       struct sensor_platform_data *slave_pdata,
+                       struct sensor_operate *(*get_sensor_ops)(void))
+{
+       int result = 0;
+       struct sensor_operate *ops = get_sensor_ops();
+       if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))
+       {
+               printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);
+               return -1;
+       }
+       sensor_ops[ops->id_i2c] = ops;
+       printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);
+       return result;
+}
+
+
+int sensor_unregister_slave(int type,struct i2c_client *client,
+                       struct sensor_platform_data *slave_pdata,
+                       struct sensor_operate *(*get_sensor_ops)(void))
+{
+       int result = 0;
+       struct sensor_operate *ops = get_sensor_ops();
+       if((ops->id_i2c >= SENSOR_NUM_ID) || (ops->id_i2c <= ID_INVALID))
+       {
+               printk("%s:%s id is error %d\n", __func__, ops->name, ops->id_i2c);
+               return -1;
+       }
+       printk("%s:%s,id=%d\n",__func__,sensor_ops[ops->id_i2c]->name, ops->id_i2c);
+       sensor_ops[ops->id_i2c] = NULL;
+       return result;
+}
+
+
+int sensor_probe(struct i2c_client *client, const struct i2c_device_id *devid)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       struct sensor_platform_data *pdata;
+       struct device_node *np = client->dev.of_node;
+       enum of_gpio_flags rst_flags, pwr_flags;
+       unsigned long irq_flags;
+       int result = 0;
+       int type = 0;
+
+       dev_info(&client->adapter->dev, "%s: %s,%p\n", __func__, devid->name, client);
+
+       if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+               result = -ENODEV;
+               goto out_no_free;
+       }
+       if (!np) {
+               dev_err(&client->dev, "no device tree\n");
+               return -EINVAL;
+       }
+    pdata = devm_kzalloc(&client->dev,sizeof(*pdata), GFP_KERNEL);
+       if (!pdata) {
+               result = -ENOMEM;
+               goto out_no_free;
+       }
+       sensor = devm_kzalloc(&client->dev,sizeof(*sensor), GFP_KERNEL);
+       if (!sensor) {
+               result = -ENOMEM;
+               goto out_no_free;
+       }
+
+       of_property_read_u32(np,"type",&(pdata->type));
+
+       pdata->irq_pin = of_get_named_gpio_flags(np, "irq-gpio", 0,(enum of_gpio_flags *)&irq_flags);
+       pdata->reset_pin = of_get_named_gpio_flags(np, "reset-gpio",0,&rst_flags);
+       pdata->power_pin = of_get_named_gpio_flags(np, "power-gpio",0,&pwr_flags);
+
+       of_property_read_u32(np,"irq_enable",&(pdata->irq_enable));
+       of_property_read_u32(np,"poll_delay_ms",&(pdata->poll_delay_ms));
+
+       of_property_read_u32(np,"x_min",&(pdata->x_min));
+       of_property_read_u32(np,"y_min",&(pdata->y_min));
+       of_property_read_u32(np,"z_min",&(pdata->z_min));
+       of_property_read_u32(np,"factory",&(pdata->factory));
+       of_property_read_u32(np,"layout",&(pdata->layout));
+
+       of_property_read_u8(np,"address",&(pdata->address));
+       of_get_property(np, "project_name", pdata->project_name);
 
        of_property_read_u32(np, "power-off-in-suspend",
                             &pdata->power_off_in_suspend);
-\r
-       switch(pdata->layout)\r
-       {\r
-               case 1:\r
-                       pdata->orientation[0] = 1;\r
-                       pdata->orientation[1] = 0;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 0;\r
-                       pdata->orientation[4] = 1;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = 1;\r
-                       break;\r
-\r
-               case 2:\r
-                       pdata->orientation[0] = 0;\r
-                       pdata->orientation[1] = -1;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 1;\r
-                       pdata->orientation[4] = 0;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = 1;\r
-                       break;\r
-\r
-               case 3:\r
-                       pdata->orientation[0] = -1;\r
-                       pdata->orientation[1] = 0;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 0;\r
-                       pdata->orientation[4] = -1;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = 1;\r
-                       break;\r
-\r
-               case 4:\r
-                       pdata->orientation[0] = 0;\r
-                       pdata->orientation[1] = 1;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = -1;\r
-                       pdata->orientation[4] = 0;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = 1;\r
-                       break;\r
-\r
-               case 5:\r
-                       pdata->orientation[0] = 1;\r
-                       pdata->orientation[1] = 0;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 0;\r
-                       pdata->orientation[4] = -1;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = -1;\r
-                       break;\r
-\r
-               case 6:\r
-                       pdata->orientation[0] = 0;\r
-                       pdata->orientation[1] = -1;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = -1;\r
-                       pdata->orientation[4] = 0;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = -1;\r
-                       break;\r
-\r
-               case 7:\r
-                       pdata->orientation[0] = -1;\r
-                       pdata->orientation[1] = 0;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 0;\r
-                       pdata->orientation[4] = 1;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = -1;\r
-                       break;\r
-\r
-               case 8:\r
-                       pdata->orientation[0] = 0;\r
-                       pdata->orientation[1] = 1;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 1;\r
-                       pdata->orientation[4] = 0;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = -1;\r
-                       break;\r
-\r
-               default:\r
-                       pdata->orientation[0] = 1;\r
-                       pdata->orientation[1] = 0;\r
-                       pdata->orientation[2] = 0;\r
-\r
-                       pdata->orientation[3] = 0;\r
-                       pdata->orientation[4] = 1;\r
-                       pdata->orientation[5] = 0;\r
-\r
-                       pdata->orientation[6] = 0;\r
-                       pdata->orientation[7] = 0;\r
-                       pdata->orientation[8] = 1;\r
-                       break;\r
-       }\r
-\r
-       client->irq = pdata->irq_pin;\r
-       type = pdata->type;\r
-       pdata->irq_flags = irq_flags;\r
-       DBG("irq_flags = %lu  padta->irq_flags = %lu\n",irq_flags, pdata->irq_flags);\r
-       DBG("type = %d \n",pdata->type);\r
-       DBG("irq = %d \n",pdata->irq);\r
-       DBG("irq_pin = %d \n",pdata->irq_pin);\r
-       DBG("pwer_pin = %d \n",pdata->power_pin);       \r
-       DBG("reset_pin = %d \n",pdata->reset_pin);\r
-       DBG("irq_enable = %d \n",pdata->irq_enable);\r
-\r
-       DBG("poll_delay_ms = %d \n",pdata->poll_delay_ms);\r
-       DBG("x_min = %d \n",pdata->x_min);\r
-       DBG("y_min = %d \n",pdata->y_min);\r
-       DBG("z_min = %d \n",pdata->z_min);      \r
-       DBG("factory = %d \n",pdata->factory);\r
-       DBG("layout = %d \n",pdata->layout);\r
-       DBG("address = 0x%x \n",pdata->address);\r
-       DBG("project_name = [%s] \n",pdata->project_name);\r
-       \r
-       DBG(" == %d,%d ,%d \t ,%d ,%d ,%d , \t ,%d, %d, %d ,==%d\n",pdata->orientation[0],pdata->orientation[1],pdata->orientation[2]\r
-                               ,pdata->orientation[3],pdata->orientation[4],pdata->orientation[5]\r
-                               ,pdata->orientation[6],pdata->orientation[7],pdata->orientation[8],ARRAY_SIZE(pdata->orientation));\r
-               \r
-       \r
-       if((type >= SENSOR_NUM_TYPES) || (type <= SENSOR_TYPE_NULL))\r
-       {       \r
-               dev_err(&client->adapter->dev, "sensor type is error %d\n", type);\r
-               result = -EFAULT;\r
-               goto out_no_free;       \r
-       }\r
-       if(((int)devid->driver_data >= SENSOR_NUM_ID) || ((int)devid->driver_data <= ID_INVALID))\r
-       {       \r
-               dev_err(&client->adapter->dev, "sensor id is error %d\n", (int)devid->driver_data);\r
-               result = -EFAULT;\r
-               goto out_no_free;       \r
-       }\r
-       i2c_set_clientdata(client, sensor);\r
-       sensor->client = client;        \r
-       sensor->pdata = pdata;  \r
-       sensor->type = type;\r
-       sensor->i2c_id = (struct i2c_device_id *)devid;\r
-\r
-               \r
-       memset(&(sensor->axis), 0, sizeof(struct sensor_axis) );\r
-       atomic_set(&(sensor->data_ready), 0);\r
-       init_waitqueue_head(&(sensor->data_ready_wq));\r
-       mutex_init(&sensor->data_mutex);        \r
-       mutex_init(&sensor->operation_mutex);   \r
-       mutex_init(&sensor->sensor_mutex);\r
-       mutex_init(&sensor->i2c_mutex);\r
-\r
-       /* As default, report all information */\r
-       atomic_set(&sensor->flags.m_flag, 1);\r
-       atomic_set(&sensor->flags.a_flag, 1);\r
-       atomic_set(&sensor->flags.mv_flag, 1);                  \r
-       atomic_set(&sensor->flags.open_flag, 0);\r
-       atomic_set(&sensor->flags.debug_flag, 1);\r
-       init_waitqueue_head(&sensor->flags.open_wq);\r
-       sensor->flags.delay = 100;\r
-\r
-       sensor->status_cur = SENSOR_OFF;\r
-       sensor->axis.x = 0;\r
-       sensor->axis.y = 0;\r
-       sensor->axis.z = 0;\r
-       \r
-       result = sensor_chip_init(sensor->client);\r
-       if(result < 0)\r
-               goto out_free_memory;\r
-       \r
-       sensor->input_dev = devm_input_allocate_device(&client->dev);\r
-       if (!sensor->input_dev) {\r
-               result = -ENOMEM;\r
-               dev_err(&client->dev,\r
-                       "Failed to allocate input device\n");\r
-               goto out_free_memory;\r
-       }       \r
-\r
-       switch(type)\r
-       {\r
-               case SENSOR_TYPE_ANGLE: \r
-                       sensor->input_dev->name = "angle";\r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);\r
-                       /* x-axis acceleration */\r
-                       input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
-                       /* y-axis acceleration */\r
-                       input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
-                       /* z-axis acceleration */\r
-                       input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
-                       break;  \r
-\r
-               case SENSOR_TYPE_ACCEL: \r
-                       sensor->input_dev->name = "gsensor";\r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);\r
-                       /* x-axis acceleration */\r
-                       input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
-                       /* y-axis acceleration */\r
-                       input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
-                       /* z-axis acceleration */\r
-                       input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range\r
-                       break;          \r
-               case SENSOR_TYPE_COMPASS:       \r
-                       sensor->input_dev->name = "compass";            \r
-                       /* Setup input device */\r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);\r
-                       /* yaw (0, 360) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_RX, 0, 23040, 0, 0);\r
-                       /* pitch (-180, 180) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_RY, -11520, 11520, 0, 0);\r
-                       /* roll (-90, 90) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_RZ, -5760, 5760, 0, 0);\r
-                       /* x-axis acceleration (720 x 8G) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_X, -5760, 5760, 0, 0);\r
-                       /* y-axis acceleration (720 x 8G) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_Y, -5760, 5760, 0, 0);\r
-                       /* z-axis acceleration (720 x 8G) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_Z, -5760, 5760, 0, 0);\r
-                       /* status of magnetic sensor */\r
-                       input_set_abs_params(sensor->input_dev, ABS_RUDDER, -32768, 3, 0, 0);\r
-                       /* status of acceleration sensor */\r
-                       input_set_abs_params(sensor->input_dev, ABS_WHEEL, -32768, 3, 0, 0);\r
-                       /* x-axis of raw magnetic vector (-4096, 4095) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_HAT0X, -20480, 20479, 0, 0);\r
-                       /* y-axis of raw magnetic vector (-4096, 4095) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_HAT0Y, -20480, 20479, 0, 0);\r
-                       /* z-axis of raw magnetic vector (-4096, 4095) */\r
-                       input_set_abs_params(sensor->input_dev, ABS_BRAKE, -20480, 20479, 0, 0);\r
-                       break;          \r
-               case SENSOR_TYPE_GYROSCOPE:\r
-                       sensor->input_dev->name = "gyro";\r
-                       /* x-axis acceleration */\r
-                       input_set_capability(sensor->input_dev, EV_REL, REL_RX);\r
-                       input_set_abs_params(sensor->input_dev, ABS_RX, sensor->ops->range[0], sensor->ops->range[1], 0, 0); \r
-                       /* y-axis acceleration */       \r
-                       input_set_capability(sensor->input_dev, EV_REL, REL_RY);\r
-                       input_set_abs_params(sensor->input_dev, ABS_RY, sensor->ops->range[0], sensor->ops->range[1], 0, 0); \r
-                       /* z-axis acceleration */\r
-                       input_set_capability(sensor->input_dev, EV_REL, REL_RZ);\r
-                       input_set_abs_params(sensor->input_dev, ABS_RZ, sensor->ops->range[0], sensor->ops->range[1], 0, 0); \r
-                       break;\r
-               case SENSOR_TYPE_LIGHT:\r
-                       sensor->input_dev->name = "lightsensor-level";\r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);\r
-                       input_set_abs_params(sensor->input_dev, ABS_MISC, sensor->ops->range[0], sensor->ops->range[1], 0, 0);                  \r
-                       input_set_abs_params(sensor->input_dev, ABS_TOOL_WIDTH ,  sensor->ops->brightness[0],sensor->ops->brightness[1], 0, 0);\r
-                       break;\r
-               case SENSOR_TYPE_PROXIMITY:\r
-                       sensor->input_dev->name = "proximity";  \r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);\r
-                       input_set_abs_params(sensor->input_dev, ABS_DISTANCE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);\r
-                       break;\r
-               case SENSOR_TYPE_TEMPERATURE:                           \r
-                       sensor->input_dev->name = "temperature";\r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);              \r
-                       input_set_abs_params(sensor->input_dev, ABS_THROTTLE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);\r
-                       break;\r
-               case SENSOR_TYPE_PRESSURE:                              \r
-                       sensor->input_dev->name = "pressure";\r
-                       set_bit(EV_ABS, sensor->input_dev->evbit);              \r
-                       input_set_abs_params(sensor->input_dev, ABS_PRESSURE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);\r
-                       break;\r
-               default:\r
-                       printk("%s:unknow sensor type=%d\n",__func__,type);\r
-                       break;\r
-\r
-       }\r
-       sensor->input_dev->dev.parent = &client->dev;\r
-\r
-       result = input_register_device(sensor->input_dev);\r
-       if (result) {\r
-               dev_err(&client->dev,\r
-                       "Unable to register input device %s\n", sensor->input_dev->name);\r
-               goto out_input_register_device_failed;\r
-       }\r
-\r
-       result = sensor_irq_init(sensor->client);\r
-       if (result) {\r
-               dev_err(&client->dev,\r
-                       "fail to init sensor irq,ret=%d\n",result);\r
-               goto out_input_register_device_failed;\r
-       }\r
-\r
-       \r
-       sensor->miscdev.parent = &client->dev;\r
-       result = sensor_misc_device_register(sensor, type);\r
-       if (result) {\r
-               dev_err(&client->dev,\r
-                       "fail to register misc device %s\n", sensor->miscdev.name);\r
-               goto out_misc_device_register_device_failed;\r
-       }\r
-       \r
-       g_sensor[type] = sensor;\r
-\r
-       if((type == SENSOR_TYPE_ACCEL) && (sensor->pdata->factory))     //only support  setting gsensor orientation online now  \r
-       {\r
-               result = gsensor_class_init();\r
-               if (result) {\r
-                       dev_err(&client->dev,\r
-                               "fail to register misc device %s\n", sensor->i2c_id->name);\r
-                       goto out_misc_device_register_device_failed;\r
-               }\r
-       }       \r
-       \r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-       if((sensor->ops->suspend) && (sensor->ops->resume))\r
-       {\r
-               sensor->early_suspend.suspend = sensor_suspend;\r
-               sensor->early_suspend.resume = sensor_resume;\r
-               sensor->early_suspend.level = 0x02;\r
-               register_early_suspend(&sensor->early_suspend);\r
-       }\r
-#endif\r
-\r
-       printk("%s:initialized ok,sensor name:%s,type:%d,id=%d\n\n",__func__,sensor->ops->name,type,(int)sensor->i2c_id->driver_data);\r
-\r
-       return result;\r
-       \r
-out_misc_device_register_device_failed:\r
-out_input_register_device_failed:\r
-out_free_memory:\r
-out_no_free:\r
-       dev_err(&client->adapter->dev, "%s failed %d\n\n", __func__, result);\r
-       return result;\r
-\r
-}\r
-\r
-static void sensor_shut_down(struct i2c_client *client)\r
-{\r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);\r
-       if((sensor->ops->suspend) && (sensor->ops->resume))             \r
-               unregister_early_suspend(&sensor->early_suspend);\r
-       DBG("%s:%s\n",__func__,sensor->i2c_id->name);\r
-#endif\r
-}\r
-\r
-static int sensor_remove(struct i2c_client *client)\r
-{\r
-       struct sensor_private_data *sensor =\r
-           (struct sensor_private_data *) i2c_get_clientdata(client);\r
-       int result = 0;\r
-       \r
-       cancel_delayed_work_sync(&sensor->delaywork);\r
-       misc_deregister(&sensor->miscdev);\r
-#ifdef CONFIG_HAS_EARLYSUSPEND\r
-       if((sensor->ops->suspend) && (sensor->ops->resume))\r
-               unregister_early_suspend(&sensor->early_suspend);\r
-#endif  \r
-       return result;\r
-}\r
-\r
-static const struct i2c_device_id sensor_id[] = {\r
-       /*angle*/       \r
-       {"angle_kxtik", ANGLE_ID_KXTIK},\r
-       {"angle_lis3dh", ANGLE_ID_LIS3DH},      \r
-       /*gsensor*/\r
-       {"gsensor", ACCEL_ID_ALL},\r
-       {"gs_mma8452", ACCEL_ID_MMA845X},       \r
-       {"gs_kxtik", ACCEL_ID_KXTIK},   \r
-       {"gs_kxtj9", ACCEL_ID_KXTJ9},\r
-       {"gs_lis3dh", ACCEL_ID_LIS3DH},\r
-       {"gs_mma7660", ACCEL_ID_MMA7660},\r
-       {"gs_mxc6225", ACCEL_ID_MXC6225},       \r
-       {"gs_dmard10", ACCEL_ID_DMARD10},\r
-       {"gs_lsm303d", ACCEL_ID_LSM303D},\r
-       {"gs_mc3230",ACCEL_ID_MC3230},\r
-       {"mpu6880_acc",ACCEL_ID_MPU6880},\r
-       {"mpu6500_acc",ACCEL_ID_MPU6500},\r
+
+       switch(pdata->layout)
+       {
+               case 1:
+                       pdata->orientation[0] = 1;
+                       pdata->orientation[1] = 0;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 0;
+                       pdata->orientation[4] = 1;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = 1;
+                       break;
+
+               case 2:
+                       pdata->orientation[0] = 0;
+                       pdata->orientation[1] = -1;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 1;
+                       pdata->orientation[4] = 0;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = 1;
+                       break;
+
+               case 3:
+                       pdata->orientation[0] = -1;
+                       pdata->orientation[1] = 0;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 0;
+                       pdata->orientation[4] = -1;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = 1;
+                       break;
+
+               case 4:
+                       pdata->orientation[0] = 0;
+                       pdata->orientation[1] = 1;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = -1;
+                       pdata->orientation[4] = 0;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = 1;
+                       break;
+
+               case 5:
+                       pdata->orientation[0] = 1;
+                       pdata->orientation[1] = 0;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 0;
+                       pdata->orientation[4] = -1;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = -1;
+                       break;
+
+               case 6:
+                       pdata->orientation[0] = 0;
+                       pdata->orientation[1] = -1;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = -1;
+                       pdata->orientation[4] = 0;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = -1;
+                       break;
+
+               case 7:
+                       pdata->orientation[0] = -1;
+                       pdata->orientation[1] = 0;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 0;
+                       pdata->orientation[4] = 1;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = -1;
+                       break;
+
+               case 8:
+                       pdata->orientation[0] = 0;
+                       pdata->orientation[1] = 1;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 1;
+                       pdata->orientation[4] = 0;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = -1;
+                       break;
+
+               default:
+                       pdata->orientation[0] = 1;
+                       pdata->orientation[1] = 0;
+                       pdata->orientation[2] = 0;
+
+                       pdata->orientation[3] = 0;
+                       pdata->orientation[4] = 1;
+                       pdata->orientation[5] = 0;
+
+                       pdata->orientation[6] = 0;
+                       pdata->orientation[7] = 0;
+                       pdata->orientation[8] = 1;
+                       break;
+       }
+
+       client->irq = pdata->irq_pin;
+       type = pdata->type;
+       pdata->irq_flags = irq_flags;
+       DBG("irq_flags = %lu  padta->irq_flags = %lu\n",irq_flags, pdata->irq_flags);
+       DBG("type = %d \n",pdata->type);
+       DBG("irq = %d \n",pdata->irq);
+       DBG("irq_pin = %d \n",pdata->irq_pin);
+       DBG("pwer_pin = %d \n",pdata->power_pin);
+       DBG("reset_pin = %d \n",pdata->reset_pin);
+       DBG("irq_enable = %d \n",pdata->irq_enable);
+
+       DBG("poll_delay_ms = %d \n",pdata->poll_delay_ms);
+       DBG("x_min = %d \n",pdata->x_min);
+       DBG("y_min = %d \n",pdata->y_min);
+       DBG("z_min = %d \n",pdata->z_min);
+       DBG("factory = %d \n",pdata->factory);
+       DBG("layout = %d \n",pdata->layout);
+       DBG("address = 0x%x \n",pdata->address);
+       DBG("project_name = [%s] \n",pdata->project_name);
+
+       DBG(" == %d,%d ,%d \t ,%d ,%d ,%d , \t ,%d, %d, %d ,==%d\n",pdata->orientation[0],pdata->orientation[1],pdata->orientation[2]
+                               ,pdata->orientation[3],pdata->orientation[4],pdata->orientation[5]
+                               ,pdata->orientation[6],pdata->orientation[7],pdata->orientation[8],ARRAY_SIZE(pdata->orientation));
+
+
+       if((type >= SENSOR_NUM_TYPES) || (type <= SENSOR_TYPE_NULL))
+       {
+               dev_err(&client->adapter->dev, "sensor type is error %d\n", type);
+               result = -EFAULT;
+               goto out_no_free;
+       }
+       if(((int)devid->driver_data >= SENSOR_NUM_ID) || ((int)devid->driver_data <= ID_INVALID))
+       {
+               dev_err(&client->adapter->dev, "sensor id is error %d\n", (int)devid->driver_data);
+               result = -EFAULT;
+               goto out_no_free;
+       }
+       i2c_set_clientdata(client, sensor);
+       sensor->client = client;
+       sensor->pdata = pdata;
+       sensor->type = type;
+       sensor->i2c_id = (struct i2c_device_id *)devid;
+
+
+       memset(&(sensor->axis), 0, sizeof(struct sensor_axis) );
+       atomic_set(&(sensor->data_ready), 0);
+       init_waitqueue_head(&(sensor->data_ready_wq));
+       mutex_init(&sensor->data_mutex);
+       mutex_init(&sensor->operation_mutex);
+       mutex_init(&sensor->sensor_mutex);
+       mutex_init(&sensor->i2c_mutex);
+
+       /* As default, report all information */
+       atomic_set(&sensor->flags.m_flag, 1);
+       atomic_set(&sensor->flags.a_flag, 1);
+       atomic_set(&sensor->flags.mv_flag, 1);
+       atomic_set(&sensor->flags.open_flag, 0);
+       atomic_set(&sensor->flags.debug_flag, 1);
+       init_waitqueue_head(&sensor->flags.open_wq);
+       sensor->flags.delay = 100;
+
+       sensor->status_cur = SENSOR_OFF;
+       sensor->axis.x = 0;
+       sensor->axis.y = 0;
+       sensor->axis.z = 0;
+
+       result = sensor_chip_init(sensor->client);
+       if(result < 0)
+               goto out_free_memory;
+
+       sensor->input_dev = devm_input_allocate_device(&client->dev);
+       if (!sensor->input_dev) {
+               result = -ENOMEM;
+               dev_err(&client->dev,
+                       "Failed to allocate input device\n");
+               goto out_free_memory;
+       }
+
+       switch(type)
+       {
+               case SENSOR_TYPE_ANGLE:
+                       sensor->input_dev->name = "angle";
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       /* x-axis acceleration */
+                       input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
+                       /* y-axis acceleration */
+                       input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
+                       /* z-axis acceleration */
+                       input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
+                       break;
+
+               case SENSOR_TYPE_ACCEL:
+                       sensor->input_dev->name = "gsensor";
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       /* x-axis acceleration */
+                       input_set_abs_params(sensor->input_dev, ABS_X, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
+                       /* y-axis acceleration */
+                       input_set_abs_params(sensor->input_dev, ABS_Y, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
+                       /* z-axis acceleration */
+                       input_set_abs_params(sensor->input_dev, ABS_Z, sensor->ops->range[0], sensor->ops->range[1], 0, 0); //2g full scale range
+                       break;
+               case SENSOR_TYPE_COMPASS:
+                       sensor->input_dev->name = "compass";
+                       /* Setup input device */
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       /* yaw (0, 360) */
+                       input_set_abs_params(sensor->input_dev, ABS_RX, 0, 23040, 0, 0);
+                       /* pitch (-180, 180) */
+                       input_set_abs_params(sensor->input_dev, ABS_RY, -11520, 11520, 0, 0);
+                       /* roll (-90, 90) */
+                       input_set_abs_params(sensor->input_dev, ABS_RZ, -5760, 5760, 0, 0);
+                       /* x-axis acceleration (720 x 8G) */
+                       input_set_abs_params(sensor->input_dev, ABS_X, -5760, 5760, 0, 0);
+                       /* y-axis acceleration (720 x 8G) */
+                       input_set_abs_params(sensor->input_dev, ABS_Y, -5760, 5760, 0, 0);
+                       /* z-axis acceleration (720 x 8G) */
+                       input_set_abs_params(sensor->input_dev, ABS_Z, -5760, 5760, 0, 0);
+                       /* status of magnetic sensor */
+                       input_set_abs_params(sensor->input_dev, ABS_RUDDER, -32768, 3, 0, 0);
+                       /* status of acceleration sensor */
+                       input_set_abs_params(sensor->input_dev, ABS_WHEEL, -32768, 3, 0, 0);
+                       /* x-axis of raw magnetic vector (-4096, 4095) */
+                       input_set_abs_params(sensor->input_dev, ABS_HAT0X, -20480, 20479, 0, 0);
+                       /* y-axis of raw magnetic vector (-4096, 4095) */
+                       input_set_abs_params(sensor->input_dev, ABS_HAT0Y, -20480, 20479, 0, 0);
+                       /* z-axis of raw magnetic vector (-4096, 4095) */
+                       input_set_abs_params(sensor->input_dev, ABS_BRAKE, -20480, 20479, 0, 0);
+                       break;
+               case SENSOR_TYPE_GYROSCOPE:
+                       sensor->input_dev->name = "gyro";
+                       /* x-axis acceleration */
+                       input_set_capability(sensor->input_dev, EV_REL, REL_RX);
+                       input_set_abs_params(sensor->input_dev, ABS_RX, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       /* y-axis acceleration */
+                       input_set_capability(sensor->input_dev, EV_REL, REL_RY);
+                       input_set_abs_params(sensor->input_dev, ABS_RY, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       /* z-axis acceleration */
+                       input_set_capability(sensor->input_dev, EV_REL, REL_RZ);
+                       input_set_abs_params(sensor->input_dev, ABS_RZ, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       break;
+               case SENSOR_TYPE_LIGHT:
+                       sensor->input_dev->name = "lightsensor-level";
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       input_set_abs_params(sensor->input_dev, ABS_MISC, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       input_set_abs_params(sensor->input_dev, ABS_TOOL_WIDTH ,  sensor->ops->brightness[0],sensor->ops->brightness[1], 0, 0);
+                       break;
+               case SENSOR_TYPE_PROXIMITY:
+                       sensor->input_dev->name = "proximity";
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       input_set_abs_params(sensor->input_dev, ABS_DISTANCE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       break;
+               case SENSOR_TYPE_TEMPERATURE:
+                       sensor->input_dev->name = "temperature";
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       input_set_abs_params(sensor->input_dev, ABS_THROTTLE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       break;
+               case SENSOR_TYPE_PRESSURE:
+                       sensor->input_dev->name = "pressure";
+                       set_bit(EV_ABS, sensor->input_dev->evbit);
+                       input_set_abs_params(sensor->input_dev, ABS_PRESSURE, sensor->ops->range[0], sensor->ops->range[1], 0, 0);
+                       break;
+               default:
+                       printk("%s:unknow sensor type=%d\n",__func__,type);
+                       break;
+
+       }
+       sensor->input_dev->dev.parent = &client->dev;
+
+       result = input_register_device(sensor->input_dev);
+       if (result) {
+               dev_err(&client->dev,
+                       "Unable to register input device %s\n", sensor->input_dev->name);
+               goto out_input_register_device_failed;
+       }
+
+       result = sensor_irq_init(sensor->client);
+       if (result) {
+               dev_err(&client->dev,
+                       "fail to init sensor irq,ret=%d\n",result);
+               goto out_input_register_device_failed;
+       }
+
+
+       sensor->miscdev.parent = &client->dev;
+       result = sensor_misc_device_register(sensor, type);
+       if (result) {
+               dev_err(&client->dev,
+                       "fail to register misc device %s\n", sensor->miscdev.name);
+               goto out_misc_device_register_device_failed;
+       }
+
+       g_sensor[type] = sensor;
+
+       if((type == SENSOR_TYPE_ACCEL) && (sensor->pdata->factory))     //only support  setting gsensor orientation online now
+       {
+               result = gsensor_class_init();
+               if (result) {
+                       dev_err(&client->dev,
+                               "fail to register misc device %s\n", sensor->i2c_id->name);
+                       goto out_misc_device_register_device_failed;
+               }
+       }
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+       if((sensor->ops->suspend) && (sensor->ops->resume))
+       {
+               sensor->early_suspend.suspend = sensor_suspend;
+               sensor->early_suspend.resume = sensor_resume;
+               sensor->early_suspend.level = 0x02;
+               register_early_suspend(&sensor->early_suspend);
+       }
+#endif
+
+       printk("%s:initialized ok,sensor name:%s,type:%d,id=%d\n\n",__func__,sensor->ops->name,type,(int)sensor->i2c_id->driver_data);
+
+       return result;
+
+out_misc_device_register_device_failed:
+out_input_register_device_failed:
+out_free_memory:
+out_no_free:
+       dev_err(&client->adapter->dev, "%s failed %d\n\n", __func__, result);
+       return result;
+
+}
+
+static void sensor_shut_down(struct i2c_client *client)
+{
+#ifdef CONFIG_HAS_EARLYSUSPEND
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       if((sensor->ops->suspend) && (sensor->ops->resume))
+               unregister_early_suspend(&sensor->early_suspend);
+       DBG("%s:%s\n",__func__,sensor->i2c_id->name);
+#endif
+}
+
+static int sensor_remove(struct i2c_client *client)
+{
+       struct sensor_private_data *sensor =
+           (struct sensor_private_data *) i2c_get_clientdata(client);
+       int result = 0;
+
+       cancel_delayed_work_sync(&sensor->delaywork);
+       misc_deregister(&sensor->miscdev);
+#ifdef CONFIG_HAS_EARLYSUSPEND
+       if((sensor->ops->suspend) && (sensor->ops->resume))
+               unregister_early_suspend(&sensor->early_suspend);
+#endif
+       return result;
+}
+
+static const struct i2c_device_id sensor_id[] = {
+       /*angle*/
+       {"angle_kxtik", ANGLE_ID_KXTIK},
+       {"angle_lis3dh", ANGLE_ID_LIS3DH},
+       /*gsensor*/
+       {"gsensor", ACCEL_ID_ALL},
+       {"gs_mma8452", ACCEL_ID_MMA845X},
+       {"gs_kxtik", ACCEL_ID_KXTIK},
+       {"gs_kxtj9", ACCEL_ID_KXTJ9},
+       {"gs_lis3dh", ACCEL_ID_LIS3DH},
+       {"gs_mma7660", ACCEL_ID_MMA7660},
+       {"gs_mxc6225", ACCEL_ID_MXC6225},
+       {"gs_dmard10", ACCEL_ID_DMARD10},
+       {"gs_lsm303d", ACCEL_ID_LSM303D},
+       {"gs_mc3230",ACCEL_ID_MC3230},
+       {"mpu6880_acc",ACCEL_ID_MPU6880},
+       {"mpu6500_acc",ACCEL_ID_MPU6500},
        {"lsm330_acc", ACCEL_ID_LSM330},
-       /*compass*/\r
-       {"compass", COMPASS_ID_ALL},\r
-       {"ak8975", COMPASS_ID_AK8975},  \r
-       {"ak8963", COMPASS_ID_AK8963},\r
-       {"ak09911", COMPASS_ID_AK09911},\r
-       {"mmc314x", COMPASS_ID_MMC314X},\r
-       /*gyroscope*/\r
-       {"gyro", GYRO_ID_ALL},  \r
-       {"l3g4200d_gyro", GYRO_ID_L3G4200D},\r
-       {"l3g20d_gyro", GYRO_ID_L3G20D},\r
-       {"ewtsa_gyro", GYRO_ID_EWTSA},\r
-       {"k3g", GYRO_ID_K3G},\r
-       {"mpu6880_gyro",GYRO_ID_MPU6880},\r
+       /*compass*/
+       {"compass", COMPASS_ID_ALL},
+       {"ak8975", COMPASS_ID_AK8975},
+       {"ak8963", COMPASS_ID_AK8963},
+       {"ak09911", COMPASS_ID_AK09911},
+       {"mmc314x", COMPASS_ID_MMC314X},
+       /*gyroscope*/
+       {"gyro", GYRO_ID_ALL},
+       {"l3g4200d_gyro", GYRO_ID_L3G4200D},
+       {"l3g20d_gyro", GYRO_ID_L3G20D},
+       {"ewtsa_gyro", GYRO_ID_EWTSA},
+       {"k3g", GYRO_ID_K3G},
+       {"mpu6880_gyro",GYRO_ID_MPU6880},
        {"lsm330_gyro", GYRO_ID_LSM330},
-       /*light sensor*/\r
-       {"lightsensor", LIGHT_ID_ALL},  \r
-       {"light_cm3217", LIGHT_ID_CM3217},\r
-       {"light_cm3218", LIGHT_ID_CM3218},\r
-       {"light_cm3232", LIGHT_ID_CM3232},\r
-       {"light_al3006", LIGHT_ID_AL3006},\r
-       {"ls_stk3171", LIGHT_ID_STK3171},\r
-       {"ls_isl29023", LIGHT_ID_ISL29023},\r
-       {"ls_ap321xx", LIGHT_ID_AP321XX},\r
-       {"ls_photoresistor", LIGHT_ID_PHOTORESISTOR},\r
-       {"ls_us5152", LIGHT_ID_US5152},\r
-       /*proximity sensor*/\r
-       {"psensor", PROXIMITY_ID_ALL},\r
-       {"proximity_al3006", PROXIMITY_ID_AL3006},      \r
-       {"ps_stk3171", PROXIMITY_ID_STK3171},\r
-       {"ps_ap321xx", PROXIMITY_ID_AP321XX},\r
-       \r
-       /*temperature*/\r
-       {"temperature", TEMPERATURE_ID_ALL},    \r
-       {"tmp_ms5607", TEMPERATURE_ID_MS5607},\r
-\r
-       /*pressure*/\r
-       {"pressure", PRESSURE_ID_ALL},\r
-       {"pr_ms5607", PRESSURE_ID_MS5607},\r
-       \r
-       {},\r
-};\r
-\r
-static struct of_device_id sensor_dt_ids[] = {\r
-       /*gsensor*/\r
-       { .compatible = "gs_mma8452" },\r
-       { .compatible = "gs_lis3dh" },\r
-       { .compatible = "gs_lsm303d" },\r
-       { .compatible = "gs_mma7660" },\r
-       { .compatible = "gs_mxc6225" },\r
-       { .compatible = "gs_mc3230" },\r
+       /*light sensor*/
+       {"lightsensor", LIGHT_ID_ALL},
+       {"light_cm3217", LIGHT_ID_CM3217},
+       {"light_cm3218", LIGHT_ID_CM3218},
+       {"light_cm3232", LIGHT_ID_CM3232},
+       {"light_al3006", LIGHT_ID_AL3006},
+       {"ls_stk3171", LIGHT_ID_STK3171},
+       {"ls_isl29023", LIGHT_ID_ISL29023},
+       {"ls_ap321xx", LIGHT_ID_AP321XX},
+       {"ls_photoresistor", LIGHT_ID_PHOTORESISTOR},
+       {"ls_us5152", LIGHT_ID_US5152},
+       /*proximity sensor*/
+       {"psensor", PROXIMITY_ID_ALL},
+       {"proximity_al3006", PROXIMITY_ID_AL3006},
+       {"ps_stk3171", PROXIMITY_ID_STK3171},
+       {"ps_ap321xx", PROXIMITY_ID_AP321XX},
+
+       /*temperature*/
+       {"temperature", TEMPERATURE_ID_ALL},
+       {"tmp_ms5607", TEMPERATURE_ID_MS5607},
+
+       /*pressure*/
+       {"pressure", PRESSURE_ID_ALL},
+       {"pr_ms5607", PRESSURE_ID_MS5607},
+
+       {},
+};
+
+static struct of_device_id sensor_dt_ids[] = {
+       /*gsensor*/
+       { .compatible = "gs_mma8452" },
+       { .compatible = "gs_lis3dh" },
+       { .compatible = "gs_lsm303d" },
+       { .compatible = "gs_mma7660" },
+       { .compatible = "gs_mxc6225" },
+       { .compatible = "gs_mc3230" },
        { .compatible = "lsm330_acc" },
-       /*compass*/\r
-       { .compatible = "ak8975" },\r
-       { .compatible = "ak8963" },\r
-       { .compatible = "ak09911" },\r
-       { .compatible = "mmc314x" },\r
-\r
-       /* gyroscop*/\r
-       { .compatible = "l3g4200d_gyro" },\r
-       { .compatible = "l3g20d_gyro" },\r
-       { .compatible = "ewtsa_gyro" },\r
-       { .compatible = "k3g" },\r
+       /*compass*/
+       { .compatible = "ak8975" },
+       { .compatible = "ak8963" },
+       { .compatible = "ak09911" },
+       { .compatible = "mmc314x" },
+
+       /* gyroscop*/
+       { .compatible = "l3g4200d_gyro" },
+       { .compatible = "l3g20d_gyro" },
+       { .compatible = "ewtsa_gyro" },
+       { .compatible = "k3g" },
        { .compatible = "lsm330_gyro" },
-       \r
-       /*light sensor*/\r
-       { .compatible = "light_cm3217" },\r
-       { .compatible = "light_cm3232" },\r
-       { .compatible = "light_al3006" },\r
-       { .compatible = "ls_stk3171" },\r
-       { .compatible = "ls_ap321xx" },\r
-\r
-       { .compatible = "ls_photoresistor" },\r
-       { .compatible = "ls_us5152" },\r
-\r
-       /*temperature sensor*/\r
-       { .compatible = "tmp_ms5607" },\r
-       \r
-       /*pressure sensor*/\r
-       { .compatible = "pr_ms5607" },\r
-\r
-       /*hall sensor*/\r
-       { .compatible = "hall_och165t" },\r
-       { }\r
-};\r
-\r
-\r
-static struct i2c_driver sensor_driver = {\r
-       .probe = sensor_probe,\r
-       .remove = sensor_remove,\r
-       .shutdown = sensor_shut_down,\r
-       .id_table = sensor_id,\r
+
+       /*light sensor*/
+       { .compatible = "light_cm3217" },
+       { .compatible = "light_cm3232" },
+       { .compatible = "light_al3006" },
+       { .compatible = "ls_stk3171" },
+       { .compatible = "ls_ap321xx" },
+
+       { .compatible = "ls_photoresistor" },
+       { .compatible = "ls_us5152" },
+
+       /*temperature sensor*/
+       { .compatible = "tmp_ms5607" },
+
+       /*pressure sensor*/
+       { .compatible = "pr_ms5607" },
+
+       /*hall sensor*/
+       { .compatible = "hall_och165t" },
+       { }
+};
+
+
+static struct i2c_driver sensor_driver = {
+       .probe = sensor_probe,
+       .remove = sensor_remove,
+       .shutdown = sensor_shut_down,
+       .id_table = sensor_id,
        .driver = {
                .owner = THIS_MODULE,
                .name = "sensors",
                .of_match_table = of_match_ptr(sensor_dt_ids),
                .pm = SENSOR_PM_OPS,
-       },\r
-};\r
-\r
-static int __init sensor_init(void)\r
-{\r
-       int res = i2c_add_driver(&sensor_driver);       \r
-       struct proc_dir_entry *sensor_proc_entry;       \r
-       pr_info("%s: Probe name %s\n", __func__, sensor_driver.driver.name);\r
-       if (res)\r
-               pr_err("%s failed\n", __func__);\r
-       \r
-       sensor_proc_entry = proc_create("driver/sensor_dbg", 0660, NULL, &sensor_proc_fops); \r
-       printk("%s\n", SENSOR_VERSION_AND_TIME);\r
-       return res;\r
-}\r
-\r
-static void __exit sensor_exit(void)\r
-{\r
-       pr_info("%s\n", __func__);\r
-       i2c_del_driver(&sensor_driver);\r
-}\r
-\r
-late_initcall(sensor_init);\r
-module_exit(sensor_exit);\r
-\r
-MODULE_AUTHOR("ROCKCHIP Corporation:lw@rock-chips.com");\r
-MODULE_DESCRIPTION("User space character device interface for sensors");\r
-MODULE_LICENSE("GPL");\r
-\r
+       },
+};
+
+static int __init sensor_init(void)
+{
+       int res = i2c_add_driver(&sensor_driver);
+       struct proc_dir_entry *sensor_proc_entry;
+       pr_info("%s: Probe name %s\n", __func__, sensor_driver.driver.name);
+       if (res)
+               pr_err("%s failed\n", __func__);
+
+       sensor_proc_entry = proc_create("driver/sensor_dbg", 0660, NULL, &sensor_proc_fops);
+       printk("%s\n", SENSOR_VERSION_AND_TIME);
+       return res;
+}
+
+static void __exit sensor_exit(void)
+{
+       pr_info("%s\n", __func__);
+       i2c_del_driver(&sensor_driver);
+}
+
+late_initcall(sensor_init);
+module_exit(sensor_exit);
+
+MODULE_AUTHOR("ROCKCHIP Corporation:lw@rock-chips.com");
+MODULE_DESCRIPTION("User space character device interface for sensors");
+MODULE_LICENSE("GPL");
+