summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/motion_sense.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/common/motion_sense.c b/common/motion_sense.c
index f75332fafe..efb6552078 100644
--- a/common/motion_sense.c
+++ b/common/motion_sense.c
@@ -618,11 +618,8 @@ static void update_sense_data(uint8_t *lpc_status, int *psample_id)
static int motion_sense_read(struct motion_sensor_t *sensor)
{
- if (sensor->state != SENSOR_INITIALIZED)
- return EC_ERROR_UNKNOWN;
-
- if (sensor->drv->get_data_rate(sensor) == 0)
- return EC_ERROR_NOT_POWERED;
+ ASSERT(sensor->state == SENSOR_INITIALIZED);
+ ASSERT(sensor->drv->get_data_rate(sensor) != 0);
/*
* If the sensor is in spoof mode, the readings are already present in
@@ -723,8 +720,14 @@ static int motion_sense_process(struct motion_sensor_t *sensor,
}
if (motion_sensor_in_forced_mode(sensor)) {
if (motion_sensor_time_to_read(ts, sensor)) {
- ret = motion_sense_read(sensor);
+ /*
+ * Since motion_sense_read can sleep, other task may be
+ * scheduled. In particular if suspend is called by
+ * HOOKS task, it may set colleciton_rate to 0 and we
+ * would crash in increment_sensor_collection.
+ */
increment_sensor_collection(sensor, ts);
+ ret = motion_sense_read(sensor);
} else {
ret = EC_ERROR_BUSY;
}
@@ -823,7 +826,7 @@ static void check_and_queue_gestures(uint32_t *event)
&motion_sensors[LID_ACCEL];
if (SENSOR_ACTIVE(sensor) &&
- (sensor->state == SENSOR_INITIALIZED)) {
+ (sensor->state == SENSOR_INITIALIZED)) {
struct ec_response_motion_sensor_data vector = {
.flags = 0,
.activity_data.activity =