summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShelley Chen <shchen@chromium.org>2017-01-12 13:23:17 -0800
committerchrome-bot <chrome-bot@chromium.org>2017-01-13 21:49:02 -0800
commit1d1042c1d575c9b9d4e54b183e56fe840d05efb2 (patch)
tree8289c6f60174642cdc8b296715bd6efc70b46eb0
parenta9c79eede9fdff172ddc0b1048f0c544f85bf27e (diff)
downloadchrome-ec-1d1042c1d575c9b9d4e54b183e56fe840d05efb2.tar.gz
poppy: host command for configuring power button
Specifically, we are using a bit to disable the SMI pulse on x86 systems so that we can use the power button for menu selection. BUG=chrome-os-partner:61275 BRANCH=None TEST=Try running with depthcharge sending the host command during detachable FW menus and making sure power button select doesn't turn off device on reef. Change-Id: I4a68cf514d514a4abe98beb99e7934d6fb0f44bd Signed-off-by: Shelley Chen <shchen@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/427413 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
-rw-r--r--common/power_button_x86.c33
-rw-r--r--include/ec_commands.h14
2 files changed, 43 insertions, 4 deletions
diff --git a/common/power_button_x86.c b/common/power_button_x86.c
index 864b88082e..ee85bc5c6d 100644
--- a/common/power_button_x86.c
+++ b/common/power_button_x86.c
@@ -112,6 +112,11 @@ static const char * const state_names[] = {
*/
static uint64_t tnext_state;
+/*
+ * Determines whether to execute initial SMI pulse (t0 stage)
+ */
+static int smi_enabled = 1;
+
static void set_pwrbtn_to_pch(int high, int init)
{
/*
@@ -265,12 +270,18 @@ static void state_machine(uint64_t tnow)
chipset_exit_hard_off();
tnext_state = tnow + PWRBTN_INITIAL_US;
pwrbtn_state = PWRBTN_STATE_WAS_OFF;
+ set_pwrbtn_to_pch(0, 0);
} else {
- /* Chipset is on, so send the chipset a pulse */
- tnext_state = tnow + PWRBTN_DELAY_T0;
- pwrbtn_state = PWRBTN_STATE_T0;
+ if (smi_enabled) {
+ /* Chipset is on, so send the chipset a pulse */
+ tnext_state = tnow + PWRBTN_DELAY_T0;
+ pwrbtn_state = PWRBTN_STATE_T0;
+ set_pwrbtn_to_pch(0, 0);
+ } else {
+ tnext_state = tnow + PWRBTN_DELAY_T1;
+ pwrbtn_state = PWRBTN_STATE_T1;
+ }
}
- set_pwrbtn_to_pch(0, 0);
break;
case PWRBTN_STATE_T0:
tnext_state = tnow + PWRBTN_DELAY_T1;
@@ -460,3 +471,17 @@ static void powerbtn_x86_charge(void)
task_wake(TASK_ID_POWERBTN);
}
DECLARE_HOOK(HOOK_CHARGE_STATE_CHANGE, powerbtn_x86_charge, HOOK_PRIO_DEFAULT);
+
+/**
+ * Handle configuring the power button behavior through a host command
+ */
+static int hc_config_powerbtn_x86(struct host_cmd_handler_args *args)
+{
+ const struct ec_params_config_power_button *p = args->params;
+
+ smi_enabled = p->flags & (1 << EC_POWER_BUTTON_ENABLE_SMI_PULSE);
+
+ return EC_SUCCESS;
+}
+DECLARE_HOST_COMMAND(EC_CMD_CONFIG_POWER_BUTTON, hc_config_powerbtn_x86,
+ EC_VER_MASK(0));
diff --git a/include/ec_commands.h b/include/ec_commands.h
index b63ae327fd..f4ee639c64 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -2254,6 +2254,20 @@ struct __ec_align1 ec_params_force_lid_open {
};
/*****************************************************************************/
+/* Configure the behavior of the power button */
+#define EC_CMD_CONFIG_POWER_BUTTON 0x002D
+
+enum ec_config_power_button_flags {
+ /* Enable/Disable SMI pulses for x86 devices */
+ EC_POWER_BUTTON_ENABLE_SMI_PULSE = 1 << 0,
+};
+
+struct __ec_align1 ec_params_config_power_button {
+ /* See enum ec_config_power_button_flags */
+ uint8_t flags;
+};
+
+/*****************************************************************************/
/* USB charging control commands */
/* Set USB port charging mode */