#define DBG(x...)\r
#endif\r
\r
+#define SENSOR_VERSION_AND_TIME "sensor-dev.c v1.0 2013-2-18"\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
client->irq = irq;\r
if((sensor->pdata->type == SENSOR_TYPE_GYROSCOPE) || (sensor->pdata->type == SENSOR_TYPE_ACCEL))\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
printk("%s:use irq=%d\n",__func__,irq);\r
}\r
else if(!sensor->pdata->irq_enable)\r
return result;\r
}\r
\r
-\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
static void sensor_suspend(struct early_suspend *h)\r
{\r
struct sensor_private_data *sensor = \r
if(sensor->ops->resume)\r
sensor->ops->resume(sensor->client);\r
}\r
+#endif\r
\r
static int gsensor_dev_open(struct inode *inode, struct file *file)\r
{\r
break;\r
default:\r
break;\r
- }
-
- switch (cmd) {
+ }\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
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
\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
default:\r
result = -ENOTTY;\r
goto error;\r
- }
-
- switch (cmd) {
+ }\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
goto error;\r
} \r
DBG("%s:GSENSOR_IOCTL_GETDATA OK\n", __func__);\r
- break;
- default:
- break;
+ break;\r
+ default:\r
+ break;\r
}\r
\r
error:\r
return result;\r
}\r
\r
-static ssize_t gsensor_set_orientation_online(struct device *dev,\r
- struct device_attribute *attr, char *buf)\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
int end = strcspn(p,"}");\r
\r
strncpy(orientation,p+start,end-start+1);\r
- char *tmp = orientation;\r
+ tmp = orientation;\r
\r
\r
while(strncmp(tmp,"}",1)!=0)\r
\r
}\r
\r
-static CLASS_ATTR(orientation, 0660, NULL,gsensor_set_orientation_online);\r
+static CLASS_ATTR(orientation, 0660, NULL, gsensor_set_orientation_online);\r
\r
static int gsensor_class_init(void)\r
{\r
\r
switch(cmd)\r
{\r
- case LIGHTSENSOR_IOCTL_GET_ENABLED:
+ case LIGHTSENSOR_IOCTL_GET_ENABLED:\r
*argp = sensor->status_cur;\r
- break;
+ break;\r
case LIGHTSENSOR_IOCTL_ENABLE: \r
DBG("%s:LIGHTSENSOR_IOCTL_ENABLE start\n", __func__);\r
mutex_lock(&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
+ 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
PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\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
goto error;\r
}\r
\r
- if(!sensor->pdata->irq_enable)\r
- cancel_delayed_work_sync(&sensor->delaywork); \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
{\r
case PSENSOR_IOCTL_GET_ENABLED:\r
*argp = sensor->status_cur;\r
- break;
+ break;\r
case PSENSOR_IOCTL_ENABLE: \r
DBG("%s:PSENSOR_IOCTL_ENABLE start\n", __func__);\r
mutex_lock(&sensor->operation_mutex); \r
goto error; \r
}\r
\r
- if(!sensor->pdata->irq_enable)\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
PREPARE_DELAYED_WORK(&sensor->delaywork, sensor_delaywork_func);\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
mutex_unlock(&sensor->operation_mutex); \r
goto error;\r
}\r
- if(!sensor->pdata->irq_enable)\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
}\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
\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
kfree(sensor);\r
#ifdef CONFIG_HAS_EARLYSUSPEND\r
if((sensor->ops->suspend) && (sensor->ops->resume))\r
- unregister_early_suspend(&sensor->early_suspend);\r
+ unregister_early_suspend(&sensor->early_suspend);\r
#endif \r
return result;\r
}\r
{"gs_kxtik", ACCEL_ID_KXTIK},\r
{"gs_lis3dh", ACCEL_ID_LIS3DH},\r
{"gs_mma7660", ACCEL_ID_MMA7660},\r
+ {"gs_mxc6225", ACCEL_ID_MXC6225},\r
/*compass*/\r
{"compass", COMPASS_ID_ALL},\r
{"ak8975", COMPASS_ID_AK8975},\r
{"light_cm3217", LIGHT_ID_CM3217},\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
/*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
/*temperature*/\r
{"temperature", TEMPERATURE_ID_ALL},\r
{},\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
+ printk("%s\n", SENSOR_VERSION_AND_TIME);\r
return res;\r
}\r
\r