diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2016-10-06 11:25:49 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2016-11-16 21:57:56 +0000 |
commit | 1af8f7debf0353696c1d7e32407b5fcd965f93cc (patch) | |
tree | 803ba72e4f4b2ce03af02c29be302faf76449a5c | |
parent | 1c07552b6a6282ff99852c65cae4aa2c952a87f7 (diff) | |
download | chrome-ec-1af8f7debf0353696c1d7e32407b5fcd965f93cc.tar.gz |
kionix: Add reading whoami to be sure device has booted.
From the specs, "KX022-1020 Specifications Rev4.0", the power up time
can be as long as 10ms.
Add a loop to be sure the device is responsive before initalizing it.
BRANCH=reef,glados,oak,veyron,cyan
BUG=chrome-os-partner:59870
TEST=After putting a KX022 accel as first in the list, it would not
initialize properly. After adding the loop, it initializes properly.
Reviewed-on: https://chromium-review.googlesource.com/394750
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
(cherry picked from commit 09f90a3b8f0f48d11b3653ad2af1d61c29691a48)
Change-Id: I3194a5d1deb0c2eb2a04a459aab3b4269e479af3
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/411928
-rw-r--r-- | driver/accel_kionix.c | 23 | ||||
-rw-r--r-- | driver/accel_kionix.h | 6 |
2 files changed, 28 insertions, 1 deletions
diff --git a/driver/accel_kionix.c b/driver/accel_kionix.c index 42ed1fed64..2c21eac65d 100644 --- a/driver/accel_kionix.c +++ b/driver/accel_kionix.c @@ -311,11 +311,32 @@ static int init(const struct motion_sensor_t *s) int ret, val, reg, reset_field; uint8_t timeout; + /* The chip can take up to 10ms to boot */ + mutex_lock(s->mutex); + reg = KIONIX_WHO_AM_I(V(s)); + timeout = 0; + do { + msleep(1); + /* Read WHO_AM_I to be sure the device has booted */ + ret = raw_read8(s->addr, reg, &val); + if (ret == EC_SUCCESS) + break; + + /* Check for timeout. */ + if (timeout++ > 20) { + ret = EC_ERROR_TIMEOUT; + break; + } + } while (1); + if (ret != EC_SUCCESS) { + mutex_unlock(s->mutex); + return ret; + } + reg = KIONIX_CTRL2_REG(V(s)); reset_field = KIONIX_RESET_FIELD(V(s)); /* Issue a software reset. */ - mutex_lock(s->mutex); /* Place the sensor in standby mode to make changes. */ ret = disable_sensor(s, &val); diff --git a/driver/accel_kionix.h b/driver/accel_kionix.h index 449f364a0c..847557073a 100644 --- a/driver/accel_kionix.h +++ b/driver/accel_kionix.h @@ -51,6 +51,12 @@ extern const struct accelgyro_drv kionix_accel_drv; #define KIONIX_XOUT_L(v) (KX022_XOUT_L + \ (v) * (KXCJ9_XOUT_L - KX022_XOUT_L)) +#define KIONIX_WHO_AM_I(v) (KX022_WHOAMI + \ + (v) * (KXCJ9_WHOAMI - KX022_WHOAMI)) + +#define KIONIX_WHO_AM_I_VAL(v) (KX022_WHO_AM_I_VAL + \ + (v) * (KXCJ9_WHO_AM_I_VAL - KX022_WHO_AM_I_VAL)) + /* Common ODR setting: */ #define KX_OSA_12_50HZ 0 #define KX_OSA_1600HZ 7 |