add sensor version info
[firefly-linux-kernel-4.4.55.git] / drivers / input / sensors / sensor-dev.c
index 81d5f559ca0592085f6a8e7aeffe420c9332922c..db8438acb6372b5ec1887352800211cb64ae58ee 100755 (executable)
@@ -43,6 +43,9 @@
 #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
@@ -302,6 +305,8 @@ static int sensor_irq_init(struct i2c_client *client)
                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
@@ -317,7 +322,7 @@ error:
        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
@@ -336,6 +341,7 @@ static void sensor_resume(struct early_suspend *h)
        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
@@ -381,9 +387,9 @@ static long gsensor_dev_ioctl(struct file *file,
                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
@@ -413,7 +419,7 @@ static long gsensor_dev_ioctl(struct file *file,
                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
@@ -442,7 +448,7 @@ static long gsensor_dev_ioctl(struct file *file,
                \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
@@ -465,9 +471,9 @@ static long gsensor_dev_ioctl(struct file *file,
        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
@@ -475,20 +481,21 @@ static long gsensor_dev_ioctl(struct file *file,
                                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
@@ -499,7 +506,7 @@ static ssize_t gsensor_set_orientation_online(struct device *dev,
        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
@@ -532,7 +539,7 @@ static ssize_t gsensor_set_orientation_online(struct device *dev,
 \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
@@ -760,9 +767,9 @@ static long light_dev_ioctl(struct file *file,
 \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
@@ -775,12 +782,20 @@ static long light_dev_ioctl(struct file *file,
                                        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
@@ -793,8 +808,17 @@ static long light_dev_ioctl(struct file *file,
                                        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
@@ -845,7 +869,7 @@ static long proximity_dev_ioctl(struct file *file,
        {\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
@@ -859,11 +883,20 @@ static long proximity_dev_ioctl(struct file *file,
                                        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
@@ -875,7 +908,15 @@ static long proximity_dev_ioctl(struct file *file,
                                        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
@@ -1264,7 +1305,7 @@ int sensor_probe(struct i2c_client *client, const struct i2c_device_id *devid)
 \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
@@ -1328,11 +1369,13 @@ out_no_free:
 \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
@@ -1348,7 +1391,7 @@ static int sensor_remove(struct i2c_client *client)
        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
@@ -1360,6 +1403,7 @@ static const struct i2c_device_id sensor_id[] = {
        {"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
@@ -1373,10 +1417,14 @@ static const struct i2c_device_id sensor_id[] = {
        {"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
@@ -1400,6 +1448,8 @@ static int __init sensor_init(void)
        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