summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/fpsensor/fpsensor_state.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/common/fpsensor/fpsensor_state.c b/common/fpsensor/fpsensor_state.c
index c395bd7af3..f7890f9cdc 100644
--- a/common/fpsensor/fpsensor_state.c
+++ b/common/fpsensor/fpsensor_state.c
@@ -199,12 +199,30 @@ DECLARE_HOST_COMMAND(EC_CMD_FP_MODE, fp_command_mode, EC_VER_MASK(0));
static enum ec_status fp_command_context(struct host_cmd_handler_args *args)
{
- const struct ec_params_fp_context *params = args->params;
-
- fp_reset_and_clear_context();
-
- memcpy(user_id, params->userid, sizeof(user_id));
+ const struct ec_params_fp_context_v1 *p = args->params;
+ uint32_t mode_output;
+
+ switch (p->action) {
+ case FP_CONTEXT_ASYNC:
+ if (sensor_mode & FP_MODE_RESET_SENSOR)
+ return EC_RES_BUSY;
+
+ /**
+ * Trigger a call to fp_reset_and_clear_context() by
+ * requesting a reset. Since that function triggers a call to
+ * fp_sensor_open(), this must be asynchronous because
+ * fp_sensor_open() can take ~175 ms. See http://b/137288498.
+ */
+ return fp_set_sensor_mode(FP_MODE_RESET_SENSOR, &mode_output);
+
+ case FP_CONTEXT_GET_RESULT:
+ if (sensor_mode & FP_MODE_RESET_SENSOR)
+ return EC_RES_BUSY;
+
+ memcpy(user_id, p->userid, sizeof(user_id));
+ return EC_RES_SUCCESS;
+ }
- return EC_RES_SUCCESS;
+ return EC_RES_INVALID_PARAM;
}
-DECLARE_HOST_COMMAND(EC_CMD_FP_CONTEXT, fp_command_context, EC_VER_MASK(0));
+DECLARE_HOST_COMMAND(EC_CMD_FP_CONTEXT, fp_command_context, EC_VER_MASK(1));