summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Wilson <evan@oliodevices.com>2016-01-21 18:13:09 -0800
committerEvan Wilson <evan@oliodevices.com>2016-01-27 15:14:45 -0800
commit3e132f58664314027b4dae9650d3bee06b06519d (patch)
treedd691f006fee9709a7450215c322c550030d6c47
parent594327ff44ea1b9e8c4124bcceae5bfd7f47a9ec (diff)
downloadolio-linux-3.10-3e132f58664314027b4dae9650d3bee06b06519d.tar.xz
olio-linux-3.10-3e132f58664314027b4dae9650d3bee06b06519d.zip
Fixing how we power cycle the accelerometer power rail,
and how we keep track of the last irq Change-Id: Idda33817761cb8e3c96ab2158106814eb0fcfac7
-rw-r--r--drivers/iio/imu/st_lsm6ds3/st_lsm6ds3.h2
-rw-r--r--drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c21
-rw-r--r--drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c1
3 files changed, 15 insertions, 9 deletions
diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3.h b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3.h
index 3ba58d87a29..2533a9b78de 100644
--- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3.h
+++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3.h
@@ -170,6 +170,8 @@ struct lsm6ds3_data {
int64_t accel_timestamp;
int64_t gyro_deltatime;
int64_t gyro_timestamp;
+ /* In seconds, using get_monotonic_boottime */
+ s64 irq_timestamp;
#ifdef CONFIG_ST_LSM6DS3_IIO_MASTER_SUPPORT
int64_t ext0_deltatime;
int64_t ext0_timestamp;
diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c
index 7298fdd274e..96cd843b55f 100644
--- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c
+++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_core.c
@@ -2165,8 +2165,9 @@ static int check_wai(struct lsm6ds3_data *cdata) {
}
get_monotonic_boottime(&ts);
- current_time = timespec_to_ns(&ts);
- if(current_time-cdata->timestamp > 20*60*1000*1000*1000) {
+ current_time = ts.tv_sec;
+ dev_err(cdata->dev, "Last timestamp delta: %d \n", current_time-cdata->irq_timestamp);
+ if(current_time-cdata->irq_timestamp > 15/*minutes*/*60) {
return st_lsm6ds3_reset(cdata, true);
}
@@ -2189,15 +2190,17 @@ int st_lsm6ds3_reset(struct lsm6ds3_data *cdata, bool hard_reset) {
}
}
- // Power cycle the accelerometer
+ /* Power cycle the accelerometer
+ * We need to first call regulator_disable,
+ * because this accurately keeps track of the reference counting
+ * Otherwise the enable may fail to enable the regulator
+ * Then call force_disable to ensure the regulator turns off
+ * This may cause kernel warnings, but it's to be expected
+ */
- err = regulator_disable(cdata->reg_accel);
- if (err)
- return err;
+ regulator_disable(cdata->reg_accel);
- err = regulator_force_disable(cdata->reg_accel);
- if (err)
- return err;
+ regulator_force_disable(cdata->reg_accel);
msleep(100);
diff --git a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c
index a818b14b275..7c497447640 100644
--- a/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c
+++ b/drivers/iio/imu/st_lsm6ds3/st_lsm6ds3_trigger.c
@@ -55,6 +55,7 @@ irqreturn_t st_lsm6ds3_save_timestamp(int irq, void *private)
get_monotonic_boottime(&ts);
cdata->timestamp = timespec_to_ns(&ts);
cdata->accel_timestamp = cdata->timestamp;
+ cdata->irq_timestamp = ts.tv_sec;
queue_work(st_lsm6ds3_wq, &cdata->data_work);
disable_irq_nosync(irq);