diff options
-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 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 */ |