summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2018-02-24 20:18:57 -0800
committerchrome-bot <chrome-bot@chromium.org>2018-03-09 20:05:06 -0800
commitbc766130becff13136baa53070749899dce687f6 (patch)
treec36329b8f533e1ad095120af655f20bfcf462870 /common
parentf31dcc649a40b1dae010898c4613be81a3075a95 (diff)
downloadchrome-ec-bc766130becff13136baa53070749899dce687f6.tar.gz
motion: remove load_fifo
To prevent invalid timestamping, call load_fifo only when we get a FIFO interrupt. In consequence, remove load_fifo entry point and only process fifo inside the IRQ. Add helper function to know when we are in forced mode (the EC needs to periodically read sensor data or interrupt driven). BUG=b:73557414 BRANCH=master TEST=compile Change-Id: I959e476f3f7215be95424c07223f7421e8b13da1 Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/938146 Commit-Ready: Alexandru M Stan <amstan@chromium.org> Tested-by: Alexandru M Stan <amstan@chromium.org> Reviewed-by: Alexandru M Stan <amstan@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/motion_sense.c94
1 files changed, 54 insertions, 40 deletions
diff --git a/common/motion_sense.c b/common/motion_sense.c
index cc2f7bc992..24ac31c964 100644
--- a/common/motion_sense.c
+++ b/common/motion_sense.c
@@ -187,6 +187,22 @@ static void motion_sense_get_fifo_info(
}
#endif
+static inline int motion_sensor_in_forced_mode(
+ const struct motion_sensor_t *sensor)
+{
+#ifdef CONFIG_ACCEL_FORCE_MODE_MASK
+ /* Sensor not in force mode, its irq_handler is getting data. */
+ if (!(CONFIG_ACCEL_FORCE_MODE_MASK & (1 << (sensor - motion_sensors))))
+ return 0;
+ else
+ return 1;
+#else
+ return 0;
+#endif
+}
+
+
+
/* Minimal amount of time since last collection before triggering a new one */
static inline int motion_sensor_time_to_read(const timestamp_t *ts,
const struct motion_sensor_t *sensor)
@@ -287,14 +303,12 @@ static int motion_sense_set_ec_rate_from_ap(
if (new_rate_us == 0)
return 0;
-#ifdef CONFIG_ACCEL_FORCE_MODE_MASK
- if (CONFIG_ACCEL_FORCE_MODE_MASK & (1 << (sensor - motion_sensors)))
+ if (motion_sensor_in_forced_mode(sensor))
/*
* AP EC sampling rate does not matter: we will collect at the
* requested sensor frequency.
*/
goto end_set_ec_rate_from_ap;
-#endif
if (odr_mhz == 0)
goto end_set_ec_rate_from_ap;
@@ -336,18 +350,16 @@ static int motion_sense_select_ec_rate(
enum sensor_config config_id,
int interrupt)
{
-#ifdef CONFIG_ACCEL_FORCE_MODE_MASK
- if (interrupt == 0 &&
- (CONFIG_ACCEL_FORCE_MODE_MASK & (1 << (sensor - motion_sensors)))) {
+ if (interrupt == 0 && motion_sensor_in_forced_mode(sensor)) {
int rate_mhz = BASE_ODR(sensor->config[config_id].odr);
/* we have to run ec at the sensor frequency rate.*/
if (rate_mhz > 0)
return SECOND * 1000 / rate_mhz;
else
return 0;
- } else
-#endif
- return sensor->config[config_id].ec_rate;
+ } else {
+ return sensor->config[config_id].ec_rate;
+ }
}
/* motion_sense_ec_rate
@@ -704,28 +716,28 @@ static int motion_sense_process(struct motion_sensor_t *sensor,
}
#endif
#ifdef CONFIG_ACCEL_FIFO
- if (sensor->drv->load_fifo != NULL) {
- /* Load fifo is filling raw_xyz sensor vector */
- sensor->drv->load_fifo(sensor);
- } else if (motion_sensor_time_to_read(ts, sensor)) {
- struct ec_response_motion_sensor_data vector;
- int *v = sensor->raw_xyz;
- ret = motion_sense_read(sensor);
- if (ret == EC_SUCCESS) {
- vector.flags = 0;
- vector.sensor_num = sensor - motion_sensors;
+ if (motion_sensor_in_forced_mode(sensor)) {
+ if (motion_sensor_time_to_read(ts, sensor)) {
+ struct ec_response_motion_sensor_data vector;
+ int *v = sensor->raw_xyz;
+
+ ret = motion_sense_read(sensor);
+ if (ret == EC_SUCCESS) {
+ vector.flags = 0;
+ vector.sensor_num = sensor - motion_sensors;
#ifdef CONFIG_ACCEL_SPOOF_MODE
- if (sensor->in_spoof_mode)
- v = sensor->spoof_xyz;
+ if (sensor->in_spoof_mode)
+ v = sensor->spoof_xyz;
#endif /* defined(CONFIG_ACCEL_SPOOF_MODE) */
- vector.data[X] = v[X];
- vector.data[Y] = v[Y];
- vector.data[Z] = v[Z];
- motion_sense_fifo_add_unit(&vector, sensor, 3);
+ vector.data[X] = v[X];
+ vector.data[Y] = v[Y];
+ vector.data[Z] = v[Z];
+ motion_sense_fifo_add_unit(&vector, sensor, 3);
+ }
+ sensor->last_collection = ts->le.lo;
+ } else {
+ ret = EC_ERROR_BUSY;
}
- sensor->last_collection = ts->le.lo;
- } else {
- ret = EC_ERROR_BUSY;
}
if (*event & TASK_EVENT_MOTION_FLUSH_PENDING) {
int flush_pending;
@@ -736,19 +748,21 @@ static int motion_sense_process(struct motion_sensor_t *sensor,
}
}
#else
- if (motion_sensor_time_to_read(ts, sensor)) {
- /* Get latest data for local calculation */
- ret = motion_sense_read(sensor);
- sensor->last_collection = ts->le.lo;
- } else {
- ret = EC_ERROR_BUSY;
- }
- if (ret == EC_SUCCESS) {
- mutex_lock(&g_sensor_mutex);
- memcpy(sensor->xyz, sensor->raw_xyz, sizeof(sensor->xyz));
- mutex_unlock(&g_sensor_mutex);
+ if (motion_sensor_in_forced_mode(sensor)) {
+ if (motion_sensor_time_to_read(ts, sensor)) {
+ /* Get latest data for local calculation */
+ ret = motion_sense_read(sensor);
+ sensor->last_collection = ts->le.lo;
+ } else {
+ ret = EC_ERROR_BUSY;
+ }
+ if (ret == EC_SUCCESS) {
+ mutex_lock(&g_sensor_mutex);
+ memcpy(sensor->xyz, sensor->raw_xyz,
+ sizeof(sensor->xyz));
+ mutex_unlock(&g_sensor_mutex);
+ }
}
-
#endif
return ret;
}