summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver/accel_kionix.c23
-rw-r--r--driver/accel_kionix.h6
2 files changed, 28 insertions, 1 deletions
diff --git a/driver/accel_kionix.c b/driver/accel_kionix.c
index 826380f880..75d5b72998 100644
--- a/driver/accel_kionix.c
+++ b/driver/accel_kionix.c
@@ -457,11 +457,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->port, 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 6c71cb7918..012ee8ec2b 100644
--- a/driver/accel_kionix.h
+++ b/driver/accel_kionix.h
@@ -69,4 +69,10 @@ 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))
+
#endif /* __CROS_EC_ACCEL_KIONIX_H */