fix compass akm8975 bug:data not ready
[firefly-linux-kernel-4.4.55.git] / drivers / input / sensors / compass / ak8975.c
index 6a8926d3110cf123f78bbd01b566f9c429356952..a8fbf21efe209df0a57902d391cfc16898f42264 100755 (executable)
@@ -62,20 +62,17 @@ static int sensor_active(struct i2c_client *client, int enable, int rate)
        struct sensor_private_data *sensor =\r
            (struct sensor_private_data *) i2c_get_clientdata(client);  \r
        int result = 0;\r
-       int status = 0;\r
                \r
-       sensor->ops->ctrl_data = sensor_read_reg(client, sensor->ops->ctrl_reg);\r
+       //sensor->ops->ctrl_data = sensor_read_reg(client, sensor->ops->ctrl_reg);\r
        \r
        //register setting according to chip datasheet          \r
        if(enable)\r
        {       \r
-               status = AK8975_MODE_SNG_MEASURE;\r
-               sensor->ops->ctrl_data |= status;       \r
+               sensor->ops->ctrl_data = AK8975_MODE_SNG_MEASURE;       \r
        }\r
        else\r
        {\r
-               status = ~AK8975_MODE_SNG_MEASURE;\r
-               sensor->ops->ctrl_data &= status;\r
+               sensor->ops->ctrl_data = AK8975_MODE_POWERDOWN;\r
        }\r
 \r
        DBG("%s:reg=0x%x,reg_ctrl=0x%x,enable=%d\n",__func__,sensor->ops->ctrl_reg, sensor->ops->ctrl_data, enable);\r
@@ -103,7 +100,7 @@ static int sensor_init(struct i2c_client *client)
        }\r
        \r
        sensor->status_cur = SENSOR_OFF;\r
-       \r
+#if 0  \r
        sensor->ops->ctrl_data = 0;\r
        result = sensor_write_reg(client, sensor->ops->ctrl_reg, sensor->ops->ctrl_data);\r
        if(result)\r
@@ -111,7 +108,7 @@ static int sensor_init(struct i2c_client *client)
                printk("%s:line=%d,error\n",__func__,__LINE__);\r
                return result;\r
        }\r
-\r
+#endif\r
        DBG("%s:status_cur=%d\n",__func__, sensor->status_cur);\r
        return result;\r
 }\r
@@ -206,6 +203,14 @@ static int sensor_report_value(struct i2c_client *client)
        }\r
 \r
        \r
+       //trigger next measurement \r
+       ret = sensor_write_reg(client, sensor->ops->ctrl_reg, sensor->ops->ctrl_data);\r
+       if(ret)\r
+       {\r
+               printk(KERN_ERR "%s:fail to set ctrl_data:0x%x\n",__func__,sensor->ops->ctrl_data);\r
+               return ret;\r
+       }\r
+\r
        return ret;\r
 }\r
 \r
@@ -572,12 +577,17 @@ static long compass_dev_ioctl(struct file *file,
                case ECS_IOCTL_SET_MODE:                \r
                        DBG("%s:ECS_IOCTL_SET_MODE start\n",__func__);          \r
                        mutex_lock(&sensor->operation_mutex);\r
-                       ret = compass_akm_set_mode(client, mode);\r
-                       if (ret < 0) {\r
-                               printk("%s:fait to set mode\n",__func__);               \r
-                               mutex_unlock(&sensor->operation_mutex);\r
-                               return ret;\r
-                       }               \r
+                       if(sensor->ops->ctrl_data != mode)\r
+                       {\r
+                               ret = compass_akm_set_mode(client, mode);\r
+                               if (ret < 0) {\r
+                                       printk("%s:fait to set mode\n",__func__);               \r
+                                       mutex_unlock(&sensor->operation_mutex);\r
+                                       return ret;\r
+                               }\r
+                               \r
+                               sensor->ops->ctrl_data = mode;\r
+                       }\r
                        mutex_unlock(&sensor->operation_mutex);\r
                        break;\r
                case ECS_IOCTL_GETDATA:         \r