input: ewtzmu2: Fix gyro off status checks
Change-Id: Icf52849edadf54020ca90f581be336799ab90368
diff --git a/drivers/input/misc/ewtzmu2.c b/drivers/input/misc/ewtzmu2.c
index 14065d5..cc9d155 100644
--- a/drivers/input/misc/ewtzmu2.c
+++ b/drivers/input/misc/ewtzmu2.c
@@ -32,6 +32,7 @@
#include <linux/gpio.h>
#include <linux/akm8975.h>
#include <linux/module.h>
+#include <linux/mutex.h>
#ifndef HTC_VERSION
#include <linux/i2c/ak8973.h>
@@ -55,6 +56,7 @@
static DECLARE_WAIT_QUEUE_HEAD(open_wq);
static atomic_t open_flag;
static bool Gyro_init_fail = 0;
+static DEFINE_MUTEX(ewtzmu2_power_lock);
struct _ewtzmu_data {
rwlock_t lock;
@@ -351,6 +353,12 @@
return EW_CLIENT_ERROR;
}
+ if (atomic_read(&off_status_hal)) {
+ E("Fail to read sensor data. Device is powered off.\n");
+ *buf = 0;
+ return EW_DEVICE_POWERED_OFF;
+ }
+
read_lock(&ewtzmu_data.lock);
mode = ewtzmu_data.mode;
read_unlock(&ewtzmu_data.lock);
@@ -403,6 +411,12 @@
return EW_CLIENT_ERROR;
}
+ if (atomic_read(&off_status_hal)) {
+ E("Failed to read sensor data. Device is powered off.\n");
+ *buf = 0;
+ return EW_DEVICE_POWERED_OFF;
+ }
+
read_lock(&ewtzmu_data.lock);
mode = ewtzmu_data.mode;
read_unlock(&ewtzmu_data.lock);
@@ -770,9 +784,12 @@
{
u8 databuf[10];
int res = 0;
+
+ mutex_lock(&ewtzmu2_power_lock);
ewtzmumid_data.config_gyro_diag_gpios(1);
if (!ewtzmu_i2c_client) {
E("%s, ewtzmu_i2c_client < 0 \n", __func__);
+ mutex_unlock(&ewtzmu2_power_lock);
return -2;
}
@@ -785,6 +802,8 @@
hr_msleep(10);
}
gpio_set_value(ewtzmumid_data.sleep_pin, 1);
+ atomic_set(&off_status_hal, 1);
+ mutex_unlock(&ewtzmu2_power_lock);
I("%s\n", __func__);
return 0;
}
@@ -795,10 +814,12 @@
int res = 0;
int i = 0;
+ mutex_lock(&ewtzmu2_power_lock);
ewtzmumid_data.config_gyro_diag_gpios(0);
if (!ewtzmu_i2c_client) {
E("%s, ewtzmu_i2c_client < 0 \n", __func__);
- return -2;
+ mutex_unlock(&ewtzmu2_power_lock);
+ return -2;
}
gpio_set_value(ewtzmumid_data.sleep_pin, 0);
while (1) {
@@ -824,6 +845,8 @@
}
i = 0;
EWTZMU2_Chip_Set_SampleRate(Gyro_samplerate_status);
+ atomic_set(&off_status_hal, 0);
+ mutex_unlock(&ewtzmu2_power_lock);
I("%s end\n", __func__);
return 0;
}
@@ -1212,7 +1235,6 @@
!atomic_read(&la_status) && !atomic_read(&gv_status) &&
!atomic_read(&o_status) && !atomic_read(&off_status_hal)) {
- atomic_set(&off_status_hal, 1);
I("cal_Gyro power off:g_status=%d"
"off_status_hal=%d\n",
atomic_read(&g_status),
@@ -1222,7 +1244,6 @@
atomic_read(&la_status) || atomic_read(&gv_status) ||
atomic_read(&o_status)) && atomic_read(&off_status_hal)) {
- atomic_set(&off_status_hal, 0);
I("Cal_Gyro power on:g_status=%d"
"off_status_hal=%d\n",
atomic_read(&g_status),
@@ -2067,7 +2088,6 @@
atomic_read(&g_status),
atomic_read(&off_status_hal));
if (!atomic_read(&off_status_hal)) {
- atomic_set(&off_status_hal, 1);
ret = EWTZMU2_Power_Off();
}
} else if ((atomic_read(&g_status) || atomic_read(&rv_status) || atomic_read(&la_status) || atomic_read(&gv_status) || atomic_read(&o_status))) {
@@ -2077,7 +2097,6 @@
atomic_read(&g_status),
atomic_read(&off_status_hal));
if (atomic_read(&off_status_hal)) {
- atomic_set(&off_status_hal, 0);
ret = EWTZMU2_Power_On();
}
}
@@ -2497,7 +2516,6 @@
if (data->pdata->config_gyro_diag_gpios != NULL)
ewtzmumid_data.config_gyro_diag_gpios =
data->pdata->config_gyro_diag_gpios;
- atomic_set(&off_status_hal, 1);
EWTZMU2_Power_Off();
init_waitqueue_head(&open_wq);
diff --git a/include/linux/ewtzmu2_cal.h b/include/linux/ewtzmu2_cal.h
index 48c597e..6e0b00b 100644
--- a/include/linux/ewtzmu2_cal.h
+++ b/include/linux/ewtzmu2_cal.h
@@ -21,6 +21,7 @@
#define EW_DATA_REPEAT_ERROR_X -12
#define EW_DATA_REPEAT_ERROR_Y -13
#define EW_DATA_REPEAT_ERROR_Z -14
+#define EW_DEVICE_POWERED_OFF -15